AP_NavEKF: Prevent start-up transients re-tripping divergence test
This commit is contained in:
parent
73976e2ca4
commit
e40e50e2e1
@ -354,7 +354,6 @@ NavEKF::NavEKF(const AP_AHRS *ahrs, AP_Baro &baro) :
|
|||||||
mag_state.DCM.identity();
|
mag_state.DCM.identity();
|
||||||
IMU1_weighting = 0.5f;
|
IMU1_weighting = 0.5f;
|
||||||
lastDivergeTime_ms = 0;
|
lastDivergeTime_ms = 0;
|
||||||
filterDiverged = false;
|
|
||||||
memset(&faultStatus, 0, sizeof(faultStatus));
|
memset(&faultStatus, 0, sizeof(faultStatus));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +369,7 @@ bool NavEKF::healthy(void) const
|
|||||||
if (state.velocity.is_nan()) {
|
if (state.velocity.is_nan()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (filterDiverged) {
|
if (filterDiverged || (hal.scheduler->millis() - lastDivergeTime_ms < 10000)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// If measurements have failed innovation consistency checks for long enough to time-out
|
// If measurements have failed innovation consistency checks for long enough to time-out
|
||||||
@ -3300,6 +3299,7 @@ void NavEKF::ZeroVariables()
|
|||||||
velTimeout = false;
|
velTimeout = false;
|
||||||
posTimeout = false;
|
posTimeout = false;
|
||||||
hgtTimeout = false;
|
hgtTimeout = false;
|
||||||
|
filterDiverged = false;
|
||||||
lastStateStoreTime_ms = 0;
|
lastStateStoreTime_ms = 0;
|
||||||
lastFixTime_ms = 0;
|
lastFixTime_ms = 0;
|
||||||
secondLastFixTime_ms = 0;
|
secondLastFixTime_ms = 0;
|
||||||
@ -3394,6 +3394,7 @@ bool NavEKF::assume_zero_sideslip(void) const
|
|||||||
void NavEKF::checkDivergence()
|
void NavEKF::checkDivergence()
|
||||||
{
|
{
|
||||||
// If filter is diverging, then fail for 10 seconds
|
// If filter is diverging, then fail for 10 seconds
|
||||||
|
// delay checking to allow bias estimate to settle after reset
|
||||||
// filter divergence is detected by looking for rapid changes in gyro bias
|
// filter divergence is detected by looking for rapid changes in gyro bias
|
||||||
Vector3f tempVec = state.gyro_bias - lastGyroBias;
|
Vector3f tempVec = state.gyro_bias - lastGyroBias;
|
||||||
float tempLength = tempVec.length();
|
float tempLength = tempVec.length();
|
||||||
@ -3403,13 +3404,15 @@ void NavEKF::checkDivergence()
|
|||||||
}
|
}
|
||||||
bool divergenceDetected = (scaledDeltaGyrBiasLgth > 1.0f);
|
bool divergenceDetected = (scaledDeltaGyrBiasLgth > 1.0f);
|
||||||
lastGyroBias = state.gyro_bias;
|
lastGyroBias = state.gyro_bias;
|
||||||
|
if (hal.scheduler->millis() - lastDivergeTime_ms > 10000) {
|
||||||
if (divergenceDetected) {
|
if (divergenceDetected) {
|
||||||
filterDiverged = true;
|
filterDiverged = true;
|
||||||
faultStatus.diverged = true;
|
faultStatus.diverged = true;
|
||||||
lastDivergeTime_ms = hal.scheduler->millis();
|
lastDivergeTime_ms = hal.scheduler->millis();
|
||||||
} else if (hal.scheduler->millis() - lastDivergeTime_ms > 10000) {
|
} else {
|
||||||
filterDiverged = false;
|
filterDiverged = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user