28 I_ = Matrix3d::Identity();
31 void EKF::set_parameters(
const Motion_Noise &motion_noise,
const Measurement_Noise &measurement_noise,
32 const Controller &controller)
42 for (
int i = 0, n = covariance_eigen.rows(); i < n; ++i)
44 for (
int j = 0, m = covariance_eigen.cols(); j < m; ++j)
46 covariance_eigen(i, j) = covariance[(i << 2) + j];
49 return covariance_eigen;
54 for (
int i = 0, n = covariance_eigen.rows(); i < n; ++i)
56 for (
int j = 0, m = covariance_eigen.cols(); j < m; ++j)
58 covariance[(i << 2) + j] = covariance_eigen(i, j);
66 double d(
sgn(control.delta_s));
70 double sgn_sigma =
sgn(control.sigma);
71 double abs_sigma = fabs(control.sigma);
72 double sqrt_sigma_inv = 1 / sqrt(abs_sigma);
73 double k1 = state.theta - 0.5 *
d * state.kappa * state.kappa / control.sigma;
74 double k2 =
SQRT_PI_INV * sqrt_sigma_inv * (abs_sigma * integration_step + sgn_sigma * state.kappa);
75 double k3 =
SQRT_PI_INV * sqrt_sigma_inv * sgn_sigma * state.kappa;
76 double k4 = k1 +
d * sgn_sigma *
HALF_PI * k2 * k2;
77 double k5 = k1 +
d * sgn_sigma *
HALF_PI * k3 * k3;
78 double cos_k1 = cos(k1);
79 double sin_k1 = sin(k1);
80 double cos_k4 = cos(k4);
81 double sin_k4 = sin(k4);
82 double cos_k5 = cos(k5);
83 double sin_k5 = sin(k5);
88 fresnel(k2, fresnel_s_k2, fresnel_c_k2);
89 fresnel(k3, fresnel_s_k3, fresnel_c_k3);
95 F_x(0, 2) =
SQRT_PI * sqrt_sigma_inv *
96 (-
d * sin_k1 * (fresnel_c_k2 - fresnel_c_k3) - sgn_sigma * cos_k1 * (fresnel_s_k2 - fresnel_s_k3));
97 F_x(1, 2) =
SQRT_PI * sqrt_sigma_inv *
98 (
d * cos_k1 * (fresnel_c_k2 - fresnel_c_k3) - sgn_sigma * sin_k1 * (fresnel_s_k2 - fresnel_s_k3));
104 F_u(2, 0) = state.kappa + control.sigma * integration_step;
106 F_u(0, 1) =
SQRT_PI * sqrt_sigma_inv * state.kappa *
107 (sgn_sigma * sin_k1 * (fresnel_c_k2 - fresnel_c_k3) +
d * cos_k1 * (fresnel_s_k2 - fresnel_s_k3)) /
109 d * (cos_k4 - cos_k5) / control.sigma;
110 F_u(1, 1) =
SQRT_PI * sqrt_sigma_inv * state.kappa *
111 (-sgn_sigma * cos_k1 * (fresnel_c_k2 - fresnel_c_k3) +
d * sin_k1 * (fresnel_s_k2 - fresnel_s_k3)) /
113 d * (sin_k4 - sin_k5) / control.sigma;
114 F_u(2, 1) =
d * integration_step;
120 double sin_th = sin(state.theta);
121 double cos_th = cos(state.theta);
122 double k9 = state.theta +
d * integration_step * state.kappa;
123 double cos_k9 = cos(k9);
124 double sin_k9 = sin(k9);
130 F_x(0, 2) = (-cos_th + cos_k9) / state.kappa;
131 F_x(1, 2) = (-sin_th + sin_k9) / state.kappa;
137 F_u(2, 0) = state.kappa;
139 F_u(0, 1) = (sin_th - sin_k9) / (state.kappa * state.kappa) +
d * integration_step * cos_k9 / state.kappa;
140 F_u(1, 1) = (-cos_th + cos_k9) / (state.kappa * state.kappa) +
d * integration_step * sin_k9 / state.kappa;
141 F_u(2, 1) =
d * integration_step;
145 double cos_th = cos(state.theta);
146 double sin_th = sin(state.theta);
152 F_x(0, 2) = -
d * integration_step * sin_th;
153 F_x(1, 2) =
d * integration_step * cos_th;
159 F_u(2, 0) = state.kappa;
161 F_u(2, 1) =
d * integration_step;
202 double cos_angle = cos(
angle);
203 double sin_angle = sin(
angle);
205 R(1, 0) = -sin_angle;
223 Matrix3d Sigma_pred = F_x * Sigma * F_x.transpose() + F_u * Q * F_u.transpose();
228 Matrix3d F_K = F_x - F_u * K * R_1I;
229 Matrix3d Lambda_pred = F_K * Lambda * F_K.transpose();
244 Matrix3d Sigma_xz = Sigma_pred * H_x.transpose();
245 Matrix3d Sigma_z = H_x * Sigma_xz + R;
246 Matrix3d L = Sigma_xz * Sigma_z.inverse();
250 Matrix3d Sigma_corr = I_LH_x * Sigma_pred * I_LH_x.transpose() + L * R * L.transpose();
253 Matrix3d Lambda_corr = Lambda_pred + L * Sigma_xz.transpose();