Ros2 core
Claude Code skills for ROS 2 Jazzy — establish the unknowns first, verify against the installed system, prove the result ran.
npx -y skills add Leehyunbin0131/claude-ros2-skills --skill ros2-coreAssembled 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.
| For | Entry point |
|---|---|
| Jazzy concepts, tutorials, how-to guides | https://docs.ros.org/en/jazzy/ |
rclcpp C++ API index | https://docs.ros.org/en/jazzy/p/rclcpp/ |
rclpy Python API index | https://docs.ros.org/en/jazzy/p/rclpy/ |
| Robot bringup: TF tree, odometry, EKF fusion | https://docs.nav2.org/setup_guides/index.html |
2. Symbols to Verify There (never write these from memory)
- TF2 —
tf2_ros::TransformBroadcaster,tf2_ros::StaticTransformBroadcaster,tf2_ros::Buffer,tf2_ros::TransformListener,canTransform(),lookupTransform(),tf2::TimePointZero,tf2::ExtrapolationException; messagegeometry_msgs/msg/TransformStamped. Frame conventions are REP 105 (map->odom->base_link->base_footprint-> sensor frames) — seeros2-troubleshooting. - QoS —
rclcpp::SensorDataQoS()/rclpy.qos.qos_profile_sensor_dataon sensor topics; inspect real endpoint QoS withros2 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/Odometryorgeometry_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
| Symptom | Likely root cause | Action |
|---|---|---|
Topic listed in ros2 topic list but subscriber receives nothing | Incompatible QoS: BestEffort publisher vs Reliable subscriber, or volatile pub vs transient_local sub | check_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 other | Different ROS_DOMAIN_ID/RMW implementations, or multicast blocked on the network | Match ROS_DOMAIN_ID and RMW_IMPLEMENTATION; test discovery with ros2 multicast receive/send |
TF ExtrapolationException even though both frames exist | Mixed clocks (use_sim_time inconsistent) or looking up a hardcoded timestamp | Use tf2::TimePointZero/Time() for latest; align use_sim_time on every node |
| Timers/subscriptions starve while one callback runs | Single-threaded executor blocked by a long or blocking callback | MultiThreadedExecutor + 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 kept | Keep 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 SIGTERM | rclpy.shutdown() called after the context is already down, or spin() interrupted without handling it | Catch KeyboardInterrupt and rclpy.executors.ExternalShutdownException around spin(), and guard teardown with if rclpy.ok(): rclpy.shutdown() |
5. Strict Coding Rules
- For TF lookups, always catch
tf2::TransformExceptionor usecanTransform()timeout guards. - Always match topic subscriber QoS to publisher QoS (e.g.
SensorDataQoSfor high-rate LiDAR/IMU/Odom topics). - Never trust a sensor array without bounds-checking it. For
LaserScan, a value is usable only when finite and within[range_min, range_max]; filteringinfalone still letsnanand out-of-range readings through and produces a confidently wrong answer. - Make shutdown clean: wrap
spin()soKeyboardInterruptandExternalShutdownExceptionare caught, and only callrclpy.shutdown()whenrclpy.ok().