1 #ifndef TAG_FILTERKALMANFILTER_H
2 #define TAG_FILTERKALMANFILTER_H
5 #include <TooN/helpers.h>
6 #include <TooN/Cholesky.h>
83 template<
class State,
class Model>
98 const TooN::Matrix<State::STATE_DIMENSION> & A =
model.getJacobian(
state, dt );
99 state.covariance = A *
state.covariance * A.T() +
model.getNoiseCovariance( dt );
100 TooN::Symmetrize(
state.covariance);
106 template<
class Measurement>
void filter(Measurement & m){
107 const TooN::Matrix<Measurement::M_DIMENSION,State::STATE_DIMENSION> & H = m.getMeasurementJacobian(
state );
108 const TooN::Matrix<Measurement::M_DIMENSION> & R = m.getMeasurementCovariance(
state );
109 const TooN::Vector<Measurement::M_DIMENSION> & innovation = m.getInnovation(
state );
110 const TooN::Matrix<State::STATE_DIMENSION, Measurement::M_DIMENSION> P12 =
state.covariance * H.T();
111 TooN::Cholesky<Measurement::M_DIMENSION> denom(H * P12 + R);
112 state.covariance =
state.covariance - P12 * denom.backsub(P12.T());
114 const TooN::Vector<State::STATE_DIMENSION> stateInnovation = P12 * denom.backsub(innovation);
115 model.updateFromMeasurement(
state, stateInnovation );