1010import math
1111import matplotlib .pyplot as plt
1212
13- # Estimation parameter
14- Q = np .diag ([0.5 , 0.5 ])** 2
15- R = np .diag ([1 .0 , math .radians (30 .0 )])** 2
13+ # Estimation parameter of EKF
14+ Q = np .diag ([0.1 , 0.1 , math . radians ( 1.0 ), 1.0 ])** 2
15+ R = np .diag ([2 .0 , math .radians (40 .0 )])** 2
1616
1717# Simulation parameter
1818Qsim = np .diag ([0.5 , 0.5 ])** 2
1919Rsim = np .diag ([1.0 , math .radians (30.0 )])** 2
2020
21+ DT = 0.1 # time tick [s]
22+ SIM_TIME = 60.0 # simulation time [s]
23+
2124
2225# function ShowErrorEllipse(xEst,PEst)
2326# %誤差分散円を計算し、表示する関数
5356# plot(x(1,:)+xEst(1),x(2,:)+xEst(2))
5457
5558
56- # function x = f(x, u)
57- # % Motion Model
58- # global dt;
59-
60- # F = [1 0 0 0
61- # 0 1 0 0
62- # 0 0 1 0
63- # 0 0 0 0];
64-
65- # B = [
66- # dt*cos(x(3)) 0
67- # dt*sin(x(3)) 0
68- # 0 dt
69- # 1 0];
70-
71- # x= F*x+B*u;
72-
73- # function jF = jacobF(x, u)
74- # % Jacobian of Motion Model
75- # global dt;
76-
77- # jF=[
78- # 1 0 0 0
79- # 0 1 0 0
80- # -dt*u(1)*sin(x(3)) dt*u(1)*cos(x(3)) 1 0
81- # dt*cos(x(3)) dt*sin(x(3)) 0 1];
82-
83- # function z = h(x)
84- # %Observation Model
85-
86- # H = [1 0 0 0
87- # 0 1 0 0
88- # 0 0 1 0
89- # 0 0 0 1 ];
90-
91- # z=H*x;
92-
93- # function jH = jacobH(x)
94- # %Jacobian of Observation Model
95-
96- # jH =[1 0 0 0
97- # 0 1 0 0
98- # 0 0 1 0
99- # 0 0 0 1];
100-
101-
102- # function angle=Pi2Pi(angle)
103- # %ロボットの角度を-pi~piの範囲に補正する関数
104- # angle = mod(angle, 2*pi);
105-
106- # i = find(angle>pi);
107- # angle(i) = angle(i) - 2*pi;
108-
109- # i = find(angle<-pi);
110- # angle(i) = angle(i) + 2*pi;
111-
112-
113- DT = 0.1 # time tick [s]
114- SIM_TIME = 60.0 # simulation time [s]
115-
116-
11759def do_control ():
11860 v = 1.0 # [m/s]
11961 yawrate = 0.1 # [rad/s]
@@ -157,23 +99,59 @@ def motion_model(x, u):
15799 return x
158100
159101
160- def ekf_estimation (xEst , PEst , u ):
102+ def observation_model (x ):
103+ # Observation Model
104+
105+ H = np .matrix ([
106+ [1 , 0 , 0 , 0 ],
107+ [0 , 1 , 0 , 0 ]
108+ ])
109+
110+ z = H * x
111+
112+ return z
113+
114+
115+ def jacobF (x , u ):
116+ # Jacobian of Motion Model
117+ yaw = x [2 , 0 ]
118+ u1 = u [0 , 0 ]
119+ jF = np .matrix ([
120+ [1 , 0 , 0 , 0 ],
121+ [0 , 1 , 0 , 0 ],
122+ [- DT * u1 * math .sin (yaw ), DT * u1 * math .cos (yaw ), 1 , 0 ],
123+ [DT * math .cos (yaw ), DT * math .sin (yaw ), 0 , 1 ]])
124+
125+ return jF
126+
127+
128+ def jacobH (x ):
129+ # Jacobian of Observation Model
130+ jH = np .matrix ([
131+ [1 , 0 , 0 , 0 ],
132+ [0 , 1 , 0 , 0 ]
133+ ])
134+
135+ return jH
136+
137+
138+ def ekf_estimation (xEst , PEst , z , u ):
161139
162140 # Predict
163141 xPred = motion_model (xEst , u )
164- # F= jacobF(xPred, u);
165- # PPred= F* PEst*F' + Q;
142+ jF = jacobF (xPred , u )
143+ PPred = jF * PEst * jF . T + Q
166144
167145 # Update
168- # H= jacobH(xPred);
169- # y = z - h (xPred);
170- # S = H*PPred*H' + R;
171- # K = PPred*H'*inv(S);
172- # xEst = xPred + K*y;
173- xEst = xPred
174- # PEst = (eye(size (xEst,1 )) - K*H)* PPred;
146+ jH = jacobH (xPred )
147+ zPred = observation_model (xPred )
148+ y = z . T - zPred
149+ S = jH * PPred * jH . T + R
150+ K = PPred * jH . T * np . linalg . inv ( S )
151+ xEst = xPred + K * y
152+ PEst = (np . eye (len (xEst )) - K * jH ) * PPred
175153
176- return xEst
154+ return xEst , PEst
177155
178156
179157def main ():
@@ -194,7 +172,7 @@ def main():
194172
195173 xTrue , z , xDR , ud = observation (xTrue , xDR , u )
196174
197- xEst = ekf_estimation (xEst , PEst , ud )
175+ xEst , PEst = ekf_estimation (xEst , PEst , z , ud )
198176
199177 plt .plot (xTrue [0 , 0 ], xTrue [1 , 0 ], ".b" )
200178 plt .plot (xDR [0 , 0 ], xDR [1 , 0 ], ".k" )
0 commit comments