19 #ifndef SNARK_FILTER_KALMAN_FILTER_H
20 #define SNARK_FILTER_KALMAN_FILTER_H
23 #include <Eigen/Cholesky>
28 template<
class State,
class Model >
35 kalman_filter(
const State& initialstate, Model& model ) : m_state( initialstate ), m_model( model ) {}
41 const Eigen::Matrix< double, State::dimension, State::dimension >& A = m_model.jacobian( m_state, deltaT );
42 m_state.covariance = A * m_state.covariance * A.transpose() + m_model.noise_covariance( deltaT );
43 m_model.update_state( m_state, deltaT );
48 template<
class Measurement >
51 const Eigen::Matrix<double,Measurement::dimension,State::dimension>& H = m.measurement_jacobian( m_state );
52 const Eigen::Matrix<double,Measurement::dimension,Measurement::dimension>& R = m.measurement_covariance( m_state );
53 const Eigen::Matrix<double,Measurement::dimension,1>& innovation = m.innovation( m_state );
55 const Eigen::Matrix<double,State::dimension, Measurement::dimension> PHt = m_state.covariance * H.transpose();
56 const Eigen::LDLT< Eigen::Matrix<double,Measurement::dimension,Measurement::dimension> > S = ( H * PHt + R ).ldlt();
58 m_state.covariance -= PHt * S.solve( PHt.transpose() );
59 m_state.set_innovation( PHt * S.solve( innovation ) );
63 const State&
state()
const {
return m_state; }
72 #endif // SNARK_FILTER_KALMAN_FILTER_H