claudeers.
// Claude Plugins

claude-ros2-skills

Claude Code skills for ROS 2 Jazzy — establish the unknowns first, verify against the installed system, prove the result ran.

Actively maintained
95/100
last commit 22 days ago
last release none
releases 0
open issues 0
// star history+1 this week

Install with your AI

Paste into Claude Code, Cursor, or any agent — it reads the repo and wires the tool into your project.

Install and set up claude-ros2-skills (claude-plugin project) into my current project.
Found on https://claudeers.com/claude-ros2-skills
Repo: https://github.com/Leehyunbin0131/claude-ros2-skills
Homepage/docs: —
Detected install method: claude-plugin → /plugin install claude-ros2-skills@Leehyunbin0131/claude-ros2-skills
Category: plugins. Platforms: api.
Read the repo's README for exact setup and env vars, then install it and wire it into my project.

Claudeers Health Verdict:
active; community-verified: false. Confirm the source before running anything.
// or install directly (claude-plugin)
/plugin marketplace add Leehyunbin0131/claude-ros2-skills
/plugin install claude-ros2-skills@Leehyunbin0131/claude-ros2-skills
// or clone
git clone https://github.com/Leehyunbin0131/claude-ros2-skills

// compatibility

Platformsapi
Operating systems
AI compatibilityclaude
LicenseApache-2.0
Pricingopen-source
LanguagePython
claude-ros2-skills — Claude Code skills for ROS 2 Jazzy

Claude Code Skills for ROS 2 Jazzy Jalisco robotics development.

Skills that transform how AI agents approach ROS 2 development: identify unknown parameters upfront, verify settings against installed packages, and confirm execution through working evidence.

English | 한국어 | 中文 | 日本語 | Español | Français | Deutsch

SkillsAlways-loaded protocolDoc links (CI-checked)Physical robot checksEvals: Gazebo A/B
1126 lines324 scriptsgoal reached vs. bringup abort

Contents

The failures that cost you

The most costly errors in AI-generated ROS 2 code are rarely syntax mistakes. Instead, they are subtle issues that appear correct at first glance:

FailureWhat you seeWhy an agent encounters the issue
Silent failureros2 topic hz shows 30 Hz; your callback never firesA default RELIABLE subscriber attempts to connect to a BEST_EFFORT publisher. The code compiles and passes code review, but fails at the DDS middleware level.
Wrong ground truth/cmd_vel indicates forward motion and /odom reports forward motion, but the physical robot moves backwardThe static TF frame is inverted relative to physical mounting. Downstream components compute correctly using the wrong transform, producing no obvious errors.
Outdated APICode passes review but fails at runtime when calling an incorrect methodThe agent uses deprecated Foxy or Humble API methods that were renamed or removed in Jazzy.
Invalid premiseThe agent writes 200 lines of code based on an assumption that you could have corrected in a single sentenceNo mechanism prompts the agent to verify missing details before generating code.

Neither compilers, linters, nor log analyses detect these hidden issues. Resolving each error requires an extra feedback cycle: reviewing output, diagnosing the cause, explaining the fix, and re-generating code.

How these skills are built

Four design rules govern every skill in this repository:

1. Identify unknown variables upfront. Key operational details often do not exist in documentation — such as whether the environment is real hardware or simulation, whether to extend an existing workspace or create a new one, which node already publishes a transform, or the robot's precise geometry. CLAUDE.md instructs the agent to clarify these unknowns before generating code. Domain-specific skills manage targeted parameters; for example, ros2-dev requests the robot footprint, drive kinematics, and localization source before configuring any Nav2 parameters.

2. Execute a structured loop with clear exit criteria. Every skill follows a verify → write → prove cycle: inspect system defaults on the installed environment, apply incremental changes, and confirm execution. A task completes only when supported by observed evidence — such as a successful build, active data on ros2 topic echo, or a passing verification script — rather than simply producing code files.

3. Prioritize structured failure tables over long descriptions. Structured tables mapping symptoms → root causes → corrective actions provide clear, durable guidance that official documentation often lacks and that remains reliable across release versions:

[ is GZ→ROS, ] is ROS→GZ · 16UC1 is millimeters, 32FC1 is meters · joint_state_broadcaster is not spawned automatically · raytrace_max_rangeobstacle_max_range means obstacles never clear · rclc does not auto-allocate unbounded message fields

4. Optimize context usage with a three-layer architecture. Each skill balances context efficiency: skill descriptions remain in context, skill bodies load when invoked, and deep reference files in references/ load only on demand. Large symbol catalogs and detailed parameter tuning tables reside in references/, ensuring context is preserved and debugging targeted components (like AMCL) does not load unnecessary documentation (like behavior-tree nodes).

What makes this different

Most robotics skill packs embed static API knowledge directly inside skill files. While initial usage is easy, this approach breaks when the underlying packages update — leaving outdated snippets that silently fail. This repository takes a dynamic, documentation-driven approach:

FeatureContent-heavy skill packsclaude-ros2-skills
Knowledge locationEmbedded in skill files (400–1,800 lines/skill)Linked to official docs (~60-line skill bodies); detailed references read only when needed
Always-loaded contextFull SKILL.md files26-line core protocol
Handling Jazzy API updatesSnippets become outdated quietly; requires continuous manual test updatesOutdated snippet risk is minimized to entry-point links and symbol names — 32 documentation links verified weekly via CI
Verification methodStatic code analysis or log checkingPhysical & runtime verification: IMU gravity checks, directional odometry tests, TF frame alignment, DDS QoS compatibility
Distribution scopeClaims support for multiple ROS distros while targeting only oneROS 2 Jazzy only, explicitly designed and validated

This repository optimizes for a single outcome: minimizing the risk of generating plausible-looking code that fails to run on ROS 2 Jazzy.

Evals

Every result below comes from a measured A/B pair: the identical prompt run in fresh, headless Claude Code sessions — once without these skills, once with them — using the same model in both cells. Outputs were graded symbol-by-symbol against pinned upstream Jazzy sources, then against a live /opt/ros/jazzy installation, then by loading both outputs into a live Gazebo simulation, and finally by executing the generated nodes against running publishers. Every task in the suite now has a live-install measurement. Full transcripts, generated code, and run logs are committed under evals/runs/, and the harness that produces the pairs is in evals/harness/, so anyone can re-grade or re-run without trusting us.

Sample size is n=1 per cell and the runs were graded by the same project that publishes them; grading is mechanical wherever possible (does the symbol exist in the install? does the command succeed?) so it can be checked independently.

Prompt: set up Nav2 with the MPPI controller for a differential-drive robot on Jazzy and produce the controller server YAML.

Without skillsWith skills
ProcessAnswered instantly from memory; zero verification despite tools being availableAsked footprint, existing-config, localization, and velocity limits first, then read the shipped defaults at /opt/ros/jazzy/share/nav2_bringup/params/nav2_params.yaml
Plugin stringmppi_generic::ControllerServer — does not existnav2_mppi_controller::MPPIController — correct
critics: listAbsent entirelyAll 8, correct names
Fabricated parameter keys~160 — every key mechanically diffed against the installed defaults
Loaded into a live Gazebo simulation[FATAL] Failed to create controller … does not exist — Nav2 aborts at bringup; the robot never movesMPPI + all 8 critics load; the robot drives (−2.0, −0.5) → (0.5, 0.5); NavigateToPose returns SUCCEEDED

A package that must actually run — Haiku, in-container

Prompt: create a Python package demo_pkg publishing std_msgs/msg/String on /greeting at 1 Hz with a launch file; build it and show ros2 topic echo /greeting.

Without skillsWith skills
ros2 run / ros2 launch / topic echoAll three fail — the package never registers in the ament indexAll three pass, confirmed by independent re-runs of each command
Cost to that outcome$0.17 · 36 turns · 178 s$0.08 · 18 turns · 61 s — correct on the first pass and 2.2× cheaper

Sensor subscription — Haiku, both nodes executed against a live publisher

Prompt: write a Jazzy Python node that subscribes to /scan and logs the minimum range once per second. Both generated nodes were then run for 6 s against a BEST_EFFORT /scan publisher.

Without skillsWith skills
Subscription QoScreate_subscription(..., 10) → RELIABLEqos_profile_sensor_data
Messages received at runtimeZero. rclpy itself reported offering incompatible QoS. No messages will be received from it. Last incompatible policy: RELIABILITYReceives at 5 Hz
Reported minimum (correct answer: 0.45 m)never received one0.450 m — correct
Clean exit on SIGTERMtracebackno traceback

An earlier round of this same pair is what produced the fix: both nodes then filtered only inf, so the with-skills node reported 0.020 m — connected, but confidently wrong. ros2-core gained the bounds rule and the shutdown pattern, and the re-run above is the verification that the patch changed the output. Both tables are in evals/RESULTS.md.

Asking before writing — Haiku, inverted LiDAR mount

Prompt: my LiDAR is mounted upside-down on the back, facing backward; write the static TF and tell me how to confirm it.

Without skillsWith skills
Physical mounting established firstAnswered in one turnStopped and asked for the back distance and offsets before emitting a transform
Transform correctnessroll≈180° + yaw≈180°, REP 105 parent/child — correctcorrect; both outputs were published and flagged by check_tf_tree.py exactly as designed
Confirmation adviceRViz with a PointCloud2 display — wrong message type for a LiDARtf2_echo plus a LaserScan display

What the skills do not fix

Reported because leaving it out would make the rest less trustworthy:

  • A rule only exists if the router loads the file it lives in. On the QoS-diagnosis task, two runs of the identical prompt routed to different skills — ros2-core once, ros2-perception the next. ros2-perception's examples are exclusively C++, and it is the only skill with no Python content; asked for a Python fix with nothing but rclcpp:: in context, the answer came back using rclcpp.qos in Python, which raises ModuleNotFoundError. The baseline, with no skill loaded at all, got that API right. This is the one measured case of the pack making output worse, and the cause is skill content, not the model.
  • Hallucination moves, it does not stop. Every measured round has contained invented symbols in with-skills output — a non-existent package for this repo's own script, a wrong default durability, missing range bounds, a Python module that doesn't exist. Routing to docs raises the floor; it does not make the model correct.
  • On problems the model already knows cold, skills cost more and buy little. For the classic QoS-mismatch diagnosis, both conditions were right in one turn and the with-skills side cost ~1.4× while adding an error.
  • Skills change what the agent asks, more reliably than what it checks. Across four with-skills cells on that task, with a live reproduction running and Bash allowed, none ran the ros2 topic info -v they recommended. The verify-before-writing half does fire — on Task 1 the agent ran ros2 interface show first — but "prove it afterwards" does not reach diagnosis answers.

The pattern across every pair

No baseline cell in any run verified against the installed packages or the docs before writing, even when WebFetch, Read, and Bash were explicitly allowed — and one baseline reported a fully working build for a package ros2 run cannot find. With-skills cells asked the pre-write gate questions in every run where the task had unknowns, and their claims matched independent re-execution. The verification scripts have now been exercised on live data in both directions: check_qos_compat.py produced its first real [FAIL] against a genuine BEST_EFFORT/RELIABLE mismatch, and check_tf_tree.py flagged an inverted sensor while leaving a correctly-mounted one alone.

Review full evaluation tables, test environments, and individual run analyses in evals/RESULTS.md. For details on the evaluation protocol, task checklists, and container setup, see evals/README.md. Pull requests containing additional graded transcripts are welcome.

Quickstart

Option A — Plugin Marketplace (Recommended):

/plugin marketplace add Leehyunbin0131/claude-ros2-skills
/plugin install claude-ros2-skills@claude-ros2-skills

Update installed plugins anytime with /plugin marketplace update.

Option B — Manual Installation:

git clone https://github.com/Leehyunbin0131/claude-ros2-skills.git

# Project-level installation (applies to the current project only)
mkdir -p your-project/.claude/skills
cp -r claude-ros2-skills/skills/* your-project/.claude/skills/
cp claude-ros2-skills/CLAUDE.md your-project/

# User-level installation (applies across all projects)
mkdir -p ~/.claude/skills
cp -r claude-ros2-skills/skills/* ~/.claude/skills/

Restart Claude Code (or start a new session) to apply the installed skills.

Skills

SkillPathCoverage
ros2-coreskills/ros2-core/SKILL.mdrclcpp, rclpy, TF2, EKF odometry, QoS profiles, parameters
ros2-packageskills/ros2-package/SKILL.mdros2 pkg create, CMakeLists/setup.py wiring, colcon build & source, custom interfaces
ros2-devskills/ros2-dev/SKILL.mdNav2 (AMCL, costmaps, MPPI/Smac), SLAM Toolbox, RTAB-Map, Isaac ROS
gazebo-simskills/gazebo-sim/SKILL.mdGazebo Harmonic, ros_gz_bridge, ros_gz_sim, SDFormat modeling
ros2-controlskills/ros2-control/SKILL.mdros2_control hardware abstraction, controller manager, URDF tags
ros2-moveitskills/ros2-moveit/SKILL.mdMoveIt 2, MoveGroup C++/Python API, IK solvers, OMPL, MoveIt Servo
ros2-perceptionskills/ros2-perception/SKILL.mdimage_transport, cv_bridge, vision_msgs, depth_image_proc, PCL
ros2-testingskills/ros2-testing/SKILL.mdlaunch_testing, gtest/pytest, rosbag2 C++/Python APIs, ros2trace
ros2-microrosskills/ros2-microros/SKILL.mdmicro-ROS Agent, rclc client API, custom transports, static memory
ros2-securityskills/ros2-security/SKILL.mdSROS2, PKI keystore generation, access control, DDS Security
ros2-troubleshootingskills/ros2-troubleshooting/SKILL.mdREP 103/105 ground-truth TF tree, LiDAR/IMU alignment, physical verification

Verification scripts

These verification scripts are bundled within the ros2-troubleshooting skill (skills/ros2-troubleshooting/scripts/) and are included with every installation. They convert physical hardware checks into executable pass/fail verification steps (requires a sourced ROS 2 environment; return codes: 0 = PASS, 1 = FAIL, 2 = NO DATA):

ScriptVerifies
check_imu_gravity.pyValidates that a robot at rest measures gravity at ~+9.81 m/s² along the +Z axis (REP 103). Detects inverted or misaligned IMU mountings.
check_odom_direction.pyValidates that pushing the robot forward produces positive odometry displacement along its heading. Detects inverted motor directions, encoder polarity issues, or inverted TF setups.
check_tf_tree.pyVerifies that map→odom→base_link resolves correctly; displays each sensor mounting offset in RPY degrees and highlights potential 180° orientation errors.
check_qos_compat.pyVerifies QoS compatibility across all publisher/subscriber pairs on a topic using DDS rules. Prevents silent failures (such as a BEST_EFFORT publisher paired with a RELIABLE subscriber, or mismatches in durability, deadline, and liveliness).

The core decision logic is unit-tested independently of ROS (python3 skills/ros2-troubleshooting/scripts/test_checks.py) and runs via continuous integration (CI) on every push.

How it works

flowchart LR
    A["your request"] --> B["CLAUDE.md<br/>protocol + gates,<br/>no API details"]
    B --> C["skills/&lt;name&gt;/SKILL.md<br/>gates, loop,<br/>failure tables"]
    C --> D["/opt/ros/jazzy/<br/>or official Jazzy docs"]
    C -.only if needed.-> R["references/<br/>symbol catalogs,<br/>tuning tables"]
    D --> E["code, then proof it ran"]
    R --> E

CLAUDE.md contains no specific API details. Instead, it establishes the operational protocol and requires clarifying questions to be answered before writing code. Each SKILL.md file manages domain-specific decisions: identifying unknown variables, executing the verify-write-prove loop, and referencing failure tables. Detailed reference materials are stored separately in the references/ directory. See CLAUDE.md for details.

Updating

cd claude-ros2-skills
git pull
cp -r skills/* ~/.claude/skills/   # or your project's .claude/skills/

Roadmap

  1. Automate evaluation pairs inside ros:jazzy containersdone (2026-07-25): Task 4 re-run against a live /opt/ros/jazzy install; results in evals/RESULTS.md.
  2. Publish Task 5 evaluation resultsdone (2026-07-25): binary build/run/echo outcome measured in-container; results in evals/RESULTS.md.
  3. Extend live-install evaluations to Tasks 1–3done (2026-07-26): run against a native ros-jazzy-ros-base install, with both generated nodes executed against live publishers; harness in evals/harness/, results in evals/RESULTS.md.
  4. Fix the defects those runs exposeddone (2026-07-26): ros2-troubleshooting now states the literal script invocation (the model was inventing a package for it) and that check_tf_tree.py always flags a ~180° mount for physical confirmation; ros2-core gained the range_min/range_max bounds rule and a clean-shutdown pattern. The eval tables measure the skills as they were before these fixes.
  5. Re-run Tasks 1–3 against the patched skillsdone (2026-07-26): two of three defects corrected near-verbatim and Task 1 now reports the right minimum at runtime; the third task regressed for a traceable reason (see item 6).
  6. Duplicate the client-library guardrail across skills. rclpy is mentioned in exactly 1 of 11 skills, so a Python question routed anywhere else has only C++ examples in context. Either state the C++/Python separation locally in every skill that shows client-library code, or promote it into CLAUDE.md where routing cannot miss it. ros2-perception also needs Python cv_bridge examples, not only C++ ones.
  7. Measure the routing distribution. Which skill gets selected varies between identical runs, and at n=1 that variance sits underneath every number in the eval tables.
  8. Make Task 3 discriminating — require the QoS diagnosis to be demonstrated against live endpoints, not recommended, since both conditions currently answer it correctly from memory.
  9. Track "corrections-to-completion" as a core metric — measuring the number of feedback iterations required before code runs successfully.
  10. Implement deterministic references/ lookups to ensure detailed reference documents load whenever relevant.
  11. Expand the body/references split to ros2-core and gazebo-sim, optimizing context efficiency for high-frequency skills with substantial reference documentation.

Contributing

Summary: Skill files must focus on decision logic (validation gates, loop steps, and failure tables), while detailed documentation stays in references/. Every API symbol must be verified against official Jazzy documentation or /opt/ros/jazzy/ installations. Verification scripts must maintain pure logic that can be unit-tested without ROS dependencies. For full guidelines, skill and script checklists, and issue templates, see CONTRIBUTING.md.

License

Apache-2.0 — see LICENSE.

// faq

What is claude-ros2-skills?

Claude Code skills for ROS 2 Jazzy — establish the unknowns first, verify against the installed system, prove the result ran.. It is open-source on GitHub.

Is claude-ros2-skills free to use?

claude-ros2-skills is open-source under the Apache-2.0 license, so it is free to use.

What category does claude-ros2-skills belong to?

claude-ros2-skills is listed under plugins in the Claudeers registry of Claude-compatible tools.

3 views
19 stars
unclaimed
updated 28 days ago

// embed badge

claude-ros2-skills on Claudeers
[![Claudeers](https://claudeers.com/api/badge/claude-ros2-skills.svg)](https://claudeers.com/claude-ros2-skills)

// retro hit counter

claude-ros2-skills hit counter
[![Hits](https://claudeers.com/api/counter/claude-ros2-skills.svg)](https://claudeers.com/claude-ros2-skills)

// reviews

// guestbook

0/500

// related in Claude Plugins

🔓

A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.

// pluginsmultica-ai/203,096[ claude ]
🔓

Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explainin…

// pluginsanthropics/Python141,574[ claude ]
🔓

"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/

// pluginsHKUDS/Python47,363Apache-2.0[ claude ]
🔓

financial-services — a Claude ecosystem project on GitHub.

// pluginsanthropics/Python34,276Apache-2.0[ claude ]
→ see how claude-ros2-skills connects across the ecosystem