Navigation Plugins
There are a number of plugin interfaces for users to create their own custom applications or algorithms with. Namely, the costmap layer, planner, controller, behavior tree, and behavior plugins. A list of all known plugins are listed here below for ROS 2 Navigation. If you know of a plugin, or you have created a new plugin, please consider submitting a pull request with that information.
This file can be found and edited under docs/configuration_and_development/navigation_plugins/index.md.
For tutorials on creating your own plugins, please see:
- Writing a New Costmap2D Plugin
- Writing a New Behavior Tree Plugin
- Writing a New Controller Plugin
- Writing a New Planner Plugin
- Writing a New Behavior Plugin
- Writing a New Navigator Plugin
Behavior-Tree Navigators
| Plugin Name | Creator | Description |
|---|---|---|
| NavigateToPoseNavigator | Steve Macenski | Point-to-point navigation via a behavior tree action server |
| NavigateThroughPosesNavigator | Steve Macenski | Point-through-points navigation via a behavior tree action server |
| CoverageNavigator | Steve Macenski | Complete coverage navigation (Cartesian or GPS) via a BTs |
Costmap Layers
| Plugin Name | Creator | Description |
|---|---|---|
| Voxel Layer | Eitan Marder-Eppstein | Maintains persistent 3D voxel layer using depth and laser sensor readings and raycasting to clear free space |
| Range Layer | David Lu | Uses a probabilistic model to put data from sensors that publish range msgs on the costmap |
| Static Layer | Eitan Marder-Eppstein | Gets static map and loads occupancy information into costmap |
| Inflation Layer | Tony Najjar | Inflates lethal obstacles in costmap with exponential decay (with the option to use OpenMP for parallelization) |
| Legacy Inflation Layer | Eitan Marder-Eppstein | Inflates lethal obstacles in costmap with exponential decay |
| Asymmetric Inflation Layer | Marc Blöchlinger | Uses the global plan to asymmetrically inflate lethal obstacles depending on path side |
| Obstacle Layer | Eitan Marder-Eppstein | Maintains persistent 2D costmap from 2D laser scans with raycasting to clear free space |
| Spatio-Temporal Voxel Layer | Steve Macenski | Maintains temporal 3D sparse volumetric voxel grid with decay through sensor models |
| Non-Persistent Voxel Layer | Steve Macenski | Maintains 3D occupancy grid consisting only of the most sets of measurements |
| Denoise Layer | Andrey Ryzhikov | Filters noise-induced standalone obstacles or small obstacles groups |
| Plugin Container Layer | Alexander Yuen | Combines the different costmap layers specified under this layer in order populate the same costmap with different isolated combinations of costmap layers |
| Ground Consistency Layer | Muhammad Haider Khan Lodhi | Height-aware costmap layer using 3D ground segmentation. Pair with Inflation Layer for terrain-aware navigation. |
| Semantic Segmentation Layer | Pedro Gonzalez | Vision-based semantic segmentation costmap layer using per-pixel class masks and registered pointclouds for terrain-aware navigation. |
| Virtual Layer | Sherif Fathey | Creates dynamic virtual cost zones and restriction areas using polygons, lines, and circles |
Costmap Filters
| Plugin Name | Creator | Description |
|---|---|---|
| Keepout Filter | Alexey Merzlyakov | Maintains keep-out/safety zones and preferred lanes for moving |
| Speed Filter | Alexey Merzlyakov | Limits maximum velocity of robot in speed restriction areas |
| Binary Filter | Alexey Merzlyakov | Enables binary (boolean) mask behavior to trigger actions |
Controllers
| Plugin Name | Creator | Description | Drivetrain support |
|---|---|---|---|
| DWB Controller | David Lu!! | A highly configurable DWA implementation with plugin interfaces | Differential, Omnidirectional, Legged |
| TEB Controller | Christoph Rösmann | A MPC-like controller suitable for ackermann, differential, and holonomic robots. | Ackermann, Legged, Omnidirectional, Differential |
| Regulated Pure Pursuit | Steve Macenski | A service / industrial robot variation on the pure pursuit algorithm with adaptive features. | Ackermann, Legged, Differential |
| MPPI Controller | Steve Macenski and Aleksei Budyakov | A predictive MPC controller with modular & custom cost functions that can accomplish many tasks. | Differential, Omni, Ackermann |
| Rotation Shim Controller | Steve Macenski | A "shim" controller to rotate to path heading before passing to main controller for tracking. | Differential, Omni, model rotate in place |
| Graceful Controller | Alberto Tudela | A controller based on a pose-following control law to generate smooth trajectories. | Differential, Omni, Legged |
| Vector Pursuit Controller | Black Coffee Robotics | A controller based on the vector pursuit algorithm useful for high speed accurate path tracking. | Differential, Ackermann, Legged |
Planners
| Plugin Name | Creator | Description | Drivetrain support |
|---|---|---|---|
| NavFn Planner | Eitan Marder-Eppstein & Kurt Konolige | A navigation function using A* or Dijkstras expansion, assumes 2D holonomic particle | Differential, Omnidirectional, Legged |
| SmacPlannerHybrid (formerly SmacPlanner) |
Steve Macenski | A SE2 Hybrid-A* implementation using either Dubin or Reeds-shepp motion models with smoother and multi-resolution query. Cars, car-like, and ackermann vehicles. Kinematically feasible. | Ackermann, Differential, Omnidirectional, Legged |
| SmacPlanner2D | Steve Macenski | A 2D A* implementation Using either 4 or 8 connected neighborhoods with smoother and multi-resolution query | Differential, Omnidirectional, Legged |
| SmacPlannerLattice | Steve Macenski | An implementation of State Lattice Planner using pre-generated minimum control sets for kinematically feasible planning with any type of vehicle imaginable. Includes generator script for Ackermann, diff, omni, and legged robots. | Differential, Omnidirectional, Ackermann, Legged, Arbitrary / Custom |
| ThetaStarPlanner | Anshumaan Singh | An implementation of Theta* using either 4 or 8 connected neighborhoods, assumes the robot as a 2D holonomic particle | Differential, Omnidirectional |
Smoothers
| Plugin Name | Creator | Description |
|---|---|---|
| Simple Smoother | Steve Macenski | A simple path smoother for infeasible (e.g. 2D) planners |
| Constrained Smoother | Matej Vargovcik & Steve Macenski | A path smoother using a constraints problem solver to optimize various criteria such as smoothness or distance from obstacles, maintaining minimum turning radius |
| Savitzky-Golay Smoother | Steve Macenski | A path smoother using a Savitzky-Golay filter to smooth the path via digital signal processing to remove noise from the path. |
Behaviors
| Plugin Name | Creator | Description |
|---|---|---|
| Clear Costmap | Eitan Marder-Eppstein | A service to clear the given costmap in case of incorrect perception or robot is stuck |
| Spin | Steve Macenski | Rotate behavior of configurable angles to clear out free space and nudge robot out of potential local failures |
| Back Up | Brian Wilcox | Back up behavior of configurable distance to back out of a situation where the robot is stuck |
| Wait | Steve Macenski | Wait behavior with configurable time to wait in case of time based obstacle like human traffic or getting more sensor data |
| Drive On Heading | Joshua Wallace | Drive on heading behavior with configurable distance to drive |
| Assisted Teleop | Joshua Wallace | AssistedTeleop behavior that scales teleop commands to prevent collisions. |
Waypoint Task Executors
| Plugin Name | Creator | Description |
|---|---|---|
| WaitAtWaypoint | Fetullah Atas | A plugin to execute a wait behavior on waypoint arrivals. |
| PhotoAtWaypoint | Fetullah Atas | A plugin to take and save photos to specified directory on waypoint arrivals. |
| InputAtWaypoint | Steve Macenski | A plugin to wait for user input before moving onto the next waypoint. |
Goal Checkers
| Plugin Name | Creator | Description |
|---|---|---|
| SimpleGoalChecker | David Lu!! | A plugin check whether robot is within translational distance and rotational distance of goal. |
| StoppedGoalChecker | David Lu!! | A plugin check whether robot is within translational distance, rotational distance of goal, and velocity threshold. |
| PositionGoalChecker | Prabhav Saxena | A plugin check whether robot is within translational distance of goal, without requiring rotational convergence. |
| AxisGoalChecker | Guillaume Doisy & Tony Najjar | A plugin check whether robot is within tolerance along the path direction and perpendicular to it (cross-track). |
| AdaptiveToleranceGoalChecker | David Grbac | A plugin check whether robot is within translational distance (using two tolerance levels) and rotational distance of goal. |
Progress Checkers
| Plugin Name | Creator | Description |
|---|---|---|
| SimpleProgressChecker | David Lu!! | A plugin to check whether the robot was able to move a minimum distance in a given time to make progress towards a goal |
| PoseProgressChecker | Guillaume Doisy | A plugin to check whether the robot was able to move a minimum distance or angle in a given time to make progress towards a goal |
Path Handlers
| Plugin Name | Creator | Description |
|---|---|---|
| FeasiblePathHandler | Maurice Alexander Purnawan | A plugin that transforms global plan to the local costmap frame, prunes it to the relevant portion within the costmap bounds, and handles in-place rotation and cusp pruning. |
Behavior Tree Nodes
| Action Plugin Name | Creator | Description |
|---|---|---|
| Back Up Action | Michael Jeronimo | Calls backup behavior action |
| Drive On Heading Action | Joshua Wallace | Calls drive on heading behavior action |
| Assisted Teleop Action | Joshua Wallace | Calls assisted teleop behavior action |
| Clear Entire Costmap Service | Carl Delsey | Calls clear entire costmap service |
| Clear Costmap Except Region Service | Guillaume Doisy | Calls clear costmap except region service |
| Clear Costmap Around Robot Service | Guillaume Doisy | Calls clear costmap around robot service |
| Compute Path to Pose Action | Michael Jeronimo | Calls Nav2 planner server |
| Smooth Path Action | Matej Vargovcik | Calls Nav2 smoother server |
| Follow Path Action | Michael Jeronimo | Calls Nav2 controller server |
| Navigate to Pose Action | Michael Jeronimo | BT Node for other BehaviorTree.CPP BTs to call Navigation2 as a subtree action |
| Reinitialize Global Localization Service | Carl Delsey | Reinitialize AMCL to a new pose |
| Spin Action | Carl Delsey | Calls spin behavior action |
| Wait Action | Steve Macenski | Calls wait behavior action |
| Truncate Path | Francisco Martín | Modifies a path making it shorter |
| Truncate Path Local | Matej Vargovcik | Extracts a path section around robot |
| Planner Selector | Pablo Iñigo Blasco | Selects the global planner based on a topic input, otherwises uses a default planner id |
| Controller Selector | Pablo Iñigo Blasco | Selects the controller based on a topic input, otherwises uses a default controller id |
| Goal Checker Selector | Pablo Iñigo Blasco | Selects the goal checker based on a topic input, otherwises uses a default goal checker id |
| Smoother Selector | Owen Hooper | Selects the smoother based on a topic input, otherwises uses a default smoother id |
| Progress Checker Selector | Steve Macenski | Selects the progress checker based on a topic input, otherwises uses a default progress checker id |
| Path Handler Selector | Maurice Alexander Purnawan | Selects the path handler based on a topic input, otherwises uses a default path handler id |
| Navigate Through Poses | Steve Macenski | BT Node for other BehaviorTree.CPP BTs to call Nav2's NavThroughPoses action |
| Remove Passed Goals | Steve Macenski | Removes goal poses passed or within a tolerance for culling old viapoints from path re-planning |
| Remove In Collision Goals | Tony Najjar | Removes goal poses that have a footprint or point cost above a threshold. |
| Compute Path Through Poses | Steve Macenski | Computes a path through a set of poses rather than a single end goal pose using the planner plugin specified |
| Compute Route | Steve Macenski | Computes a Route through a navigation graph and returns both a dense path and set of sparse route nodes and edges. |
| Compute And Track Route | Steve Macenski | Computes a Route as above, but also actively tracks progress and triggers route contextual semantic operations. |
| Cancel Control Action | Pradheep Padmanabhan | Cancels Nav2 controller server |
| Cancel BackUp Action | Pradheep Padmanabhan | Cancels backup behavior action |
| Cancel Spin Action | Pradheep Padmanabhan | Cancels spin behavior action |
| Cancel Wait Action | Pradheep Padmanabhan | Cancels wait behavior action |
| Cancel Route Action | Steve Macenski | Cancels ComputeAndTrackRoute action |
| Cancel Drive on Heading Action | Joshua Wallace | Cancels drive on heading behavior action |
| Cancel Assisted Teleop Action | Joshua Wallace | Cancels assisted teleop behavior action |
| Cancel Complete Coverage Action | Steve Macenski | Cancels compute complete coverage |
| Compute Complete Coverage Path Action | Steve Macenski | Calls coverage planner server |
| Get Pose From Path Action | Marc Morcos | Extracts a pose from a path |
| Dock Robot Action | Steve Macenski | Calls dock robot action |
| Undock Robot Action | Steve Macenski | Calls undock robot action |
| Concatenate Paths Action | Steve Macenski | Concatenates 2 paths together |
| Get Current Pose Action | Steve Macenski | Gets current pose to the blackboard |
| Append Goal Pose To Goals Action | Steve Macenski | Appends a goal pose to a goals vector |
| Extract Route Nodes To Goals Action | Steve Macenski | Converts Route Nodes to Goals |
| Get Next Few Goals Action | Steve Macenski | Obtains the next N goals in a goal vector |
| Toggle Collision Monitor Service | David Grbac | Calls toggle collision monitor service |
| Follow Object | Alberto Tudela | Dynamically follows an object |
| Cancel Follow Object | Alberto Tudela | Cancels follow object action |
| Validate Path | Joshua Wallace | Checks if a path is valid by making sure there are no LETHAL obstacles along the path. |
| Check Stop Status | Tony Najjar | Checks if robot is stopped for a duration |
| Check Pose Occupancy | Maurice Alexander Purnawan | Checks if a pose is occupied. |
| Condition Plugin Name | Creator | Description |
|---|---|---|
| Goal Reached Condition | Carl Delsey | Checks if goal is reached within tol. |
| Goal Updated Condition | Aitor Miguel Blanco | Checks if goal is preempted. |
| Global Updated Goal Condition | Joshua Wallace | Checks if goal is preempted in the global BT context |
| Initial Pose received Condition | Carl Delsey | Checks if initial pose has been set |
| Is Stuck Condition | Michael Jeronimo | Checks if robot is making progress or stuck |
| Transform Available Condition | Steve Macenski | Checks if a TF transformation is available. When succeeds returns success for subsequent calls. |
| Distance Traveled Condition | Sarthak Mittal | Checks is robot has traveled a given distance. |
| Time Expired Condition | Sarthak Mittal | Checks if a given time period has passed. |
| Is Battery Low Condition | Sarthak Mittal | Checks if battery percentage is below a specified value. |
| Path Expiring Timer | Joshua Wallace | Checks if the timer has expired. The timer is reset if the path gets updated. |
| Are Error Codes Present | Joshua Wallace | Checks if the specified error codes are present. |
| Would A Controller Recovery Help | Joshua Wallace | Checks if a controller recovery could help clear the controller server error code. |
| Would A Planner Recovery Help | Joshua Wallace | Checks if a planner recovery could help clear the planner server error code. |
| Would A Smoother Recovery Help | Joshua Wallace | Checks if a Smoother recovery could help clear the smoother server error code. |
| Would A Route Recovery Help | Steve Macenski | Checks if a Route recovery could help clear the route server error code. |
| Is Battery Charging Condition | Alberto Tudela | Checks if the battery is charging. |
| Are Poses Near Condition | Steve Macenski | Checks if 2 poses are nearby to each other. |
| Is Goal Nearby Condition | Jakub Chudziński | Checks if the robot is near the goal based on remaining path length. |
| Is Within Path Tracking Bounds Condition | Berkan Tali | Checks if the robot is within bounds for path tracking. |
| Decorator Plugin Name | Creator | Description |
|---|---|---|
| Rate Controller | Michael Jeronimo | Throttles child node to a given rate |
| Distance Controller | Sarthak Mittal | Ticks child node based on the distance traveled by the robot |
| Speed Controller | Sarthak Mittal | Throttles child node to a rate based on current robot speed. |
| Goal Updater | Francisco Martín | Updates the goal received via topic subscription. |
| Single Trigger | Steve Macenski | Triggers nodes/subtrees below only a single time per BT run. |
| PathLongerOnApproach | Pradheep Padmanabhan | Triggers child nodes if the new global path is significantly larger than the old global path on approach to the goal |
| GoalUpdatedController | Sophia Koffler | Ticks child node if the goal has been updated |
| Control Plugin Name | Creator | Description |
|---|---|---|
| Pipeline Sequence | Carl Delsey | A variant of a sequence node that will re-tick previous children even if another child is running |
| Recovery | Carl Delsey | Node must contain 2 children and returns success if first succeeds. If first fails, the second will be ticked. If successful, it will retry the first and then return its value |
| Round Robin | Mohammad Haghighipanah | Will tick i th child until a result and move on to i+1 |
| Nonblocking Sequence | Alexander Yuen | A variant of a sequence node that will tick through the whole sequence even if a child returns running. On reticks of this control node, successful children will be ticked once again to prevent a stale state from being latched. |
| Persistent Sequence | Enjoy Robotics | A variant of a sequence node that exposes current_child_idx as a bidirectional port. |
| Pause Resume Controller | Enjoy Robotics | Controlled through service calls to pause and resume the execution of the tree. |
Route Plugins
Edge Scorers
| Plugin Name | Creator | Description |
|---|---|---|
| DistanceScorer | Steve Macenski | Scores an edge's length, optionally scaled by relative speed limits. |
| TimeScorer | Steve Macenski | Scores and edge traversal time using absolute speed limits or previous traversal times. |
| PenaltyScorer | Steve Macenski | Scores using a static semantic penalty. |
| SemanticScorer | Steve Macenski | Scores using stored semantic data regarding the edge and/or nodes. |
| StartPoseOrientationScorer | Alex Yuen | Scores based on the initial pose and start edge orientations. |
| GoalPoseOrientationScorer | Alex Yuen | Scores based on the goal pose and goal edge orientations. |
| DynamicEdgesScorer | Steve Macenski | Scores based on a dynamically set service cost and/or closure. |
Route Operations
| Plugin Name | Creator | Description |
|---|---|---|
| AdjustSpeedLimit | Steve Macenski | Adjusts robot speed limits using an edge's semantic data. |
| CollisionMoniter | Steve Macenski | Checks for collision in the immediate future which tracking a route. |
| TimeMarker | Steve Macenski | Records the traversal time for an edge in the edge's metadata. |
| ReroutingService | Steve Macenski | Triggers a rereoute from an external server. |
| TriggerEvent | Steve Macenski | Triggers an event based on a configurable server name. |
Graph File Parsers
Currently, only geojson parsing is supported.