mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-03 05:01:36 +08:00
EKF: Only reset necessary terms when mag fusion covariance reset required
Only the quaternion and mag fusion state covariances are used in the mag fusion calculations.
This commit is contained in:
@@ -778,3 +778,19 @@ void Ekf::fixCovarianceErrors()
|
|||||||
makeSymmetrical(P,22,23);
|
makeSymmetrical(P,22,23);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ekf::resetMagCovariance()
|
||||||
|
{
|
||||||
|
// set the quaternion covariance terms to zero
|
||||||
|
zeroRows(P,0,3);
|
||||||
|
zeroCols(P,0,3);
|
||||||
|
|
||||||
|
// set the magnetic field covariance terms to zero
|
||||||
|
zeroRows(P,16,21);
|
||||||
|
zeroCols(P,16,21);
|
||||||
|
|
||||||
|
// set the field state variance to the observation variance
|
||||||
|
for (uint8_t rc_index=16; rc_index <= 21; rc_index ++) {
|
||||||
|
P[rc_index][rc_index] = sq(_params.mag_noise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -399,4 +399,7 @@ private:
|
|||||||
// initialise the quaternion covariances using rotation vector variances
|
// initialise the quaternion covariances using rotation vector variances
|
||||||
void initialiseQuatCovariances(Vector3f &rot_vec_var);
|
void initialiseQuatCovariances(Vector3f &rot_vec_var);
|
||||||
|
|
||||||
|
// perform a limited reset of the magnetic field state covariances
|
||||||
|
void resetMagCovariance();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
+6
-6
@@ -156,8 +156,8 @@ void Ekf::fuseMag()
|
|||||||
// the innovation variance contribution from the state covariances is negative which means the covariance matrix is badly conditioned
|
// the innovation variance contribution from the state covariances is negative which means the covariance matrix is badly conditioned
|
||||||
_fault_status.flags.bad_mag_x = true;
|
_fault_status.flags.bad_mag_x = true;
|
||||||
|
|
||||||
// we need to reinitialise the covariance matrix and abort this fusion step
|
// we need to re-initialise covariances and abort this fusion step
|
||||||
initialiseCovariance();
|
resetMagCovariance();
|
||||||
ECL_ERR("EKF magX fusion numerical error - covariance reset");
|
ECL_ERR("EKF magX fusion numerical error - covariance reset");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -208,8 +208,8 @@ void Ekf::fuseMag()
|
|||||||
// the innovation variance contribution from the state covariances is negtive which means the covariance matrix is badly conditioned
|
// the innovation variance contribution from the state covariances is negtive which means the covariance matrix is badly conditioned
|
||||||
_fault_status.flags.bad_mag_y = true;
|
_fault_status.flags.bad_mag_y = true;
|
||||||
|
|
||||||
// we need to reinitialise the covariance matrix and abort this fusion step
|
// we need to re-initialise covariances and abort this fusion step
|
||||||
initialiseCovariance();
|
resetMagCovariance();
|
||||||
ECL_ERR("EKF magY fusion numerical error - covariance reset");
|
ECL_ERR("EKF magY fusion numerical error - covariance reset");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -260,8 +260,8 @@ void Ekf::fuseMag()
|
|||||||
// the innovation variance contribution from the state covariances is negtive which means the covariance matrix is badly conditioned
|
// the innovation variance contribution from the state covariances is negtive which means the covariance matrix is badly conditioned
|
||||||
_fault_status.flags.bad_mag_z = true;
|
_fault_status.flags.bad_mag_z = true;
|
||||||
|
|
||||||
// we need to reinitialise the covariance matrix and abort this fusion step
|
// we need to re-initialise covariances and abort this fusion step
|
||||||
initialiseCovariance();
|
resetMagCovariance();
|
||||||
ECL_ERR("EKF magZ fusion numerical error - covariance reset");
|
ECL_ERR("EKF magZ fusion numerical error - covariance reset");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user