当前位置: 首页 > article >正文

MicroROS简述

文章目录

  • 前言
  • 1. 什么是MicroROS
  • 2. MicroROS的功能
    • 2.1 Micro-ROS 的核心作用:桥梁 + 翻译官
    • 2.2 为什么服务端(Agent)能知道设备端的消息和服务?
  • 3. MicroROS出现的背景
    • 3.1 机器人系统的“断层”问题
    • 3.2 物联网与边缘计算的兴起
    • 3.3 ROS 2的架构升级
    • 3.4 总结
  • 4. 参考资料


前言

最近在了解一些开源的桌面机器人项目,发现运动控制等做的比较好的大都上了ROS,我前面了解过ROS2的基础知识也在虚拟机上自己跑过。但是对于实际设备上如何使用怎么进行开发并不是很了解。然后我开始看鱼香ROS的《动手学ROS2》系列课程,去了解下实际设备上是如何将ROS2给使用起来的。

课程中使用的主控是ESP32,然后在ESP32上使用ROS,但是由于ESP32的资源有限,所以实际使用的是一个叫MicroROS的库进行开发的。对于什么是MicroROS起初我有点蒙,所以就想着学习一下,这里把学习到的内容整理出来和大家进行一下分享。

1. 什么是MicroROS

MicroROS 是专门为微控制器(MCU)优化的 ROS 2 轻量级版本。它为资源受限的嵌入式设备提供了 ROS 2 的功能支持,使这些设备能够无缝集成到更大的 ROS 2 系统中。

想象一下 ROS(Robot Operating System) 是一个庞大的、功能强大的“机器人城市”的通信和管理系统。它擅长处理复杂任务(比如地图构建、导航、AI决策),但通常运行在像笔记本电脑或树莓派这样算力较强、内存较大的“城市中央电脑”上。

Micro-ROS 就是为了解决一个问题而生的:让那些资源极其有限、但工作在机器人“第一线”的小型嵌入式设备(比如控制电机的单片机、读取传感器的小板子 ESP32/STM32)也能加入这个“机器人城市”的通信网络

2. MicroROS的功能

2.1 Micro-ROS 的核心作用:桥梁 + 翻译官

  1. 让“小设备”说“ROS话”:

    • 普通的单片机程序无法直接理解和使用 ROS 复杂的通信协议(DDS)。
    • Micro-ROS 为这些单片机提供了一个精简版的 ROS 客户端库。它体积很小(KB级别),可以在 ESP32、STM32 等单片机上运行(需要配合实时操作系统如 FreeRTOS)。
    • 有了这个库,单片机上的程序就能用类似 ROS 的方式:
      • 发布(Publish) 消息(比如传感器读数:温度、距离、电机转速)。
      • 订阅(Subscribe) 消息(比如接收运动指令:前进速度、转向角度)。
      • 调用服务(Service Call)提供应答(Service Response)(比如查询设备状态、发送一个配置命令)。
  2. 中间的“翻译官”(Agent):

    • 单片机直接和运行 ROS 的中央电脑通信还是有困难(协议不同、资源悬殊)。
    • Micro-ROS 引入了一个关键的中间角色:Agent(代理)
    • Agent 运行在中央电脑 (Linux/Windows) 上,是一个特殊的程序。
    • Agent 的作用:
      • 协议转换: 它理解单片机发来的“简化版ROS协议”(XRCE-DDS),并将其转换成标准ROS使用的“通用协议”(DDS),反之亦然。就像把方言翻译成普通话。
      • 连接管理: 负责建立和维护单片机与整个ROS网络之间的连接(通常通过串口、UDP、WiFi等)。
      • 动态发现: 最重要的一点! 当单片机上的 Micro-ROS 客户端启动,并声明它要发布/订阅某种类型的消息(比如sensor_msgs/msg/Temperature)时,它会把这些消息类型的描述信息发送给 Agent。
      • Agent 知道了什么: Agent 收到这些描述信息后,就清楚地知道
        • 这个单片机设备上有哪些节点在运行。
        • 这些节点发布了哪些主题(Topics),以及这些主题上传输的消息具体是什么类型、包含哪些数据字段
        • 这些节点订阅了哪些主题
        • 这些节点提供了哪些服务(Services)调用了哪些服务
      • 有了这些信息,Agent 就能:
        • 把单片机发布的消息,正确地转发给 ROS 网络中订阅了相同主题的其他节点。
        • 把 ROS 网络中其他节点发布的消息(单片机订阅的主题),正确地转发给单片机。
        • 把 ROS 网络中对服务的请求转发给单片机,并把单片机的响应转发回去。
设备端 (STM32) Micro-ROS Agent ROS 2节点 注册消息类型(如sensor_msgs/Imu) 确认注册成功 发布Imu数据(XRCE-DDS格式) 转换并转发Imu数据(ROS 2 DDS格式) 发送Twist速度指令 转换并下发指令 设备端 (STM32) Micro-ROS Agent ROS 2节点

2.2 为什么服务端(Agent)能知道设备端的消息和服务?

核心机制就是上面提到的 “动态发现 + 类型注册”

  1. 设备端(单片机)声明: 当单片机上的 Micro-ROS 程序启动时,它会主动告诉连接着的 Agent:“你好,我是节点/sensor_node,我会在主题/temperature上发布类型为 sensor_msgs/msg/Temperature 的消息,我还订阅了主题 /motor_cmd。”
  2. Agent 学习与注册: Agent 收到这些信息后,学习并记住了设备端的能力(发布什么、订阅什么、提供什么服务)。它会根据收到的描述信息,在 ROS 网络中动态地注册这些主题和服务,就好像它们是由 Agent 自己发布/订阅的一样。
  3. 无缝连接: 现在,ROS 网络中的其他节点(比如在中央电脑上运行的路径规划节点)如果订阅了 /temperature 主题,Agent 就会自动把单片机发来的 /temperature 消息转发给它。同样,如果某个节点(比如控制节点)向 /motor_cmd 主题发布指令,Agent 也会自动把这个指令转发给订阅了该主题的单片机节点。

简单说:设备端启动时会主动把自己的“通讯录”(包含发布、订阅、服务信息)交给 Agent 保管。Agent 有了这本通讯录,就能精准地知道设备端在收发什么消息,并负责在设备端和整个 ROS 网络之间准确无误地传递信息。

3. MicroROS出现的背景

MicroROS的出现源于机器人领域一个关键痛点:ROS 2虽强大,却无法直接在资源匮乏的微控制器(MCU)上运行。而像电机控制等对实时性要求高的外设一般都是使用MCU进行实时性控制,如果MCU不能直接参与到ROS2网络中,那么就需要借助转发(例如MCU通过串口和SOC进行通信,SOC作为ROS的代理),但是这样效率等势必会下降 ,总结起来主要有3个原因

3.1 机器人系统的“断层”问题

  • 高端处理器(如工控机/树莓派):
    运行ROS 2,处理复杂任务(SLAM、导航),但无法直接操控硬件(电机、传感器)。
  • 底层MCU(如STM32/ESP32):
    实时控制硬件,但算力/内存有限(KB级RAM),传统ROS 2(需MB级资源)根本无法移植。
  • 后果
    开发者被迫用串口/UART等原始方式连接两者,手动解析数据,开发效率低、易出错

3.2 物联网与边缘计算的兴起

  • 需求变化
    智能机器人、IoT设备需在传感器端实时处理数据(如滤波、紧急避障),而非全部上传云端。
  • 传统方案缺陷
    • 自定义通信协议 → 无法复用ROS生态(工具链、算法包)。
    • 用MQTT/CoAP等轻量协议 → 失去ROS的节点管理、服务调用等核心能力,缺乏灵活性

3.3 ROS 2的架构升级

  • ROS 1的局限
    中心化通信(Master节点)、弱实时性,不适合嵌入式场景
  • ROS 2的突破
    基于DDS通信协议,支持分布式、实时通信,为微控制器集成提供理论可能
    MicroROS应运而生,成为ROS 2在MCU端的“轻量化分身”。

3.4 总结

背景矛盾MicroROS的解决方案开发者收益
ROS 2无法在MCU运行极致轻量化客户端库 + Agent代理MCU直接使用ROS 2 API开发
硬件层与应用层通信效率低下动态消息注册 + 自动协议转换省去手动解析,数据直达ROS 2网络
边缘设备无法复用ROS生态兼容标准ROS 2消息/服务/工具链共享ROS算法包(如导航、控制)
实时性要求难以满足集成RTOS,支持硬实时任务调度电机控制、传感器采集低延迟响应

4. 参考资料

  1. DeepSeek
  2. 动手学ROS2-Humble
http://www.lryc.cn/news/2398196.html

相关文章:

  • LeetCode Hot100刷题——完全平方数
  • Axure-元件流程图
  • LangChain系列之LangChain4j集成Spring Bot
  • Python爬虫解析动态网页:从渲染到数据提取
  • LLMs之MCP:如何使用 Gradio 构建 MCP 服务器
  • VBA模拟进度条
  • MySQL强化关键_019_索引优化
  • 高性能MCU的MPU与Cache优化详解
  • 关于list集合排序的常见方法
  • 不动产登记区块链系统(Vue3 + Go + Gin + Hyperledger Fabric)
  • 从 GPT 的发展看大模型的演进
  • 基于大模型的短暂性脑缺血发作(TIA)全流程预测与诊疗辅助系统详细技术方案
  • JSCH使用SFTP详细教程
  • Trae CN IDE 中 PHP 开发的具体流程和配置指南
  • 【Qt】构建目录设置
  • 【仿生机器人】极具前瞻性的架构——认知-情感-记忆“三位一体的仿生机器人系统架构
  • Web后端快速入门(Maven)
  • 机器学习算法:逻辑回归
  • 企业展示型网站模板HTML5网站模板下载指南
  • ArrayList和LinkedList(深入源码加扩展)
  • Unity UI 性能优化--Sprite 篇
  • AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?
  • OpenCV C++ 学习笔记(五):颜色空间转换、数值类型转换、图像混合、图像缩放
  • 如何做接口测试?
  • 【JMeter】性能测试知识和工具
  • SOC-ESP32S3部分:25-HTTP请求
  • 字符编码全解析:ASCII、GBK、Unicode、UTF-8与ANSI
  • 《前端面试题:HTML5、CSS3、ES6新特性》
  • MaxCompute开发UDF和UDTF案例
  • 49套夏日小清新计划总结日系卡通ppt模板