Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Source: `~/nav2_ws/src/navigation2/`
.claude/skills/harunkurtdev-nav2-controller-plugins/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 4% | 0% |
Source: ~/nav2_ws/src/navigation2/
Package: nav2_controller Action: FollowPath (nav2_msgs::action::FollowPath) Plugin Base: nav2_core::Controller
Hosts controller plugins, progress checkers, goal checkers, and path handlers. Runs at controller_frequency (default 20Hz).
Package: nav2_dwb_controller Plugin: dwb_core::DWBLocalPlanner Best for: General purpose differential-drive robots
DWBLocalPlanner → StandardTrajectoryGenerator + TrajectoryCritics
Samples velocity space, generates trajectory candidates, scores with critics, picks best.
| Critic | Purpose | |--------|---------| | PathDist | Distance from trajectory to global path | | GoalDist | Distance from trajectory endpoint to goal | | PathAlign | Alignment of trajectory heading with path direction | | GoalAlign | Alignment with goal orientation | | BaseObstacle | Obstacle avoidance using robot center | | FootprintObstacle | Obstacle avoidance using full footprint | | ObstacleFootprint | Alternative footprint obstacle scorer | | RotateToGoal | Penalize non-rotation when near goal | | Oscillation | Penalize oscillating commands | | PreferForward | Prefer forward motion | | Twirling | Penalize unnecessary rotation | | MapGrid | Grid-based cost scoring (base for Path/GoalDist) | | StandardTrajectoryGenerator | Velocity sample generation |
yamlFollowPath: plugin: "dwb_core::DWBLocalPlanner" # Velocity limits min_vel_x: 0.0 max_vel_x: 0.26 min_vel_y: 0.0 max_vel_y: 0.0 max_vel_theta: 1.0 min_speed_xy: 0.0 max_speed_xy: 0.26 # Acceleration limits acc_lim_x: 2.5 acc_lim_y: 0.0 acc_lim_theta: 3.2 decel_lim_x: -2.5 decel_lim_y: 0.0 decel_lim_theta: -3.2 # Sampling vx_samples: 20 vy_samples: 5 vtheta_samples: 20 sim_time: 1.7 linear_granularity: 0.05 angular_granularity: 0.025 # Critics critics: ["RotateToGoal","Oscillation","BaseObstacle","GoalAlign","PathAlign","PathDist","GoalDist"]
Package: nav2_mppi_controller Plugin: nav2_mppi_controller::MPPIController Best for: Complex environments, smooth paths, high-performance
MPPIController → Optimizer + CriticManager + MotionModel
Stochastic optimal control: samples thousands of trajectories, scores with critics, selects optimal.
DiffDrive - Differential driveOmnidirectional - HolonomicAckermann - Car-like| Critic | Purpose | |--------|---------| | ConstraintCritic | Enforce kinematic constraints | | CostCritic | Costmap-based scoring | | GoalCritic | Distance to goal | | GoalAngleCritic | Orientation at goal | | PathAlignCritic | Alignment with global path | | PathAngleCritic | Heading angle relative to path | | PathFollowCritic | Distance from path | | ObstaclesCritic | Obstacle avoidance | | PreferForwardCritic | Forward motion preference | | TwirlingCritic | Rotation minimization | | VelocityDeadbandCritic | Avoid deadband velocities |
yamlFollowPath: plugin: "nav2_mppi_controller::MPPIController" time_steps: 56 model_dt: 0.05 batch_size: 2000 ax_max: 3.0 ax_min: -3.0 ay_max: 3.0 az_max: 3.5 vx_std: 0.2 vy_std: 0.2 wz_std: 0.4 vx_max: 0.5 vx_min: -0.35 vy_max: 0.5 wz_max: 1.9 iteration_count: 1 temperature: 0.3 gamma: 0.015 motion_model: "DiffDrive" prune_distance: 1.7 enforce_path_inversion: false critics: [...] # Per-critic weights PathAlignCritic: enabled: true cost_weight: 14.0 threshold_to_consider: 0.5 GoalCritic: enabled: true cost_weight: 5.0 threshold_to_consider: 1.4
Package: nav2_regulated_pure_pursuit_controller Plugin: nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController Best for: Basic path tracking, low computational cost
RegulatedPurePursuitController → CollisionChecker + RegulationFunctions
Pure pursuit with velocity regulation based on curvature, obstacles, and goal proximity.
yamlFollowPath: plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController" desired_linear_vel: 0.5 lookahead_dist: 0.6 min_lookahead_dist: 0.3 max_lookahead_dist: 0.9 lookahead_time: 1.5 rotate_to_heading_angular_vel: 1.8 use_velocity_scaled_lookahead_dist: false min_approach_linear_velocity: 0.05 approach_velocity_scaling_dist: 1.0 use_collision_detection: true max_allowed_time_to_collision_up_to_carrot: 1.0 use_regulated_linear_velocity_scaling: true use_cost_regulated_linear_velocity_scaling: false regulated_linear_scaling_min_radius: 0.9 regulated_linear_scaling_min_speed: 0.25 allow_reversing: false max_angular_accel: 3.2 rotate_to_heading_min_angle: 0.785
Package: nav2_graceful_controller Plugin: nav2_graceful_controller::GracefulController Best for: Tight spaces, smooth continuous motions
GracefulController → EgoPolarCoords + SmoothControlLaw
Uses ego-polar coordinate system for mathematically guaranteed smooth convergence.
yamlFollowPath: plugin: "nav2_graceful_controller::GracefulController" # Control law gains k_phi: 2.0 k_delta: 1.0 beta: 0.4 lambda: 2.0 # Velocity limits v_linear_min: 0.1 v_linear_max: 0.5 v_angular_max: 1.0 # Behavior slowdown_radius: 1.5 initial_rotation: true final_rotation: true allow_backward: false
Package: nav2_rotation_shim_controller Plugin: nav2_rotation_shim_controller::RotationShimController Best for: Wrapper to add in-place rotation before any controller
Middleware that wraps a primary controller. Handles initial rotation alignment before delegating forward motion.
State Machine: Alignment Check → Rotation → Forward (primary controller) → Optional final rotation
yamlFollowPath: plugin: "nav2_rotation_shim_controller::RotationShimController" primary_controller: "dwb_core::DWBLocalPlanner" # or any other forward_sampling_distance: 0.5 angular_dist_threshold: 0.785 # ~45 degrees rotate_to_heading_angular_vel: 1.8 max_angular_accel: 3.2 rotate_to_goal_heading: false
| Feature | DWB | MPPI | RPP | Graceful | Rotation Shim | |---------|-----|------|-----|----------|---------------| | Approach | Sampling+Scoring | Stochastic Optimal | Pure Pursuit | Ego-Polar Law | Middleware | | Complexity | Medium | High | Low | Medium | Low | | Computation | Fast | High (GPU-like) | Very Fast | Fast | Very Fast | | Smoothness | Good | Excellent | Good | Excellent | Depends | | Critics | 13 plugins | 11 plugins | Integrated | Integrated | N/A | | Motion Models | 1 | 3 (Diff/Omni/Ack) | 1 | 1 | Delegates | | Omnidirectional | Yes | Yes | No | No | No | | Reversing | Limited | Yes | Optional | Optional | No |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,931 | 12,882 | -24% | 1 | 1 | 0% | 3,056 | 4,668 | +53% | 0 | 0 | — |
case-02 | fail→fail | 18,531 | 11,745 | -37% | 1 | 1 | 0% | 3,014 | 4,440 | +47% | 0 | 0 | — |
case-03 | pass→pass | 21,585 | 20,220 | -6% | 1 | 1 | 0% | 4,237 | 6,743 | +59% | 0 | 0 | — |
case-04 | pass→pass | 16,292 | 10,791 | -34% | 1 | 1 | 0% | 3,184 | 4,462 | +40% | 0 | 0 | — |
case-05 | pass→pass | 15,405 | 15,096 | -2% | 1 | 1 | 0% | 3,124 | 5,442 | +74% | 0 | 0 | — |
case-06 | fail→pass | 16,304 | 10,281 | -37% | 1 | 1 | 0% | 2,722 | 4,173 | +53% | 0 | 0 | — |
case-07 | fail→fail | 16,440 | 10,618 | -35% | 1 | 1 | 0% | 2,994 | 4,466 | +49% | 0 | 0 | — |
case-08 | fail→pass | 5,113 | 3,335 | -35% | 1 | 1 | 0% | 888 | 3,110 | +250% | 0 | 0 | — |
case-09 | fail→pass | 12,739 | 5,371 | -58% | 1 | 1 | 0% | 2,359 | 3,424 | +45% | 0 | 0 | — |
case-10 | pass→pass | 7,362 | 3,234 | -56% | 1 | 1 | 0% | 1,393 | 3,058 | +120% | 0 | 0 | — |
case-11 | fail→pass | 14,141 | 10,329 | -27% | 1 | 1 | 0% | 2,469 | 4,330 | +75% | 0 | 0 | — |
case-12 | fail→fail | 4,862 | 3,988 | -18% | 1 | 1 | 0% | 874 | 3,052 | +249% | 0 | 0 | — |
case-13 | fail→pass | 22,106 | 10,828 | -51% | 1 | 1 | 0% | 4,313 | 4,500 | +4% | 0 | 0 | — |
case-14 | pass→pass | 6,006 | 4,616 | -23% | 1 | 1 | 0% | 1,148 | 3,237 | +182% | 0 | 0 | — |
case-15 | fail→pass | 7,767 | 3,570 | -54% | 1 | 1 | 0% | 1,486 | 3,075 | +107% | 0 | 0 | — |
case-16 | pass→pass | 14,248 | 2,938 | -79% | 1 | 1 | 0% | 2,660 | 2,907 | +9% | 0 | 0 | — |
case-17 | pass→fail | 8,826 | 4,764 | -46% | 1 | 1 | 0% | 1,478 | 3,262 | +121% | 0 | 0 | — |
case-18 | fail→pass | 18,251 | 6,118 | -66% | 1 | 1 | 0% | 3,167 | 3,505 | +11% | 0 | 0 | — |
case-19 | fail→pass | 6,802 | 3,156 | -54% | 1 | 1 | 0% | 1,255 | 2,924 | +133% | 0 | 0 | — |
case-20 | pass→pass | 8,641 | 5,655 | -35% | 1 | 1 | 0% | 1,473 | 3,410 | +132% | 0 | 0 | — |
case-21 | fail→fail | 16,724 | 3,769 | -77% | 1 | 1 | 0% | 2,850 | 3,047 | +7% | 0 | 0 | — |
case-22 | fail→fail | 19,194 | 3,912 | -80% | 1 | 1 | 0% | 3,197 | 3,005 | -6% | 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 +32 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.