agentsclimarketplace

Ros2 core

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

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

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.

One thing to look at

  • 18 stars18 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.

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 325,949. 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.