PosVelEKF.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "PosVelEKF.h"
  2. #include <math.h>
  3. #include <string.h>
  4. #define POSVELEKF_POS_CALC_NIS(__P, __R, __X, __Z, __RET_NIS) \
  5. __RET_NIS = ((-__X[0] + __Z)*(-__X[0] + __Z))/(__P[0] + __R);
  6. #define POSVELEKF_POS_CALC_STATE(__P, __R, __X, __Z, __RET_STATE) \
  7. __RET_STATE[0] = __P[0]*(-__X[0] + __Z)/(__P[0] + __R) + __X[0]; __RET_STATE[1] = __P[1]*(-__X[0] + \
  8. __Z)/(__P[0] + __R) + __X[1];
  9. #define POSVELEKF_POS_CALC_COV(__P, __R, __X, __Z, __RET_COV) \
  10. __RET_COV[0] = ((__P[0])*(__P[0]))*__R/((__P[0] + __R)*(__P[0] + __R)) + __P[0]*((-__P[0]/(__P[0] + \
  11. __R) + 1)*(-__P[0]/(__P[0] + __R) + 1)); __RET_COV[1] = __P[0]*__P[1]*__R/((__P[0] + __R)*(__P[0] + \
  12. __R)) - __P[0]*__P[1]*(-__P[0]/(__P[0] + __R) + 1)/(__P[0] + __R) + __P[1]*(-__P[0]/(__P[0] + __R) + \
  13. 1); __RET_COV[2] = ((__P[1])*(__P[1]))*__R/((__P[0] + __R)*(__P[0] + __R)) - \
  14. ((__P[1])*(__P[1]))/(__P[0] + __R) - __P[1]*(-__P[0]*__P[1]/(__P[0] + __R) + __P[1])/(__P[0] + __R) + \
  15. __P[2];
  16. #define POSVELEKF_PREDICTION_CALC_STATE(__P, __DT, __DV, __DV_NOISE, __X, __RET_STATE) \
  17. __RET_STATE[0] = __DT*__X[1] + __X[0]; __RET_STATE[1] = __DV + __X[1];
  18. #define POSVELEKF_PREDICTION_CALC_COV(__P, __DT, __DV, __DV_NOISE, __X, __RET_COV) \
  19. __RET_COV[0] = __DT*__P[1] + __DT*(__DT*__P[2] + __P[1]) + __P[0]; __RET_COV[1] = __DT*__P[2] + \
  20. __P[1]; __RET_COV[2] = ((__DV_NOISE)*(__DV_NOISE)) + __P[2];
  21. #define POSVELEKF_VEL_CALC_NIS(__P, __R, __X, __Z, __RET_NIS) \
  22. __RET_NIS = ((-__X[1] + __Z)*(-__X[1] + __Z))/(__P[2] + __R);
  23. #define POSVELEKF_VEL_CALC_STATE(__P, __R, __X, __Z, __RET_STATE) \
  24. __RET_STATE[0] = __P[1]*(-__X[1] + __Z)/(__P[2] + __R) + __X[0]; __RET_STATE[1] = __P[2]*(-__X[1] + \
  25. __Z)/(__P[2] + __R) + __X[1];
  26. #define POSVELEKF_VEL_CALC_COV(__P, __R, __X, __Z, __RET_COV) \
  27. __RET_COV[0] = __P[0] + ((__P[1])*(__P[1]))*__R/((__P[2] + __R)*(__P[2] + __R)) - \
  28. ((__P[1])*(__P[1]))/(__P[2] + __R) - __P[1]*(-__P[1]*__P[2]/(__P[2] + __R) + __P[1])/(__P[2] + __R); \
  29. __RET_COV[1] = __P[1]*__P[2]*__R/((__P[2] + __R)*(__P[2] + __R)) + (-__P[2]/(__P[2] + __R) + \
  30. 1)*(-__P[1]*__P[2]/(__P[2] + __R) + __P[1]); __RET_COV[2] = ((__P[2])*(__P[2]))*__R/((__P[2] + \
  31. __R)*(__P[2] + __R)) + __P[2]*((-__P[2]/(__P[2] + __R) + 1)*(-__P[2]/(__P[2] + __R) + 1));
  32. void PosVelEKF::init(float pos, float posVar, float vel, float velVar)
  33. {
  34. _state[0] = pos;
  35. _state[1] = vel;
  36. _cov[0] = posVar;
  37. _cov[1] = 0.0f;
  38. _cov[2] = velVar;
  39. }
  40. void PosVelEKF::predict(float dt, float dVel, float dVelNoise)
  41. {
  42. float newState[2];
  43. float newCov[3];
  44. POSVELEKF_PREDICTION_CALC_STATE(_cov, dt, dVel, dVelNoise, _state, newState)
  45. POSVELEKF_PREDICTION_CALC_COV(_cov, dt, dVel, dVelNoise, _state, newCov)
  46. memcpy(_state,newState,sizeof(_state));
  47. memcpy(_cov,newCov,sizeof(_cov));
  48. }
  49. void PosVelEKF::fusePos(float pos, float posVar)
  50. {
  51. float newState[2];
  52. float newCov[3];
  53. POSVELEKF_POS_CALC_STATE(_cov, posVar, _state, pos, newState)
  54. POSVELEKF_POS_CALC_COV(_cov, posVar, _state, pos, newCov)
  55. memcpy(_state,newState,sizeof(_state));
  56. memcpy(_cov,newCov,sizeof(_cov));
  57. }
  58. void PosVelEKF::fuseVel(float vel, float velVar)
  59. {
  60. float newState[2];
  61. float newCov[3];
  62. POSVELEKF_VEL_CALC_STATE(_cov, velVar, _state, vel, newState)
  63. POSVELEKF_VEL_CALC_COV(_cov, velVar, _state, vel, newCov)
  64. memcpy(_state,newState,sizeof(_state));
  65. memcpy(_cov,newCov,sizeof(_cov));
  66. }
  67. float PosVelEKF::getPosNIS(float pos, float posVar)
  68. {
  69. float ret;
  70. POSVELEKF_POS_CALC_NIS(_cov, posVar, _state, pos, ret)
  71. return ret;
  72. }