文档
ROS 2 机器人开发指南
本章目标
掌握 ROS 2 在机器人项目中的核心概念和实践模式,走通从仿真到真机部署的完整流程。
1. DDS 基础
ROS 2 的核心通信层基于 DDS,这是与 ROS 1 最大的架构变化。
DDS 带来的好处
- 去中心化:无 Master 节点,每个节点平等
- 自动发现:节点加入网络后自动互相发现
- QoS 可配置:每个 Topic 独立策略
常用 DDS 实现
| 实现 | 供应商 | 适用场景 |
|---|---|---|
| Fast DDS | eProsima | ROS 2 默认,通用 |
| Cyclone DDS | Eclipse | 嵌入式 + 云端混合 |
| RTI Connext | RTI | 安全认证(需要许可证) |
2. ROS 2 核心概念图谱
工作空间 (workspace)
└── 包 (package)
├── 节点 (node) ← 最小执行单元
├── 话题 (topic) ← 发布/订阅通信
├── 服务 (service) ← 同步请求/响应
├── 动作 (action) ← 异步长任务
└── 参数 (parameter) ← 运行时配置
Launch 文件 → 批量启动节点 + 参数配置
URDF/Xacro → 机器人模型描述
TF2 → 坐标系变换
3. 典型机器人软件架构
感知层 (Perception)
├── /camera/image_raw (摄像头)
├── /lidar/scan (激光雷达)
└── /imu/data (IMU)
决策层 (Planning)
├── /local_planner (局部路径规划)
├── /global_planner (全局路径规划)
└── /behavior_tree (行为树)
控制层 (Control)
├── /cmd_vel (速度指令)
└── /motor_controller (电机驱动)
状态层 (State)
├── /odom (里程计)
└── /joint_states (关节状态)
4. Gazebo 仿真集成
<!-- launch/sim.launch.py 核心结构 -->
<launch>
<!-- 启动 Gazebo -->
<include file="$(find-pkg-share gazebo_ros)/launch/gazebo.launch.py"/>
<!-- 生成机器人模型 -->
<node pkg="gazebo_ros" exec="spawn_entity.py"
args="-entity my_robot -file $(find-pkg-share my_robot)/urdf/robot.urdf"/>
<!-- 启动控制器 -->
<node pkg="controller_manager" exec="ros2_control_node"/>
</launch>
5. 调试工具
# 查看系统拓扑
rqt_graph
# 查看话题数据
ros2 topic echo /cmd_vel
ros2 topic hz /scan # 话题频率
# 查看节点信息
ros2 node info /controller
# 录制与回放
ros2 bag record -a # 录制所有
ros2 bag play bag_name/ # 回放
# 参数操作
ros2 param list
ros2 param set /node param value
6. 真机部署注意事项
| 关注点 | 建议 |
|---|---|
| 网络 | 工控机 + 开发机同一子网,关闭防火墙 |
| 实时性 | 控制循环用 RT kernel 或 Xenomai |
| 启动 | systemd service 自动启动 ros2 launch |
| 日志 | ros2 run --log-level DEBUG 调试时 |
| 资源 | 用 htop 监控 CPU/内存,节点太多考虑合并 |
思考题
- 为什么 ROS 2 选择 DDS 而不是继续用 TCPROS?
- Action 的回调函数在哪个线程执行?
- 如何设计一个多机器人的 ROS 2 系统?