@@ -191,6 +191,26 @@ def setup_planning(self):
191
191
192
192
return etheta , cMin , xCenter , C , cBest
193
193
194
+ def setup_sample (self , iterations , foundGoal , cMin , xCenter , C , cBest ):
195
+ print ("Batch: " , iterations )
196
+ # Using informed rrt star way of computing the samples
197
+ self .r = 2.0
198
+ if iterations != 0 :
199
+ if foundGoal :
200
+ # a better way to do this would be to make number of samples
201
+ # a function of cMin
202
+ m = 200
203
+ self .samples = dict ()
204
+ self .samples [self .goalId ] = self .goal
205
+ else :
206
+ m = 100
207
+ cBest = self .g_scores [self .goalId ]
208
+ self .samples .update (self .informedSample (
209
+ m , cBest , cMin , xCenter , C ))
210
+ return cBest
211
+
212
+ return cBest
213
+
194
214
def plan (self , animation = True ):
195
215
196
216
etheta , cMin , xCenter , C , cBest = self .setup_planning ()
@@ -201,22 +221,8 @@ def plan(self, animation=True):
201
221
# run until done
202
222
while (iterations < self .maxIter ):
203
223
if len (self .vertex_queue ) == 0 and len (self .edge_queue ) == 0 :
204
- print ("Batch: " , iterations )
205
- # Using informed rrt star way of computing the samples
206
- self .r = 2.0
207
- if iterations != 0 :
208
- if foundGoal :
209
- # a better way to do this would be to make number of samples
210
- # a function of cMin
211
- m = 200
212
- self .samples = dict ()
213
- self .samples [self .goalId ] = self .goal
214
- else :
215
- m = 100
216
- cBest = self .g_scores [self .goalId ]
217
- self .samples .update (self .informedSample (
218
- m , cBest , cMin , xCenter , C ))
219
-
224
+ cBest = self .setup_sample (iterations ,
225
+ foundGoal , cMin , xCenter , C , cBest )
220
226
# make the old vertices the new vertices
221
227
self .old_vertices += self .tree .vertices .keys ()
222
228
# add the vertices to the vertex queue
@@ -241,57 +247,54 @@ def plan(self, animation=True):
241
247
actualCostOfEdge = self .g_scores [bestEdge [0 ]] + \
242
248
self .computeDistanceCost (bestEdge [0 ], bestEdge [1 ])
243
249
244
- if (estimatedCostOfVertex < self .g_scores [self .goalId ]):
245
- if (estimatedCostOfEdge < self .g_scores [self .goalId ]):
246
- if (actualCostOfEdge < self .g_scores [self .goalId ]):
247
- # connect this edge
248
- firstCoord = self .tree .nodeIdToRealWorldCoord (
249
- bestEdge [0 ])
250
- secondCoord = self .tree .nodeIdToRealWorldCoord (
251
- bestEdge [1 ])
252
- path = self .connect (firstCoord , secondCoord )
253
- lastEdge = self .tree .realWorldToNodeId (secondCoord )
254
- if path is None or len (path ) == 0 :
255
- continue
256
- nextCoord = path [len (path ) - 1 , :]
257
- nextCoordPathId = self .tree .realWorldToNodeId (
258
- nextCoord )
259
- bestEdge = (bestEdge [0 ], nextCoordPathId )
260
- if (bestEdge [1 ] in self .tree .vertices .keys ()):
261
- continue
262
- else :
263
- try :
264
- del self .samples [bestEdge [1 ]]
265
- except (KeyError ):
266
- pass
267
- eid = self .tree .addVertex (nextCoord )
268
- self .vertex_queue .append (eid )
269
- if eid == self .goalId or bestEdge [0 ] == self .goalId or bestEdge [1 ] == self .goalId :
270
- print ("Goal found" )
271
- foundGoal = True
272
-
273
- self .tree .addEdge (bestEdge [0 ], bestEdge [1 ])
274
-
275
- g_score = self .computeDistanceCost (
276
- bestEdge [0 ], bestEdge [1 ])
277
- self .g_scores [bestEdge [1 ]] = g_score + \
278
- self .g_scores [bestEdge [0 ]]
279
- self .f_scores [bestEdge [1 ]] = g_score + \
280
- self .computeHeuristicCost (bestEdge [1 ], self .goalId )
281
- self .updateGraph ()
282
-
283
- # visualize new edge
284
- if animation :
285
- self .drawGraph (xCenter = xCenter , cBest = cBest ,
286
- cMin = cMin , etheta = etheta , samples = self .samples .values (),
287
- start = firstCoord , end = secondCoord , tree = self .tree .edges )
288
-
289
- for edge in self .edge_queue :
290
- if (edge [1 ] == bestEdge [1 ]):
291
- if self .g_scores [edge [1 ]] + self .computeDistanceCost (edge [1 ], bestEdge [1 ]) >= self .g_scores [self .goalId ]:
292
- if (lastEdge , bestEdge [1 ]) in self .edge_queue :
293
- self .edge_queue .remove (
294
- (lastEdge , bestEdge [1 ]))
250
+ f1 = estimatedCostOfVertex < self .g_scores [self .goalId ]
251
+ f2 = estimatedCostOfEdge < self .g_scores [self .goalId ]
252
+ f3 = actualCostOfEdge < self .g_scores [self .goalId ]
253
+
254
+ if f1 and f2 and f3 :
255
+ # connect this edge
256
+ firstCoord = self .tree .nodeIdToRealWorldCoord (
257
+ bestEdge [0 ])
258
+ secondCoord = self .tree .nodeIdToRealWorldCoord (
259
+ bestEdge [1 ])
260
+ path = self .connect (firstCoord , secondCoord )
261
+ lastEdge = self .tree .realWorldToNodeId (secondCoord )
262
+ if path is None or len (path ) == 0 :
263
+ continue
264
+ nextCoord = path [len (path ) - 1 , :]
265
+ nextCoordPathId = self .tree .realWorldToNodeId (
266
+ nextCoord )
267
+ bestEdge = (bestEdge [0 ], nextCoordPathId )
268
+ if (bestEdge [1 ] in self .tree .vertices .keys ()):
269
+ continue
270
+ else :
271
+ try :
272
+ del self .samples [bestEdge [1 ]]
273
+ except (KeyError ):
274
+ pass
275
+ eid = self .tree .addVertex (nextCoord )
276
+ self .vertex_queue .append (eid )
277
+ if eid == self .goalId or bestEdge [0 ] == self .goalId or bestEdge [1 ] == self .goalId :
278
+ print ("Goal found" )
279
+ foundGoal = True
280
+
281
+ self .tree .addEdge (bestEdge [0 ], bestEdge [1 ])
282
+
283
+ g_score = self .computeDistanceCost (
284
+ bestEdge [0 ], bestEdge [1 ])
285
+ self .g_scores [bestEdge [1 ]] = g_score + \
286
+ self .g_scores [bestEdge [0 ]]
287
+ self .f_scores [bestEdge [1 ]] = g_score + \
288
+ self .computeHeuristicCost (bestEdge [1 ], self .goalId )
289
+ self .updateGraph ()
290
+
291
+ # visualize new edge
292
+ if animation :
293
+ self .drawGraph (xCenter = xCenter , cBest = cBest ,
294
+ cMin = cMin , etheta = etheta , samples = self .samples .values (),
295
+ start = firstCoord , end = secondCoord , tree = self .tree .edges )
296
+
297
+ self .remove_queue (lastEdge , bestEdge )
295
298
296
299
else :
297
300
print ("Nothing good" )
@@ -311,9 +314,17 @@ def plan(self, animation=True):
311
314
plan = plan [::- 1 ] # reverse the plan
312
315
return plan
313
316
317
+ def remove_queue (self , lastEdge , bestEdge ):
318
+ for edge in self .edge_queue :
319
+ if (edge [1 ] == bestEdge [1 ]):
320
+ if self .g_scores [edge [1 ]] + self .computeDistanceCost (edge [1 ], bestEdge [1 ]) >= self .g_scores [self .goalId ]:
321
+ if (lastEdge , bestEdge [1 ]) in self .edge_queue :
322
+ self .edge_queue .remove (
323
+ (lastEdge , bestEdge [1 ]))
324
+
314
325
def connect (self , start , end ):
315
- # A function which attempts to extend from a start coordinates
316
- # to goal coordinates
326
+ # A function which attempts to extend from a start coordinates
327
+ # to goal coordinates
317
328
steps = self .computeDistanceCost (self .tree .realWorldToNodeId (
318
329
start ), self .tree .realWorldToNodeId (end )) * 10
319
330
x = np .linspace (start [0 ], end [0 ], num = steps )
0 commit comments