@@ -48,7 +48,7 @@ def __init__(self):
4848 self .id2 = 0
4949
5050
51- def cal_ob_sigma (d ):
51+ def cal_observation_sigma (d ):
5252
5353 sigma = np .zeros ((3 , 3 ))
5454 sigma [0 , 0 ] = (d * C_SIGMA1 )** 2
@@ -58,6 +58,14 @@ def cal_ob_sigma(d):
5858 return sigma
5959
6060
61+ def calc_rotational_matrix (angle ):
62+
63+ Rt = np .matrix ([[math .cos (angle ), - math .sin (angle ), 0 ],
64+ [math .sin (angle ), math .cos (angle ), 0 ],
65+ [0 , 0 , 1.0 ]])
66+ return Rt
67+
68+
6169def calc_edges (xlist , zlist ):
6270
6371 edges = []
@@ -66,32 +74,27 @@ def calc_edges(xlist, zlist):
6674 for (t , td ) in zids :
6775 xt , yt , yawt = xlist [0 , t ], xlist [1 , t ], xlist [2 , t ]
6876 xtd , ytd , yawtd = xlist [0 , td ], xlist [1 , td ], xlist [2 , td ]
69-
7077 dt , anglet , phit = zlist [t ][0 , 0 ], zlist [t ][1 , 0 ], zlist [t ][2 , 0 ]
71-
7278 dtd , angletd , phitd = zlist [td ][0 , 0 ], zlist [td ][1 , 0 ], zlist [td ][2 , 0 ]
7379
7480 edge = Edge ()
7581
76- t1 = dt * math .cos (yawt + anglet )
77- t2 = dtd * math .cos (yawtd + angletd )
78- t3 = dt * math .sin (yawt + anglet )
79- t4 = dtd * math .sin (yawtd + angletd )
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 )
8088
8189 edge .e [0 , 0 ] = xtd - xt - t1 + t2
8290 edge .e [1 , 0 ] = ytd - yt - t3 + t4
8391 edge .e [2 , 0 ] = yawtd - yawt - phit + phitd
8492
85- sig_t = cal_ob_sigma (dt )
86- sig_td = cal_ob_sigma (dtd )
93+ sig_t = cal_observation_sigma (dt )
94+ sig_td = cal_observation_sigma (dtd )
8795
88- Rt = np .matrix ([[math .cos (yawt + anglet ), - math .sin (yawt + anglet ), 0 ],
89- [math .sin (yawt + anglet ), math .cos (yawt + anglet ), 0 ],
90- [0 , 0 , 1.0 ]])
91- Rtd = np .matrix ([[math .cos (yawtd + angletd ), - math .sin (yawtd + angletd ), 0 ],
92- [math .sin (yawtd + angletd ),
93- math .cos (yawtd + angletd ), 0 ],
94- [0 , 0 , 1.0 ]])
96+ Rt = calc_rotational_matrix (tangle1 )
97+ Rtd = calc_rotational_matrix (tangle2 )
9598
9699 edge .omega = np .linalg .inv (Rt * sig_t * Rt .T + Rtd * sig_td * Rtd .T )
97100 edge .d_t , edge .d_td = dt , dtd
@@ -115,47 +118,48 @@ def calc_jacobian(edge):
115118 [0 , 1.0 , edge .d_td * math .cos (td )],
116119 [0 , 0 , 1.0 ]])
117120
118- # print(A)
119- # print(B)
120-
121121 return A , B
122122
123123
124+ def fill_H_and_b (H , b , edge ):
125+
126+ A , B = calc_jacobian (edge )
127+
128+ id1 = edge .id1 * 3
129+ id2 = edge .id2 * 3
130+
131+ H [id1 :id1 + 3 , id1 :id1 + 3 ] += A .T * edge .omega * A
132+ H [id1 :id1 + 3 , id2 :id2 + 3 ] += A .T * edge .omega * B
133+ H [id2 :id2 + 3 , id1 :id1 + 3 ] += B .T * edge .omega * A
134+ H [id2 :id2 + 3 , id2 :id2 + 3 ] += B .T * edge .omega * B
135+
136+ b [id1 :id1 + 3 , 0 ] += (A .T * edge .omega * edge .e )
137+ b [id2 :id2 + 3 , 0 ] += (B .T * edge .omega * edge .e )
138+
139+ return H , b
140+
141+
124142def graph_based_slam (xEst , PEst , u , z , hxDR , hz ):
125143
126144 x_opt = copy .deepcopy (hxDR )
127145 n = len (hz ) * 3
128146
129147 for itr in range (MAX_ITR ):
130148 edges = calc_edges (x_opt , hz )
131- print ("nedges :" , len (edges ))
149+ # print("n edges :", len(edges))
132150
133151 H = np .matrix (np .zeros ((n , n )))
134152 b = np .matrix (np .zeros ((n , 1 )))
135153
136154 for edge in edges :
137- A , B = calc_jacobian (edge )
138-
139- id1 = edge .id1 * 3
140- id2 = edge .id2 * 3
141-
142- H [id1 :id1 + 3 , id1 :id1 + 3 ] += A .T * edge .omega * A
143- H [id1 :id1 + 3 , id2 :id2 + 3 ] += A .T * edge .omega * B
144- H [id2 :id2 + 3 , id1 :id1 + 3 ] += B .T * edge .omega * A
145- H [id2 :id2 + 3 , id2 :id2 + 3 ] += B .T * edge .omega * B
146-
147- b [id1 :id1 + 3 , 0 ] += (A .T * edge .omega * edge .e )
148- b [id2 :id2 + 3 , 0 ] += (B .T * edge .omega * edge .e )
155+ H , b = fill_H_and_b (H , b , edge )
149156
150157 H [0 :3 , 0 :3 ] += np .identity (3 ) * 10000 # to fix origin
151158
152159 dx = - np .linalg .inv (H ).dot (b )
153- # print(dx)
154160
155161 for i in range (len (hz )):
156- x_opt [0 , i ] += dx [i * 3 , 0 ]
157- x_opt [1 , i ] += dx [i * 3 + 1 , 0 ]
158- x_opt [2 , i ] += dx [i * 3 + 2 , 0 ]
162+ x_opt [0 :3 , i ] += dx [i * 3 :i * 3 + 3 , 0 ]
159163
160164 diff = dx .T .dot (dx )
161165 print ("iteration: %d, diff: %f" % (itr + 1 , diff ))
@@ -185,7 +189,7 @@ def observation(xTrue, xd, u, RFID):
185189 dy = RFID [i , 1 ] - xTrue [1 , 0 ]
186190 d = math .sqrt (dx ** 2 + dy ** 2 )
187191 angle = pi_2_pi (math .atan2 (dy , dx )) - xTrue [2 , 0 ]
188- phi = angle - xTrue [2 , 0 ]
192+ phi = angle + xTrue [2 , 0 ]
189193 if d <= MAX_RANGE :
190194 dn = d + np .random .randn () * Qsim [0 , 0 ] # add noise
191195 anglen = angle + np .random .randn () * Qsim [1 , 1 ] # add noise
0 commit comments