Files
ROS2_learn/doc/21-overlay-dds.md
T

5.7 KiB
Raw Blame History

21 · DDS 配置 + colcon overlay 完全指南

目标: 理解 ROS2 DDS 中间件配置、colcon overlay 混合工作空间,能为多机 / 跨网段部署做正确配置。


目录


1. DDS 是什么

DDS (Data Distribution Service) = OMG 制定的实时通信中间件标准。 ROS2 默认用 DDS 做底层通信,不同 RMW 实现:

  • rmw_fastrtps_cpp(默认,Fast DDS)
  • rmw_cyclonedds_cpp(Cyclone DDS)

DDS 提供:

  • 自动节点发现(基于 UDP multicast)
  • 多种 QoS
  • 实时性(零拷贝、共享内存)

2. RMW 实现

RMW 适用
rmw_fastrtps_cpp ros-humble-rmw-fastrtts-cpp 通用,默认
rmw_cyclonedds_cpp ros-humble-rmw-cyclonedds-cpp 跨网段 / Xenomai 实时

切换:

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# 然后 colcon build + 启动节点

注意: 切换 RMW 后必须 rm -rf build/ install/ log/ 再 build,否则 CMake 配置缓存导致 link 错误。

3. 关键环境变量

变量 用途 默认
ROS_DOMAIN_ID DDS 域 ID(0-232) 0
RMW_IMPLEMENTATION RMW 实现 rmw_fastrtts_cpp
ROS_STATIC_PEERS 跨网段单播发现 <unset>
ROS_DISCOVERY_SERVER 集中式发现服务 <unset>
ROS_LOCALHOST_ONLY 仅本机 0
CYCLONE_DDS_URI Cyclone DDS XML 配置 URI <unset>
FASTRTPS_DEFAULT_PROFILES_FILE FastDDS XML 配置路径 <unset>

4. domain ID 隔离

ROS_DOMAIN_ID 才能互通,改 ID 就隔离:

# PC 端
ROS_DOMAIN_ID=42 ros2 launch my_pkg demo.py

# RK3506 端
ROS_DOMAIN_ID=42 ros2 launch my_pkg demo.py
# 两端可见

# 改 ID 后不可见
ROS_DOMAIN_ID=43 ros2 launch my_pkg demo.py

注意: 域 ID 范围 0-232(ROS2 DDS 协议)。

5. 跨网段发现

问题

UDP multicast 不跨路由器,跨网段(如 192.168.1.x ↔ 192.168.2.x)默认看不见。

方案 1: 单播发现 (ROS_STATIC_PEERS)

# PC 端(知道 RK3506 IP)
ROS_STATIC_PEERS="192.168.2.10;192.168.2.11" \
  ros2 launch my_pkg demo.py

方案 2: Discovery Server

# PC 端启 discovery server
ros2 run discovery_server discovery_server --address 0.0.0.0 --port 11811

# 客户端
export ROS_DISCOVERY_SERVER=192.168.2.10:11811
ros2 launch my_pkg demo.py

方案 3: Cyclone DDS LAN 配置

cyclonedds.xml:

<CycloneDDS>
  <NetworkInterface name="eth0" priority="default" multicast="default"/>
</CycloneDDS>

6. Cyclone DDS 配置

安装

sudo apt install ros-humble-rmw-cyclonedds-cpp

配置 XML

export CYCLONE_DDS_URI=file:///etc/cyclonedds.xml

/etc/cyclonedds.xml:

<?xml version="1.0" version="1.0"?>
<CycloneDDS xmlns="https://cdds.io/config">
  <Domain id="any">
    <General>
      <Interfaces>
        <NetworkInterface autodetermine="true" priority="default" multicast="default"/>
      </Interfaces>
    </General>
  </Domain>
</CycloneDDS>

7. colcon overlay

colcon overlay = 多个 colcon 工作空间叠加,后者覆盖前者(同名包优先用 overlay)。

工作流

# 主工作空间 base(完整)
mkdir -p ~/ros2_main_ws/src
cd ~/ros2_main_ws/src
git clone <完整仓库>  # 或 git pull
cd ..
colcon build --symlink-install  # build 全部

# overlay 工作空间(只 build 修改的包)
mkdir -p ~/ros2_overlay_ws/src
cd ~/ros2_overlay_ws/src
# 符号链接主工作空间的 src(只覆盖你想改的包)
ln -s ~/ros2_main_ws/src/my_pkg .
# 修改 my_pkg
cd ..
colcon build --symlink-install --packages-select my_pkg

# 激活:先 base 后 overlay
source ~/ros2_main_ws/install/setup.bash
source ~/ros2_overlay_ws/install/setup.bash  # 覆盖

典型场景

  • 稳定版 + 开发版:base 用稳定版,overlay 跑新代码
  • 共享代码 + 私有修改:base 装共享库,overlay 装你的定制
  • CI:base 装大型依赖,overlay 只 build 改的

8. 三机部署实操

典型拓扑:

PC (192.168.1.10, ROS_DOMAIN_ID=0)
   │
   ├─ RDK X5 (192.168.1.20, ROS_DOMAIN_ID=0)
   │
   └─ RK3506 × 2 (192.168.1.30, 192.168.1.31, ROS_DOMAIN_ID=0)

配置: 三机同 ROS_DOMAIN_ID + 同 LAN,FastDDS multicast 自动发现。

RK3506 精简: 用 ros-humble-ros-base,关 daemon:

# 装精简包
sudo apt install ros-humble-ros-base

# 关 daemon(省内存)
sudo systemctl disable --now ros2-daemon

# 设置环境变量(~/.bashrc)
export ROS_DOMAIN_ID=0
source /opt/ros/humble/setup.bash

详见 doc/100-embedded-deployment.md

9. 推荐阅读



📖 阅读路径导航

💡 这是仓库 doc/ 下所有文档的推荐阅读顺序。返回 README 总导航

本文预计阅读时间: 30 分钟 📍 当前位置: 第 13 / 24 篇