mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-28 23:43:34 +08:00
EKF: Set covariances to zero for un-used states
This commit is contained in:
@@ -520,6 +520,16 @@ void Ekf::predictCovariance()
|
|||||||
nextP[13][15] = P[13][15];
|
nextP[13][15] = P[13][15];
|
||||||
nextP[14][15] = P[14][15];
|
nextP[14][15] = P[14][15];
|
||||||
nextP[15][15] = P[15][15];
|
nextP[15][15] = P[15][15];
|
||||||
|
|
||||||
|
// Don't do covariance prediction on magnetic field states unless we are using 3-axis fusion
|
||||||
|
if (_control_status.flags.mag_3D) {
|
||||||
|
// Check if we have just transitioned into 3-axis fusion and set the state variances
|
||||||
|
if (!_control_status_prev.flags.mag_3D) {
|
||||||
|
for (uint8_t index = 16; index <= 21; index++) {
|
||||||
|
P[index][index] = sq(fmaxf(_params.mag_noise, 0.001f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nextP[0][16] = P[0][16] * SPP[5] - P[1][16] * SPP[4] + P[2][16] * SPP[7] + P[9][16] * SPP[22] + P[12][16] * SPP[18];
|
nextP[0][16] = P[0][16] * SPP[5] - P[1][16] * SPP[4] + P[2][16] * SPP[7] + P[9][16] * SPP[22] + P[12][16] * SPP[18];
|
||||||
nextP[1][16] = P[1][16] * SPP[6] - P[0][16] * SPP[2] - P[2][16] * SPP[8] + P[10][16] * SPP[22] + P[13][16] * SPP[17];
|
nextP[1][16] = P[1][16] * SPP[6] - P[0][16] * SPP[2] - P[2][16] * SPP[8] + P[10][16] * SPP[22] + P[13][16] * SPP[17];
|
||||||
nextP[2][16] = P[0][16] * SPP[14] - P[1][16] * SPP[3] + P[2][16] * SPP[13] + P[11][16] * SPP[22] + P[14][16] * SPP[16];
|
nextP[2][16] = P[0][16] * SPP[14] - P[1][16] * SPP[3] + P[2][16] * SPP[13] + P[11][16] * SPP[22] + P[14][16] * SPP[16];
|
||||||
@@ -537,6 +547,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[14][16] = P[14][16];
|
nextP[14][16] = P[14][16];
|
||||||
nextP[15][16] = P[15][16];
|
nextP[15][16] = P[15][16];
|
||||||
nextP[16][16] = P[16][16];
|
nextP[16][16] = P[16][16];
|
||||||
|
|
||||||
nextP[0][17] = P[0][17] * SPP[5] - P[1][17] * SPP[4] + P[2][17] * SPP[7] + P[9][17] * SPP[22] + P[12][17] * SPP[18];
|
nextP[0][17] = P[0][17] * SPP[5] - P[1][17] * SPP[4] + P[2][17] * SPP[7] + P[9][17] * SPP[22] + P[12][17] * SPP[18];
|
||||||
nextP[1][17] = P[1][17] * SPP[6] - P[0][17] * SPP[2] - P[2][17] * SPP[8] + P[10][17] * SPP[22] + P[13][17] * SPP[17];
|
nextP[1][17] = P[1][17] * SPP[6] - P[0][17] * SPP[2] - P[2][17] * SPP[8] + P[10][17] * SPP[22] + P[13][17] * SPP[17];
|
||||||
nextP[2][17] = P[0][17] * SPP[14] - P[1][17] * SPP[3] + P[2][17] * SPP[13] + P[11][17] * SPP[22] + P[14][17] * SPP[16];
|
nextP[2][17] = P[0][17] * SPP[14] - P[1][17] * SPP[3] + P[2][17] * SPP[13] + P[11][17] * SPP[22] + P[14][17] * SPP[16];
|
||||||
@@ -555,6 +566,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[15][17] = P[15][17];
|
nextP[15][17] = P[15][17];
|
||||||
nextP[16][17] = P[16][17];
|
nextP[16][17] = P[16][17];
|
||||||
nextP[17][17] = P[17][17];
|
nextP[17][17] = P[17][17];
|
||||||
|
|
||||||
nextP[0][18] = P[0][18] * SPP[5] - P[1][18] * SPP[4] + P[2][18] * SPP[7] + P[9][18] * SPP[22] + P[12][18] * SPP[18];
|
nextP[0][18] = P[0][18] * SPP[5] - P[1][18] * SPP[4] + P[2][18] * SPP[7] + P[9][18] * SPP[22] + P[12][18] * SPP[18];
|
||||||
nextP[1][18] = P[1][18] * SPP[6] - P[0][18] * SPP[2] - P[2][18] * SPP[8] + P[10][18] * SPP[22] + P[13][18] * SPP[17];
|
nextP[1][18] = P[1][18] * SPP[6] - P[0][18] * SPP[2] - P[2][18] * SPP[8] + P[10][18] * SPP[22] + P[13][18] * SPP[17];
|
||||||
nextP[2][18] = P[0][18] * SPP[14] - P[1][18] * SPP[3] + P[2][18] * SPP[13] + P[11][18] * SPP[22] + P[14][18] * SPP[16];
|
nextP[2][18] = P[0][18] * SPP[14] - P[1][18] * SPP[3] + P[2][18] * SPP[13] + P[11][18] * SPP[22] + P[14][18] * SPP[16];
|
||||||
@@ -574,6 +586,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[16][18] = P[16][18];
|
nextP[16][18] = P[16][18];
|
||||||
nextP[17][18] = P[17][18];
|
nextP[17][18] = P[17][18];
|
||||||
nextP[18][18] = P[18][18];
|
nextP[18][18] = P[18][18];
|
||||||
|
|
||||||
nextP[0][19] = P[0][19] * SPP[5] - P[1][19] * SPP[4] + P[2][19] * SPP[7] + P[9][19] * SPP[22] + P[12][19] * SPP[18];
|
nextP[0][19] = P[0][19] * SPP[5] - P[1][19] * SPP[4] + P[2][19] * SPP[7] + P[9][19] * SPP[22] + P[12][19] * SPP[18];
|
||||||
nextP[1][19] = P[1][19] * SPP[6] - P[0][19] * SPP[2] - P[2][19] * SPP[8] + P[10][19] * SPP[22] + P[13][19] * SPP[17];
|
nextP[1][19] = P[1][19] * SPP[6] - P[0][19] * SPP[2] - P[2][19] * SPP[8] + P[10][19] * SPP[22] + P[13][19] * SPP[17];
|
||||||
nextP[2][19] = P[0][19] * SPP[14] - P[1][19] * SPP[3] + P[2][19] * SPP[13] + P[11][19] * SPP[22] + P[14][19] * SPP[16];
|
nextP[2][19] = P[0][19] * SPP[14] - P[1][19] * SPP[3] + P[2][19] * SPP[13] + P[11][19] * SPP[22] + P[14][19] * SPP[16];
|
||||||
@@ -594,6 +607,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[17][19] = P[17][19];
|
nextP[17][19] = P[17][19];
|
||||||
nextP[18][19] = P[18][19];
|
nextP[18][19] = P[18][19];
|
||||||
nextP[19][19] = P[19][19];
|
nextP[19][19] = P[19][19];
|
||||||
|
|
||||||
nextP[0][20] = P[0][20] * SPP[5] - P[1][20] * SPP[4] + P[2][20] * SPP[7] + P[9][20] * SPP[22] + P[12][20] * SPP[18];
|
nextP[0][20] = P[0][20] * SPP[5] - P[1][20] * SPP[4] + P[2][20] * SPP[7] + P[9][20] * SPP[22] + P[12][20] * SPP[18];
|
||||||
nextP[1][20] = P[1][20] * SPP[6] - P[0][20] * SPP[2] - P[2][20] * SPP[8] + P[10][20] * SPP[22] + P[13][20] * SPP[17];
|
nextP[1][20] = P[1][20] * SPP[6] - P[0][20] * SPP[2] - P[2][20] * SPP[8] + P[10][20] * SPP[22] + P[13][20] * SPP[17];
|
||||||
nextP[2][20] = P[0][20] * SPP[14] - P[1][20] * SPP[3] + P[2][20] * SPP[13] + P[11][20] * SPP[22] + P[14][20] * SPP[16];
|
nextP[2][20] = P[0][20] * SPP[14] - P[1][20] * SPP[3] + P[2][20] * SPP[13] + P[11][20] * SPP[22] + P[14][20] * SPP[16];
|
||||||
@@ -615,6 +629,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[18][20] = P[18][20];
|
nextP[18][20] = P[18][20];
|
||||||
nextP[19][20] = P[19][20];
|
nextP[19][20] = P[19][20];
|
||||||
nextP[20][20] = P[20][20];
|
nextP[20][20] = P[20][20];
|
||||||
|
|
||||||
nextP[0][21] = P[0][21] * SPP[5] - P[1][21] * SPP[4] + P[2][21] * SPP[7] + P[9][21] * SPP[22] + P[12][21] * SPP[18];
|
nextP[0][21] = P[0][21] * SPP[5] - P[1][21] * SPP[4] + P[2][21] * SPP[7] + P[9][21] * SPP[22] + P[12][21] * SPP[18];
|
||||||
nextP[1][21] = P[1][21] * SPP[6] - P[0][21] * SPP[2] - P[2][21] * SPP[8] + P[10][21] * SPP[22] + P[13][21] * SPP[17];
|
nextP[1][21] = P[1][21] * SPP[6] - P[0][21] * SPP[2] - P[2][21] * SPP[8] + P[10][21] * SPP[22] + P[13][21] * SPP[17];
|
||||||
nextP[2][21] = P[0][21] * SPP[14] - P[1][21] * SPP[3] + P[2][21] * SPP[13] + P[11][21] * SPP[22] + P[14][21] * SPP[16];
|
nextP[2][21] = P[0][21] * SPP[14] - P[1][21] * SPP[3] + P[2][21] * SPP[13] + P[11][21] * SPP[22] + P[14][21] * SPP[16];
|
||||||
@@ -637,6 +652,18 @@ void Ekf::predictCovariance()
|
|||||||
nextP[19][21] = P[19][21];
|
nextP[19][21] = P[19][21];
|
||||||
nextP[20][21] = P[20][21];
|
nextP[20][21] = P[20][21];
|
||||||
nextP[21][21] = P[21][21];
|
nextP[21][21] = P[21][21];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't do covariance prediction on wind states unless we are using them
|
||||||
|
if (_control_status.flags.wind) {
|
||||||
|
// Check if we have jsut transitioned to using wind states and set the variances accordingly
|
||||||
|
if (!_control_status_prev.flags.mag_3D) {
|
||||||
|
for (uint8_t index = 22; index <= 23; index++) {
|
||||||
|
// TODO initialise wind states using ground speed and airspeed and set initial variance using sum of ground speed and airspeed variances
|
||||||
|
P[index][index] = sq(5.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nextP[0][22] = P[0][22] * SPP[5] - P[1][22] * SPP[4] + P[2][22] * SPP[7] + P[9][22] * SPP[22] + P[12][22] * SPP[18];
|
nextP[0][22] = P[0][22] * SPP[5] - P[1][22] * SPP[4] + P[2][22] * SPP[7] + P[9][22] * SPP[22] + P[12][22] * SPP[18];
|
||||||
nextP[1][22] = P[1][22] * SPP[6] - P[0][22] * SPP[2] - P[2][22] * SPP[8] + P[10][22] * SPP[22] + P[13][22] * SPP[17];
|
nextP[1][22] = P[1][22] * SPP[6] - P[0][22] * SPP[2] - P[2][22] * SPP[8] + P[10][22] * SPP[22] + P[13][22] * SPP[17];
|
||||||
nextP[2][22] = P[0][22] * SPP[14] - P[1][22] * SPP[3] + P[2][22] * SPP[13] + P[11][22] * SPP[22] + P[14][22] * SPP[16];
|
nextP[2][22] = P[0][22] * SPP[14] - P[1][22] * SPP[3] + P[2][22] * SPP[13] + P[11][22] * SPP[22] + P[14][22] * SPP[16];
|
||||||
@@ -660,6 +687,7 @@ void Ekf::predictCovariance()
|
|||||||
nextP[20][22] = P[20][22];
|
nextP[20][22] = P[20][22];
|
||||||
nextP[21][22] = P[21][22];
|
nextP[21][22] = P[21][22];
|
||||||
nextP[22][22] = P[22][22];
|
nextP[22][22] = P[22][22];
|
||||||
|
|
||||||
nextP[0][23] = P[0][23] * SPP[5] - P[1][23] * SPP[4] + P[2][23] * SPP[7] + P[9][23] * SPP[22] + P[12][23] * SPP[18];
|
nextP[0][23] = P[0][23] * SPP[5] - P[1][23] * SPP[4] + P[2][23] * SPP[7] + P[9][23] * SPP[22] + P[12][23] * SPP[18];
|
||||||
nextP[1][23] = P[1][23] * SPP[6] - P[0][23] * SPP[2] - P[2][23] * SPP[8] + P[10][23] * SPP[22] + P[13][23] * SPP[17];
|
nextP[1][23] = P[1][23] * SPP[6] - P[0][23] * SPP[2] - P[2][23] * SPP[8] + P[10][23] * SPP[22] + P[13][23] * SPP[17];
|
||||||
nextP[2][23] = P[0][23] * SPP[14] - P[1][23] * SPP[3] + P[2][23] * SPP[13] + P[11][23] * SPP[22] + P[14][23] * SPP[16];
|
nextP[2][23] = P[0][23] * SPP[14] - P[1][23] * SPP[3] + P[2][23] * SPP[13] + P[11][23] * SPP[22] + P[14][23] * SPP[16];
|
||||||
@@ -685,6 +713,8 @@ void Ekf::predictCovariance()
|
|||||||
nextP[22][23] = P[22][23];
|
nextP[22][23] = P[22][23];
|
||||||
nextP[23][23] = P[23][23];
|
nextP[23][23] = P[23][23];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// add process noise
|
// add process noise
|
||||||
for (unsigned i = 0; i < _k_num_states; i++) {
|
for (unsigned i = 0; i < _k_num_states; i++) {
|
||||||
nextP[i][i] += process_noise[i];
|
nextP[i][i] += process_noise[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user