33 #include "physical_constants.h"
38 #define NUMX 16 // number of states, X is the state vector
39 #define NUMW 12 // number of plant noise inputs, w is disturbance noise vector
40 #define NUMV 10 // number of measurements, v is the measurement noise vector
41 #define NUMU 6 // number of deterministic inputs, U is the input vector
43 #if defined(GENERAL_COV)
46 #define COVARIANCE_PREDICTION_GENERAL
51 float Q[NUMW],
float dT,
float P[NUMX][NUMX]);
53 float Y[NUMV],
float P[NUMX][NUMX],
float X[NUMX],
54 uint16_t SensorsUsed);
84 for (
int i = 0;
i <
NUMX;
i++) {
85 for (
int j = 0;
j <
NUMX;
j++) {
92 for (
int j = 0;
j <
NUMV;
j++) {
104 P[0][0] =
P[1][1] =
P[2][2] = 25.0f;
105 P[3][3] =
P[4][4] =
P[5][5] = 5.0f;
106 P[6][6] =
P[7][7] =
P[8][8] =
P[9][9] = 1e-5
f;
107 P[10][10] =
P[11][11] =
P[12][12] = 1e-6
f;
108 P[13][13] =
P[14][14] =
P[15][15] = 1e-5
f;
110 X[0] =
X[1] =
X[2] =
X[3] =
X[4] =
X[5] = 0.0f;
112 X[7] =
X[8] =
X[9] = 0.0f;
113 X[10] =
X[11] =
X[12] = 0.0f;
114 X[13] =
X[14] =
X[15] = 0.0f;
116 Q[0] =
Q[1] =
Q[2] = 1e-5
f;
117 Q[3] =
Q[4] =
Q[5] = 1e-5
f;
120 Q[9] =
Q[10] =
Q[11] = 5e-4
f;
122 R[0] =
R[1] = 0.004f;
124 R[3] =
R[4] = 0.004f;
126 R[6] =
R[7] =
R[8] = 0.005f;
176 gyro_bias[0] =
X[10];
177 gyro_bias[1] =
X[11];
178 gyro_bias[2] =
X[12];
182 accel_bias[0] =
X[13];
183 accel_bias[1] =
X[14];
184 accel_bias[2] =
X[15];
194 for (uint32_t
i = 0;
i <
NUMX;
i++)
195 var_out[
i] =
P[
i][
i];
203 for (i=0;i<
NUMX;i++){
206 P[i][j]=
P[j][i]=0.0
f;
212 void INSSetState(
const float pos[3],
const float vel[3],
const float q[4],
const float gyro_bias[3],
const float accel_bias[3])
224 X[10] = gyro_bias[0];
225 X[11] = gyro_bias[1];
226 X[12] = gyro_bias[2];
227 X[13] = accel_bias[0];
228 X[14] = accel_bias[1];
229 X[15] = accel_bias[2];
234 for (
int i = 0; i < 6; i++) {
235 for(
int j = i; j <
NUMX; j++) {
241 P[0][0] =
P[1][1] =
P[2][2] = 25.0f;
242 P[3][3] =
P[4][4] =
P[5][5] = 5.0f;
264 X[10] = gyro_bias[0];
265 X[11] = gyro_bias[1];
266 X[12] = gyro_bias[2];
271 X[13] = accel_bias[0];
272 X[14] = accel_bias[1];
273 X[15] = accel_bias[2];
292 R[6] = scaled_mag_var[0];
293 R[7] = scaled_mag_var[1];
294 R[8] = scaled_mag_var[2];
309 void INSStatePrediction(
const float gyro_data[3],
const float accel_data[3],
float dT)
320 U[3] = accel_data[0];
321 U[4] = accel_data[1];
322 U[5] = accel_data[2];
327 qmag = sqrtf(
X[6] *
X[6] +
X[7] *
X[7] +
X[8] *
X[8] +
X[9] *
X[9]);
339 void INSCorrection(
const float mag_data[3],
const float Pos[3],
const float Vel[3],
340 float BaroAlt, uint16_t SensorsUsed)
362 float k1 = 1.0f/sqrtf(powf(q0*q1*2.0
f+q2*q3*2.0
f,2.0f)+powf(q0*q0-q1*q1-q2*q2+q3*q3,2.0f));
363 float k2 = sqrtf(-powf(q0*q2*2.0f-q1*q3*2.0f,2.0f)+1.0f);
367 Rbe_a[0][2] = q0*q2*-2.0f+q1*q3*2.0f;
368 Rbe_a[1][0] = k1*(q0*q1*2.0f+q2*q3*2.0f)*(q0*q2*2.0f-q1*q3*2.0f);
369 Rbe_a[1][1] = k1*(q0*q0-q1*q1-q2*q2+q3*q3);
370 Rbe_a[1][2] = k1*sqrtf(-powf(q0*q2*2.0f-q1*q3*2.0f,2.0f)+1.0f)*(q0*q1*2.0f+q2*q3*2.0f);
371 Rbe_a[2][0] = k1*(q0*q2*2.0f-q1*q3*2.0f)*(q0*q0-q1*q1-q2*q2+q3*q3);
372 Rbe_a[2][1] = -k1*(q0*q1*2.0f+q2*q3*2.0f);
373 Rbe_a[2][2] = k1*k2*(q0*q0-q1*q1-q2*q2+q3*q3);
375 Z[6] = Rbe_a[0][0]*mag_data[0] + Rbe_a[1][0]*mag_data[1] + Rbe_a[2][0]*mag_data[2] ;
376 Z[7] = Rbe_a[0][1]*mag_data[0] + Rbe_a[1][1]*mag_data[1] + Rbe_a[2][1]*mag_data[2] ;
377 Z[8] = Rbe_a[0][2]*mag_data[0] + Rbe_a[1][2]*mag_data[1] + Rbe_a[2][2]*mag_data[2] ;
387 qmag = sqrtf(
X[6] *
X[6] +
X[7] *
X[7] +
X[8] *
X[8] +
X[9] *
X[9]);
405 #ifdef COVARIANCE_PREDICTION_GENERAL
408 float Q[NUMW],
float dT,
float P[NUMX][NUMX])
417 for (i = 0; i <
NUMX; i++)
418 for (j = 0; j <
NUMX; j++) {
419 Dummy[
i][
j] =
P[
i][
j] / dT;
420 for (k = 0; k <
NUMX; k++)
421 Dummy[i][j] +=
F[i][k] *
P[k][j];
423 for (i = 0; i <
NUMX; i++)
424 for (j = i; j <
NUMX; j++) {
425 P[
i][
j] = Dummy[
i][
j] / dT;
426 for (k = 0; k <
NUMX; k++)
427 P[i][j] += Dummy[i][k] *
F[j][k];
428 for (k = 0; k <
NUMW; k++)
429 P[i][j] +=
Q[k] *
G[i][k] *
G[j][k];
437 float Q[NUMW],
float dT,
float P[NUMX][NUMX])
447 for (i = 0; i <
NUMX; i++)
448 for (j = i; j <
NUMX; j++)
452 P[0][0] = D[3][3]*Tsq + (2*D[0][3])*T + D[0][0];
453 P[0][1] = P[1][0] = D[3][4]*Tsq + (D[0][4] + D[1][3])*T + D[0][1];
454 P[0][2] = P[2][0] = D[3][5]*Tsq + (D[0][5] + D[2][3])*T + D[0][2];
455 P[0][3] = P[3][0] = (
F[3][6]*D[3][6] +
F[3][7]*D[3][7] +
F[3][8]*D[3][8] +
F[3][9]*D[3][9] +
F[3][13]*D[3][13] +
F[3][14]*D[3][14] +
F[3][15]*D[3][15])*Tsq + (D[3][3] +
F[3][6]*D[0][6] +
F[3][7]*D[0][7] +
F[3][8]*D[0][8] +
F[3][9]*D[0][9] +
F[3][13]*D[0][13] +
F[3][14]*D[0][14] +
F[3][15]*D[0][15])*T + D[0][3];
456 P[0][4] = P[4][0] = (
F[4][6]*D[3][6] +
F[4][7]*D[3][7] +
F[4][8]*D[3][8] +
F[4][9]*D[3][9] +
F[4][13]*D[3][13] +
F[4][14]*D[3][14] +
F[4][15]*D[3][15])*Tsq + (D[3][4] +
F[4][6]*D[0][6] +
F[4][7]*D[0][7] +
F[4][8]*D[0][8] +
F[4][9]*D[0][9] +
F[4][13]*D[0][13] +
F[4][14]*D[0][14] +
F[4][15]*D[0][15])*T + D[0][4];
457 P[0][5] = P[5][0] = (
F[5][6]*D[3][6] +
F[5][7]*D[3][7] +
F[5][8]*D[3][8] +
F[5][9]*D[3][9] +
F[5][13]*D[3][13] +
F[5][14]*D[3][14] +
F[5][15]*D[3][15])*Tsq + (D[3][5] +
F[5][6]*D[0][6] +
F[5][7]*D[0][7] +
F[5][8]*D[0][8] +
F[5][9]*D[0][9] +
F[5][13]*D[0][13] +
F[5][14]*D[0][14] +
F[5][15]*D[0][15])*T + D[0][5];
458 P[0][6] = P[6][0] = (
F[6][7]*D[3][7] +
F[6][8]*D[3][8] +
F[6][9]*D[3][9] +
F[6][10]*D[3][10] +
F[6][11]*D[3][11] +
F[6][12]*D[3][12])*Tsq + (D[3][6] +
F[6][7]*D[0][7] +
F[6][8]*D[0][8] +
F[6][9]*D[0][9] +
F[6][10]*D[0][10] +
F[6][11]*D[0][11] +
F[6][12]*D[0][12])*T + D[0][6];
459 P[0][7] = P[7][0] = (
F[7][6]*D[3][6] +
F[7][8]*D[3][8] +
F[7][9]*D[3][9] +
F[7][10]*D[3][10] +
F[7][11]*D[3][11] +
F[7][12]*D[3][12])*Tsq + (D[3][7] +
F[7][6]*D[0][6] +
F[7][8]*D[0][8] +
F[7][9]*D[0][9] +
F[7][10]*D[0][10] +
F[7][11]*D[0][11] +
F[7][12]*D[0][12])*T + D[0][7];
460 P[0][8] = P[8][0] = (
F[8][6]*D[3][6] +
F[8][7]*D[3][7] +
F[8][9]*D[3][9] +
F[8][10]*D[3][10] +
F[8][11]*D[3][11] +
F[8][12]*D[3][12])*Tsq + (D[3][8] +
F[8][6]*D[0][6] +
F[8][7]*D[0][7] +
F[8][9]*D[0][9] +
F[8][10]*D[0][10] +
F[8][11]*D[0][11] +
F[8][12]*D[0][12])*T + D[0][8];
461 P[0][9] = P[9][0] = (
F[9][6]*D[3][6] +
F[9][7]*D[3][7] +
F[9][8]*D[3][8] +
F[9][10]*D[3][10] +
F[9][11]*D[3][11] +
F[9][12]*D[3][12])*Tsq + (D[3][9] +
F[9][6]*D[0][6] +
F[9][7]*D[0][7] +
F[9][8]*D[0][8] +
F[9][10]*D[0][10] +
F[9][11]*D[0][11] +
F[9][12]*D[0][12])*T + D[0][9];
462 P[0][10] = P[10][0] = D[3][10]*T + D[0][10];
463 P[0][11] = P[11][0] = D[3][11]*T + D[0][11];
464 P[0][12] = P[12][0] = D[3][12]*T + D[0][12];
465 P[0][13] = P[13][0] = D[3][13]*T + D[0][13];
466 P[0][14] = P[14][0] = D[3][14]*T + D[0][14];
467 P[0][15] = P[15][0] = D[3][15]*T + D[0][15];
468 P[1][1] = D[4][4]*Tsq + (2*D[1][4])*T + D[1][1];
469 P[1][2] = P[2][1] = D[4][5]*Tsq + (D[1][5] + D[2][4])*T + D[1][2];
470 P[1][3] = P[3][1] = (
F[3][6]*D[4][6] +
F[3][7]*D[4][7] +
F[3][8]*D[4][8] +
F[3][9]*D[4][9] +
F[3][13]*D[4][13] +
F[3][14]*D[4][14] +
F[3][15]*D[4][15])*Tsq + (D[3][4] +
F[3][6]*D[1][6] +
F[3][7]*D[1][7] +
F[3][8]*D[1][8] +
F[3][9]*D[1][9] +
F[3][13]*D[1][13] +
F[3][14]*D[1][14] +
F[3][15]*D[1][15])*T + D[1][3];
471 P[1][4] = P[4][1] = (
F[4][6]*D[4][6] +
F[4][7]*D[4][7] +
F[4][8]*D[4][8] +
F[4][9]*D[4][9] +
F[4][13]*D[4][13] +
F[4][14]*D[4][14] +
F[4][15]*D[4][15])*Tsq + (D[4][4] +
F[4][6]*D[1][6] +
F[4][7]*D[1][7] +
F[4][8]*D[1][8] +
F[4][9]*D[1][9] +
F[4][13]*D[1][13] +
F[4][14]*D[1][14] +
F[4][15]*D[1][15])*T + D[1][4];
472 P[1][5] = P[5][1] = (
F[5][6]*D[4][6] +
F[5][7]*D[4][7] +
F[5][8]*D[4][8] +
F[5][9]*D[4][9] +
F[5][13]*D[4][13] +
F[5][14]*D[4][14] +
F[5][15]*D[4][15])*Tsq + (D[4][5] +
F[5][6]*D[1][6] +
F[5][7]*D[1][7] +
F[5][8]*D[1][8] +
F[5][9]*D[1][9] +
F[5][13]*D[1][13] +
F[5][14]*D[1][14] +
F[5][15]*D[1][15])*T + D[1][5];
473 P[1][6] = P[6][1] = (
F[6][7]*D[4][7] +
F[6][8]*D[4][8] +
F[6][9]*D[4][9] +
F[6][10]*D[4][10] +
F[6][11]*D[4][11] +
F[6][12]*D[4][12])*Tsq + (D[4][6] +
F[6][7]*D[1][7] +
F[6][8]*D[1][8] +
F[6][9]*D[1][9] +
F[6][10]*D[1][10] +
F[6][11]*D[1][11] +
F[6][12]*D[1][12])*T + D[1][6];
474 P[1][7] = P[7][1] = (
F[7][6]*D[4][6] +
F[7][8]*D[4][8] +
F[7][9]*D[4][9] +
F[7][10]*D[4][10] +
F[7][11]*D[4][11] +
F[7][12]*D[4][12])*Tsq + (D[4][7] +
F[7][6]*D[1][6] +
F[7][8]*D[1][8] +
F[7][9]*D[1][9] +
F[7][10]*D[1][10] +
F[7][11]*D[1][11] +
F[7][12]*D[1][12])*T + D[1][7];
475 P[1][8] = P[8][1] = (
F[8][6]*D[4][6] +
F[8][7]*D[4][7] +
F[8][9]*D[4][9] +
F[8][10]*D[4][10] +
F[8][11]*D[4][11] +
F[8][12]*D[4][12])*Tsq + (D[4][8] +
F[8][6]*D[1][6] +
F[8][7]*D[1][7] +
F[8][9]*D[1][9] +
F[8][10]*D[1][10] +
F[8][11]*D[1][11] +
F[8][12]*D[1][12])*T + D[1][8];
476 P[1][9] = P[9][1] = (
F[9][6]*D[4][6] +
F[9][7]*D[4][7] +
F[9][8]*D[4][8] +
F[9][10]*D[4][10] +
F[9][11]*D[4][11] +
F[9][12]*D[4][12])*Tsq + (D[4][9] +
F[9][6]*D[1][6] +
F[9][7]*D[1][7] +
F[9][8]*D[1][8] +
F[9][10]*D[1][10] +
F[9][11]*D[1][11] +
F[9][12]*D[1][12])*T + D[1][9];
477 P[1][10] = P[10][1] = D[4][10]*T + D[1][10];
478 P[1][11] = P[11][1] = D[4][11]*T + D[1][11];
479 P[1][12] = P[12][1] = D[4][12]*T + D[1][12];
480 P[1][13] = P[13][1] = D[4][13]*T + D[1][13];
481 P[1][14] = P[14][1] = D[4][14]*T + D[1][14];
482 P[1][15] = P[15][1] = D[4][15]*T + D[1][15];
483 P[2][2] = D[5][5]*Tsq + (2*D[2][5])*T + D[2][2];
484 P[2][3] = P[3][2] = (
F[3][6]*D[5][6] +
F[3][7]*D[5][7] +
F[3][8]*D[5][8] +
F[3][9]*D[5][9] +
F[3][13]*D[5][13] +
F[3][14]*D[5][14] +
F[3][15]*D[5][15])*Tsq + (D[3][5] +
F[3][6]*D[2][6] +
F[3][7]*D[2][7] +
F[3][8]*D[2][8] +
F[3][9]*D[2][9] +
F[3][13]*D[2][13] +
F[3][14]*D[2][14] +
F[3][15]*D[2][15])*T + D[2][3];
485 P[2][4] = P[4][2] = (
F[4][6]*D[5][6] +
F[4][7]*D[5][7] +
F[4][8]*D[5][8] +
F[4][9]*D[5][9] +
F[4][13]*D[5][13] +
F[4][14]*D[5][14] +
F[4][15]*D[5][15])*Tsq + (D[4][5] +
F[4][6]*D[2][6] +
F[4][7]*D[2][7] +
F[4][8]*D[2][8] +
F[4][9]*D[2][9] +
F[4][13]*D[2][13] +
F[4][14]*D[2][14] +
F[4][15]*D[2][15])*T + D[2][4];
486 P[2][5] = P[5][2] = (
F[5][6]*D[5][6] +
F[5][7]*D[5][7] +
F[5][8]*D[5][8] +
F[5][9]*D[5][9] +
F[5][13]*D[5][13] +
F[5][14]*D[5][14] +
F[5][15]*D[5][15])*Tsq + (D[5][5] +
F[5][6]*D[2][6] +
F[5][7]*D[2][7] +
F[5][8]*D[2][8] +
F[5][9]*D[2][9] +
F[5][13]*D[2][13] +
F[5][14]*D[2][14] +
F[5][15]*D[2][15])*T + D[2][5];
487 P[2][6] = P[6][2] = (
F[6][7]*D[5][7] +
F[6][8]*D[5][8] +
F[6][9]*D[5][9] +
F[6][10]*D[5][10] +
F[6][11]*D[5][11] +
F[6][12]*D[5][12])*Tsq + (D[5][6] +
F[6][7]*D[2][7] +
F[6][8]*D[2][8] +
F[6][9]*D[2][9] +
F[6][10]*D[2][10] +
F[6][11]*D[2][11] +
F[6][12]*D[2][12])*T + D[2][6];
488 P[2][7] = P[7][2] = (
F[7][6]*D[5][6] +
F[7][8]*D[5][8] +
F[7][9]*D[5][9] +
F[7][10]*D[5][10] +
F[7][11]*D[5][11] +
F[7][12]*D[5][12])*Tsq + (D[5][7] +
F[7][6]*D[2][6] +
F[7][8]*D[2][8] +
F[7][9]*D[2][9] +
F[7][10]*D[2][10] +
F[7][11]*D[2][11] +
F[7][12]*D[2][12])*T + D[2][7];
489 P[2][8] = P[8][2] = (
F[8][6]*D[5][6] +
F[8][7]*D[5][7] +
F[8][9]*D[5][9] +
F[8][10]*D[5][10] +
F[8][11]*D[5][11] +
F[8][12]*D[5][12])*Tsq + (D[5][8] +
F[8][6]*D[2][6] +
F[8][7]*D[2][7] +
F[8][9]*D[2][9] +
F[8][10]*D[2][10] +
F[8][11]*D[2][11] +
F[8][12]*D[2][12])*T + D[2][8];
490 P[2][9] = P[9][2] = (
F[9][6]*D[5][6] +
F[9][7]*D[5][7] +
F[9][8]*D[5][8] +
F[9][10]*D[5][10] +
F[9][11]*D[5][11] +
F[9][12]*D[5][12])*Tsq + (D[5][9] +
F[9][6]*D[2][6] +
F[9][7]*D[2][7] +
F[9][8]*D[2][8] +
F[9][10]*D[2][10] +
F[9][11]*D[2][11] +
F[9][12]*D[2][12])*T + D[2][9];
491 P[2][10] = P[10][2] = D[5][10]*T + D[2][10];
492 P[2][11] = P[11][2] = D[5][11]*T + D[2][11];
493 P[2][12] = P[12][2] = D[5][12]*T + D[2][12];
494 P[2][13] = P[13][2] = D[5][13]*T + D[2][13];
495 P[2][14] = P[14][2] = D[5][14]*T + D[2][14];
496 P[2][15] = P[15][2] = D[5][15]*T + D[2][15];
497 P[3][3] = (
Q[3]*
G[3][3]*
G[3][3] +
Q[4]*
G[3][4]*
G[3][4] +
Q[5]*
G[3][5]*
G[3][5] +
F[3][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[3][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[3][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[3][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[3][13]*(
F[3][6]*D[6][13] +
F[3][7]*D[7][13] +
F[3][8]*D[8][13] +
F[3][9]*D[9][13] +
F[3][13]*D[13][13] +
F[3][14]*D[13][14] +
F[3][15]*D[13][15]) +
F[3][14]*(
F[3][6]*D[6][14] +
F[3][7]*D[7][14] +
F[3][8]*D[8][14] +
F[3][9]*D[9][14] +
F[3][13]*D[13][14] +
F[3][14]*D[14][14] +
F[3][15]*D[14][15]) +
F[3][15]*(
F[3][6]*D[6][15] +
F[3][7]*D[7][15] +
F[3][8]*D[8][15] +
F[3][9]*D[9][15] +
F[3][13]*D[13][15] +
F[3][14]*D[14][15] +
F[3][15]*D[15][15]))*Tsq + (2*
F[3][6]*D[3][6] + 2*
F[3][7]*D[3][7] + 2*
F[3][8]*D[3][8] + 2*
F[3][9]*D[3][9] + 2*
F[3][13]*D[3][13] + 2*
F[3][14]*D[3][14] + 2*
F[3][15]*D[3][15])*T + D[3][3];
498 P[3][4] = P[4][3] = (
F[4][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[4][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[4][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[4][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[4][13]*(
F[3][6]*D[6][13] +
F[3][7]*D[7][13] +
F[3][8]*D[8][13] +
F[3][9]*D[9][13] +
F[3][13]*D[13][13] +
F[3][14]*D[13][14] +
F[3][15]*D[13][15]) +
F[4][14]*(
F[3][6]*D[6][14] +
F[3][7]*D[7][14] +
F[3][8]*D[8][14] +
F[3][9]*D[9][14] +
F[3][13]*D[13][14] +
F[3][14]*D[14][14] +
F[3][15]*D[14][15]) +
F[4][15]*(
F[3][6]*D[6][15] +
F[3][7]*D[7][15] +
F[3][8]*D[8][15] +
F[3][9]*D[9][15] +
F[3][13]*D[13][15] +
F[3][14]*D[14][15] +
F[3][15]*D[15][15]) +
G[3][3]*
G[4][3]*
Q[3] +
G[3][4]*
G[4][4]*
Q[4] +
G[3][5]*
G[4][5]*
Q[5])*Tsq + (
F[3][6]*D[4][6] +
F[4][6]*D[3][6] +
F[3][7]*D[4][7] +
F[4][7]*D[3][7] +
F[3][8]*D[4][8] +
F[4][8]*D[3][8] +
F[3][9]*D[4][9] +
F[4][9]*D[3][9] +
F[3][13]*D[4][13] +
F[4][13]*D[3][13] +
F[3][14]*D[4][14] +
F[4][14]*D[3][14] +
F[3][15]*D[4][15] +
F[4][15]*D[3][15])*T + D[3][4];
499 P[3][5] = P[5][3] = (
F[5][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[5][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[5][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[5][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[5][13]*(
F[3][6]*D[6][13] +
F[3][7]*D[7][13] +
F[3][8]*D[8][13] +
F[3][9]*D[9][13] +
F[3][13]*D[13][13] +
F[3][14]*D[13][14] +
F[3][15]*D[13][15]) +
F[5][14]*(
F[3][6]*D[6][14] +
F[3][7]*D[7][14] +
F[3][8]*D[8][14] +
F[3][9]*D[9][14] +
F[3][13]*D[13][14] +
F[3][14]*D[14][14] +
F[3][15]*D[14][15]) +
F[5][15]*(
F[3][6]*D[6][15] +
F[3][7]*D[7][15] +
F[3][8]*D[8][15] +
F[3][9]*D[9][15] +
F[3][13]*D[13][15] +
F[3][14]*D[14][15] +
F[3][15]*D[15][15]) +
G[3][3]*
G[5][3]*Q[3] +
G[3][4]*
G[5][4]*Q[4] +
G[3][5]*
G[5][5]*Q[5])*Tsq + (
F[3][6]*D[5][6] +
F[5][6]*D[3][6] +
F[3][7]*D[5][7] +
F[5][7]*D[3][7] +
F[3][8]*D[5][8] +
F[5][8]*D[3][8] +
F[3][9]*D[5][9] +
F[5][9]*D[3][9] +
F[3][13]*D[5][13] +
F[5][13]*D[3][13] +
F[3][14]*D[5][14] +
F[5][14]*D[3][14] +
F[3][15]*D[5][15] +
F[5][15]*D[3][15])*T + D[3][5];
500 P[3][6] = P[6][3] = (
F[6][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[6][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[6][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[6][10]*(
F[3][6]*D[6][10] +
F[3][7]*D[7][10] +
F[3][8]*D[8][10] +
F[3][9]*D[9][10] +
F[3][13]*D[10][13] +
F[3][14]*D[10][14] +
F[3][15]*D[10][15]) +
F[6][11]*(
F[3][6]*D[6][11] +
F[3][7]*D[7][11] +
F[3][8]*D[8][11] +
F[3][9]*D[9][11] +
F[3][13]*D[11][13] +
F[3][14]*D[11][14] +
F[3][15]*D[11][15]) +
F[6][12]*(
F[3][6]*D[6][12] +
F[3][7]*D[7][12] +
F[3][8]*D[8][12] +
F[3][9]*D[9][12] +
F[3][13]*D[12][13] +
F[3][14]*D[12][14] +
F[3][15]*D[12][15]))*Tsq + (
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[6][7]*D[3][7] +
F[3][8]*D[6][8] +
F[6][8]*D[3][8] +
F[3][9]*D[6][9] +
F[6][9]*D[3][9] +
F[6][10]*D[3][10] +
F[6][11]*D[3][11] +
F[6][12]*D[3][12] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15])*T + D[3][6];
501 P[3][7] = P[7][3] = (
F[7][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[7][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[7][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[7][10]*(
F[3][6]*D[6][10] +
F[3][7]*D[7][10] +
F[3][8]*D[8][10] +
F[3][9]*D[9][10] +
F[3][13]*D[10][13] +
F[3][14]*D[10][14] +
F[3][15]*D[10][15]) +
F[7][11]*(
F[3][6]*D[6][11] +
F[3][7]*D[7][11] +
F[3][8]*D[8][11] +
F[3][9]*D[9][11] +
F[3][13]*D[11][13] +
F[3][14]*D[11][14] +
F[3][15]*D[11][15]) +
F[7][12]*(
F[3][6]*D[6][12] +
F[3][7]*D[7][12] +
F[3][8]*D[8][12] +
F[3][9]*D[9][12] +
F[3][13]*D[12][13] +
F[3][14]*D[12][14] +
F[3][15]*D[12][15]))*Tsq + (
F[3][6]*D[6][7] +
F[7][6]*D[3][6] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[7][8]*D[3][8] +
F[3][9]*D[7][9] +
F[7][9]*D[3][9] +
F[7][10]*D[3][10] +
F[7][11]*D[3][11] +
F[7][12]*D[3][12] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15])*T + D[3][7];
502 P[3][8] = P[8][3] = (
F[8][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[8][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[8][9]*(
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15]) +
F[8][10]*(
F[3][6]*D[6][10] +
F[3][7]*D[7][10] +
F[3][8]*D[8][10] +
F[3][9]*D[9][10] +
F[3][13]*D[10][13] +
F[3][14]*D[10][14] +
F[3][15]*D[10][15]) +
F[8][11]*(
F[3][6]*D[6][11] +
F[3][7]*D[7][11] +
F[3][8]*D[8][11] +
F[3][9]*D[9][11] +
F[3][13]*D[11][13] +
F[3][14]*D[11][14] +
F[3][15]*D[11][15]) +
F[8][12]*(
F[3][6]*D[6][12] +
F[3][7]*D[7][12] +
F[3][8]*D[8][12] +
F[3][9]*D[9][12] +
F[3][13]*D[12][13] +
F[3][14]*D[12][14] +
F[3][15]*D[12][15]))*Tsq + (
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[8][6]*D[3][6] +
F[8][7]*D[3][7] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[8][9]*D[3][9] +
F[8][10]*D[3][10] +
F[8][11]*D[3][11] +
F[8][12]*D[3][12] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15])*T + D[3][8];
503 P[3][9] = P[9][3] = (
F[9][6]*(
F[3][6]*D[6][6] +
F[3][7]*D[6][7] +
F[3][8]*D[6][8] +
F[3][9]*D[6][9] +
F[3][13]*D[6][13] +
F[3][14]*D[6][14] +
F[3][15]*D[6][15]) +
F[9][7]*(
F[3][6]*D[6][7] +
F[3][7]*D[7][7] +
F[3][8]*D[7][8] +
F[3][9]*D[7][9] +
F[3][13]*D[7][13] +
F[3][14]*D[7][14] +
F[3][15]*D[7][15]) +
F[9][8]*(
F[3][6]*D[6][8] +
F[3][7]*D[7][8] +
F[3][8]*D[8][8] +
F[3][9]*D[8][9] +
F[3][13]*D[8][13] +
F[3][14]*D[8][14] +
F[3][15]*D[8][15]) +
F[9][10]*(
F[3][6]*D[6][10] +
F[3][7]*D[7][10] +
F[3][8]*D[8][10] +
F[3][9]*D[9][10] +
F[3][13]*D[10][13] +
F[3][14]*D[10][14] +
F[3][15]*D[10][15]) +
F[9][11]*(
F[3][6]*D[6][11] +
F[3][7]*D[7][11] +
F[3][8]*D[8][11] +
F[3][9]*D[9][11] +
F[3][13]*D[11][13] +
F[3][14]*D[11][14] +
F[3][15]*D[11][15]) +
F[9][12]*(
F[3][6]*D[6][12] +
F[3][7]*D[7][12] +
F[3][8]*D[8][12] +
F[3][9]*D[9][12] +
F[3][13]*D[12][13] +
F[3][14]*D[12][14] +
F[3][15]*D[12][15]))*Tsq + (
F[9][6]*D[3][6] +
F[9][7]*D[3][7] +
F[9][8]*D[3][8] +
F[3][6]*D[6][9] +
F[3][7]*D[7][9] +
F[3][8]*D[8][9] +
F[3][9]*D[9][9] +
F[9][10]*D[3][10] +
F[9][11]*D[3][11] +
F[9][12]*D[3][12] +
F[3][13]*D[9][13] +
F[3][14]*D[9][14] +
F[3][15]*D[9][15])*T + D[3][9];
504 P[3][10] = P[10][3] = (
F[3][6]*D[6][10] +
F[3][7]*D[7][10] +
F[3][8]*D[8][10] +
F[3][9]*D[9][10] +
F[3][13]*D[10][13] +
F[3][14]*D[10][14] +
F[3][15]*D[10][15])*T + D[3][10];
505 P[3][11] = P[11][3] = (
F[3][6]*D[6][11] +
F[3][7]*D[7][11] +
F[3][8]*D[8][11] +
F[3][9]*D[9][11] +
F[3][13]*D[11][13] +
F[3][14]*D[11][14] +
F[3][15]*D[11][15])*T + D[3][11];
506 P[3][12] = P[12][3] = (
F[3][6]*D[6][12] +
F[3][7]*D[7][12] +
F[3][8]*D[8][12] +
F[3][9]*D[9][12] +
F[3][13]*D[12][13] +
F[3][14]*D[12][14] +
F[3][15]*D[12][15])*T + D[3][12];
507 P[3][13] = P[13][3] = (
F[3][6]*D[6][13] +
F[3][7]*D[7][13] +
F[3][8]*D[8][13] +
F[3][9]*D[9][13] +
F[3][13]*D[13][13] +
F[3][14]*D[13][14] +
F[3][15]*D[13][15])*T + D[3][13];
508 P[3][14] = P[14][3] = (
F[3][6]*D[6][14] +
F[3][7]*D[7][14] +
F[3][8]*D[8][14] +
F[3][9]*D[9][14] +
F[3][13]*D[13][14] +
F[3][14]*D[14][14] +
F[3][15]*D[14][15])*T + D[3][14];
509 P[3][15] = P[15][3] = (
F[3][6]*D[6][15] +
F[3][7]*D[7][15] +
F[3][8]*D[8][15] +
F[3][9]*D[9][15] +
F[3][13]*D[13][15] +
F[3][14]*D[14][15] +
F[3][15]*D[15][15])*T + D[3][15];
510 P[4][4] = (Q[3]*
G[4][3]*
G[4][3] + Q[4]*
G[4][4]*
G[4][4] + Q[5]*
G[4][5]*
G[4][5] +
F[4][6]*(
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[4][8]*D[6][8] +
F[4][9]*D[6][9] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15]) +
F[4][7]*(
F[4][6]*D[6][7] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[4][9]*D[7][9] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15]) +
F[4][8]*(
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15]) +
F[4][9]*(
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15]) +
F[4][13]*(
F[4][6]*D[6][13] +
F[4][7]*D[7][13] +
F[4][8]*D[8][13] +
F[4][9]*D[9][13] +
F[4][13]*D[13][13] +
F[4][14]*D[13][14] +
F[4][15]*D[13][15]) +
F[4][14]*(
F[4][6]*D[6][14] +
F[4][7]*D[7][14] +
F[4][8]*D[8][14] +
F[4][9]*D[9][14] +
F[4][13]*D[13][14] +
F[4][14]*D[14][14] +
F[4][15]*D[14][15]) +
F[4][15]*(
F[4][6]*D[6][15] +
F[4][7]*D[7][15] +
F[4][8]*D[8][15] +
F[4][9]*D[9][15] +
F[4][13]*D[13][15] +
F[4][14]*D[14][15] +
F[4][15]*D[15][15]))*Tsq + (2*
F[4][6]*D[4][6] + 2*
F[4][7]*D[4][7] + 2*
F[4][8]*D[4][8] + 2*
F[4][9]*D[4][9] + 2*
F[4][13]*D[4][13] + 2*
F[4][14]*D[4][14] + 2*
F[4][15]*D[4][15])*T + D[4][4];
511 P[4][5] = P[5][4] = (
F[5][6]*(
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[4][8]*D[6][8] +
F[4][9]*D[6][9] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15]) +
F[5][7]*(
F[4][6]*D[6][7] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[4][9]*D[7][9] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15]) +
F[5][8]*(
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15]) +
F[5][9]*(
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15]) +
F[5][13]*(
F[4][6]*D[6][13] +
F[4][7]*D[7][13] +
F[4][8]*D[8][13] +
F[4][9]*D[9][13] +
F[4][13]*D[13][13] +
F[4][14]*D[13][14] +
F[4][15]*D[13][15]) +
F[5][14]*(
F[4][6]*D[6][14] +
F[4][7]*D[7][14] +
F[4][8]*D[8][14] +
F[4][9]*D[9][14] +
F[4][13]*D[13][14] +
F[4][14]*D[14][14] +
F[4][15]*D[14][15]) +
F[5][15]*(
F[4][6]*D[6][15] +
F[4][7]*D[7][15] +
F[4][8]*D[8][15] +
F[4][9]*D[9][15] +
F[4][13]*D[13][15] +
F[4][14]*D[14][15] +
F[4][15]*D[15][15]) +
G[4][3]*
G[5][3]*Q[3] +
G[4][4]*
G[5][4]*Q[4] +
G[4][5]*
G[5][5]*Q[5])*Tsq + (
F[4][6]*D[5][6] +
F[5][6]*D[4][6] +
F[4][7]*D[5][7] +
F[5][7]*D[4][7] +
F[4][8]*D[5][8] +
F[5][8]*D[4][8] +
F[4][9]*D[5][9] +
F[5][9]*D[4][9] +
F[4][13]*D[5][13] +
F[5][13]*D[4][13] +
F[4][14]*D[5][14] +
F[5][14]*D[4][14] +
F[4][15]*D[5][15] +
F[5][15]*D[4][15])*T + D[4][5];
512 P[4][6] = P[6][4] = (
F[6][7]*(
F[4][6]*D[6][7] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[4][9]*D[7][9] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15]) +
F[6][8]*(
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15]) +
F[6][9]*(
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15]) +
F[6][10]*(
F[4][6]*D[6][10] +
F[4][7]*D[7][10] +
F[4][8]*D[8][10] +
F[4][9]*D[9][10] +
F[4][13]*D[10][13] +
F[4][14]*D[10][14] +
F[4][15]*D[10][15]) +
F[6][11]*(
F[4][6]*D[6][11] +
F[4][7]*D[7][11] +
F[4][8]*D[8][11] +
F[4][9]*D[9][11] +
F[4][13]*D[11][13] +
F[4][14]*D[11][14] +
F[4][15]*D[11][15]) +
F[6][12]*(
F[4][6]*D[6][12] +
F[4][7]*D[7][12] +
F[4][8]*D[8][12] +
F[4][9]*D[9][12] +
F[4][13]*D[12][13] +
F[4][14]*D[12][14] +
F[4][15]*D[12][15]))*Tsq + (
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[6][7]*D[4][7] +
F[4][8]*D[6][8] +
F[6][8]*D[4][8] +
F[4][9]*D[6][9] +
F[6][9]*D[4][9] +
F[6][10]*D[4][10] +
F[6][11]*D[4][11] +
F[6][12]*D[4][12] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15])*T + D[4][6];
513 P[4][7] = P[7][4] = (
F[7][6]*(
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[4][8]*D[6][8] +
F[4][9]*D[6][9] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15]) +
F[7][8]*(
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15]) +
F[7][9]*(
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15]) +
F[7][10]*(
F[4][6]*D[6][10] +
F[4][7]*D[7][10] +
F[4][8]*D[8][10] +
F[4][9]*D[9][10] +
F[4][13]*D[10][13] +
F[4][14]*D[10][14] +
F[4][15]*D[10][15]) +
F[7][11]*(
F[4][6]*D[6][11] +
F[4][7]*D[7][11] +
F[4][8]*D[8][11] +
F[4][9]*D[9][11] +
F[4][13]*D[11][13] +
F[4][14]*D[11][14] +
F[4][15]*D[11][15]) +
F[7][12]*(
F[4][6]*D[6][12] +
F[4][7]*D[7][12] +
F[4][8]*D[8][12] +
F[4][9]*D[9][12] +
F[4][13]*D[12][13] +
F[4][14]*D[12][14] +
F[4][15]*D[12][15]))*Tsq + (
F[4][6]*D[6][7] +
F[7][6]*D[4][6] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[7][8]*D[4][8] +
F[4][9]*D[7][9] +
F[7][9]*D[4][9] +
F[7][10]*D[4][10] +
F[7][11]*D[4][11] +
F[7][12]*D[4][12] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15])*T + D[4][7];
514 P[4][8] = P[8][4] = (
F[8][6]*(
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[4][8]*D[6][8] +
F[4][9]*D[6][9] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15]) +
F[8][7]*(
F[4][6]*D[6][7] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[4][9]*D[7][9] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15]) +
F[8][9]*(
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15]) +
F[8][10]*(
F[4][6]*D[6][10] +
F[4][7]*D[7][10] +
F[4][8]*D[8][10] +
F[4][9]*D[9][10] +
F[4][13]*D[10][13] +
F[4][14]*D[10][14] +
F[4][15]*D[10][15]) +
F[8][11]*(
F[4][6]*D[6][11] +
F[4][7]*D[7][11] +
F[4][8]*D[8][11] +
F[4][9]*D[9][11] +
F[4][13]*D[11][13] +
F[4][14]*D[11][14] +
F[4][15]*D[11][15]) +
F[8][12]*(
F[4][6]*D[6][12] +
F[4][7]*D[7][12] +
F[4][8]*D[8][12] +
F[4][9]*D[9][12] +
F[4][13]*D[12][13] +
F[4][14]*D[12][14] +
F[4][15]*D[12][15]))*Tsq + (
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[8][6]*D[4][6] +
F[8][7]*D[4][7] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[8][9]*D[4][9] +
F[8][10]*D[4][10] +
F[8][11]*D[4][11] +
F[8][12]*D[4][12] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15])*T + D[4][8];
515 P[4][9] = P[9][4] = (
F[9][6]*(
F[4][6]*D[6][6] +
F[4][7]*D[6][7] +
F[4][8]*D[6][8] +
F[4][9]*D[6][9] +
F[4][13]*D[6][13] +
F[4][14]*D[6][14] +
F[4][15]*D[6][15]) +
F[9][7]*(
F[4][6]*D[6][7] +
F[4][7]*D[7][7] +
F[4][8]*D[7][8] +
F[4][9]*D[7][9] +
F[4][13]*D[7][13] +
F[4][14]*D[7][14] +
F[4][15]*D[7][15]) +
F[9][8]*(
F[4][6]*D[6][8] +
F[4][7]*D[7][8] +
F[4][8]*D[8][8] +
F[4][9]*D[8][9] +
F[4][13]*D[8][13] +
F[4][14]*D[8][14] +
F[4][15]*D[8][15]) +
F[9][10]*(
F[4][6]*D[6][10] +
F[4][7]*D[7][10] +
F[4][8]*D[8][10] +
F[4][9]*D[9][10] +
F[4][13]*D[10][13] +
F[4][14]*D[10][14] +
F[4][15]*D[10][15]) +
F[9][11]*(
F[4][6]*D[6][11] +
F[4][7]*D[7][11] +
F[4][8]*D[8][11] +
F[4][9]*D[9][11] +
F[4][13]*D[11][13] +
F[4][14]*D[11][14] +
F[4][15]*D[11][15]) +
F[9][12]*(
F[4][6]*D[6][12] +
F[4][7]*D[7][12] +
F[4][8]*D[8][12] +
F[4][9]*D[9][12] +
F[4][13]*D[12][13] +
F[4][14]*D[12][14] +
F[4][15]*D[12][15]))*Tsq + (
F[9][6]*D[4][6] +
F[9][7]*D[4][7] +
F[9][8]*D[4][8] +
F[4][6]*D[6][9] +
F[4][7]*D[7][9] +
F[4][8]*D[8][9] +
F[4][9]*D[9][9] +
F[9][10]*D[4][10] +
F[9][11]*D[4][11] +
F[9][12]*D[4][12] +
F[4][13]*D[9][13] +
F[4][14]*D[9][14] +
F[4][15]*D[9][15])*T + D[4][9];
516 P[4][10] = P[10][4] = (
F[4][6]*D[6][10] +
F[4][7]*D[7][10] +
F[4][8]*D[8][10] +
F[4][9]*D[9][10] +
F[4][13]*D[10][13] +
F[4][14]*D[10][14] +
F[4][15]*D[10][15])*T + D[4][10];
517 P[4][11] = P[11][4] = (
F[4][6]*D[6][11] +
F[4][7]*D[7][11] +
F[4][8]*D[8][11] +
F[4][9]*D[9][11] +
F[4][13]*D[11][13] +
F[4][14]*D[11][14] +
F[4][15]*D[11][15])*T + D[4][11];
518 P[4][12] = P[12][4] = (
F[4][6]*D[6][12] +
F[4][7]*D[7][12] +
F[4][8]*D[8][12] +
F[4][9]*D[9][12] +
F[4][13]*D[12][13] +
F[4][14]*D[12][14] +
F[4][15]*D[12][15])*T + D[4][12];
519 P[4][13] = P[13][4] = (
F[4][6]*D[6][13] +
F[4][7]*D[7][13] +
F[4][8]*D[8][13] +
F[4][9]*D[9][13] +
F[4][13]*D[13][13] +
F[4][14]*D[13][14] +
F[4][15]*D[13][15])*T + D[4][13];
520 P[4][14] = P[14][4] = (
F[4][6]*D[6][14] +
F[4][7]*D[7][14] +
F[4][8]*D[8][14] +
F[4][9]*D[9][14] +
F[4][13]*D[13][14] +
F[4][14]*D[14][14] +
F[4][15]*D[14][15])*T + D[4][14];
521 P[4][15] = P[15][4] = (
F[4][6]*D[6][15] +
F[4][7]*D[7][15] +
F[4][8]*D[8][15] +
F[4][9]*D[9][15] +
F[4][13]*D[13][15] +
F[4][14]*D[14][15] +
F[4][15]*D[15][15])*T + D[4][15];
522 P[5][5] = (Q[3]*
G[5][3]*
G[5][3] + Q[4]*
G[5][4]*
G[5][4] + Q[5]*
G[5][5]*
G[5][5] +
F[5][6]*(
F[5][6]*D[6][6] +
F[5][7]*D[6][7] +
F[5][8]*D[6][8] +
F[5][9]*D[6][9] +
F[5][13]*D[6][13] +
F[5][14]*D[6][14] +
F[5][15]*D[6][15]) +
F[5][7]*(
F[5][6]*D[6][7] +
F[5][7]*D[7][7] +
F[5][8]*D[7][8] +
F[5][9]*D[7][9] +
F[5][13]*D[7][13] +
F[5][14]*D[7][14] +
F[5][15]*D[7][15]) +
F[5][8]*(
F[5][6]*D[6][8] +
F[5][7]*D[7][8] +
F[5][8]*D[8][8] +
F[5][9]*D[8][9] +
F[5][13]*D[8][13] +
F[5][14]*D[8][14] +
F[5][15]*D[8][15]) +
F[5][9]*(
F[5][6]*D[6][9] +
F[5][7]*D[7][9] +
F[5][8]*D[8][9] +
F[5][9]*D[9][9] +
F[5][13]*D[9][13] +
F[5][14]*D[9][14] +
F[5][15]*D[9][15]) +
F[5][13]*(
F[5][6]*D[6][13] +
F[5][7]*D[7][13] +
F[5][8]*D[8][13] +
F[5][9]*D[9][13] +
F[5][13]*D[13][13] +
F[5][14]*D[13][14] +
F[5][15]*D[13][15]) +
F[5][14]*(
F[5][6]*D[6][14] +
F[5][7]*D[7][14] +
F[5][8]*D[8][14] +
F[5][9]*D[9][14] +
F[5][13]*D[13][14] +
F[5][14]*D[14][14] +
F[5][15]*D[14][15]) +
F[5][15]*(
F[5][6]*D[6][15] +
F[5][7]*D[7][15] +
F[5][8]*D[8][15] +
F[5][9]*D[9][15] +
F[5][13]*D[13][15] +
F[5][14]*D[14][15] +
F[5][15]*D[15][15]))*Tsq + (2*
F[5][6]*D[5][6] + 2*
F[5][7]*D[5][7] + 2*
F[5][8]*D[5][8] + 2*
F[5][9]*D[5][9] + 2*
F[5][13]*D[5][13] + 2*
F[5][14]*D[5][14] + 2*
F[5][15]*D[5][15])*T + D[5][5];
523 P[5][6] = P[6][5] = (
F[6][7]*(
F[5][6]*D[6][7] +
F[5][7]*D[7][7] +
F[5][8]*D[7][8] +
F[5][9]*D[7][9] +
F[5][13]*D[7][13] +
F[5][14]*D[7][14] +
F[5][15]*D[7][15]) +
F[6][8]*(
F[5][6]*D[6][8] +
F[5][7]*D[7][8] +
F[5][8]*D[8][8] +
F[5][9]*D[8][9] +
F[5][13]*D[8][13] +
F[5][14]*D[8][14] +
F[5][15]*D[8][15]) +
F[6][9]*(
F[5][6]*D[6][9] +
F[5][7]*D[7][9] +
F[5][8]*D[8][9] +
F[5][9]*D[9][9] +
F[5][13]*D[9][13] +
F[5][14]*D[9][14] +
F[5][15]*D[9][15]) +
F[6][10]*(
F[5][6]*D[6][10] +
F[5][7]*D[7][10] +
F[5][8]*D[8][10] +
F[5][9]*D[9][10] +
F[5][13]*D[10][13] +
F[5][14]*D[10][14] +
F[5][15]*D[10][15]) +
F[6][11]*(
F[5][6]*D[6][11] +
F[5][7]*D[7][11] +
F[5][8]*D[8][11] +
F[5][9]*D[9][11] +
F[5][13]*D[11][13] +
F[5][14]*D[11][14] +
F[5][15]*D[11][15]) +
F[6][12]*(
F[5][6]*D[6][12] +
F[5][7]*D[7][12] +
F[5][8]*D[8][12] +
F[5][9]*D[9][12] +
F[5][13]*D[12][13] +
F[5][14]*D[12][14] +
F[5][15]*D[12][15]))*Tsq + (
F[5][6]*D[6][6] +
F[5][7]*D[6][7] +
F[6][7]*D[5][7] +
F[5][8]*D[6][8] +
F[6][8]*D[5][8] +
F[5][9]*D[6][9] +
F[6][9]*D[5][9] +
F[6][10]*D[5][10] +
F[6][11]*D[5][11] +
F[6][12]*D[5][12] +
F[5][13]*D[6][13] +
F[5][14]*D[6][14] +
F[5][15]*D[6][15])*T + D[5][6];
524 P[5][7] = P[7][5] = (
F[7][6]*(
F[5][6]*D[6][6] +
F[5][7]*D[6][7] +
F[5][8]*D[6][8] +
F[5][9]*D[6][9] +
F[5][13]*D[6][13] +
F[5][14]*D[6][14] +
F[5][15]*D[6][15]) +
F[7][8]*(
F[5][6]*D[6][8] +
F[5][7]*D[7][8] +
F[5][8]*D[8][8] +
F[5][9]*D[8][9] +
F[5][13]*D[8][13] +
F[5][14]*D[8][14] +
F[5][15]*D[8][15]) +
F[7][9]*(
F[5][6]*D[6][9] +
F[5][7]*D[7][9] +
F[5][8]*D[8][9] +
F[5][9]*D[9][9] +
F[5][13]*D[9][13] +
F[5][14]*D[9][14] +
F[5][15]*D[9][15]) +
F[7][10]*(
F[5][6]*D[6][10] +
F[5][7]*D[7][10] +
F[5][8]*D[8][10] +
F[5][9]*D[9][10] +
F[5][13]*D[10][13] +
F[5][14]*D[10][14] +
F[5][15]*D[10][15]) +
F[7][11]*(
F[5][6]*D[6][11] +
F[5][7]*D[7][11] +
F[5][8]*D[8][11] +
F[5][9]*D[9][11] +
F[5][13]*D[11][13] +
F[5][14]*D[11][14] +
F[5][15]*D[11][15]) +
F[7][12]*(
F[5][6]*D[6][12] +
F[5][7]*D[7][12] +
F[5][8]*D[8][12] +
F[5][9]*D[9][12] +
F[5][13]*D[12][13] +
F[5][14]*D[12][14] +
F[5][15]*D[12][15]))*Tsq + (
F[5][6]*D[6][7] +
F[7][6]*D[5][6] +
F[5][7]*D[7][7] +
F[5][8]*D[7][8] +
F[7][8]*D[5][8] +
F[5][9]*D[7][9] +
F[7][9]*D[5][9] +
F[7][10]*D[5][10] +
F[7][11]*D[5][11] +
F[7][12]*D[5][12] +
F[5][13]*D[7][13] +
F[5][14]*D[7][14] +
F[5][15]*D[7][15])*T + D[5][7];
525 P[5][8] = P[8][5] = (
F[8][6]*(
F[5][6]*D[6][6] +
F[5][7]*D[6][7] +
F[5][8]*D[6][8] +
F[5][9]*D[6][9] +
F[5][13]*D[6][13] +
F[5][14]*D[6][14] +
F[5][15]*D[6][15]) +
F[8][7]*(
F[5][6]*D[6][7] +
F[5][7]*D[7][7] +
F[5][8]*D[7][8] +
F[5][9]*D[7][9] +
F[5][13]*D[7][13] +
F[5][14]*D[7][14] +
F[5][15]*D[7][15]) +
F[8][9]*(
F[5][6]*D[6][9] +
F[5][7]*D[7][9] +
F[5][8]*D[8][9] +
F[5][9]*D[9][9] +
F[5][13]*D[9][13] +
F[5][14]*D[9][14] +
F[5][15]*D[9][15]) +
F[8][10]*(
F[5][6]*D[6][10] +
F[5][7]*D[7][10] +
F[5][8]*D[8][10] +
F[5][9]*D[9][10] +
F[5][13]*D[10][13] +
F[5][14]*D[10][14] +
F[5][15]*D[10][15]) +
F[8][11]*(
F[5][6]*D[6][11] +
F[5][7]*D[7][11] +
F[5][8]*D[8][11] +
F[5][9]*D[9][11] +
F[5][13]*D[11][13] +
F[5][14]*D[11][14] +
F[5][15]*D[11][15]) +
F[8][12]*(
F[5][6]*D[6][12] +
F[5][7]*D[7][12] +
F[5][8]*D[8][12] +
F[5][9]*D[9][12] +
F[5][13]*D[12][13] +
F[5][14]*D[12][14] +
F[5][15]*D[12][15]))*Tsq + (
F[5][6]*D[6][8] +
F[5][7]*D[7][8] +
F[8][6]*D[5][6] +
F[8][7]*D[5][7] +
F[5][8]*D[8][8] +
F[5][9]*D[8][9] +
F[8][9]*D[5][9] +
F[8][10]*D[5][10] +
F[8][11]*D[5][11] +
F[8][12]*D[5][12] +
F[5][13]*D[8][13] +
F[5][14]*D[8][14] +
F[5][15]*D[8][15])*T + D[5][8];
526 P[5][9] = P[9][5] = (
F[9][6]*(
F[5][6]*D[6][6] +
F[5][7]*D[6][7] +
F[5][8]*D[6][8] +
F[5][9]*D[6][9] +
F[5][13]*D[6][13] +
F[5][14]*D[6][14] +
F[5][15]*D[6][15]) +
F[9][7]*(
F[5][6]*D[6][7] +
F[5][7]*D[7][7] +
F[5][8]*D[7][8] +
F[5][9]*D[7][9] +
F[5][13]*D[7][13] +
F[5][14]*D[7][14] +
F[5][15]*D[7][15]) +
F[9][8]*(
F[5][6]*D[6][8] +
F[5][7]*D[7][8] +
F[5][8]*D[8][8] +
F[5][9]*D[8][9] +
F[5][13]*D[8][13] +
F[5][14]*D[8][14] +
F[5][15]*D[8][15]) +
F[9][10]*(
F[5][6]*D[6][10] +
F[5][7]*D[7][10] +
F[5][8]*D[8][10] +
F[5][9]*D[9][10] +
F[5][13]*D[10][13] +
F[5][14]*D[10][14] +
F[5][15]*D[10][15]) +
F[9][11]*(
F[5][6]*D[6][11] +
F[5][7]*D[7][11] +
F[5][8]*D[8][11] +
F[5][9]*D[9][11] +
F[5][13]*D[11][13] +
F[5][14]*D[11][14] +
F[5][15]*D[11][15]) +
F[9][12]*(
F[5][6]*D[6][12] +
F[5][7]*D[7][12] +
F[5][8]*D[8][12] +
F[5][9]*D[9][12] +
F[5][13]*D[12][13] +
F[5][14]*D[12][14] +
F[5][15]*D[12][15]))*Tsq + (
F[9][6]*D[5][6] +
F[9][7]*D[5][7] +
F[9][8]*D[5][8] +
F[5][6]*D[6][9] +
F[5][7]*D[7][9] +
F[5][8]*D[8][9] +
F[5][9]*D[9][9] +
F[9][10]*D[5][10] +
F[9][11]*D[5][11] +
F[9][12]*D[5][12] +
F[5][13]*D[9][13] +
F[5][14]*D[9][14] +
F[5][15]*D[9][15])*T + D[5][9];
527 P[5][10] = P[10][5] = (
F[5][6]*D[6][10] +
F[5][7]*D[7][10] +
F[5][8]*D[8][10] +
F[5][9]*D[9][10] +
F[5][13]*D[10][13] +
F[5][14]*D[10][14] +
F[5][15]*D[10][15])*T + D[5][10];
528 P[5][11] = P[11][5] = (
F[5][6]*D[6][11] +
F[5][7]*D[7][11] +
F[5][8]*D[8][11] +
F[5][9]*D[9][11] +
F[5][13]*D[11][13] +
F[5][14]*D[11][14] +
F[5][15]*D[11][15])*T + D[5][11];
529 P[5][12] = P[12][5] = (
F[5][6]*D[6][12] +
F[5][7]*D[7][12] +
F[5][8]*D[8][12] +
F[5][9]*D[9][12] +
F[5][13]*D[12][13] +
F[5][14]*D[12][14] +
F[5][15]*D[12][15])*T + D[5][12];
530 P[5][13] = P[13][5] = (
F[5][6]*D[6][13] +
F[5][7]*D[7][13] +
F[5][8]*D[8][13] +
F[5][9]*D[9][13] +
F[5][13]*D[13][13] +
F[5][14]*D[13][14] +
F[5][15]*D[13][15])*T + D[5][13];
531 P[5][14] = P[14][5] = (
F[5][6]*D[6][14] +
F[5][7]*D[7][14] +
F[5][8]*D[8][14] +
F[5][9]*D[9][14] +
F[5][13]*D[13][14] +
F[5][14]*D[14][14] +
F[5][15]*D[14][15])*T + D[5][14];
532 P[5][15] = P[15][5] = (
F[5][6]*D[6][15] +
F[5][7]*D[7][15] +
F[5][8]*D[8][15] +
F[5][9]*D[9][15] +
F[5][13]*D[13][15] +
F[5][14]*D[14][15] +
F[5][15]*D[15][15])*T + D[5][15];
533 P[6][6] = (Q[0]*
G[6][0]*
G[6][0] + Q[1]*
G[6][1]*
G[6][1] + Q[2]*
G[6][2]*
G[6][2] +
F[6][7]*(
F[6][7]*D[7][7] +
F[6][8]*D[7][8] +
F[6][9]*D[7][9] +
F[6][10]*D[7][10] +
F[6][11]*D[7][11] +
F[6][12]*D[7][12]) +
F[6][8]*(
F[6][7]*D[7][8] +
F[6][8]*D[8][8] +
F[6][9]*D[8][9] +
F[6][10]*D[8][10] +
F[6][11]*D[8][11] +
F[6][12]*D[8][12]) +
F[6][9]*(
F[6][7]*D[7][9] +
F[6][8]*D[8][9] +
F[6][9]*D[9][9] +
F[6][10]*D[9][10] +
F[6][11]*D[9][11] +
F[6][12]*D[9][12]) +
F[6][10]*(
F[6][7]*D[7][10] +
F[6][8]*D[8][10] +
F[6][9]*D[9][10] +
F[6][10]*D[10][10] +
F[6][11]*D[10][11] +
F[6][12]*D[10][12]) +
F[6][11]*(
F[6][7]*D[7][11] +
F[6][8]*D[8][11] +
F[6][9]*D[9][11] +
F[6][10]*D[10][11] +
F[6][11]*D[11][11] +
F[6][12]*D[11][12]) +
F[6][12]*(
F[6][7]*D[7][12] +
F[6][8]*D[8][12] +
F[6][9]*D[9][12] +
F[6][10]*D[10][12] +
F[6][11]*D[11][12] +
F[6][12]*D[12][12]))*Tsq + (2*
F[6][7]*D[6][7] + 2*
F[6][8]*D[6][8] + 2*
F[6][9]*D[6][9] + 2*
F[6][10]*D[6][10] + 2*
F[6][11]*D[6][11] + 2*
F[6][12]*D[6][12])*T + D[6][6];
534 P[6][7] = P[7][6] = (
F[7][6]*(
F[6][7]*D[6][7] +
F[6][8]*D[6][8] +
F[6][9]*D[6][9] +
F[6][10]*D[6][10] +
F[6][11]*D[6][11] +
F[6][12]*D[6][12]) +
F[7][8]*(
F[6][7]*D[7][8] +
F[6][8]*D[8][8] +
F[6][9]*D[8][9] +
F[6][10]*D[8][10] +
F[6][11]*D[8][11] +
F[6][12]*D[8][12]) +
F[7][9]*(
F[6][7]*D[7][9] +
F[6][8]*D[8][9] +
F[6][9]*D[9][9] +
F[6][10]*D[9][10] +
F[6][11]*D[9][11] +
F[6][12]*D[9][12]) +
F[7][10]*(
F[6][7]*D[7][10] +
F[6][8]*D[8][10] +
F[6][9]*D[9][10] +
F[6][10]*D[10][10] +
F[6][11]*D[10][11] +
F[6][12]*D[10][12]) +
F[7][11]*(
F[6][7]*D[7][11] +
F[6][8]*D[8][11] +
F[6][9]*D[9][11] +
F[6][10]*D[10][11] +
F[6][11]*D[11][11] +
F[6][12]*D[11][12]) +
F[7][12]*(
F[6][7]*D[7][12] +
F[6][8]*D[8][12] +
F[6][9]*D[9][12] +
F[6][10]*D[10][12] +
F[6][11]*D[11][12] +
F[6][12]*D[12][12]) +
G[6][0]*
G[7][0]*Q[0] +
G[6][1]*
G[7][1]*Q[1] +
G[6][2]*
G[7][2]*Q[2])*Tsq + (
F[7][6]*D[6][6] +
F[6][7]*D[7][7] +
F[6][8]*D[7][8] +
F[7][8]*D[6][8] +
F[6][9]*D[7][9] +
F[7][9]*D[6][9] +
F[6][10]*D[7][10] +
F[7][10]*D[6][10] +
F[6][11]*D[7][11] +
F[7][11]*D[6][11] +
F[6][12]*D[7][12] +
F[7][12]*D[6][12])*T + D[6][7];
535 P[6][8] = P[8][6] = (
F[8][6]*(
F[6][7]*D[6][7] +
F[6][8]*D[6][8] +
F[6][9]*D[6][9] +
F[6][10]*D[6][10] +
F[6][11]*D[6][11] +
F[6][12]*D[6][12]) +
F[8][7]*(
F[6][7]*D[7][7] +
F[6][8]*D[7][8] +
F[6][9]*D[7][9] +
F[6][10]*D[7][10] +
F[6][11]*D[7][11] +
F[6][12]*D[7][12]) +
F[8][9]*(
F[6][7]*D[7][9] +
F[6][8]*D[8][9] +
F[6][9]*D[9][9] +
F[6][10]*D[9][10] +
F[6][11]*D[9][11] +
F[6][12]*D[9][12]) +
F[8][10]*(
F[6][7]*D[7][10] +
F[6][8]*D[8][10] +
F[6][9]*D[9][10] +
F[6][10]*D[10][10] +
F[6][11]*D[10][11] +
F[6][12]*D[10][12]) +
F[8][11]*(
F[6][7]*D[7][11] +
F[6][8]*D[8][11] +
F[6][9]*D[9][11] +
F[6][10]*D[10][11] +
F[6][11]*D[11][11] +
F[6][12]*D[11][12]) +
F[8][12]*(
F[6][7]*D[7][12] +
F[6][8]*D[8][12] +
F[6][9]*D[9][12] +
F[6][10]*D[10][12] +
F[6][11]*D[11][12] +
F[6][12]*D[12][12]) +
G[6][0]*
G[8][0]*Q[0] +
G[6][1]*
G[8][1]*Q[1] +
G[6][2]*
G[8][2]*Q[2])*Tsq + (
F[6][7]*D[7][8] +
F[8][6]*D[6][6] +
F[8][7]*D[6][7] +
F[6][8]*D[8][8] +
F[6][9]*D[8][9] +
F[8][9]*D[6][9] +
F[6][10]*D[8][10] +
F[8][10]*D[6][10] +
F[6][11]*D[8][11] +
F[8][11]*D[6][11] +
F[6][12]*D[8][12] +
F[8][12]*D[6][12])*T + D[6][8];
536 P[6][9] = P[9][6] = (
F[9][6]*(
F[6][7]*D[6][7] +
F[6][8]*D[6][8] +
F[6][9]*D[6][9] +
F[6][10]*D[6][10] +
F[6][11]*D[6][11] +
F[6][12]*D[6][12]) +
F[9][7]*(
F[6][7]*D[7][7] +
F[6][8]*D[7][8] +
F[6][9]*D[7][9] +
F[6][10]*D[7][10] +
F[6][11]*D[7][11] +
F[6][12]*D[7][12]) +
F[9][8]*(
F[6][7]*D[7][8] +
F[6][8]*D[8][8] +
F[6][9]*D[8][9] +
F[6][10]*D[8][10] +
F[6][11]*D[8][11] +
F[6][12]*D[8][12]) +
F[9][10]*(
F[6][7]*D[7][10] +
F[6][8]*D[8][10] +
F[6][9]*D[9][10] +
F[6][10]*D[10][10] +
F[6][11]*D[10][11] +
F[6][12]*D[10][12]) +
F[9][11]*(
F[6][7]*D[7][11] +
F[6][8]*D[8][11] +
F[6][9]*D[9][11] +
F[6][10]*D[10][11] +
F[6][11]*D[11][11] +
F[6][12]*D[11][12]) +
F[9][12]*(
F[6][7]*D[7][12] +
F[6][8]*D[8][12] +
F[6][9]*D[9][12] +
F[6][10]*D[10][12] +
F[6][11]*D[11][12] +
F[6][12]*D[12][12]) +
G[6][0]*
G[9][0]*Q[0] +
G[6][1]*
G[9][1]*Q[1] +
G[6][2]*
G[9][2]*Q[2])*Tsq + (
F[9][6]*D[6][6] +
F[9][7]*D[6][7] +
F[9][8]*D[6][8] +
F[6][7]*D[7][9] +
F[6][8]*D[8][9] +
F[6][9]*D[9][9] +
F[6][10]*D[9][10] +
F[9][10]*D[6][10] +
F[6][11]*D[9][11] +
F[9][11]*D[6][11] +
F[6][12]*D[9][12] +
F[9][12]*D[6][12])*T + D[6][9];
537 P[6][10] = P[10][6] = (
F[6][7]*D[7][10] +
F[6][8]*D[8][10] +
F[6][9]*D[9][10] +
F[6][10]*D[10][10] +
F[6][11]*D[10][11] +
F[6][12]*D[10][12])*T + D[6][10];
538 P[6][11] = P[11][6] = (
F[6][7]*D[7][11] +
F[6][8]*D[8][11] +
F[6][9]*D[9][11] +
F[6][10]*D[10][11] +
F[6][11]*D[11][11] +
F[6][12]*D[11][12])*T + D[6][11];
539 P[6][12] = P[12][6] = (
F[6][7]*D[7][12] +
F[6][8]*D[8][12] +
F[6][9]*D[9][12] +
F[6][10]*D[10][12] +
F[6][11]*D[11][12] +
F[6][12]*D[12][12])*T + D[6][12];
540 P[6][13] = P[13][6] = (
F[6][7]*D[7][13] +
F[6][8]*D[8][13] +
F[6][9]*D[9][13] +
F[6][10]*D[10][13] +
F[6][11]*D[11][13] +
F[6][12]*D[12][13])*T + D[6][13];
541 P[6][14] = P[14][6] = (
F[6][7]*D[7][14] +
F[6][8]*D[8][14] +
F[6][9]*D[9][14] +
F[6][10]*D[10][14] +
F[6][11]*D[11][14] +
F[6][12]*D[12][14])*T + D[6][14];
542 P[6][15] = P[15][6] = (
F[6][7]*D[7][15] +
F[6][8]*D[8][15] +
F[6][9]*D[9][15] +
F[6][10]*D[10][15] +
F[6][11]*D[11][15] +
F[6][12]*D[12][15])*T + D[6][15];
543 P[7][7] = (Q[0]*
G[7][0]*
G[7][0] + Q[1]*
G[7][1]*
G[7][1] + Q[2]*
G[7][2]*
G[7][2] +
F[7][6]*(
F[7][6]*D[6][6] +
F[7][8]*D[6][8] +
F[7][9]*D[6][9] +
F[7][10]*D[6][10] +
F[7][11]*D[6][11] +
F[7][12]*D[6][12]) +
F[7][8]*(
F[7][6]*D[6][8] +
F[7][8]*D[8][8] +
F[7][9]*D[8][9] +
F[7][10]*D[8][10] +
F[7][11]*D[8][11] +
F[7][12]*D[8][12]) +
F[7][9]*(
F[7][6]*D[6][9] +
F[7][8]*D[8][9] +
F[7][9]*D[9][9] +
F[7][10]*D[9][10] +
F[7][11]*D[9][11] +
F[7][12]*D[9][12]) +
F[7][10]*(
F[7][6]*D[6][10] +
F[7][8]*D[8][10] +
F[7][9]*D[9][10] +
F[7][10]*D[10][10] +
F[7][11]*D[10][11] +
F[7][12]*D[10][12]) +
F[7][11]*(
F[7][6]*D[6][11] +
F[7][8]*D[8][11] +
F[7][9]*D[9][11] +
F[7][10]*D[10][11] +
F[7][11]*D[11][11] +
F[7][12]*D[11][12]) +
F[7][12]*(
F[7][6]*D[6][12] +
F[7][8]*D[8][12] +
F[7][9]*D[9][12] +
F[7][10]*D[10][12] +
F[7][11]*D[11][12] +
F[7][12]*D[12][12]))*Tsq + (2*
F[7][6]*D[6][7] + 2*
F[7][8]*D[7][8] + 2*
F[7][9]*D[7][9] + 2*
F[7][10]*D[7][10] + 2*
F[7][11]*D[7][11] + 2*
F[7][12]*D[7][12])*T + D[7][7];
544 P[7][8] = P[8][7] = (
F[8][6]*(
F[7][6]*D[6][6] +
F[7][8]*D[6][8] +
F[7][9]*D[6][9] +
F[7][10]*D[6][10] +
F[7][11]*D[6][11] +
F[7][12]*D[6][12]) +
F[8][7]*(
F[7][6]*D[6][7] +
F[7][8]*D[7][8] +
F[7][9]*D[7][9] +
F[7][10]*D[7][10] +
F[7][11]*D[7][11] +
F[7][12]*D[7][12]) +
F[8][9]*(
F[7][6]*D[6][9] +
F[7][8]*D[8][9] +
F[7][9]*D[9][9] +
F[7][10]*D[9][10] +
F[7][11]*D[9][11] +
F[7][12]*D[9][12]) +
F[8][10]*(
F[7][6]*D[6][10] +
F[7][8]*D[8][10] +
F[7][9]*D[9][10] +
F[7][10]*D[10][10] +
F[7][11]*D[10][11] +
F[7][12]*D[10][12]) +
F[8][11]*(
F[7][6]*D[6][11] +
F[7][8]*D[8][11] +
F[7][9]*D[9][11] +
F[7][10]*D[10][11] +
F[7][11]*D[11][11] +
F[7][12]*D[11][12]) +
F[8][12]*(
F[7][6]*D[6][12] +
F[7][8]*D[8][12] +
F[7][9]*D[9][12] +
F[7][10]*D[10][12] +
F[7][11]*D[11][12] +
F[7][12]*D[12][12]) +
G[7][0]*
G[8][0]*Q[0] +
G[7][1]*
G[8][1]*Q[1] +
G[7][2]*
G[8][2]*Q[2])*Tsq + (
F[7][6]*D[6][8] +
F[8][6]*D[6][7] +
F[8][7]*D[7][7] +
F[7][8]*D[8][8] +
F[7][9]*D[8][9] +
F[8][9]*D[7][9] +
F[7][10]*D[8][10] +
F[8][10]*D[7][10] +
F[7][11]*D[8][11] +
F[8][11]*D[7][11] +
F[7][12]*D[8][12] +
F[8][12]*D[7][12])*T + D[7][8];
545 P[7][9] = P[9][7] = (
F[9][6]*(
F[7][6]*D[6][6] +
F[7][8]*D[6][8] +
F[7][9]*D[6][9] +
F[7][10]*D[6][10] +
F[7][11]*D[6][11] +
F[7][12]*D[6][12]) +
F[9][7]*(
F[7][6]*D[6][7] +
F[7][8]*D[7][8] +
F[7][9]*D[7][9] +
F[7][10]*D[7][10] +
F[7][11]*D[7][11] +
F[7][12]*D[7][12]) +
F[9][8]*(
F[7][6]*D[6][8] +
F[7][8]*D[8][8] +
F[7][9]*D[8][9] +
F[7][10]*D[8][10] +
F[7][11]*D[8][11] +
F[7][12]*D[8][12]) +
F[9][10]*(
F[7][6]*D[6][10] +
F[7][8]*D[8][10] +
F[7][9]*D[9][10] +
F[7][10]*D[10][10] +
F[7][11]*D[10][11] +
F[7][12]*D[10][12]) +
F[9][11]*(
F[7][6]*D[6][11] +
F[7][8]*D[8][11] +
F[7][9]*D[9][11] +
F[7][10]*D[10][11] +
F[7][11]*D[11][11] +
F[7][12]*D[11][12]) +
F[9][12]*(
F[7][6]*D[6][12] +
F[7][8]*D[8][12] +
F[7][9]*D[9][12] +
F[7][10]*D[10][12] +
F[7][11]*D[11][12] +
F[7][12]*D[12][12]) +
G[7][0]*
G[9][0]*Q[0] +
G[7][1]*
G[9][1]*Q[1] +
G[7][2]*
G[9][2]*Q[2])*Tsq + (
F[9][6]*D[6][7] +
F[9][7]*D[7][7] +
F[9][8]*D[7][8] +
F[7][6]*D[6][9] +
F[7][8]*D[8][9] +
F[7][9]*D[9][9] +
F[7][10]*D[9][10] +
F[9][10]*D[7][10] +
F[7][11]*D[9][11] +
F[9][11]*D[7][11] +
F[7][12]*D[9][12] +
F[9][12]*D[7][12])*T + D[7][9];
546 P[7][10] = P[10][7] = (
F[7][6]*D[6][10] +
F[7][8]*D[8][10] +
F[7][9]*D[9][10] +
F[7][10]*D[10][10] +
F[7][11]*D[10][11] +
F[7][12]*D[10][12])*T + D[7][10];
547 P[7][11] = P[11][7] = (
F[7][6]*D[6][11] +
F[7][8]*D[8][11] +
F[7][9]*D[9][11] +
F[7][10]*D[10][11] +
F[7][11]*D[11][11] +
F[7][12]*D[11][12])*T + D[7][11];
548 P[7][12] = P[12][7] = (
F[7][6]*D[6][12] +
F[7][8]*D[8][12] +
F[7][9]*D[9][12] +
F[7][10]*D[10][12] +
F[7][11]*D[11][12] +
F[7][12]*D[12][12])*T + D[7][12];
549 P[7][13] = P[13][7] = (
F[7][6]*D[6][13] +
F[7][8]*D[8][13] +
F[7][9]*D[9][13] +
F[7][10]*D[10][13] +
F[7][11]*D[11][13] +
F[7][12]*D[12][13])*T + D[7][13];
550 P[7][14] = P[14][7] = (
F[7][6]*D[6][14] +
F[7][8]*D[8][14] +
F[7][9]*D[9][14] +
F[7][10]*D[10][14] +
F[7][11]*D[11][14] +
F[7][12]*D[12][14])*T + D[7][14];
551 P[7][15] = P[15][7] = (
F[7][6]*D[6][15] +
F[7][8]*D[8][15] +
F[7][9]*D[9][15] +
F[7][10]*D[10][15] +
F[7][11]*D[11][15] +
F[7][12]*D[12][15])*T + D[7][15];
552 P[8][8] = (Q[0]*
G[8][0]*
G[8][0] + Q[1]*
G[8][1]*
G[8][1] + Q[2]*
G[8][2]*
G[8][2] +
F[8][6]*(
F[8][6]*D[6][6] +
F[8][7]*D[6][7] +
F[8][9]*D[6][9] +
F[8][10]*D[6][10] +
F[8][11]*D[6][11] +
F[8][12]*D[6][12]) +
F[8][7]*(
F[8][6]*D[6][7] +
F[8][7]*D[7][7] +
F[8][9]*D[7][9] +
F[8][10]*D[7][10] +
F[8][11]*D[7][11] +
F[8][12]*D[7][12]) +
F[8][9]*(
F[8][6]*D[6][9] +
F[8][7]*D[7][9] +
F[8][9]*D[9][9] +
F[8][10]*D[9][10] +
F[8][11]*D[9][11] +
F[8][12]*D[9][12]) +
F[8][10]*(
F[8][6]*D[6][10] +
F[8][7]*D[7][10] +
F[8][9]*D[9][10] +
F[8][10]*D[10][10] +
F[8][11]*D[10][11] +
F[8][12]*D[10][12]) +
F[8][11]*(
F[8][6]*D[6][11] +
F[8][7]*D[7][11] +
F[8][9]*D[9][11] +
F[8][10]*D[10][11] +
F[8][11]*D[11][11] +
F[8][12]*D[11][12]) +
F[8][12]*(
F[8][6]*D[6][12] +
F[8][7]*D[7][12] +
F[8][9]*D[9][12] +
F[8][10]*D[10][12] +
F[8][11]*D[11][12] +
F[8][12]*D[12][12]))*Tsq + (2*
F[8][6]*D[6][8] + 2*
F[8][7]*D[7][8] + 2*
F[8][9]*D[8][9] + 2*
F[8][10]*D[8][10] + 2*
F[8][11]*D[8][11] + 2*
F[8][12]*D[8][12])*T + D[8][8];
553 P[8][9] = P[9][8] = (
F[9][6]*(
F[8][6]*D[6][6] +
F[8][7]*D[6][7] +
F[8][9]*D[6][9] +
F[8][10]*D[6][10] +
F[8][11]*D[6][11] +
F[8][12]*D[6][12]) +
F[9][7]*(
F[8][6]*D[6][7] +
F[8][7]*D[7][7] +
F[8][9]*D[7][9] +
F[8][10]*D[7][10] +
F[8][11]*D[7][11] +
F[8][12]*D[7][12]) +
F[9][8]*(
F[8][6]*D[6][8] +
F[8][7]*D[7][8] +
F[8][9]*D[8][9] +
F[8][10]*D[8][10] +
F[8][11]*D[8][11] +
F[8][12]*D[8][12]) +
F[9][10]*(
F[8][6]*D[6][10] +
F[8][7]*D[7][10] +
F[8][9]*D[9][10] +
F[8][10]*D[10][10] +
F[8][11]*D[10][11] +
F[8][12]*D[10][12]) +
F[9][11]*(
F[8][6]*D[6][11] +
F[8][7]*D[7][11] +
F[8][9]*D[9][11] +
F[8][10]*D[10][11] +
F[8][11]*D[11][11] +
F[8][12]*D[11][12]) +
F[9][12]*(
F[8][6]*D[6][12] +
F[8][7]*D[7][12] +
F[8][9]*D[9][12] +
F[8][10]*D[10][12] +
F[8][11]*D[11][12] +
F[8][12]*D[12][12]) +
G[8][0]*
G[9][0]*Q[0] +
G[8][1]*
G[9][1]*Q[1] +
G[8][2]*
G[9][2]*Q[2])*Tsq + (
F[9][6]*D[6][8] +
F[9][7]*D[7][8] +
F[9][8]*D[8][8] +
F[8][6]*D[6][9] +
F[8][7]*D[7][9] +
F[8][9]*D[9][9] +
F[8][10]*D[9][10] +
F[9][10]*D[8][10] +
F[8][11]*D[9][11] +
F[9][11]*D[8][11] +
F[8][12]*D[9][12] +
F[9][12]*D[8][12])*T + D[8][9];
554 P[8][10] = P[10][8] = (
F[8][6]*D[6][10] +
F[8][7]*D[7][10] +
F[8][9]*D[9][10] +
F[8][10]*D[10][10] +
F[8][11]*D[10][11] +
F[8][12]*D[10][12])*T + D[8][10];
555 P[8][11] = P[11][8] = (
F[8][6]*D[6][11] +
F[8][7]*D[7][11] +
F[8][9]*D[9][11] +
F[8][10]*D[10][11] +
F[8][11]*D[11][11] +
F[8][12]*D[11][12])*T + D[8][11];
556 P[8][12] = P[12][8] = (
F[8][6]*D[6][12] +
F[8][7]*D[7][12] +
F[8][9]*D[9][12] +
F[8][10]*D[10][12] +
F[8][11]*D[11][12] +
F[8][12]*D[12][12])*T + D[8][12];
557 P[8][13] = P[13][8] = (
F[8][6]*D[6][13] +
F[8][7]*D[7][13] +
F[8][9]*D[9][13] +
F[8][10]*D[10][13] +
F[8][11]*D[11][13] +
F[8][12]*D[12][13])*T + D[8][13];
558 P[8][14] = P[14][8] = (
F[8][6]*D[6][14] +
F[8][7]*D[7][14] +
F[8][9]*D[9][14] +
F[8][10]*D[10][14] +
F[8][11]*D[11][14] +
F[8][12]*D[12][14])*T + D[8][14];
559 P[8][15] = P[15][8] = (
F[8][6]*D[6][15] +
F[8][7]*D[7][15] +
F[8][9]*D[9][15] +
F[8][10]*D[10][15] +
F[8][11]*D[11][15] +
F[8][12]*D[12][15])*T + D[8][15];
560 P[9][9] = (Q[0]*
G[9][0]*
G[9][0] + Q[1]*
G[9][1]*
G[9][1] + Q[2]*
G[9][2]*
G[9][2] +
F[9][6]*(
F[9][6]*D[6][6] +
F[9][7]*D[6][7] +
F[9][8]*D[6][8] +
F[9][10]*D[6][10] +
F[9][11]*D[6][11] +
F[9][12]*D[6][12]) +
F[9][7]*(
F[9][6]*D[6][7] +
F[9][7]*D[7][7] +
F[9][8]*D[7][8] +
F[9][10]*D[7][10] +
F[9][11]*D[7][11] +
F[9][12]*D[7][12]) +
F[9][8]*(
F[9][6]*D[6][8] +
F[9][7]*D[7][8] +
F[9][8]*D[8][8] +
F[9][10]*D[8][10] +
F[9][11]*D[8][11] +
F[9][12]*D[8][12]) +
F[9][10]*(
F[9][6]*D[6][10] +
F[9][7]*D[7][10] +
F[9][8]*D[8][10] +
F[9][10]*D[10][10] +
F[9][11]*D[10][11] +
F[9][12]*D[10][12]) +
F[9][11]*(
F[9][6]*D[6][11] +
F[9][7]*D[7][11] +
F[9][8]*D[8][11] +
F[9][10]*D[10][11] +
F[9][11]*D[11][11] +
F[9][12]*D[11][12]) +
F[9][12]*(
F[9][6]*D[6][12] +
F[9][7]*D[7][12] +
F[9][8]*D[8][12] +
F[9][10]*D[10][12] +
F[9][11]*D[11][12] +
F[9][12]*D[12][12]))*Tsq + (2*
F[9][6]*D[6][9] + 2*
F[9][7]*D[7][9] + 2*
F[9][8]*D[8][9] + 2*
F[9][10]*D[9][10] + 2*
F[9][11]*D[9][11] + 2*
F[9][12]*D[9][12])*T + D[9][9];
561 P[9][10] = P[10][9] = (
F[9][6]*D[6][10] +
F[9][7]*D[7][10] +
F[9][8]*D[8][10] +
F[9][10]*D[10][10] +
F[9][11]*D[10][11] +
F[9][12]*D[10][12])*T + D[9][10];
562 P[9][11] = P[11][9] = (
F[9][6]*D[6][11] +
F[9][7]*D[7][11] +
F[9][8]*D[8][11] +
F[9][10]*D[10][11] +
F[9][11]*D[11][11] +
F[9][12]*D[11][12])*T + D[9][11];
563 P[9][12] = P[12][9] = (
F[9][6]*D[6][12] +
F[9][7]*D[7][12] +
F[9][8]*D[8][12] +
F[9][10]*D[10][12] +
F[9][11]*D[11][12] +
F[9][12]*D[12][12])*T + D[9][12];
564 P[9][13] = P[13][9] = (
F[9][6]*D[6][13] +
F[9][7]*D[7][13] +
F[9][8]*D[8][13] +
F[9][10]*D[10][13] +
F[9][11]*D[11][13] +
F[9][12]*D[12][13])*T + D[9][13];
565 P[9][14] = P[14][9] = (
F[9][6]*D[6][14] +
F[9][7]*D[7][14] +
F[9][8]*D[8][14] +
F[9][10]*D[10][14] +
F[9][11]*D[11][14] +
F[9][12]*D[12][14])*T + D[9][14];
566 P[9][15] = P[15][9] = (
F[9][6]*D[6][15] +
F[9][7]*D[7][15] +
F[9][8]*D[8][15] +
F[9][10]*D[10][15] +
F[9][11]*D[11][15] +
F[9][12]*D[12][15])*T + D[9][15];
567 P[10][10] = Q[6]*Tsq + D[10][10];
568 P[10][11] = P[11][10] = D[10][11];
569 P[10][12] = P[12][10] = D[10][12];
570 P[10][13] = P[13][10] = D[10][13];
571 P[10][14] = P[14][10] = D[10][14];
572 P[10][15] = P[15][10] = D[10][15];
573 P[11][11] = Q[7]*Tsq + D[11][11];
574 P[11][12] = P[12][11] = D[11][12];
575 P[11][13] = P[13][11] = D[11][13];
576 P[11][14] = P[14][11] = D[11][14];
577 P[11][15] = P[15][11] = D[11][15];
578 P[12][12] = Q[8]*Tsq + D[12][12];
579 P[12][13] = P[13][12] = D[12][13];
580 P[12][14] = P[14][12] = D[12][14];
581 P[12][15] = P[15][12] = D[12][15];
582 P[13][13] = Q[9]*Tsq + D[13][13];
583 P[13][14] = P[14][13] = D[13][14];
584 P[13][15] = P[15][13] = D[13][15];
585 P[14][14] = Q[10]*Tsq + D[14][14];
586 P[14][15] = P[15][14] = D[14][15];
587 P[15][15] = Q[11]*Tsq + D[15][15];
610 float Y[NUMV],
float P[NUMX][NUMX],
float X[NUMX],
611 uint16_t SensorsUsed)
613 float HP[
NUMX], HPHR, Error;
618 for (m = 0; m <
NUMV; m++) {
620 if (SensorsUsed & (0x01 << m)) {
622 for (j = 0; j <
NUMX; j++) {
624 for (k = 0; k <
NUMX; k++)
625 HP[j] +=
H[m][k] * P[k][j];
628 for (k = 0; k <
NUMX; k++)
629 HPHR += HP[k] *
H[m][k];
631 for (k = 0; k <
NUMX; k++)
632 K[k][m] = HP[k] / HPHR;
634 for (i = 0; i <
NUMX; i++) {
635 for (j = i; j <
NUMX; j++)
637 P[i][j] -
K[i][m] * HP[j];
641 for (i = 0; i <
NUMX; i++)
642 X[i] =
X[i] +
K[i][m] * Error;
662 for (i = 0; i <
NUMX; i++)
666 for (i = 0; i <
NUMX; i++)
667 X[i] = Xlast[i] + dT2 *
K1[i];
669 for (i = 0; i <
NUMX; i++)
670 X[i] = Xlast[i] + dT2 * K2[i];
672 for (i = 0; i <
NUMX; i++)
673 X[i] = Xlast[i] + dT * K3[i];
677 for (i = 0; i <
NUMX; i++)
679 Xlast[i] + dT * (
K1[i] + 2.0f * K2[i] + 2.0f * K3[i] +
702 void StateEq(
float X[NUMX],
float U[NUMU],
float Xdot[NUMX])
704 float ax, ay, az, wx, wy, wz, q0, q1, q2, q3;
724 (q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) * ax + 2.0f * (q1 * q2 -
726 ay + 2.0f * (q1 * q3 + q0 * q2) * az;
728 2.0f * (q1 * q2 + q0 * q3) * ax + (q0 * q0 - q1 * q1 + q2 * q2 -
729 q3 * q3) * ay + 2.0f * (q2 * q3 -
733 2.0f * (q1 * q3 - q0 * q2) * ax + 2.0f * (q2 * q3 + q0 * q1) * ay +
734 (q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3) * az + GRAVITY;
737 Xdot[6] = (-q1 * wx - q2 * wy - q3 * wz) / 2.0f;
738 Xdot[7] = (q0 * wx - q3 * wy + q2 * wz) / 2.0f;
739 Xdot[8] = (q3 * wx + q0 * wy - q1 * wz) / 2.0f;
740 Xdot[9] = (-q2 * wx + q1 * wy + q0 * wz) / 2.0f;
743 Xdot[10] = Xdot[11] = Xdot[12] = 0;
749 float const accel_zero_rate = -1.0f;
750 Xdot[13] = accel_zero_rate * X[13];
751 Xdot[14] = accel_zero_rate * X[14];
769 void LinearizeFG(
float X[NUMX],
float U[NUMU],
float F[NUMX][NUMX],
772 float ax, ay, az, wx, wy, wz, q0, q1, q2, q3;
786 F[0][3] =
F[1][4] =
F[2][5] = 1.0f;
789 F[3][6] = 2.0f * (q0 * ax - q3 * ay + q2 * az);
790 F[3][7] = 2.0f * (q1 * ax + q2 * ay + q3 * az);
791 F[3][8] = 2.0f * (-q2 * ax + q1 * ay + q0 * az);
792 F[3][9] = 2.0f * (-q3 * ax - q0 * ay + q1 * az);
793 F[4][6] = 2.0f * (q3 * ax + q0 * ay - q1 * az);
794 F[4][7] = 2.0f * (q2 * ax - q1 * ay - q0 * az);
795 F[4][8] = 2.0f * (q1 * ax + q2 * ay + q3 * az);
796 F[4][9] = 2.0f * (q0 * ax - q3 * ay + q2 * az);
797 F[5][6] = 2.0f * (-q2 * ax + q1 * ay + q0 * az);
798 F[5][7] = 2.0f * (q3 * ax + q0 * ay - q1 * az);
799 F[5][8] = 2.0f * (-q0 * ax + q3 * ay - q2 * az);
800 F[5][9] = 2.0f * (q1 * ax + q2 * ay + q3 * az);
803 F[3][13]=
G[3][3]=-q0*q0-q1*q1+q2*q2+q3*q3;
F[3][14]=
G[3][4]=2.0f*(-q1*q2+q0*q3);
F[3][15]=
G[3][5]=-2.0f*(q1*q3+q0*q2);
804 F[4][13]=
G[4][3]=-2.0f*(q1*q2+q0*q3);
F[4][14]=
G[4][4]=-q0*q0+q1*q1-q2*q2+q3*q3;
F[4][15]=
G[4][5]=2.0f*(-q2*q3+q0*q1);
805 F[5][13]=
G[5][3]=2.0f*(-q1*q3+q0*q2);
F[5][14]=
G[5][4]=-2.0f*(q2*q3+q0*q1);
F[5][15]=
G[5][5]=-q0*q0+q1*q1+q2*q2-q3*q3;
809 F[6][7] = -wx / 2.0f;
810 F[6][8] = -wy / 2.0f;
811 F[6][9] = -wz / 2.0f;
815 F[7][9] = -wy / 2.0f;
817 F[8][7] = -wz / 2.0f;
822 F[9][8] = -wx / 2.0f;
826 F[6][10] = q1 / 2.0f;
827 F[6][11] = q2 / 2.0f;
828 F[6][12] = q3 / 2.0f;
829 F[7][10] = -q0 / 2.0f;
830 F[7][11] = q3 / 2.0f;
831 F[7][12] = -q2 / 2.0f;
832 F[8][10] = -q3 / 2.0f;
833 F[8][11] = -q0 / 2.0f;
834 F[8][12] = q1 / 2.0f;
835 F[9][10] = q2 / 2.0f;
836 F[9][11] = -q1 / 2.0f;
837 F[9][12] = -q0 / 2.0f;
848 G[7][0] = -q0 / 2.0f;
850 G[7][2] = -q2 / 2.0f;
851 G[8][0] = -q3 / 2.0f;
852 G[8][1] = -q0 / 2.0f;
855 G[9][1] = -q1 / 2.0f;
856 G[9][2] = -q0 / 2.0f;
867 float q0, q1, q2, q3;
883 float r = sqrtf( powf(2*q0*q3 + 2*q1*q2, 2) + powf(q0*q0 + q1*q1 - q2*q2 - q3*q3, 2) );
884 float cP = (q0*q0 + q1*q1 - q2*q2 - q3*q3) / r;
885 float sP = (2*q0*q3 + 2*q1*q2) / r;
886 Y[6] = Be[0] * cP + Be[1] * sP;
887 Y[7] = -Be[0] * sP + Be[1] * cP;
899 void LinearizeH(
float X[NUMX],
float Be[3],
float H[NUMV][NUMX])
901 float q0, q1, q2, q3;
909 H[0][0] =
H[1][1] =
H[2][2] = 1.0f;
911 H[3][3] =
H[4][4] =
H[5][5] = 1.0f;
920 float k1 = 1.0f/sqrtf(powf(q0*q3*2.0f+q1*q2*2.0f,2.0f)+powf(q0*q0+q1*q1-q2*q2-q3*q3,2.0f));
921 float k3 = 1.0f/powf(powf(q0*q3*2.0f+q1*q2*2.0f,2.0f)+powf(q0*q0+q1*q1-q2*q2-q3*q3,2.0f),3.0f/2.0f)*(q0*q0+q1*q1-q2*q2-q3*q3)*(1.0f/2.0f);
922 float k4 = (q0*q0+q1*q1-q2*q2-q3*q3)*4.0f;
923 float k5 = (q0*q3*2.0f+q1*q2*2.0f)*4.0f;
924 float k6 = 1.0f/powf(powf(q0*q3*2.0f+q1*q2*2.0f,2.0f)+powf(q0*q0+q1*q1-q2*q2-q3*q3,2.0f),3.0f/2.0f)*(q0*q3*2.0f+q1*q2*2.0f)*(1.0f/2.0f);
926 H[6][6] = Be_0*q0*k1*2.0f + Be_1*q3*k1*2.0f - Be_0*(q0*k4+q3*k5)*k3 - Be_1*(q0*k4+q3*k5)*k6;
927 H[6][7] = Be_0*q1*k1*2.0f + Be_1*q2*k1*2.0f - Be_0*(q1*k4+q2*k5)*k3 - Be_1*(q1*k4+q2*k5)*k6;
928 H[6][8] = Be_0*q2*k1*-2.0f + Be_1*q1*k1*2.0f + Be_0*(q2*k4-q1*k5)*k3 + Be_1*(q2*k4-q1*k5)*k6;
929 H[6][9] = Be_1*q0*k1*2.0f - Be_0*q3*k1*2.0f + Be_0*(q3*k4-q0*k5)*k3 + Be_1*(q3*k4-q0*k5)*k6;
930 H[7][6] = Be_1*q0*k1*2.0f - Be_0*q3*k1*2.0f - Be_1*(q0*k4+q3*k5)*k3 + Be_0*(q0*k4+q3*k5)*k6;
931 H[7][7] = Be_0*q2*k1*-2.0f + Be_1*q1*k1*2.0f - Be_1*(q1*k4+q2*k5)*k3 + Be_0*(q1*k4+q2*k5)*k6;
932 H[7][8] = Be_0*q1*k1*-2.0f - Be_1*q2*k1*2.0f + Be_1*(q2*k4-q1*k5)*k3 - Be_0*(q2*k4-q1*k5)*k6;
933 H[7][9] = Be_0*q0*k1*-2.0f - Be_1*q3*k1*2.0f + Be_1*(q3*k4-q0*k5)*k3 - Be_0*(q3*k4-q0*k5)*k6;
void INSGetState(float *pos, float *vel, float *attitude, float *gyro_bias, float *accel_bias)
Get the current state estimate.
void LinearizeH(float X[NUMX], float Be[3], float H[NUMV][NUMX])
Include file of the INSGPS exposed functionality.
void INSSetAccelBias(const float gyro_bias[3])
void StateEq(float X[NUMX], float U[NUMU], float Xdot[NUMX])
void INSGetVariance(float *p)
void INSSetMagVar(const float scaled_mag_var[3])
void INSSetPosVelVar(float PosVar, float VelVar, float VertPosVar)
void INSSetGyroBias(const float gyro_bias[3])
static float T[3]
Scales used in NED transform (local tangent plane approx).
static float accel_bias[3]
void CovariancePrediction(float F[NUMX][NUMX], float G[NUMX][NUMW], float Q[NUMW], float dT, float P[NUMX][NUMX])
void INSStatePrediction(const float gyro_data[3], const float accel_data[3], float dT)
Compute an update of the state estimate.
void INSSetMagNorth(const float B[3])
void INSSetBaroVar(float baro_var)
void SerialUpdate(float H[NUMV][NUMX], float R[NUMV], float Z[NUMV], float Y[NUMV], float P[NUMX][NUMX], float X[NUMX], uint16_t SensorsUsed)
void LinearizeFG(float X[NUMX], float U[NUMU], float F[NUMX][NUMX], float G[NUMX][NUMW])
void INSSetState(const float pos[3], const float vel[3], const float q[4], const float gyro_bias[3], const float accel_bias[3])
void INSGPSInit()
Reset the internal state variables and variances.
void INSCorrection(const float mag_data[3], const float Pos[3], const float Vel[3], float BaroAlt, uint16_t SensorsUsed)
Correct the state and covariance estimate based on the sensors that were updated. ...
void INSSetArmed(bool armed)
Set the current flight state.
void MeasurementEq(float X[NUMX], float Be[3], float Y[NUMV])
void INSResetP(const float *PDiag)
void INSCovariancePrediction(float dT)
Compute an update of the state covariance.
uint16_t ins_get_num_states()
void INSSetGyroVar(const float gyro_var[3])
void INSSetAccelVar(const float accel_var[3])
void INSPosVelReset(const float pos[3], const float vel[3])
void RungeKutta(float X[NUMX], float U[NUMU], float dT)