2. ROS2基础回顾
多机器人协同调度的核心挑战在于:多台机器人之间需要实时共享位姿、路径、任务状态,同时还要处理动态加入或退出的节点,并保证通信的确定性。ROS2之所以能胜任这一场景,是因为它在架构层面将“机器人应用层”与“底层通信”彻底解耦——应用层提供标准化的编程范式(节点、话题、服务、动作、参数、生命周期),而底层则统一由DDS(数据分发服务)中间件承载。理解这一分层关系,是设计可靠多机系统的前提。下图展示了ROS2应用层与DDS通信层的映射关系,以及多机器人场景下各通信原语的分工。
2.1 核心通信原语:节点、话题、服务、动作
在多机器人系统中,通信原语的选择直接决定了系统的实时性、可靠性和开发复杂度。ROS2提供了四种主要通信方式,每种都有其特定的适用场景。
2.1.1 节点(Node)与话题(Topic)
节点是ROS2中可执行的计算单元,每个节点负责特定的功能(如导航、感知、底盘控制)。在多机器人系统中,每台机器人通常运行多个节点,且节点名称必须唯一。节点之间通过话题进行异步通信,话题采用发布/订阅模式,支持一对多、多对多通信。例如,机器人A的位姿话题 /robot_A/pose 可以被机器人B的避障节点订阅,实现位置共享。
话题通信的关键在于QoS(服务质量)设置。对于多机协同中的位姿、速度等高频数据,建议使用 SensorData 或 BestEffort 策略以保证低延迟;对于地图、路径等关键数据,则应使用 Reliable 策略确保不丢包。
2.1.2 服务(Service)与动作(Action)
服务是同步的请求-响应模式,适合短时间完成的交互,如“请求机器人B的当前状态”。但服务不适合长时间任务,因为客户端会阻塞等待。此时应使用动作——动作基于服务实现,但增加了任务进度反馈和取消机制。例如,多机协同中“命令机器人B移动到目标点”就是一个典型动作:客户端发送目标,服务端持续反馈执行进度,并允许客户端随时取消。
2.2 参数与生命周期节点
参数是节点的配置项,支持动态读取和修改。在多机器人系统中,参数常用于配置机器人ID、通信超时时间、最大速度等。ROS2参数系统支持运行时更新,但需注意线程安全性。
生命周期节点是ROS2的重要特性,它定义了节点的显式状态机:Unconfigured → Inactive → Active → Finalized。在多机器人系统中,生命周期节点非常实用:机器人启动后先进入 Inactive 状态,完成传感器自检、地图加载后再切换到 Active 状态,避免未就绪时被调度系统误调用。
| 通信原语 | 同步性 | 通信模式 | 多机场景典型用途 | QoS推荐 |
|---|---|---|---|---|
| 话题 | 异步 | 发布/订阅 | 位姿共享、地图广播、状态上报 | BestEffort + Volatile |
| 服务 | 同步 | 请求/响应 | 任务查询、参数读取、紧急停止 | Reliable + TransientLocal |
| 动作 | 异步+反馈 | 目标/反馈/结果 | 路径跟踪、搬运任务、充电对接 | Reliable + KeepLast(1) |
| 参数 | 同步 | 键值对 | 机器人ID、速度限制、网络配置 | Reliable |
2.3 DDS通信机制与多机部署要点
DDS是ROS2的默认中间件,它采用全局数据空间的概念,所有节点通过DDS域(Domain)进行通信。多机器人协同的关键在于正确配置DDS的发现机制和QoS策略。
2.3.1 DDS发现协议与多机网络
DDS使用简单发现协议(SPDP)自动发现网络中的参与者。但在多机器人场景中,默认的组播发现可能跨网段失败。此时需要配置发现服务器(Discovery Server)模式,将一台机器人或PC作为中心发现节点,其余机器人通过单播方式连接。例如,在工厂环境中,可以部署一台调度服务器作为Discovery Server,所有AGV机器人通过配置 ROS_DISCOVERY_SERVER 环境变量指向该服务器。
# 在调度服务器上启动发现服务
export ROS_DISCOVERY_SERVER=discovery_server.xml
# 在每台机器人上配置
export ROS_DISCOVERY_SERVER=192.168.1.100:11811
export ROS_DOMAIN_ID=42
2.3.2 QoS策略对多机协同的影响
QoS策略决定了消息的可靠性、历史深度和时效性。在多机器人系统中,最常见的错误是QoS不匹配导致通信静默失败。例如,发布者使用 Reliable,而订阅者使用 BestEffort,则订阅者可能收不到消息。建议在团队中制定统一的QoS配置文件,并封装为公共头文件。
Reliable。对于高频位姿话题,Reliable会导致网络拥塞和延迟增加;对于低频控制指令,BestEffort则可能丢失关键命令。必须根据数据特性分层设置QoS。
2.4 实战场景:三台机器人协同搬运的通信设计
假设一个仓储场景,三台AGV(A、B、C)需要协同搬运一个长托盘。调度系统需要实时获取三台AGV的位姿,并向它们发布速度指令。同时,AGV之间需要共享各自的负载状态。
通信设计如下:
- 位姿共享:每台AGV发布
/agv_{id}/pose(话题,QoS=BestEffort+Volatile,频率10Hz),调度系统订阅所有位姿话题。 - 速度指令:调度系统发布
/agv_{id}/cmd_vel(话题,QoS=Reliable+KeepLast(1)),确保每条指令都被执行。 - 任务分配:调度系统调用AGV的
/agv_{id}/navigate动作接口,下发目标点并监控执行进度。 - 负载状态:AGV通过服务
/agv_{id}/get_load_status响应调度系统的查询。 - 生命周期管理:每台AGV的导航节点使用生命周期节点,只有在
Active状态才接受动作请求。
排障过程:在联调初期,发现调度系统收不到AGV-B的位姿。通过 ros2 topic info /agv_B/pose -v 检查,发现发布者QoS为 Reliable,而订阅者设置为 BestEffort,导致不兼容。统一修改为 BestEffort 后通信恢复。
ros2 doctor 检查网络发现状态,再使用 ros2 topic list -t 确认话题类型匹配。QoS不匹配是ROS2多机开发中最隐蔽的坑。
2.5 总结与常见误区
本章回顾了ROS2的核心通信机制。在多机器人协同调度中,节点是功能单元,话题是数据管道,服务是同步交互,动作是任务执行,参数是配置中心,生命周期节点是状态保障,而DDS则是这一切的通信底座。理解它们之间的层次关系,是设计可靠多机系统的关键。
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 所有通信都用话题 | 无法处理请求-响应逻辑 | 短交互用服务,长任务用动作 |
| 忽略QoS匹配 | 通信静默失败,难以排查 | 统一QoS配置,使用ros2 doctor验证 |
| 多机使用相同节点名 | 节点冲突,发现异常 | 使用命名空间或机器人ID前缀 |
| 生命周期节点未使用 | 节点未就绪即被调用 | 导航、控制等关键节点使用生命周期管理 |