pose_ekf
ExtendedKalmanFilter.hpp
Go to the documentation of this file.
1 #ifndef __EXTENDED_KALMAN_FILTER_HPP__
2 #define __EXTENDED_KALMAN_FILTER_HPP__
3 
4 #include <Eigen/Core>
5 #include <Eigen/Geometry>
6 #include "FaultDetection.hpp"
7 
8 namespace ExtendedKalmanFilter {
9 
10 template <unsigned int SIZE>
11 class EKF
12  {
13 
14  public:
16  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
17 
19  Eigen::Matrix<double,SIZE,1> x;
20 
22  Eigen::Matrix<double, SIZE, SIZE> P;
23 
26 
27  public:
28 
29  EKF()
30  {
31 
33  x = Eigen::Matrix<double,SIZE,1>::Zero();
34  P = Eigen::Matrix<double, SIZE, SIZE>::Zero();
35 
36  }
37 
38  ~EKF()
39  {
40  delete chi_square;
41  }
42 
47  void prediction(Eigen::Matrix<double, SIZE, 1> f,
48  Eigen::Matrix<double, SIZE, SIZE> J_F,
49  Eigen::Matrix<double, SIZE, SIZE> Q )
50  {
51 
52  //State transition
53  x=f;
54 
55  //covariance update
56  P = J_F*P*J_F.transpose() + Q;
57 
58  }
59 
64  template <unsigned int MEASUREMENT_SIZE>
65  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> innovation( Eigen::Matrix<double, MEASUREMENT_SIZE, 1> p,
66  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> h)
67  {
68 
69  return (p - h);
70 
71  }
72 
79  template <unsigned int MEASUREMENT_SIZE>
80  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> innovationCovariance(
81  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> J_H,
82  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
83  {
84 
85  return (J_H*P*J_H.transpose()+R);
86 
87  }
88 
94  template <unsigned int MEASUREMENT_SIZE>
95  void update( Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> J_H,
96  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K,
97  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y)
98  {
99 
100  x = x + K*y;
101 
102  P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*J_H)*P;
103 
104  }
105 
109  template <unsigned int MEASUREMENT_SIZE>
110  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> gain(
111  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> J_H,
112  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S )
113  {
114 
115  // correct the estimate and covariance according to measurement
116  return (P*J_H.transpose()*S.inverse());
117 
118  }
119 
126  template <unsigned int MEASUREMENT_SIZE>
127  void correction( Eigen::Matrix<double, MEASUREMENT_SIZE, 1> p,
128  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> h,
129  Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> J_H,
130  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
131  {
132 
134  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y;
135 
137  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S;
138 
140  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K;
141 
142  y = p - h;
143 
144  S = J_H*P*J_H.transpose()+R;
145 
146  // correct the estimate and covariance according to measurement
147  K = P*J_H.transpose()*S.inverse();
148 
149  x = x + K*y;
150 
151  P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*J_H)*P;
152 
153  }
154 
155  template < unsigned int MEASUREMENT_SIZE, unsigned int DEGREE_OF_FREEDOM >
156  bool correctionChiSquare(const Eigen::Matrix<double, MEASUREMENT_SIZE, 1> &p,
157  const Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> &R,
158  const Eigen::Matrix<double, MEASUREMENT_SIZE, 1> &h,
159  const Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> &J_H,
160  float reject_threshold )
161  {
162 
163  //innovation steps
164  // innovation
165  Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = innovation<MEASUREMENT_SIZE>( p, h );
166 
167  // innovation covariance matrix
168  Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = innovationCovariance<MEASUREMENT_SIZE>(J_H, R);
169 
170  bool reject_observation;
171  //test to reject data
172  if ( reject_threshold!=0 )
173  {
174 
175  reject_observation = chi_square->rejectData<DEGREE_OF_FREEDOM>(y.head(DEGREE_OF_FREEDOM), S.block(0,0,DEGREE_OF_FREEDOM,DEGREE_OF_FREEDOM) ,reject_threshold );
176 
177  }
178  else
179  reject_observation = false;
180 
181  if(!reject_observation)
182  {
183 
184  //Kalman Gain
185  Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K = gain<MEASUREMENT_SIZE>( J_H, S );
186 
187  //update teh state
188  update<MEASUREMENT_SIZE>( J_H, K, y);
189 
190  return false;
191 
192  }
193  else
194  {
195  return true;
196  }
197 
198  }
199 
200  };
201 }
202 
203 #endif
Definition: ExtendedKalmanFilter.hpp:11
Eigen::Matrix< double, SIZE, MEASUREMENT_SIZE > gain(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > J_H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > S)
Definition: ExtendedKalmanFilter.hpp:110
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, 1 > &h, const Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > &J_H, float reject_threshold)
Definition: ExtendedKalmanFilter.hpp:156
Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > innovation(Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > p, Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > h)
Definition: ExtendedKalmanFilter.hpp:65
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
EKF()
Definition: ExtendedKalmanFilter.hpp:29
Eigen::Matrix< double, SIZE, SIZE > P
Definition: ExtendedKalmanFilter.hpp:22
void correction(Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > p, Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > h, Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > J_H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > R)
Definition: ExtendedKalmanFilter.hpp:127
~EKF()
Definition: ExtendedKalmanFilter.hpp:38
void update(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > J_H, Eigen::Matrix< double, SIZE, MEASUREMENT_SIZE > K, Eigen::Matrix< double, MEASUREMENT_SIZE, 1 > y)
Definition: ExtendedKalmanFilter.hpp:95
void prediction(Eigen::Matrix< double, SIZE, 1 > f, Eigen::Matrix< double, SIZE, SIZE > J_F, Eigen::Matrix< double, SIZE, SIZE > Q)
Definition: ExtendedKalmanFilter.hpp:47
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Matrix< double, SIZE, 1 > x
Definition: ExtendedKalmanFilter.hpp:19
Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > innovationCovariance(Eigen::Matrix< double, MEASUREMENT_SIZE, SIZE > J_H, Eigen::Matrix< double, MEASUREMENT_SIZE, MEASUREMENT_SIZE > R)
Definition: ExtendedKalmanFilter.hpp:80
pose_ekf::ChiSquared * chi_square
Definition: ExtendedKalmanFilter.hpp:25