Path Planners¶
Planners compute a geometric path from a start pose to a goal. They live in
examples/planners and share the BasePlanner interface.
BasePlanner¶
class BasePlanner(ABC):
def __init__(self, bounds, robot_radius=0.3, seed=None): ...
def plan(self, start, goal, obstacles, occupancy_map=None) -> (path, DebugData): ...
@abstractmethod
def _plan(self, start, goal, obs_list, occupancy_map=None): ...
boundsis(xmin, xmax, ymin, ymax)in metres.obstaclesisworld.obstacles(the engine's[x, y, r]arrays).occupancy_mapis an optionalOccupancyGridMap.planreturns a list of(x, y)from start to goal (orNone) and aDebugDataobject describing the search tree/roadmap for visualization.
Subclasses only implement _plan. Shared collision helpers
(_point_free, _segment_free, _in_bounds, _random_sample, _steer, …)
are provided by the base class.
Available planners¶
| Planner | Import | Class / type |
|---|---|---|
| A* | examples.planners.astar |
AStarPlanner — grid-based A* on an inflated occupancy grid. |
| RRT | examples.planners.planners |
RRTPlanner — rapidly-exploring random tree. |
| RRT* | examples.planners.planners |
RRTStarPlanner — asymptotically optimal RRT. |
| PRM | examples.planners.planners |
PRMPlanner — probabilistic roadmap. |
| BIT* | examples.planners.planners |
BITStarPlanner — batch informed trees. |
| OMPL | examples.planners.ompl_planner |
OMPLPlanner / OMPLPlannerAdapter — wraps an OMPL planner (RRT, RRTConnect, PRM, BIT*, …). Requires ompl. |
| RRT-Dubins | examples.planners.rrtdubins |
Dubins-path variants for car-like (Ackermann) B-bots. |
Connecting a planner to the engine¶
PlannerController turns any planner into an engine controller and draws the
path plus debug structure on screen.
from examples.planners.planners import RRTStarPlanner
from examples.controllers.planner_controller import PlannerController
from hivebr.engine import Simulator, load_config
config = load_config("config/default.yaml")
bounds = (0, config["world"]["width"], 0, config["world"]["height"])
planner = RRTStarPlanner(bounds, robot_radius=config["robot"]["radius"], seed=1)
controller = PlannerController(planner)
sim = Simulator(config=config, controller=controller.controller,
draw_callback=controller.draw_callback)
sim.run()
Writing your own planner¶
from examples.planners.base_planner import BasePlanner, DebugData
class StraightPlanner(BasePlanner):
def _plan(self, start, goal, obs_list, occupancy_map=None):
path = [start, goal]
return path, DebugData()
See also the Controllers page for alternative (reactive) navigation strategies.