|
|
|
@ -1032,10 +1032,16 @@ void AttPosEKF::FuseVelposNED()
@@ -1032,10 +1032,16 @@ void AttPosEKF::FuseVelposNED()
|
|
|
|
|
// apply a 5-sigma threshold
|
|
|
|
|
current_ekf_state.velHealth = (sq(velInnov[0]) + sq(velInnov[1]) + sq(velInnov[2])) < 25.0f * (varInnovVelPos[0] + varInnovVelPos[1] + varInnovVelPos[2]); |
|
|
|
|
current_ekf_state.velTimeout = (millis() - current_ekf_state.velFailTime) > horizRetryTime; |
|
|
|
|
if (current_ekf_state.velHealth || current_ekf_state.velTimeout) |
|
|
|
|
{ |
|
|
|
|
if (current_ekf_state.velHealth || staticMode) { |
|
|
|
|
current_ekf_state.velHealth = true; |
|
|
|
|
current_ekf_state.velFailTime = millis(); |
|
|
|
|
} else if (current_ekf_state.velTimeout || !current_ekf_state.posHealth) { |
|
|
|
|
// XXX check
|
|
|
|
|
current_ekf_state.velHealth = true; |
|
|
|
|
ResetVelocity(); |
|
|
|
|
ResetStoredStates(); |
|
|
|
|
// do not fuse bad data
|
|
|
|
|
fuseVelData = false; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -1056,6 +1062,17 @@ void AttPosEKF::FuseVelposNED()
@@ -1056,6 +1062,17 @@ void AttPosEKF::FuseVelposNED()
|
|
|
|
|
{ |
|
|
|
|
current_ekf_state.posHealth = true; |
|
|
|
|
current_ekf_state.posFailTime = millis(); |
|
|
|
|
|
|
|
|
|
if (current_ekf_state.posTimeout) { |
|
|
|
|
ResetPosition(); |
|
|
|
|
|
|
|
|
|
// XXX cross-check the state reset
|
|
|
|
|
ResetStoredStates(); |
|
|
|
|
|
|
|
|
|
// do not fuse position data on this time
|
|
|
|
|
// step
|
|
|
|
|
fusePosData = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|