32 #ifndef KALMAN_FILTER_H 33 #define KALMAN_FILTER_H 36 #include <eigen3/Eigen/Dense> 50 template <
typename NumType,
int XDim>
75 static constexpr
const int xDim = XDim;
82 void init(
const Eigen::Matrix<NumType, XDim, 1>& _x0,
const Eigen::Matrix<NumType, XDim, XDim>& _Sigma0)
94 void predict(
const Eigen::Matrix<NumType, XDim, 1>& _f,
const Eigen::Matrix<NumType, XDim, XDim>& _Phi,
95 const Eigen::Matrix<NumType, XDim, XDim>& _Q)
107 template <
int UpdateDim>
108 void update(
const Eigen::Matrix<NumType, UpdateDim, 1>& _deltah,
const Eigen::Matrix<NumType, UpdateDim, XDim>& _C,
109 const Eigen::Matrix<NumType, UpdateDim, UpdateDim>& _R)
111 Eigen::Matrix<NumType, UpdateDim, UpdateDim> S = _C *
Sigma_ * _C.transpose() + _R;
112 Eigen::Matrix<NumType, XDim, UpdateDim> K =
Sigma_ * _C.transpose() * S.inverse();
119 const Eigen::Matrix<NumType, XDim, 1>&
x()
const 125 const Eigen::Matrix<NumType, XDim, XDim>&
Sigma()
const 131 Eigen::Matrix<NumType, XDim, 1>
x_;
134 Eigen::Matrix<NumType, XDim, XDim>
Sigma_;
136 template <
typename NumType,
int XDim>
145 template <
typename NumType,
int XDim,
size_t UDim,
typename ParamType>
182 void init(
const Eigen::Matrix<NumType, XDim, 1>& _x0)
185 this->
Sigma_.resize(_x0.rows(), _x0.rows());
205 template <
int i = XDim,
typename std::enable_if<(i >= 0)>::type* =
nullptr>
206 void predict(
const Eigen::Matrix<NumType, UDim, 1>& _u,
const double& _Ta)
226 template <
int i = XDim,
typename std::enable_if<(i == -1)>::type* =
nullptr>
227 void predict(
const Eigen::Matrix<NumType, UDim, 1>& _u,
const double& _Ta)
229 f_.resize(this->
x_.rows(), 1);
230 Phi_.resize(this->
x_.rows(), this->
x_.rows());
231 Q_.resize(this->
x_.rows(), this->
x_.rows());
236 template <int i = UDim, typename std::enable_if<(i == 0)>::type* =
nullptr>
239 static Eigen::Matrix<double, 0, 1> uEmpty_;
240 f_.resize(this->
x_.rows(), 1);
241 Phi_.resize(this->
x_.rows(), this->
x_.rows());
242 Q_.resize(this->
x_.rows(), this->
x_.rows());
254 Eigen::Matrix<NumType, XDim, 1>
f_;
256 Eigen::Matrix<NumType, XDim, XDim>
Phi_;
259 Eigen::Matrix<NumType, XDim, XDim>
Q_;
265 virtual void precompute(
const double& _Ta) = 0;
268 virtual void computeSigmaInit() = 0;
271 virtual void computePhi() = 0;
274 virtual void computef(
const Eigen::Matrix<NumType, UDim, 1>& _u) = 0;
277 virtual void computeQ() = 0;
286 template <
typename KFPredType,
int HDim>
309 static constexpr
const int hDim = HDim;
312 const Eigen::Matrix<typename KFPredType::NumericalType, HDim, 1>&
deltah()
const 317 const Eigen::Matrix<typename KFPredType::NumericalType, HDim, KFPredType::xDim>&
H()
const 322 const Eigen::Matrix<typename KFPredType::NumericalType, HDim, HDim>&
R()
const 328 Eigen::Matrix<typename KFPredType::NumericalType, HDim, 1>
deltah_;
330 Eigen::Matrix<typename KFPredType::NumericalType, HDim, KFPredType::xDim>
H_;
334 Eigen::Matrix<typename KFPredType::NumericalType, HDim, HDim>
R_;
339 virtual void precompute(
const KFPredType* _kf) = 0;
342 virtual void computeH(
const KFPredType* _kf) = 0;
345 virtual void computeDeltah(
const KFPredType* _kf,
346 const Eigen::Matrix<typename KFPredType::NumericalType, hDim, 1>& _zObs) = 0;
349 virtual void computeR(
const KFPredType* _kf) = 0;
351 template <
typename KFPredTypeI,
typename... KFUpdateType>
354 template <
typename KFPredType,
int HDim>
365 template <
typename KFPredType,
typename... KFUpdateType>
409 template <
typename KFUpdateTypeI =
typename std::tuple_element<0, std::tuple<KFUpdateType...>>::type,
410 int i = KFUpdateTypeI::hDim,
typename std::enable_if<(i >= 0)>::type* =
nullptr>
411 void update(
const Eigen::Matrix<typename KFPredType::NumericalType, KFUpdateTypeI::hDim, 1>& _zObs)
413 auto& updI = std::get<KFUpdateTypeI>(updaters_);
414 updI.precompute(
this);
416 updI.computeDeltah(
this, _zObs);
418 KFPredType::update(updI.deltah(), updI.H(), updI.R());
433 template <
typename KFUpdateTypeI =
typename std::tuple_element<0, std::tuple<KFUpdateType...>>::type,
434 int i = KFUpdateTypeI::hDim,
typename std::enable_if<(i == -1)>::type* =
nullptr>
435 void update(
const Eigen::Matrix<typename KFPredType::NumericalType, KFUpdateTypeI::hDim, 1>& _zObs)
437 auto& updI = std::get<KFUpdateTypeI>(updaters_);
438 updI.deltah_.resize(_zObs.rows(), 1);
439 updI.H_.resize(_zObs.rows(), this->
x_.rows());
440 updI.R_.resize(_zObs.rows(), _zObs.rows());
441 update<KFUpdateTypeI, 0>(_zObs);
449 #endif // KALMAN_FILTER_H static constexpr const int xDim
State vector size
Eigen::Matrix< NumType, XDim, 1 > f_
State transition function vector
Interface for simplified manipulation of specialized (Extended) Kalman Filter implementations.
NumType NumericalType
Numerical type.
void update(const Eigen::Matrix< typename KFPredType::NumericalType, KFUpdateTypeI::hDim, 1 > &_zObs)
Performs the update step defined by the template argument KFUpdateTypeI (defaults to first updater cl...
void update(const Eigen::Matrix< NumType, UpdateDim, 1 > &_deltah, const Eigen::Matrix< NumType, UpdateDim, XDim > &_C, const Eigen::Matrix< NumType, UpdateDim, UpdateDim > &_R)
Preforms Kalman update step.
Eigen::Matrix< typename KFPredType::NumericalType, HDim, KFPredType::xDim > H_
void predict(const double &_Ta)
Eigen::Matrix< typename KFPredType::NumericalType, HDim, HDim > R_
const Eigen::Matrix< typename KFPredType::NumericalType, HDim, 1 > & deltah() const
Const access of measurement function error vector h_.
Eigen::Matrix< NumType, XDim, 1 > x_
State vector
const ParamType & param() const
Parameters const acces.
void predict(const Eigen::Matrix< NumType, XDim, 1 > &_f, const Eigen::Matrix< NumType, XDim, XDim > &_Phi, const Eigen::Matrix< NumType, XDim, XDim > &_Q)
Preforms Kalman prediction step.
Eigen::Matrix< typename KFPredType::NumericalType, HDim, 1 > deltah_
Measurement function error vector.
const Eigen::Matrix< NumType, XDim, 1 > & x() const
State vector const access.
const Eigen::Matrix< typename KFPredType::NumericalType, HDim, KFPredType::xDim > & H() const
Const access of predicted measurement matrix H_.
Eigen::Matrix< NumType, XDim, XDim > Phi_
KalmanFilterPredictInterface(ParamType &_params)
void init(const Eigen::Matrix< NumType, XDim, 1 > &_x0)
Initializes the state vector and triggers initialization of Sigma_.
Interface for simplified manipulation of specialized (Extended) Kalman Filter updates. To be used with KalmanFilterPredictInterface.
Interface for simplified manipulation of specialized (Extended) Kalman Filter prediction part...
std::tuple< KFUpdateType... > updaters_
Container.
void init(const Eigen::Matrix< NumType, XDim, 1 > &_x0, const Eigen::Matrix< NumType, XDim, XDim > &_Sigma0)
Initializes state and covariance of filter.
Eigen::Matrix< NumType, XDim, XDim > Q_
to the state variables
const Eigen::Matrix< typename KFPredType::NumericalType, HDim, HDim > & R() const
Const access of measurement noise matrix R_.
const Eigen::Matrix< NumType, XDim, XDim > & Sigma() const
State covariance matrix const access.
ParamType & params_
Filter parameters.
Eigen::Matrix< NumType, XDim, XDim > Sigma_
State covariance matrix
Minimal cass implementing the Extended Kalman Filter algorithm.
KalmanFilterInterface(typename KFPredType::ParamsType &_params)
void predict(const Eigen::Matrix< NumType, UDim, 1 > &_u, const double &_Ta)
Performs the prediction step.
KalmanFilter & operator=(const KalmanFilter &)=default
virtual ~KalmanFilter()=default
ParamType ParamsType
Parameter type.