TooN Algorithm Library - tag  0.2
kalmanfilter.h
Go to the documentation of this file.
1 #ifndef TAG_FILTERKALMANFILTER_H
2 #define TAG_FILTERKALMANFILTER_H
3 
4 #include <TooN/TooN.h>
5 #include <TooN/helpers.h>
6 #include <TooN/Cholesky.h>
7 
8 namespace tag {
9 
83 template<class State, class Model>
85 public:
86 
87  typedef State state_type;
88  typedef Model model_type;
89 
91  identity = TooN::Identity;
92  }
93 
96  void predict(double dt){
97  //state.covariance = TooN::transformCovariance(model.getJacobian( state, dt ), state.covariance) + model.getNoiseCovariance( dt );
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);
101  model.updateState( state, dt );
102  }
103 
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());
113  // TooN::Symmetrize(state.covariance); // not necessary, above seems to be good enough
114  const TooN::Vector<State::STATE_DIMENSION> stateInnovation = P12 * denom.backsub(innovation);
115  model.updateFromMeasurement( state, stateInnovation );
116  }
117 
119  TooN::Matrix<State::STATE_DIMENSION> identity;
121  State state;
123  Model model;
124 };
125 
126 } // namespace tag
127 
128 #endif