Skip to content

Commit

Permalink
ekf2: request mag yaw reset after calibration or sensor change
Browse files Browse the repository at this point in the history
  • Loading branch information
dagar committed Jun 18, 2022
1 parent c7cec42 commit b81a5b3
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 4 deletions.
3 changes: 2 additions & 1 deletion src/modules/ekf2/EKF/ekf.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ class Ekf final : public EstimatorInterface
void resetAccelBias();

// Reset all magnetometer bias states and covariances to initial alignment values.
void resetMagBias();
// Requests full mag yaw reset (if using mag)
void resetMagBiasAndYaw();

Vector3f getVelocityVariance() const { return P.slice<3, 3>(4, 4).diag(); };

Expand Down
8 changes: 7 additions & 1 deletion src/modules/ekf2/EKF/ekf_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -907,7 +907,7 @@ void Ekf::resetAccelBias()
_prev_dvel_bias_var = P.slice<3, 3>(13, 13).diag();
}

void Ekf::resetMagBias()
void Ekf::resetMagBiasAndYaw()
{
// Zero the magnetometer bias states
_state.mag_B.zero();
Expand All @@ -918,6 +918,12 @@ void Ekf::resetMagBias()

// reset any saved covariance data for re-use when auto-switching between heading and 3-axis fusion
_saved_mag_bf_variance.zero();

if (_control_status.flags.mag_hdg || _control_status.flags.mag_3D) {
_mag_yaw_reset_req = true;
}

_control_status.flags.mag_fault = false;
}

// get EKF innovation consistency check status information comprising of:
Expand Down
4 changes: 2 additions & 2 deletions src/modules/ekf2/EKF2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1818,14 +1818,14 @@ void EKF2::UpdateMagSample(ekf2_timestamps_s &ekf2_timestamps)

reset = true;

} else if (magnetometer.calibration_count > _mag_calibration_count) {
} else if (magnetometer.calibration_count != _mag_calibration_count) {
// existing calibration has changed, reset saved mag bias
PX4_DEBUG("%d - mag %" PRIu32 " calibration updated, resetting bias", _instance, _device_id_mag);
reset = true;
}

if (reset) {
_ekf.resetMagBias();
_ekf.resetMagBiasAndYaw();
_device_id_mag = magnetometer.device_id;
_mag_calibration_count = magnetometer.calibration_count;

Expand Down

0 comments on commit b81a5b3

Please sign in to comment.