ekf2: GNSS velocity control should own vertical velocity reset if height faiing

- GNSS height control using the velocity sample directly is ignoring
   potential position offsets
This commit is contained in:
Daniel Agar
2024-07-10 13:09:33 -04:00
parent 9bbfc8715e
commit 177613eb68
2 changed files with 11 additions and 14 deletions
@@ -108,15 +108,6 @@ void Ekf::controlGnssHeightFusion(const gnssSample &gps_sample)
resetVerticalPositionTo(-(measurement - bias_est.getBias()), measurement_var); resetVerticalPositionTo(-(measurement - bias_est.getBias()), measurement_var);
bias_est.setBias(_state.pos(2) + measurement); bias_est.setBias(_state.pos(2) + measurement);
// reset vertical velocity
if (PX4_ISFINITE(gps_sample.vel(2)) && (_params.gnss_ctrl & static_cast<int32_t>(GnssCtrl::VEL))) {
// use 1.5 as a typical ratio of vacc/hacc
resetVerticalVelocityTo(gps_sample.vel(2), sq(math::max(1.5f * gps_sample.sacc, _params.gps_vel_noise)));
} else {
resetVerticalVelocityToZero();
}
aid_src.time_last_fuse = _time_delayed_us; aid_src.time_last_fuse = _time_delayed_us;
} else if (is_fusion_failing) { } else if (is_fusion_failing) {
@@ -132,16 +132,22 @@ void Ekf::controlGpsFusion(const imuSample &imu_delayed)
} }
if (do_vel_pos_reset) { if (do_vel_pos_reset) {
ECL_WARN("GPS fusion timeout, resetting velocity / position"); ECL_WARN("GPS fusion timeout, resetting");
}
if (gnss_vel_enabled) { if (gnss_vel_enabled) {
if (do_vel_pos_reset) {
resetVelocityToGnss(_aid_src_gnss_vel); resetVelocityToGnss(_aid_src_gnss_vel);
} else if (isHeightResetRequired()) {
// reset vertical velocity if height is failing
resetVerticalVelocityTo(_aid_src_gnss_vel.observation[2], _aid_src_gnss_vel.observation_variance[2]);
}
} }
if (gnss_pos_enabled) { if (gnss_pos_enabled && do_vel_pos_reset) {
resetHorizontalPositionToGnss(_aid_src_gnss_pos); resetHorizontalPositionToGnss(_aid_src_gnss_pos);
} }
}
} else { } else {
stopGpsFusion(); stopGpsFusion();