用于MCU,基于FreeRTOS的micro(轻量级)ROS

关注、星标公众,不错过精彩内容

编辑整理:strongerHuang

作者:Francesca Finocchiaro

关注我的读者中应该有部分是做ROS相关的工作,今天就来分享一个基于FreeRTOS的micro(微型)ROS。

一、关于ROS

ROS:Robot Operating System,,即机器人操作系统。

和普通OS不一样的是,ROS主要是针对机器人,是基于操作系统之上,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。ROS遵守BSD开源许可协议。

ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。

二、micro-ROS

本文说的micro-ROS,是基于ROS2进行优化的一套轻量级ROS系统,它提供了完全部署的ROS 2生态系统的大多数吸引人的工具和功能,并具有入式和低资源设备的卓越能力,可以运行在MCU硬件平台。

传统上,即使机器人包含许多ROS,ROS仍停留在微控制器边界。它们通常通过串行协议与旧版ROS中的ROS-serial之类的工具集成在一起。

在微控制器中拥有所有ROS2的功能和相同的API会不是很好吗?这正是micro-ROS提供的-机器人系统嵌入式部分内部的ROS开发生态系统。micro-ROS允许开发人员在硬件级别附近运行ROS 2节点。这使所有硬件外设都可用于该应用程序,从而使其能够直接与SPI或I²C等低级总线进行交互,以与传感器和执行器接口。

微型ROS是一组分层的库,它们可以直接重用ROS 2的库,也可以使其适应资源受限设备的功能和需求。具体来说,如果我们转向ROS 2体系结构,则由微型ROS维护的层是ROS客户端库(RCL)和ROS中间件接口(RMW)。同样,RCLCPP是RCL之上的C ++抽象层,即使大多数与RCL直接接口,它也可以被微型ROS应用程序组件使用。该层在RCLC中提供了相对于ROS 2的附加功能,RCLC是用C99编写的库,其中专门设计和开发了与RCLCPP提供的功能类似的功能,例如便利功能或执行程序,以适合微控制器。 

通常,ROS是基于 Linux系统之上的运行的一套系统,而本文这套微型ROS基于FreeROS运行。

这使micro-ROS在硬件和软件级别上都能与大多数嵌入式平台兼容。

但是,最终构成micro-ROS体系结构的是RMW实现,该实现基于称为Micro XRCE-DDS的中间件库。Micro XRCE-DDS是由对象管理组(OMG)定义和维护的DDS-XRCE(用于极端资源受限环境的DDS)协议的C / C ++实现。

顾名思义,DDS-XRCE是一种有线协议,允许引入以数据为中心的发布者-订阅者DDS模型进入嵌入式世界。DDS-XRCE依赖于客户端-服务器体系结构,其中客户端是用C99编写的轻量级实体,可在低资源设备中运行,而代理(C ++ 11应用程序)则充当客户端与DDS世界之间的桥梁。DDS-XRCE协议负责在这两个实体之间传递请求和消息。相应地,该代理能够通过标准DDS有线协议与DDS全局数据空间进行通信。在DDS世界中,代理通过与其他DDS参与者进行通信来代表客户。该通信由客户端代理,能够通过所有标准DDS实体与DDS进行交互的模拟DDS应用程序进行协调。代理将客户端的状态保存在其内存中,这样,即使代理断开连接,代理也可以存活。代理与客户端之间的通信遵循请求-响应模式,即双向并基于操作和响应。

三、为什么选择FreeRTOS?

由于它们的轻巧性,XRCE-DDS客户端库和microROS都易于在实时操作系统之上运行,这使它们能够满足其典型目标应用程序所提出的对时间要求严格的要求,其中涉及的任务包括要求时限或确定性响应。

具体来说,FreeRTOS已成为micro-ROS项目支持的首批RTOS之一,因此已集成到其软件堆栈中。这允许重用FreeRTOS社区和合作伙伴提供的所有工具和实现。由于微型ROS软件堆栈是模块化的,因此期望并期望交换软件实体。

FreeRTOS是开发micro ROS和Micro XRCE-DDS应用程序的理想选择。首先,它为许多不同的体系结构和开发工具提供了一个独立的解决方案,它以非常清晰和透明的方式编写,并且拥有非常庞大的用户群,从而确保了大量FreeRTOS用户将能够将其应用程序与微型ROS应用程序集成。而且,它是众所周知的高度可靠的RTOS。至关重要的是,FreeRTOS具有最小的ROM,RAM和处理开销。通常,RTOS内核二进制映像的大小在6K到12K字节之间。由于要与RTOS进行资源竞争,因此,当要最小化MCU上的微型ROS应用程序的内存占用量时,这些内存是理想的选择。

在下文中,我们将讨论FreeRTOS提供的几种功能,以及微型ROS如何利用它们来获利,以优化其堆栈中组成的不同库的所需功能。

四、任务和计划程序

FreeRTOS提供了一组最少的任务实体,这些实体与调度程序的使用一起,为在应用程序中实现确定性提供了必要的工具。微型ROS客户端库(RCL,RCLC和RCLCPP)访问RTOS的资源,以控制调度和电源管理机制,从而为开发人员提供了优化应用程序的可能性。

FreeRTOS提供的任务有两种:标准任务和空闲任务。前者由用户创建,可以视为RTOS上的应用程序。至关重要的是,将微型ROS应用程序集成到RTOS中作为具有给定优先级的此类任务之一。空闲任务另一方面,优先级较低的任务只有在没有其他任务在运行时才进入运行模式。由于microROS主要针对低功耗和IoT设备,因此这些空闲任务和相关的空闲挂钩非常适合在MCU中启用深度睡眠状态。由于将无状态XRCE-DDS客户端实现为micro-ROS中间件,因此这些深度睡眠状态可能是内存易失的,也就是说,由于面向连接的中间件有线协议,可以使用没有RAM持久性的深度睡眠模式。

使用FreeRTOS调度程序,micro-ROS能够管理其主要任务以及负责传输层的任务的优先级。通常,负责网络堆栈或串行接口的任务必须优先于micro-ROS应用程序。

五、内存管理

FreeRTOS提供的最令人期望的功能(对于微型ROS开发人员和用户而言非常有趣)是堆栈管理和静态堆栈创建能力。在处理micro-ROS的任务创建时,通常,堆栈分配是关键的设计决策。FreeRTOS允许进行细粒度的堆栈大小管理,这又使程序员可以知道在程序执行期间正在使用多少堆栈内存,或例如确定堆栈内存分配是否存在于静态或动态内存中,从而确定帮助正确使用MCU的内存,这是嵌入式系统中的宝贵资源。至关重要的是,可以为微ROS提供繁重的堆栈使用方任务,并为其分配静态分配的堆栈,从而防止将来出现堆和其他任务初始化问题。

在这方面,值得一提的是,这些内存管理工具为基准化微型ROS和XRCE-DDS的内存占用量提供了理想的框架。具体而言,已进行了彻底的堆栈消耗分析,以评估XRCE-DDS客户端内存消耗。堆栈是程序员在运行应用程序之前未知的内存块。为了对其进行度量,可以使用FreeRTOS uxTaskGetStackHighWaterMark()函数,该函数返回在执行过程中XRCE-DDS任务堆栈达到最大值时未使用的堆栈量。通过将此值减去总堆栈,可以得到XRCE-DDS应用程序使用的堆栈峰值。用这种方法获得的结果汇总在此处发布的报告中。

我们还注意到,由于FreeRTOS中使用了可插拔的动态内存管理方法,因此micro-ROS能够完成所需的用于管理内存的接口。通过这种方式,已经使用heap_4作为参考实现了诸如calloc()或realloc()之类的函数。这些功能在馈入micro-ROS内存管理API之前已被包装,以便分析动态内存消耗。

与静态内存情况类似,FreeRTOS的可交换动态内存管理方法使在嵌入式系统中执行动态内存配置文件分析特别容易。的确,尽管在其他RTOS中,动态(取消)分配功能隐藏在RTOS或标准库的深处,但在FreeRTOS中,它们暴露给用户并易于定制,因此简化了处理和控制动态内存使用的过程。

六、传输资源

与客户端支持库访问FreeRTOS的特定原语和功能(例如调度机制)的方式相同,中间件实现Micro XRCE-DDS要求访问RTOS的传输和时间资源以使其正常运行。关于IP传输,在FreeRTOS的特定情况下,Micro XRCE-DDS使用在此RTOS上实现lwIP的附件。lwIP(轻型IP)是为嵌入式系统设计的,广泛使用的开源TCP / IP堆栈,旨在减少资源使用,同时仍提供完整的TCP堆栈。这使得lwIP的使用特别适用于以micro-ROS为目标的嵌入式系统和资源受限的环境。

除了TCP / IP堆栈,lwIP还有其他几个重要部分,例如网络接口,操作系统仿真层,缓冲区和内存管理部分。操作系统仿真层和网络接口允许将网络堆栈移植到操作系统中,因为它提供了lwIP代码和操作系统内核之间的通用接口。

FreeRTOS与lwIP 的集成是从头开始设计的,具有标准且熟悉的接口(伯克利套接字),并且具有线程安全性,旨在使其尽可能易于使用。而且,它可以将缓冲区管理保留在可移植层中。

请注意,XRCE-DDS客户端还支持FreeRTOS + TCP网络堆栈。FreeRTOS + TCP是用于TCP / IP堆栈协议支持的官方FreeRTOS扩展库。

还努力使FreeRTOS + TCP与micro-ROS兼容。这包括对TCP和UDP连接的支持,它们依靠FreeRTOS + TCP API来实现micro XRCE-DDS Client API所要求的抽象层,以便能够使用这些协议与代理进行通信。

此外,还存在使用FreeRTOS的时间测量功能的可能性,从而使XRCE-DDS库能够执行基于时间的任务,从而使用户看不到实现。

七、Posix扩展

允许将FreeRTOS无缝和盈利地集成到micro-ROS中的另一个显着原因是POSIX扩展的可用性。便携式操作系统接口(POSIX)是IEEE计算机协会为维护操作系统之间的兼容性而指定的一系列标准。FreeRTOS Labs提供的FreeRTOS + POSIX层实现了POSIX API的子集。

确实,尽管micro-ROS中间件具有较低的POSIX依赖关系(只是clock_gettime()函数),但整个micro-ROS堆栈具有与功能和类型定义相关的更高依赖关系。另外,由于微型ROS项目的基本原理之一是移植或重用Linux(主要是POSIX兼容操作系统)中本机编码的ROS 2的代码,因此使用了某种程度上可与Linux兼容的RTOS。POSIX显然是有益的,因为代码的移植工作量很小。

为此,使用了sleep()和usleep()之类的函数。micro-ROS的POSIX类型定义依赖项依赖于FreeRTOS内核中未定义的某些结构,例如struct timeval或struct timespec。还需要诸如type.h,signal.h或unistd.h之类的文件来定义一些标准的类型定义和结构。

对于errno.h,尽管在FreeRTOS + POSIX层中未实现,但出于编译目的,micro-ROS必须包括一些不可用的定义。

通过使用FreeRTOS + FAT库,应在micro-ROS堆栈中重构这些定义,以使FreeRTOS + POSIX具有完全的兼容性。这样,可以完全支持依赖文件系统支持的高级micro-ROS功能,例如日志记录机制。

八、教程

如何在FreeRTOS上使用Olimex STM32-E407评估板创建和运行第一个微型ROS应用程序:

https://micro-ros.github.io/docs/tutorials/core/first_application_rtos/freertos/

(公号不支持外部链接,请复制链接到浏览器打开)

九、最后

总而言之,FreeRTOS提供了运行Micro-ROS应用程序的轻量且理想的RTOS,因为它提供了广泛的所需功能,实际上构成Micro-ROS堆栈的所有模块化层都在不同级别上使用了这些功能。

随着micro-ROS和FreeRTOS的用户群迅速扩展并且引人注目的用例激增,预计在不久的将来,micro-ROS与FreeRTOS和FreeRTOS + 提供的库进一步集成。

其中,对FreeRTOS + FAT库的利用显得尤为可取,以便添加一个虚拟文件系统组件,该组件允许像在完全部署的ROS 2生态系统中一样可视化和管理日志记录操作。

还设想了专用部分中所述的内存管理工具的进一步利用,以扩展XRCE-DDS客户端的内存配置文件,从而为micro-ROS客户端提供类似的分析。

micro-ROS项目计划的另一个未来行动是采用FreeRTOS的认证版本SafeRTOS。

最后但并非最不重要的一点是,似乎值得一提的是FreeRTOS与micro-ROS典型目标应用相关的硬件集成的两个非常成功的案例,即功能强大的Crazyflie 2.1无人机和ESP32 MCU的硬件。实际上,Crazyflie软件可以利用FreeRTOS的几种工具和功能来获利。微ROS应用与FreeRTOS的有关此MAV工作的演示的例子可以理解这里。至于与FreeRTOS本机集成并提供现成的Wi-Fi天线和蓝牙功能的第二种硬件,则已经在该系统上进行了最新的micro ROS端口。

更多内容,请参看:

https://micro-ros.github.io/

推荐阅读:

国产物联网操作系统有哪些,谁主沉浮?

标准C库导致缓冲区溢出,如何避免?

ARM 编译工具keil 和 IAR 命令行编译和下载

关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。

长按前往图中包含的公众号关注

<think>好的,用户之前问过关于如何在一个月内通过提升51单片机、STM32和FPGA技能来找到大创老师并确定国家级项目方向的问题,我给出了详细的学习规划和项目建议。现在用户的新问题是询问树莓派的情况,需要我进行介绍。 首先,我需要分析用户的需求。用户可能对树莓派不太了解,或者想了解树莓派是否适合他们的大创项目。用户目前已经接触过单片机,可能想扩展学习其他硬件平台。树莓派作为单板计算机,和单片机有很大不同,所以需要重点说明两者的区别以及树莓派的优势。 接下来,我要考虑用户所处的阶段。他们已经初步学习51单片机,正在寻求进阶方向,可能对更复杂的系统感兴趣。树莓派运行Linux系统,适合需要操作系统支持的项目,比如物联网、人工智能或多媒体处理。用户可能想了解树莓派能否补充他们的现有技能,或者是否值得投入时间学习。 然后,需要确定回答的结构。应该包括树莓派的基本介绍、与单片机的区别、适合的应用场景、学习路径、项目案例以及与现有技术栈的结合建议。这样用户能全面了解树莓派,并判断是否符合他们的需求。 还要注意用户的时间限制,他们需要在短时间内确定大创方向,所以需要强调树莓派在快速原型开发方面的优势,以及如何结合之前学的STM32或FPGA来提升项目复杂度。例如,可以用树莓派做上层控制,STM32做实时控制,FPGA处理高速信号,这样的组合项目更有竞争力。 另外,用户可能关心如何将树莓派应用到实际项目中,所以需要提供具体的项目示例,比如智能家居中控、图像识别系统等,并说明技术要点和创新点。同时,要提醒用户树莓派的局限性,比如实时性不如单片机,帮助他们在选择技术时做出权衡。 最后,要确保回答符合之前的格式要求,使用清晰的结构、分点说明,并包含必要的LaTeX公式和项目表格。同时,语言要简洁明了,帮助用户快速抓住重点,为与导师沟通和项目选题做好准备。</think>--- ### **一、树莓派核心定位与技术特性** #### **1. 与单片机技术对比** | 特性 | 树莓派(计算机级) | 51/STM32(微控制器) | |--------------------|----------------------------|----------------------------| | **架构** | ARM Cortex-A系列(多核CPU) | ARM Cortex-M系列(单核MCU) | | **操作系统** | 完整Linux系统(Raspbian) | 无/实时操作系统FreeRTOS) | | **开发模式** | 应用层编程(Python/C++) | 寄存器/库函数级开发 | | **典型功耗** | 3W-7W(需主动散热) | 0.1W-1W(低功耗模式) | | **实时性** | 微秒级延迟(需内核补丁) | 纳秒级响应 | **公式说明**: 树莓派GPIO控制延时主要由操作系统调度决定: $$ t_{delay} = t_{syscall} + t_{context\ switch} + t_{GPIO\ toggle} $$ 典型值约10-100μs,远高于STM32的GPIO翻转速度(<50ns) --- ### **二、大创项目适配场景分析** #### **1. 核心优势领域** - **人工智能边缘计算** - 运行TensorFlow Lite(MobileNetV3推理速度>15fps) - 支持OpenCV实时图像处理(1080p@30fps) - **物联网网关** - 多协议转换(MQTT/CoAP/LoRaWAN) - 数据缓存与预处理(SQLite本地存储) - **多媒体系统** - 4K视频解码(H.265硬解) - 音频处理(FFT频谱分析) #### **2. 典型性能指标** | 项目 | 树莓派4B | STM32H743 | |-----------------------|-------------------------|-------------------------| | **CPU频率** | 1.5GHz(四核Cortex-A72)| 480MHz(单核Cortex-M7) | | **内存容量** | 1GB-8GB LPDDR4 | 1MB SRAM | | **网络接口** | 千兆以太网+双频WiFi | 10/100M以太网(需外扩) | | **视频输出** | 双Micro HDMI | 无 | --- ### **三、快速上手学习路径** #### **1. 关键技能矩阵(7天速成)** ```plaintext Day 1-2: Linux系统操作 ├─ Shell命令实践 ├─ SSH远程登录配置 └─ GPIO基础控制(点亮LED) Day 3-4: 外设接口开发 ├─ I2C驱动OLED屏幕 ├─ SPI读取温湿度传感器 └─ UART与单片机通信 Day 5-6: 高级应用开发 ├─ OpenCV人脸检测(Haar级联分类器) ├─ Flask搭建Web控制界面 └─ MQTT物联网通信 Day 7: 项目集成 └─ 构建完整物联网终端(传感器+云端+APP) ``` --- ### **四、大创级项目设计建议** #### **1. 创新项目案例** | 项目类型 | 技术栈组合 | 关键指标 | |----------------------|-------------------------|---------------------------------| | **智慧农业监测** | 树莓派+STM32+LoRa | 10节点组网,图像虫害识别准确率>85% | | **工业质检系统** | 树莓派+FPGA+千兆网 | 缺陷检测速度200件/分钟 | | **智能轮椅控制** | 树莓派+Arduino+雷达 | 自主避障响应时间<200ms | #### **2. 深度学习项目示例** **基于YOLOv5的安防监控系统** - 使用NCNN框架优化模型 - 量化后模型尺寸<5MB - 检测帧率: $$ FPS = \frac{1}{t_{preprocess} + t_{inference} + t_{postprocess}} $$ 可达8-12fps(640×480分辨率) --- ### **五、与现有技术栈的协同** #### **1. 混合架构设计方案** ```mermaid graph LR A[树莓派] -->|USB/以太网| B[STM32] A -->|PCIe| C[FPGA] B -->|CAN总线| D[执行机构] C -->|高速AD| E[传感器阵列] ``` **典型工作流程**: 1. 树莓派运行决策算法(路径规划、图像识别) 2. STM32负责实时控制(PID电机驱动) 3. FPGA处理高速信号(超声波阵列信号处理) #### **2. 性能互补优势** - **计算密集型任务**:树莓派运行OpenCV图像处理($$卷积运算O(n^2)$$) - **实时控制**:STM32精确生成PWM波形(频率误差<0.1%) - **并行处理**:FPGA实现FFT加速(比软件实现快100倍) --- ### **六、常见误区与避坑指南** #### **1. 技术选型陷阱** - **误区**:用树莓派做纯控制类项目 **问题**:GPIO稳定性不如单片机,易受系统调度影响 **解决方案**:关键控制交由STM32,树莓派仅做决策 - **误区**:直接部署未经优化的AI模型 **问题**:默认TensorFlow模型占用内存过大 **优化方案**:使用ONNX Runtime+模型量化 #### **2. 稳定性提升技巧** - 电源管理:使用官方电源(5V/3A)并增加π滤波器 - 系统加固:禁用图形界面(节省200MB内存) - 看门狗配置:硬件看门狗模块(如MAX6374) --- ### **七、大创竞争力提升策略** #### **1. 特色技术组合** - **AIoT方向**:树莓派(云端训练)+FPGA(模型推理加速) - **机器人方向**:ROS(机器人操作系统)+STM32(运动控制) - **工业4.0方向**:OPC UA协议+Modbus TCP转换网关 #### **2. 文档亮点构建** - 提供完整的Docker部署方案 - 实现自动化测试框架(Python unittest) - 绘制实时数据看板(Grafana+InfluxDB) --- **最新趋势**:2023年全国电子设计竞赛中,**58%的获奖作品采用树莓派作为主控**,主要集中在人工智能、机器视觉方向。建议重点突破模型轻量化部署技术(如TinyML),可显著提升项目竞争力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongerHuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值