1
1
"""
2
2
Extended Kalman Filter SLAM example
3
+
3
4
author: Atsushi Sakai (@Atsushi_twi)
4
5
"""
5
6
@@ -35,19 +36,19 @@ def ekf_slam(xEst, PEst, u, z):
35
36
36
37
# Update
37
38
for iz in range (len (z [:, 0 ])): # for each observation
38
- minid = search_correspond_landmark_id (xEst , PEst , z [iz , 0 :2 ])
39
+ min_id = search_correspond_landmark_id (xEst , PEst , z [iz , 0 :2 ])
39
40
40
41
nLM = calc_n_lm (xEst )
41
- if minid == nLM :
42
+ if min_id == nLM :
42
43
print ("New LM" )
43
44
# Extend state and covariance matrix
44
45
xAug = np .vstack ((xEst , calc_landmark_position (xEst , z [iz , :])))
45
46
PAug = np .vstack ((np .hstack ((PEst , np .zeros ((len (xEst ), LM_SIZE )))),
46
47
np .hstack ((np .zeros ((LM_SIZE , len (xEst ))), initP ))))
47
48
xEst = xAug
48
49
PEst = PAug
49
- lm = get_landmark_position_from_state (xEst , minid )
50
- y , S , H = calc_innovation (lm , xEst , PEst , z [iz , 0 :2 ], minid )
50
+ lm = get_landmark_position_from_state (xEst , min_id )
51
+ y , S , H = calc_innovation (lm , xEst , PEst , z [iz , 0 :2 ], min_id )
51
52
52
53
K = (PEst @ H .T ) @ np .linalg .inv (S )
53
54
xEst = xEst + (K @ y )
@@ -60,8 +61,8 @@ def ekf_slam(xEst, PEst, u, z):
60
61
61
62
def calc_input ():
62
63
v = 1.0 # [m/s]
63
- yawrate = 0.1 # [rad/s]
64
- u = np .array ([[v , yawrate ]]).T
64
+ yaw_rate = 0.1 # [rad/s]
65
+ u = np .array ([[v , yaw_rate ]]).T
65
66
return u
66
67
67
68
@@ -79,8 +80,8 @@ def observation(xTrue, xd, u, RFID):
79
80
angle = pi_2_pi (math .atan2 (dy , dx ) - xTrue [2 , 0 ])
80
81
if d <= MAX_RANGE :
81
82
dn = d + np .random .randn () * Q_sim [0 , 0 ] ** 0.5 # add noise
82
- anglen = angle + np .random .randn () * Q_sim [1 , 1 ] ** 0.5 # add noise
83
- zi = np .array ([dn , anglen , i ])
83
+ angle_n = angle + np .random .randn () * Q_sim [1 , 1 ] ** 0.5 # add noise
84
+ zi = np .array ([dn , angle_n , i ])
84
85
z = np .vstack ((z , zi ))
85
86
86
87
# add noise to input
@@ -128,8 +129,6 @@ def calc_landmark_position(x, z):
128
129
129
130
zp [0 , 0 ] = x [0 , 0 ] + z [0 ] * math .cos (x [2 , 0 ] + z [1 ])
130
131
zp [1 , 0 ] = x [1 , 0 ] + z [0 ] * math .sin (x [2 , 0 ] + z [1 ])
131
- # zp[0, 0] = x[0, 0] + z[0, 0] * math.cos(x[2, 0] + z[0, 1])
132
- # zp[1, 0] = x[1, 0] + z[0, 0] * math.sin(x[2, 0] + z[0, 1])
133
132
134
133
return zp
135
134
@@ -147,25 +146,25 @@ def search_correspond_landmark_id(xAug, PAug, zi):
147
146
148
147
nLM = calc_n_lm (xAug )
149
148
150
- mdist = []
149
+ min_dist = []
151
150
152
151
for i in range (nLM ):
153
152
lm = get_landmark_position_from_state (xAug , i )
154
153
y , S , H = calc_innovation (lm , xAug , PAug , zi , i )
155
- mdist .append (y .T @ np .linalg .inv (S ) @ y )
154
+ min_dist .append (y .T @ np .linalg .inv (S ) @ y )
156
155
157
- mdist .append (M_DIST_TH ) # new landmark
156
+ min_dist .append (M_DIST_TH ) # new landmark
158
157
159
- minid = mdist .index (min (mdist ))
158
+ min_id = min_dist .index (min (min_dist ))
160
159
161
- return minid
160
+ return min_id
162
161
163
162
164
163
def calc_innovation (lm , xEst , PEst , z , LMid ):
165
164
delta = lm - xEst [0 :2 ]
166
165
q = (delta .T @ delta )[0 , 0 ]
167
- zangle = math .atan2 (delta [1 , 0 ], delta [0 , 0 ]) - xEst [2 , 0 ]
168
- zp = np .array ([[math .sqrt (q ), pi_2_pi (zangle )]])
166
+ z_angle = math .atan2 (delta [1 , 0 ], delta [0 , 0 ]) - xEst [2 , 0 ]
167
+ zp = np .array ([[math .sqrt (q ), pi_2_pi (z_angle )]])
169
168
y = (z - zp ).T
170
169
y [1 ] = pi_2_pi (y [1 ])
171
170
H = jacob_h (q , delta , xEst , LMid + 1 )
0 commit comments