FixTheRobot Explore Robotics / Systems Engineering / Design & Selection / Module 13

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.

  • Intermediate
  • Module 13: Navigation Stack & Autonomous Motion Planning
  • Written for ROS 2 Jazzy where ROS 2 is used
  • Sources checked 2026-11-06

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.

Overview
PlannerRobot assumptionsKinematic feasibility
NavfnPlannerCircularNot kinematic; the smoother or controller handles curvature
SmacPlanner2DCircular, differential or omnidirectionalNot kinematic
SmacPlannerHybridAckermann, car-like, leggedRespects a minimum turning radius
SmacPlannerLatticeArbitrary shape, differential, omni, Ackermann, leggedRespects 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 server

7. Implementation

  1. Write down the robot’s footprint (circular or not) and drive type.
  2. Use the chooser (below) to shortlist planners.
  3. Configure the planner plugin in planner_server and a smoother.
  4. Test in tight and open places with the real footprint.
  5. 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

  1. If paths clip obstacles, check the footprint and inflation.
  2. If the controller cannot follow turns, use a kinematic planner or smooth more.
  3. 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

Related on FixTheRobot