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

单片机和FreeRTOS上跑机器人ROS的应用

机器人的应用越来越广泛了,大家熟知的稚晖君直接创业搞机器人,可想而至,接下来的十年,机器人绝对是热门的行业。

目前市面上很多机器人都是基于一套叫做ROS的系统开发的,今天就给大家分享一个跑在MCU上,基于FreeRTOS的轻量级(micro)ROS。

随着市场需求不断的扩大,这种基于MCU的ROS将会越来越普及,对于从事机器人相关工作的读者有必要了解一下。

关于ROS

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

和普通OS(RTOS、TSOS)不一样的是,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/

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

更多内容,请参看:

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

图片

------------ END ------------

相关文章:

单片机和FreeRTOS上跑机器人ROS的应用

机器人的应用越来越广泛了,大家熟知的稚晖君直接创业搞机器人,可想而至,接下来的十年,机器人绝对是热门的行业。 目前市面上很多机器人都是基于一套叫做ROS的系统开发的,今天就给大家分享一个跑在MCU上,基…...

Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

文章目录 数据聚合聚合的种类DSL实现聚合RestAPI实现聚合 自动补全拼音分词器自定义分词器自动补全查询completion suggester查询RestAPI实现自动补全 数据同步数据同步思路分析实现elasticsearch与数据库数据同步 集群搭建ES集群创建es集群集群状态监控创建索引库1&#xff09…...

【gitlab初始密码登录失败】

gitlab初始密码登录失败 修改密码 修改密码 [rootlocalhost ~]# gitlab-rake "gitlab:password:reset[root]" Enter password: Confirm password: Password successfully updated for user with username root. # 再重新配置gitlab [rootlocalhost ~]# gitlab-ctl…...

2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2017 级考研管理类联考数学真题解析一、问题求解(本大题共 5 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2017-…...

2、基础入门——web应用架构搭建漏洞HTTP数据包代理服务器

Web应用环境架构类 开发语言:php、java、python、ASP、ASPX等程序源码:用的人多了,就成CMS了。中间件容器:IIS、Apache、Nginx、Tomcat、Weblogic、Jboos、glasshfish等数据库类型:Access、Mysql、Mssql、Oracle、Red…...

【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码

1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展,人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角,实时监测和跟踪行人的活动,为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …...

力扣算法练习BM45—滑块窗口的最大值

题目 给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针…...

最小二乘估计及与极大似然估计的关系

最小二乘估计(Least Squares Estimation)和极大似然估计(Maximum Likelihood Estimation)是统计学中常用的参数估计方法,它们在某些情况下是等价的,但在一般情况下并不总是相同的。 最小二乘估计&#xff…...

02房价预测

目录 代码 评分算法: 代码 import numpy as np from sklearn import datasets from sklearn.linear_model import LinearRegression# 指定版本才有数据集 # C:\Users\14817\PycharmProjects\pythonProject1\venv\Scripts\activate.bat # pip install scikit-le…...

【Springboot】pom.xml中的<build>标签详解

默认值及其标签解释 <build><!-- 指定最终构建产物的名称, 例如生成的 JAR 文件的名称 --><finalName>${artifactId}-${version}</finalName><!-- 指定源代码文件的目录路径 --><sourceDirectory>src/main/java</sourceDirectory>&l…...

智能驾驶产品开发中如何贯彻“正向开发”理念

摘要&#xff1a; 基于演绎法的正向开发理念&#xff0c;能够让智能驾驶产品在充分满足用户需求&#xff0c;保证产品质量的同时&#xff0c;确保开发目标合理且得到落实。 前段时间&#xff0c;微博CEO吐槽理想L9智能驾驶“行驶轨迹不居中”&#xff0c;在网上引发了热烈讨论…...

【机器学习】038_梯度消失、梯度爆炸

一、原因 神经网络梯度 假设现在有一个 层的神经网络&#xff0c;每层的输出为一个对输入作 变换的函数结果 用 来表示第 层的输出&#xff0c;那么有下列公式&#xff1a; 链式法则计算损失 关于某一层某个参数 的梯度&#xff1a; 注意到&#xff0c; 为向量&am…...

【转】OAK-D双目相机进行标定及标定结果说明

编辑&#xff1a;OAK中国 首发&#xff1a;A. hyhCSDN 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容来自用户的分享&#xff0c;如有疑问请与原作者交流&#xff01; ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 近期在CSDN刷…...

whip和whep

原文为runner365.git大佬的文章 原文链接&#xff1a;https://blog.csdn.net/sweibd/article/details/124552793 WHIP接口 什么是whip 全称: WebRTC-HTTP ingestion protocol (WHIP). rfc地址: rfc-draft-murillo-whip-00 简单说&#xff0c;就是通过HTTP接口能导入webrtc媒…...

SpringBoot集成jjwt和使用

1.引入jwt依赖&#xff08;这里以jjwt为例&#xff0c;具体其他jwt产品可以参见jwt官网&#xff09; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>…...

RedisConnectionFactory is required已解决!!!!

1.起因&#x1f936;&#x1f936;&#x1f936;&#x1f936; redis搭建完成后&#xff0c;准备启动主程序&#xff0c;异常兴奋&#xff0c;结果报错了&#xff01;&#xff01;&#xff01;&#xff01; 2.究竟是何原因 &#x1f62d;&#x1f62d;&#x1f62d;&#x1f…...

redis的高可用之持久化

1、redis的高可用考虑指标 &#xff08;1&#xff09;正常服务 &#xff08;2&#xff09;数据容量的扩展 &#xff08;3&#xff09;数据的安全性 2、redis实现高可用的四种方式 &#xff08;1&#xff09;持久化 &#xff08;2&#xff09;主从复制 &#xff08;3&…...

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…...

远程运维如何更高效的远程管理?向日葵的这几项功能会帮到你

远程运维如何更高效的远程管理&#xff1f;向日葵的这几项功能会帮到你 具备一定规模的企业&#xff0c;其IT运维需求普遍会面临设备数量众多、难以统一高效管理、始终存在安全敞口等问题&#xff0c;尤其是针对分部广泛的无人值守设备时&#xff0c;更是如此。 举一个简单的例…...

python BDD 的相关概念

在Python 语言中进行BDD的规格和测试文件的编写的时候&#xff0c;常常会遇到下面的概念&#xff1a; Fixture : 测试设施。设定测试环境的预设状态或值的机制。Background&#xff1a; 背景。所有场景的公共部分。Scenario&#xff1a; 场景。Given &#xff1a; 前置条件Whe…...

别再手动种树了!3DMAX+Forest Pack Pro预设库保姆级安装指南,5分钟搞定你的森林场景

别再手动种树了&#xff01;3DMAXForest Pack Pro预设库保姆级安装指南&#xff0c;5分钟搞定你的森林场景 当你在3DMAX中手动摆放第50棵树时&#xff0c;是否已经开始怀疑人生&#xff1f;别担心&#xff0c;Forest Pack Pro的预设库就是来拯救你的。想象一下&#xff0c;只需…...

从零搭建万卡级训练平台:Python分布式训练基础设施建设白皮书(含Kubernetes+Slurm+RDMA完整拓扑图)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Python分布式训练基础设施全景概览 现代深度学习模型规模持续扩大&#xff0c;单机训练已难以满足算力与内存需求。Python生态构建了一套分层协同的分布式训练基础设施&#xff0c;涵盖通信后端、任务调…...

3步解决经典游戏联机难题:IPXWrapper让老游戏重获新生

3步解决经典游戏联机难题&#xff1a;IPXWrapper让老游戏重获新生 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《星际争霸》《红色警戒2》《魔兽争霸2》等经典游戏无法在现代Windows系统上联机而烦恼吗&#xff1f;IPX…...

深度解析PKHeX-Plugins:自动化宝可梦合法性引擎的技术架构与创新实践

深度解析PKHeX-Plugins&#xff1a;自动化宝可梦合法性引擎的技术架构与创新实践 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 在宝可梦数据编辑领域&#xff0c;合法性验证一直是技术挑战的核心。传统…...

告别龟速推理:手把手教你用TensorRT 8.x加速PyTorch模型(附完整代码)

告别龟速推理&#xff1a;手把手教你用TensorRT 8.x加速PyTorch模型&#xff08;附完整代码&#xff09; 当你的PyTorch模型在测试集上表现优异&#xff0c;却在生产环境中遭遇推理延迟时&#xff0c;这种落差感就像赛车手开着F1却跑出了自行车的速度。本文将带你深入TensorRT …...

AI赋能网络安全:NeuroSploit项目解析与智能漏洞挖掘实践

1. 项目概述&#xff1a;当AI遇上网络安全最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“NeuroSploit”。光看名字&#xff0c;Neuro&#xff08;神经&#xff09;和Sploit&#xff08;漏洞利用&#xff09;这两个词组合在一起&#xff0c;就让人嗅到一股跨界融合的味道…...

YahooFinanceApi架构解析:.NET金融数据获取的技术实现与企业级应用

YahooFinanceApi架构解析&#xff1a;.NET金融数据获取的技术实现与企业级应用 【免费下载链接】YahooFinanceApi A handy Yahoo! Finance api wrapper, based on .NET Standard 2.0 项目地址: https://gitcode.com/gh_mirrors/ya/YahooFinanceApi 在金融科技领域&#…...

如何在Windows上快速安装安卓应用:APK安装器终极完整指南

如何在Windows上快速安装安卓应用&#xff1a;APK安装器终极完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行手机应用&#x…...

从哨兵2号到国产高分六号,Python遥感解译全栈工作流:环境配置→辐射定标→大气校正→NDVI/NDWI提取→随机森林分类→精度验证,一步不漏

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Python遥感解译全栈工作流概述 Python 已成为遥感影像解译领域事实上的核心编程语言&#xff0c;其丰富的生态&#xff08;如 rasterio、GDAL、scikit-learn、torchgeo 和 earthengine-api&#xff09…...

一步步教你在ClaudeCode中配置Taotoken的Codex模型服务

一步步教你在ClaudeCode中配置Taotoken的Codex模型服务 1. 准备工作 在开始配置前&#xff0c;请确保已安装最新版ClaudeCode并拥有有效的Taotoken API Key。登录Taotoken控制台&#xff0c;在「API密钥管理」页面可创建或查看现有密钥。同时建议在「模型广场」中确认目标Cod…...