名称: ros集成 描述: 深度集成ROS/ROS2中间件,支持节点开发、启动文件、包管理和机器人通信。执行ros2命令,创建和验证包,配置发布者/订阅者/服务/动作,调试主题连接性。 允许工具: Bash(*) 读取 写入 编辑 全局搜索 Grep 网络获取 元数据: 作者: babysitter-sdk 版本: “1.0.0” 类别: 中间件 待办事项ID: SK-001
ros集成
您是ros集成 - 一个专门用于ROS/ROS2中间件集成的技能,为机器人软件开发、节点创建和系统配置提供深度能力。
概述
此技能支持AI驱动的ROS/ROS2开发,包括:
- 生成具有正确CMakeLists.txt和package.xml的ROS/ROS2包结构
- 创建启动文件(ROS2使用Python启动,ROS1使用XML)
- 配置节点参数和YAML配置文件
- 设置发布者、订阅者、服务和动作
- 生成消息、服务和动作定义
- 配置DDS通信的QoS策略
- 实现生命周期节点管理(ROS2)
- 调试主题/服务连接问题
- 配置tf2变换广播
前提条件
- ROS/ROS2安装(ROS2推荐Humble、Iron或Rolling版本)
- colcon构建工具(ROS2)或catkin(ROS1)
- rosdep依赖管理
- Python 3.8+用于启动文件
能力
1. 包生成
生成具有正确结构的完整ROS2包:
# 创建新的ROS2包
ros2 pkg create --build-type ament_python my_robot_pkg \
--dependencies rclpy std_msgs sensor_msgs geometry_msgs
# 对于C++包
ros2 pkg create --build-type ament_cmake my_robot_cpp_pkg \
--dependencies rclcpp std_msgs sensor_msgs
包结构(Python)
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.cfg
2. 启动文件创建
为ROS2生成Python启动文件:
from 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():
# 获取包共享目录
pkg_share = get_package_share_directory('my_robot_pkg')
# 声明启动参数
use_sim_time = DeclareLaunchArgument(
'use_sim_time',
default_value='false',
description='使用模拟时间'
)
# 节点配置
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
])
3. 节点开发
创建具有发布者、订阅者、服务和动作的ROS2节点:
import 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')
# 声明参数
self.declare_parameter('max_speed', 1.0)
self.declare_parameter('safety_distance', 0.5)
# 传感器数据的QoS配置文件
sensor_qos = QoSProfile(
reliability=ReliabilityPolicy.BEST_EFFORT,
history=HistoryPolicy.KEEP_LAST,
depth=10
)
# 发布者
self.cmd_vel_pub = self.create_publisher(
Twist, '/cmd_vel', 10
)
# 订阅者
self.laser_sub = self.create_subscription(
LaserScan, '/scan', self.laser_callback, sensor_qos
)
# 控制循环定时器
self.timer = self.create_timer(0.1, self.control_loop)
self.get_logger().info('机器人控制器已初始化')
def laser_callback(self, msg):
# 处理激光扫描数据
self.latest_scan = msg
def control_loop(self):
# 主控制逻辑
max_speed = self.get_parameter('max_speed').value
# ... 控制逻辑 ...
def main(args=None):
rclpy.init(args=args)
node = RobotController()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
4. 消息/服务/动作定义
生成自定义消息定义:
# msg/RobotStatus.msg
std_msgs/Header header
string robot_name
float64 battery_level
bool is_moving
geometry_msgs/Pose current_pose
float64[] joint_positions
服务定义:
# srv/SetMode.srv
string mode
---
bool success
string message
动作定义:
# action/Navigate.action
# 目标
geometry_msgs/PoseStamped target_pose
float64 timeout
---
# 结果
bool success
string message
float64 elapsed_time
---
# 反馈
float64 distance_remaining
float64 estimated_time_remaining
5. QoS配置
为不同用例配置服务质量策略:
from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy, QoSDurabilityPolicy
# 传感器数据(高频,允许丢失)
sensor_qos = QoSProfile(
reliability=QoSReliabilityPolicy.BEST_EFFORT,
history=QoSHistoryPolicy.KEEP_LAST,
depth=5
)
# 控制命令(可靠)
control_qos = QoSProfile(
reliability=QoSReliabilityPolicy.RELIABLE,
history=QoSHistoryPolicy.KEEP_LAST,
depth=10
)
# 参数和配置(瞬态本地)
config_qos = QoSProfile(
reliability=QoSReliabilityPolicy.RELIABLE,
durability=QoSDurabilityPolicy.TRANSIENT_LOCAL,
history=QoSHistoryPolicy.KEEP_LAST,
depth=1
)
6. 调试命令
调试ROS2系统:
# 列出所有节点
ros2 node list
# 获取节点信息
ros2 node info /robot_controller
# 列出主题
ros2 topic list -t
# 回显主题
ros2 topic echo /cmd_vel
# 主题带宽/频率
ros2 topic hz /scan
ros2 topic bw /camera/image_raw
# 服务列表和调用
ros2 service list
ros2 service call /set_mode my_robot_pkg/srv/SetMode "{mode: 'autonomous'}"
# 参数操作
ros2 param list /robot_controller
ros2 param get /robot_controller max_speed
ros2 param set /robot_controller max_speed 2.0
# TF2调试
ros2 run tf2_tools view_frames
ros2 run tf2_ros tf2_echo base_link odom
MCP服务器集成
此技能可以利用以下MCP服务器增强能力:
| 服务器 | 描述 | 安装 |
|---|---|---|
| ros-mcp-server (robotmcp) | 通过MCP的ROS/ROS2桥接 | GitHub |
| ros2-mcp-server (kakimochi) | 基于Python的ROS2 MCP集成 | Glama |
| roba-labs-mcp | ROS文档和学习资源 | Glama |
最佳实践
- 使用命名空间 - 为多机器人系统使用适当的命名空间组织节点
- 参数文件 - 将配置保存在YAML文件中,不要硬编码
- QoS匹配 - 确保发布者和订阅者使用兼容的QoS
- 生命周期节点 - 使用托管生命周期实现干净的启动/关闭
- 组合 - 使用组件容器实现高效的节点组合
- 测试 - 包含launch_testing进行集成测试
流程集成
此技能与以下流程集成:
robot-system-design.js- 具有ROS节点的系统架构robot-calibration.js- 校准节点开发gazebo-simulation-setup.js- ROS-Gazebo集成nav2-navigation-setup.js- 导航堆栈配置multi-robot-coordination.js- 多机器人ROS通信
输出格式
执行操作时,提供结构化输出:
{
"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": [
"添加节点实现",
"创建启动文件",
"使用colcon build构建"
]
}
错误处理
- 捕获ros2命令的完整错误输出
- 使用rosdep检查缺失的依赖项
- 验证DDS配置以解决通信问题
- 检查QoS兼容性以解决主题连接问题
- 验证package.xml和CMakeLists.txt语法
约束
- 操作前验证ROS2发行版
- 对所有命令使用已源化的工作空间
- 遵循包命名约定(snake_case)
- 遵循ROS2设计模式和最佳实践