KalmanFilter.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #ifndef KALMAN_FILTER_CPP
  2. #define KALMAN_FILTER_CPP
  3. #include "KalmanFilter.h"
  4. CKalmanFilter::CKalmanFilter()
  5. {
  6. m_pCar = NULL;
  7. if(m_pCar == NULL){
  8. m_pCar = new Car;
  9. }
  10. //m_pCar->InitMatrix();
  11. m_bFlag = false;
  12. m_nCounts = 0;
  13. }
  14. CKalmanFilter::~CKalmanFilter()
  15. {
  16. if(m_pCar){
  17. delete m_pCar;
  18. m_pCar = NULL;
  19. }
  20. }
  21. /*
  22. * 函数名:Initial
  23. * 卡尔曼初始化条件
  24. *
  25. * param:
  26. * car
  27. * t
  28. *
  29. * return:
  30. * 无
  31. *
  32. */
  33. void CKalmanFilter::Initial(double t)
  34. {
  35. //t = 0.5;
  36. m_pCar->A.setIdentity(READER_NUMS, READER_NUMS);
  37. m_pCar->A(0, 1) = t;
  38. m_pCar->A(2, 3) = t;
  39. m_pCar->x.setZero(READER_NUMS, 1);
  40. m_pCar->P.setZero(READER_NUMS, READER_NUMS);
  41. m_pCar->P(0, 0) = 8000;
  42. m_pCar->P(1, 1) = 10;
  43. m_pCar->P(2, 2) = 8000;
  44. m_pCar->P(3, 3) = 10;
  45. m_pCar->Q.setZero(READER_NUMS, READER_NUMS);
  46. m_pCar->Q(0, 0) = 2.5;
  47. m_pCar->Q(1, 1) = 0.1;
  48. m_pCar->Q(2, 2) = 2.5;
  49. m_pCar->Q(3, 3) = 0.1;
  50. m_pCar->H.setIdentity(OBSERVATION_NUMS, OBSERVATION_NUMS);
  51. m_pCar->z.setZero(OBSERVATION_NUMS, 1);
  52. m_pCar->R.setIdentity(OBSERVATION_NUMS, OBSERVATION_NUMS);
  53. //以下4个参数用于惯导
  54. /*m_pCar->Q(1,0) = 100;
  55. m_pCar->Q(3,2) = 100;
  56. m_pCar->R(1,1) = 0.1;
  57. m_pCar->R(3,3) = 0.1;*/
  58. m_pCar->t = 0;
  59. }
  60. /*
  61. * 没有定位成功时调用
  62. */
  63. void CKalmanFilter::Predict(double t)
  64. {
  65. //t = 0.5;
  66. //predict
  67. m_pCar->A(0,1) = t;
  68. m_pCar->A(2,3) = t;
  69. m_pCar->x = m_pCar->A * m_pCar->x;
  70. m_pCar->P = m_pCar->A * m_pCar->P *(m_pCar->A).adjoint() + m_pCar->Q;
  71. }
  72. /*
  73. * 定位成功调用
  74. */
  75. void CKalmanFilter::Predict_Correct(double t)
  76. {
  77. //t = 0.5;
  78. //predict
  79. Predict(t);
  80. //correct
  81. Eigen::MatrixXd K = m_pCar->P * m_pCar->H.adjoint() * (m_pCar->H * m_pCar->P *m_pCar->H.adjoint() + m_pCar->R).inverse();
  82. m_pCar->x = m_pCar->x + K * (m_pCar->z - m_pCar->H * m_pCar->x);
  83. //m_pCar->P = m_pCar->P - K * m_pCar->H * m_pCar->P.adjoint();
  84. m_pCar->P = m_pCar->P - K * m_pCar->H * m_pCar->P;
  85. }
  86. #endif