1+ #include " ca_motion_model.h"
2+
3+ namespace kf
4+ {
5+ namespace motionmodel
6+ {
7+
8+ Vector<DIM_X_CA > CaMotionModel::f (Vector<DIM_X_CA > const & vecX,
9+ float32_t dt) const
10+ {
11+ // State transition model for constant acceleration (CA) motion model
12+ // [ pos_x ] [ 1 0 dt 0 dt^2/2 0 ] [ pos_x ] [ q1 ]
13+ // [ pos_y ] = [ 0 1 0 dt 0 dt^2/2 ] [ pos_y ] + [ q2 ]
14+ // [ vel_x ] [ 0 0 1 0 dt 0 ] [ vel_x ] [ q3 ]
15+ // [ vel_y ] [ 0 0 0 1 0 dt ] [ vel_y ] [ q4 ]
16+ // [ acc_x ] [ 0 0 0 0 1 0 ] [ acc_x ] [ q5 ]
17+ // [ acc_y ] [ 0 0 0 0 0 1 ] [ acc_y ] [ q6 ]
18+
19+ float32_t const halfDeltaT2{dt * dt / 2 .0F };
20+
21+ Vector<DIM_X_CA > vecXPred;
22+ vecXPred[IDX_PX ] =
23+ vecX[IDX_PX ] + vecX[IDX_VX ] * dt + vecX[IDX_AX ] * halfDeltaT2;
24+ vecXPred[IDX_PY ] =
25+ vecX[IDX_PY ] + vecX[IDX_VY ] * dt + vecX[IDX_AY ] * halfDeltaT2;
26+ vecXPred[IDX_VX ] = vecX[IDX_VX ] + vecX[IDX_AX ] * dt;
27+ vecXPred[IDX_VY ] = vecX[IDX_VY ] + vecX[IDX_AY ] * dt;
28+ vecXPred[IDX_AX ] = vecX[IDX_AX ];
29+ vecXPred[IDX_AY ] = vecX[IDX_AY ];
30+
31+ return vecXPred;
32+ }
33+
34+ Matrix<DIM_X_CA , DIM_X_CA > CaMotionModel::getProcessNoiseCov (
35+ Vector<DIM_X_CA > const & /* vecX*/ , float32_t dt) const
36+ {
37+ // Q = sigma^2*[T^5/20 0 T^4/8 0 T^3/6 0;
38+ // 0 T^5/20 0 T^4/8 0 T^3/6;
39+ // T^4/8 0 T^3/3 0 T^2/2 0;
40+ // 0 T^4/8 0 T^2/2 0 T^2/2;
41+ // T^3/6 0 T^2/2 0 T 0;
42+ // 0 T^3/6 0 T^2/2 0 T;
43+ // ];
44+
45+ Matrix<DIM_X_CA , DIM_X_CA > matQ;
46+
47+ const float32_t sigma2{m_processNoiseVec[0 ] * m_processNoiseVec[0 ]};
48+ const float32_t dt2{dt * dt};
49+ const float32_t dt3{dt2 * dt};
50+ const float32_t dt4{dt2 * dt2};
51+ const float32_t dt5{dt4 * dt};
52+
53+ matQ (IDX_PX , IDX_PX ) = sigma2 * dt5 / 20 .0F ;
54+ matQ (IDX_PX , IDX_PY ) = 0 .0F ;
55+ matQ (IDX_PX , IDX_VX ) = sigma2 * dt4 / 8 .0F ;
56+ matQ (IDX_PX , IDX_VY ) = 0 .0F ;
57+ matQ (IDX_PX , IDX_AX ) = sigma2 * dt3 / 6 .0F ;
58+ matQ (IDX_PX , IDX_AY ) = 0 .0F ;
59+
60+ matQ (IDX_PY , IDX_PX ) = 0 .0F ;
61+ matQ (IDX_PY , IDX_PY ) = sigma2 * dt5 / 20 .0F ;
62+ matQ (IDX_PY , IDX_VX ) = 0 .0F ;
63+ matQ (IDX_PY , IDX_VY ) = sigma2 * dt4 / 8 .0F ;
64+ matQ (IDX_PY , IDX_AX ) = 0 .0F ;
65+ matQ (IDX_PY , IDX_AY ) = sigma2 * dt3 / 6 .0F ;
66+
67+ matQ (IDX_VX , IDX_PX ) = sigma2 * dt4 / 8 .0F ;
68+ matQ (IDX_VX , IDX_PY ) = 0 .0F ;
69+ matQ (IDX_VX , IDX_VX ) = sigma2 * dt3 / 3 .0F ;
70+ matQ (IDX_VX , IDX_VY ) = 0 .0F ;
71+ matQ (IDX_VX , IDX_AX ) = sigma2 * dt2 / 2 .0F ;
72+ matQ (IDX_VX , IDX_AY ) = 0 .0F ;
73+
74+ matQ (IDX_VY , IDX_PX ) = 0 .0F ;
75+ matQ (IDX_VY , IDX_PY ) = sigma2 * dt4 / 8 .0F ;
76+ matQ (IDX_VY , IDX_VX ) = 0 .0F ;
77+ matQ (IDX_VY , IDX_VY ) = sigma2 * dt2 / 2 .0F ;
78+ matQ (IDX_VY , IDX_AX ) = 0 .0F ;
79+ matQ (IDX_VY , IDX_AY ) = sigma2 * dt2 / 2 .0F ;
80+
81+ matQ (IDX_AX , IDX_PX ) = sigma2 * dt3 / 6 .0F ;
82+ matQ (IDX_AX , IDX_PY ) = 0 .0F ;
83+ matQ (IDX_AX , IDX_VX ) = sigma2 * dt2 / 2 .0F ;
84+ matQ (IDX_AX , IDX_VY ) = 0 .0F ;
85+ matQ (IDX_AX , IDX_AX ) = sigma2 * dt;
86+ matQ (IDX_AX , IDX_AY ) = 0 .0F ;
87+
88+ matQ (IDX_AY , IDX_PX ) = 0 .0F ;
89+ matQ (IDX_AY , IDX_PY ) = sigma2 * dt3 / 6 .0F ;
90+ matQ (IDX_AY , IDX_VX ) = 0 .0F ;
91+ matQ (IDX_AY , IDX_VY ) = sigma2 * dt2 / 2 .0F ;
92+ matQ (IDX_AY , IDX_AX ) = 0 .0F ;
93+ matQ (IDX_AY , IDX_AY ) = sigma2 * dt;
94+
95+ return matQ;
96+ }
97+
98+ Matrix<DIM_X_CA , DIM_X_CA > CaMotionModel::getJacobianFk (
99+ Vector<DIM_X_CA > const & vecX, float32_t dt) const
100+ {
101+ // State transition model for constant acceleration (CA) motion model
102+ // [ pos_x ] [ 1 0 dt 0 dt^2/2 0 ] [ pos_x ]
103+ // [ pos_y ] = [ 0 1 0 dt 0 dt^2/2 ] [ pos_y ]
104+ // [ vel_x ] [ 0 0 1 0 dt 0 ] [ vel_x ]
105+ // [ vel_y ] [ 0 0 0 1 0 dt ] [ vel_y ]
106+ // [ acc_x ] [ 0 0 0 0 1 0 ] [ acc_x ]
107+ // [ acc_y ] [ 0 0 0 0 0 1 ] [ acc_y ]
108+
109+ float32_t const halfdt2{0 .5F * dt * dt};
110+
111+ Matrix<DIM_X_CA , DIM_X_CA > matFk;
112+ matFk (IDX_PX , IDX_PX ) = 1 .0F ;
113+ matFk (IDX_PX , IDX_PY ) = 0 .0F ;
114+ matFk (IDX_PX , IDX_VX ) = dt;
115+ matFk (IDX_PX , IDX_VY ) = 0 .0F ;
116+ matFk (IDX_PX , IDX_AX ) = halfdt2;
117+ matFk (IDX_PX , IDX_AY ) = 0 .0F ;
118+
119+ matFk (IDX_PY , IDX_PX ) = 0 .0F ;
120+ matFk (IDX_PY , IDX_PY ) = 1 .0F ;
121+ matFk (IDX_PY , IDX_VX ) = 0 .0F ;
122+ matFk (IDX_PY , IDX_VY ) = dt;
123+ matFk (IDX_PY , IDX_AX ) = 0 .0F ;
124+ matFk (IDX_PY , IDX_AY ) = halfdt2;
125+
126+ matFk (IDX_VX , IDX_PX ) = 0 .0F ;
127+ matFk (IDX_VX , IDX_PY ) = 0 .0F ;
128+ matFk (IDX_VX , IDX_VX ) = 1 .0F ;
129+ matFk (IDX_VX , IDX_VY ) = 0 .0F ;
130+ matFk (IDX_VX , IDX_AX ) = dt;
131+ matFk (IDX_VX , IDX_AY ) = 0 .0F ;
132+
133+ matFk (IDX_VY , IDX_PX ) = 0 .0F ;
134+ matFk (IDX_VY , IDX_PY ) = 0 .0F ;
135+ matFk (IDX_VY , IDX_VX ) = 0 .0F ;
136+ matFk (IDX_VY , IDX_VY ) = 1 .0F ;
137+ matFk (IDX_VY , IDX_AX ) = 0 .0F ;
138+ matFk (IDX_VY , IDX_AY ) = dt;
139+
140+ matFk (IDX_AX , IDX_PX ) = 0 .0F ;
141+ matFk (IDX_AX , IDX_PY ) = 0 .0F ;
142+ matFk (IDX_AX , IDX_VX ) = 0 .0F ;
143+ matFk (IDX_AX , IDX_VY ) = 0 .0F ;
144+ matFk (IDX_AX , IDX_AX ) = 1 .0F ;
145+ matFk (IDX_AX , IDX_AY ) = 0 .0F ;
146+
147+ matFk (IDX_AY , IDX_PX ) = 0 .0F ;
148+ matFk (IDX_AY , IDX_PY ) = 0 .0F ;
149+ matFk (IDX_AY , IDX_VX ) = 0 .0F ;
150+ matFk (IDX_AY , IDX_VY ) = 0 .0F ;
151+ matFk (IDX_AY , IDX_AX ) = 0 .0F ;
152+ matFk (IDX_AY , IDX_AY ) = 1 .0F ;
153+
154+ return matFk;
155+ }
156+
157+ } // namespace motionmodel
158+ } // namespace kf
0 commit comments