From e40e50e2e13ce8f7941b5da2238bbf01d9450f07 Mon Sep 17 00:00:00 2001 From: priseborough <p_riseborough@live.com.au> Date: Fri, 16 May 2014 21:55:10 +1000 Subject: [PATCH] AP_NavEKF: Prevent start-up transients re-tripping divergence test --- libraries/AP_NavEKF/AP_NavEKF.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libraries/AP_NavEKF/AP_NavEKF.cpp b/libraries/AP_NavEKF/AP_NavEKF.cpp index 13f304e1e..808f9e86b 100644 --- a/libraries/AP_NavEKF/AP_NavEKF.cpp +++ b/libraries/AP_NavEKF/AP_NavEKF.cpp @@ -354,7 +354,6 @@ NavEKF::NavEKF(const AP_AHRS *ahrs, AP_Baro &baro) : mag_state.DCM.identity(); IMU1_weighting = 0.5f; lastDivergeTime_ms = 0; - filterDiverged = false; memset(&faultStatus, 0, sizeof(faultStatus)); } @@ -370,7 +369,7 @@ bool NavEKF::healthy(void) const if (state.velocity.is_nan()) { return false; } - if (filterDiverged) { + if (filterDiverged || (hal.scheduler->millis() - lastDivergeTime_ms < 10000)) { return false; } // If measurements have failed innovation consistency checks for long enough to time-out @@ -3300,6 +3299,7 @@ void NavEKF::ZeroVariables() velTimeout = false; posTimeout = false; hgtTimeout = false; + filterDiverged = false; lastStateStoreTime_ms = 0; lastFixTime_ms = 0; secondLastFixTime_ms = 0; @@ -3394,6 +3394,7 @@ bool NavEKF::assume_zero_sideslip(void) const void NavEKF::checkDivergence() { // 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 Vector3f tempVec = state.gyro_bias - lastGyroBias; float tempLength = tempVec.length(); @@ -3403,12 +3404,14 @@ void NavEKF::checkDivergence() } bool divergenceDetected = (scaledDeltaGyrBiasLgth > 1.0f); lastGyroBias = state.gyro_bias; - if (divergenceDetected) { - filterDiverged = true; - faultStatus.diverged = true; - lastDivergeTime_ms = hal.scheduler->millis(); - } else if (hal.scheduler->millis() - lastDivergeTime_ms > 10000) { - filterDiverged = false; + if (hal.scheduler->millis() - lastDivergeTime_ms > 10000) { + if (divergenceDetected) { + filterDiverged = true; + faultStatus.diverged = true; + lastDivergeTime_ms = hal.scheduler->millis(); + } else { + filterDiverged = false; + } } } -- GitLab