1. 课程导论

机器人操作系统(ROS,Robot Operating System)自诞生以来,已经深刻改变了机器人领域的软件研发模式。然而,随着工业机器人、自动驾驶、服务机器人对实时性、可靠性和资源约束的要求日益严苛,传统ROS1在跨平台通信、实时调度和嵌入式部署方面的短板逐渐暴露。ROS2作为新一代分布式机器人中间件,以DDS(Data Distribution Service)为通信基石,原生支持实时节点、多机协同和生命周期管理,为机器人从“实验室原型”走向“量产嵌入式系统”铺平了道路。本章作为全课程的导论,将首先厘清ROS2与嵌入式开发的内在联系,明确课程的学习目标与路径,并带领读者完成Ubuntu、ROS2及嵌入式工具链的环境搭建,为后续三十章的深入学习奠定坚实的认知与操作基础。

ROS2 与嵌入式开发融合架构图 机器人应用层(导航、机械臂控制、自动驾驶、感知融合) ROS2 节点 / 组件 / 生命周期管理 / 参数服务器 ROS2 中间件层(DDS/RTPS) 发布/订阅 · 服务/客户端 · 动作 · 实时QoS策略 · 发现机制 跨进程/跨设备通信 · 零拷贝传输 · 动态发现 嵌入式硬件抽象与驱动层 MCU/MPU 驱动 · RTOS 集成 · 硬件定时器 · 中断管理 微控制器抽象层(MCAL) · 外设驱动(I2C/SPI/UART/CAN) 实时执行器(Realtime Executor) · 硬件同步时钟 物理硬件层 ARM Cortex-M/A · RISC-V · FPGA · 传感器/执行器 · 电源管理 · 通信总线 实时性增强 资源约束适配 图1-1 ROS2与嵌入式系统分层协作关系(教学简化图)

1.1 ROS2与嵌入式开发的关系:从“软硬分离”到“协同设计”

核心原理:ROS2的实时性与嵌入式适配机制

传统ROS1的通信基于TCP/UDP,节点发现依赖中心化的Master,这导致两个致命问题:一是通信延迟不可控,无法满足电机控制、安全急停等硬实时需求;二是单点故障会导致整个系统瘫痪。ROS2则彻底重构了通信架构,采用DDS作为底层中间件。DDS是一种以数据为中心的发布/订阅协议,支持QoS(Quality of Service)策略,允许开发者对消息的可靠性、时效性、历史深度进行精细配置。例如,在关节伺服控制中,可将控制指令设置为“尽力传输+最短延迟”,而将传感器校准数据设置为“可靠传输+保留最近N帧”。

嵌入式开发的核心挑战在于资源受限(CPU频率、内存容量、功耗)和实时性要求。ROS2通过以下机制与嵌入式生态深度融合:

  • 微控制器支持(micro-ROS): 官方推出的micro-ROS将ROS2通信协议栈裁剪至可在Cortex-M系列MCU上运行,内存占用可低至几十KB,使得STM32、ESP32等低成本芯片直接成为ROS2节点。
  • 实时执行器(Realtime Executor): ROS2的Executor负责调度节点中的回调函数。标准Executor基于线程池,而实时Executor(如rclc)采用协作式调度或静态优先级调度,确保高优先级任务(如电机电流环)不被低优先级任务(如日志记录)阻塞。
  • 零拷贝传输: 在共享内存或特定硬件(如Intel TSN网卡)支持下,ROS2可避免数据在用户态与内核态之间的多次拷贝,降低延迟至微秒级。
  • 硬件抽象层(HAL): ROS2的驱动层通过HAL屏蔽不同MCU/MPU的寄存器差异,使上层算法可移植。例如,同一套导航算法既可在x86工控机上运行,也可在ARM Cortex-A72上运行。

关键认知:ROS2不是嵌入式操作系统的替代品,而是嵌入式系统与高级算法之间的“桥梁”。在典型的机器人架构中,底层电机控制、电流环、编码器读取由MCU上的RTOS(如FreeRTOS)完成,而路径规划、视觉处理、人机交互运行在Linux系统的ROS2节点中。两者通过CAN、UART或EtherCAT等总线连接,ROS2负责将MCU上报的状态封装为话题(Topic),并将上层决策指令下发为控制命令。

判断方法:如何确定一个嵌入式设备是否适合接入ROS2

在实际项目中,并非所有嵌入式设备都需要直接运行ROS2。工程师需要根据设备算力、内存和实时性需求做出架构决策。以下判断流程可供参考:

  1. 评估算力与内存: 若设备CPU主频低于200MHz、RAM小于512KB,则无法运行完整ROS2,应使用micro-ROS或将其作为纯执行器,通过串口/CAN与ROS2主控通信。
  2. 评估实时性要求: 若控制周期小于1ms(如无人机姿态控制),则必须将控制回路放在MCU的定时器中断中,ROS2仅负责参数调整和状态上报。
  3. 评估通信带宽: 若需要传输高分辨率图像或点云数据,建议使用ROS2的零拷贝机制或共享内存传输,避免序列化开销。
  4. 评估开发效率: 若团队以算法工程师为主,嵌入式经验薄弱,可优先选择带有ROS2官方支持包的开发板(如NVIDIA Jetson、Raspberry Pi 4B),将精力聚焦于上层算法。
设备类型 典型硬件 内存/算力 推荐接入方式
高算力主控 Jetson Orin、Intel NUC 8GB+ RAM,多核A78 完整ROS2 + 硬件加速
中端MPU Raspberry Pi 4、RK3588 2-8GB RAM,Cortex-A72 完整ROS2,可运行导航/视觉
高端MCU STM32H7、ESP32-S3 1MB RAM,Cortex-M7 micro-ROS(裁剪版)
低端MCU STM32F1、AVR 20KB RAM,Cortex-M3 不运行ROS2,作为执行器从站

案例拆解:四足机器人关节控制架构

以一款12自由度四足机器人为例,其关节模组采用“空心杯电机+行星减速器+双编码器”方案。初始设计时,团队试图将所有控制算法(包括摆动腿轨迹规划、力控、状态估计)全部运行在中央工控机的ROS2节点中,通过CAN总线以1kHz频率下发电流指令。实测发现,CAN总线在1kHz下传输12个关节的电流指令和位置反馈,占用带宽约60%,且由于工控机调度抖动,指令到达时间存在±0.5ms的随机延迟,导致机器人行走时出现明显震颤。

经过分析,团队将架构重构为两级控制:

  • 底层(MCU层): 每个关节模组内置STM32G4 MCU,运行FreeRTOS,以10kHz频率执行电流环和速度环,通过CANopen协议与主控通信。
  • 上层(ROS2层): 工控机运行ROS2,负责状态估计(卡尔曼滤波)、摆动腿轨迹生成和步态切换。ROS2节点通过CAN适配器与MCU交换数据,通信频率降至200Hz。

重构后,关节电流环延迟稳定在50μs以内,机器人行走平稳。此案例说明,ROS2与嵌入式开发的关系不是“二选一”,而是“各司其职”:ROS2擅长复杂算法、多传感器融合和模块化开发,嵌入式MCU擅长确定性实时控制。工程师必须根据控制周期和算力需求划分边界。

常见误区:初学者容易陷入“所有功能都用ROS2实现”的误区,在MCU上强行运行完整ROS2,导致内存溢出或控制周期抖动。正确的做法是:将实时性要求高的控制回路(如电流环、位置环)放在MCU中断中,将非实时性任务(如路径规划、日志)放在ROS2节点中。两者通过轻量级协议(如UART+CRC校验)通信。

1.2 课程目标与学习路径

核心原理:从“会用”到“会造”的进阶逻辑

本课程的目标不是教会读者机械地运行ROS2示例程序,而是培养“嵌入式+ROS2”的系统设计能力。具体而言,完成本课程后,学员应能够:

  • 独立搭建ROS2开发环境: 包括Ubuntu系统配置、ROS2发行版安装、DDS中间件选型(FastDDS、CycloneDDS等)。
  • 理解ROS2通信机制: 掌握话题、服务、动作、参数四种通信原语,并能根据场景选择合适的方式。
  • 编写嵌入式驱动节点: 能够为I2C传感器、SPI屏幕、UART GPS等外设编写ROS2驱动节点,实现数据采集与发布。
  • 实现MCU与ROS2的桥接: 掌握micro-ROS、串口桥接、CAN桥接三种主流方案,并理解各自的适用场景。
  • 进行实时性优化: 能够使用实时内核补丁(PREEMPT_RT)、CPU亲和性设置、内存锁定等手段降低ROS2节点延迟。
  • 完成一个综合项目: 例如基于STM32+ROS2的两轮差速机器人,实现SLAM建图与自主导航。

学习路径:分阶段递进式课程设计

本课程共30章,分为五个阶段,每个阶段都有明确的产出物和考核标准:

阶段 章节范围 核心主题 阶段产出
基础入门 第1-6章 ROS2核心概念、通信机制、开发环境 能运行并修改官方示例
嵌入式驱动 第7-14章 GPIO/I2C/SPI/UART驱动、传感器接入 编写3个以上外设驱动节点
桥接与实时 第15-22章 micro-ROS、CAN桥接、实时性优化 实现MCU与ROS2双向通信
系统集成 第23-27章 机器人建模、SLAM、导航、控制 完成差速机器人自主导航
进阶实战 第28-30章 多机协同、FPGA加速、产品化部署 完成一个创新项目

学习建议:每章学习后,建议在48小时内完成配套实验。ROS2是实践性极强的技术,仅阅读代码无法掌握调试技巧。例如,在学习话题通信时,应亲手用rqt_graph查看节点关系,用ros2 topic echo观察消息内容,用ros2 doctor排查网络问题。

案例拆解:一个典型的嵌入式ROS2项目开发流程

假设我们要开发一个农业巡检机器人,需要采集土壤温湿度、光照强度,并控制云台摄像头。项目开发流程如下:

  1. 需求分析: 确定传感器型号(如SHT30温湿度传感器、BH1750光照传感器),通信接口均为I2C。
  2. 硬件选型: 主控选用STM32MP157(双核Cortex-A7+Cortex-M4),A7核运行Linux+ROS2,M4核运行FreeRTOS负责实时采集。
  3. 驱动开发: 在M4核上编写I2C驱动,通过共享内存或Mailbox将数据传递给A7核。
  4. ROS2节点封装: 在A7核上编写sensor_node,将原始数据转换为sensor_msgs/msg/Temperature等标准消息。
  5. 上层应用: 编写monitor_node订阅传感器数据,当温度超过阈值时发布std_msgs/msg/String告警。
  6. 测试与部署: 使用ros2 bag record录制数据包,离线分析传感器噪声特性,调整滤波器参数。

此流程展示了从硬件到应用的全链路开发方法,本课程将逐步拆解每个环节的技术细节。

1.3 环境准备:Ubuntu、ROS2与嵌入式工具链

操作流程:Ubuntu系统安装与配置

ROS2官方支持Ubuntu LTS版本(当前推荐22.04 Jammy)。安装步骤如下:

  1. 下载镜像: 从Ubuntu官网下载22.04.3桌面版ISO,使用Rufus或balenaEtcher制作启动U盘。
  2. 安装系统: 建议为ROS2开发单独划分至少100GB磁盘空间,文件系统选择ext4。安装时勾选“安装第三方软件”以获取无线网卡驱动。
  3. 更换软件源: 编辑/etc/apt/sources.list,将archive.ubuntu.com替换为清华或阿里云镜像,加速软件包下载。
  4. 安装基础工具: 执行sudo apt update && sudo apt install -y git vim curl terminator。
  5. 配置用户权限: 将当前用户加入dialout组(sudo usermod -aG dialout $USER),以便访问串口设备。

操作流程:ROS2 Humble安装与验证

本课程选用ROS2 Humble Hawksbill(长期支持版,至2027年)。安装命令如下:

# 1. 设置编码
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8

# 2. 添加ROS2软件源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop python3-argcomplete -y

# 4. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 5. 验证安装
ros2 run demo_nodes_cpp talker

若终端持续输出Hello World: N,说明安装成功。此时可另开终端运行ros2 run demo_nodes_py listener,观察话题通信是否正常。

常见问题:若ros2命令提示找不到,请检查~/.bashrc中的source路径是否正确。若运行节点时出现Domain ID冲突,可通过export ROS_DOMAIN_ID=42设置独立域,避免与同一网络中的其他ROS2设备干扰。

操作流程:嵌入式工具链安装

嵌入式开发需要交叉编译工具链和烧录调试工具。本课程以STM32系列为主,同时兼顾ESP32。安装清单如下:

工具 用途 安装命令
arm-none-eabi-gcc 编译ARM Cortex-M裸机程序 sudo apt install gcc-arm-none-eabi
OpenOCD 通过ST-Link/J-Link烧录调试 sudo apt install openocd
STM32CubeMX 图形化配置引脚和时钟 从ST官网下载Linux版
ESP-IDF ESP32开发框架 git clone --recursive https://github.com/espressif/esp-idf.git
micro-ROS 在MCU上运行ROS2节点 docker pull microros/micro-ros-kinetic

安装完成后,建议编写一个简单的LED闪烁程序,验证工具链是否正常工作。以STM32F407为例,使用STM32CubeMX生成工程后,在main.c中添加:

HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);

编译并烧录后,若LED以1Hz频率闪烁,说明工具链配置成功。

案例拆解:搭建一个“ROS2+STM32”最小实验平台

为了验证环境准备是否完备,我们搭建一个最小系统:STM32F407通过串口与运行ROS2的PC连接,实现双向通信。具体步骤:

  1. 硬件连接: 使用USB-TTL模块连接STM32的USART1(PA9/PA10)与PC的USB口。
  2. MCU端程序: 在STM32CubeMX中配置USART1为异步模式,波特率115200,使能串口中断。在回调函数中将接收到的数据原样返回。
  3. PC端ROS2节点: 编写Python节点,使用pyserial库发送“Hello STM32”,并监听回包。
  4. 测试: 运行节点,观察串口助手和ROS2日志。

此实验验证了串口通信链路,为后续章节的micro-ROS桥接打下基础。若通信失败,优先检查波特率是否一致、串口号是否正确(ls /dev/ttyUSB*)、用户是否在dialout组中。

总结复盘:环境准备的关键要点

  • 版本匹配: ROS2 Humble仅支持Ubuntu 22.04,切勿在20.04上强行安装。
  • 网络问题: 若下载ROS2软件源超时,可尝试使用手机热点或配置代理。
  • 工具链一致性: 交叉编译工具链版本需与芯片型号匹配,例如Cortex-M4需使用arm-none-eabi-gcc,而Cortex-A7需使用gcc-arm-linux-gnueabihf。
  • 备份与快照: 建议在Ubuntu安装完成后,使用Timeshift创建系统快照,避免后续安装驱动导致系统崩溃。

本章核心收获:通过本章学习,读者应明确ROS2与嵌入式开发的分工协作关系,理解课程“从应用到驱动、从驱动到实时、从实时到系统”的递进路径,并完成开发环境的搭建。下一章将深入ROS2的通信机制,从话题(Topic)开始,逐步揭开ROS2高效协作的底层逻辑。