Browse Source

EKF: Fix use of incorrect timestamp

This was incorrectly using the IMU (1/250 sec) timestamp instead of the EKF (1/100 sec) value.
The corresponding accelerometer limit has been made a parameter and adjusted to match previous behaviour.
master
Paul Riseborough 8 years ago committed by Lorenz Meier
parent
commit
cf31945038
  1. 6
      EKF/common.h
  2. 4
      EKF/ekf_helper.cpp

6
EKF/common.h

@ -269,6 +269,9 @@ struct parameters { @@ -269,6 +269,9 @@ struct parameters {
float vel_Tau; // velocity state correction time constant (1/sec)
float pos_Tau; // postion state correction time constant (1/sec)
// state limits
float acc_bias_lim; // maximum accel bias magnitude (m/s/s)
unsigned no_gps_timeout_max; // maximum time we allow dead reckoning while both gps position and velocity measurements are being
// rejected
@ -373,6 +376,9 @@ struct parameters { @@ -373,6 +376,9 @@ struct parameters {
vel_Tau = 0.25f;
pos_Tau = 0.25f;
// state limiting
acc_bias_lim = 0.4f;
no_gps_timeout_max = 7e6; // maximum seven seconds of dead reckoning time for gps
}

4
EKF/ekf_helper.cpp

@ -535,11 +535,11 @@ void Ekf::constrainStates() @@ -535,11 +535,11 @@ void Ekf::constrainStates()
}
for (int i = 0; i < 3; i++) {
_state.gyro_bias(i) = math::constrain(_state.gyro_bias(i), -0.349066f * _dt_imu_avg, 0.349066f * _dt_imu_avg);
_state.gyro_bias(i) = math::constrain(_state.gyro_bias(i), -0.349066f * _dt_ekf_avg, 0.349066f * _dt_ekf_avg);
}
for (int i = 0; i < 3; i++) {
_state.accel_bias(i) = math::constrain(_state.accel_bias(i), -1.0f * _dt_imu_avg, 1.0f * _dt_imu_avg);
_state.accel_bias(i) = math::constrain(_state.accel_bias(i), -_params.acc_bias_lim * _dt_ekf_avg, _params.acc_bias_lim * _dt_ekf_avg);
}
for (int i = 0; i < 3; i++) {

Loading…
Cancel
Save