13 accelNoiseVariance(noise.accelNoiseVar),
14 altimeterNoiseVariance(noise.altimeterNoiseVar),
17 verticalAxisDetermined(false),
18 inertialVerticalAcceleration(0.0F)
21 P[0][0] = 1.0F; P[0][1] = 0.0F;
22 P[1][0] = 0.0F; P[1][1] = 1.0F;
41void VerticalVelocityEstimator::determineVerticalAxis(
const std::array<float, 3>& rawAcl) {
43 std::array<float, 3> mag = { std::fabs(rawAcl[0]), std::fabs(rawAcl[1]), std::fabs(rawAcl[2]) };
62 const uint32_t currentTimestamp_ms = altimeter.
timestamp_ms;
72 std::array<float, 3> rawAcl = { accel.
x.
data, accel.
y.
data, accel.
z.
data};
73 if (!verticalAxisDetermined) {
74 determineVerticalAxis(rawAcl);
75 verticalAxisDetermined =
true;
79 const float dt = (currentTimestamp_ms > lastTimestamp_ms)
84 inertialVerticalAcceleration = (rawAcl[verticalAxis] *
static_cast<float>(verticalDirection)) - g;
90 const float predicted_alt = state_alt + state_vel * dt + 0.5F * inertialVerticalAcceleration * dt * dt;
91 const float predicted_vel = state_vel + inertialVerticalAcceleration * dt;
94 const float dt2 = dt * dt;
95 const float dt3 = dt2 * dt;
96 const float dt4 = dt3 * dt;
98 const float Q00 = 0.25F * dt4 * accelNoiseVariance;
99 const float Q01 = 0.5F * dt3 * accelNoiseVariance;
100 const float Q10 = 0.5F * dt3 * accelNoiseVariance;
101 const float Q11 = dt2 * accelNoiseVariance;
112 const float P00 = P[0][0] + 2.0F * dt * P[0][1] + dt2 * P[1][1] + Q00;
113 const float P01 = P[0][1] + dt * P[1][1] + Q01;
114 const float P10 = P[1][0] + dt * P[1][1] + Q10;
115 const float P11 = P[1][1] + Q11;
119 const float z = altimeter.
data;
121 const float y = z - predicted_alt;
124 const float S = P00 + altimeterNoiseVariance;
127 const float K0 = P00 / S;
128 const float K1 = P10 / S;
131 state_alt = predicted_alt + K0 * y;
132 state_vel = predicted_vel + K1 * y;
141 P[0][0] = (1.0F - K0) * P00;
142 P[0][1] = (1.0F - K0) * P01;
143 P[1][0] = P10 - K1 * P00;
144 P[1][1] = P11 - K1 * P01;
147 lastTimestamp_ms = currentTimestamp_ms;