ROS 2 + Zenoh 中间件
概念速览
- Zenoh:由 ZettaScale 设计的现代化 Pub/Sub / Query / Storage 协议
- 核心特性:低延迟 (μs 级)、低开销、断网容忍、去中心化
- 在 ROS 2 中:作为 RMW (ROS Middleware) 实现,逐步替代默认 DDS
为什么替换默认 DDS?
| 维度 | Cyclone DDS / Fast DDS | Zenoh |
|---|---|---|
| 延迟 | 中等 | 极低 (μs 级) |
| 带宽占用 | 高 (UDP 组播) | 低 (TCP/QUIC) |
| 跨广域网 | 差 | 优 (支持 NAT 穿透) |
| 异构端 | 强 (PC) | 强 (PC + MCU + 浏览器) |
| 部署复杂度 | 中 | 低 |
| 成熟度 | ROS 2 官方默认 | 1.x 稳定 (2024) |
安装
# ROS 2 Humble / Jazzysudo apt install ros-${ROS_DISTRO}-rmw-zenoh-cpp
# 配置使用 Zenoh 而非 DDSexport RMW_IMPLEMENTATION=rmw_zenoh_cpp架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ ROS 2 Node │ │ ROS 2 Node │ │ ROS 2 Node ││ (PC) │ │ (Jetson) │ │ (Browser) │└──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ Zenoh │ Zenoh │ WebSocket └────────┬──────────┴──────────┬──────────┘ ▼ ▼ ┌──────────┐ ┌──────────┐ │ Zenoh │◀───────▶│ Zenoh │ │ Router │ │ Peer │ └──────────┘ └──────────┘典型场景
- 跨广域网机器人:多机器人通过 4G/5G 互联,Zenoh 穿透 NAT
- Web 端可视化:浏览器作为 Zenoh peer 直接订阅话题
- MCU 直连:ESP32 / micro-ROS 节点直接走 Zenoh
📋 复现条件
| 类别 | 必备 | 可选 / 备注 |
|---|---|---|
| 硬件 | x86_64 PC × 2 (演示 router 模式) · 千兆网 | Raspberry Pi 5 (edge node) |
| 操作系统 | Ubuntu 24.04 (Jazzy) / 22.04 (Humble) | macOS / Docker |
| 软件版本 | ROS 2 Jazzy / Humble · zenoh-plugin-rmw 1.0+ · zenohd 1.0+ | zenoh-bridge-ros2-dds |
| 网络 | 千兆网 · 多机能 ping 通 | UDP multicast 通 (DDS 默认) |
| 时间 | 装 Zenoh rmw 15 min · 跑通 demo 30 min · 切 Zenoh 模式 15 min | 性能测试 +1 h |
| 难度 | ⭐⭐⭐ 进阶 | 配置 zenohd 路由表需要思考 |
| 前置知识 | ROS 2 基础 · DDS 概念 | 网络配置 |
⛔ 别这么做 (Anti-patterns)
经验证的坑 —— 跳过 = 至少浪费半天,严重的烧板 / 锁机。
| ❌ 错误做法 | 💥 后果 | ⚠️ 风险 | 范围 |
|---|---|---|---|
| 不要在 Ubuntu 22.04 上 apt 装 ROS 2 Iron / Rolling | apt 源是滚动版 = 兼容性没保证。ROS 2 永远装 LTS 版 (Humble / Jazzy)。 | 🟡 | ROS 2 |
不要直接 pip install 全局包做机器人项目 | 系统 Python 升级 = 依赖破。永远用 venv / uv venv / pixi。 | 🟡 | LeRobot / ACT / OpenVLA 训练 |
| 不要把机械臂 / 移动机器人直接接到 12V 铅酸电池 | 反接 / 短路 = 烧控制板。永远先串 5A 保险丝再接。 | 🔴 | SO-100 / Mobile ALOHA / 自制机器人 |
不要在没看 dmesg / lsusb 前插 USB 设备并假设会被识别 | 插上没反应 = 没供电 / 没权限 / 没驱动。先 lsusb -t,再 sudo chmod 666 /dev/ttyUSB0。 | 🟢 | USB 相机 / 串口 / 飞控 |
| 不要让 micro-ROS 节点在没看门狗的情况下跑在真机上 | 死循环 = 整机失控,永远给嵌入式节点加 heartbeat 看门狗。 | 🔴 | micro-ROS / 飞控固件 |
| 不要直接拿 GitHub main 分支跑 Mobile ALOHA / LeRobot 训练 | main = 正在开发,可能 dataset format 改了 = 跑不通。锁 git checkout v0.4.0 标签。 | 🟡 | Mobile ALOHA / LeRobot |
| 不要在 LeRobot 训练时把 4K 视频存进 dataset | 4K 1 小时 ≈ 50GB,30 小时 = 1.5TB IO 瓶颈。先 ffmpeg -vf scale=640:480 降采样。 | 🟢 | LeRobot / ACT 数据采集 |
| 不要用 ROS_DOMAIN_ID=0 跑多机协同 | 0 = 默认域 = 任何人都能收到你的话题。多机实验 = 改 ID (0-232) + Foxy+。 | 🟢 | ROS 2 DDS |
🚨 风险总览 (Risk Matrix)
| 风险等级 | 含义 | 例子 |
|---|---|---|
| 🟢 低 | 改错可回滚 / 几分钟恢复 | pip 全局装包、DHCP IP 写死 |
| 🟡 中 | 需要重新刷机 / 重装 / 1-2 小时恢复 | 装错 ROS 2 版本、没 OTA 升级看版本 |
| 🔴 高 | 不可逆 / 烧板 / 安全风险 | 电池反接、micro-ROS 没看门狗、刷机中途断电 |