pose_ekf
KalmanFilter.hpp
Go to the documentation of this file.
1 #ifndef __KALMAN_FILTER_HPP__
2 #define __KALMAN_FILTER_HPP__
3 
4 #include <Eigen/Core>
5 #include <Eigen/Geometry>
6 #include "FaultDetection.hpp"
7 
8 #include <iostream>
9 
10 namespace KalmanFilter {
11 
12 template <unsigned int SIZE>
13 class KF
14  {
15 
16  public:
17 
21  Eigen::Matrix<double,SIZE,1> x;
22 
24  Eigen::Matrix<double, SIZE, SIZE> P;
25 
28 
29  public:
31  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
32 
33  KF()
34  {
35 
37  x = Eigen::Matrix<double,SIZE,1>::Zero();
38  P = Eigen::Matrix<double, SIZE, SIZE>::Zero();
39 
40  }
41 
42  ~KF()
43  {
44  delete chi_square;
45  }
46 
52  void predictionDiscrete(Eigen::Matrix<double, SIZE, SIZE> F,
53  Eigen::Matrix<double, SIZE, SIZE> Q,
54  double dt)
55  {
56 
57  //State transition
58  x = ( Eigen::Matrix<double, SIZE, SIZE>::Identity() + F * dt + F * dt * dt / 2 ) * x;
59 
60  //covariance update
61  P = P + (F * P + P * F.transpose()) * dt + F * P * F.transpose() * dt * dt + Q * dt;
62 
63  }
64 
71  template<unsigned int INPUT_SIZE>
72  void prediction(Eigen::Matrix<double, INPUT_SIZE, 1> u,
73  Eigen::Matrix<double,SIZE ,INPUT_SIZE> B,
74  Eigen::Matrix<double, SIZE, SIZE> F,
75  Eigen::Matrix<double, SIZE, SIZE> Q )
76  {
77 
78  //State transition
79  x=F*x+B*u;
80 
81  //covariance update
82  P = F*P*F.transpose() + Q;
83 
84  }
85 
86 
92  template<unsigned int MEASUREMENT_SIZE>
93  void correction( Eigen::Matrix<double, MEASUREMENT_SIZE, 1> p,
94  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H,
95  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
96  {
97  // innovation
98  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = p - H*x;
99  //innovation covariance
100  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = H*P*H.transpose()+R;
101  //gain
102  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K = P*H.transpose()*S.inverse();
103  //update
104  x = x + K*y;
105 
106  P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*H)*P;
107 
108 
109  }
110 
111 
112  template <unsigned int MEASUREMENT_SIZE>
113  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> innovation( Eigen::Matrix<double, MEASUREMENT_SIZE, 1> p,
114  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H)
115  {
116 
117  return (p - H*x);
118 
119  }
120 
127  template <unsigned int MEASUREMENT_SIZE>
128  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> innovationCovariance(
129  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H,
130  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
131  {
132 
133  return (H*P*H.transpose()+R);
134 
135  }
136 
142  template <unsigned int MEASUREMENT_SIZE>
143  void update( Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H,
144  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K,
145  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y)
146  {
147 
148  x = x + K*y;
149 
150  P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*H)*P;
151 
152  }
153 
157  template <unsigned int MEASUREMENT_SIZE>
158  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> gain(
159  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H,
160  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S )
161  {
162 
163  // correct the estimate and covariance according to measurement
164  return (P*H.transpose()*S.inverse());
165 
166  }
174  template < unsigned int MEASUREMENT_SIZE, unsigned int DEGREE_OF_FREEDOM >
175  bool correctionChiSquare(const Eigen::Matrix<double, MEASUREMENT_SIZE, 1> &p,
176  const Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> &R,
177  const Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> &H,
178  float chi_square_reject_threshold )
179  {
180  //filter->P = P;
181  //filter->x = x.vector();
182  //innovation steps
183  // innovation
184  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = innovation<MEASUREMENT_SIZE>( p, H );
185 
186  // innovation covariance matrix
187  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = innovationCovariance<MEASUREMENT_SIZE>(H, R);
188 
189  bool reject_observation;
190  //test to reject data
191  if ( chi_square_reject_threshold!=0 )
192  {
193 
194  reject_observation = chi_square->rejectData<DEGREE_OF_FREEDOM>(y.head(DEGREE_OF_FREEDOM), S.block(0,0,DEGREE_OF_FREEDOM,DEGREE_OF_FREEDOM) ,chi_square_reject_threshold );
195 
196  }
197  else
198  reject_observation = false;
199 
200  if(!reject_observation)
201  {
202 
203  //Kalman Gain
204  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K = gain<MEASUREMENT_SIZE>( H, S );
205 
206  //update teh state
207  update<MEASUREMENT_SIZE>( H, K, y);
208 
209  return false;
210 
211  }
212  else
213  {
214 
215 // std::cout<< " Rejected Observation " << std::endl;
216  return true;
217 
218  }
219 
220  }
221 
222  };
223 }
224 
225 #endif
void update(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > H, Eigen::Matrix< double, SIZE, MEASUREMENT_SIZE > K, Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > y)
Definition: KalmanFilter.hpp:143
pose_ekf::ChiSquared * chi_square
Definition: KalmanFilter.hpp:27
Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > innovationCovariance(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > R)
Definition: KalmanFilter.hpp:128
EIGEN_MAKE_ALIGNED_OPERATOR_NEW KF()
Definition: KalmanFilter.hpp:33
Definition: FaultDetection.hpp:10
bool rejectData(Eigen::Matrix< double, DEGREE_OF_FREEDOM, 1 > innovation, Eigen::Matrix< double, DEGREE_OF_FREEDOM, DEGREE_OF_FREEDOM > innovation_covariance, float threshold)
Definition: FaultDetection.hpp:18
void prediction(Eigen::Matrix< double, INPUT_SIZE, 1 > u, Eigen::Matrix< double, SIZE, INPUT_SIZE > B, Eigen::Matrix< double, SIZE, SIZE > F, Eigen::Matrix< double, SIZE, SIZE > Q)
Definition: KalmanFilter.hpp:72
Eigen::Matrix< double, SIZE, SIZE > P
Definition: KalmanFilter.hpp:24
~KF()
Definition: KalmanFilter.hpp:42
bool correctionChiSquare(const Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > &p, const Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > &R, const Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > &H, float chi_square_reject_threshold)
Definition: KalmanFilter.hpp:175
Definition: KalmanFilter.hpp:13
Eigen::Matrix< double, SIZE, MEASUREMENT_SIZE > gain(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > S)
Definition: KalmanFilter.hpp:158
Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > innovation(Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > p, Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > H)
Definition: KalmanFilter.hpp:113
Eigen::Matrix< double, SIZE, 1 > x
Definition: KalmanFilter.hpp:21
void correction(Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > p, Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > R)
Definition: KalmanFilter.hpp:93
void predictionDiscrete(Eigen::Matrix< double, SIZE, SIZE > F, Eigen::Matrix< double, SIZE, SIZE > Q, double dt)
Definition: KalmanFilter.hpp:52