Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Source: `~/nav2_ws/src/navigation2/nav2_amcl/` and `nav2_map_server/`
.claude/skills/harunkurtdev-nav2-localization-map-server/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 99% | 0% |
Source: ~/nav2_ws/src/navigation2/nav2_amcl/ and nav2_map_server/
Package: nav2_amcl Node: amcl Purpose: Particle filter-based localization on known map
/scan (LaserScan) and /map (OccupancyGrid)amcl_pose (PoseWithCovarianceStamped) and particlecloudmap → odomupdate_min_d, update_min_a)| Model | Class | Robot Type | |-------|-------|------------| | nav2_amcl::DifferentialMotionModel | Default | Differential drive | | nav2_amcl::OmniMotionModel | Omnidirectional | Holonomic robots |
| Model | Description | |-------|-------------| | likelihood_field | Fast, uses endpoint only (recommended) | | beam | Full beam model with miss/hit/random/max |
yamlamcl: ros__parameters: # Robot model robot_model_type: "nav2_amcl::DifferentialMotionModel" # Motion noise (alpha1-5) alpha1: 0.2 # Rotation from rotation alpha2: 0.2 # Rotation from translation alpha3: 0.2 # Translation from translation alpha4: 0.2 # Translation from rotation alpha5: 0.2 # Translation noise (omni only) # Particle filter max_particles: 2000 min_particles: 500 pf_err: 0.05 pf_z: 0.99 resample_interval: 1 recovery_alpha_slow: 0.0 # Slow average weight (0=disabled) recovery_alpha_fast: 0.0 # Fast average weight (0=disabled) # Laser sensor laser_model_type: "likelihood_field" max_beams: 60 laser_max_range: 100.0 laser_min_range: -1.0 z_hit: 0.5 z_rand: 0.5 z_short: 0.05 # beam model z_max: 0.05 # beam model sigma_hit: 0.2 # Update control update_min_d: 0.25 # Min translation before update (m) update_min_a: 0.2 # Min rotation before update (rad) # Transform global_frame_id: "map" base_frame_id: "base_footprint" odom_frame_id: "odom" transform_tolerance: 1.0 tf_broadcast: true # Initial pose set_initial_pose: false initial_pose: x: 0.0 y: 0.0 z: 0.0 yaw: 0.0 always_reset_initial_pose: false first_map_only: false
reinitialize_global_localization - Spread particles uniformlyrequest_nomotion_update - Force update without motionupdate_min_d/a → more frequent updateslikelihood_field is faster than beam modelrecovery_alpha_slow/fast > 0 for kidnapped robot recoveryset_initial_pose: true for known start positionPackage: nav2_map_server Node: map_server Purpose: Serve static occupancy grid maps
yamlmap_server: ros__parameters: yaml_filename: "map.yaml" topic_name: "map" frame_id: "map"
yamlimage: map.pgm resolution: 0.05 # meters/pixel origin: [-10.0, -10.0, 0.0] # [x, y, yaw] negate: 0 occupied_thresh: 0.65 free_thresh: 0.196
load_map (nav2_msgs/LoadMap) - Load new map filesave_map (nav2_msgs/SaveMap) - Save current mapNode: map_saver_server Purpose: Save maps from SLAM or other sources
yamlmap_saver: ros__parameters: save_map_timeout: 5.0 free_thresh_default: 0.25 occupied_thresh_default: 0.65 map_subscribe_transient_local: true
Node: costmap_filter_info_server Purpose: Serve filter metadata for keepout/speed zones
yamlcostmap_filter_info_server: ros__parameters: type: 0 # 0=keepout, 1=speed%, 2=speed_m/s filter_info_topic: "/costmap_filter_info" mask_topic: "/filter_mask" base: 0.0 multiplier: 1.0
Node: vector_object_server Purpose: Dynamic polygon/circle obstacles
add_shapes (nav2_msgs/AddShapes) - Add polygons/circlesremove_shapes (nav2_msgs/RemoveShapes) - Remove by UUIDget_shapes (nav2_msgs/GetShapes) - Query shapesmap (global fixed frame)
└── odom (odometry frame, AMCL broadcasts map→odom)
└── base_footprint / base_link
├── lidar_link / laser_frame
├── camera_link
├── imu_link
└── wheel linksAMCL corrects odometry drift by adjusting the map → odom transform.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→pass | 4,388 | 4,199 | -4% | 1 | 1 | 0% | 834 | 2,301 | +176% | 0 | 0 | — |
case-01 | fail→pass | 12,176 | 8,972 | -26% | 1 | 1 | 0% | 2,443 | 3,491 | +43% | 0 | 0 | — |
case-02 | fail→pass | 12,383 | 6,643 | -46% | 1 | 1 | 0% | 2,297 | 2,833 | +23% | 0 | 0 | — |
case-03 | pass→pass | 14,800 | 11,150 | -25% | 1 | 1 | 0% | 2,789 | 3,780 | +36% | 0 | 0 | — |
case-04 | pass→pass | 15,020 | 15,466 | +3% | 1 | 1 | 0% | 2,796 | 4,505 | +61% | 0 | 0 | — |
case-05 | pass→pass | 15,450 | 13,625 | -12% | 1 | 1 | 0% | 2,836 | 4,326 | +53% | 0 | 0 | — |
case-07 | pass→pass | 6,783 | 4,934 | -27% | 1 | 1 | 0% | 1,098 | 2,367 | +116% | 0 | 0 | — |
case-08 | pass→pass | 3,748 | 3,132 | -16% | 1 | 1 | 0% | 645 | 2,051 | +218% | 0 | 0 | — |
case-09 | pass→pass | 3,676 | 3,645 | -1% | 1 | 1 | 0% | 712 | 2,183 | +207% | 0 | 0 | — |
case-10 | pass→pass | 6,942 | 4,114 | -41% | 1 | 1 | 0% | 1,237 | 2,227 | +80% | 0 | 0 | — |
case-11 | pass→pass | 6,748 | 3,213 | -52% | 1 | 1 | 0% | 1,197 | 1,992 | +66% | 0 | 0 | — |
case-12 | pass→pass | 5,669 | 2,643 | -53% | 1 | 1 | 0% | 1,079 | 1,963 | +82% | 0 | 0 | — |
case-13 | fail→pass | 4,969 | 2,553 | -49% | 1 | 1 | 0% | 943 | 1,968 | +109% | 0 | 0 | — |
case-14 | pass→pass | 4,674 | 3,152 | -33% | 1 | 1 | 0% | 1,010 | 2,180 | +116% | 0 | 0 | — |
case-15 | pass→pass | 9,447 | 3,606 | -62% | 1 | 1 | 0% | 1,673 | 2,178 | +30% | 0 | 0 | — |
case-16 | fail→pass | 7,486 | 3,569 | -52% | 1 | 1 | 0% | 1,441 | 2,189 | +52% | 0 | 0 | — |
case-17 | fail→pass | 5,541 | 2,920 | -47% | 1 | 1 | 0% | 1,038 | 2,063 | +99% | 0 | 0 | — |
case-18 | fail→pass | 10,864 | 6,277 | -42% | 1 | 1 | 0% | 1,920 | 2,614 | +36% | 0 | 0 | — |
case-19 | pass→pass | 7,606 | 2,910 | -62% | 1 | 1 | 0% | 1,369 | 2,045 | +49% | 0 | 0 | — |
case-20 | fail→pass | 17,306 | 2,198 | -87% | 1 | 1 | 0% | 2,928 | 1,905 | -35% | 0 | 0 | — |
case-21 | fail→pass | 7,615 | 2,415 | -68% | 1 | 1 | 0% | 1,340 | 1,913 | +43% | 0 | 0 | — |
case-22 | pass→pass | 11,469 | 6,481 | -43% | 1 | 1 | 0% | 2,062 | 2,706 | +31% | 0 | 0 | — |
case-23 | fail→fail | 9,687 | 5,808 | -40% | 1 | 1 | 0% | 1,654 | 2,473 | +50% | 0 | 0 | — |
case-24 | fail→fail | 13,118 | 5,694 | -57% | 1 | 1 | 0% | 791 | 2,468 | +212% | 0 | 0 | — |
case-25 | pass→pass | 9,440 | 3,338 | -65% | 1 | 1 | 0% | 1,636 | 2,129 | +30% | 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. 25 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 25 comparable cases.
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.