Skip to content

Commit f42036a

Browse files
committed
first release fastslam2
1 parent 1c45232 commit f42036a

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

SLAM/FastSLAM2/fast_slam2.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def __init__(self, N_LM):
3939
self.x = 0.0
4040
self.y = 0.0
4141
self.yaw = 0.0
42+
self.P = np.eye(3)
4243
# landmark x-y positions
4344
self.lm = np.matrix(np.zeros((N_LM, LM_SIZE)))
4445
# landmark position covariance
@@ -205,6 +206,32 @@ def compute_weight(particle, z, Q):
205206
return w
206207

207208

209+
def proposal_sampling(particle, z, Q):
210+
211+
lm_id = int(z[0, 2])
212+
xf = np.matrix(particle.lm[lm_id, :]).T
213+
Pf = np.matrix(particle.lmP[2 * lm_id:2 * lm_id + 2])
214+
# State
215+
x = np.matrix([[particle.x, particle.y, particle.yaw]]).T
216+
P = particle.P
217+
zp, Hv, Hf, Sf = compute_jacobians(particle, xf, Pf, Q)
218+
219+
Sfi = np.linalg.inv(Sf)
220+
dz = z[0, 0: 2].T - zp
221+
dz[1, 0] = pi_2_pi(dz[1, 0])
222+
223+
Pi = np.linalg.inv(P)
224+
225+
particle.P = np.linalg.inv(Hv.T * Sfi * Hv + Pi) # proposal covariance
226+
x += particle.P * Hv.T * Sfi * dz # proposal mean
227+
228+
particle.x = x[0, 0]
229+
particle.y = x[1, 0]
230+
particle.yaw = x[2, 0]
231+
232+
return particle
233+
234+
208235
def update_with_observation(particles, z):
209236

210237
for iz in range(len(z[:, 0])):
@@ -219,6 +246,8 @@ def update_with_observation(particles, z):
219246
else:
220247
w = compute_weight(particles[ip], z[iz, :], Q)
221248
particles[ip].w *= w
249+
250+
particles[ip] = proposal_sampling(particles[ip], z[iz, :], Q)
222251
particles[ip] = update_landmark(particles[ip], z[iz, :], Q)
223252

224253
return particles

0 commit comments

Comments
 (0)