24 #include "symMatrix.hpp"
25 using namespace operators;
55 template <
size_t x_dim,
size_t u_dim,
size_t c_dim = 1,
size_t z_num = 1,
typename T =
float>
61 Vector_f3<T> f =
nullptr;
64 size_t z_dim[z_num] = {0};
67 Vector_f2<T> h[z_num] = {
nullptr};
70 Matrix_f3<T> Fx =
nullptr;
71 Matrix_f3<T> Fu =
nullptr;
72 Matrix_f3<T> Fc =
nullptr;
75 Matrix_f2<T> H[z_num] = {
nullptr};
81 Matrix<T> H_val[z_num];
84 symMatrix<T> pre_S[z_num];
87 ldl_matrix<T> S_inv[z_num];
90 Vector<T> h_val[z_num];
93 Vector<T> prev_X = Vector<T>(x_dim);
96 Matrix<T> Fx_val_T = Matrix<T>(x_dim, x_dim);
97 Matrix<T> Fu_val_T = Matrix<T>(u_dim, x_dim);
98 Matrix<T> Fc_val_T = Matrix<T>(c_dim, x_dim);
104 Matrix<T> H_P[z_num];
106 inline void finite_diff_Fx(
const size_t i);
107 inline void finite_diff_Fu(
const size_t i);
116 void finite_diff_Fx()
118 for (
size_t i = 0; i < x_dim; i++)
129 void finite_diff_Fu()
131 for (
size_t i = 0; i < u_dim; i++)
143 void finite_diff_H(
const size_t z_idx,
const size_t i);
146 void finite_diff_H(
const size_t z_idx)
148 for (
size_t i = 0; i < x_dim; i++)
149 finite_diff_H(z_idx, i);
153 bool initted =
false;
157 Vector<T> X = Vector<T>(x_dim);
160 Vector<T> dx = Vector<T>(x_dim);
163 symMatrix<T> P = symMatrix<T>(x_dim, x_dim);
166 Vector<T> U = Vector<T>(u_dim);
169 Vector<T> du = Vector<T>(u_dim);
172 symMatrix<T> Cov_U = symMatrix<T>(u_dim);
175 Vector<T> C = Vector<T>(c_dim);
178 Vector<T> dc = Vector<T>(c_dim);
189 Ekf(Vector_f3<T> f) :
Ekf() { setPredictionFunction(f); }
195 void setPredictionFunction(Vector_f3<T> f) { this->f = f; }
198 void setJacobianFunction_Fx(Matrix_f3<T> Fx) { this->Fx = Fx; }
201 void setJacobianFunction_Fu(Matrix_f3<T> Fu) { this->Fu = Fu; }
213 void setMeasurementFunction(Vector_f2<T> h,
size_t z_dim,
size_t z_idx = 0);
216 void setJacobianFunction_H(Matrix_f2<T> H,
size_t z_idx = 0) { this->H[z_idx] = H; }
226 inline void predict();
235 inline void compute_H_P(
const size_t z_idx = 0);
246 inline void computeResidualPrecision(
const symMatrix<T> &R,
const size_t z_idx = 0);
256 inline void computeResidual(
const Vector<T> &Z,
const size_t z_idx = 0);
266 inline void updateStateCovariance(
const size_t z_idx = 0);
279 inline T mahalanobisDistance(
const size_t z_idx = 0) {
return y[z_idx].dot(*(S_inv[z_idx] * y[z_idx]).release()); }
300 inline void update(
const Vector<T> &Z,
const symMatrix<T> &R,
const size_t z_idx = 0);
A generic implementation of an Extended Kalman Filter (EKF).