AStar¶
src.python_motion_planning.path_planner.graph_search.a_star.AStar
¶
Bases: Dijkstra
Class for A* path planner.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*args
|
see the parent class. |
()
|
|
*kwargs
|
see the parent class. |
{}
|
References
[1] A Formal Basis for the heuristic Determination of Minimum Cost Paths
Examples:
Python Console Session
>>> map_ = Grid(bounds=[[0, 15], [0, 15]])
>>> planner = AStar(map_=map_, start=(5, 5), goal=(10, 10))
>>> path, path_info = planner.plan()
>>> print(path_info['success'])
True
Python Console Session
>>> planner.map_.type_map[3:10, 6] = TYPES.OBSTACLE
>>> path, path_info = planner.plan()
>>> print(path_info['success'])
True
Source code in src\python_motion_planning\path_planner\graph_search\a_star.py
Python
class AStar(Dijkstra):
"""
Class for A* path planner.
Args:
*args: see the parent class.
*kwargs: see the parent class.
References:
[1] A Formal Basis for the heuristic Determination of Minimum Cost Paths
Examples:
>>> map_ = Grid(bounds=[[0, 15], [0, 15]])
>>> planner = AStar(map_=map_, start=(5, 5), goal=(10, 10))
>>> path, path_info = planner.plan()
>>> print(path_info['success'])
True
>>> planner.map_.type_map[3:10, 6] = TYPES.OBSTACLE
>>> path, path_info = planner.plan()
>>> print(path_info['success'])
True
"""
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
def __str__(self) -> str:
return "A*"
def plan(self) -> Union[List[Tuple[float, ...]], Dict[str, Any]]:
"""
Interface for planning.
Returns:
path: A list containing the path waypoints
path_info: A dictionary containing the path information
"""
# OPEN list (priority queue) and CLOSED list (hash table)
OPEN = []
start_node = Node(self.start, None, 0, self.get_heuristic(self.start))
heapq.heappush(OPEN, start_node)
CLOSED = dict()
while OPEN:
node = heapq.heappop(OPEN)
# exists in CLOSED list
if node.current in CLOSED:
continue
# goal found
if node.current == self.goal:
CLOSED[node.current] = node
path, length, cost = self.extract_path(CLOSED)
return path, {
"success": True,
"start": self.start,
"goal": self.goal,
"length": length,
"cost": cost,
"expand": CLOSED
}
for node_n in self.map_.get_neighbors(node, diagonal=self.diagonal):
# exists in CLOSED list
if node_n.current in CLOSED:
continue
node_n.g = node.g + self.get_cost(node.current, node_n.current)
node_n.h = self.get_heuristic(node_n.current)
# goal found
if node_n.current == self.goal:
heapq.heappush(OPEN, node_n)
break
# update OPEN list
heapq.heappush(OPEN, node_n)
CLOSED[node.current] = node
self.failed_info[1]["expand"] = CLOSED
return self.failed_info
plan()
¶
Interface for planning.
Returns:
| Name | Type | Description |
|---|---|---|
path |
Union[List[Tuple[float, ...]], Dict[str, Any]]
|
A list containing the path waypoints |
path_info |
Union[List[Tuple[float, ...]], Dict[str, Any]]
|
A dictionary containing the path information |
Source code in src\python_motion_planning\path_planner\graph_search\a_star.py
Python
def plan(self) -> Union[List[Tuple[float, ...]], Dict[str, Any]]:
"""
Interface for planning.
Returns:
path: A list containing the path waypoints
path_info: A dictionary containing the path information
"""
# OPEN list (priority queue) and CLOSED list (hash table)
OPEN = []
start_node = Node(self.start, None, 0, self.get_heuristic(self.start))
heapq.heappush(OPEN, start_node)
CLOSED = dict()
while OPEN:
node = heapq.heappop(OPEN)
# exists in CLOSED list
if node.current in CLOSED:
continue
# goal found
if node.current == self.goal:
CLOSED[node.current] = node
path, length, cost = self.extract_path(CLOSED)
return path, {
"success": True,
"start": self.start,
"goal": self.goal,
"length": length,
"cost": cost,
"expand": CLOSED
}
for node_n in self.map_.get_neighbors(node, diagonal=self.diagonal):
# exists in CLOSED list
if node_n.current in CLOSED:
continue
node_n.g = node.g + self.get_cost(node.current, node_n.current)
node_n.h = self.get_heuristic(node_n.current)
# goal found
if node_n.current == self.goal:
heapq.heappush(OPEN, node_n)
break
# update OPEN list
heapq.heappush(OPEN, node_n)
CLOSED[node.current] = node
self.failed_info[1]["expand"] = CLOSED
return self.failed_info