【AimRT】现代机器人通信中间件 AimRT

目录

  • 一、什么是AimRT
  • 二、AimRT与ROS2
    • 2.1 定位与设计
    • 2.2 组成与通信方式对比
  • 三、AimRT基本概念
    • 3.1 Node、Pkg 和 Module
    • 3.2 Protocol、Channel、Rpc 和 Filter
    • 3.3 App模式 和 Pkg模式
    • 3.4 Executor
    • 3.5 Plugin

一、什么是AimRT

AimRT 是智元机器人公司自主研发的一款机器人通信中间件。

AimRT 是一个面向现代机器人领域的运行时开发框架。 它基于 C++20 开发,轻量且易于部署,在资源管控、异步编程、部署配置等方面具有更现代的设计。旨在为开发者提供一个轻量化的 ROS2 替代中间件;

AimRT 致力于整合机器人端侧、边缘端、云端等各种部署场景的研发。 它服务于现代基于人工智能和云的机器人应用,提供完善的调试和性能分析工具链,以及良好的可观测性支持。

AimRT 还提供了全面的插件开发接口,具有高度可扩展性。 它与 ROS2、HTTP、Grpc 等传统机器人生态系统或云服务生态系统兼容,并支持对现有系统的逐步升级。

AimRT架构:

在这里插入图片描述

二、AimRT与ROS2

AimRT 相对于 ROS 并不是取代的关系,而是互补的,AimRT目前没有像ROS一样庞大的社区支持,同样ROS也没有对现代机器人(Robot+AI、Robot+Cloud)的良好支持,官方对AimRT的定位是对标ROS的通信层组件。官方提供了强大的兼容性,加载了 AimRT 官方提供的 ROS2 (Humble)插件的 AimRT 节点可以被认为就是一个 ROS2 节点,可以使用大部分 ROS2 (Humble)的生态,例如 rviz 或 plotjuggler 等。

2.1 定位与设计

  • AimRT:

    AimRT 是一个更现代、轻量易用且高效稳定的通信开发框架,致力于整合机器人端侧、边缘端、云端等多种部署场合的研发,更适用于现代基于AI与云的机器人应用。基于 C++20 开发,轻量易部署,在资源管控、异步编程、部署配置等方面都有更现代化的设计。

  • ROS2:

    ROS2 是为了传统机器人控制领域设计的,可以较好地支持运动控制、Slam等领域。旨在构建一个统一的机器人开发生态系统,为机器人开发者提供一个开放、可扩展的平台,用于构建、部署和管理机器人应用程序。广泛应用于工业自动化、服务机器人、智能交通、医疗保健以及农业机器人等多个领域。其强大的生态系统和丰富的工具链使得它成为这些领域的首选开发平台。

2.2 组成与通信方式对比

基本特点对比:

ROS2AimRT
开发语言C++/PythonC++/Python
使用的C++标准C++17C++20
构建工具colconCMake
核心组件节点管理器、消息中间件、参数服务器等配置管理器、插件管理器、执行器、日志管理器等
生态系统庞大的算法包、功能包和工具链插件化设计,提供插接点和查询API,支持二次开发
默认通信中间件快速数据分发(Fast DDS)插件化通信层,ROS2、Zenoh、Http、Grpc、Mqtt等多种通信插件
通信方式Topic(主题)、Service(服务)、Parameter Server(参数服务器)、Actionlib(动作库)支持ROS2、Zenoh、Http、Grpc、Mqtt等多种通信插件,无缝接入多套通信方式
分布式架构支持,允许节点在多个物理机器上运行,通过网络进行通信支持,通过多种通信插件实现在不同的物理位置或逻辑分区上进行通信
对云和AI的支持-从上层通信接口、底层通信方式上都对云和AI领域有较好的支持
适用场景适用于大规模和复杂的机器人系统适用于现代基于AI与云的机器人应用,提供高性能的通信中间件

通信方式对比:

ROS2AimRT
发布订阅机制Topic(话题)Channel(数据通道)
请求应答机制Service(服务)Rpc(远程过程调用)

三、AimRT基本概念

AimRT的官方文档讲的很详细了,官方解释见 AimRT 中的基本概念

这里只讲一下自己的理解,有不同理解可以交流。

架构相关概念:NodePkgModule

通信相关概念:ProtocolChannelRpcFilter

两种业务逻辑集成方式:App模式Pkg模式

其他:ExecutorPlugin

3.1 Node、Pkg 和 Module

Node 是一个运行示例,类似于 ROS 的 Node,是一个进程,可以部署到不同的物理位置。

Module 是一些逻辑功能内聚的源码,类似在模块化编程中的模块,Module 之间不是通过引用头文件调用接口来通信,而是使用 ChannelRpc 来通信,降低了 Module 间的耦合性。

Pkg 本质是一个动态库,他可以包含多个 Module;同时一个Node也可以链接多个动态库。

他们的关系大致如下:

在这里插入图片描述

3.2 Protocol、Channel、Rpc 和 Filter

Protocol 即通信数据格式,类似 ROS 的消息(msg/srv),目前支持 ProtobufROS2 msg/srv

Channel 即发布订阅通信机制,类似 ROS 的 Topic。

发布接口端广播 Protocol 格式的消息数据,数据通过发布后端转化为相应协议的数据格式(Mqtt是TCP/IP协议,ROS2则是DDS协议),订阅后端接收到数据后,再转回 Protocol 格式通过订阅接口输出。

由于多了一层后端的处理,使得 AimRT 即将各业务模块解耦,又可以适配多种通信协议。

在这里插入图片描述

Rpc 是请求应答通信机制,类似 ROS 的 Service。

客户接口端发出请求的 Protocol 格式消息数据,数据通过客户后端转化为相应协议的数据格式(Mqtt是TCP/IP协议,ROS2则是DDS协议),服务后端接收到数据后,再转回 Protocol 格式传给服务接口,待请求数据处理完,应答数据再原路返回。

在这里插入图片描述

Filter 可以理解为 AimRT 通信数据管道中的过滤器,分为框架侧 Filter(Framework Filter)和用户侧 Filter(User Filter)。用户可以通过自定义该过滤器的行为查看数据信息。

在这里插入图片描述

3.3 App模式 和 Pkg模式

AimRT 发布程序的两种方式,App模式可以理解为免安装方式,它的编译结果只生成一个可执行文件,一般用于小工具、小型 Demo 场景,没有太大的模块解耦需求;

Pkg模式发布一个动态库,一般用于中大型项目,对模块解耦、二进制发布等有较强烈需求时。

3.4 Executor

Executor 执行器表示一个可以执行逻辑代码的抽象概念,一个执行器可以是一个线程池、可以是一个协程/纤程,可以是 CPU、GPU、甚至是远端的一个服务器。执行器的作用是对并发任务的管理和调度,我们平常写的最简单的代码也有一个默认的执行器:主线程。

开发者使用 AimRT 的执行器功能时,在业务层将任务打包成一个闭包,然后调用接口层的 API,将任务投递到具体的执行器内,而执行器会根据自己的调度策略,在一定时机执行投递过来的任务。具体逻辑流程如下图所示:

在这里插入图片描述

对于闭包,我们经常用到的 lambda表达式std::functionstd::bind等都可以创建闭包。

比如下面例子:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lck(mtx);// 使用 lambda 表达式作为谓词while (!cv.wait_for(lck, std::chrono::seconds(1), [&]{return ready;})) {std::cout << "Thread " << id << " waiting for condition variable to be notified...\n";}std::cout << "Thread " << id << " proceeding after condition variable was notified.\n";
}void go() {std::unique_lock<std::mutex> lck(mtx);ready = true;cv.notify_all(); // 通知所有等待的线程
}int main() {std::thread threads[10];// 创建并启动10个线程for (int i = 0; i < 10; ++i)threads[i] = std::thread(print_id, i);std::cout << "10 threads ready to race...\n";std::this_thread::sleep_for(std::chrono::seconds(2)); // 主线程等待2秒go(); // 设置条件变量并通知所有线程for (auto& th : threads) th.join(); // 等待所有线程完成return 0;
}

std::wait_for 函数通过处理 lambda 表达式是否需要继续等待,其中std::wait_for就是一个执行器, lambda 表达式就是一个任务闭包。

3.5 Plugin

Plugin 是AimRT 与 ROS 最不同的地方了,正因为 AimRT 提供了大量的插件接口,使得它有很强的兼容性与扩展性。

Plugin 本质上就是一个可以向 AimRT 框架注册各种自定义功能的动态库,开发者也可以定制开发自己的插件,插件开发方式。


欢迎加QQ群,一起讨论学习:894013891

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…

C++【内存管理】

C/C中程序的内存划分&#xff1a; 栈&#xff1a;又称堆栈&#xff0c;存放非静态的局部变量、函数参数、返回值等等&#xff0c;栈是向下增长的。内存映射段&#xff1a;是高效的&#xff29;&#xff0f;&#xff2f;映射方式&#xff0c;用于装载一个共享的动态内存库。用户…

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…

【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)

本文项目编号 T 107 &#xff0c;文末自助获取源码 \color{red}{T107&#xff0c;文末自助获取源码} T107&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统&#xff0c;用于保存敏感信息&#xff0c;如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因为它对数据进行了加密&#xff0c;并且只有经过授权的应用程序才…

使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包

作者&#xff1a;刘大 前言 在使用iClient for MapboxGL/MapLibreGL项目开发中&#xff0c;往往会对接非EPSG:3857坐标系的地图&#xff0c;由于默认不支持&#xff0c;因此需引入mapboxgl-enhance/maplibre-gl-enhance扩展包。 在使用Vue等其他框架&#xff0c;通过npm包下载…

应急指挥系统总体架构方案

引言 应急指挥系统总体架构方案旨在构建一个高效、智能的应急管理体系&#xff0c;以应对自然灾害、事故灾难等突发事件&#xff0c;保障人民生命财产安全。 背景与挑战 近年来&#xff0c;安全生产形势严峻&#xff0c;自然灾害事故频发&#xff0c;对应急指挥系统的要求越…

如何用CSS3创建圆角矩形并居中显示?

在网页设计中&#xff0c;圆角矩形因其美观和现代感而被广泛使用&#xff0c;居中显示元素也是一个常见的需求。今天&#xff0c;我们将学习如何使用CSS3的border-radius属性来创建圆角矩形&#xff0c;并将其居中显示在页面上。 如果你正在学习CSS&#xff0c;那么这个实例将非…

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中&#xff0c;控制材质的参数值和向量值

canvas+fabric实现时间刻度尺(二)

前言 我们前面实现了时间刻度尺&#xff0c;鼠标移动显示时间&#xff0c;接下来我们实现鼠标点击某个时间进行弹框。 效果 实现 1.监听鼠标按下事件 2.编写弹框页面 3.时间转换 <template><div><canvas id"rulerCanvas" width"1200"…

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电

手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中&#xff0c;我们论述了局域网SIP坐席通过手机外呼出去时&#xff0c;手机中主副卡的呼叫调度策略。 但…

离线语音识别+青云客语音机器人(幼儿园级别教程)

1、使用步骤 确保已安装以下库&#xff1a; pip install vosk sounddevice requests pyttsx3 2、下载 Vosk 模型&#xff1a; 下载适合的中文模型&#xff0c;如 vosk-model-small-cn-0.22。 下载地址&#xff1a; https://alphacephei.com/vosk/models 将模型解压后放置在…

Streaming Dense Video Captioning

原文出处 CVPR 原文链接 [2404.01297] Streaming Dense Video Captioninghttps://arxiv.org/abs/2404.01297 原文笔记 What 1、提出了一种基于聚类传入token的新记忆模块&#xff0c;该模块可以处理任意长的视频&#xff0c;并且可以在不访问视频所有帧的情况下处理视频(…

TCP 连接:三次握手与四次挥手

TCP 协议&#xff0c;全称为“传输控制协议”。 1. TCP 协议段格式 给出几个定义 &#xff1a; 16位源端口号 &#xff1a;用于标识发送端的应用程序。 16位目的端口号 &#xff1a;用于标识接收端的目标应用程序。 32位序号 &#xff1a;用于标识发送的每一个字节流中的第一…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功&#xff0c;本地打开页面是空白&#xff0c;控制台报错 重新下载了vue-loa…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…