Skip to content

Commit de61a73

Browse files
committed
keep implementing
1 parent 973b5e8 commit de61a73

1 file changed

Lines changed: 54 additions & 76 deletions

File tree

Localization/extended_kalman_filter/extended_kalman_filter.py

Lines changed: 54 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@
1010
import math
1111
import 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
1818
Qsim = np.diag([0.5, 0.5])**2
1919
Rsim = 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
# %誤差分散円を計算し、表示する関数
@@ -53,67 +56,6 @@
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-
11759
def 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

179157
def 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

Comments
 (0)