@@ -85,11 +85,11 @@ def calc_edges(xlist, zlist):
8585 sig_t = cal_ob_sigma (dt )
8686 sig_td = cal_ob_sigma (dtd )
8787
88- Rt = np .matrix ([[math .cos (yawt + anglet ), math .sin (yawt + anglet ), 0 ],
89- [- math .sin (yawt + anglet ), math .cos (yawt + anglet ), 0 ],
88+ Rt = np .matrix ([[math .cos (yawt + anglet ), - math .sin (yawt + anglet ), 0 ],
89+ [math .sin (yawt + anglet ), math .cos (yawt + anglet ), 0 ],
9090 [0 , 0 , 1.0 ]])
91- Rtd = np .matrix ([[math .cos (yawtd + angletd ), math .sin (yawtd + angletd ), 0 ],
92- [- math .sin (yawtd + angletd ),
91+ Rtd = np .matrix ([[math .cos (yawtd + angletd ), - math .sin (yawtd + angletd ), 0 ],
92+ [math .sin (yawtd + angletd ),
9393 math .cos (yawtd + angletd ), 0 ],
9494 [0 , 0 , 1.0 ]])
9595
@@ -124,28 +124,30 @@ def calc_jacobian(edge):
124124def graph_based_slam (xEst , PEst , u , z , hxDR , hz ):
125125
126126 x_opt = copy .deepcopy (hxDR )
127- edges = calc_edges (x_opt , hz )
128- print ("nedges:" , len (edges ))
129127 n = len (hz ) * 3
130128
131129 for itr in range (MAX_ITR ):
130+ edges = calc_edges (x_opt , hz )
131+ print ("nedges:" , len (edges ))
132132
133- H = np .zeros ((n , n ))
134- b = np .zeros ((n , 1 ))
133+ H = np .matrix ( np . zeros ((n , n ) ))
134+ b = np .matrix ( np . zeros ((n , 1 ) ))
135135
136136 for edge in edges :
137137 A , B = calc_jacobian (edge )
138138
139139 id1 = edge .id1 * 3
140+ id2 = edge .id2 * 3
140141
141142 H [id1 :id1 + 3 , id1 :id1 + 3 ] += A .T * edge .omega * A
142- # h[self. id1*3:self. id1*3+ 3, self. id2*3:self. id2*3+ 3] += (self.matA).T.dot(self.info.dot(self.matB))
143- # h[self. id2*3:self. id2*3+ 3, self. id1*3:self. id1*3+ 3] += (self.matB).T.dot(self.info.dot(self.matA))
144- # h[self. id2*3:self. id2*3+ 3, self. id2*3:self. id2*3+ 3] += (self.matB).T.dot(self.info.dot(self.matB))
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
145146
146- # H[0:3, 0:3] += np.identity(3) * 10000 # to fix origin
147- H += np .identity (n ) * 10000 # to fix origin
148- print (H )
147+ b [id1 :id1 + 3 , 0 ] += (A .T * edge .omega * edge .e )
148+ b [id2 :id2 + 3 , 0 ] += (B .T * edge .omega * edge .e )
149+
150+ H [0 :3 , 0 :3 ] += np .identity (3 ) * 10000 # to fix origin
149151
150152 dx = - np .linalg .inv (H ).dot (b )
151153 # print(dx)
@@ -155,13 +157,9 @@ def graph_based_slam(xEst, PEst, u, z, hxDR, hz):
155157 x_opt [1 , i ] += dx [i * 3 + 1 , 0 ]
156158 x_opt [2 , i ] += dx [i * 3 + 2 , 0 ]
157159
158- # # HalfEdgeに登録してある推定値も更新
159- # for e in obs_edges:
160- # e.update(robot.guess_poses)
161-
162160 diff = dx .T .dot (dx )
163161 print ("iteration: %d, diff: %f" % (itr + 1 , diff ))
164- if dx [ 0 , 0 ] < 1.0e-5 :
162+ if diff < 1.0e-5 :
165163 break
166164
167165 return x_opt , None
0 commit comments