Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deep integration with ROS/ROS2 middleware for node development, launch files, package management, and robot communication. Execute ros2 commands, create and validate packages, configure publishers/subscribers/services/actions, and debug topic connectivity.
.claude/skills/a5c-ai-ros-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-02 | ✓→✗ | ▼ Worse | 97% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 96% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 176% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 289% | 0% |
You are ros-integration - a specialized skill for ROS/ROS2 middleware integration, providing deep capabilities for robot software development, node creation, and system configuration.
This skill enables AI-powered ROS/ROS2 development including:
Generate complete ROS2 packages with proper structure:
bash# Create a new ROS2 package ros2 pkg create --build-type ament_python my_robot_pkg \ --dependencies rclpy std_msgs sensor_msgs geometry_msgs # For C++ packages ros2 pkg create --build-type ament_cmake my_robot_cpp_pkg \ --dependencies rclcpp std_msgs sensor_msgs
my_robot_pkg/
├── my_robot_pkg/
│ ├── __init__.py
│ ├── my_node.py
│ └── utils/
├── launch/
│ └── robot_launch.py
├── config/
│ └── params.yaml
├── resource/
│ └── my_robot_pkg
├── test/
├── package.xml
├── setup.py
└── setup.cfgGenerate Python launch files for ROS2:
pythonfrom launch import LaunchDescription from launch_ros.actions import Node from launch.actions import DeclareLaunchArgument from launch.substitutions import LaunchConfiguration from ament_index_python.packages import get_package_share_directory import os def generate_launch_description(): # Get package share directory pkg_share = get_package_share_directory('my_robot_pkg') # Declare launch arguments use_sim_time = DeclareLaunchArgument( 'use_sim_time', default_value='false', description='Use simulation time' ) # Node configuration robot_node = Node( package='my_robot_pkg', executable='my_node', name='robot_controller', output='screen', parameters=[ os.path.join(pkg_share, 'config', 'params.yaml'), {'use_sim_time': LaunchConfiguration('use_sim_time')} ], remappings=[ ('/cmd_vel', '/robot/cmd_vel'), ('/odom', '/robot/odom') ] ) return LaunchDescription([ use_sim_time, robot_node ])
Create ROS2 nodes with publishers, subscribers, services, and actions:
pythonimport rclpy from rclpy.node import Node from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy from std_msgs.msg import String from geometry_msgs.msg import Twist from sensor_msgs.msg import LaserScan class RobotController(Node): def __init__(self): super().__init__('robot_controller') # Declare parameters self.declare_parameter('max_speed', 1.0) self.declare_parameter('safety_distance', 0.5) # QoS profile for sensor data sensor_qos = QoSProfile( reliability=ReliabilityPolicy.BEST_EFFORT, history=HistoryPolicy.KEEP_LAST, depth=10 ) # Publishers self.cmd_vel_pub = self.create_publisher( Twist, '/cmd_vel', 10 ) # Subscribers self.laser_sub = self.create_subscription( LaserScan, '/scan', self.laser_callback, sensor_qos ) # Timer for control loop self.timer = self.create_timer(0.1, self.control_loop) self.get_logger().info('Robot controller initialized') def laser_callback(self, msg): # Process laser scan data self.latest_scan = msg def control_loop(self): # Main control logic max_speed = self.get_parameter('max_speed').value # ... control logic ... def main(args=None): rclpy.init(args=args) node = RobotController() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
Generate custom message definitions:
# msg/RobotStatus.msg
std_msgs/Header header
string robot_name
float64 battery_level
bool is_moving
geometry_msgs/Pose current_pose
float64[] joint_positionsService definition:
# srv/SetMode.srv
string mode
---
bool success
string messageAction definition:
# action/Navigate.action
# Goal
geometry_msgs/PoseStamped target_pose
float64 timeout
---
# Result
bool success
string message
float64 elapsed_time
---
# Feedback
float64 distance_remaining
float64 estimated_time_remainingConfigure Quality of Service policies for different use cases:
pythonfrom rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy, QoSDurabilityPolicy # Sensor data (high frequency, lossy) sensor_qos = QoSProfile( reliability=QoSReliabilityPolicy.BEST_EFFORT, history=QoSHistoryPolicy.KEEP_LAST, depth=5 ) # Control commands (reliable) control_qos = QoSProfile( reliability=QoSReliabilityPolicy.RELIABLE, history=QoSHistoryPolicy.KEEP_LAST, depth=10 ) # Parameters and configuration (transient local) config_qos = QoSProfile( reliability=QoSReliabilityPolicy.RELIABLE, durability=QoSDurabilityPolicy.TRANSIENT_LOCAL, history=QoSHistoryPolicy.KEEP_LAST, depth=1 )
Debug ROS2 systems:
bash# List all nodes ros2 node list # Get node info ros2 node info /robot_controller # List topics ros2 topic list -t # Echo topic ros2 topic echo /cmd_vel # Topic bandwidth/frequency ros2 topic hz /scan ros2 topic bw /camera/image_raw # Service list and call ros2 service list ros2 service call /set_mode my_robot_pkg/srv/SetMode "{mode: 'autonomous'}" # Parameter operations ros2 param list /robot_controller ros2 param get /robot_controller max_speed ros2 param set /robot_controller max_speed 2.0 # TF2 debugging ros2 run tf2_tools view_frames ros2 run tf2_ros tf2_echo base_link odom
This skill can leverage the following MCP servers for enhanced capabilities:
| Server | Description | Installation | |--------|-------------|--------------| | ros-mcp-server (robotmcp) | ROS/ROS2 bridge via MCP | GitHub | | ros2-mcp-server (kakimochi) | Python-based ROS2 MCP integration | Glama | | roba-labs-mcp | ROS documentation and learning resources | Glama |
This skill integrates with the following processes:
robot-system-design.js - System architecture with ROS nodesrobot-calibration.js - Calibration node developmentgazebo-simulation-setup.js - ROS-Gazebo integrationnav2-navigation-setup.js - Navigation stack configurationmulti-robot-coordination.js - Multi-robot ROS communicationWhen executing operations, provide structured output:
json{ "operation": "create-package", "packageName": "my_robot_pkg", "buildType": "ament_python", "status": "success", "artifacts": [ "my_robot_pkg/package.xml", "my_robot_pkg/setup.py", "my_robot_pkg/my_robot_pkg/__init__.py" ], "nextSteps": [ "Add node implementation", "Create launch file", "Build with colcon build" ] }
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 20,864 | 24,021 | +15% | 1 | 1 | 0% | 3,367 | 6,595 | +96% | 0 | 0 | — |
case-02 | pass→fail | 16,552 | 25,488 | +54% | 1 | 1 | 0% | 3,463 | 6,806 | +97% | 0 | 0 | — |
case-03 | pass→pass | 11,704 | 12,933 | +11% | 1 | 1 | 0% | 1,283 | 3,545 | +176% | 0 | 0 | — |
case-04 | pass→pass | 11,576 | 16,320 | +41% | 1 | 1 | 0% | 1,207 | 4,701 | +289% | 0 | 0 | — |
case-05 | pass→pass | 15,393 | 10,977 | -29% | 1 | 1 | 0% | 1,927 | 4,027 | +109% | 0 | 0 | — |
case-06 | pass→pass | 12,599 | 10,724 | -15% | 1 | 1 | 0% | 1,350 | 3,519 | +161% | 0 | 0 | — |
case-07 | pass→pass | 15,013 | 14,556 | -3% | 1 | 1 | 0% | 2,003 | 4,239 | +112% | 0 | 0 | — |
case-08 | pass→pass | 18,086 | 19,149 | +6% | 1 | 1 | 0% | 2,479 | 4,459 | +80% | 0 | 0 | — |
case-09 | pass→pass | 8,292 | 13,431 | +62% | 1 | 1 | 0% | 1,137 | 3,879 | +241% | 0 | 0 | — |
case-10 | pass→pass | 11,955 | 10,120 | -15% | 1 | 1 | 0% | 1,031 | 3,240 | +214% | 0 | 0 | — |
case-11 | pass→pass | 11,007 | 18,334 | +67% | 1 | 1 | 0% | 1,592 | 4,424 | +178% | 0 | 0 | — |
case-12 | pass→pass | 10,285 | 9,959 | -3% | 1 | 1 | 0% | 895 | 3,190 | +256% | 0 | 0 | — |
case-13 | pass→pass | 12,052 | 8,583 | -29% | 1 | 1 | 0% | 1,249 | 3,038 | +143% | 0 | 0 | — |
case-14 | fail→fail | 10,508 | 12,793 | +22% | 1 | 1 | 0% | 1,943 | 3,821 | +97% | 0 | 0 | — |
case-15 | fail→pass | 24,950 | 8,944 | -64% | 1 | 1 | 0% | 3,220 | 4,023 | +25% | 0 | 0 | — |
case-16 | pass→pass | 8,384 | 13,045 | +56% | 1 | 1 | 0% | 1,532 | 3,850 | +151% | 0 | 0 | — |
case-17 | pass→pass | 22,737 | 22,248 | -2% | 1 | 1 | 0% | 2,544 | 5,505 | +116% | 0 | 0 | — |
case-18 | pass→pass | 13,700 | 22,961 | +68% | 1 | 1 | 0% | 1,851 | 4,944 | +167% | 0 | 0 | — |
case-19 | pass→pass | 4,281 | 8,988 | +110% | 1 | 1 | 0% | 744 | 3,066 | +312% | 0 | 0 | — |
case-20 | pass→pass | 11,379 | 6,360 | -44% | 1 | 1 | 0% | 1,170 | 3,330 | +185% | 0 | 0 | — |
case-21 | pass→pass | 13,676 | 15,576 | +14% | 1 | 1 | 0% | 1,744 | 4,398 | +152% | 0 | 0 | — |
case-22 | pass→pass | 13,689 | 14,194 | +4% | 1 | 1 | 0% | 2,737 | 4,255 | +55% | 0 | 0 | — |
case-23 | pass→pass | 7,357 | 12,830 | +74% | 1 | 1 | 0% | 1,510 | 3,995 | +165% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of -100 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.