5.3 KiB
5.3 KiB
21 · DDS 配置 + colcon overlay 完全指南
目标: 理解 ROS2 DDS 中间件配置、colcon overlay 混合工作空间,能为多机 / 跨网段部署做正确配置。
目录
- 1. DDS 是什么
- 2. RMW 实现
- 3. 关键环境变量
- 4. domain ID 隔离
- 5. 跨网段发现
- 6. Cyclone DDS 配置
- 7. colcon overlay
- 8. 三机部署实操
- 9. 推荐阅读
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。