micro-ROS 与嵌入式机器人
概念速览
- micro-ROS:ROS 2 在微控制器 (MCU) 上的官方实现
- 底层协议:DDS-XRCE (DDS for eXtremely Resource-Constrained Environments)
- 传输层:UDP / TCP / Serial / USB
- 支持平台:FreeRTOS、Zephyr、NuttX、ESP-IDF (实验)
架构
┌─────────────────────────────┐│ ROS 2 Network (PC) ││ ┌──────────────────────┐ ││ │ micro-ROS Agent │ │ ← ROS 2 包 / 话题桥接│ └──────────┬───────────┘ │└──────────────┼──────────────┘ │ UDP/Serial/USB ▼┌─────────────────────────────┐│ MCU Board ││ ┌──────────────────────┐ ││ │ micro-ROS Client │ │ ← FreeRTOS + micro-ROS│ │ (Publisher/Sub) │ ││ └──────────────────────┘ ││ STM32 / ESP32 / nRF52 │└─────────────────────────────┘核心约束
- 资源限制:ROM < 200 KB,RAM < 50 KB
- C99 标准库:部分 POSIX 不可用
- 零拷贝传输:使用 XRCE-DDS 二进制协议
支持的 MCU 与板卡
| 板卡 | MCU | RTOS | 备注 |
|---|---|---|---|
| Olimex STM32-E407 | STM32F407 | FreeRTOS | 官方参考 |
| Teensy 4.1 | iMXRT1062 | FreeRTOS | 高性能 ARM Cortex-M7 |
| ESP32-S3 | Xtensa LX7 | ESP-IDF | 实验支持 |
| Raspberry Pi Pico | RP2040 | FreeRTOS | 双核 M0+ |
| Nordic nRF5340 | Cortex-M33 | Zephyr | BLE 协同 |
典型应用
- 电机驱动板:STM32 + micro-ROS 节点订阅
/cmd_vel,直接输出 PWM - IMU 传感器:1000 Hz 高频发布 IMU 数据
- 机械臂关节:每个关节一个 MCU 节点,统一在 ROS 2 端做运动学解算
与 ROS 2 主机通信
# PC 端启动 micro-ROS Agentros2 run micro_ros_agent micro_ros_agent udp4 --port 8888
# MCU 端配置 UDP 连接到 8888📋 复现条件
| 类别 | 必备 | 可选 / 备注 |
|---|---|---|
| 硬件 | ESP32 / STM32F4 / Teensy 4.0+ · USB-TTL 串口 · micro-ROS Agent 主机 | WiFi 模式 (ESP32) |
| 操作系统 | Agent 端 Ubuntu 22.04+ / macOS | FreeRTOS / Zephyr 嵌入式 |
| 软件版本 | ROS 2 Humble / Jazzy · micro-ROS Agent v3.0+ · ESP-IDF 5.1+ | PlatformIO 替代 |
| 网络 | 串口 (USB) 或 WiFi (UDP) | Ethernet (STM32) |
| 时间 | ESP-IDF 装 30 min · micro-ROS 编译 10 min · 跑通 publisher 1 h | 多节点 +2 h |
| 难度 | ⭐⭐⭐⭐ 高 | 编译 / 链接容易踩坑 |
| 前置知识 | ROS 2 基础 · C/C++ · 嵌入式 | RTOS 概念 |
⛔ 别这么做 (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 没看门狗、刷机中途断电 |