2121from PathPlanning .TimeBasedPathPlanning .ConstraintTree import AgentId , AppliedConstraint , ConstraintTree , ConstraintTreeNode , ForkingConstraint
2222import time
2323
24- # TODO: dont include this
25- from constraint_tree_viz import visualize_cbs_tree
2624class ConflictBasedSearch (MultiAgentPlanner ):
2725
2826
29- # TODO: remove ConstraintTree from return
3027 @staticmethod
31- def plan (grid : Grid , start_and_goals : list [StartAndGoal ], single_agent_planner_class : SingleAgentPlanner , verbose : bool = False ) -> tuple [list [StartAndGoal ], list [NodePath ], ConstraintTree ]:
28+ def plan (grid : Grid , start_and_goals : list [StartAndGoal ], single_agent_planner_class : SingleAgentPlanner , verbose : bool = False ) -> tuple [list [StartAndGoal ], list [NodePath ]]:
3229 """
3330 Generate a path from the start to the goal for each agent in the `start_and_goals` list.
3431 Returns the re-ordered StartAndGoal combinations, and a list of path plans. The order of the plans
@@ -101,7 +98,7 @@ def plan(grid: Grid, start_and_goals: list[StartAndGoal], single_agent_planner_c
10198 for constraint in all_constraints :
10299 print (f"\t { constraint } " )
103100 print (f"Final cost: { constraint_tree_node .cost } " )
104- return (start_and_goals , paths .values (), constraint_tree )
101+ return (start_and_goals , paths .values ())
105102
106103 if verbose :
107104 print (f"Adding new constraint tree node with constraint: { new_constraint_tree_node .constraint } " )
@@ -169,20 +166,20 @@ def main():
169166 # start_and_goals = [StartAndGoal(i, Position(1, 2*i), Position(19, 19-i)) for i in range(4)]
170167
171168 # generate random start and goals
172- # start_and_goals: list[StartAndGoal] = []
173- # for i in range(40):
174- # start = Position(np.random.randint(0, grid_side_length), np.random.randint(0, grid_side_length))
175- # goal = Position(np.random.randint(0, grid_side_length), np.random.randint(0, grid_side_length))
176- # while any([start_and_goal.start == start for start_and_goal in start_and_goals]):
177- # start = Position(np.random.randint(0, grid_side_length), np.random.randint(0, grid_side_length))
178- # goal = Position(np.random.randint(0, grid_side_length), np.random.randint(0, grid_side_length))
169+ start_and_goals : list [StartAndGoal ] = []
170+ for i in range (40 ):
171+ start = Position (np .random .randint (0 , grid_side_length ), np .random .randint (0 , grid_side_length ))
172+ goal = Position (np .random .randint (0 , grid_side_length ), np .random .randint (0 , grid_side_length ))
173+ while any ([start_and_goal .start == start for start_and_goal in start_and_goals ]):
174+ start = Position (np .random .randint (0 , grid_side_length ), np .random .randint (0 , grid_side_length ))
175+ goal = Position (np .random .randint (0 , grid_side_length ), np .random .randint (0 , grid_side_length ))
179176
180- # start_and_goals.append(StartAndGoal(i, start, goal))
177+ start_and_goals .append (StartAndGoal (i , start , goal ))
181178
182179 # hallway cross
183- start_and_goals = [StartAndGoal (0 , Position (6 , 10 ), Position (13 , 10 )),
184- StartAndGoal (1 , Position (11 , 10 ), Position (6 , 10 )),
185- StartAndGoal (2 , Position (13 , 10 ), Position (7 , 10 ))]
180+ # start_and_goals = [StartAndGoal(0, Position(6, 10), Position(13, 10)),
181+ # StartAndGoal(1, Position(11, 10), Position(6, 10)),
182+ # StartAndGoal(2, Position(13, 10), Position(7, 10))]
186183
187184 # temporary obstacle
188185 # start_and_goals = [StartAndGoal(0, Position(15, 14), Position(15, 16))]
@@ -196,15 +193,15 @@ def main():
196193 num_obstacles = 250 ,
197194 obstacle_avoid_points = obstacle_avoid_points ,
198195 # obstacle_arrangement=ObstacleArrangement.TEMPORARY_OBSTACLE,
199- obstacle_arrangement = ObstacleArrangement .HALLWAY ,
196+ # obstacle_arrangement=ObstacleArrangement.HALLWAY,
200197 # obstacle_arrangement=ObstacleArrangement.NARROW_CORRIDOR,
201- # obstacle_arrangement=ObstacleArrangement.NONE,
198+ obstacle_arrangement = ObstacleArrangement .NONE ,
202199 # obstacle_arrangement=ObstacleArrangement.ARRANGEMENT1,
203200 # obstacle_arrangement=ObstacleArrangement.RANDOM,
204201 )
205202
206203 start_time = time .time ()
207- start_and_goals , paths , constraint_tree = ConflictBasedSearch .plan (grid , start_and_goals , SafeIntervalPathPlanner , verbose )
204+ start_and_goals , paths = ConflictBasedSearch .plan (grid , start_and_goals , SafeIntervalPathPlanner , verbose )
208205 # start_and_goals, paths = ConflictBasedSearch.plan(grid, start_and_goals, SpaceTimeAStar, verbose)
209206
210207 runtime = time .time () - start_time
@@ -218,8 +215,7 @@ def main():
218215 if not show_animation :
219216 return
220217
221- visualize_cbs_tree (constraint_tree .expanded_nodes , constraint_tree .nodes_to_expand )
222- # PlotNodePaths(grid, start_and_goals, paths)
218+ PlotNodePaths (grid , start_and_goals , paths )
223219
224220if __name__ == "__main__" :
225221 main ()
0 commit comments