0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FreeRTOS的micro(微型)ROS

strongerHuang 来源:Francesca Finocchiaro 作者:Francesca Finocchiaro 2020-09-25 14:16 次阅读

编辑整理: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具有最小的ROMRAM和处理开销。通常,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端口

原文标题:用于MCU,基于FreeRTOS的micro(轻量级)ROS

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17040

    浏览量

    350511
  • RTOS
    +关注

    关注

    22

    文章

    809

    浏览量

    119490
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16984

原文标题:用于MCU,基于FreeRTOS的micro(轻量级)ROS

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    三星布局Micro LED,未来动向引关注

    在全球新一代面板技术微型发光二极管(Micro LED)领域,中国台湾厂商占据领先地位。尽管韩国大厂三星目前尚未涉足Micro LED的生产,但已通过投资台湾厂商的方式确保货源稳定。然而,有分析指出
    的头像 发表于 11-04 14:26 394次阅读

    freertos最多支持多少个任务

    FreeRTOS是一个轻量级的实时操作系统(RTOS),其设计初衷就是为了提供简单、可靠且高效的实时任务管理。关于FreeRTOS最多支持多少个任务的问题,实际上并没有一个固定的上限,这主要取决于
    的头像 发表于 09-02 14:21 723次阅读

    freertos和rtos区别是什么

    FreeRTOS 和 RTOS(实时操作系统)是两个不同的概念,但它们之间有紧密的联系。FreeRTOS 是一个特定的开源实时操作系统,而 RTOS 是实时操作系统的一般概念。 概念定义 RTOS
    的头像 发表于 09-02 14:18 1011次阅读

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    SD启动卡插至评估板Micro SD卡槽。亦可通过SD升级卡或USB固化方式将系统固化至eMMC。 基于Python语言的通信演示 案例功能:基于Python语言,启动ROS节点发布与订阅消息,实现
    发表于 07-09 11:38

    如何在ROS中调用.so文件

    设备 笔者有一个需求,需要结合ROS做模拟量采集。有一种解决方法是ADC芯片+STM32主控,通过串口的方式与上位机通信,但串口通信速度很慢,达不到要求遂放弃。也考虑过使用NI的数据采集卡,貌似NI
    发表于 07-02 14:44

    AG32 下使用 freeRTOS 的参考

    的宏定义: 在 example.c 中新增几个函数: 在 main.c 中 init 后直接启动 freeRTOS: 然后,编译 ve 并烧录,再编译 code 并烧录,就可以看到 led 的闪烁了。 AG32下使用freeRTOS的参考.pdf 公司网站:www.
    发表于 05-28 13:34

    浅析FreeRTOS任务调度器的三种调度算法和应用

    FreeRTOS在MCU领域应用非常广泛,今天就给大家讲解一下FreeRTOS调度器中的三种调度算法,以及在瑞萨RZ/T2L MPU中的应用。
    的头像 发表于 05-10 14:02 7093次阅读
    浅析<b class='flag-5'>FreeRTOS</b>任务调度器的三种调度算法和应用

    用悟空派全志H3开发板做一个基于ROS系统的全向轮小车

    ,基于ROS系统通过键盘将速度指令下发到小车底盘上的STM32控制器。STM32负责驱动全向轮小车的运动,并将实时的速度数据反馈回ROS系统。 这种设计使得小车具备了高度的机动性和精准的运动控制。通过悟空
    发表于 05-06 11:15

    SLAMWARE ROS SDK的基础架构、部署方法和应用示例介绍

    ROS作为机器人行业应用最广泛的基础架构之一,是很多用户开发机器人应用的首选框架,如果要在基于ROS开发的系统中集成思岚科技的机器人底盘或者SLAMKit建图定位解决方案,有什么最便捷的方法呢?ROS SDK就是为此而生。
    的头像 发表于 03-21 10:44 857次阅读
    SLAMWARE <b class='flag-5'>ROS</b> SDK的基础架构、部署方法和应用示例介绍

    系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?

    请问一下,百度文库资料里面,下图所示的系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?与前面4GB版本的镜像有什么区别?
    发表于 03-01 23:06

    ROS系统的智能车开发-基于米尔芯驰MYD-JD9X开发板

    本篇测评由电子工程世界的优秀测评者“mameng”提供。本文将介绍基于米尔电子MYD-JD9X开发板的ROS系统智能车开发。目前实现ROS的方式主要有两种:Ubuntu系统+ROS;Ubuntu系统+docker+
    的头像 发表于 01-26 08:01 870次阅读
    <b class='flag-5'>ROS</b>系统的智能车开发-基于米尔芯驰MYD-JD9X开发板

    三星全球首款透明Micro LED显示屏震撼登场

    该透明Micro LED显示屏采用先进的微型芯片技术和制造工艺,消除了接缝和光线折射,为观众呈现清晰、流畅的视觉体验。
    的头像 发表于 01-09 17:12 1658次阅读

    移动机器人与ROS操作系统原理与应用

    ROS1不同的是,ROS2诞生的目的就是为了让更多机器人使用,所以在设计上更加符合技术的发展方向,也运用了很多最近的技术框架。
    发表于 01-02 12:28 555次阅读
    移动机器人与<b class='flag-5'>ROS</b>操作系统原理与应用

    FreeRTOS内存机制详解

    FreeRTOS是一种实时操作系统,它提供了多种内存分配方式,包括动态内存分配和静态内存分配。
    的头像 发表于 12-31 16:49 2587次阅读
    <b class='flag-5'>FreeRTOS</b>内存机制详解

    ros怎么设置环境变量

    设置ROS环境变量是使用ROS的重要步骤之一。本文将详细介绍如何设置ROS环境变量,包括什么是环境变量、为什么要设置ROS环境变量、如何设置ROS
    的头像 发表于 12-28 13:52 1989次阅读