下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

FreeRTOS 上的 micro-ROS

作者: Francesca Finocchiaro (eProsima) 、 Pablo Garrido-Sanchez (eProsima) 、 José Antonio Moral Parras (eProsima)

引言

机器人操作系统 (ROS) 是用于机器人应用程序开发的开源软件框架。ROS 2 是第二代 ROS,其设计采用分层架构,将 ROS 客户端层( RCL和RCLCPP/RCLCPY )与ROS中间件层( RMW )分开。客户端层提供开发人员接口,而 RMW 实现了与不同的可互换低级通信协议的兼容性。RMW 基于数据分布服务 (DDS) ,这是为安全关键系统设计的实时发布/订阅协议。分层方法使得开发人员可以专注于应用,而不是底层细节。 Foxy Fitzroy 是撰写本文时 ROS 2的最新版本。

micro-ROS ROS 2 的更新版,这是一个机器人操作系统,提供全面部署的 ROS 2 生态系统的大部分有吸引力的工具和功能,并具有适应嵌入式和低资源设备的卓越能力。传统上,即使机器人包含许多 ROS,ROS 仍停留在微控制器边界。它们通常通过串行协议与旧的 ROS 版本中的 ROS-serial 等工具集成。

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

micro-ROS 是一组分层库,可直接重复使用 ROS 2 的库,或者可以根据资源受限设备的功能和需求进行调整。具体而言,如果我们转到 ROS 2 架构,则由 micro-ROS维护的层是 ROS 客户端库 (RCL) 和 ROS 中间件接口 (RMW)。此外, RCLCPP 是 RCL 顶部的 C++ 抽象层,可以由 micro-ROS应用组件使用,即使大多数组件直接与 RCL 直接接口。此层提供与 RCLC 中的 ROS 2 的功能相关的附加功能,所述 RCLC 是以 C99 编写的库 ,其中类似于由 RCLCPP 提供的功能的特征,诸如便利函数或执行器,专门设计与开发成以适合于微控制器。

这使得 micro-ROS在硬件和软件层面能与大多数嵌入式平台兼容。

然而,最终塑造 micro-ROS架构的是基于称为 MICRO XRCE-DDS 的中间件库的 RMW 实现。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 客户端库和 micro-ROS都易于在实时操作系统上运行,这使它们能够遵守其典型目标应用程序强加的对时间要求严格的要求,涉及需要时间截止日期或确定性响应的任务。

具体地说, FreeRTOS 是由 micro-ROS 项目支持的首批 RTOS 之一,因此集成到其软件堆栈中。这允许重复使用 FreeRTOS 社区和合作伙伴提供的所有工具和实现方式。由于 micro-ROS软件堆栈是模块化的,因此软件实体的交换是人们所期待和希望的结果。

FreeRTOS 是开发 micro-型 ROS 和 MICRO XRCE-DDS 应用程序的理想选择。 首先,它为许多不同的架构和开发工具提供了一个独立的解决方案,它以一种非常明确和透明的方式编写,并且拥有一个庞大的用户群,这确保了大量 FreeRTOS 用户能够将他们的应用程序与 micro-ROS应用程序集成。此外,众所周知,RTOS 具有高度的可靠性。关键是, FreeRTOS 具有最小的 ROM、RAM 和处理开销。通常,RTOS 内核二进制映像将在 6 K 到 12 K 字节的范围内。由于与 RTOS.的资源竞争,这些内存数据对于在 MCU 上最小化 micro-ROS 应用程序的内存占用十分理想。

在下文中,我们讨论了 micro-FreeRTOS提供的几个功能,以及 micro-ROS 如何利用这些功能,以优化其堆栈中组成的不同库的所需功能。

任务和计划程序

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

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

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

内存管理

在 FreeRTOS 提供的最理想功能中,也是 micro-ROS开发人员和用户非常感兴趣的功能,是堆栈管理静态堆栈创建功能。在处理 micro-ROS的任务创建时,堆栈分配通常是一个关键的设计决策。FreeRTOS 允许细粒度堆栈大小管理,这使得程序员能够知道在执行程序期间使用了多少堆栈存储器,或者例如决定堆栈存储器分配是否存在于静态或动态存储器中,从而帮助 MCU 正确使用内存 ,这是嵌入式系统中的一项宝贵资源。至关重要的是,重堆栈消费者任务(如 micro-ROS )可以提供静态分配堆栈,从而防止将来出现堆和其他任务初始化问题。

在这方面,值得一提的是,这些内存管理工具为测试 micro-ROS 和 XRCE-DDS 内存占用提供了理想的框架。具体而言,已经进行了彻底的堆栈消耗分析,以评估 XRCE-DDS 客户端内存消耗。堆栈是程序员在运行应用程序之前未知的内存块。为了对其进行测量,可以使用 FreeRTOS uxTaskGetStackHighWaterMark() 函数,当 XRCE-DDS 任务堆栈处于其最大值时,该函数返回执行期间未使用的堆栈量。因此,通过将该值减去总堆栈值,可以获得 XRCE-DDS 应用程序使用的堆栈峰值。此处发表的一份报告总结了这一方法所取得的结果。

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

与静态内存情况类似,FreeRTOS 的可交换动态内存管理方法使得在嵌入式系统中执行动态内存陪着分析变得轻而易举。事实上,在其他 RTOS 中,动态 (de) 分配函数隐藏在 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 代码和操作系统内核之间提供了一个通用接口。

与 lwIP FreeRTOS 的集成从一开始就设计为具有标准和熟悉的接口(Berkeley 套接字),且线程安全,旨在使其尽可能易于使用。此外,它在可移植层中保持缓冲区管理。

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

除此之外,FreeRTOS -Plus- TCP 还能与 micro- ROS 兼容。这包括对 TCP 和 UDP 连接的支持,依靠 FreeRTOS-Plus-TCP API 实现 micro XRCE-DDS 客户端 API 所需的抽象层,以便能够使用这些协议与代理进行通信。

此外,它还可以使用 FreeRTOS 的时间测量功能,从而使 XRCE-DDS 库能够执行基于时间的任务,从而对用户隐藏实现。

Posix 扩展

将 FreeRTOS 无缝且有利地集成到 micro-ROS 中的另一个显著原因是 POSIX 扩展 的可用性。可移植操作系统接口 (POSIX) 是 IEEE 计算机学会为维护操作系统之间的兼容性而指定的一系列标准。FreeRTOS Labs 提供的 FreeRTOS-Plus-POSIX 层实现了 POSIX API 的一个子集。

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

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

在 errno.h 的情况下,为了编译,micro-ROS 必须包括一些不可用的定义,尽管它们未在 FreeRTOS-Plus-POSIX 层中实现。

这些定义应通过使用 FreeRTOS-Plus-FAT 库在 micro-ROS 堆栈内重构,以实现 FreeRTOS-Plus-POSIX 完全兼容性。通过这种方式,可以完全支持依赖于文件系统支持的高级 micro-ROS 功能,例如日志记录机制。

结论

总之,FreeRTOS 制造出轻量且理想的 RTOS ,在其上运行 micro-ROS 应用程序,因为它提供了广泛的所需功能,几乎所有构成 micro-ROS 堆栈的几乎所有模块化层在不同级别上使用这些功能。

由于 micro-ROS 和 FreeRTOS 的用户群迅速扩大,引人注目的用例不断涌现,预计在不久的将来 micro-ROS 将与 FreeRTOS 和 FreeRTOS-Plus 提供的库的进一步集成。

其中,利用 FreeRTOS-Plus-FAT 库显得尤为可取,以便添加虚拟文件系统组件,所述组件能够在完全部署的 ROS 2 生态系统中可视化并管理日志操作。

还设想进一步利用专用部分中描述的内存管理工具来扩展 XRCE-DDS 客户端的内存分析,以便为 micro-ROS 客户端提供类似的分析。

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

最后,似乎值得一提的是 FreeRTOS 与 micro-ROS 的典型目标应用程序相关的硬件集成的两个非常成功的例子,即实现 Crazyflie 2.1 drone ESP32 MCU。事实上,Crazyflie 软件可以利用几种 FreeRTOS 的工具和功能,从而获利。此处 可观看在此 MAV 上与 FreeRTOS micro- ROS 应用程序一起运行的演示示例。至于与 FreeRTOS 本地集成并提供即用 Wi-Fi 天线和蓝牙功能的第二个硬件,已经在该系统上实现新的 micro-ROS 端口

最后,此处 有一份非常完整的指南,说明如何利用 Olimex STM32-E407 评估板, 在 FreeRTOS 上创建和运行您的第一个 micro-ROS 应用程序。

关于 eProsima

eProsima 是一家专注于网络中间件的公司,特别关注称为实时系统数据分发服务(DDS) OMG (对象管理组)标准。

eProsima 的主要产品是 eProsima Fast DDS ,这是一种轻量级的 DDS 开放源代码实现,可直接访问底层协议,即实时发布-订阅(RTP)协议。

eProsima 是机器人操作系统 (ROS) 的主要贡献者, 被 eProsima Fast DDS 列为 ROS 2 的默认中间件。由于这一点和其他重要贡献, eProsima 被选为 ROS 2 技术指导委员会的成员,以推动这一事实上的标准机器人框架的路线图。

eProsima 还领导着 micro-ROS项目 ,在新的 eProsima 中间件产品 eProsima ROS Micro XRCE-DDS (资源极其有限的环境 DDS)基础上,将 2 扩展到微控制器,该产品已被 ROS 社区采用。

作者简介

Francesca Finocchiaro,物理学家出身,在 eProsima 担任项目经理一职。 目前,她正在领导 micro-ROS团队,并协调 OFERA ( http://www.ofera.eu/ )的欧盟项目,该项目开发并积极维护 micro-ROS。
查看此作者的文章
FreeRTOS 论坛 获得来自专家的行业领先支持,并与全球同行合作。 查看论坛
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.