11 : stateAltitude_m_(0.0F),
12 stateVelocity_mps_(0.0F),
15 accelNoiseVariance_(noise.accelNoiseVar),
16 altimeterNoiseVariance_(noise.altimeterNoiseVar),
18 verticalDirection_(0),
19 verticalAxisDetermined_(false),
20 inertialVerticalAcceleration_(0.0F)
23 P_[0][0] = 1.0F; P_[0][1] = 0.0F;
24 P_[1][0] = 0.0F; P_[1][1] = 1.0F;
43void VerticalVelocityEstimator::determineVerticalAxis(
const std::array<float, 3>& rawAcl) {
45 std::array<float, 3> mag = { std::fabs(rawAcl[0]), std::fabs(rawAcl[1]), std::fabs(rawAcl[2]) };
69 const uint32_t currentTimestamp_ms = altitude.
timestamp_ms;
79 std::array<float, 3> rawAcl = { accel.
x.
data, accel.
y.
data, accel.
z.
data};
80 if (!verticalAxisDetermined_) {
81 determineVerticalAxis(rawAcl);
82 verticalAxisDetermined_ =
true;
90 if (currentTimestamp_ms <= lastTimestamp_ms_)
103 const auto verticalAxisIndex =
static_cast<std::size_t
>(
static_cast<uint8_t
>(verticalAxis_));
104 inertialVerticalAcceleration_ =
105 (rawAcl[verticalAxisIndex] *
static_cast<float>(verticalDirection_)) - kGravity_mps2;
111 const float predictedAltitude_m = stateAltitude_m_ + stateVelocity_mps_ * dt + 0.5F * inertialVerticalAcceleration_ * dt * dt;
112 const float predictedVelocity_mps = stateVelocity_mps_ + inertialVerticalAcceleration_ * dt;
115 const float dt2 = dt * dt;
116 const float dt3 = dt2 * dt;
117 const float dt4 = dt3 * dt;
119 const float q00 = 0.25F * dt4 * accelNoiseVariance_;
120 const float q01 = 0.5F * dt3 * accelNoiseVariance_;
121 const float q10 = 0.5F * dt3 * accelNoiseVariance_;
122 const float q11 = dt2 * accelNoiseVariance_;
133 const float predictedCov00 = P_[0][0] + 2.0F * dt * P_[0][1] + dt2 * P_[1][1] + q00;
134 const float predictedCov01 = P_[0][1] + dt * P_[1][1] + q01;
135 const float predictedCov10 = P_[1][0] + dt * P_[1][1] + q10;
136 const float predictedCov11 = P_[1][1] + q11;
140 const float z = altitude.
data;
142 const float y = z - predictedAltitude_m;
145 const float innovationCovariance = predictedCov00 + altimeterNoiseVariance_;
148 const float kalmanGain0 = predictedCov00 / innovationCovariance;
149 const float kalmanGain1 = predictedCov10 / innovationCovariance;
152 stateAltitude_m_ = predictedAltitude_m + kalmanGain0 * y;
153 stateVelocity_mps_ = predictedVelocity_mps + kalmanGain1 * y;
162 P_[0][0] = (1.0F - kalmanGain0) * predictedCov00;
163 P_[0][1] = (1.0F - kalmanGain0) * predictedCov01;
164 P_[1][0] = predictedCov10 - kalmanGain1 * predictedCov00;
165 P_[1][1] = predictedCov11 - kalmanGain1 * predictedCov01;
168 lastTimestamp_ms_ = currentTimestamp_ms;