@@ -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+
208235def 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