CycloneDDS 与 ROS 2 通信中间件
概述
Summary
这页解释 ROS 2 为什么可以通过 RMW 层切换底层 DDS 实现,并记录 Actibot 项目选择 CycloneDDS 时需要关注的网络发现、配置文件和容器网络边界。
CycloneDDS 是 Eclipse 基金会维护的开源 DDS (Data Distribution Service) 实现,在 ROS 2 中作为可替换的通信中间件层 (RMW),负责节点间所有 topic、service、action 的底层数据传输。
DDS 在 ROS 2 中的角色
ROS 2 通过 RMW (ROS Middleware) 抽象层对接 DDS 实现,架构分层:
ROS 2 应用层 (rclpy / rclcpp)
↓
RMW 抽象层 (rmw_cyclonedds_cpp / rmw_fastrtps_cpp)
↓
DDS 实现 (CycloneDDS / Fast DDS / Connext)
↓
UDP/共享内存 传输
ROS 2 默认使用 Fast DDS (eProsima),但可通过环境变量切换:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cppCycloneDDS vs Fast DDS
| 特性 | CycloneDDS | Fast DDS |
|---|---|---|
| 维护方 | Eclipse 基金会 | eProsima |
| 发现机制 | 简单高效 | 功能更丰富 |
| 性能 | 低延迟,适合实时系统 | 通用场景表现好 |
| 配置复杂度 | 较简单 (XML) | 较复杂 |
| ROS 2 默认 | 否 (Jazzy 起为默认) | 是 (Humble 及之前) |
在 Actibot 项目中的使用
项目选用 CycloneDDS 替代默认 Fast DDS,配置方式:
- 环境变量在
tools/setup_local_env.sh中设置RMW_IMPLEMENTATION=rmw_cyclonedds_cpp - DDS 配置文件位于
tools/container/config/ - Docker 容器使用 host networking 模式,简化 DDS 发现
相关入口
- ROS 2:应用层通信模型与节点/话题概念。
- DDS 协议:底层发布订阅协议与发现机制。
- DevOps:部署和运行环境治理。
关键要点
- DDS 是 OMG 标准的发布-订阅中间件协议,ROS 2 依赖它实现分布式通信
- CycloneDDS 以低延迟和简单配置著称,适合机器人实时控制场景
- 切换 RMW 实现只需改环境变量,应用代码无需修改
- 多机通信时需确保 DDS 发现配置正确(同一 domain ID、网络可达)