1 #ifndef __KALMAN_FILTER_HPP__
2 #define __KALMAN_FILTER_HPP__
5 #include <Eigen/Geometry>
10 namespace KalmanFilter {
12 template <
unsigned int SIZE>
21 Eigen::Matrix<double,SIZE,1>
x;
24 Eigen::Matrix<double, SIZE, SIZE>
P;
31 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
37 x = Eigen::Matrix<double,SIZE,1>::Zero();
38 P = Eigen::Matrix<double, SIZE, SIZE>::Zero();
53 Eigen::Matrix<double, SIZE, SIZE> Q,
58 x = ( Eigen::Matrix<double, SIZE, SIZE>::Identity() + F * dt + F * dt * dt / 2 ) *
x;
61 P =
P + (F *
P +
P * F.transpose()) * dt + F *
P * F.transpose() * dt * dt + Q * dt;
71 template<
unsigned int INPUT_SIZE>
73 Eigen::Matrix<double,SIZE ,INPUT_SIZE> B,
74 Eigen::Matrix<double, SIZE, SIZE> F,
75 Eigen::Matrix<double, SIZE, SIZE> Q )
82 P = F*
P*F.transpose() + Q;
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)
98 Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = p - H*
x;
100 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = H*
P*H.transpose()+R;
102 Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K =
P*H.transpose()*S.inverse();
106 P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*H)*
P;
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)
127 template <
unsigned int MEASUREMENT_SIZE>
129 Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> H,
130 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
133 return (H*
P*H.transpose()+R);
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)
150 P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*H)*
P;
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 )
164 return (
P*H.transpose()*S.inverse());
174 template <
unsigned int MEASUREMENT_SIZE,
unsigned int DEGREE_OF_FREEDOM >
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 )
184 Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = innovation<MEASUREMENT_SIZE>( p, H );
187 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = innovationCovariance<MEASUREMENT_SIZE>(H, R);
189 bool reject_observation;
191 if ( chi_square_reject_threshold!=0 )
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 );
198 reject_observation =
false;
200 if(!reject_observation)
204 Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K = gain<MEASUREMENT_SIZE>( H, S );
207 update<MEASUREMENT_SIZE>( H, K, y);
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