    * [ Constrained smoother ](../../configuration/packages/configuring-constrained-smoother.html)
      * [ Smoother Server Parameters ](../../configuration/packages/configuring-constrained-smoother.html#smoother-server-parameters)
      * [ Example ](../../configuration/packages/configuring-constrained-smoother.html#example)
    * [ Velocity Smoother ](../../configuration/packages/configuring-velocity-smoother.html)
      * [ Velocity Smoother Parameters ](../../configuration/packages/configuring-velocity-smoother.html#velocity-smoother-parameters)
      * [ Example ](../../configuration/packages/configuring-velocity-smoother.html#example)
    * [ Collision Monitor ](../../configuration/packages/configuring-collision-monitor.html)
      * [ Provided Nodes ](../../configuration/packages/configuring-collision-monitor.html#provided-nodes)
        * [ Collision Monitor Node ](../../configuration/packages/collision_monitor/configuring-collision-monitor-node.html)
        * [ Collision Detector Node ](../../configuration/packages/collision_monitor/configuring-collision-detector-node.html)
    * [ Waypoint Follower ](../../configuration/packages/configuring-waypoint-follower.html)
      * [ Parameters ](../../configuration/packages/configuring-waypoint-follower.html#parameters)
      * [ Provided Plugins ](../../configuration/packages/configuring-waypoint-follower.html#provided-plugins)
        * [ WaitAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/wait_at_waypoint.html)
        * [ PhotoAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/photo_at_waypoint.html)
        * [ InputAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/input_at_waypoint.html)
      * [ Default Plugin ](../../configuration/packages/configuring-waypoint-follower.html#default-plugin)
      * [ Example ](../../configuration/packages/configuring-waypoint-follower.html#example)
  * [ Tuning Guide ](../../tuning/index.html)
    * [ Inflation Potential Fields ](../../tuning/index.html#inflation-potential-fields)
    * [ Robot Footprint vs Radius ](../../tuning/index.html#robot-footprint-vs-radius)
    * [ Rotate in Place Behavior ](../../tuning/index.html#rotate-in-place-behavior)
    * [ Planner Plugin Selection ](../../tuning/index.html#planner-plugin-selection)
    * [ Controller Plugin Selection ](../../tuning/index.html#controller-plugin-selection)
    * [ Caching Obstacle Heuristic in Smac Planners ](../../tuning/index.html#caching-obstacle-heuristic-in-smac-planners)
    * [ Costmap2D Plugins ](../../tuning/index.html#costmap2d-plugins)
    * [ Nav2 Launch Options ](../../tuning/index.html#nav2-launch-options)
    * [ Other Pages We’d Love To Offer ](../../tuning/index.html#other-pages-we-d-love-to-offer)
  * [ Nav2 Behavior Trees ](../index.html)
    * [ Introduction To Nav2 Specific Nodes ](../overview/nav2_specific_nodes.html)
      * [ Action Nodes ](../overview/nav2_specific_nodes.html#action-nodes)
      * [ Condition Nodes ](../overview/nav2_specific_nodes.html#condition-nodes)
      * [ Decorator Nodes ](../overview/nav2_specific_nodes.html#decorator-nodes)
      * [ Control: PipelineSequence ](../overview/nav2_specific_nodes.html#control-pipelinesequence)
      * [ Control: Recovery ](../overview/nav2_specific_nodes.html#control-recovery)
      * [ Control: RoundRobin ](../overview/nav2_specific_nodes.html#control-roundrobin)
    * [ Detailed Behavior Tree Walkthrough ](../overview/detailed_behavior_tree_walkthrough.html)
      * [ Overview ](../overview/detailed_behavior_tree_walkthrough.html#overview)
      * [ Prerequisites ](../overview/detailed_behavior_tree_walkthrough.html#prerequisites)
      * [ Navigate To Pose With Replanning and Recovery ](../overview/detailed_behavior_tree_walkthrough.html#navigate-to-pose-with-replanning-and-recovery)


**[ SteveMacenski ](/SteveMacenski) ** commented  Nov 14, 2020  •


[ good first issue  ](/ros-planning/navigation2/labels/good%20first%20issue)
Good for newcomers  [ help wanted  ](/ros-
planning/navigation2/labels/help%20wanted) Extra attention is needed  [ in
progress  ](/ros-planning/navigation2/labels/in%20progress)


    * [ Costmap 2D ](../../configuration/packages/configuring-costmaps.html)
      * [ Costmap2D ROS Parameters ](../../configuration/packages/configuring-costmaps.html#costmap2d-ros-parameters)
      * [ Default Plugins ](../../configuration/packages/configuring-costmaps.html#default-plugins)
      * [ Plugin Parameters ](../../configuration/packages/configuring-costmaps.html#plugin-parameters)
        * [ Static Layer Parameters ](../../configuration/packages/costmap-plugins/static.html)
        * [ Inflation Layer Parameters ](../../configuration/packages/costmap-plugins/inflation.html)
        * [ Obstacle Layer Parameters ](../../configuration/packages/costmap-plugins/obstacle.html)
        * [ Voxel Layer Parameters ](../../configuration/packages/costmap-plugins/voxel.html)
        * [ Range Sensor Parameters ](../../configuration/packages/costmap-plugins/range.html)
        * [ Denoise Layer Parameters ](../../configuration/packages/costmap-plugins/denoise.html)
      * [ Costmap Filters Parameters ](../../configuration/packages/configuring-costmaps.html#costmap-filters-parameters)
        * [ Keepout Filter Parameters ](../../configuration/packages/costmap-plugins/keepout_filter.html)
        * [ Speed Filter Parameters ](../../configuration/packages/costmap-plugins/speed_filter.html)
        * [ Binary Filter Parameters ](../../configuration/packages/costmap-plugins/binary_filter.html)
      * [ Example ](../../configuration/packages/configuring-costmaps.html#example)
    * [ Lifecycle Manager ](../../configuration/packages/configuring-lifecycle.html)
      * [ Parameters ](../../configuration/packages/configuring-lifecycle.html#parameters)
      * [ Example ](../../configuration/packages/configuring-lifecycle.html#example)
    * [ Planner Server ](../../configuration/packages/configuring-planner-server.html)
      * [ Parameters ](../../configuration/packages/configuring-planner-server.html#parameters)
      * [ Default Plugins ](../../configuration/packages/configuring-planner-server.html#default-plugins)
      * [ Example ](../../configuration/packages/configuring-planner-server.html#example)
    * [ NavFn Planner ](../../configuration/packages/configuring-navfn.html)
      * [ Parameters ](../../configuration/packages/configuring-navfn.html#parameters)
      * [ Example ](../../configuration/packages/configuring-navfn.html#example)
    * [ Smac Planner ](../../configuration/packages/configuring-smac-planner.html)
      * [ Provided Plugins ](../../configuration/packages/configuring-smac-planner.html#provided-plugins)
        * [ Smac 2D Planner ](../../configuration/packages/smac/configuring-smac-2d.html)
        * [ Smac Hybrid-A* Planner ](../../configuration/packages/smac/configuring-smac-hybrid.html)
        * [ Smac State Lattice Planner ](../../configuration/packages/smac/configuring-smac-lattice.html)
      * [ Description ](../../configuration/packages/configuring-smac-planner.html#description)
    * [ Theta Star Planner ](../../configuration/packages/configuring-thetastar.html)
      * [ Parameters ](../../configuration/packages/configuring-thetastar.html#parameters)
      * [ Example ](../../configuration/packages/configuring-thetastar.html#example)
    * [ Controller Server ](../../configuration/packages/configuring-controller-server.html)
      * [ Parameters ](../../configuration/packages/configuring-controller-server.html#parameters)
      * [ Provided Plugins ](../../configuration/packages/configuring-controller-server.html#provided-plugins)
        * [ SimpleProgressChecker ](../../configuration/packages/nav2_controller-plugins/simple_progress_checker.html)
        * [ PoseProgressChecker ](../../configuration/packages/nav2_controller-plugins/pose_progress_checker.html)
        * [ SimpleGoalChecker ](../../configuration/packages/nav2_controller-plugins/simple_goal_checker.html)


###  Footer navigation


__ [ Nav2 ](../../index.html)


      * [ Appendix ](../../tutorials/docs/docker_dev.html#appendix)
        * [ Nav2 Development Image ](../../tutorials/docs/docker_dev.html#nav2-development-image)
        * [ Nav2 Deployment Image ](../../tutorials/docs/docker_dev.html#nav2-deployment-image)
  * [ Plugin Tutorials ](../../plugin_tutorials/index.html)
    * [ Writing a New Costmap2D Plugin ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#tutorial-steps)
        * [ 1- Write a new Costmap2D plugin ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#write-a-new-costmap2d-plugin)
        * [ 2- Export and make GradientLayer plugin ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#export-and-make-gradientlayer-plugin)
        * [ 3- Enable the plugin in Costmap2D ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#enable-the-plugin-in-costmap2d)
        * [ 4- Run GradientLayer plugin ](../../plugin_tutorials/docs/writing_new_costmap2d_plugin.html#run-gradientlayer-plugin)
    * [ Writing a New Planner Plugin ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#tutorial-steps)
        * [ 1- Creating a new Planner Plugin ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#creating-a-new-planner-plugin)
        * [ 2- Exporting the planner plugin ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#exporting-the-planner-plugin)
        * [ 3- Pass the plugin name through params file ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#pass-the-plugin-name-through-params-file)
        * [ 4- Run StraightLine plugin ](../../plugin_tutorials/docs/writing_new_nav2planner_plugin.html#run-straightline-plugin)
    * [ Writing a New Controller Plugin ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#tutorial-steps)
        * [ 1- Create a new Controller Plugin ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#create-a-new-controller-plugin)
        * [ 2- Exporting the controller plugin ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#exporting-the-controller-plugin)
        * [ 3- Pass the plugin name through the params file ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#pass-the-plugin-name-through-the-params-file)
        * [ 4- Run Pure Pursuit Controller plugin ](../../plugin_tutorials/docs/writing_new_nav2controller_plugin.html#run-pure-pursuit-controller-plugin)
    * [ Writing a New Behavior Tree Plugin ](../../plugin_tutorials/docs/writing_new_bt_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#tutorial-steps)
        * [ 1- Creating a new BT Plugin ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#creating-a-new-bt-plugin)
        * [ 2- Exporting the planner plugin ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#exporting-the-planner-plugin)
        * [ 3- Add plugin library name to config ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#add-plugin-library-name-to-config)
        * [ 4- Run Your Custom plugin ](../../plugin_tutorials/docs/writing_new_bt_plugin.html#run-your-custom-plugin)
    * [ Writing a New Behavior Plugin ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#tutorial-steps)


I see that default behaviors trees use fixed values for the planner_id
(GridBased) and controller_id (FollowPath) inputs, so It looks to me that a
dynamic solution for this is not provided yet.


  * [ ](../../index.html)
  * [ General Tutorials ](../index.html)
  * Adding a Smoother to a BT
  *


I'd say that what you're asking can be completed in a really reasonably and
easy way and so close this ticket, so if you don't think that's the best
solution for your needs worth keeping the ticket open, I'm all ears to see how
we can be more flexible.


      * [ New Plugins ](../../migration/Foxy.html#new-plugins)
      * [ Costmap Filters ](../../migration/Foxy.html#costmap-filters)
      * [ SmacPlanner ](../../migration/Foxy.html#smacplanner)
      * [ ThetaStarPlanner ](../../migration/Foxy.html#thetastarplanner)
      * [ RegulatedPurePursuitController ](../../migration/Foxy.html#regulatedpurepursuitcontroller)
      * [ Costmap2D ` current_  ` Usage ](../../migration/Foxy.html#costmap2d-current-usage)
      * [ Standard time units in parameters ](../../migration/Foxy.html#standard-time-units-in-parameters)
      * [ Ray Tracing Parameters ](../../migration/Foxy.html#ray-tracing-parameters)
      * [ Obstacle Marking Parameters ](../../migration/Foxy.html#obstacle-marking-parameters)
      * [ Recovery Action Changes ](../../migration/Foxy.html#recovery-action-changes)
      * [ Default Behavior Tree Changes ](../../migration/Foxy.html#default-behavior-tree-changes)
      * [ NavFn Planner Parameters ](../../migration/Foxy.html#navfn-planner-parameters)
      * [ New ClearCostmapExceptRegion and ClearCostmapAroundRobot BT-nodes ](../../migration/Foxy.html#new-clearcostmapexceptregion-and-clearcostmaparoundrobot-bt-nodes)
      * [ New Behavior Tree Nodes ](../../migration/Foxy.html#new-behavior-tree-nodes)
      * [ sensor_msgs/PointCloud to sensor_msgs/PointCloud2 Change ](../../migration/Foxy.html#sensor-msgs-pointcloud-to-sensor-msgs-pointcloud2-change)
      * [ ControllerServer New Parameter failure_tolerance ](../../migration/Foxy.html#controllerserver-new-parameter-failure-tolerance)
      * [ Removed BT XML Launch Configurations ](../../migration/Foxy.html#removed-bt-xml-launch-configurations)
      * [ Nav2 RViz Panel Action Feedback Information ](../../migration/Foxy.html#nav2-rviz-panel-action-feedback-information)
    * [ Galactic to Humble ](../../migration/Galactic.html)
      * [ Major improvements to Smac Planners ](../../migration/Galactic.html#major-improvements-to-smac-planners)
      * [ Simple (Python) Commander ](../../migration/Galactic.html#simple-python-commander)
      * [ Reduce Nodes and Executors ](../../migration/Galactic.html#reduce-nodes-and-executors)
      * [ API Change for nav2_core ](../../migration/Galactic.html#api-change-for-nav2-core)
      * [ Extending the BtServiceNode to process Service-Results ](../../migration/Galactic.html#extending-the-btservicenode-to-process-service-results)
      * [ Including new Rotation Shim Controller Plugin ](../../migration/Galactic.html#including-new-rotation-shim-controller-plugin)
      * [ Spawning the robot in Gazebo ](../../migration/Galactic.html#spawning-the-robot-in-gazebo)
      * [ Recovery Behavior Timeout ](../../migration/Galactic.html#recovery-behavior-timeout)
      * [ New parameter ` use_final_approach_orientation  ` for the 3 2D planners ](../../migration/Galactic.html#new-parameter-use-final-approach-orientation-for-the-3-2d-planners)
      * [ SmacPlanner2D and Theta*: fix goal orientation being ignored ](../../migration/Galactic.html#smacplanner2d-and-theta-fix-goal-orientation-being-ignored)
      * [ SmacPlanner2D, NavFn and Theta*: fix small path corner cases ](../../migration/Galactic.html#smacplanner2d-navfn-and-theta-fix-small-path-corner-cases)
      * [ Change and fix behavior of dynamic parameter change detection ](../../migration/Galactic.html#change-and-fix-behavior-of-dynamic-parameter-change-detection)
      * [ Dynamic Parameters ](../../migration/Galactic.html#dynamic-parameters)
      * [ BT Action Nodes Exception Changes ](../../migration/Galactic.html#bt-action-nodes-exception-changes)
      * [ BT Navigator Groot Multiple Navigators ](../../migration/Galactic.html#bt-navigator-groot-multiple-navigators)
      * [ Removed Kinematic Limiting in RPP ](../../migration/Galactic.html#removed-kinematic-limiting-in-rpp)
      * [ Added Smoother Task Server ](../../migration/Galactic.html#added-smoother-task-server)
      * [ Removed Use Approach Velocity Scaling Param in RPP ](../../migration/Galactic.html#removed-use-approach-velocity-scaling-param-in-rpp)
      * [ Refactored AMCL motion models as plugins ](../../migration/Galactic.html#refactored-amcl-motion-models-as-plugins)
      * [ Dropping Support for Live Groot Monitoring of Nav2 ](../../migration/Galactic.html#dropping-support-for-live-groot-monitoring-of-nav2)
      * [ Replanning Only if Path is Invalid ](../../migration/Galactic.html#replanning-only-if-path-is-invalid)


[ Edit ](https://github.com/ros-planning/navigation.ros.org)


[ Planner selector concept: Design and implementation questions  ros-
planning/navigation.ros.org#147  ](/ros-
planning/navigation.ros.org/issues/147)


    * [ Collision Monitor ](../../configuration/packages/configuring-collision-monitor.html)
      * [ Features ](../../configuration/packages/configuring-collision-monitor.html#features)
      * [ Parameters ](../../configuration/packages/configuring-collision-monitor.html#parameters)
        * [ Polygons parameters ](../../configuration/packages/configuring-collision-monitor.html#polygons-parameters)
        * [ Observation sources parameters ](../../configuration/packages/configuring-collision-monitor.html#observation-sources-parameters)
      * [ Example ](../../configuration/packages/configuring-collision-monitor.html#example)
    * [ Waypoint Follower ](../../configuration/packages/configuring-waypoint-follower.html)
      * [ Parameters ](../../configuration/packages/configuring-waypoint-follower.html#parameters)
      * [ Provided Plugins ](../../configuration/packages/configuring-waypoint-follower.html#provided-plugins)
        * [ WaitAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/wait_at_waypoint.html)
        * [ PhotoAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/photo_at_waypoint.html)
        * [ InputAtWaypoint ](../../configuration/packages/nav2_waypoint_follower-plugins/input_at_waypoint.html)
      * [ Default Plugin ](../../configuration/packages/configuring-waypoint-follower.html#default-plugin)
      * [ Example ](../../configuration/packages/configuring-waypoint-follower.html#example)
  * [ Tuning Guide ](../../tuning/index.html)
    * [ Inflation Potential Fields ](../../tuning/index.html#inflation-potential-fields)
    * [ Robot Footprint vs Radius ](../../tuning/index.html#robot-footprint-vs-radius)
    * [ Rotate in Place Behavior ](../../tuning/index.html#rotate-in-place-behavior)
    * [ Planner Plugin Selection ](../../tuning/index.html#planner-plugin-selection)
    * [ Controller Plugin Selection ](../../tuning/index.html#controller-plugin-selection)
    * [ Caching Obstacle Heuristic in Smac Planners ](../../tuning/index.html#caching-obstacle-heuristic-in-smac-planners)
    * [ Nav2 Launch Options ](../../tuning/index.html#nav2-launch-options)
    * [ Other Pages We’d Love To Offer ](../../tuning/index.html#other-pages-we-d-love-to-offer)
  * [ Nav2 Behavior Trees ](../../behavior_trees/index.html)
    * [ Introduction To Nav2 Specific Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html)
      * [ Action Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#action-nodes)
      * [ Condition Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#condition-nodes)
      * [ Decorator Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#decorator-nodes)
      * [ Control: PipelineSequence ](../../behavior_trees/overview/nav2_specific_nodes.html#control-pipelinesequence)
      * [ Control: Recovery ](../../behavior_trees/overview/nav2_specific_nodes.html#control-recovery)
      * [ Control: RoundRobin ](../../behavior_trees/overview/nav2_specific_nodes.html#control-roundrobin)
    * [ Detailed Behavior Tree Walkthrough ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html)
      * [ Overview ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#overview)
      * [ Prerequisites ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#prerequisites)
      * [ Navigate To Pose With Replanning and Recovery ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#navigate-to-pose-with-replanning-and-recovery)
      * [ Navigation Subtree ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#navigation-subtree)
      * [ Recovery Subtree ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#recovery-subtree)
    * [ Navigate To Pose ](../../behavior_trees/trees/nav_to_pose_recovery.html)
    * [ Navigate Through Poses ](../../behavior_trees/trees/nav_through_poses_recovery.html)
    * [ Navigate To Pose and Pause Near Goal-Obstacle ](../../behavior_trees/trees/nav_to_pose_and_pause_near_goal_obstacle.html)


**[ SteveMacenski ](/SteveMacenski) ** commented  Mar 16, 2021


  * That "PlannerSelector" could be a condition node or just a simple BTNode that lasts one single tick and it is called before ComputePathToPose.
  * That BTNode reads from the ROS network (parameter, topic or service) the desired planner and controller and then they are exposed to the BTTree XML so that they can bee passed as inputs in ComputePathToPose/planner_id and FollowPath/controller_id


#  Create Planner/Controller selector BT nodes  #2086


> In navigation2 this can be potentially done but you need to code own
> behavior to achieve it. It would be great if that behavior were already
> provided by default by the navigation2 stack.


latest


  * [ GoalReached ](bt-plugins/conditions/GoalReached.html)
  * [ TransformAvailable ](bt-plugins/conditions/TransformAvailable.html)
  * [ DistanceTraveled ](bt-plugins/conditions/DistanceTraveled.html)
  * [ GoalUpdated ](bt-plugins/conditions/GoalUpdated.html)
  * [ GloballyUpdatedGoal ](bt-plugins/conditions/GloballyUpdatedGoal.html)
  * [ InitialPoseReceived ](bt-plugins/conditions/InitialPoseReceived.html)
  * [ IsStuck ](bt-plugins/conditions/IsStuck.html)
  * [ TimeExpired ](bt-plugins/conditions/TimeExpired.html)
  * [ IsBatteryLow ](bt-plugins/conditions/IsBatteryLow.html)
  * [ IsPathValid ](bt-plugins/conditions/IsPathValid.html)
  * [ PathExpiringTimer ](bt-plugins/conditions/PathExpiringTimer.html)
  * [ AreErrorCodesPresent ](bt-plugins/conditions/AreErrorCodesPresent.html)
  * [ WouldAControllerRecoveryHelp ](bt-plugins/conditions/WouldAControllerRecoveryHelp.html)
  * [ WouldAPlannerRecoveryHelp ](bt-plugins/conditions/WouldAPlannerRecoveryHelp.html)
  * [ WouldASmootherRecoveryHelp ](bt-plugins/conditions/WouldASmootherRecoveryHelp.html)
  * [ IsBatteryCharging ](bt-plugins/conditions/IsBatteryCharging.html)


I think that is not correct. From my point of view, you cannot compare the
code of a "remote procedure call" invokation (that I can even invoke from a
bash terminal ) to create a new BTNode C++ class for the navigation
architecture (no matter if it is scalable) . What if I am a python developer
that do not know anything about c++ or behavior trees?


All reactions


##  Example  ¶


edited


Does this question make sense?


      * [ Subtrees Obtain Shared Resources ](../../migration/Iron.html#subtrees-obtain-shared-resources)
      * [ Collision Monitor: added watchdog mechanism based on ` source_timeout  ` parameter with default blocking behavior ](../../migration/Iron.html#collision-monitor-added-watchdog-mechanism-based-on-source-timeout-parameter-with-default-blocking-behavior)
      * [ BtActionServer: use native library haltTree() ](../../migration/Iron.html#btactionserver-use-native-library-halttree)
      * [ Global Frame Removed from 2 BT Nodes ](../../migration/Iron.html#global-frame-removed-from-2-bt-nodes)
      * [ Introduction of ` CostmapUpdate.msg  ` ](../../migration/Iron.html#introduction-of-costmapupdate-msg)
      * [ Full Stack Uses Node Clocks ](../../migration/Iron.html#full-stack-uses-node-clocks)
      * [ New Graceful Motion Controller ](../../migration/Iron.html#new-graceful-motion-controller)
      * [ Plugin Libraries in BT Navigator Only Includes Custom Nodes ](../../migration/Iron.html#plugin-libraries-in-bt-navigator-only-includes-custom-nodes)
      * [ New RViz Plugin for selecting Planners, Controllers, Goal Checkers, Progress Checkers and Smoothers ](../../migration/Iron.html#new-rviz-plugin-for-selecting-planners-controllers-goal-checkers-progress-checkers-and-smoothers)
      * [ RPP new optional ` interpolate_curvature_after_goal  ` behavior and fix conflict between ` use_rotate_to_heading  ` and ` allow_reversing  ` ](../../migration/Iron.html#rpp-new-optional-interpolate-curvature-after-goal-behavior-and-fix-conflict-between-use-rotate-to-heading-and-allow-reversing)
      * [ Cancel Checker Interface For GlobalPlanner ](../../migration/Iron.html#cancel-checker-interface-for-globalplanner)
      * [ New BtActionServer/BtNavigator parameter ](../../migration/Iron.html#new-btactionserver-btnavigator-parameter)
      * [ New collision monitor parameter ](../../migration/Iron.html#new-collision-monitor-parameter)
      * [ New graceful cancellation API for Controllers ](../../migration/Iron.html#new-graceful-cancellation-api-for-controllers)
      * [ Standardization of Plugin Naming with Double Colons (::) ](../../migration/Iron.html#standardization-of-plugin-naming-with-double-colons)
      * [ Collision monitor: dynamic radius for circle type polygons ](../../migration/Iron.html#collision-monitor-dynamic-radius-for-circle-type-polygons)
  * [ Simple Commander API ](../../commander_api/index.html)
    * [ Overview ](../../commander_api/index.html#overview)
    * [ Commander API ](../../commander_api/index.html#id1)
    * [ Costmap API ](../../commander_api/index.html#costmap-api)
    * [ Footprint Collision Checker API ](../../commander_api/index.html#footprint-collision-checker-api)
    * [ Examples and Demos ](../../commander_api/index.html#examples-and-demos)
  * [ Roadmaps ](../../roadmap/roadmap.html)
    * [ Jazzy Roadmap ](../../roadmap/roadmap.html#jazzy-roadmap)
    * [ Iron Roadmap ](../../roadmap/roadmap.html#iron-roadmap)
    * [ Humble Roadmap ](../../roadmap/roadmap.html#humble-roadmap)
  * [ About and Contact ](../../about/index.html)
    * [ Related Projects ](../../about/related_projects.html)
    * [ About ](../../about/index.html#id1)
    * [ Contact ](../../about/index.html#contact)


Already on GitHub? [ Sign in ](/login?return_to=%2Fros-
planning%2Fnavigation2%2Fissues%2Fnew%2Fchoose) to your account


    <root main_tree_to_execute="MainTree">
      <BehaviorTree ID="MainTree">
        <RecoveryNode number_of_retries="6" name="NavigateRecovery">
          <PipelineSequence name="NavigateWithReplanning">
            <RateController hz="1.0">
              <RecoveryNode number_of_retries="1" name="ComputePathToPose">
                <ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
                <ReactiveFallback name="ComputePathToPoseRecoveryFallback">
                  <GoalUpdated/>
                  <ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
                </ReactiveFallback>
              </RecoveryNode>
            </RateController>
            <RecoveryNode number_of_retries="1" name="FollowPath">
              <FollowPath path="{path}" controller_id="FollowPath"/>
              <ReactiveFallback name="FollowPathRecoveryFallback">
                <GoalUpdated/>
                <ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
              </ReactiveFallback>
            </RecoveryNode>
          </PipelineSequence>
          <ReactiveFallback name="RecoveryFallback">
            <GoalUpdated/>
            <RoundRobin name="RecoveryActions">
              <Sequence name="ClearingActions">
                <ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
                <ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
              </Sequence>
              <Spin spin_dist="1.57"/>
              <Wait wait_duration="5"/>
              <BackUp backup_dist="0.15" backup_speed="0.025"/>
            </RoundRobin>
          </ReactiveFallback>
        </RecoveryNode>
      </BehaviorTree>
    </root>


**[ SteveMacenski ](/SteveMacenski) ** commented  Nov 11, 2020  •


    * [ Navigate To Pose With Consistent Replanning And If Path Becomes Invalid ](../../behavior_trees/trees/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.html)
    * [ Follow Dynamic Point ](../../behavior_trees/trees/follow_point.html)
    * [ Odometry Calibration ](../../behavior_trees/trees/odometry_calibration.html)
  * [ Navigation Plugins ](../../plugins/index.html)
    * [ Behavior-Tree Navigators ](../../plugins/index.html#behavior-tree-navigators)
    * [ Costmap Layers ](../../plugins/index.html#costmap-layers)
    * [ Costmap Filters ](../../plugins/index.html#costmap-filters)
    * [ Controllers ](../../plugins/index.html#controllers)
    * [ Planners ](../../plugins/index.html#planners)
    * [ Smoothers ](../../plugins/index.html#smoothers)
    * [ Behaviors ](../../plugins/index.html#behaviors)
    * [ Waypoint Task Executors ](../../plugins/index.html#waypoint-task-executors)
    * [ Goal Checkers ](../../plugins/index.html#goal-checkers)
    * [ Progress Checkers ](../../plugins/index.html#progress-checkers)
    * [ Behavior Tree Nodes ](../../plugins/index.html#behavior-tree-nodes)
  * [ Migration Guides ](../../migration/index.html)
    * [ Dashing to Eloquent ](../../migration/Dashing.html)
      * [ New Packages ](../../migration/Dashing.html#new-packages)
      * [ New Plugins ](../../migration/Dashing.html#new-plugins)
      * [ Navigation2 Architectural Changes ](../../migration/Dashing.html#navigation2-architectural-changes)
    * [ Eloquent to Foxy ](../../migration/Eloquent.html)
      * [ General ](../../migration/Eloquent.html#general)
      * [ Server Updates ](../../migration/Eloquent.html#server-updates)
      * [ New Plugins ](../../migration/Eloquent.html#new-plugins)
      * [ Map Server Re-Work ](../../migration/Eloquent.html#map-server-re-work)
      * [ New Particle Filter Messages ](../../migration/Eloquent.html#new-particle-filter-messages)
      * [ Selection of Behavior Tree in each navigation action ](../../migration/Eloquent.html#selection-of-behavior-tree-in-each-navigation-action)
      * [ FollowPoint Capability ](../../migration/Eloquent.html#followpoint-capability)
      * [ New Costmap Layer ](../../migration/Eloquent.html#new-costmap-layer)
    * [ Foxy to Galactic ](../../migration/Foxy.html)
      * [ NavigateToPose Action Feedback updates ](../../migration/Foxy.html#navigatetopose-action-feedback-updates)
      * [ NavigateToPose BT-node Interface Changes ](../../migration/Foxy.html#navigatetopose-bt-node-interface-changes)
      * [ NavigateThroughPoses and ComputePathThroughPoses Actions Added ](../../migration/Foxy.html#navigatethroughposes-and-computepaththroughposes-actions-added)
      * [ ComputePathToPose BT-node Interface Changes ](../../migration/Foxy.html#computepathtopose-bt-node-interface-changes)
      * [ ComputePathToPose Action Interface Changes ](../../migration/Foxy.html#computepathtopose-action-interface-changes)
      * [ BackUp BT-node Interface Changes ](../../migration/Foxy.html#backup-bt-node-interface-changes)
      * [ BackUp Recovery Interface Changes ](../../migration/Foxy.html#backup-recovery-interface-changes)
      * [ Nav2 Controllers and Goal Checker Plugin Interface Changes ](../../migration/Foxy.html#nav2-controllers-and-goal-checker-plugin-interface-changes)
      * [ FollowPath goal_checker_id attribute ](../../migration/Foxy.html#followpath-goal-checker-id-attribute)
      * [ Groot Support ](../../migration/Foxy.html#groot-support)


Copy link


**[ pabloinigoblasco ](/pabloinigoblasco) ** commented  Nov 12, 2020  •


But I recognize that it could be a good node to add to our BT node library.
I'd review a PR on it :-)

---

All reactions


I do not claim that the planner and controller must be changed from outside of
the BT. In fact, the solution I have in mind uses the BTXML to switch the
planner and controller but It would required a new not implemented C++ BTNode
class.


Jump to bottom


      * [ Composition ](../../tutorials/docs/adding_a_nav2_task_server.html#composition)
      * [ Error codes ](../../tutorials/docs/adding_a_nav2_task_server.html#error-codes)
      * [ Conclusion ](../../tutorials/docs/adding_a_nav2_task_server.html#conclusion)
    * [ Filtering of Noise-Induced Obstacles ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html)
      * [ Overview ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#overview)
      * [ Requirements ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#requirements)
      * [ Tutorial Steps ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#tutorial-steps)
        * [ 1\. Enable Denoise Layer ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#enable-denoise-layer)
        * [ 2\. Run Nav2 stack ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#run-nav2-stack)
      * [ How it works ](../../tutorials/docs/filtering_of_noise-induced_obstacles.html#how-it-works)
    * [ Camera Calibration ](../../tutorials/docs/camera_calibration.html)
      * [ Overview ](../../tutorials/docs/camera_calibration.html#overview)
      * [ Requirements ](../../tutorials/docs/camera_calibration.html#requirements)
      * [ Tutorial Steps ](../../tutorials/docs/camera_calibration.html#tutorial-steps)
    * [ Get Backtrace in ROS 2 / Nav2 ](../../tutorials/docs/get_backtrace.html)
      * [ Overview ](../../tutorials/docs/get_backtrace.html#overview)
      * [ Preliminaries ](../../tutorials/docs/get_backtrace.html#preliminaries)
      * [ From a Node ](../../tutorials/docs/get_backtrace.html#from-a-node)
      * [ From a Launch File ](../../tutorials/docs/get_backtrace.html#from-a-launch-file)
      * [ From Large Project ](../../tutorials/docs/get_backtrace.html#from-large-project)
      * [ From Nav2 Bringup ](../../tutorials/docs/get_backtrace.html#from-nav2-bringup)
      * [ Automatic backtrace on crash ](../../tutorials/docs/get_backtrace.html#automatic-backtrace-on-crash)
    * [ Profiling in ROS 2 / Nav2 ](../../tutorials/docs/get_profile.html)
      * [ Overview ](../../tutorials/docs/get_profile.html#overview)
      * [ Preliminaries ](../../tutorials/docs/get_profile.html#preliminaries)
      * [ Profile from a Node ](../../tutorials/docs/get_profile.html#profile-from-a-node)
      * [ Profile from a Launch File ](../../tutorials/docs/get_profile.html#profile-from-a-launch-file)
      * [ From Nav2 Bringup ](../../tutorials/docs/get_profile.html#from-nav2-bringup)
      * [ Interpreting Results ](../../tutorials/docs/get_profile.html#interpreting-results)
    * [ Docker for Development: Zero to Hero ](../../tutorials/docs/docker_dev.html)
      * [ Overview ](../../tutorials/docs/docker_dev.html#overview)
      * [ Preliminaries ](../../tutorials/docs/docker_dev.html#preliminaries)
      * [ Important Docker Commands ](../../tutorials/docs/docker_dev.html#important-docker-commands)
      * [ Exploring Your First Container ](../../tutorials/docs/docker_dev.html#exploring-your-first-container)
      * [ Understanding ROS Docker Images ](../../tutorials/docs/docker_dev.html#understanding-ros-docker-images)
      * [ For Docker-Based Development ](../../tutorials/docs/docker_dev.html#for-docker-based-development)
        * [ Building a Development Image ](../../tutorials/docs/docker_dev.html#building-a-development-image)
        * [ Visualizations from Docker ](../../tutorials/docs/docker_dev.html#visualizations-from-docker)
      * [ For Docker-Based Deployment ](../../tutorials/docs/docker_dev.html#for-docker-based-deployment)
      * [ Conclusion ](../../tutorials/docs/docker_dev.html#conclusion)


  * [ Terms ](https://docs.github.com/site-policy/github-terms/github-terms-of-service)
  * [ Privacy ](https://docs.github.com/site-policy/privacy-policies/github-privacy-statement)
  * [ Security ](/security)
  * [ Status ](https://www.githubstatus.com/)
  * [ Docs ](https://docs.github.com/)
  * [ Contact ](https://support.github.com?tags=dotcom-footer)
  * Manage cookies
  * Do not share my personal information


To clarify, I added it to my list to document formally what I mentioned in my
last comment about how to enable it with BTs or changing the default plugins -
not any additional feature request since I think what you're asking for is
possible already. Not to say there's not room for improvement, but we'll need
some ideas to go on to elevate this to a 'feature request'.

---

All reactions


> Yes, see nav2 docs. The follow path / compute path to pose BT nodes have
> input ports allowing you to set the controller / planner ID it requests from
> the planner/controller servers.


> Again we are not aligned. those specific BT Nodes only offers the
> possibility of being changed from BT but not from the ROS network (that is
> what I was asking about)


**[ pabloinigoblasco ](/pabloinigoblasco) ** commented  Mar 16, 2021  •


      * [ Sensor Introduction ](../../setup_guides/sensors/setup_sensors.html#sensor-introduction)
        * [ Common Sensor Messages ](../../setup_guides/sensors/setup_sensors.html#common-sensor-messages)
      * [ Simulating Sensors using Gazebo ](../../setup_guides/sensors/setup_sensors.html#simulating-sensors-using-gazebo)
        * [ Adding Gazebo Plugins to a URDF ](../../setup_guides/sensors/setup_sensors.html#adding-gazebo-plugins-to-a-urdf)
        * [ Launch and Build Files ](../../setup_guides/sensors/setup_sensors.html#launch-and-build-files)
        * [ Build, Run and Verification ](../../setup_guides/sensors/setup_sensors.html#build-run-and-verification)
      * [ Mapping and Localization ](../../setup_guides/sensors/setup_sensors.html#mapping-and-localization)
      * [ Costmap 2D ](../../setup_guides/sensors/setup_sensors.html#costmap-2d)
        * [ Configuring nav2_costmap_2d ](../../setup_guides/sensors/setup_sensors.html#configuring-nav2-costmap-2d)
        * [ Build, Run and Verification ](../../setup_guides/sensors/setup_sensors.html#id2)
      * [ Conclusion ](../../setup_guides/sensors/setup_sensors.html#conclusion)
    * [ Setting Up the Robot’s Footprint ](../../setup_guides/footprint/setup_footprint.html)
      * [ Footprint Introduction ](../../setup_guides/footprint/setup_footprint.html#footprint-introduction)
      * [ Configuring the Robot’s Footprint ](../../setup_guides/footprint/setup_footprint.html#configuring-the-robot-s-footprint)
      * [ Build, Run and Verification ](../../setup_guides/footprint/setup_footprint.html#build-run-and-verification)
      * [ Visualizing Footprint in RViz ](../../setup_guides/footprint/setup_footprint.html#visualizing-footprint-in-rviz)
      * [ Conclusion ](../../setup_guides/footprint/setup_footprint.html#conclusion)
    * [ Setting Up Navigation Plugins ](../../setup_guides/algorithm/select_algorithm.html)
      * [ Planner and Controller Servers ](../../setup_guides/algorithm/select_algorithm.html#planner-and-controller-servers)
      * [ Selecting the Algorithm Plugins ](../../setup_guides/algorithm/select_algorithm.html#selecting-the-algorithm-plugins)
        * [ Planner Server ](../../setup_guides/algorithm/select_algorithm.html#planner-server)
        * [ Controller Server ](../../setup_guides/algorithm/select_algorithm.html#controller-server)
      * [ Conclusion ](../../setup_guides/algorithm/select_algorithm.html#conclusion)
  * [ Robots Using ](../../about/robots.html)
  * [ General Tutorials ](../../tutorials/index.html)
    * [ Navigating with a Physical Turtlebot 3 ](../../tutorials/docs/navigation2_on_real_turtlebot3.html)
      * [ Overview ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#overview)
      * [ Requirements ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#requirements)
      * [ Tutorial Steps ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#tutorial-steps)
        * [ 0- Setup Your Enviroment Variables ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#setup-your-enviroment-variables)
        * [ 1- Launch Turtlebot 3 ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#launch-turtlebot-3)
        * [ 2- Launch Nav2 ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#launch-nav2)
        * [ 3- Launch RVIZ ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#launch-rviz)
        * [ 4- Initialize the Location of Turtlebot 3 ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#initialize-the-location-of-turtlebot-3)
        * [ 5- Send a Goal Pose ](../../tutorials/docs/navigation2_on_real_turtlebot3.html#send-a-goal-pose)
    * [ (SLAM) Navigating While Mapping ](../../tutorials/docs/navigation2_with_slam.html)
      * [ Overview ](../../tutorials/docs/navigation2_with_slam.html#overview)
      * [ Requirements ](../../tutorials/docs/navigation2_with_slam.html#requirements)
      * [ Tutorial Steps ](../../tutorials/docs/navigation2_with_slam.html#tutorial-steps)
        * [ 0- Launch Robot Interfaces ](../../tutorials/docs/navigation2_with_slam.html#launch-robot-interfaces)


[ Edit ](https://github.com/ros-planning/navigation.ros.org)


        * [ SimpleGoalChecker ](nav2_controller-plugins/simple_goal_checker.html)
        * [ StoppedGoalChecker ](nav2_controller-plugins/stopped_goal_checker.html)
      * [ Default Plugins ](configuring-controller-server.html#default-plugins)
      * [ Example ](configuring-controller-server.html#example)
    * [ DWB Controller ](configuring-dwb-controller.html)
      * [ Controller ](configuring-dwb-controller.html#controller)
        * [ DWB Controller ](dwb-params/controller.html)
        * [ XYTheta Iterator ](dwb-params/iterator.html)
        * [ Kinematic Parameters ](dwb-params/kinematic.html)
        * [ Publisher ](dwb-params/visualization.html)
      * [ Plugins ](configuring-dwb-controller.html#plugins)
        * [ LimitedAccelGenerator ](dwb-plugins/limited_accel_generator.html)
        * [ StandardTrajectoryGenerator ](dwb-plugins/standard_traj_generator.html)
      * [ Trajectory Critics ](configuring-dwb-controller.html#trajectory-critics)
        * [ BaseObstacleCritic ](trajectory_critics/base_obstacle.html)
        * [ GoalAlignCritic ](trajectory_critics/goal_align.html)
        * [ GoalDistCritic ](trajectory_critics/goal_dist.html)
        * [ ObstacleFootprintCritic ](trajectory_critics/obstacle_footprint.html)
        * [ OscillationCritic ](trajectory_critics/oscillation.html)
        * [ PathAlignCritic ](trajectory_critics/path_align.html)
        * [ PathDistCritic ](trajectory_critics/path_dist.html)
        * [ PreferForwardCritic ](trajectory_critics/prefer_forward.html)
        * [ RotateToGoalCritic ](trajectory_critics/rotate_to_goal.html)
        * [ TwirlingCritic ](trajectory_critics/twirling.html)
      * [ Example ](configuring-dwb-controller.html#example)
    * [ Regulated Pure Pursuit ](configuring-regulated-pp.html)
      * [ Regulated Pure Pursuit Parameters ](configuring-regulated-pp.html#regulated-pure-pursuit-parameters)
      * [ Example ](configuring-regulated-pp.html#example)
    * [ Model Predictive Path Integral Controller ](configuring-mppic.html)
      * [ MPPI Parameters ](configuring-mppic.html#mppi-parameters)
        * [ Trajectory Visualization ](configuring-mppic.html#trajectory-visualization)
        * [ Path Handler ](configuring-mppic.html#path-handler)
        * [ Ackermann Motion Model ](configuring-mppic.html#ackermann-motion-model)
        * [ Constraint Critic ](configuring-mppic.html#constraint-critic)
        * [ Goal Angle Critic ](configuring-mppic.html#goal-angle-critic)
        * [ Goal Critic ](configuring-mppic.html#goal-critic)
        * [ Obstacles Critic ](configuring-mppic.html#obstacles-critic)
        * [ Cost Critic ](configuring-mppic.html#cost-critic)
        * [ Path Align Critic ](configuring-mppic.html#path-align-critic)
        * [ Path Angle Critic ](configuring-mppic.html#path-angle-critic)


This weekend I will think a bit more to that idea of creating a custom
behavior and I may implement it.


* [ The ReadME Project  GitHub community articles  ](/readme)


        * [ SimpleGoalChecker ](../../configuration/packages/nav2_controller-plugins/simple_goal_checker.html)
        * [ StoppedGoalChecker ](../../configuration/packages/nav2_controller-plugins/stopped_goal_checker.html)
      * [ Default Plugins ](../../configuration/packages/configuring-controller-server.html#default-plugins)
      * [ Example ](../../configuration/packages/configuring-controller-server.html#example)
    * [ DWB Controller ](../../configuration/packages/configuring-dwb-controller.html)
      * [ Controller ](../../configuration/packages/configuring-dwb-controller.html#controller)
        * [ DWB Controller ](../../configuration/packages/dwb-params/controller.html)
        * [ XYTheta Iterator ](../../configuration/packages/dwb-params/iterator.html)
        * [ Kinematic Parameters ](../../configuration/packages/dwb-params/kinematic.html)
        * [ Publisher ](../../configuration/packages/dwb-params/visualization.html)
      * [ Plugins ](../../configuration/packages/configuring-dwb-controller.html#plugins)
        * [ LimitedAccelGenerator ](../../configuration/packages/dwb-plugins/limited_accel_generator.html)
        * [ StandardTrajectoryGenerator ](../../configuration/packages/dwb-plugins/standard_traj_generator.html)
      * [ Trajectory Critics ](../../configuration/packages/configuring-dwb-controller.html#trajectory-critics)
        * [ BaseObstacleCritic ](../../configuration/packages/trajectory_critics/base_obstacle.html)
        * [ GoalAlignCritic ](../../configuration/packages/trajectory_critics/goal_align.html)
        * [ GoalDistCritic ](../../configuration/packages/trajectory_critics/goal_dist.html)
        * [ ObstacleFootprintCritic ](../../configuration/packages/trajectory_critics/obstacle_footprint.html)
        * [ OscillationCritic ](../../configuration/packages/trajectory_critics/oscillation.html)
        * [ PathAlignCritic ](../../configuration/packages/trajectory_critics/path_align.html)
        * [ PathDistCritic ](../../configuration/packages/trajectory_critics/path_dist.html)
        * [ PreferForwardCritic ](../../configuration/packages/trajectory_critics/prefer_forward.html)
        * [ RotateToGoalCritic ](../../configuration/packages/trajectory_critics/rotate_to_goal.html)
        * [ TwirlingCritic ](../../configuration/packages/trajectory_critics/twirling.html)
      * [ Example ](../../configuration/packages/configuring-dwb-controller.html#example)
    * [ Regulated Pure Pursuit ](../../configuration/packages/configuring-regulated-pp.html)
      * [ Regulated Pure Pursuit Parameters ](../../configuration/packages/configuring-regulated-pp.html#regulated-pure-pursuit-parameters)
      * [ Example ](../../configuration/packages/configuring-regulated-pp.html#example)
    * [ Model Predictive Path Integral Controller ](../../configuration/packages/configuring-mppic.html)
      * [ MPPI Parameters ](../../configuration/packages/configuring-mppic.html#mppi-parameters)
        * [ Trajectory Visualization ](../../configuration/packages/configuring-mppic.html#trajectory-visualization)
        * [ Path Handler ](../../configuration/packages/configuring-mppic.html#path-handler)
        * [ Ackermann Motion Model ](../../configuration/packages/configuring-mppic.html#ackermann-motion-model)
        * [ Constraint Critic ](../../configuration/packages/configuring-mppic.html#constraint-critic)
        * [ Goal Angle Critic ](../../configuration/packages/configuring-mppic.html#goal-angle-critic)
        * [ Goal Critic ](../../configuration/packages/configuring-mppic.html#goal-critic)
        * [ Obstacles Critic ](../../configuration/packages/configuring-mppic.html#obstacles-critic)
        * [ Cost Critic ](../../configuration/packages/configuring-mppic.html#cost-critic)
        * [ Path Align Critic ](../../configuration/packages/configuring-mppic.html#path-align-critic)
        * [ Path Angle Critic ](../../configuration/packages/configuring-mppic.html#path-angle-critic)


If you wish to see the difference, but not track the smoothed path, you may
wish to remove the ` smoothed_path="{path}"  ` portion to compute the smoothed
path, but not replace the original path with it. Instead, the topic `
/smoothed_path  ` contains this information published by the smoother server
for visualization or use by other parts of the system. You may also remap the
smoothed path to another blackboard variable to interact with it in other
parts of the behavior tree (e.g. ` smoothed_path="{smoothed_path}"  ` ).


Under each name, the parameters for that particular algorithm must be
specified along with the ` plugin  ` name for pluginlib to load a given
algorithm’s library. An example configuration of 2 smoother plugins is shown
below that could be used in the ` nav2_params.yaml  ` for your robot.


> Creating a custom behavior that receives (via topic/service) the desired
> plan and writes that into the BT blackboard


[
![@pabloinigoblasco](https://avatars.githubusercontent.com/u/13334595?s=40&u=b604bb463ac657f5b1a02f5c403eab807c327c5a&v=4)
](/pabloinigoblasco) [ pabloinigoblasco ](/pabloinigoblasco) closed this as [
completed ](/ros-
planning/navigation2/issues?q=is%3Aissue+is%3Aclosed+archived%3Afalse+reason%3Acompleted)
Mar 16, 2021


    * [ Constrained smoother ](configuring-constrained-smoother.html)
      * [ Smoother Server Parameters ](configuring-constrained-smoother.html#smoother-server-parameters)
      * [ Example ](configuring-constrained-smoother.html#example)
    * [ Velocity Smoother ](configuring-velocity-smoother.html)
      * [ Velocity Smoother Parameters ](configuring-velocity-smoother.html#velocity-smoother-parameters)
      * [ Example ](configuring-velocity-smoother.html#example)
    * [ Collision Monitor ](configuring-collision-monitor.html)
      * [ Provided Nodes ](configuring-collision-monitor.html#provided-nodes)
        * [ Collision Monitor Node ](collision_monitor/configuring-collision-monitor-node.html)
        * [ Collision Detector Node ](collision_monitor/configuring-collision-detector-node.html)
    * [ Waypoint Follower ](configuring-waypoint-follower.html)
      * [ Parameters ](configuring-waypoint-follower.html#parameters)
      * [ Provided Plugins ](configuring-waypoint-follower.html#provided-plugins)
        * [ WaitAtWaypoint ](nav2_waypoint_follower-plugins/wait_at_waypoint.html)
        * [ PhotoAtWaypoint ](nav2_waypoint_follower-plugins/photo_at_waypoint.html)
        * [ InputAtWaypoint ](nav2_waypoint_follower-plugins/input_at_waypoint.html)
      * [ Default Plugin ](configuring-waypoint-follower.html#default-plugin)
      * [ Example ](configuring-waypoint-follower.html#example)
  * [ Tuning Guide ](../../tuning/index.html)
    * [ Inflation Potential Fields ](../../tuning/index.html#inflation-potential-fields)
    * [ Robot Footprint vs Radius ](../../tuning/index.html#robot-footprint-vs-radius)
    * [ Rotate in Place Behavior ](../../tuning/index.html#rotate-in-place-behavior)
    * [ Planner Plugin Selection ](../../tuning/index.html#planner-plugin-selection)
    * [ Controller Plugin Selection ](../../tuning/index.html#controller-plugin-selection)
    * [ Caching Obstacle Heuristic in Smac Planners ](../../tuning/index.html#caching-obstacle-heuristic-in-smac-planners)
    * [ Costmap2D Plugins ](../../tuning/index.html#costmap2d-plugins)
    * [ Nav2 Launch Options ](../../tuning/index.html#nav2-launch-options)
    * [ Other Pages We’d Love To Offer ](../../tuning/index.html#other-pages-we-d-love-to-offer)
  * [ Nav2 Behavior Trees ](../../behavior_trees/index.html)
    * [ Introduction To Nav2 Specific Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html)
      * [ Action Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#action-nodes)
      * [ Condition Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#condition-nodes)
      * [ Decorator Nodes ](../../behavior_trees/overview/nav2_specific_nodes.html#decorator-nodes)
      * [ Control: PipelineSequence ](../../behavior_trees/overview/nav2_specific_nodes.html#control-pipelinesequence)
      * [ Control: Recovery ](../../behavior_trees/overview/nav2_specific_nodes.html#control-recovery)
      * [ Control: RoundRobin ](../../behavior_trees/overview/nav2_specific_nodes.html#control-roundrobin)
    * [ Detailed Behavior Tree Walkthrough ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html)
      * [ Overview ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#overview)
      * [ Prerequisites ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#prerequisites)
      * [ Navigate To Pose With Replanning and Recovery ](../../behavior_trees/overview/detailed_behavior_tree_walkthrough.html#navigate-to-pose-with-replanning-and-recovery)


> Cross linking docs to this to remind me this is something non-obvious to
> people


> Yes, you can create a trivial BT node that sets an input port of the
> {compute path, follow path} nodes to select the mapped algorithm ID in the
> server (e.g. GridBased, whatever name you chose). You mention that you think
> there should be some "included" code do to this, but by your description,
> you have your own non-included code to change with dynamic reconfigure. So
> this really isn't any different except the BT node solution is scalable and
> not abusing dynamic reconfigure for what is it not meant for.


* Open Source


Thanks for your answer, but I am afraid we are not aligned yet. For me it is
obvious that it can be done/implemented.


Yes. There are many solutions here. You could have the condition node which
goes down one branch if true and another if false, each with a
controller/planner ID that makes the condition. Another would be an action
node that just looks for a topic / service / parameter and sets the blackboard
parameter for controller/planner ID to the new value to use and have the BT
XML input port for the tasks use the blackboard value. Probably another 2-3
ways to do it.


Additional navigation options


Copy link


To see all available qualifiers, see our [ documentation
](https://docs.github.com/search-github/github-code-search/understanding-
github-code-search-syntax) .


**[ pabloinigoblasco ](/pabloinigoblasco) ** commented  Nov 11, 2020  •


I agree, I see the XML as a parameter file. And I understand that it must be
configured in the way it is more convenient for each specific application. I
also agree that a single XML could be created to adapt to N situations or
algorithms.


No one assigned


edited


And its as simple as that! You can now compile or use this behavior tree in
your system and see that the plans are now smoothed and the controllers are
now tracking this smoothed path. The image at the top of the tutorial shows
the unsmoothed path from NavFn (red) and the smoothed path (black). Note the
smoother approach to goal, turns, and transitions in the straight-line
segments.


    <Sequence name= "TryToResolveSmootherErrorCodes">
      <WouldASmootherRecoveryHelp error_code="{smoother_error_code}">
      <!-- recovery to resolve smoother error code goes here -->
    <Sequence/>


        * [ CancelCoverage ](../../configuration/packages/bt-plugins/actions/CancelCoverage.html)
        * [ RemovePassedGoals ](../../configuration/packages/bt-plugins/actions/RemovePassedGoals.html)
        * [ CancelControl ](../../configuration/packages/bt-plugins/actions/CancelControl.html)
        * [ CancelBackUp ](../../configuration/packages/bt-plugins/actions/CancelBackUp.html)
        * [ CancelSpin ](../../configuration/packages/bt-plugins/actions/CancelSpin.html)
        * [ CancelWait ](../../configuration/packages/bt-plugins/actions/CancelWait.html)
        * [ CancelDriveOnHeading ](../../configuration/packages/bt-plugins/actions/CancelDriveOnHeading.html)
        * [ CancelAssistedTeleop ](../../configuration/packages/bt-plugins/actions/CancelAssistedTeleop.html)
        * [ SmoothPath ](../../configuration/packages/bt-plugins/actions/Smooth.html)
      * [ Condition Plugins ](../../configuration/packages/configuring-bt-xml.html#condition-plugins)
        * [ GoalReached ](../../configuration/packages/bt-plugins/conditions/GoalReached.html)
        * [ TransformAvailable ](../../configuration/packages/bt-plugins/conditions/TransformAvailable.html)
        * [ DistanceTraveled ](../../configuration/packages/bt-plugins/conditions/DistanceTraveled.html)
        * [ GoalUpdated ](../../configuration/packages/bt-plugins/conditions/GoalUpdated.html)
        * [ GloballyUpdatedGoal ](../../configuration/packages/bt-plugins/conditions/GloballyUpdatedGoal.html)
        * [ InitialPoseReceived ](../../configuration/packages/bt-plugins/conditions/InitialPoseReceived.html)
        * [ IsStuck ](../../configuration/packages/bt-plugins/conditions/IsStuck.html)
        * [ TimeExpired ](../../configuration/packages/bt-plugins/conditions/TimeExpired.html)
        * [ IsBatteryLow ](../../configuration/packages/bt-plugins/conditions/IsBatteryLow.html)
        * [ IsPathValid ](../../configuration/packages/bt-plugins/conditions/IsPathValid.html)
        * [ PathExpiringTimer ](../../configuration/packages/bt-plugins/conditions/PathExpiringTimer.html)
        * [ AreErrorCodesPresent ](../../configuration/packages/bt-plugins/conditions/AreErrorCodesPresent.html)
        * [ WouldAControllerRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldAControllerRecoveryHelp.html)
        * [ WouldAPlannerRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldAPlannerRecoveryHelp.html)
        * [ WouldASmootherRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldASmootherRecoveryHelp.html)
        * [ IsBatteryCharging ](../../configuration/packages/bt-plugins/conditions/IsBatteryCharging.html)
      * [ Control Plugins ](../../configuration/packages/configuring-bt-xml.html#control-plugins)
        * [ PipelineSequence ](../../configuration/packages/bt-plugins/controls/PipelineSequence.html)
        * [ RoundRobin ](../../configuration/packages/bt-plugins/controls/RoundRobin.html)
        * [ RecoveryNode ](../../configuration/packages/bt-plugins/controls/RecoveryNode.html)
      * [ Decorator Plugins ](../../configuration/packages/configuring-bt-xml.html#decorator-plugins)
        * [ RateController ](../../configuration/packages/bt-plugins/decorators/RateController.html)
        * [ DistanceController ](../../configuration/packages/bt-plugins/decorators/DistanceController.html)
        * [ SpeedController ](../../configuration/packages/bt-plugins/decorators/SpeedController.html)
        * [ GoalUpdater ](../../configuration/packages/bt-plugins/decorators/GoalUpdater.html)
        * [ PathLongerOnApproach ](../../configuration/packages/bt-plugins/decorators/PathLongerOnApproach.html)
        * [ SingleTrigger ](../../configuration/packages/bt-plugins/decorators/SingleTrigger.html)
      * [ Example ](../../configuration/packages/configuring-bt-xml.html#example)
    * [ Costmap 2D ](../../configuration/packages/configuring-costmaps.html)
      * [ Costmap2D ROS Parameters ](../../configuration/packages/configuring-costmaps.html#costmap2d-ros-parameters)


    smoother_server:
      ros__parameters:
        costmap_topic: global_costmap/costmap_raw
        footprint_topic: global_costmap/published_footprint
        robot_base_frame: base_link
        transform_timeout: 0.1
        smoother_plugins: ["simple_smoother", "curvature_smoother"]
        simple_smoother:
          plugin: "nav2_smoother::SimpleSmoother"
          tolerance: 1.0e-10
          do_refinement: True
        curvature_smoother:
          plugin: "nav2_ceres_costaware_smoother/CeresCostawareSmoother"


[ ](https://github.com "GitHub") © 2024 GitHub, Inc.


I agree, I guess this is a feature request.
Switching between planners could be done in ROS1 just updating a dynamic
parameter (even from the command line), it was clear and simple.


Similarly, the controller has similar logic. If it fails, it also attempts a
costmap clearing of the local costmap impacting the controller. It is worth
noting the ` GoalUpdated  ` node in the reactive fallback. This allows us to
exit recovery conditions when a new goal has been passed to the navigation
system through a preemption. This ensures that the navigation system will be
very responsive immediately when a new goal is issued, even when the last goal
was in an attempted recovery.


  * [ PipelineSequence ](bt-plugins/controls/PipelineSequence.html)
  * [ RoundRobin ](bt-plugins/controls/RoundRobin.html)
  * [ RecoveryNode ](bt-plugins/controls/RecoveryNode.html)


> > Is that BTNode that allows me switch between planner and controllers
> already implemented in the nav stack2?


Can you lay out a vision for how that could be addressed scalably? I'm not
opposed to creating behaviors for changing algorithms outside of the BT, but
there has to be some reasonable design behind it. Changing a BT to specify a `
controller_id ` input port defined by the ` FollowPath ` BT node is extremely
reasonable requiring no code updates beyond the XML (which you could think of
as a parameter file; all users should have their own tuned for their own
needs) and scalable to ` N ` algorithms in any definable context or event.


It looks to me like the navigation stack is requesting to be the center of all
the robot application, even if in some cases the navigation may be a secondary
functionality.


> > Is it possible to change the planner and controller from an external input
> (topic, service or parameter)? Is there a short code snippet (bash, c++, BT-
> XML) I could use to achieve it?


Resources


        * [ 1- Launch Navigation2 ](../../tutorials/docs/navigation2_with_slam.html#launch-navigation2)
        * [ 2- Launch SLAM ](../../tutorials/docs/navigation2_with_slam.html#launch-slam)
        * [ 3- Working with SLAM ](../../tutorials/docs/navigation2_with_slam.html#working-with-slam)
        * [ 4- Getting Started Simplification ](../../tutorials/docs/navigation2_with_slam.html#getting-started-simplification)
    * [ (STVL) Using an External Costmap Plugin ](../../tutorials/docs/navigation2_with_stvl.html)
      * [ Overview ](../../tutorials/docs/navigation2_with_stvl.html#overview)
      * [ Costmap2D and STVL ](../../tutorials/docs/navigation2_with_stvl.html#costmap2d-and-stvl)
      * [ Tutorial Steps ](../../tutorials/docs/navigation2_with_stvl.html#tutorial-steps)
        * [ 0- Setup ](../../tutorials/docs/navigation2_with_stvl.html#setup)
        * [ 1- Install STVL ](../../tutorials/docs/navigation2_with_stvl.html#install-stvl)
        * [ 1- Modify Navigation2 Parameter ](../../tutorials/docs/navigation2_with_stvl.html#modify-navigation2-parameter)
        * [ 2- Launch Navigation2 ](../../tutorials/docs/navigation2_with_stvl.html#launch-navigation2)
        * [ 3- RVIZ ](../../tutorials/docs/navigation2_with_stvl.html#rviz)
    * [ Navigating Using GPS Localization ](../../tutorials/docs/navigation2_with_gps.html)
      * [ Overview ](../../tutorials/docs/navigation2_with_gps.html#overview)
      * [ Requirements ](../../tutorials/docs/navigation2_with_gps.html#requirements)
      * [ GPS Localization Overview ](../../tutorials/docs/navigation2_with_gps.html#gps-localization-overview)
      * [ Tutorial Steps ](../../tutorials/docs/navigation2_with_gps.html#tutorial-steps)
        * [ 0- Setup Gazebo World ](../../tutorials/docs/navigation2_with_gps.html#setup-gazebo-world)
        * [ 1- Setup GPS Localization system ](../../tutorials/docs/navigation2_with_gps.html#setup-gps-localization-system)
        * [ 2- Setup Navigation system ](../../tutorials/docs/navigation2_with_gps.html#setup-navigation-system)
        * [ 3- Interactive GPS Waypoint Follower ](../../tutorials/docs/navigation2_with_gps.html#interactive-gps-waypoint-follower)
        * [ 4- Logged GPS Waypoint Follower & Waypoint Logging ](../../tutorials/docs/navigation2_with_gps.html#logged-gps-waypoint-follower-waypoint-logging)
      * [ Conclusion ](../../tutorials/docs/navigation2_with_gps.html#conclusion)
    * [ Groot - Interacting with Behavior Trees ](../../tutorials/docs/using_groot.html)
      * [ Overview ](../../tutorials/docs/using_groot.html#overview)
      * [ Visualize Behavior Trees ](../../tutorials/docs/using_groot.html#visualize-behavior-trees)
      * [ Edit Behavior Trees ](../../tutorials/docs/using_groot.html#edit-behavior-trees)
      * [ Adding A Custom Node ](../../tutorials/docs/using_groot.html#adding-a-custom-node)
    * [ Using VIO to Augment Robot Odometry ](../../tutorials/docs/integrating_vio.html)
      * [ Overview ](../../tutorials/docs/integrating_vio.html#overview)
      * [ Setting Up the ZED X Camera ](../../tutorials/docs/integrating_vio.html#setting-up-the-zed-x-camera)
      * [ Setting Up ZED ROS ](../../tutorials/docs/integrating_vio.html#setting-up-zed-ros)
      * [ Fusing VIO Into Local State Estimate ](../../tutorials/docs/integrating_vio.html#fusing-vio-into-local-state-estimate)
        * [ Fusing VSLAM Into Global State Estimate ](../../tutorials/docs/integrating_vio.html#fusing-vslam-into-global-state-estimate)
      * [ Testing it Out! ](../../tutorials/docs/integrating_vio.html#testing-it-out)
    * [ Dynamic Object Following ](../../tutorials/docs/navigation2_dynamic_point_following.html)
      * [ Overview ](../../tutorials/docs/navigation2_dynamic_point_following.html#overview)
      * [ Tutorial Steps ](../../tutorials/docs/navigation2_dynamic_point_following.html#tutorial-steps)
        * [ 0- Create the Behavior Tree ](../../tutorials/docs/navigation2_dynamic_point_following.html#create-the-behavior-tree)


Toggle navigation


Sorry, something went wrong.


[ Nav2 ![Logo](../../_static/nav2_logo_powered.png) ](../../index.html)


edited


###  1- Specifying a Smoother Plugin  ¶


        * [ StoppedGoalChecker ](../../configuration/packages/nav2_controller-plugins/stopped_goal_checker.html)
      * [ Default Plugins ](../../configuration/packages/configuring-controller-server.html#default-plugins)
      * [ Example ](../../configuration/packages/configuring-controller-server.html#example)
    * [ DWB Controller ](../../configuration/packages/configuring-dwb-controller.html)
      * [ Controller ](../../configuration/packages/configuring-dwb-controller.html#controller)
        * [ DWB Controller ](../../configuration/packages/dwb-params/controller.html)
        * [ XYTheta Iterator ](../../configuration/packages/dwb-params/iterator.html)
        * [ Kinematic Parameters ](../../configuration/packages/dwb-params/kinematic.html)
        * [ Publisher ](../../configuration/packages/dwb-params/visualization.html)
      * [ Plugins ](../../configuration/packages/configuring-dwb-controller.html#plugins)
        * [ LimitedAccelGenerator ](../../configuration/packages/dwb-plugins/limited_accel_generator.html)
        * [ StandardTrajectoryGenerator ](../../configuration/packages/dwb-plugins/standard_traj_generator.html)
      * [ Trajectory Critics ](../../configuration/packages/configuring-dwb-controller.html#trajectory-critics)
        * [ BaseObstacleCritic ](../../configuration/packages/trajectory_critics/base_obstacle.html)
        * [ GoalAlignCritic ](../../configuration/packages/trajectory_critics/goal_align.html)
        * [ GoalDistCritic ](../../configuration/packages/trajectory_critics/goal_dist.html)
        * [ ObstacleFootprintCritic ](../../configuration/packages/trajectory_critics/obstacle_footprint.html)
        * [ OscillationCritic ](../../configuration/packages/trajectory_critics/oscillation.html)
        * [ PathAlignCritic ](../../configuration/packages/trajectory_critics/path_align.html)
        * [ PathDistCritic ](../../configuration/packages/trajectory_critics/path_dist.html)
        * [ PreferForwardCritic ](../../configuration/packages/trajectory_critics/prefer_forward.html)
        * [ RotateToGoalCritic ](../../configuration/packages/trajectory_critics/rotate_to_goal.html)
        * [ TwirlingCritic ](../../configuration/packages/trajectory_critics/twirling.html)
      * [ Example ](../../configuration/packages/configuring-dwb-controller.html#example)
    * [ Regulated Pure Pursuit ](../../configuration/packages/configuring-regulated-pp.html)
      * [ Regulated Pure Pursuit Parameters ](../../configuration/packages/configuring-regulated-pp.html#regulated-pure-pursuit-parameters)
      * [ Example ](../../configuration/packages/configuring-regulated-pp.html#example)
    * [ Model Predictive Path Integral Controller ](../../configuration/packages/configuring-mppic.html)
      * [ MPPI Parameters ](../../configuration/packages/configuring-mppic.html#mppi-parameters)
        * [ Trajectory Visualization ](../../configuration/packages/configuring-mppic.html#trajectory-visualization)
        * [ Path Handler ](../../configuration/packages/configuring-mppic.html#path-handler)
        * [ Ackermann Motion Model ](../../configuration/packages/configuring-mppic.html#ackermann-motion-model)
        * [ Constraint Critic ](../../configuration/packages/configuring-mppic.html#constraint-critic)
        * [ Goal Angle Critic ](../../configuration/packages/configuring-mppic.html#goal-angle-critic)
        * [ Goal Critic ](../../configuration/packages/configuring-mppic.html#goal-critic)
        * [ Obstacles Critic ](../../configuration/packages/configuring-mppic.html#obstacles-critic)
        * [ Path Align Critic ](../../configuration/packages/configuring-mppic.html#path-align-critic)
        * [ Path Angle Critic ](../../configuration/packages/configuring-mppic.html#path-angle-critic)
        * [ Path Follow Critic ](../../configuration/packages/configuring-mppic.html#path-follow-critic)
        * [ Prefer Forward Critic ](../../configuration/packages/configuring-mppic.html#prefer-forward-critic)


  * [ Getting Started ](../../getting_started/index.html)
    * [ Installation ](../../getting_started/index.html#installation)
    * [ Running the Example ](../../getting_started/index.html#running-the-example)
    * [ Navigating ](../../getting_started/index.html#navigating)
  * [ Development Guides ](../../development_guides/index.html)
    * [ Build and Install ](../../development_guides/build_docs/index.html)
      * [ Install ](../../development_guides/build_docs/index.html#install)
      * [ Build ](../../development_guides/build_docs/index.html#build)
        * [ Released Distribution Binaries ](../../development_guides/build_docs/index.html#released-distribution-binaries)
        * [ Rolling Development Source ](../../development_guides/build_docs/index.html#rolling-development-source)
        * [ Docker Container Images ](../../development_guides/build_docs/index.html#docker-container-images)
      * [ Generate Doxygen ](../../development_guides/build_docs/index.html#generate-doxygen)
      * [ Help ](../../development_guides/build_docs/index.html#help)
        * [ Build Troubleshooting Guide ](../../development_guides/build_docs/build_troubleshooting_guide.html)
    * [ Dev Containers ](../../development_guides/devcontainer_docs/index.html)
      * [ Dev Container Guide ](../../development_guides/devcontainer_docs/devcontainer_guide.html)
        * [ Creating Dev Containers ](../../development_guides/devcontainer_docs/devcontainer_guide.html#creating-dev-containers)
        * [ Using Dev Containers ](../../development_guides/devcontainer_docs/devcontainer_guide.html#using-dev-containers)
      * [ What, Why, How? ](../../development_guides/devcontainer_docs/index.html#what-why-how)
        * [ What is a Dev Container? ](../../development_guides/devcontainer_docs/index.html#what-is-a-dev-container)
        * [ Why use a Dev Container? ](../../development_guides/devcontainer_docs/index.html#why-use-a-dev-container)
        * [ How do Dev Containers work? ](../../development_guides/devcontainer_docs/index.html#how-do-dev-containers-work)
      * [ Prerequisites ](../../development_guides/devcontainer_docs/index.html#prerequisites)
      * [ Getting started ](../../development_guides/devcontainer_docs/index.html#getting-started)
      * [ Security ](../../development_guides/devcontainer_docs/index.html#security)
    * [ Getting Involved ](../../development_guides/involvement_docs/index.html)
      * [ Getting Involved ](../../development_guides/involvement_docs/index.html#id1)
      * [ Process ](../../development_guides/involvement_docs/index.html#process)
      * [ Licensing ](../../development_guides/involvement_docs/index.html#licensing)
      * [ Developer Certification of Origin (DCO) ](../../development_guides/involvement_docs/index.html#developer-certification-of-origin-dco)
  * [ Navigation Concepts ](../../concepts/index.html)
    * [ ROS 2 ](../../concepts/index.html#ros-2)
      * [ Action Server ](../../concepts/index.html#action-server)
      * [ Lifecycle Nodes and Bond ](../../concepts/index.html#lifecycle-nodes-and-bond)
    * [ Behavior Trees ](../../concepts/index.html#behavior-trees)
    * [ Navigation Servers ](../../concepts/index.html#navigation-servers)
      * [ Planner, Controller, Smoother and Recovery Servers ](../../concepts/index.html#planner-controller-smoother-and-recovery-servers)
      * [ Planners ](../../concepts/index.html#planners)
      * [ Controllers ](../../concepts/index.html#controllers)
      * [ Behaviors ](../../concepts/index.html#behaviors)


**Have a question about this project?** Sign up for a free GitHub account to
open an issue and contact its maintainers and the community.


[
![@SteveMacenski](https://avatars.githubusercontent.com/u/14944147?s=40&u=0925d37e9d3569c71d930114b66e6394c2efb3c6&v=4)
](/SteveMacenski) [ SteveMacenski ](/SteveMacenski) added the [ in progress
](/ros-planning/navigation2/labels/in%20progress) label  Mar 11, 2021


> For instance, you could create a condition Bt node to check if in dynamic
> scene and if true, uses the idk-really-awesome-controller, else uses the
> line follower controller.


Member


        * [ GoalCheckerSelector ](../../configuration/packages/bt-plugins/actions/GoalCheckerSelector.html)
        * [ NavigateThroughPoses ](../../configuration/packages/bt-plugins/actions/NavigateThroughPoses.html)
        * [ ComputePathThroughPoses ](../../configuration/packages/bt-plugins/actions/ComputePathThroughPoses.html)
        * [ RemovePassedGoals ](../../configuration/packages/bt-plugins/actions/RemovePassedGoals.html)
        * [ CancelControl ](../../configuration/packages/bt-plugins/actions/CancelControl.html)
        * [ CancelBackUp ](../../configuration/packages/bt-plugins/actions/CancelBackUp.html)
        * [ CancelSpin ](../../configuration/packages/bt-plugins/actions/CancelSpin.html)
        * [ CancelWait ](../../configuration/packages/bt-plugins/actions/CancelWait.html)
        * [ CancelDriveOnHeading ](../../configuration/packages/bt-plugins/actions/CancelDriveOnHeading.html)
        * [ CancelAssistedTeleop ](../../configuration/packages/bt-plugins/actions/CancelAssistedTeleop.html)
        * [ SmoothPath ](../../configuration/packages/bt-plugins/actions/Smooth.html)
      * [ Condition Plugins ](../../configuration/packages/configuring-bt-xml.html#condition-plugins)
        * [ GoalReached ](../../configuration/packages/bt-plugins/conditions/GoalReached.html)
        * [ TransformAvailable ](../../configuration/packages/bt-plugins/conditions/TransformAvailable.html)
        * [ DistanceTraveled ](../../configuration/packages/bt-plugins/conditions/DistanceTraveled.html)
        * [ GoalUpdated ](../../configuration/packages/bt-plugins/conditions/GoalUpdated.html)
        * [ GloballyUpdatedGoal ](../../configuration/packages/bt-plugins/conditions/GloballyUpdatedGoal.html)
        * [ InitialPoseReceived ](../../configuration/packages/bt-plugins/conditions/InitialPoseReceived.html)
        * [ IsStuck ](../../configuration/packages/bt-plugins/conditions/IsStuck.html)
        * [ TimeExpired ](../../configuration/packages/bt-plugins/conditions/TimeExpired.html)
        * [ IsBatteryLow ](../../configuration/packages/bt-plugins/conditions/IsBatteryLow.html)
        * [ IsPathValid ](../../configuration/packages/bt-plugins/conditions/IsPathValid.html)
        * [ PathExpiringTimer ](../../configuration/packages/bt-plugins/conditions/PathExpiringTimer.html)
        * [ AreErrorCodesPresent ](../../configuration/packages/bt-plugins/conditions/AreErrorCodesPresent.html)
        * [ WouldAControllerRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldAControllerRecoveryHelp.html)
        * [ WouldAPlannerRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldAPlannerRecoveryHelp.html)
        * [ WouldASmootherRecoveryHelp ](../../configuration/packages/bt-plugins/conditions/WouldASmootherRecoveryHelp.html)
        * [ IsBatteryCharging ](../../configuration/packages/bt-plugins/conditions/IsBatteryCharging.html)
      * [ Control Plugins ](../../configuration/packages/configuring-bt-xml.html#control-plugins)
        * [ PipelineSequence ](../../configuration/packages/bt-plugins/controls/PipelineSequence.html)
        * [ RoundRobin ](../../configuration/packages/bt-plugins/controls/RoundRobin.html)
        * [ RecoveryNode ](../../configuration/packages/bt-plugins/controls/RecoveryNode.html)
      * [ Decorator Plugins ](../../configuration/packages/configuring-bt-xml.html#decorator-plugins)
        * [ RateController ](../../configuration/packages/bt-plugins/decorators/RateController.html)
        * [ DistanceController ](../../configuration/packages/bt-plugins/decorators/DistanceController.html)
        * [ SpeedController ](../../configuration/packages/bt-plugins/decorators/SpeedController.html)
        * [ GoalUpdater ](../../configuration/packages/bt-plugins/decorators/GoalUpdater.html)
        * [ PathLongerOnApproach ](../../configuration/packages/bt-plugins/decorators/PathLongerOnApproach.html)
        * [ SingleTrigger ](../../configuration/packages/bt-plugins/decorators/SingleTrigger.html)
      * [ Example ](../../configuration/packages/configuring-bt-xml.html#example)


---

All reactions


2 participants


        * [ 1- Creating a new Behavior Plugin ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#creating-a-new-behavior-plugin)
        * [ 2- Exporting the Behavior Plugin ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#exporting-the-behavior-plugin)
        * [ 3- Pass the plugin name through params file ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#pass-the-plugin-name-through-params-file)
        * [ 4- Run Behavior Plugin ](../../plugin_tutorials/docs/writing_new_behavior_plugin.html#run-behavior-plugin)
    * [ Writing a New Navigator Plugin ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html)
      * [ Overview ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#overview)
      * [ Requirements ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#requirements)
      * [ Tutorial Steps ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#tutorial-steps)
        * [ 1- Create a new Navigator Plugin ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#create-a-new-navigator-plugin)
        * [ 2- Exporting the navigator plugin ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#exporting-the-navigator-plugin)
        * [ 3- Pass the plugin name through the params file ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#pass-the-plugin-name-through-the-params-file)
        * [ 4- Run plugin ](../../plugin_tutorials/docs/writing_new_navigator_plugin.html#run-plugin)
  * [ Configuration Guide ](../../configuration/index.html)
    * [ Behavior-Tree Navigator ](../../configuration/packages/configuring-bt-navigator.html)
      * [ Parameters ](../../configuration/packages/configuring-bt-navigator.html#parameters)
      * [ Example ](../../configuration/packages/configuring-bt-navigator.html#example)
    * [ Behavior Tree XML Nodes ](../../configuration/packages/configuring-bt-xml.html)
      * [ Action Plugins ](../../configuration/packages/configuring-bt-xml.html#action-plugins)
        * [ Wait ](../../configuration/packages/bt-plugins/actions/Wait.html)
        * [ Spin ](../../configuration/packages/bt-plugins/actions/Spin.html)
        * [ BackUp ](../../configuration/packages/bt-plugins/actions/BackUp.html)
        * [ DriveOnHeading ](../../configuration/packages/bt-plugins/actions/DriveOnHeading.html)
        * [ AssistedTeleop ](../../configuration/packages/bt-plugins/actions/AssistedTeleop.html)
        * [ ComputePathToPose ](../../configuration/packages/bt-plugins/actions/ComputePathToPose.html)
        * [ FollowPath ](../../configuration/packages/bt-plugins/actions/FollowPath.html)
        * [ NavigateToPose ](../../configuration/packages/bt-plugins/actions/NavigateToPose.html)
        * [ ClearEntireCostmap ](../../configuration/packages/bt-plugins/actions/ClearEntireCostmap.html)
        * [ ClearCostmapExceptRegion ](../../configuration/packages/bt-plugins/actions/ClearCostmapExceptRegion.html)
        * [ ClearCostmapAroundRobot ](../../configuration/packages/bt-plugins/actions/ClearCostmapAroundRobot.html)
        * [ ReinitializeGlobalLocalization ](../../configuration/packages/bt-plugins/actions/ReinitializeGlobalLocalization.html)
        * [ TruncatePath ](../../configuration/packages/bt-plugins/actions/TruncatePath.html)
        * [ TruncatePathLocal ](../../configuration/packages/bt-plugins/actions/TruncatePathLocal.html)
        * [ PlannerSelector ](../../configuration/packages/bt-plugins/actions/PlannerSelector.html)
        * [ ControllerSelector ](../../configuration/packages/bt-plugins/actions/ControllerSelector.html)
        * [ SmootherSelector ](../../configuration/packages/bt-plugins/actions/SmootherSelector.html)
        * [ GoalCheckerSelector ](../../configuration/packages/bt-plugins/actions/GoalCheckerSelector.html)
        * [ ProgressCheckerSelector ](../../configuration/packages/bt-plugins/actions/ProgressCheckerSelector.html)
        * [ NavigateThroughPoses ](../../configuration/packages/bt-plugins/actions/NavigateThroughPoses.html)
        * [ ComputePathThroughPoses ](../../configuration/packages/bt-plugins/actions/ComputePathThroughPoses.html)
        * [ ComputeCoveragePath ](../../configuration/packages/bt-plugins/actions/ComputeCoveragePath.html)


      * [ BackUp BT-node Interface Changes ](../../migration/Foxy.html#backup-bt-node-interface-changes)
      * [ BackUp Recovery Interface Changes ](../../migration/Foxy.html#backup-recovery-interface-changes)
      * [ Nav2 Controllers and Goal Checker Plugin Interface Changes ](../../migration/Foxy.html#nav2-controllers-and-goal-checker-plugin-interface-changes)
      * [ FollowPath goal_checker_id attribute ](../../migration/Foxy.html#followpath-goal-checker-id-attribute)
      * [ Groot Support ](../../migration/Foxy.html#groot-support)
      * [ New Plugins ](../../migration/Foxy.html#new-plugins)
      * [ Costmap Filters ](../../migration/Foxy.html#costmap-filters)
      * [ SmacPlanner ](../../migration/Foxy.html#smacplanner)
      * [ ThetaStarPlanner ](../../migration/Foxy.html#thetastarplanner)
      * [ RegulatedPurePursuitController ](../../migration/Foxy.html#regulatedpurepursuitcontroller)
      * [ Costmap2D ` current_  ` Usage ](../../migration/Foxy.html#costmap2d-current-usage)
      * [ Standard time units in parameters ](../../migration/Foxy.html#standard-time-units-in-parameters)
      * [ Ray Tracing Parameters ](../../migration/Foxy.html#ray-tracing-parameters)
      * [ Obstacle Marking Parameters ](../../migration/Foxy.html#obstacle-marking-parameters)
      * [ Recovery Action Changes ](../../migration/Foxy.html#recovery-action-changes)
      * [ Default Behavior Tree Changes ](../../migration/Foxy.html#default-behavior-tree-changes)
      * [ NavFn Planner Parameters ](../../migration/Foxy.html#navfn-planner-parameters)
      * [ New ClearCostmapExceptRegion and ClearCostmapAroundRobot BT-nodes ](../../migration/Foxy.html#new-clearcostmapexceptregion-and-clearcostmaparoundrobot-bt-nodes)
      * [ New Behavior Tree Nodes ](../../migration/Foxy.html#new-behavior-tree-nodes)
      * [ sensor_msgs/PointCloud to sensor_msgs/PointCloud2 Change ](../../migration/Foxy.html#sensor-msgs-pointcloud-to-sensor-msgs-pointcloud2-change)
      * [ ControllerServer New Parameter failure_tolerance ](../../migration/Foxy.html#controllerserver-new-parameter-failure-tolerance)
      * [ Removed BT XML Launch Configurations ](../../migration/Foxy.html#removed-bt-xml-launch-configurations)
      * [ Nav2 RViz Panel Action Feedback Information ](../../migration/Foxy.html#nav2-rviz-panel-action-feedback-information)
    * [ Galactic to Humble ](../../migration/Galactic.html)
      * [ Major improvements to Smac Planners ](../../migration/Galactic.html#major-improvements-to-smac-planners)
      * [ Simple (Python) Commander ](../../migration/Galactic.html#simple-python-commander)
      * [ Reduce Nodes and Executors ](../../migration/Galactic.html#reduce-nodes-and-executors)
      * [ API Change for nav2_core ](../../migration/Galactic.html#api-change-for-nav2-core)
      * [ Extending the BtServiceNode to process Service-Results ](../../migration/Galactic.html#extending-the-btservicenode-to-process-service-results)
      * [ Including new Rotation Shim Controller Plugin ](../../migration/Galactic.html#including-new-rotation-shim-controller-plugin)
      * [ Spawning the robot in Gazebo ](../../migration/Galactic.html#spawning-the-robot-in-gazebo)
      * [ Recovery Behavior Timeout ](../../migration/Galactic.html#recovery-behavior-timeout)
      * [ New parameter ` use_final_approach_orientation  ` for the 3 2D planners ](../../migration/Galactic.html#new-parameter-use-final-approach-orientation-for-the-3-2d-planners)
      * [ SmacPlanner2D and Theta*: fix goal orientation being ignored ](../../migration/Galactic.html#smacplanner2d-and-theta-fix-goal-orientation-being-ignored)
      * [ SmacPlanner2D, NavFn and Theta*: fix small path corner cases ](../../migration/Galactic.html#smacplanner2d-navfn-and-theta-fix-small-path-corner-cases)
      * [ Change and fix behavior of dynamic parameter change detection ](../../migration/Galactic.html#change-and-fix-behavior-of-dynamic-parameter-change-detection)
      * [ Dynamic Parameters ](../../migration/Galactic.html#dynamic-parameters)
      * [ BT Action Nodes Exception Changes ](../../migration/Galactic.html#bt-action-nodes-exception-changes)
      * [ BT Navigator Groot Multiple Navigators ](../../migration/Galactic.html#bt-navigator-groot-multiple-navigators)
      * [ Removed Kinematic Limiting in RPP ](../../migration/Galactic.html#removed-kinematic-limiting-in-rpp)


__ [ Navigation 2 ](../../index.html)


> Creating a custom behavior tree for each planner (and select it via
> nav2_msgs/action/NavigateToPose::Goal::behavior_tree)


In this behavior tree, we attempt to retry the entire navigation task 6 times
before returning to the caller that the task has failed. This allows the
navigation system ample opportunity to try to recovery from failure conditions
or wait for transient issues to pass, such as crowding from people or a
temporary sensor failure.


For each smoother plugin you would like to use, a name must be given to it
(e.g. ` simple_smoother  ` , ` curvature_smoother  ` ). This name is its `
smoother_id  ` for other servers to interact with this algorithm from a
request to the Smoother Server’s action interface.


[
![@SteveMacenski](https://avatars.githubusercontent.com/u/14944147?s=40&u=0925d37e9d3569c71d930114b66e6394c2efb3c6&v=4)
](/SteveMacenski) [ SteveMacenski ](/SteveMacenski) added [ good first issue
](/ros-planning/navigation2/labels/good%20first%20issue) Good for newcomers  [
help wanted ](/ros-planning/navigation2/labels/help%20wanted) Extra attention
is needed  labels  Feb 25, 2021


On behavior trees: you need to be willing to learn the tools are of the trade.
This implementation uses behavior trees, there is a required learning curve to
learn about them to use Navigation2 effectively. Every new technology is going
to require you to learn something new to use it, this is no different. You had
to learn about costmaps to use Navigation in ROS1, and then had C++ plugins to
implement your algorithms. This is exactly analog. Adding that behavior trees
are taking over the robotics world over the last 5 years. Tons of companies
use them, research has fallen in love with them, and you're only seeing more
and more of them as robotics applications get increasingly complex.


The question can then be simplified (it is almost a yes/no question):
Is it possible to change the planner and controller from an external input
(topic, service or parameter)? Is there a short code snippet (bash, c++, BT-
XML) I could use to achieve it?


[
![@SteveMacenski](https://avatars.githubusercontent.com/u/14944147?s=80&u=0925d37e9d3569c71d930114b66e6394c2efb3c6&v=4)
](/SteveMacenski)


      * [ Velocity smoother applies deceleration when timeout ](../../migration/Humble.html#velocity-smoother-applies-deceleration-when-timeout)
      * [ PoseProgressChecker plugin ](../../migration/Humble.html#poseprogresschecker-plugin)
      * [ Allow multiple goal checkers and change parameter progress_checker_plugin(s) name and type ](../../migration/Humble.html#allow-multiple-goal-checkers-and-change-parameter-progress-checker-plugin-s-name-and-type)
      * [ IsBatteryChargingCondition BT Node ](../../migration/Humble.html#isbatterychargingcondition-bt-node)
      * [ Behavior Server Error Codes ](../../migration/Humble.html#behavior-server-error-codes)
      * [ New Denoise Costmap Layer Plugin ](../../migration/Humble.html#new-denoise-costmap-layer-plugin)
      * [ SmacPlannerHybrid viz_expansions parameter ](../../migration/Humble.html#smacplannerhybrid-viz-expansions-parameter)
  * [ Simple Commander API ](../../commander_api/index.html)
    * [ Overview ](../../commander_api/index.html#overview)
    * [ Commander API ](../../commander_api/index.html#id1)
    * [ Costmap API ](../../commander_api/index.html#costmap-api)
    * [ Footprint Collision Checker API ](../../commander_api/index.html#footprint-collision-checker-api)
    * [ Examples and Demos ](../../commander_api/index.html#examples-and-demos)
  * [ Roadmaps ](../../roadmap/roadmap.html)
    * [ Iron Roadmap ](../../roadmap/roadmap.html#iron-roadmap)
    * [ Humble Roadmap ](../../roadmap/roadmap.html#humble-roadmap)
  * [ About and Contact ](../../about/index.html)
    * [ Related Projects ](../../about/related_projects.html)
    * [ ROS to ROS 2 Navigation ](../../about/ros1_comparison.html)
    * [ About ](../../about/index.html#id1)
    * [ Contact ](../../about/index.html#contact)
  * [ Robots Using ](../../about/robots.html)


> But I recognize that it could be a good node to add to our BT node library.
> I'd review a PR on it :-)


If these contextual recoveries fail, this behavior tree enters the recovery
subtree. This subtree is reserved for system-level failures to help resolve
issues like the robot being stuck or in a bad spot. This subtree also has the
` GoalUpdated  ` BT node it ticks every iteration to ensure responsiveness of
new goals. Next, the recovery subtree will tick the costmap clearing
operations, spinning, waiting, and backing up. After each of the recoveries in
the subtree, the main navigation subtree will be reattempted. If it continues
to fail, the next recovery in the recovery subtree is ticked.


[
![@SteveMacenski](https://avatars.githubusercontent.com/u/14944147?s=40&u=0925d37e9d3569c71d930114b66e6394c2efb3c6&v=4)
](/SteveMacenski) [ SteveMacenski ](/SteveMacenski) closed this as [ completed
](/ros-
planning/navigation2/issues?q=is%3Aissue+is%3Aclosed+archived%3Afalse+reason%3Acompleted)
Mar 23, 2021


Contributor


Search


* Tutorial Steps


    * [ Enterprise ](/enterprise)
    * [ Teams ](/team)
    * [ Startups ](/enterprise/startups)
    * [ Education  ](https://education.github.com)


> Whatever external node is requesting the change shouldn't exist and should
> be integrated into the condition node so that change is fully autonomous
> within the tree.


Member


Sorry, something went wrong.


Copy link


Include my email address so I can be contacted


This conversation is old.
It derived in this [ other issue ](https://github.com/ros-
planning/navigation.ros.org/issues/147) talking about how to implement the
planner_selector, the controller_selector and the goal_checker_selector
concepts: [ ros-planning/navigation.ros.org#147 ](https://github.com/ros-
planning/navigation.ros.org/issues/147)

---

All reactions


    <root main_tree_to_execute="MainTree">
      <BehaviorTree ID="MainTree">
        <RecoveryNode number_of_retries="6" name="NavigateRecovery">
          <PipelineSequence name="NavigateWithReplanning">
            <ControllerSelector selected_controller="{selected_controller}" default_controller="FollowPath" topic_name="controller_selector"/>
            <PlannerSelector selected_planner="{selected_planner}" default_planner="GridBased" topic_name="planner_selector"/>
            <RateController hz="0.333">
              <RecoveryNode number_of_retries="1" name="ComputePathThroughPoses">
                <ReactiveSequence>
                  <RemovePassedGoals input_goals="{goals}" output_goals="{goals}" radius="0.7"/>
                  <ComputePathThroughPoses goals="{goals}" path="{path}" planner_id="{selected_planner}" error_code_id="{compute_path_error_code}"/>
                </ReactiveSequence>
                <Sequence>
                  <WouldAPlannerRecoveryHelp error_code="{compute_path_error_code}"/>
                  <ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
                </Sequence>
              </RecoveryNode>
            </RateController>
            <RecoveryNode number_of_retries="1" name="FollowPath">
              <FollowPath path="{path}" controller_id="{selected_controller}" error_code_id="{follow_path_error_code}"/>
              <Sequence>
                <WouldAControllerRecoveryHelp error_code="{follow_path_error_code}"/>
                <ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
              </Sequence>
            </RecoveryNode>
          </PipelineSequence>
          <Sequence>
            <Fallback>
              <WouldAControllerRecoveryHelp error_code="{follow_path_error_code}"/>
              <WouldAPlannerRecoveryHelp error_code="{compute_path_error_code}"/>
            </Fallback>
            <ReactiveFallback name="RecoveryFallback">
              <GoalUpdated/>
              <RoundRobin name="RecoveryActions">
                <Sequence name="ClearingActions">
                  <ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
                  <ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
                </Sequence>