1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #ifndef KALMAN_FILTER_CPP
- #define KALMAN_FILTER_CPP
- #include "KalmanFilter.h"
- CKalmanFilter::CKalmanFilter()
- {
- m_pCar = NULL;
- if(m_pCar == NULL){
- m_pCar = new Car;
- }
- m_bFlag = false;
- m_nCounts = 0;
- }
- CKalmanFilter::~CKalmanFilter()
- {
- if(m_pCar){
- delete m_pCar;
- m_pCar = NULL;
- }
- }
- /*
- * 函数名:Initial
- * 卡尔曼初始化条件
- *
- * param:
- * car
- * t
- *
- * return:
- * 无
- *
- */
- void CKalmanFilter::Initial(double t)
- {
- //t = 0.5;
- m_pCar->A.setIdentity(READER_NUMS, READER_NUMS);
- m_pCar->A(0, 1) = t;
- m_pCar->A(2, 3) = t;
- m_pCar->x.setZero(READER_NUMS, 1);
- m_pCar->P.setZero(READER_NUMS, READER_NUMS);
- m_pCar->P(0, 0) = 8000; //8000
- m_pCar->P(1, 1) = 10;
- m_pCar->P(2, 2) = 8000; //8000
- m_pCar->P(3, 3) = 10;
- m_pCar->Q.setZero(READER_NUMS, READER_NUMS);
- m_pCar->Q(0, 0) = 2.5;
- m_pCar->Q(1, 1) = 0.1;
- m_pCar->Q(2, 2) = 2.5;
- m_pCar->Q(3, 3) = 0.1;
- m_pCar->H.setIdentity(OBSERVATION_NUMS, OBSERVATION_NUMS);
- m_pCar->z.setZero(OBSERVATION_NUMS, 1);
- m_pCar->R.setIdentity(OBSERVATION_NUMS, OBSERVATION_NUMS);
- m_pCar->t = 0;
- }
- /*
- * 函数功能:没有定位成功时调用
- *
- * param
- * t 间隔时间
- *
- * return
- * 无
- */
- void CKalmanFilter::Predict(double t)
- {
- //t = 0.5;
- //predict
- m_pCar->A(0,1) = t;
- m_pCar->A(2,3) = t;
- m_pCar->x = m_pCar->A * m_pCar->x;
- m_pCar->P = m_pCar->A * m_pCar->P *(m_pCar->A).adjoint() + m_pCar->Q;
- }
- /*
- * 定位成功调用
- */
- void CKalmanFilter::Predict_Correct(double t)
- {
- //t = 0.5;
- //predict
- Predict(t);
- //correct
- Eigen::MatrixXd K = m_pCar->P * m_pCar->H.adjoint() * (m_pCar->H * m_pCar->P *m_pCar->H.adjoint() + m_pCar->R).inverse();
- m_pCar->x = m_pCar->x + K * (m_pCar->z - m_pCar->H * m_pCar->x);
- m_pCar->P = m_pCar->P - K * m_pCar->H * m_pCar->P;
- }
- #endif
|