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

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.xdnf.cn/news/11068.html

相关文章:

  • 中和农信如何破解小微农户融资难题
  • 【笔记】用命令手动下载并安装 tokenizers 库.whl文件(Python 3.12+)
  • CppCon 2014 学习:Return values take a ”closure” walk
  • 笔记︱数据科学领域因果推断案例集锦(第三弹)
  • 电商仓储出入库操作指引
  • 在 Dify 项目中的 Celery:异步任务的实现与集成
  • LabelMe安装踩坑
  • 异常检测 VS 监督学习
  • 谷歌地图高清卫星地图软件(Google Earth)v6.0.3.2197 中文版 - 前端工具导航
  • CppCon 2014 学习: Less Code = More Software
  • 深度学习入门——基于多层感知机的MNIST手写数字识别
  • 四、关系数据库标准语言SQL_3
  • ollama的安装及加速下载技巧
  • 凯撒密码:古典密码学的奠基者与技术解析
  • 沟通频率不合适,如何找到平衡点
  • RM-R1:基于推理任务构建奖励模型
  • 第十四天 设计一个OTA升级AB测试方案
  • 【C++11】折叠引用和完美转发
  • Leetcode 1336. 每次访问的交易次数
  • 【C/C++】公共接口调用:aaa.so: undefined reference to `GetXXX‘
  • 实现购物车微信小程序
  • Seata的AT、TCC、Saga模式的区别及适用场景?
  • 如何轻松删除 Android 上的文件(3 种方法)
  • lanqiaoOJ 1508:N皇后问题 ← dfs
  • Linux进程间通信(IPC)
  • TypeScript 中的字面量类型(Literal Types)
  • 什么是 Docker Compose 的网络(network),为什么你需要它,它是怎么工作的
  • 词语翻译的三步法与背后的语言学思维
  • R²AIN SUITE AI知识库助力中国制造业数字化转型
  • ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”