在机器人 / 无人机 / 自动驾驶系统中,一个典型架构是:
- 上层:Linux SoC(运行 ROS2)
- 下层:MCU(实时控制)
比如:
- 飞控(MCU) + AI 计算(ROS2)
- MCU 控电机 + ROS2 做 SLAM
- MCU 采集传感器 + ROS2 做决策
但核心问题是:
❓ ROS2 的 rostopic,如何和 MCU 的 msg 打通?
传统方案:
- 串口协议 ❌
- 自定义协议 ❌
- MAVLink(偏遥测)⚠️
👉 都无法"原生兼容 ROS2"
🚀 解决方案:XRCE-DDS
XRCE-DDS 是专门为 MCU 设计的 DDS 轻量通信协议。
一句话理解:
让 MCU 也能"接入 ROS2 网络"
一、整体架构(核心图)
MCU
Linux SoC (ROS2)
UART / UDP / SPI
ROS2 Nodes
DDS Middleware
XRCE-DDS Agent
XRCE-DDS Client
MCU Application (Msg)
📌 解释:
- ROS2 使用 DDS 通信
- MCU 不跑 DDS,而是使用 XRCE Client
- Linux 侧通过 XRCE Agent 做桥接
二、rostopic 与 MCU msg 的本质关系
在 ROS2 中:
bash
ros2 topic list
常见:
text
/cmd_vel
/imu/data
/odom
而在 MCU 中:
c
typedef struct
{
float linear;
float angular;
} CmdVel;
👉 本质关系:
text
ROS2 Topic <-> MCU Msg
XRCE-DDS 做的事情:
✔ 自动序列化
✔ 自动类型映射
✔ 自动转发
三、数据流(最关键理解)
✅ MCU → ROS2
MCU Msg
XRCE Client
XRCE Agent
DDS
ROS2 Topic
👉 示例:
MCU 发布 IMU:
bash
ros2 topic echo /imu/data
即可看到数据。
✅ ROS2 → MCU
ROS2 Topic
DDS
XRCE Agent
XRCE Client
MCU Msg
👉 示例:
bash
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist
MCU 接收:
c
void cmd_vel_callback(CmdVel *msg)
{
motor_control(msg->linear, msg->angular);
}
四、通信时序图(高质量理解)
ROS2 Agent Client MCU ROS2 Agent Client MCU Publish Msg XRCE协议发送 DDS Publish Topic Publish XRCE数据 回调处理
五、工程实现步骤(实战)
1️⃣ 定义 IDL
idl
struct CmdVel
{
float linear;
float angular;
};
👉 生成:
- ROS2 msg
- MCU 序列化代码
2️⃣ MCU 发布数据
c
CmdVel msg;
msg.linear = 1.0;
msg.angular = 0.5;
uxr_write_topic(
&session,
stream,
publisher,
&msg,
sizeof(msg));
3️⃣ MCU 订阅数据
c
void topic_callback(const CmdVel *msg)
{
printf("linear=%f\n", msg->linear);
}
4️⃣ Linux 启动 Agent
bash
MicroXRCEAgent udp4 -p 8888
或串口:
bash
MicroXRCEAgent serial --dev /dev/ttyUSB0
5️⃣ ROS2 测试
bash
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist
ros2 topic echo /imu/data
六、典型应用场景(无人机/机器人)
MCU
Linux (ROS2)
数据
轨迹
路径
目标
SLAM
Navigation
AI Vision
Sensor
Control
Motor Driver
七、为什么 XRCE-DDS 是最优解?
| 方案 | 问题 |
|---|---|
| 串口协议 | 不通用 |
| 自定义协议 | 成本高 |
| MAVLink | 偏遥测 |
| XRCE-DDS | 原生 ROS2 |
优势:
- ✅ 原生 ROS2 兼容
- ✅ 发布订阅模型
- ✅ 自动序列化
- ✅ 支持多 Topic
- ✅ 易扩展
八、总结(核心记住这张图)
ROS2 Topic
DDS
XRCE Agent
Transport
XRCE Client
MCU Msg
🎯 最重要一句话
XRCE-DDS 本质就是:把 MCU 拉进 ROS2 网络
🚀 适用场景
- 飞控系统(PX4 / 自研)
- 机器人系统
- 自动驾驶
- MCU + Linux 异构 SoC