【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 等函数在堆上分配了内存…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
