3 #if HAL_CPU_CLASS >= HAL_CPU_CLASS_150 56 VtasPred =
norm((ve - vwe) , (vn - vwn) , vd);
61 SH_TAS[0] = 1.0f/(sqrtf(
sq(ve - vwe) +
sq(vn - vwn) +
sq(vd)));
62 SH_TAS[1] = (SH_TAS[0]*(2*ve - 2*vwe))/2;
63 SH_TAS[2] = (SH_TAS[0]*(2*vn - 2*vwn))/2;
64 for (uint8_t i=0; i<=2; i++) H_TAS[i] = 0.0
f;
67 H_TAS[5] = vd*SH_TAS[0];
68 H_TAS[22] = -SH_TAS[2];
69 H_TAS[23] = -SH_TAS[1];
70 for (uint8_t i=6; i<=21; i++) H_TAS[i] = 0.0
f;
72 float temp = (R_TAS + SH_TAS[2]*(
P[3][3]*SH_TAS[2] +
P[4][3]*SH_TAS[1] -
P[22][3]*SH_TAS[2] -
P[23][3]*SH_TAS[1] +
P[5][3]*vd*SH_TAS[0]) + SH_TAS[1]*(
P[3][4]*SH_TAS[2] +
P[4][4]*SH_TAS[1] -
P[22][4]*SH_TAS[2] -
P[23][4]*SH_TAS[1] +
P[5][4]*vd*SH_TAS[0]) - SH_TAS[2]*(
P[3][22]*SH_TAS[2] +
P[4][22]*SH_TAS[1] -
P[22][22]*SH_TAS[2] -
P[23][22]*SH_TAS[1] +
P[5][22]*vd*SH_TAS[0]) - SH_TAS[1]*(
P[3][23]*SH_TAS[2] +
P[4][23]*SH_TAS[1] -
P[22][23]*SH_TAS[2] -
P[23][23]*SH_TAS[1] +
P[5][23]*vd*SH_TAS[0]) + vd*SH_TAS[0]*(
P[3][5]*SH_TAS[2] +
P[4][5]*SH_TAS[1] -
P[22][5]*SH_TAS[2] -
P[23][5]*SH_TAS[1] +
P[5][5]*vd*SH_TAS[0]));
83 Kfusion[0] = SK_TAS*(
P[0][3]*SH_TAS[2] -
P[0][22]*SH_TAS[2] +
P[0][4]*SH_TAS[1] -
P[0][23]*SH_TAS[1] +
P[0][5]*vd*SH_TAS[0]);
84 Kfusion[1] = SK_TAS*(
P[1][3]*SH_TAS[2] -
P[1][22]*SH_TAS[2] +
P[1][4]*SH_TAS[1] -
P[1][23]*SH_TAS[1] +
P[1][5]*vd*SH_TAS[0]);
85 Kfusion[2] = SK_TAS*(
P[2][3]*SH_TAS[2] -
P[2][22]*SH_TAS[2] +
P[2][4]*SH_TAS[1] -
P[2][23]*SH_TAS[1] +
P[2][5]*vd*SH_TAS[0]);
86 Kfusion[3] = SK_TAS*(
P[3][3]*SH_TAS[2] -
P[3][22]*SH_TAS[2] +
P[3][4]*SH_TAS[1] -
P[3][23]*SH_TAS[1] +
P[3][5]*vd*SH_TAS[0]);
87 Kfusion[4] = SK_TAS*(
P[4][3]*SH_TAS[2] -
P[4][22]*SH_TAS[2] +
P[4][4]*SH_TAS[1] -
P[4][23]*SH_TAS[1] +
P[4][5]*vd*SH_TAS[0]);
88 Kfusion[5] = SK_TAS*(
P[5][3]*SH_TAS[2] -
P[5][22]*SH_TAS[2] +
P[5][4]*SH_TAS[1] -
P[5][23]*SH_TAS[1] +
P[5][5]*vd*SH_TAS[0]);
89 Kfusion[6] = SK_TAS*(
P[6][3]*SH_TAS[2] -
P[6][22]*SH_TAS[2] +
P[6][4]*SH_TAS[1] -
P[6][23]*SH_TAS[1] +
P[6][5]*vd*SH_TAS[0]);
90 Kfusion[7] = SK_TAS*(
P[7][3]*SH_TAS[2] -
P[7][22]*SH_TAS[2] +
P[7][4]*SH_TAS[1] -
P[7][23]*SH_TAS[1] +
P[7][5]*vd*SH_TAS[0]);
91 Kfusion[8] = SK_TAS*(
P[8][3]*SH_TAS[2] -
P[8][22]*SH_TAS[2] +
P[8][4]*SH_TAS[1] -
P[8][23]*SH_TAS[1] +
P[8][5]*vd*SH_TAS[0]);
92 Kfusion[9] = SK_TAS*(
P[9][3]*SH_TAS[2] -
P[9][22]*SH_TAS[2] +
P[9][4]*SH_TAS[1] -
P[9][23]*SH_TAS[1] +
P[9][5]*vd*SH_TAS[0]);
93 Kfusion[10] = SK_TAS*(
P[10][3]*SH_TAS[2] -
P[10][22]*SH_TAS[2] +
P[10][4]*SH_TAS[1] -
P[10][23]*SH_TAS[1] +
P[10][5]*vd*SH_TAS[0]);
94 Kfusion[11] = SK_TAS*(
P[11][3]*SH_TAS[2] -
P[11][22]*SH_TAS[2] +
P[11][4]*SH_TAS[1] -
P[11][23]*SH_TAS[1] +
P[11][5]*vd*SH_TAS[0]);
95 Kfusion[12] = SK_TAS*(
P[12][3]*SH_TAS[2] -
P[12][22]*SH_TAS[2] +
P[12][4]*SH_TAS[1] -
P[12][23]*SH_TAS[1] +
P[12][5]*vd*SH_TAS[0]);
96 Kfusion[13] = SK_TAS*(
P[13][3]*SH_TAS[2] -
P[13][22]*SH_TAS[2] +
P[13][4]*SH_TAS[1] -
P[13][23]*SH_TAS[1] +
P[13][5]*vd*SH_TAS[0]);
97 Kfusion[14] = SK_TAS*(
P[14][3]*SH_TAS[2] -
P[14][22]*SH_TAS[2] +
P[14][4]*SH_TAS[1] -
P[14][23]*SH_TAS[1] +
P[14][5]*vd*SH_TAS[0]);
98 Kfusion[15] = SK_TAS*(
P[15][3]*SH_TAS[2] -
P[15][22]*SH_TAS[2] +
P[15][4]*SH_TAS[1] -
P[15][23]*SH_TAS[1] +
P[15][5]*vd*SH_TAS[0]);
99 Kfusion[22] = SK_TAS*(
P[22][3]*SH_TAS[2] -
P[22][22]*SH_TAS[2] +
P[22][4]*SH_TAS[1] -
P[22][23]*SH_TAS[1] +
P[22][5]*vd*SH_TAS[0]);
100 Kfusion[23] = SK_TAS*(
P[23][3]*SH_TAS[2] -
P[23][22]*SH_TAS[2] +
P[23][4]*SH_TAS[1] -
P[23][23]*SH_TAS[1] +
P[23][5]*vd*SH_TAS[0]);
103 Kfusion[16] = SK_TAS*(
P[16][3]*SH_TAS[2] -
P[16][22]*SH_TAS[2] +
P[16][4]*SH_TAS[1] -
P[16][23]*SH_TAS[1] +
P[16][5]*vd*SH_TAS[0]);
104 Kfusion[17] = SK_TAS*(
P[17][3]*SH_TAS[2] -
P[17][22]*SH_TAS[2] +
P[17][4]*SH_TAS[1] -
P[17][23]*SH_TAS[1] +
P[17][5]*vd*SH_TAS[0]);
105 Kfusion[18] = SK_TAS*(
P[18][3]*SH_TAS[2] -
P[18][22]*SH_TAS[2] +
P[18][4]*SH_TAS[1] -
P[18][23]*SH_TAS[1] +
P[18][5]*vd*SH_TAS[0]);
106 Kfusion[19] = SK_TAS*(
P[19][3]*SH_TAS[2] -
P[19][22]*SH_TAS[2] +
P[19][4]*SH_TAS[1] -
P[19][23]*SH_TAS[1] +
P[19][5]*vd*SH_TAS[0]);
107 Kfusion[20] = SK_TAS*(
P[20][3]*SH_TAS[2] -
P[20][22]*SH_TAS[2] +
P[20][4]*SH_TAS[1] -
P[20][23]*SH_TAS[1] +
P[20][5]*vd*SH_TAS[0]);
108 Kfusion[21] = SK_TAS*(
P[21][3]*SH_TAS[2] -
P[21][22]*SH_TAS[2] +
P[21][4]*SH_TAS[1] -
P[21][23]*SH_TAS[1] +
P[21][5]*vd*SH_TAS[0]);
110 for (uint8_t i=16; i<=21; i++) {
151 for (
unsigned j = 0; j<=2; j++) {
154 for (
unsigned j = 3; j<=5; j++) {
155 KH[i][j] = Kfusion[i] * H_TAS[j];
157 for (
unsigned j = 6; j<=21; j++) {
160 for (
unsigned j = 22; j<=23; j++) {
161 KH[i][j] = Kfusion[i] * H_TAS[j];
167 res +=
KH[i][3] *
P[3][j];
168 res +=
KH[i][4] * P[4][j];
169 res +=
KH[i][5] * P[5][j];
170 res +=
KH[i][22] * P[22][j];
171 res +=
KH[i][23] * P[23][j];
177 P[i][j] =
P[i][j] -
KHP[i][j];
242 if (f_feasible && f_required && f_timeTrigger) {
268 const float R_BETA = 0.03f;
287 vel_rel_wind.
x = vn - vwn;
288 vel_rel_wind.
y = ve - vwe;
292 vel_rel_wind =
prevTnb * vel_rel_wind;
295 if (vel_rel_wind.x > 5.0f)
298 SH_BETA[0] = (vn - vwn)*(
sq(q0) +
sq(q1) -
sq(q2) -
sq(q3)) - vd*(2*q0*q2 - 2*q1*q3) + (ve - vwe)*(2*q0*q3 + 2*q1*q2);
299 if (fabsf(SH_BETA[0]) <= 1e-9
f) {
305 SH_BETA[0] = (vn - vwn)*(
sq(q0) +
sq(q1) -
sq(q2) -
sq(q3)) - vd*(2*q0*q2 - 2*q1*q3) + (ve - vwe)*(2*q0*q3 + 2*q1*q2);
306 SH_BETA[1] = (ve - vwe)*(
sq(q0) -
sq(q1) +
sq(q2) -
sq(q3)) + vd*(2*q0*q1 + 2*q2*q3) - (vn - vwn)*(2*q0*q3 - 2*q1*q2);
307 SH_BETA[2] = vd*(
sq(q0) -
sq(q1) -
sq(q2) +
sq(q3)) - (ve - vwe)*(2*q0*q1 - 2*q2*
q3) + (vn - vwn)*(2*q0*q2 + 2*q1*
q3);
308 SH_BETA[3] = 1/
sq(SH_BETA[0]);
309 SH_BETA[4] = (
sq(q0) -
sq(q1) +
sq(q2) -
sq(q3))/SH_BETA[0];
310 SH_BETA[5] =
sq(q0) +
sq(q1) -
sq(q2) -
sq(q3);
311 SH_BETA[6] = 1/SH_BETA[0];
312 SH_BETA[7] = 2*q0*
q3;
313 SH_BETA[8] = SH_BETA[7] + 2*q1*
q2;
314 SH_BETA[9] = SH_BETA[7] - 2*q1*
q2;
315 H_BETA[0] = SH_BETA[2]*SH_BETA[6];
316 H_BETA[1] = SH_BETA[1]*SH_BETA[2]*SH_BETA[3];
317 H_BETA[2] = -
sq(SH_BETA[1])*SH_BETA[3] - 1;
318 H_BETA[3] = - SH_BETA[6]*SH_BETA[9] - SH_BETA[1]*SH_BETA[3]*SH_BETA[5];
319 H_BETA[4] = SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8];
320 H_BETA[5] = SH_BETA[6]*(2*q0*q1 + 2*q2*
q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*q3);
321 for (uint8_t i=6; i<=21; i++) {
324 H_BETA[22] = SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5];
325 H_BETA[23] = SH_BETA[1]*SH_BETA[3]*SH_BETA[8] - SH_BETA[4];
328 float temp = (R_BETA + (SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8])*(
P[22][4]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][4]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][4]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][4]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][4]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][4]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][4]*SH_BETA[2]*SH_BETA[6] +
P[1][4]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) - (SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8])*(
P[22][23]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][23]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][23]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][23]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][23]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][23]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][23]*SH_BETA[2]*SH_BETA[6] +
P[1][23]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) - (SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5])*(
P[22][3]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][3]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][3]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][3]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][3]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][3]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][3]*SH_BETA[2]*SH_BETA[6] +
P[1][3]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) + (SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5])*(
P[22][22]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][22]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][22]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][22]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][22]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][22]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][22]*SH_BETA[2]*SH_BETA[6] +
P[1][22]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) - (
sq(SH_BETA[1])*SH_BETA[3] + 1)*(
P[22][2]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][2]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][2]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][2]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][2]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][2]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][2]*SH_BETA[2]*SH_BETA[6] +
P[1][2]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) + (SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3))*(
P[22][5]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][5]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][5]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][5]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][5]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][5]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][5]*SH_BETA[2]*SH_BETA[6] +
P[1][5]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) + SH_BETA[2]*SH_BETA[6]*(
P[22][0]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][0]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][0]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][0]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][0]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][0]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][0]*SH_BETA[2]*SH_BETA[6] +
P[1][0]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]) + SH_BETA[1]*SH_BETA[2]*SH_BETA[3]*(
P[22][1]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[3][1]*(SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5]) -
P[2][1]*(
sq(SH_BETA[1])*SH_BETA[3] + 1) +
P[5][1]*(SH_BETA[6]*(2*q0*q1 + 2*q2*q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*
q3)) +
P[4][1]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) -
P[23][1]*(SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8]) +
P[0][1]*SH_BETA[2]*SH_BETA[6] +
P[1][1]*SH_BETA[1]*SH_BETA[2]*SH_BETA[3]));
329 if (temp >= R_BETA) {
330 SK_BETA[0] = 1.0f / temp;
339 SK_BETA[1] = SH_BETA[6]*(2*q0*q1 + 2*q2*
q3) + SH_BETA[1]*SH_BETA[3]*(2*q0*q2 - 2*q1*q3);
340 SK_BETA[2] = SH_BETA[6]*SH_BETA[9] + SH_BETA[1]*SH_BETA[3]*SH_BETA[5];
341 SK_BETA[3] = SH_BETA[4] - SH_BETA[1]*SH_BETA[3]*SH_BETA[8];
342 SK_BETA[4] =
sq(SH_BETA[1])*SH_BETA[3] + 1;
343 Kfusion[0] = SK_BETA[0]*(
P[0][5]*SK_BETA[1] -
P[0][2]*SK_BETA[4] -
P[0][3]*SK_BETA[2] +
P[0][4]*SK_BETA[3] +
P[0][22]*SK_BETA[2] -
P[0][23]*SK_BETA[3] +
P[0][0]*SH_BETA[6]*SH_BETA[2] +
P[0][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
344 Kfusion[1] = SK_BETA[0]*(
P[1][5]*SK_BETA[1] -
P[1][2]*SK_BETA[4] -
P[1][3]*SK_BETA[2] +
P[1][4]*SK_BETA[3] +
P[1][22]*SK_BETA[2] -
P[1][23]*SK_BETA[3] +
P[1][0]*SH_BETA[6]*SH_BETA[2] +
P[1][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
345 Kfusion[2] = SK_BETA[0]*(
P[2][5]*SK_BETA[1] -
P[2][2]*SK_BETA[4] -
P[2][3]*SK_BETA[2] +
P[2][4]*SK_BETA[3] +
P[2][22]*SK_BETA[2] -
P[2][23]*SK_BETA[3] +
P[2][0]*SH_BETA[6]*SH_BETA[2] +
P[2][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
346 Kfusion[3] = SK_BETA[0]*(
P[3][5]*SK_BETA[1] -
P[3][2]*SK_BETA[4] -
P[3][3]*SK_BETA[2] +
P[3][4]*SK_BETA[3] +
P[3][22]*SK_BETA[2] -
P[3][23]*SK_BETA[3] +
P[3][0]*SH_BETA[6]*SH_BETA[2] +
P[3][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
347 Kfusion[4] = SK_BETA[0]*(
P[4][5]*SK_BETA[1] -
P[4][2]*SK_BETA[4] -
P[4][3]*SK_BETA[2] +
P[4][4]*SK_BETA[3] +
P[4][22]*SK_BETA[2] -
P[4][23]*SK_BETA[3] +
P[4][0]*SH_BETA[6]*SH_BETA[2] +
P[4][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
348 Kfusion[5] = SK_BETA[0]*(
P[5][5]*SK_BETA[1] -
P[5][2]*SK_BETA[4] -
P[5][3]*SK_BETA[2] +
P[5][4]*SK_BETA[3] +
P[5][22]*SK_BETA[2] -
P[5][23]*SK_BETA[3] +
P[5][0]*SH_BETA[6]*SH_BETA[2] +
P[5][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
349 Kfusion[6] = SK_BETA[0]*(
P[6][5]*SK_BETA[1] -
P[6][2]*SK_BETA[4] -
P[6][3]*SK_BETA[2] +
P[6][4]*SK_BETA[3] +
P[6][22]*SK_BETA[2] -
P[6][23]*SK_BETA[3] +
P[6][0]*SH_BETA[6]*SH_BETA[2] +
P[6][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
350 Kfusion[7] = SK_BETA[0]*(
P[7][5]*SK_BETA[1] -
P[7][2]*SK_BETA[4] -
P[7][3]*SK_BETA[2] +
P[7][4]*SK_BETA[3] +
P[7][22]*SK_BETA[2] -
P[7][23]*SK_BETA[3] +
P[7][0]*SH_BETA[6]*SH_BETA[2] +
P[7][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
351 Kfusion[8] = SK_BETA[0]*(
P[8][5]*SK_BETA[1] -
P[8][2]*SK_BETA[4] -
P[8][3]*SK_BETA[2] +
P[8][4]*SK_BETA[3] +
P[8][22]*SK_BETA[2] -
P[8][23]*SK_BETA[3] +
P[8][0]*SH_BETA[6]*SH_BETA[2] +
P[8][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
352 Kfusion[9] = SK_BETA[0]*(
P[9][5]*SK_BETA[1] -
P[9][2]*SK_BETA[4] -
P[9][3]*SK_BETA[2] +
P[9][4]*SK_BETA[3] +
P[9][22]*SK_BETA[2] -
P[9][23]*SK_BETA[3] +
P[9][0]*SH_BETA[6]*SH_BETA[2] +
P[9][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
353 Kfusion[10] = SK_BETA[0]*(
P[10][5]*SK_BETA[1] -
P[10][2]*SK_BETA[4] -
P[10][3]*SK_BETA[2] +
P[10][4]*SK_BETA[3] +
P[10][22]*SK_BETA[2] -
P[10][23]*SK_BETA[3] +
P[10][0]*SH_BETA[6]*SH_BETA[2] +
P[10][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
354 Kfusion[11] = SK_BETA[0]*(
P[11][5]*SK_BETA[1] -
P[11][2]*SK_BETA[4] -
P[11][3]*SK_BETA[2] +
P[11][4]*SK_BETA[3] +
P[11][22]*SK_BETA[2] -
P[11][23]*SK_BETA[3] +
P[11][0]*SH_BETA[6]*SH_BETA[2] +
P[11][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
355 Kfusion[12] = SK_BETA[0]*(
P[12][5]*SK_BETA[1] -
P[12][2]*SK_BETA[4] -
P[12][3]*SK_BETA[2] +
P[12][4]*SK_BETA[3] +
P[12][22]*SK_BETA[2] -
P[12][23]*SK_BETA[3] +
P[12][0]*SH_BETA[6]*SH_BETA[2] +
P[12][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
356 Kfusion[13] = SK_BETA[0]*(
P[13][5]*SK_BETA[1] -
P[13][2]*SK_BETA[4] -
P[13][3]*SK_BETA[2] +
P[13][4]*SK_BETA[3] +
P[13][22]*SK_BETA[2] -
P[13][23]*SK_BETA[3] +
P[13][0]*SH_BETA[6]*SH_BETA[2] +
P[13][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
357 Kfusion[14] = SK_BETA[0]*(
P[14][5]*SK_BETA[1] -
P[14][2]*SK_BETA[4] -
P[14][3]*SK_BETA[2] +
P[14][4]*SK_BETA[3] +
P[14][22]*SK_BETA[2] -
P[14][23]*SK_BETA[3] +
P[14][0]*SH_BETA[6]*SH_BETA[2] +
P[14][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
358 Kfusion[15] = SK_BETA[0]*(
P[15][5]*SK_BETA[1] -
P[15][2]*SK_BETA[4] -
P[15][3]*SK_BETA[2] +
P[15][4]*SK_BETA[3] +
P[15][22]*SK_BETA[2] -
P[15][23]*SK_BETA[3] +
P[15][0]*SH_BETA[6]*SH_BETA[2] +
P[15][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
359 Kfusion[22] = SK_BETA[0]*(
P[22][5]*SK_BETA[1] -
P[22][2]*SK_BETA[4] -
P[22][3]*SK_BETA[2] +
P[22][4]*SK_BETA[3] +
P[22][22]*SK_BETA[2] -
P[22][23]*SK_BETA[3] +
P[22][0]*SH_BETA[6]*SH_BETA[2] +
P[22][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
360 Kfusion[23] = SK_BETA[0]*(
P[23][5]*SK_BETA[1] -
P[23][2]*SK_BETA[4] -
P[23][3]*SK_BETA[2] +
P[23][4]*SK_BETA[3] +
P[23][22]*SK_BETA[2] -
P[23][23]*SK_BETA[3] +
P[23][0]*SH_BETA[6]*SH_BETA[2] +
P[23][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
363 Kfusion[16] = SK_BETA[0]*(
P[16][5]*SK_BETA[1] -
P[16][2]*SK_BETA[4] -
P[16][3]*SK_BETA[2] +
P[16][4]*SK_BETA[3] +
P[16][22]*SK_BETA[2] -
P[16][23]*SK_BETA[3] +
P[16][0]*SH_BETA[6]*SH_BETA[2] +
P[16][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
364 Kfusion[17] = SK_BETA[0]*(
P[17][5]*SK_BETA[1] -
P[17][2]*SK_BETA[4] -
P[17][3]*SK_BETA[2] +
P[17][4]*SK_BETA[3] +
P[17][22]*SK_BETA[2] -
P[17][23]*SK_BETA[3] +
P[17][0]*SH_BETA[6]*SH_BETA[2] +
P[17][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
365 Kfusion[18] = SK_BETA[0]*(
P[18][5]*SK_BETA[1] -
P[18][2]*SK_BETA[4] -
P[18][3]*SK_BETA[2] +
P[18][4]*SK_BETA[3] +
P[18][22]*SK_BETA[2] -
P[18][23]*SK_BETA[3] +
P[18][0]*SH_BETA[6]*SH_BETA[2] +
P[18][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
366 Kfusion[19] = SK_BETA[0]*(
P[19][5]*SK_BETA[1] -
P[19][2]*SK_BETA[4] -
P[19][3]*SK_BETA[2] +
P[19][4]*SK_BETA[3] +
P[19][22]*SK_BETA[2] -
P[19][23]*SK_BETA[3] +
P[19][0]*SH_BETA[6]*SH_BETA[2] +
P[19][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
367 Kfusion[20] = SK_BETA[0]*(
P[20][5]*SK_BETA[1] -
P[20][2]*SK_BETA[4] -
P[20][3]*SK_BETA[2] +
P[20][4]*SK_BETA[3] +
P[20][22]*SK_BETA[2] -
P[20][23]*SK_BETA[3] +
P[20][0]*SH_BETA[6]*SH_BETA[2] +
P[20][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
368 Kfusion[21] = SK_BETA[0]*(
P[21][5]*SK_BETA[1] -
P[21][2]*SK_BETA[4] -
P[21][3]*SK_BETA[2] +
P[21][4]*SK_BETA[3] +
P[21][22]*SK_BETA[2] -
P[21][23]*SK_BETA[3] +
P[21][0]*SH_BETA[6]*SH_BETA[2] +
P[21][1]*SH_BETA[1]*SH_BETA[3]*SH_BETA[2]);
370 for (uint8_t i=16; i<=21; i++) {
376 innovBeta = vel_rel_wind.y / vel_rel_wind.x;
379 if (innovBeta > 0.5
f) {
399 for (
unsigned j = 0; j<=5; j++) {
400 KH[i][j] = Kfusion[i] * H_BETA[j];
402 for (
unsigned j = 6; j<=21; j++) {
405 for (
unsigned j = 22; j<=23; j++) {
406 KH[i][j] = Kfusion[i] * H_BETA[j];
412 res +=
KH[i][0] *
P[0][j];
413 res +=
KH[i][1] * P[1][j];
414 res +=
KH[i][2] * P[2][j];
415 res +=
KH[i][3] * P[3][j];
416 res +=
KH[i][4] * P[4][j];
417 res +=
KH[i][5] * P[5][j];
418 res +=
KH[i][22] * P[22][j];
419 res +=
KH[i][23] * P[23][j];
425 P[i][j] =
P[i][j] -
KHP[i][j];
443 #endif // HAL_CPU_CLASS float norm(const T first, const U second, const Params... parameters)
AP_HAL::Util::perf_counter_t _perf_FuseSideslip
bool assume_zero_sideslip(void) const
const uint16_t posRetryTimeNoVel_ms
struct NavEKF2_core::state_elements & stateStruct
uint32_t imuSampleTime_ms
static auto MAX(const A &one, const B &two) -> decltype(one > two ? one :two)
AP_HAL::Util::perf_counter_t _perf_FuseAirspeed
struct NavEKF2_core::@145 faultStatus
const uint16_t tasRetryTime_ms
bool useAirspeed(void) const
virtual void perf_end(perf_counter_t h)
bool use_compass(void) const
void ConstrainVariances()
bool sideSlipFusionDelayed
float constrain_float(const float amt, const float low, const float high)
virtual void perf_begin(perf_counter_t h)
void rotate(const Vector3f &v)
float get_EAS2TAS(void) const
const AP_HAL::HAL & hal
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
uint32_t lastPosPassTime_ms
uint32_t lastTasPassTime_ms
tas_elements tasDataDelayed