ROS2 DDS模块有哪些
在ROS 2中,DDS(Data Distribution Service)作为底层通信中间件,其实现并非固定单一,而是通过RMW(ROS Middleware,ROS中间件抽象层) 实现了对多种DDS厂商的支持。这种设计允许用户根据需求(如实时性、资源占用、许可证等)灵活更换DDS实现,而无需修改上层应用代码。
一、ROS 2支持的DDS实现
ROS 2官方及社区支持多种主流DDS实现,以下是最常用的几种:
| DDS实现 | 开发商/维护者 | 特点 | 许可证类型 | ROS 2支持状态 |
|---|---|---|---|---|
| Fast DDS | eProsima | 轻量、高性能、实时性强,支持多种QoS策略,ROS 2默认DDS实现 | Apache 2.0 | 官方推荐,全版本支持 |
| Cyclone DDS | Eclipse Foundation | 低资源占用,适合嵌入式场景,对实时性和可靠性平衡较好 | Eclipse Public License | 官方支持,Foxy及以上版本默认可选 |
| RTI Connext DDS | RTI (Real-Time Innovations) | 工业级稳定性,丰富的企业级功能(如分布式发现、安全性),适合大型系统 | 商业许可(免费版有限制) | 官方支持,需单独安装 |
| GurumDDS | Gurum Networks | 轻量级,针对边缘计算优化,支持低延迟通信 | Apache 2.0 | 社区支持,部分ROS 2版本兼容 |
| OpenSplice DDS | ADLINK | 老牌DDS实现,支持分布式实时系统,曾是ROS 2早期版本默认实现 | LGPLv3 | 社区维护,部分新版本兼容性下降 |
二、是否可以更换DDS实现?
可以更换。
ROS 2通过rmw(ROS Middleware)层实现了对底层DDS的抽象:上层应用(节点、话题、服务等)通过统一的rmw接口与底层通信,而rmw接口可适配不同的DDS实现(每种DDS对应一个rmw_<dds_name>包,如rmw_fastrtps_cpp对应Fast DDS)。
这种设计的优势是:更换DDS时无需修改应用代码,只需安装目标DDS的rmw适配包并通过环境变量指定即可。
三、更换DDS实现的方法
更换DDS的核心步骤是:安装目标DDS及其rmw适配包 → 通过环境变量指定使用该DDS。
以下是针对主流ROS 2发行版(如Humble、Iron、Jazzy)的具体操作:
1. 前提:确认当前使用的DDS
在更换前,可先查看当前系统默认或正在使用的DDS实现:
# 方法1:通过ros2 doctor查看
ros2 doctor --report | grep "Middleware"
# 方法2:查看RMW_IMPLEMENTATION环境变量(若已设置)
echo $RMW_IMPLEMENTATION
默认情况下,ROS 2 Humble及之后版本通常使用Fast DDS(对应rmw_fastrtps_cpp)。
2. 更换为Cyclone DDS
Cyclone DDS以轻量和嵌入式友好著称,适合资源受限场景。
步骤:
-
安装Cyclone DDS及rmw适配包:
sudo apt update sudo apt install -y cyclonedds ros-<ros2-distro>-rmw-cyclonedds-cpp(将
<ros2-distro>替换为你的ROS 2版本,如humble、iron) -
设置环境变量指定使用Cyclone DDS:
# 临时生效(当前终端) export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp # 永久生效(添加到.bashrc或.zshrc) echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc source ~/.bashrc -
验证是否生效:
启动一个ROS 2节点(如ros2 run demo_nodes_cpp talker),再用ros2 doctor检查:ros2 doctor --report | grep "Middleware" # 若输出包含"rmw_cyclonedds_cpp",则更换成功
3. 更换为RTI Connext DDS
RTI Connext DDS适合工业级场景,提供更丰富的企业级功能,但需注意其许可证(免费版有节点数量限制)。
步骤:
-
安装RTI Connext DDS的ROS 2适配包:
sudo apt update sudo apt install -y ros-<ros2-distro>-rmw-connext-cpp(部分版本可能需要单独安装RTI Connext基础包,可从RTI官网下载)
-
设置环境变量指定使用RTI Connext:
# 临时生效 export RMW_IMPLEMENTATION=rmw_connext_cpp # 永久生效 echo "export RMW_IMPLEMENTATION=rmw_connext_cpp" >> ~/.bashrc source ~/.bashrc -
验证:
同上述方法,通过ros2 doctor确认Middleware为rmw_connext_cpp。
4. 更换为其他DDS(如GurumDDS)
GurumDDS等社区支持的DDS实现,步骤类似:
-
安装对应的
rmw包(可能需要从源码编译,因部分未进入官方apt仓库):# 以GurumDDS为例,从源码构建 mkdir -p ~/ros2_gurum/src cd ~/ros2_gurum vcs import src < https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos # 拉取ROS 2源码 git clone https://github.com/GurumNetworks/rmw_gurumdds.git src/rmw_gurumdds # 克隆GurumDDS的rmw适配包 colcon build --symlink-install # 编译 -
激活环境并指定DDS:
source install/setup.bash export RMW_IMPLEMENTATION=rmw_gurumdds_cpp
四、注意事项
- 版本兼容性:不同DDS实现对ROS 2发行版的支持可能有差异(如OpenSplice在新版本ROS 2中支持较弱),建议优先选择官方推荐的DDS(Fast DDS、Cyclone DDS)。
- 性能测试:更换DDS后,需测试系统性能(如延迟、吞吐量),因为不同DDS在不同场景下表现可能差异较大(如Cyclone DDS在嵌入式设备上更优,RTI Connext在大型分布式系统中更稳定)。
- QoS兼容性:部分DDS实现对QoS(服务质量)策略的支持可能有细微差别,更换后需验证QoS相关功能(如可靠性、持续性)是否正常工作。
总结
ROS 2通过RMW抽象层支持多种DDS实现,包括Fast DDS、Cyclone DDS、RTI Connext等,且更换方法简单:只需安装目标DDS的rmw适配包并设置RMW_IMPLEMENTATION环境变量。用户可根据系统需求(实时性、资源、许可证)灵活选择最合适的DDS实现。
更多推荐



所有评论(0)