agentsclimarketplace

Ros2 core

Skill Leehyunbin0131/claude-ros2-skills/skills/ros2-core

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

Install
npx -y skills add Leehyunbin0131/claude-ros2-skills --skill ros2-core

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 14 days oldThe repository was created 14 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

ROS 2 Jazzy core: rclcpp/rclpy, TF2 transforms, odometry/EKF fusion, node parameters, launch, QoS.

SKILL.md

4.2 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

ROS 2 Jazzy (Ubuntu 24.04 LTS) Core Development Instructions

1. Documentation Entry Points

Navigate within these rather than guessing deep URLs.

ForEntry point
Jazzy concepts, tutorials, how-to guideshttps://docs.ros.org/en/jazzy/
rclcpp C++ API indexhttps://docs.ros.org/en/jazzy/p/rclcpp/
rclpy Python API indexhttps://docs.ros.org/en/jazzy/p/rclpy/
Robot bringup: TF tree, odometry, EKF fusionhttps://docs.nav2.org/setup_guides/index.html

2. Symbols to Verify There (never write these from memory)

  • TF2tf2_ros::TransformBroadcaster, tf2_ros::StaticTransformBroadcaster, tf2_ros::Buffer, tf2_ros::TransformListener, canTransform(), lookupTransform(), tf2::TimePointZero, tf2::ExtrapolationException; message geometry_msgs/msg/TransformStamped. Frame conventions are REP 105 (map -> odom -> base_link -> base_footprint -> sensor frames) — see ros2-troubleshooting.
  • QoSrclcpp::SensorDataQoS() / rclpy.qos.qos_profile_sensor_data on sensor topics; inspect real endpoint QoS with ros2 topic info <topic> -v. The depth-only default (create_subscription(..., 10)) is RELIABLE + VOLATILE — not TRANSIENT_LOCAL; check the enum rather than asserting it.
  • Packaging & build wiring — see ros2-package.

3. Local System Inspection & Interfaces (Ground Truth)

  • Message Definition Inspection: ros2 interface show <interface_name> (e.g. ros2 interface show nav_msgs/msg/Odometry or geometry_msgs/msg/TransformStamped).
  • Package Installed Assets: ros2 pkg prefix <package_name>
  • Live Topics / Params: ros2 topic list -t, ros2 param list <node_name>.

4. Symptom -> Root Cause -> Action

SymptomLikely root causeAction
Topic listed in ros2 topic list but subscriber receives nothingIncompatible QoS: BestEffort publisher vs Reliable subscriber, or volatile pub vs transient_local subcheck_qos_compat.py --topic <topic> (bundled in ros2-troubleshooting) checks every pub/sub pair, or read ros2 topic info <topic> -v; align them (SensorDataQoS for sensors)
Nodes on two machines can't see each otherDifferent ROS_DOMAIN_ID/RMW implementations, or multicast blocked on the networkMatch ROS_DOMAIN_ID and RMW_IMPLEMENTATION; test discovery with ros2 multicast receive/send
TF ExtrapolationException even though both frames existMixed clocks (use_sim_time inconsistent) or looking up a hardcoded timestampUse tf2::TimePointZero/Time() for latest; align use_sim_time on every node
Timers/subscriptions starve while one callback runsSingle-threaded executor blocked by a long or blocking callbackMultiThreadedExecutor + ReentrantCallbackGroup for blocking work; never sleep in callbacks
Reported minimum range is absurdly small (or nan propagates)ranges filtered for inf only; readings below range_min or above range_max and nan were keptKeep a reading only if math.isfinite(r) and msg.range_min <= r <= msg.range_max — the message docs say values outside those bounds must be discarded
Node exits with rcl_shutdown already called / ExternalShutdownException on Ctrl-C or SIGTERMrclpy.shutdown() called after the context is already down, or spin() interrupted without handling itCatch KeyboardInterrupt and rclpy.executors.ExternalShutdownException around spin(), and guard teardown with if rclpy.ok(): rclpy.shutdown()

5. Strict Coding Rules

  1. For TF lookups, always catch tf2::TransformException or use canTransform() timeout guards.
  2. Always match topic subscriber QoS to publisher QoS (e.g. SensorDataQoS for high-rate LiDAR/IMU/Odom topics).
  3. Never trust a sensor array without bounds-checking it. For LaserScan, a value is usable only when finite and within [range_min, range_max]; filtering inf alone still lets nan and out-of-range readings through and produces a confidently wrong answer.
  4. Make shutdown clean: wrap spin() so KeyboardInterrupt and ExternalShutdownException are caught, and only call rclpy.shutdown() when rclpy.ok().

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.