Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Source: `~/nav2_ws/src/navigation2/nav2_behavior_tree/` and `nav2_bt_navigator/` and `nav2_behaviors/`
.claude/skills/harunkurtdev-nav2-behavior-tree-nodes-behaviors/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 104% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 148% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 153% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 47% | 0% |
Source: ~/nav2_ws/src/navigation2/nav2_behavior_tree/ and nav2_bt_navigator/ and nav2_behaviors/
Package: nav2_bt_navigator Actions: NavigateToPose, NavigateThroughPoses
Orchestrates planning, control, and recovery via Behavior Tree XML files. Loads BT node plugins dynamically.
NavigateToPoseNavigator - Single goal navigationNavigateThroughPosesNavigator - Multi-goal navigation| Node | Purpose | Key Ports | |------|---------|-----------| | NavigateToPose | Navigate to single goal | goal, behavior_tree, error_code_id | | NavigateThroughPoses | Navigate through goals | goals, behavior_tree, error_code_id | | ComputePathToPose | Plan to single goal | goal, start, path, planner_id, error_code_id | | ComputePathThroughPoses | Plan through goals | goals, start, path, planner_id, error_code_id | | FollowPath | Execute path following | path, controller_id, goal_checker_id, error_code_id | | SmoothPath | Smooth a path | unsmoothed_path, smoothed_path, smoother_id, error_code_id | | ComputeRoute | Graph-based route plan | goal, start, route, path, error_code_id | | ComputeAndTrackRoute | Route plan + tracking | goal, start, error_code_id |
| Node | Purpose | Key Ports | |------|---------|-----------| | TruncatePath | Cut path before goal | input_path, output_path, distance | | TruncatePathLocal | Cut path in local frame | input_path, output_path, distance_forward, distance_backward | | ConcatenatePaths | Join two paths | path1, path2, output_path | | GetPoseFromPath | Extract pose at index | path, index, pose |
| Node | Purpose | Key Ports | |------|---------|-----------| | Spin | Rotate in place | spin_dist (rad), time_allowance, error_code_id | | BackUp | Reverse motion | backup_dist, backup_speed, time_allowance, error_code_id | | DriveOnHeading | Move on heading | dist_to_travel, speed, time_allowance, error_code_id | | Wait | Pause execution | wait_duration, error_code_id | | AssistedTeleop | Collision-safe teleop | time_allowance, error_code_id | | FollowObject | Follow tracked object | pose_topic, tracked_frame, error_code_id | | DockRobot | Dock at station | dock_id, dock_type, error_code_id | | UndockRobot | Undock from station | dock_type, error_code_id |
| Node | Purpose | Key Ports | |------|---------|-----------| | AppendGoalPoseToGoals | Add goal to vector | goal, goals | | RemovePassedGoals | Remove reached goals | input_goals, output_goals, radius | | RemoveInCollisionGoals | Filter collision goals | input_goals, output_goals | | GetNextFewGoals | Get subset of goals | input_goals, output_goals, number | | ExtractRouteNodesAsGoals | Route nodes → goals | route, goals | | GetCurrentPose | Get robot's current pose | current_pose |
| Node | Purpose | Key Ports | |------|---------|-----------| | ClearEntireCostmap | Clear all costmap | service_name ("global" or "local") | | ClearCostmapExceptRegion | Clear except area | service_name, reset_distance | | ClearCostmapAroundRobot | Clear near robot | service_name, reset_distance | | ClearCostmapAroundPose | Clear near pose | service_name, pose, reset_distance |
| Node | Purpose | Key Ports | |------|---------|-----------| | PlannerSelector | Choose planner | topic, selected_planner | | ControllerSelector | Choose controller | topic, selected_controller | | SmootherSelector | Choose smoother | topic, selected_smoother | | GoalCheckerSelector | Choose goal checker | topic, selected_goal_checker | | ProgressCheckerSelector | Choose progress checker | topic, selected_progress_checker | | PathHandlerSelector | Choose path handler | topic, selected_path_handler |
| Node | Purpose | |------|---------| | CancelControl | Cancel FollowPath | | CancelBackUp | Cancel BackUp | | CancelSpin | Cancel Spin | | CancelDriveOnHeading | Cancel DriveOnHeading | | CancelWait | Cancel Wait | | CancelAssistedTeleop | Cancel AssistedTeleop | | CancelFollowObject | Cancel FollowObject | | CancelComputeAndTrackRoute | Cancel route tracking |
| Node | Purpose | |------|---------| | ReinitializeGlobalLocalization | Reset AMCL | | ToggleCollisionMonitor | Enable/disable collision monitor |
| Node | Purpose | Key Ports | |------|---------|-----------| | GoalReached | Goal position reached? | goal, global_frame, robot_base_frame | | GoalUpdated | New goal received? | - | | GlobalUpdatedGoal | Globally updated goal? | - | | IsGoalNearby | Goal near in path? | path, goal, distance_threshold | | ArePosesNear | Two poses close? | pose1, pose2, tolerance | | IsPathValid | Path collision-free? | path, server_timeout | | IsWithinPathTrackingBounds | Robot on path? | path, bounds | | DistanceTraveled | Moved far enough? | distance, global_frame | | IsStuck | Robot stuck? | - | | IsStopped | Robot stopped? | velocity_threshold | | IsPoseOccupied | Pose in obstacle? | pose | | InitialPoseReceived | Initial pose set? | - | | TransformAvailable | TF transform exists? | child, parent | | TimeExpired | Time elapsed? | seconds | | PathExpiringTimer | Path update timer | seconds, path | | IsBatteryLow | Battery low? | min_battery, battery_topic, is_voltage | | IsBatteryCharging | Charging? | battery_topic | | WouldAPlannerRecoveryHelp | Planner recovery needed? | error_code | | WouldAControllerRecoveryHelp | Controller recovery? | error_code | | WouldASmootherRecoveryHelp | Smoother recovery? | error_code | | WouldARouteRecoveryHelp | Route recovery? | error_code | | AreErrorCodesPresent | Match error codes | error_code, error_codes_to_check |
| Node | Purpose | Key Ports | |------|---------|-----------| | PipelineSequence | Sequential with parallel setup | - | | PersistentSequence | Resumable sequence | - | | NonblockingSequence | Non-blocking sequential | - | | RecoveryNode | Primary + recovery pattern | number_of_retries | | RoundRobin | Cycle through children | wrap_around (bool) | | PauseResumeController | Pause/resume via service | pause_service, resume_service |
| Node | Purpose | Key Ports | |------|---------|-----------| | RateController | Tick at frequency | hz (default 10.0) | | SpeedController | Rate by robot speed | min_rate, max_rate, min_speed, max_speed | | DistanceController | Tick after distance | distance, global_frame | | GoalUpdater | Listen for goal updates | input_goal → output_goal | | GoalUpdatedController | Tick on goal update | goal/goals | | PathLongerOnApproach | Detect path lengthening | path, prox_len, length_factor | | SingleTrigger | Execute once only | - |
Location: ~/nav2_ws/src/navigation2/nav2_bt_navigator/behavior_trees/
| File | Description | |------|-------------| | navigate_to_pose_w_replanning_and_recovery.xml | Standard - 1Hz replanning + recovery | | navigate_to_pose_w_replanning_goal_patience_and_recovery.xml | With goal patience | | navigate_to_pose_w_bounds_check.xml | Path tracking bounds | | navigate_w_replanning_distance.xml | Replan by distance traveled | | navigate_w_replanning_speed.xml | Replan by speed changes | | navigate_w_replanning_time.xml | Replan at fixed intervals | | navigate_w_replanning_only_if_goal_is_updated.xml | Replan only on new goal | | navigate_w_replanning_only_if_path_becomes_invalid.xml | Replan on invalid path | | navigate_w_recovery_and_replanning_only_if_path_becomes_invalid.xml | Combined | | navigate_through_poses_w_replanning_and_recovery.xml | Multi-pose with recovery | | navigate_on_route_graph_w_recovery.xml | Route graph navigation | | navigate_w_routing_global_planning_and_control_w_recovery.xml | Full routing integration | | nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.xml | Consistent replanning | | follow_point.xml | Point following | | odometry_calibration.xml | Odom calibration |
xml<root BTCPP_format="4" main_tree_to_execute="MainTree"> <BehaviorTree ID="MainTree"> <RecoveryNode number_of_retries="6"> <!-- Primary: Plan + Follow --> <PipelineSequence> <!-- Selector nodes for plugins --> <ControllerSelector .../> <PlannerSelector .../> <GoalCheckerSelector .../> <ProgressCheckerSelector .../> <PathHandlerSelector .../> <SmootherSelector .../> <!-- Replanning at 1Hz --> <RateController hz="1.0"> <RecoveryNode> <ComputePathToPose goal="{goal}" path="{path}" planner_id="{selected_planner}"/> <ClearEntireCostmap name="ClearGlobalCostmap" service_name="/global_costmap/clear_entirely_global_costmap"/> </RecoveryNode> </RateController> <!-- Path following with recovery --> <RecoveryNode> <FollowPath path="{path}" controller_id="{selected_controller}" goal_checker_id="{selected_goal_checker}"/> <ClearEntireCostmap name="ClearLocalCostmap" service_name="/local_costmap/clear_entirely_local_costmap"/> </RecoveryNode> </PipelineSequence> <!-- Recovery: Spin, Wait, BackUp rotation --> <Sequence> <WouldAControllerRecoveryHelp error_code="{error_code}"/> <RoundRobin> <Spin spin_dist="1.57"/> <Wait wait_duration="5.0"/> <BackUp backup_dist="0.30" backup_speed="0.15"/> </RoundRobin> </Sequence> </RecoveryNode> </BehaviorTree> </root>
Package: nav2_behaviors Server: BehaviorServer (hosts plugins via pluginlib)
| Behavior | Action | Purpose | Key Params | |----------|--------|---------|------------| | Spin | nav2_msgs/Spin | Rotate in place | rotational vel/accel limits, simulate_ahead_time | | BackUp | nav2_msgs/BackUp | Reverse | distance, speed, acceleration/deceleration limits | | DriveOnHeading | nav2_msgs/DriveOnHeading | Move forward/backward | distance, speed, accel limits, min speed (0.10) | | Wait | nav2_msgs/Wait | Pause | duration | | AssistedTeleop | nav2_msgs/AssistedTeleop | Safe teleop | projection_time, simulation_time_step |
All behaviors:
CostmapInfoType::LOCAL for collision checkingdisable_collision_checks flagtime_allowance for timeout| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→pass | 16,302 | 21,259 | +30% | 1 | 1 | 0% | 2,743 | 6,672 | +143% | 0 | 0 | — |
case-11 | fail→pass | 13,221 | 2,509 | -81% | 1 | 1 | 0% | 2,288 | 3,541 | +55% | 0 | 0 | — |
case-12 | pass→pass | 12,129 | 8,305 | -32% | 1 | 1 | 0% | 2,226 | 4,647 | +109% | 0 | 0 | — |
case-01 | fail→pass | 15,616 | 14,111 | -10% | 1 | 1 | 0% | 3,006 | 6,128 | +104% | 0 | 0 | — |
case-02 | fail→pass | 11,764 | 11,542 | -2% | 1 | 1 | 0% | 2,206 | 5,481 | +148% | 0 | 0 | — |
case-03 | fail→fail | 17,210 | 13,036 | -24% | 1 | 1 | 0% | 3,218 | 5,812 | +81% | 0 | 0 | — |
case-04 | pass→pass | 14,608 | 14,783 | +1% | 1 | 1 | 0% | 2,843 | 6,238 | +119% | 0 | 0 | — |
case-05 | pass→pass | 10,326 | 9,266 | -10% | 1 | 1 | 0% | 2,076 | 4,947 | +138% | 0 | 0 | — |
case-07 | fail→pass | 8,660 | 4,137 | -52% | 1 | 1 | 0% | 1,532 | 3,879 | +153% | 0 | 0 | — |
case-08 | fail→pass | 13,543 | 2,725 | -80% | 1 | 1 | 0% | 2,452 | 3,613 | +47% | 0 | 0 | — |
case-09 | pass→pass | 14,952 | 7,894 | -47% | 1 | 1 | 0% | 2,864 | 4,605 | +61% | 0 | 0 | — |
case-10 | pass→pass | 14,021 | 6,285 | -55% | 1 | 1 | 0% | 2,770 | 4,422 | +60% | 0 | 0 | — |
case-13 | fail→pass | 13,216 | 3,060 | -77% | 1 | 1 | 0% | 2,160 | 3,718 | +72% | 0 | 0 | — |
case-14 | fail→pass | 14,908 | 8,923 | -40% | 1 | 1 | 0% | 2,644 | 4,636 | +75% | 0 | 0 | — |
case-15 | pass→pass | 11,281 | 4,963 | -56% | 1 | 1 | 0% | 1,981 | 3,984 | +101% | 0 | 0 | — |
case-16 | fail→pass | 11,741 | 4,749 | -60% | 1 | 1 | 0% | 1,986 | 3,893 | +96% | 0 | 0 | — |
case-17 | pass→pass | 15,623 | 11,851 | -24% | 1 | 1 | 0% | 2,884 | 5,266 | +83% | 0 | 0 | — |
case-18 | pass→fail | 16,494 | 11,720 | -29% | 1 | 1 | 0% | 3,160 | 5,597 | +77% | 0 | 0 | — |
case-19 | fail→pass | 17,635 | 11,437 | -35% | 1 | 1 | 0% | 3,096 | 5,116 | +65% | 0 | 0 | — |
case-20 | fail→pass | 13,236 | 2,278 | -83% | 1 | 1 | 0% | 2,406 | 3,488 | +45% | 0 | 0 | — |
case-21 | fail→pass | 13,608 | 4,481 | -67% | 1 | 1 | 0% | 2,334 | 3,961 | +70% | 0 | 0 | — |
case-22 | pass→pass | 12,903 | 4,313 | -67% | 1 | 1 | 0% | 2,424 | 3,924 | +62% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.