【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 组成与通信方式对比
基本特点对比:
ROS2 | AimRT | |
---|---|---|
开发语言 | C++/Python | C++/Python |
使用的C++标准 | C++17 | C++20 |
构建工具 | colcon | CMake |
核心组件 | 节点管理器、消息中间件、参数服务器等 | 配置管理器、插件管理器、执行器、日志管理器等 |
生态系统 | 庞大的算法包、功能包和工具链 | 插件化设计,提供插接点和查询API,支持二次开发 |
默认通信中间件 | 快速数据分发(Fast DDS) | 插件化通信层,ROS2、Zenoh、Http、Grpc、Mqtt等多种通信插件 |
通信方式 | Topic(主题)、Service(服务)、Parameter Server(参数服务器)、Actionlib(动作库) | 支持ROS2、Zenoh、Http、Grpc、Mqtt等多种通信插件,无缝接入多套通信方式 |
分布式架构 | 支持,允许节点在多个物理机器上运行,通过网络进行通信 | 支持,通过多种通信插件实现在不同的物理位置或逻辑分区上进行通信 |
对云和AI的支持 | - | 从上层通信接口、底层通信方式上都对云和AI领域有较好的支持 |
适用场景 | 适用于大规模和复杂的机器人系统 | 适用于现代基于AI与云的机器人应用,提供高性能的通信中间件 |
通信方式对比:
ROS2 | AimRT | |
---|---|---|
发布订阅机制 | Topic(话题) | Channel(数据通道) |
请求应答机制 | Service(服务) | Rpc(远程过程调用) |
三、AimRT基本概念
AimRT的官方文档讲的很详细了,官方解释见 AimRT 中的基本概念
这里只讲一下自己的理解,有不同理解可以交流。
架构相关概念:Node
、Pkg
、Module
通信相关概念:Protocol
、Channel
、Rpc
、Filter
两种业务逻辑集成方式:App模式
和 Pkg模式
其他:Executor
、Plugin
3.1 Node、Pkg 和 Module
Node
是一个运行示例,类似于 ROS 的 Node,是一个进程,可以部署到不同的物理位置。
Module
是一些逻辑功能内聚的源码,类似在模块化编程中的模块,Module
之间不是通过引用头文件调用接口来通信,而是使用 Channel
与 Rpc
来通信,降低了 Module
间的耦合性。
Pkg
本质是一个动态库,他可以包含多个 Module
;同时一个Node也可以链接多个动态库。
他们的关系大致如下:
3.2 Protocol、Channel、Rpc 和 Filter
Protocol
即通信数据格式,类似 ROS 的消息(msg/srv),目前支持 Protobuf
和 ROS2 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::function
、std::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 框架注册各种自定义功能的动态库,开发者也可以定制开发自己的插件,插件开发方式。
相关文章:

【AimRT】现代机器人通信中间件 AimRT
目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…...

Unity 读Excel,读取xlsx文件解决方案
Unity读取表格数据 效果: 思路: Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
全文链接:https://tecdat.cn/?p38667 摘要:在母婴暴露于空气污染对儿童健康影响的研究中,常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型(DLNM)是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、事预则立,规划沟通管理二、提升支持,管理沟通三、观察偏差,监督沟通论文 2022年2月,我公司承建某省退役军人信息管理服务一体化平台项目,由于本人具有较丰富的项目管理经验,同时也是一名退伍军人…...

物联网工厂可视化监控平台:为智能制造打造的可视化大屏
01行业背景 随着技术的不断进步,物联网(IoT)已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器,实现数据的实时收集、传输和分析,为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…...

3、redis的高可用
主从复制 主从复制:这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从,从节点只能读不能写。read only。 不能做高可用的切换ÿ…...

数据结构--顺序表(详解)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...

Day62 图论part11
Floyd 算法精讲 Floyd 算法代码很简单,但真正理解起原理 还是需要花点功夫,大家在看代码的时候,会发现 Floyd 的代码很简单,甚至看一眼就背下来了,但我为了讲清楚原理,本篇还是花了大篇幅来讲解。 代码随想…...

git clone 超时
git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

WPF编程excel表格操作
WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用,操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
栈和队列理论基础 抽象认识 栈是先进后出(FIFO),队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框,取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...

【Devops】什么是Devops?(Development+Operations)和运维的区别?
DevOps(Development Operations)是一种将开发(Development)和运维(Operations)团队结合在一起的文化和实践,目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期,…...

基于NodeMCU的物联网电灯控制系统设计
最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计(…...

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
在嵌入式开发中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于与外设(如 EEPROM、传感器、显示屏等)进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器,它提供 2Kbit…...

Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...

VITUREMEIG | AR眼镜 算力增程
根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示,美国市场AR/VR总出货量增长10.3%。其中,成立于2021年的VITURE增长速度令人惊艳,同比暴涨452.6%,成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...

Jenkins管理多版本python环境
场景:项目有用到python3.8和3.9,python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装,以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…...

Flutter富文本实现学习
Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件,而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能,比如在富文本…...

如何解决 OpenAI API 连接问题:降级 urllib3 版本
如何解决 OpenAI API 连接问题:降级 urllib3 版本 在使用 OpenAI API 时,很多开发者可能会遇到连接问题,特别是在使用 Python 代码与 OpenAI 进行交互时。常见的错误包括 ProxyError、SSLError 和 MaxRetryError,它们通常表示在通…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free
C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...

AWS K8s 部署架构
Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…...

JavaSE笔记(四)
Java泛型与集合类 在前面我们学习了最重要的类和对象,了解了面向对象编程的思想,注意,非常重要,面向对象是必须要深入理解和掌握的内容,不能草草结束。在本章节,我们会继续深入了解,从我们的泛型开始,再到我们的数据结构,最后再开始我们的集合类学习。 走进泛型 为…...

C语言基础——指针(5)
一. 函数指针变量 1. 函数指针变量的定义: 类比数组指针变量,数组指针变量是存放数组地址的变量,那么同理,函数指针变量就是存放函数地址的变量。 2. 创建函数指针变量: 函数是有地址的࿰…...

curl+openssl 踩坑笔记
curl编译:点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …...

Unity 实现Canvas显示3D物体
新建一个UI相机,选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体,并将3D物体的层级设置为UI层 适当的放缩3DObjParent,让3D物体能显示出来…...

【Docker命令】如何使用`docker exec`在容器内执行命令
大家好,今天我们来聊聊Docker容器管理中的一个非常有用的命令:docker exec。在日常工作中,我们经常需要在运行中的Docker容器内执行各种命令,docker exec正是帮助我们实现这一需求的利器。下面我将通过一个简单的例子,…...

NetSuite Formula(HTML)超链打开Transaction
当Saved Search作为Sublist应用在Form时,如果Document Number是Group过的,则会出现如下超链失效的情况。 解决办法: 可以利用Saved Search中的Formula(HTML)功能来构建超链,用于打开Transaction。 以下图…...

【React】- 跨域PDF预览、下载(改文件名)、打印
我们经常会碰到跨域来方位PDF,同时需要下载、打印的需求,通常由于浏览器的安全策略,可以预览,但是下载和打印可能会受限,这时候怎么办呢? 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件,…...

git clone ssh 设置代理
Linux配置方法 编辑 ~/.ssh/config 文件 Host github.com Hostname github.com ProxyCommand nc -v -x 127.0.0.1:1080 %h %pwindows配置方法 编辑 C:\Users\当前用户名.ssh\config 文件 Host github.com Hostname github.com ProxyCommand connect -S 127.0.0.1:1080 %h %…...