您的位置:首页 > 设计应用 > 正文

单片机(RTOS)上运行 ROS 的创新应用

时间:2025-11-26 10:36:08 浏览:8

在当今科技飞速发展的时代,机器人的应用范围越来越广泛,已然成为热门行业。像大家熟知的稚晖君,直接投身创业搞机器人,这足以预见未来十年机器人领域的蓬勃发展。目前,市面上众多机器人都是基于 ROS(Robot Operating System,机器人操作系统)开发的。今天,就为大家详细分享一款运行在 MCU 上、基于 FreeRTOS 的轻量级(micro )ROS 应用。

随着市场需求的不断扩大,这种基于 MCU 的 ROS 将会越来越普及,对于从事机器人相关工作的人员来说,了解这一技术显得尤为重要。

关于 ROS

ROS 与普通的操作系统(如 RTOS、TSOS)有所不同,它主要针对机器人领域,是建立在操作系统之上的一套系统,为软件开发者提供一系列程序库和工具,以帮助他们创建机器人应用软件。ROS 具备硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能,并且遵守 BSD 开源许可协议。

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

micro - ROS

本文所介绍的 micro - ROS,是基于 ROS2 进行优化的轻量级 ROS 系统。它不仅提供了 ROS 2 生态系统中大多数吸引人的工具和功能,还具备在嵌入式和低资源设备上运行的卓越能力,能够在 MCU 硬件平台上稳定运行。

传统情况下,即使机器人包含多个 ROS 系统,ROS 通常也停留在微控制器边界,一般通过串行协议与旧版 ROS 中的 ROS - serial 之类的工具集成。而 micro - ROS 则提供了机器人系统嵌入式部分内部的 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运行。

11.png

这使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 字节之间。当需要最小化 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 的内存占用量提供了理想的框架。例如,通过使用 FreeRTOS uxTaskGetStackHighWaterMark()函数,可以返回在执行过程中 XRCE - DDS 任务堆栈达到最大值时未使用的堆栈量,将此值减去总堆栈,即可得到 XRCE - DDS 应用程序使用的堆栈峰值。相关结果已汇总在发布的报告中。

此外,由于 FreeRTOS 中使用了可插拔的动态内存管理方法,micro - ROS 能够完成所需的内存管理接口。以 heap_4 作为参考,实现了诸如 calloc()或 realloc()之类的函数,并在馈入 micro - ROS 内存管理 API 之前进行包装,以便分析动态内存消耗。与静态内存情况类似,FreeRTOS 的可交换动态内存管理方法使在嵌入式系统中执行动态内存配置文件分析变得特别容易。在 FreeRTOS 中,动态(取消)分配功能暴露给用户并易于定制,简化了处理和控制动态内存使用的过程。

传输

与客户端支持库访问 FreeRTOS 的特定原语和功能(如调度机制)类似,中间件实现 Micro XRCE - DDS 需要访问 RTOS 的传输和时间资源才能正常运行。在 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 的 FreeRTOS)显然是有益的,因为代码的移植工作量较小。

为此,使用了 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 功能,如日志记录机制。


版权声明: 部分文章信息来源于网络以及网友投稿.本网站只负责对文章进行整理、排版、编辑.是出于传递更多信息之目的.并不意味着赞同其观点或证实其内容
的真实性如本站文章和转稿涉及版权等问题,请作者及时联系本站,我们会尽快处理。

网址:https://www.icpdf.com/design/2512.html