1 #ifndef __EXTENDED_KALMAN_FILTER_HPP__ 2 #define __EXTENDED_KALMAN_FILTER_HPP__ 5 #include <Eigen/Geometry> 10 template <
unsigned int SIZE>
16 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
19 Eigen::Matrix<double,SIZE,1>
x;
22 Eigen::Matrix<double, SIZE, SIZE>
P;
33 x = Eigen::Matrix<double,SIZE,1>::Zero();
34 P = Eigen::Matrix<double, SIZE, SIZE>::Zero();
48 Eigen::Matrix<double, SIZE, SIZE> J_F,
49 Eigen::Matrix<double, SIZE, SIZE> Q )
56 P = J_F*P*J_F.transpose() + Q;
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)
79 template <
unsigned int MEASUREMENT_SIZE>
81 Eigen::Matrix<double, MEASUREMENT_SIZE, SIZE> J_H,
82 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> R)
85 return (J_H*P*J_H.transpose()+R);
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)
102 P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*J_H)*P;
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 )
116 return (P*J_H.transpose()*S.inverse());
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)
134 Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y;
137 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S;
140 Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K;
144 S = J_H*P*J_H.transpose()+R;
147 K = P*J_H.transpose()*S.inverse();
151 P = (Eigen::Matrix<double, SIZE, SIZE>::Identity() - K*J_H)*P;
155 template <
unsigned int MEASUREMENT_SIZE,
unsigned int DEGREE_OF_FREEDOM >
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 )
165 Eigen::Matrix<double, MEASUREMENT_SIZE, 1> y = innovation<MEASUREMENT_SIZE>( p, h );
168 Eigen::Matrix<double, MEASUREMENT_SIZE, MEASUREMENT_SIZE> S = innovationCovariance<MEASUREMENT_SIZE>(J_H, R);
170 bool reject_observation;
172 if ( reject_threshold!=0 )
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 );
179 reject_observation =
false;
181 if(!reject_observation)
185 Eigen::Matrix<double, SIZE, MEASUREMENT_SIZE> K = gain<MEASUREMENT_SIZE>( J_H, S );
188 update<MEASUREMENT_SIZE>( J_H, K, y);
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
Definition: ExtendedKalmanFilter.hpp:8
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