Claude Cursor Skill

navigation

Configure, extend, and debug Nav2 in an existing robot app; explain navigation concepts. New mapping/localization/navigation demos start with architect.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download robium-ai-robium-skills_navigation-498ea4e.zip · 5 KB
Part of robium-ai/robium — 44 skills

Install

skills CLI npx skills add https://github.com/robium-ai/robium/tree/main/skills/navigation
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install robium-ai-robium@llmmart
Git git clone https://github.com/robium-ai/robium.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole robium-ai/robium collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Navigation

Treat Nav2 as a navigation chain. Find the first link whose evidence is wrong.

Start from the robot

  • For a new app or first demo, read architect before scaffolding or installing a navigation stack. It finds the saved apps checkout and selects a compatible baseline, even from outside the Robium workspace. If that selection already happened, continue here. Existing-app fixes and navigation explanations do not need onboarding.
  • Read the running system and its repository before proposing a new stack.
  • Identify the ROS distribution, installed Nav2 version, launch topology, and parameter files from the environment itself.
  • Note the robot's motion model, footprint, sensors, frames, command interface, and whether it is using SLAM or a saved map.
  • Start from the robot vendor's matching configuration. Change only what the application has outgrown.

Trace the chain

  • Environment: the installed packages, launch files, parameters, and running graph describe the same stack.
  • Pose: clock and transforms are fresh; one localizer owns map -> odom; odometry owns the path from odom to the robot base.
  • World: the map and live sensors reach both costmaps in frames they can transform.
  • Plan: the navigation action accepts the goal and the planner produces a path in the intended frame.
  • Control: the controller receives that path and can produce a valid motion command for the robot's kinematics and footprint.
  • Base: command topic, message type, smoothing or safety nodes, and base driver agree end to end.
  • Change the first broken link, then re-check what depends on it.

Go deeper only when needed

  • If navigation is failing and the broken link is unclear, read FAILURES.md.
  • If the stack is TurtleBot3 on ROS 2 Jazzy with Gazebo Harmonic, read TURTLEBOT3-JAZZY-GAZEBO.md before changing its launch or parameters.
  • For distribution-sensitive parameters, behavior trees, or custom Nav2 plugins, inspect the matching installed source and current official Nav2 documentation.
  • Reach for ROS 2 guidance when the evidence points to discovery, QoS, TF, or package wiring; Gazebo guidance for simulation, spawning, sensors, or bridges; and RViz2 or Foxglove guidance for viewer behavior.

Done

  • Verify the changed link and the user-visible outcome: the intended goal completes on the actual robot or representative simulation.
  • If the chain cannot be completed, name the first unsupported link and the evidence still needed.
Files (robium)
  • evals.yaml 370 B
    triggers:
      positive:
        - phrase: In our existing robot-navigation app, Nav2 plans a path but the robot never receives velocity commands. Diagnose it.
        - phrase: Explain how AMCL localization differs from SLAM in Nav2.
      negative:
        - phrase: Help me map a simulated environment, localize a mobile robot, and navigate to a goal.
          expect: architect
    tasks: []
    
  • FAILURES.md 3.4 KB
    # When navigation fails
    
    Start with the symptom that is actually present. Move upstream only when the
    current link has evidence.
    
    ## The stack is unavailable or inactive
    
    - Missing navigation actions point to bringup or lifecycle state, not planner
      tuning.
    - If several managed nodes shut down together, find the first node that failed.
      The later transitions are usually fallout.
    - If activation waits on a frame, map, or sensor, follow that missing input
      instead of forcing the node active.
    
    ## The pose is missing or stale
    
    - Separate a broken transform chain from an old transform. Both can look like
      a missing pose to costmaps and actions.
    - Check that every node uses the intended clock and that simulation time is
      advancing. Thread one `use_sim_time` launch value through every participating
      node; copied literals can silently diverge when the launch argument changes.
    - Identify who owns each transform. AMCL and SLAM are alternative owners of
      `map -> odom`, not two publishers to run together.
    - When `robot_localization` owns `odom -> base_link`, verify that TF publication
      is enabled and that `world_frame` matches the intended continuous odometry
      frame. Do not leave a Gazebo TF bridge publishing the same transform.
    - With AMCL, distinguish “no initial pose yet” from a localizer that received a
      pose and still cannot publish one.
    
    ## A costmap has no useful data
    
    - An empty global costmap points first to its map and transform inputs.
    - An empty local costmap points first to its observation topics, frames,
      freshness, and QoS.
    - A costmap full of obstacles points to footprint, inflation, clearing, or
      sensor interpretation. Confirm which layer contributes the cells before
      tuning it.
    
    ## A goal is rejected or aborted
    
    - Rejected before planning: inspect action availability, lifecycle state, goal
      frame, and pose validity.
    - Aborted without a path: inspect planner feedback and the global costmap.
    - Aborted during execution: inspect controller feedback, recovery behavior,
      and the local costmap rather than treating every abort as a planning failure.
    - Confirm that the goal is free space in the map frame. A valid world-frame
      coordinate is not automatically a valid map-frame goal.
    
    ## A plan exists but the robot does not move
    
    - If no motion command appears, inspect the controller's rejection reason,
      footprint, local costmap, progress checker, and goal checker.
    - If commands appear and are then zeroed, trace velocity smoothing, collision
      monitoring, safety, and command arbitration in order.
    - A path visible in a viewer proves planning only. It does not prove control or
      actuation.
    
    ## Velocity exists but the base remains still
    
    - Compare the publisher and subscriber topic names and message types.
    - Follow remaps through every mux, smoother, safety node, bridge, and base
      driver. Do not stop at the first `cmd_vel` topic with traffic.
    - Check the base's own state, limits, and stop conditions. Once a valid command
      reaches the driver, the fault is outside Nav2.
    
    ## The failure is intermittent
    
    - Compare timeouts with measured publication periods, jitter, and startup load.
      A timeout equal to the nominal period has no margin.
    - Correlate lifecycle or bond failures with the first stalled or crashed node,
      not the loudest shutdown log.
    - Reproduce one failure at a time. Concurrent simulators or duplicate
      localizers can create convincing but unrelated symptoms.
    
  • SKILL.md 2.7 KB
    ---
    name: navigation
    description: Configure, extend, and debug Nav2 in an existing robot app; explain navigation concepts. New mapping/localization/navigation demos start with architect.
    ---
    
    # Navigation
    
    Treat Nav2 as a **navigation chain**. Find the first link whose evidence is
    wrong.
    
    ## Start from the robot
    
    - For a new app or first demo, read [architect](../architect/SKILL.md) before
      scaffolding or installing a navigation stack. It finds the saved apps checkout
      and selects a compatible baseline, even from outside the Robium workspace.
      If that selection already happened, continue here. Existing-app fixes and
      navigation explanations do not need onboarding.
    - Read the running system and its repository before proposing a new stack.
    - Identify the ROS distribution, installed Nav2 version, launch topology, and
      parameter files from the environment itself.
    - Note the robot's motion model, footprint, sensors, frames, command interface,
      and whether it is using SLAM or a saved map.
    - Start from the robot vendor's matching configuration. Change only what the
      application has outgrown.
    
    ## Trace the chain
    
    - **Environment:** the installed packages, launch files, parameters, and
      running graph describe the same stack.
    - **Pose:** clock and transforms are fresh; one localizer owns `map -> odom`;
      odometry owns the path from `odom` to the robot base.
    - **World:** the map and live sensors reach both costmaps in frames they can
      transform.
    - **Plan:** the navigation action accepts the goal and the planner produces a
      path in the intended frame.
    - **Control:** the controller receives that path and can produce a valid motion
      command for the robot's kinematics and footprint.
    - **Base:** command topic, message type, smoothing or safety nodes, and base
      driver agree end to end.
    - Change the first broken link, then re-check what depends on it.
    
    ## Go deeper only when needed
    
    - If navigation is failing and the broken link is unclear, read
      [FAILURES.md](FAILURES.md).
    - If the stack is TurtleBot3 on ROS 2 Jazzy with Gazebo Harmonic, read
      [TURTLEBOT3-JAZZY-GAZEBO.md](TURTLEBOT3-JAZZY-GAZEBO.md) before changing its
      launch or parameters.
    - For distribution-sensitive parameters, behavior trees, or custom Nav2
      plugins, inspect the matching installed source and current official Nav2
      documentation.
    - Reach for ROS 2 guidance when the evidence points to discovery, QoS, TF, or
      package wiring; Gazebo guidance for simulation, spawning, sensors, or
      bridges; and RViz2 or Foxglove guidance for viewer behavior.
    
    ## Done
    
    - Verify the changed link and the user-visible outcome: the intended goal
      completes on the actual robot or representative simulation.
    - If the chain cannot be completed, name the first unsupported link and the
      evidence still needed.
    
  • TURTLEBOT3-JAZZY-GAZEBO.md 4.5 KB
    # TurtleBot3 + ROS 2 Jazzy + Gazebo Harmonic
    
    Use this card only when the robot, ROS distribution, and simulator all match.
    Treat every value below as observed evidence, not a default to copy blindly.
    
    ## Start from the matching platform
    
    - Use the model-specific parameters from `turtlebot3_navigation2` before the
      generic `nav2_bringup` parameters. The tested Jazzy package carried
      TurtleBot-specific kinematics, footprint, collision monitoring, and velocity
      settings that the generic file did not.
    - Keep the simulation model, bridge configuration, robot description, and Nav2
      parameters matched to the same TurtleBot model.
    - Inspect the installed package before relying on filenames or defaults. The
      upstream TurtleBot repositories use distribution branches and continue to
      evolve.
    
    Official starting points:
    
    - [TurtleBot3 e-Manual](https://emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/)
    - [ROBOTIS TurtleBot3](https://github.com/ROBOTIS-GIT/turtlebot3)
    - [ROBOTIS TurtleBot3 simulations](https://github.com/ROBOTIS-GIT/turtlebot3_simulations)
    - [Nav2 documentation](https://docs.nav2.org/)
    
    ## Interface contract observed by Robium
    
    - Gazebo publishes `/clock`; every node participating in navigation uses that
      clock.
    - The tested Burger bridge subscribed to `/cmd_vel` as
      `geometry_msgs/msg/TwistStamped`. A plain `Twist` publisher had no matching
      subscriber and did not move the robot.
    - The tested TurtleBot navigation parameters already enabled stamped velocity
      output in each command-producing Nav2 section. Starting from generic Nav2
      parameters lost that alignment.
    - Burger Cam and Waffle Pi preserved the application's movement, odometry, TF,
      lidar, IMU, and camera interfaces when their matching model, bridge, and
      description were selected together.
    - The tested Waffle Pi profile used a `0.15 m` Nav2 robot radius. Re-read the
      matching installed profile before applying that value to another model.
    
    ## Proven gotchas
    
    - **Command type:** on the tested Jazzy Burger stack,
      `geometry_msgs/msg/TwistStamped` moved the robot and plain `Twist` did not.
      Trace the live publisher/subscriber types before changing Nav2 output.
    - **Collision-source freshness:** the tested Burger lidar published at `5 Hz`
      while collision monitoring used `source_timeout: 0.2`. Normal jitter made
      scans stale and commands were zeroed. `1.0` worked in that run; the reusable
      rule is to measure the source and leave real margin above its period.
    - **Duplicate SLAM:** Jazzy `nav2_bringup` with `slam:=True` already launched
      `slam_toolbox` in the tested package. Starting another SLAM launch produced
      competing lifecycle owners and immediate navigation failures. Inspect the
      actual launch graph before adding a localizer.
    - **Container stalls:** on a constrained Docker Desktop host, an approximately
      `8 s` activation stall exceeded a `4 s` lifecycle bond timeout and shut the
      stack down. Setting `bond_timeout: 0.0` allowed that experiment to run but
      disabled bond failure detection; fix resource pressure or measure startup
      behavior before accepting that tradeoff.
    - **Launch substitutions:** the tested TurtleBot parameter file contained
      `$(find-pkg-share ...)` behavior-tree paths. A custom launch passing the YAML
      directly left those expressions literal; loading it through a substitution-
      aware `ParameterFile` resolved them.
    - **Map coordinates:** goals authored from Gazebo world coordinates did not
      automatically match the SLAM map frame. Use TF or select goals from the map;
      do not generalize the tested spawn-offset arithmetic to rotated frames.
    - **Goal clearance:** several failed waypoints were inside or too near world
      geometry. Confirm clearance against the map and footprint before changing
      planner tolerances.
    
    ## Model and application evidence
    
    - The original Burger/Jazzy/Harmonic run completed mapping and two saved-map
      Nav2 goals with stamped velocity output:
      [2026-07-10 nav-trial](../../learnings/2026-07-10.md).
    - A later Waffle Pi application preserved the TurtleBot sensor and control
      contract across several Gazebo worlds:
      [2026-08-14 indoor-navigation](../../learnings/2026-08-14-indoor-navigation.md).
    - The renamed Robot Navigation application completed the full chain from
      Gazebo lidar through mapping, map save, AMCL, and a Nav2 return goal:
      [2026-08-16 robot-navigation](../../learnings/2026-08-16-robot-navigation.md).
    
    Re-check the upstream packages whenever the ROS distribution, TurtleBot model,
    simulator, or installed package version changes. Add another platform card only
    after that combination completes a real navigation run.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related