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_cpp

CycloneDDS vs Fast DDS

特性CycloneDDSFast 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、网络可达)