Design & Selection · Module 13
Selecting a global planner
Pick the planner from the robot’s shape and kinematics: circular robots can use grid planners; non-circular or car-like robots need a planner that checks the footprint or the turning constraint.
Assumptions: Numbers in the examples are illustrative and the code is executed by the site’s tests. Facts taken from a cited source are marked; other statements are general engineering knowledge and must be confirmed on the datasheet of the part you use.
1. Engineering problem
The global planner finds a path through the costmap. If its assumptions do not match the robot (a circular footprint for a rectangular robot, free in-place rotation for a car-like vehicle) the path is not drivable and the controller fails or collides.
2. When is this needed?
- Setting up Nav2 for a new robot.
- When the robot cannot follow planned paths in tight places or turns.
- When changing from differential to Ackermann or to a non-circular footprint.
3. Selection and design decisions
From the Nav2 READMEs (jazzy, read 2026-11-06): NavfnPlanner implements the Navigation Function planner with A* or Dijkstra expansion and “assumes a circular robot (or a robot that can be approximated as circular)” on a weighted costmap. The Smac planner package has three plugins: SmacPlannerHybrid (Hybrid-A* supporting Dubin and Reeds-Shepp models for legged, Ackermann and car models), SmacPlannerLattice (state lattice with control sets for Ackermann, legged, differential and omnidirectional models, suited to arbitrary-shape robots with SE2 collision checking) and SmacPlanner2D (grid A* with an 8-connected neighbourhood, for circular differential or omnidirectional robots). The default Nav2 parameter file uses NavfnPlanner with use_astar: false, tolerance: 0.5 and allow_unknown: true.
| Planner | Robot assumptions | Kinematic feasibility |
|---|---|---|
| NavfnPlanner | Circular | Not kinematic; the smoother or controller handles curvature |
| SmacPlanner2D | Circular, differential or omnidirectional | Not kinematic |
| SmacPlannerHybrid | Ackermann, car-like, legged | Respects a minimum turning radius |
| SmacPlannerLattice | Arbitrary shape, differential, omni, Ackermann, legged | Respects the chosen control set |
4. Advantages and disadvantages
- Simple grid planners are fast and robust; kinematic planners give drivable paths and cost compute and tuning.
- Inflation in the costmap approximates a footprint for circular planners; non-circular robots in narrow places need a footprint-aware planner.
- A smoother after the planner reduces jerky paths.
5. Requirements and constraints
- The planner’s footprint and motion assumptions are met by the robot.
- Planning time fits the replanning rate (the default tree replans at 1 Hz).
- Costmap resolution suits the planner.
6. Architecture
goal ─▶ planner server (plugin) on the global costmap ─▶ path ─▶ smoother ─▶ controller server7. Implementation
- Write down the robot’s footprint (circular or not) and drive type.
- Use the chooser (below) to shortlist planners.
- Configure the planner plugin in
planner_serverand a smoother. - Test in tight and open places with the real footprint.
- Check planning time against the replanning rate.
def planners(circular, drive): # drive: diff, omni, ackermann, legged
out = []
if circular and drive in ("diff", "omni"):
out += ["NavfnPlanner", "SmacPlanner2D"]
if drive in ("ackermann", "legged"):
out += ["SmacPlannerHybrid"]
if drive in ("diff", "omni", "ackermann", "legged"):
out += ["SmacPlannerLattice"]
return out
for c, d in ((True, "diff"), (False, "diff"), (True, "ackermann"), (False, "omni")):
print(("circular" if c else "non-circular"), d, "->", planners(c, d))Printed (checked by the site’s tests):
circular diff -> ['NavfnPlanner', 'SmacPlanner2D', 'SmacPlannerLattice']
non-circular diff -> ['SmacPlannerLattice']
circular ackermann -> ['SmacPlannerHybrid', 'SmacPlannerLattice']
non-circular omni -> ['SmacPlannerLattice']Reading it: a circular differential robot can use NavFn or Smac 2D (or the lattice planner); a non-circular robot leaves the lattice planner; a circular Ackermann vehicle uses Hybrid-A* or the lattice. This is a simplified summary of the READMEs; read them for the current limits.
8. Real examples
- Warehouse AMR (rectangular, differential): SmacPlannerLattice with a footprint-based collision checker for narrow aisles.
9. Failure scenarios
- NavFn on a long rectangular robot in a narrow doorway.
- A Hybrid-A* planner without a realistic turning radius.
- Planning time longer than the replanning period.
10. Troubleshooting
- If paths clip obstacles, check the footprint and inflation.
- If the controller cannot follow turns, use a kinematic planner or smooth more.
- If planning is slow, increase resolution or downsample.
11. Validation
- The chooser prints the lines shown (executed by the site tests).
- The robot completes tight-place tests with the chosen planner.
12. Engineering checklist
13. Further references
- Nav2 package READMEs (jazzy branch), read 2026-11-06: nav2_navfn_planner, nav2_smac_planner, nav2_dwb_controller, nav2_regulated_pure_pursuit_controller, nav2_mppi_controller.
- Nav2 default parameters (jazzy branch): nav2_bringup/params/nav2_params.yaml, read 2026-11-06.