2020DT = 0.1 # time tick [s]
2121SIM_TIME = 50.0 # simulation time [s]
2222MAX_RANGE = 20.0 # maximum observation range
23- M_DIST_TH = 2.0 # Threshold of Mahalanobis distance for data association.
2423STATE_SIZE = 3 # State size [x,y,yaw]
25- LM_SIZE = 2 # LM srate size [x,y]
2624
25+ # Covariance parameter of Graph Based SLAM
2726C_SIGMA1 = 1.0
2827C_SIGMA2 = 0.1
2928C_SIGMA3 = 0.1
3029
31- MAX_ITR = 20
30+ MAX_ITR = 20 # Maximuma iteration
3231
3332show_animation = True
3433
@@ -66,41 +65,52 @@ def calc_rotational_matrix(angle):
6665 return Rt
6766
6867
68+ def calc_edge (xt , yt , yawt , xtd , ytd , yawtd , dt ,
69+ anglet , phit , dtd , angletd , phitd , t , td ):
70+ edge = Edge ()
71+
72+ tangle1 = pi_2_pi (yawt + anglet )
73+ tangle2 = pi_2_pi (yawt + anglet )
74+ t1 = dt * math .cos (tangle1 )
75+ t2 = dtd * math .cos (tangle2 )
76+ t3 = dt * math .sin (tangle1 )
77+ t4 = dtd * math .sin (tangle2 )
78+
79+ edge .e [0 , 0 ] = xtd - xt - t1 + t2
80+ edge .e [1 , 0 ] = ytd - yt - t3 + t4
81+ edge .e [2 , 0 ] = pi_2_pi (yawtd - yawt - phit + phitd )
82+
83+ sig_t = cal_observation_sigma (dt )
84+ sig_td = cal_observation_sigma (dtd )
85+
86+ Rt = calc_rotational_matrix (tangle1 )
87+ Rtd = calc_rotational_matrix (tangle2 )
88+
89+ edge .omega = np .linalg .inv (Rt * sig_t * Rt .T + Rtd * sig_td * Rtd .T )
90+ edge .d_t , edge .d_td = dt , dtd
91+ edge .yaw_t , edge .yaw_td = yawt , yawtd
92+ edge .angle_t , edge .angle_td = anglet , angletd
93+ edge .id1 , edge .id2 = t , td
94+
95+ return edge
96+
97+
6998def calc_edges (xlist , zlist ):
7099
71100 edges = []
72101 zids = list (itertools .combinations (range (len (zlist )), 2 ))
73102
74103 for (t , td ) in zids :
104+ # print(xlist)
105+ # print(zlist)
75106 xt , yt , yawt = xlist [0 , t ], xlist [1 , t ], xlist [2 , t ]
76107 xtd , ytd , yawtd = xlist [0 , td ], xlist [1 , td ], xlist [2 , td ]
77108 dt , anglet , phit = zlist [t ][0 , 0 ], zlist [t ][1 , 0 ], zlist [t ][2 , 0 ]
78109 dtd , angletd , phitd = zlist [td ][0 , 0 ], zlist [td ][1 , 0 ], zlist [td ][2 , 0 ]
110+ # input()
79111
80- edge = Edge ()
81-
82- tangle1 = yawt + anglet
83- tangle2 = yawt + anglet
84- t1 = dt * math .cos (tangle1 )
85- t2 = dtd * math .cos (tangle2 )
86- t3 = dt * math .sin (tangle1 )
87- t4 = dtd * math .sin (tangle2 )
88-
89- edge .e [0 , 0 ] = xtd - xt - t1 + t2
90- edge .e [1 , 0 ] = ytd - yt - t3 + t4
91- edge .e [2 , 0 ] = yawtd - yawt - phit + phitd
92-
93- sig_t = cal_observation_sigma (dt )
94- sig_td = cal_observation_sigma (dtd )
95-
96- Rt = calc_rotational_matrix (tangle1 )
97- Rtd = calc_rotational_matrix (tangle2 )
98-
99- edge .omega = np .linalg .inv (Rt * sig_t * Rt .T + Rtd * sig_td * Rtd .T )
100- edge .d_t , edge .d_td = dt , dtd
101- edge .yaw_t , edge .yaw_td = yawt , yawtd
102- edge .angle_t , edge .angle_td = anglet , angletd
103- edge .id1 , edge .id2 = t , td
112+ edge = calc_edge (xt , yt , yawt , xtd , ytd , yawtd , dt ,
113+ anglet , phit , dtd , angletd , phitd , t , td )
104114
105115 edges .append (edge )
106116
@@ -139,11 +149,13 @@ def fill_H_and_b(H, b, edge):
139149 return H , b
140150
141151
142- def graph_based_slam (xEst , PEst , u , z , hxDR , hz ):
152+ def graph_based_slam (u , z , hxDR , hz ):
143153
144154 x_opt = copy .deepcopy (hxDR )
145155 n = len (hz ) * 3
146156
157+ # return x_opt
158+
147159 for itr in range (MAX_ITR ):
148160 edges = calc_edges (x_opt , hz )
149161 # print("n edges:", len(edges))
@@ -157,6 +169,7 @@ def graph_based_slam(xEst, PEst, u, z, hxDR, hz):
157169 H [0 :3 , 0 :3 ] += np .identity (3 ) * 10000 # to fix origin
158170
159171 dx = - np .linalg .inv (H ).dot (b )
172+ # print(dx)
160173
161174 for i in range (len (hz )):
162175 x_opt [0 :3 , i ] += dx [i * 3 :i * 3 + 3 , 0 ]
@@ -166,7 +179,9 @@ def graph_based_slam(xEst, PEst, u, z, hxDR, hz):
166179 if diff < 1.0e-5 :
167180 break
168181
169- return x_opt , None
182+ # print(x_opt)
183+
184+ return x_opt
170185
171186
172187def calc_input ():
@@ -189,7 +204,7 @@ def observation(xTrue, xd, u, RFID):
189204 dy = RFID [i , 1 ] - xTrue [1 , 0 ]
190205 d = math .sqrt (dx ** 2 + dy ** 2 )
191206 angle = pi_2_pi (math .atan2 (dy , dx )) - xTrue [2 , 0 ]
192- phi = angle + xTrue [ 2 , 0 ]
207+ phi = pi_2_pi ( math . atan2 ( dy , dx ))
193208 if d <= MAX_RANGE :
194209 dn = d + np .random .randn () * Qsim [0 , 0 ] # add noise
195210 anglen = angle + np .random .randn () * Qsim [1 , 1 ] # add noise
@@ -243,9 +258,7 @@ def main():
243258 [- 5.0 , 20.0 , 0.0 ]])
244259
245260 # State Vector [x y yaw v]'
246- xEst = np .matrix (np .zeros ((STATE_SIZE , 1 )))
247261 xTrue = np .matrix (np .zeros ((STATE_SIZE , 1 )))
248- PEst = np .eye (STATE_SIZE )
249262
250263 xDR = np .matrix (np .zeros ((STATE_SIZE , 1 ))) # Dead reckoning
251264
@@ -263,7 +276,7 @@ def main():
263276 hxDR = np .hstack ((hxDR , xDR ))
264277 hz .append (z )
265278
266- x_opt , PEst = graph_based_slam (xEst , PEst , ud , z , hxDR , hz )
279+ x_opt = graph_based_slam (ud , z , hxDR , hz )
267280
268281 # store data history
269282 hxTrue = np .hstack ((hxTrue , xTrue ))
@@ -272,7 +285,6 @@ def main():
272285 plt .cla ()
273286
274287 plt .plot (RFID [:, 0 ], RFID [:, 1 ], "*k" )
275- plt .plot (xEst [0 ], xEst [1 ], ".r" )
276288
277289 plt .plot (np .array (hxTrue [0 , :]).flatten (),
278290 np .array (hxTrue [1 , :]).flatten (), "-b" )
0 commit comments