【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.rhkb.cn/news/500714.html

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

相关文章

SSM-Spring-AOP

目录 1 AOP实现步骤&#xff08;以前打印当前系统的时间为例&#xff09; 2 AOP工作流程 3 AOP核心概念 4 AOP配置管理 4-1 AOP切入点表达式 4-1-1 语法格式 4-1-2 通配符 4-2 AOP通知类型 五种通知类型 AOP通知获取数据 获取参数 获取返回值 获取异常 总结 5 …

idea( 2022.3.2)打包报错总结

一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …

攻防靶场(29):目录权限和文件权限 ICMP

目录 1. 侦查 1.1 收集目标网络信息&#xff1a;IP地址 1.2 主动扫描&#xff1a;扫描IP地址段 1.3 搜索目标网站 2. 初始访问 2.1 利用面向公众的应用 3. 权限提升 3.1 有效账户&#xff1a;本地账户 3.2 滥用特权控制机制&#xff1a;Sudo和Sudo缓存 靶场下载地址&#xff1a…

C++ 面向对象编程:多态、虚函数原理

多态的通用描述便是&#xff0c;使用父类指针调用函数&#xff0c;可以根据对象类型来调用对应类型函数&#xff0c;我们分几个步骤来理解&#xff0c;先看下类的占用空间&#xff0c;然后拓展到虚函数对应数组&#xff0c;最后理解多态的原理。 我们先来看下在多态中没有任何…

王老吉药业SRM系统上线 携手隆道共启战略合作新篇章

12月27日&#xff0c;广州王老吉药业股份有限公司&#xff08;简称“王老吉药业”&#xff09;SRM项目上线启动会&#xff0c;在王老吉科普教育基地——“吉园”隆重举行。广药集团纪委主任陈耕、王老吉药业总工程师黄晓丹、隆道公司总裁吴树贵、项目经理赵耀、供应商代表郭伟及…

JavaScript基础 -- 变量、作用域与内存

1 原始值与引用值 原始值就是最简单的数据&#xff0c;引用值则是由多个值构成的对象。在把一个值赋给变量时&#xff0c;JavaScript引擎必须要确定这个值是原始值还是引用值 原始值大小固定&#xff0c;保存在栈内存上&#xff1b;引用值是对象&#xff0c;存储在堆内存上 它…

SQL—替换字符串—replace函数用法详解

SQL—替换字符串—replace函数用法详解 REPLACE() 函数——查找一个字符串中的指定子串&#xff0c;并将其替换为另一个子串。 REPLACE(str, old_substring, new_substring)str&#xff1a;要进行替换操作的原始字符串。old_substring&#xff1a;要被替换的子串。new_substri…

[极客大挑战 2019]Http 1

进入环境&#xff1a; 检查源码发现有一个链接&#xff0c;但是这里没有绑定&#xff0c;需要手动跳转&#xff0c;打开后&#xff0c;发现提示&#xff1a; 这里就是需要我们从https://Sycsecret.buuoj.cn来访问它 因此我们抓包&#xff0c;使用referer&#xff1a;服务器伪造…

吾杯网络安全技能大赛——Misc方向WP

吾杯网络安全技能大赛——Misc方向WP Sign 题目介绍: 浅浅签个到吧 解题过程&#xff1a; 57754375707B64663335376434372D333163622D343261382D616130632D3634333036333464646634617D 直接使用赛博橱子秒了 flag为 WuCup{df357d47-31cb-42a8-aa0c-6430634ddf4a} 原神启动…

如何查看下载到本地的大模型的具体大小?占了多少存储空间:Llama-3.1-8B下载到本地大概15GB

这里介绍一下tree命令&#xff0c;可以方便的查看文件目录结构和文件大小。 命令行tree的具体使用&#xff0c;请参考笔者的另一篇博客&#xff1a;深入了解 Linux tree 命令及其常用选项&#xff1a;Linux如何显示目录结构和文件大小&#xff0c;一言以蔽之&#xff0c;sudo a…

【Java回顾】Day2 正则表达式----异常处理

参考资料&#xff1a;菜鸟教程 https://www.runoob.com/java/java-exceptions.html 正则表达式 有一部分没看完 介绍 字符串的模式搜索、编辑或处理文本java.util.regex包&#xff0c;包含了pattern和mathcer类&#xff0c;用于处理正则表达式的匹配操作。 捕获组 把多个字符…

招银网路Java后端一面,难度有点大!

这是一位武汉理工大学同学的招银网络一面面经,同样附带超详细的参考答案。大家可以用来查漏补缺,针对性地补短板。 招银网络一面还是比较简单的,基本都是一些比较重要且高频的常规八股,项目问的不多。到了二面的时候, 会开始主要考察你的项目。 1、自我介绍 自我介绍一般…

xadmin后台首页增加一个导入数据按钮

xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang

arcgis模版空库怎么用(一)

这里以某个项目的数据为例&#xff1a; 可以看到&#xff0c;属性表中全部只有列标题&#xff0c;无数据内容 可能有些人会认为空库是用来往里面加入信息的&#xff0c;其实不是&#xff0c;正确的用法如下&#xff1a; 一、下图是我演示用的数据&#xff0c;我们可以看到其中…

GJB系统设计说明模板

GJB系统设计说明模板及详解 1 范围 1.1 标识 1.2 系统概述 1.3 文档概述 2 引用文档 GJB XXX XXX XXX&#xff1b; XXX XXX。 前2章通用不再赘述 3 系统级设计决策 系统设计决策的目的:对系统规格说明中的关键需求(包括功能、质量属性和设计约束)进行分析,得到系统级概念性架构…

某小程序sign签名参数逆向分析

文章目录 1. 写在前面2. 接口分析3. 分析还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

2000-2020年各省财政一般预算支出面板数据

2000-2020年各省财政一般预算支出面板数据 1、时间&#xff1a;2000-2020年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;年份、省份、地方财政一般预算支出 4、范围&#xff1a;31省 指标解释&#xff1a;地方财政一般预算支出‌是指地方ZF根据预算安排&#xff0…

[羊城杯 2024]1z_misc

得到FL4G.zip和天机不可泄露.txt文件&#xff0c;其中压缩包需要解压密码&#xff1a; 二十八星宿&#xff1a; 东方苍龙七宿&#xff1a;角、亢、氐、房、心、尾、箕 南方朱雀七宿&#xff1a;鬼、井、柳、星、张、翼、轸 西方白虎七宿&#xff1a;奎、娄、胃、昴、毕、觜、…

右值引用全面剖析

为什么要有右值引用&#xff0c;右值引用出现前程序员们的困境&#xff1a; 在右值引用出现以前&#xff0c;想要把一块内存空间里的内容放到另一块内存空间&#xff0c;只能再开辟一块内存&#xff0c;然后将原来内存里的内容复制到新开辟的内存里&#xff0c;然后再把原来的…

mac下载Homebrew安装nvm

通过Homebrew安装 - 国内下载地址 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装nvm brew install nvm 配置nvm环境变量 export NVM_DIR“$HOME/.nvm” [ -s “/usr/local/opt/nvm/nvm.sh” ] && . “/usr/…