在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以轻量和嵌入式友好著称,适合资源受限场景。

步骤:

  1. 安装Cyclone DDS及rmw适配包:

    sudo apt update
    sudo apt install -y cyclonedds ros-<ros2-distro>-rmw-cyclonedds-cpp
    

    (将<ros2-distro>替换为你的ROS 2版本,如humbleiron

  2. 设置环境变量指定使用Cyclone DDS:

    # 临时生效(当前终端)
    export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
    
    # 永久生效(添加到.bashrc或.zshrc)
    echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc
    source ~/.bashrc
    
  3. 验证是否生效:
    启动一个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适合工业级场景,提供更丰富的企业级功能,但需注意其许可证(免费版有节点数量限制)。

步骤:

  1. 安装RTI Connext DDS的ROS 2适配包:

    sudo apt update
    sudo apt install -y ros-<ros2-distro>-rmw-connext-cpp
    

    (部分版本可能需要单独安装RTI Connext基础包,可从RTI官网下载)

  2. 设置环境变量指定使用RTI Connext:

    # 临时生效
    export RMW_IMPLEMENTATION=rmw_connext_cpp
    
    # 永久生效
    echo "export RMW_IMPLEMENTATION=rmw_connext_cpp" >> ~/.bashrc
    source ~/.bashrc
    
  3. 验证:
    同上述方法,通过ros2 doctor确认Middleware为rmw_connext_cpp

4. 更换为其他DDS(如GurumDDS)

GurumDDS等社区支持的DDS实现,步骤类似:

  1. 安装对应的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  # 编译
    
  2. 激活环境并指定DDS:

    source install/setup.bash
    export RMW_IMPLEMENTATION=rmw_gurumdds_cpp
    

四、注意事项

  1. 版本兼容性:不同DDS实现对ROS 2发行版的支持可能有差异(如OpenSplice在新版本ROS 2中支持较弱),建议优先选择官方推荐的DDS(Fast DDS、Cyclone DDS)。
  2. 性能测试:更换DDS后,需测试系统性能(如延迟、吞吐量),因为不同DDS在不同场景下表现可能差异较大(如Cyclone DDS在嵌入式设备上更优,RTI Connext在大型分布式系统中更稳定)。
  3. QoS兼容性:部分DDS实现对QoS(服务质量)策略的支持可能有细微差别,更换后需验证QoS相关功能(如可靠性、持续性)是否正常工作。

总结

ROS 2通过RMW抽象层支持多种DDS实现,包括Fast DDS、Cyclone DDS、RTI Connext等,且更换方法简单:只需安装目标DDS的rmw适配包并设置RMW_IMPLEMENTATION环境变量。用户可根据系统需求(实时性、资源、许可证)灵活选择最合适的DDS实现。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐