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                        │
└─────────────────────────────────────────────────────────────┘

关键点:

  1. ROS2 本身不直接控制电机。它发布的是"目标速度"或"目标位置"这样的高层指令,由 STM32 上的 micro-ROS 客户端接收后,转换为 PWM 占空比或 CAN 报文。

  2. STM32 通过 micro-ROS 成为 ROS2 生态的一等公民。你的 STM32 代码中会出现 rclc_publisher_init()rclc_subscription_init() 这样的 ROS2 API,而不是自己定义一套私有协议。

  3. 通信由 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 打基础",但对嵌入式工程师来说,这是时间和认知的双重浪费

  1. 概念不兼容:ROS1 的 Topic/Service 概念虽然与 ROS2 同名,但底层实现完全不同。ROS1 的 roscore 中心化架构会让你形成错误的系统思维。

  2. 工具链断裂:ROS1 使用 catkin 构建系统,ROS2 使用 colcon;ROS1 使用 roslaunch,ROS2 使用 Python/YAML 启动文件。很多工具不通用。

  3. micro-ROS 只支持 ROS2:如果你最终目标是在 STM32 上部署,rosserial(ROS1 的嵌入式方案)已被官方放弃,micro-ROS 才是正途。

  4. 社区资源迁移: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 基础的工程师,采用"从已知到未知"的渐进路径:


本章小结

  1. ROS2 不是嵌入式系统的替代品,而是其上层扩展。它解决了"多机分布式协作"的问题,与 FreeRTOS 的"单机实时调度"形成互补。

  2. ROS2 主要运行在上位机,但通过 micro-ROS 可以延伸到 STM32 等下位机,实现统一的通信语义。

  3. ROS1 已全面终止支持,2026 年直接学习 ROS2 是唯一合理的选择,避免在过时技术上浪费时间。

  4. 学习目标是扩展能力边界,让你从"能控制一个电机"进化到"能构建一个完整的机器人系统",而不是放弃已有的嵌入式技能。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐