第 1 章:为什么嵌入式工程师要学 ROS2?
1.1 从 STM32/FreeRTOS 到 ROS2:架构视角的对比
如果你已经熟悉 STM32 + FreeRTOS 的开发模式,那么理解 ROS2 的最佳方式不是把它当成一个全新的"操作系统"去学,而是把它看作一个运行在 Linux 上的、更高级的分布式任务调度与通信框架。
1.1.1 你熟悉的嵌入式世界
在 STM32/FreeRTOS 项目中,你的系统架构通常是这样的:
┌─────────────────────────────────────────┐
│ 用户应用层 (App) │
│ 电机控制 │ 传感器读取 │ 状态机逻辑 │
├─────────────────────────────────────────┤
│ FreeRTOS 内核层 │
│ 任务调度 │ 信号量/队列 │ 内存管理 │
├─────────────────────────────────────────┤
│ HAL/BSP 硬件抽象层 │
│ GPIO │ UART │ CAN │ TIM │ DMA │
├─────────────────────────────────────────┤
│ 硬件层 (STM32) │
└─────────────────────────────────────────┘
在这个世界里:
-
任务(Task) 是基本执行单元,通过
xTaskCreate()创建 -
通信 依赖队列(Queue)、信号量(Semaphore)或消息缓冲区
-
调度 由 FreeRTOS 内核管理,优先级抢占式
-
内存 通常静态分配,栈大小在编译期确定
-
实时性 是核心诉求,中断响应在微秒级
1.1.2 ROS2 的架构映射
ROS2 的架构可以看作是这个模型的"超集"和"分布式化":
┌─────────────────────────────────────────┐
│ 用户应用层 (ROS2 Nodes) │
│ 导航规划 │ 视觉识别 │ 路径跟踪 │
├─────────────────────────────────────────┤
│ ROS2 客户端库 (rclcpp/rclpy) │
│ 节点管理 │ 生命周期 │ 参数服务 │
├─────────────────────────────────────────┤
│ ROS2 中间件抽象层 (RMW) │
│ Fast DDS │ Cyclone DDS │ Zenoh │
├─────────────────────────────────────────┤
│ 底层通信协议 (DDS/RTPS) │
│ 发布-订阅 │ QoS策略 │ 动态发现 │
├─────────────────────────────────────────┤
│ 操作系统层 (Linux) │
└─────────────────────────────────────────┘
关键对比:
表格
| 维度 | STM32/FreeRTOS | ROS2 |
|---|---|---|
| 执行单元 | Task (单芯片内) | Node (可跨进程/跨主机) |
| 通信机制 | Queue/Semaphore (共享内存) | Topic/Service/Action (网络透明) |
| 调度方式 | 优先级抢占 (内核级) | Executor 轮询/回调 (用户态) |
| 内存管理 | 静态分配为主 | 动态分配为主,支持静态 |
| 实时性 | 硬实时 (μs级) | 软实时~准硬实时 (ms级) |
| 部署范围 | 单芯片 | 局域网多机/跨网段 |
| 发现机制 | 编译期绑定 | 动态发现 (DDS Discovery) |
核心洞察:FreeRTOS 解决的是"单芯片内多任务如何高效协作",ROS2 解决的是"多台计算机上的多个进程如何高效协作"。两者不是替代关系,而是互补的层级关系。
ROS2 引入了 DDS(Data Distribution Service)作为底层通信中间件,这是一个 OMG 标准化的发布-订阅协议,支持 QoS(Quality of Service)策略、动态节点发现和去中心化通信。与 FreeRTOS 的队列不同,DDS 的通信是网络透明的——你不需要关心数据是发给本机另一个进程,还是局域网内的另一台工控机。
1.1.3 为什么这种对比很重要?
很多嵌入式工程师初学 ROS2 时会感到困惑:"ROS2 能替代 FreeRTOS 吗?我能在 STM32 上跑 ROS2 吗?"
答案是:不能替代,但可以桥接。
-
STM32/FreeRTOS 仍然是你最可靠的实时执行层。电机 PID 控制、紧急制动、传感器中断采集——这些任务必须在微秒级响应,FreeRTOS 是最佳选择。
-
ROS2 是你更高层的"系统总线"。它负责把多个 STM32 节点、工控机、甚至云端算法串联成一个统一的机器人系统。
这正是 micro-ROS 存在的意义——它让 STM32 能够以 ROS2 节点的身份接入整个系统,而不是被排除在外。
1.2 ROS2 在机器人系统中的真实位置(上位机 vs 下位机)
在机器人领域,上位机和下位机是两个核心概念,理解它们的分工,就能理解 ROS2 的真实位置。
1.2.1 上下位机的经典分工
表格
| 层级 | 硬件典型 | 核心职责 | 时间尺度 |
|---|---|---|---|
| 上位机 | x86 工控机 / Jetson / 树莓派 | 全局规划、SLAM、AI 推理、人机交互 | 10ms ~ 1s |
| 通信层 | 以太网 / CAN / 串口 | 协议转换、数据路由、状态同步 | 1ms ~ 10ms |
| 下位机 | STM32 / DSP / FPGA | 电机驱动、传感器采集、安全监控 | 10μs ~ 1ms |
上位机是"大脑",负责思考;下位机是"小脑和脊髓",负责执行和反射。
1.2.2 ROS2 到底属于哪一层?
ROS2 主要运行在上位机层,但它通过 micro-ROS 向下位机层延伸。
一个典型的 ROS2 机器人系统架构如下:
plain
┌─────────────────────────────────────────────────────────────┐
│ 上位机 (x86/ARM Linux) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 导航节点 │ │ 视觉节点 │ │ 路径规划节点 │ │
│ │ (Nav2) │ │ (OpenCV/YOLO)│ │ (MoveIt/Planner) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ └────────────────┴────────────────────┘ │
│ ROS2 DDS 通信总线 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ micro-ROS Agent (运行在 Linux 上) │ │
│ └─────────────────────────┬─────────────────────────────┘ │
└────────────────────────────┼───────────────────────────────┘
│ 串口 / UDP / CAN
┌────────────────────────────┼───────────────────────────────┐
│ 下位机 (STM32 + FreeRTOS) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 电机控制 │ │ IMU 采集 │ │ 编码器读取 │ │
│ │ (PID+PWM) │ │ (SPI/I2C) │ │ (Timer Capture) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ micro-ROS Client │
└─────────────────────────────────────────────────────────────┘
关键点:
-
ROS2 本身不直接控制电机。它发布的是"目标速度"或"目标位置"这样的高层指令,由 STM32 上的 micro-ROS 客户端接收后,转换为 PWM 占空比或 CAN 报文。
-
STM32 通过 micro-ROS 成为 ROS2 生态的一等公民。你的 STM32 代码中会出现
rclc_publisher_init()和rclc_subscription_init()这样的 ROS2 API,而不是自己定义一套私有协议。 -
通信由 micro-ROS Agent 桥接。Agent 运行在上位机的 Linux 上,负责把 STM32 的 Micro-XRCE-DDS 协议转换为标准 DDS,让 STM32 节点能与其他 ROS2 节点无缝通信。
1.2.3 为什么这种分层比"全包"更合理?
有些工程师会问:"既然 Jetson 算力这么强,为什么不能把所有控制逻辑都放到上位机,下位机只做最简单的 IO?"
答案是:实时性边界。
-
Linux 是非实时操作系统。即使有 PREEMPT_RT 补丁,Linux 的调度抖动也在几十微秒到毫秒级,无法保证电机控制的确定性周期。
-
网络通信有不确定性。以太网或 WiFi 的延迟波动可能达到几十毫秒,这对于平衡车或机械臂的闭环控制是致命的。
-
安全隔离需求。紧急制动、过流保护等安全功能必须能在上位机死机时独立运行。
因此,保留 STM32/FreeRTOS 作为实时执行层,用 ROS2 作为系统总线,是当前最务实的架构选择。
1.3 ROS1 已死,为什么直接学 ROS2?
这是一个残酷但必须面对的事实:ROS1 已经全部到达生命终点(End of Life)。
1.3.1 ROS1 的终结时间线
表格
| 发行版 | 发布时间 | 终止支持时间 | 状态 |
|---|---|---|---|
| Kinetic Kame | 2016.05 | 2021.05 | ❌ 已终止 |
| Melodic Morenia | 2018.05 | 2023.04 | ❌ 已终止 |
| Noetic Ninjemys | 2020.05 | 2025.05 | ❌ 已终止 |
截至 2025 年 5 月,ROS1 的最后一个 LTS 版本 Noetic 已正式停止维护。这意味着:
-
不再有官方安全补丁
-
不再有新功能开发
-
社区支持迅速流失
-
新硬件驱动不再提供 ROS1 支持
"All ROS 1 distributions have reached end-of-life. You should use ROS 2." — endoflife.date
主流机器人厂商已全面转向 ROS2。例如 PAL Robotics 从 2026 年 4 月起正式停止对 ROS1 的软件支持,所有新功能和 bug 修复仅通过 ROS2 交付。
1.3.2 ROS2 相比 ROS1 的核心改进
如果你从未接触过 ROS1,这反而是好事——你可以直接建立正确的认知,而不需要"去 ROS1 化"。
表格
| 特性 | ROS1 | ROS2 | 对嵌入式工程师的意义 |
|---|---|---|---|
| 通信协议 | 自定义 TCPROS/UDPROS | 标准 DDS | 更可靠,有 QoS 保障 |
| 架构 | 中心化 (roscore) | 去中心化 | 无单点故障,节点可独立重启 |
| 实时性 | 无原生支持 | 原生支持实时 DDS + Executor | 可满足工业级时序要求 |
| 操作系统 | 仅限 Linux | Linux/Windows/macOS/RTOS | 可部署在更多平台 |
| 安全性 | 无内置安全 | DDS-Security (SROS2) | 支持认证、加密、访问控制 |
| 嵌入式支持 | rosserial (已弃用) | micro-ROS (官方维护) | STM32 可原生接入 |
| 多机器人 | 复杂 workaround | 原生支持 | 车队协同更简单 |
ROS2 的 RMW(ROS Middleware)抽象层允许你在不修改应用代码的情况下切换底层 DDS 实现(如 Fast DDS、Cyclone DDS、Zenoh),这为不同场景的性能优化提供了灵活性。
1.3.3 为什么不要"先学 ROS1 再过渡到 ROS2"?
很多教程会建议"先学 ROS1 打基础",但对嵌入式工程师来说,这是时间和认知的双重浪费:
-
概念不兼容:ROS1 的 Topic/Service 概念虽然与 ROS2 同名,但底层实现完全不同。ROS1 的
roscore中心化架构会让你形成错误的系统思维。 -
工具链断裂:ROS1 使用
catkin构建系统,ROS2 使用colcon;ROS1 使用roslaunch,ROS2 使用 Python/YAML 启动文件。很多工具不通用。 -
micro-ROS 只支持 ROS2:如果你最终目标是在 STM32 上部署,rosserial(ROS1 的嵌入式方案)已被官方放弃,micro-ROS 才是正途。
-
社区资源迁移:Stack Overflow、GitHub Issues、ROS Answers 上的活跃讨论已集中在 ROS2。ROS1 的问题 increasingly 无人回答。
结论:2026 年入坑机器人开发,直接学 ROS2 是唯一理性的选择。
1.4 学习目标:不是取代嵌入式,而是扩展能力边界
最后,我们需要澄清一个常见的误解:学 ROS2 不是为了让你放弃 STM32/FreeRTOS,而是为了让你能构建更完整的机器人系统。
1.4.1 嵌入式工程师的"能力天花板"
纯嵌入式开发的能力边界通常止于"单设备控制":
传感器读取 → 算法处理 → 执行器控制
↑___________________________↓
(单设备闭环)
但一个完整的机器人系统需要:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 激光雷达 │────→│ SLAM 建图 │────→│ 全局路径 │
│ (STM32驱动) │ │ (ROS2 Node) │ │ (ROS2 Node) │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
┌─────────────┐ ┌─────────────┐ │
│ 底盘控制 │←────│ 局部规划 │←───────────┘
│ (STM32+电机) │ │ (ROS2 Node) │
└─────────────┘ └─────────────┘
在这个系统中:
-
STM32 仍然负责最底层的硬件驱动和实时控制
-
ROS2 负责跨设备的通信、协调和高层算法
-
你需要两者都会,才能打通整个链路
1.4.2 学习 ROS2 能给你带来什么?
表格
| 能力维度 | 仅会嵌入式 | 会嵌入式 + ROS2 |
|---|---|---|
| 系统视野 | 单设备视角 | 全系统视角 |
| 调试手段 | 串口打印 / 示波器 | RViz 可视化 / rqt 工具链 / rosbag 录播 |
| 算法复用 | 自己从头写 | 直接调用 Nav2、MoveIt、Gazebo 等成熟包 |
| 协作开发 | 代码级对接 | 接口级对接(定义好 Topic 即可并行开发) |
| 仿真验证 | 硬件在环(成本高) | Gazebo/Isaac Sim 仿真(零硬件成本) |
| 职业边界 | 嵌入式工程师 | 机器人系统工程师 / 全栈机器人开发 |
1.4.3 本书的学习路径设计
本文面向已有 STM32/FreeRTOS 基础的工程师,采用"从已知到未知"的渐进路径:
本章小结
-
ROS2 不是嵌入式系统的替代品,而是其上层扩展。它解决了"多机分布式协作"的问题,与 FreeRTOS 的"单机实时调度"形成互补。
-
ROS2 主要运行在上位机,但通过 micro-ROS 可以延伸到 STM32 等下位机,实现统一的通信语义。
-
ROS1 已全面终止支持,2026 年直接学习 ROS2 是唯一合理的选择,避免在过时技术上浪费时间。
-
学习目标是扩展能力边界,让你从"能控制一个电机"进化到"能构建一个完整的机器人系统",而不是放弃已有的嵌入式技能。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)