feat(level1): ROS2 完全体 12 包 / 80 测试 / 23 文档 / 工程化 / Docker 分组

This commit is contained in:
xs
2026-08-04 10:19:47 +08:00
parent 5ef38ab508
commit 549d6b337e
141 changed files with 8949 additions and 1594 deletions
+214
View File
@@ -0,0 +1,214 @@
# 21 · DDS 配置 + colcon overlay 完全指南
> **目标**: 理解 ROS2 DDS 中间件配置、colcon overlay 混合工作空间,能为多机 / 跨网段部署做正确配置。
---
## 目录
- [1. DDS 是什么](#1-dds-是什么)
- [2. RMW 实现](#2-rmw-实现)
- [3. 关键环境变量](#3-关键环境变量)
- [4. domain ID 隔离](#4-domain-id-隔离)
- [5. 跨网段发现](#5-跨网段发现)
- [6. Cyclone DDS 配置](#6-cyclone-dds-配置)
- [7. colcon overlay](#7-colcon-overlay)
- [8. 三机部署实操](#8-三机部署实操)
- [9. 推荐阅读](#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 实时 |
切换:
```bash
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 就隔离:
```bash
# 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`)
```bash
# PC 端(知道 RK3506 IP)
ROS_STATIC_PEERS="192.168.2.10;192.168.2.11" \
ros2 launch my_pkg demo.py
```
### 方案 2: Discovery Server
```bash
# 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`:
```xml
<CycloneDDS>
<NetworkInterface name="eth0" priority="default" multicast="default"/>
</CycloneDDS>
```
## 6. Cyclone DDS 配置
### 安装
```bash
sudo apt install ros-humble-rmw-cyclonedds-cpp
```
### 配置 XML
```bash
export CYCLONE_DDS_URI=file:///etc/cyclonedds.xml
```
`/etc/cyclonedds.xml`:
```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)。
### 工作流
```bash
# 主工作空间 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:
```bash
# 装精简包
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`](100-embedded-deployment.md)。
## 9. 推荐阅读
- [ROS2 DDS 概念](https://docs.ros.org/en/humble/Concepts/About-DDS-Implementations.html)
- [FastDDS 文档](https://fast-dds.docs.eprosima.com/)
- [Cyclone DDS 文档](https://cyclonedds.io/docs/)
- [colcon 文档](https://colcon.readthedocs.io/)
- [REP-2002 ROS 2 Design](https://www.ros.org/reps/rep-2002.html)
- [`py_overlay_dds` 包](../src/py_overlay_dds/README.md)
- [三机部署实操](100-embedded-deployment.md)