50 const double z[2],
double alpha,
double a_m,
51 double Ts,
const double Q[4],
52 const double R[4],
bool gnss_signal)
54 static const signed char b_a[4] = {1, 0, 0, 1};
67 cos_alpha = cos(
alpha);
70 F[2] =
Ts * cos_alpha;
81 x_pred[1] = (0.0 *
x_est[0] +
x_est[1]) +
Ts * (
a_m - 9.81 * cos_alpha);
86 if (gnss_signal ==
true) {
96 for (i = 0; i < 2; i++) {
99 cos_alpha = (double)a_tmp * P[0] + (
double)b_a_tmp * P[1];
100 d = (double)a_tmp * P[2] + (
double)b_a_tmp * P[3];
101 P0[i] = (cos_alpha + d * 0.0) +
R[i];
102 P0[i + 2] = (cos_alpha * 0.0 + d) +
R[i + 2];
103 cos_alpha = P[i + 2];
104 a[i] = P[i] + cos_alpha * 0.0;
105 a[i + 2] = P[i] * 0.0 + cos_alpha;
107 cos_alpha = P0[0] * P0[3] - P0[1] * P0[2];
108 P0_idx_0 = P0[3] / cos_alpha;
109 P0_idx_2 = -P0[2] / cos_alpha;
110 P0_idx_1 = -P0[1] / cos_alpha;
111 P0_idx_3 = P0[0] / cos_alpha;
118 for (i = 0; i < 2; i++) {
124 d7 = d6 * P0_idx_0 + d5 * P0_idx_1;
126 d5 = d6 * P0_idx_2 + d5 * P0_idx_3;
129 d6 = (double)a_tmp - (d7 + d5 * 0.0);
131 b_a_tmp = b_a[i + 2];
132 d5 = (double)b_a_tmp - (d7 * 0.0 + d5);
134 P0[i] = d6 * cos_alpha + d5 * d;
135 P0[i + 2] = d6 * d1 + d5 * d2;
136 b_Ts[i] =
z[i] - ((double)a_tmp * d3 + (
double)b_a_tmp * d4);
138 x_est[0] = x_pred[0] + (K[0] * b_Ts[0] + b_Ts[1] * K[2]);
139 x_est[1] = x_pred[1] + (b_Ts[0] * K[1] + b_Ts[1] * K[3]);
145 x_est[0] = P[0] + P[2] * 0.0;
146 x_est[1] = P[1] + P[3] * 0.0;
148 1.0 / (((P[0] + 0.0 * P[1]) + (P[2] + 0.0 * P[3]) * 0.0) +
R[0]);
149 x_est[0] *= cos_alpha;
150 x_est[1] *= cos_alpha;
151 a[0] = 1.0 -
x_est[0];
152 a[1] = 0.0 -
x_est[1];
153 a[2] = 0.0 -
x_est[0] * 0.0;
154 a[3] = 1.0 -
x_est[1] * 0.0;
161 for (i = 0; i < 2; i++) {
165 P0[i] = d5 * d + d4 * d1;
166 P0[i + 2] = d5 * d2 + d4 * d3;
167 cos_alpha += (1.0 - (double)i) * x_pred[i];
169 cos_alpha =
z[0] - cos_alpha;
178 for (i = 0; i < 2; i++) {
181 d4 = (double)a_tmp * cos_alpha + d3 * d;
182 d3 = (double)a_tmp * d1 + d3 * d2;
183 P[i] = (d4 + d3 * F[2]) +
Q[i];
184 P[i + 2] = (d4 * 0.0 + d3) +
Q[i + 2];
void kalmanFilter(double x_est[2], double P[4], const double z[2], double alpha, double a_m, double Ts, const double Q[4], const double R[4], bool gnss_signal)
Executes one prediction and correction step of the Kalman filter.
Provides MATLAB Coder helper functions for right matrix division.