详解高性能中间件Iceoryx在ROS2中的使用

news2025/1/31 3:11:08

文章目录

  • 0. 概述
  • 1. 系统架构对比
    • 1.1 移除 Master 节点
    • 1.2 引入 DDS 系统
    • 1.3 跨平台支持
  • 2. DDS 系统的引入
    • 2.1 RMW 概述
    • 2.2 QoS(质量服务策略)
  • 3. ROS2安装与配置
    • 3.1 一键安装
    • 3.2 官网教程
  • 4. [ROS2 底层切换 Iceoryx 官方实现](https://github.com/ros2/rmw_iceoryx/blob/iron/README.md)
    • 4.1 安装
    • 4.2 使用 rmw_iceoryx_cpp
    • 4.3 零拷贝传输
  • 5. 不同负载下的Iceoryx、cycloneDDS和FastDDS延迟对比
    • 5.1 进程间延迟
    • 5.2 进程内延迟
    • 5.3 对比总结

0. 概述

本文将概述ROS2相比ROS中间件的改进和优势,重点推荐Iceoryx

1. 系统架构对比

系统架构对比图

1.1 移除 Master 节点

  • ROS1:依赖 roscore 作为 Master 节点,Master 节点崩溃会导致系统无法订阅和发布。
  • ROS2:不再依赖 roscore,避免了 Master 节点崩溃导致的系统风险。

1.2 引入 DDS 系统

  • ROS1:使用 TCP/UDP 进行通信,存在延迟、数据丢失和无法加密的问题。
  • ROS2:基于 Data Distribution Service(DDS)的通信架构,提高了网络安全性和实时性。

1.3 跨平台支持

  • ROS1:跨平台支持较弱。
  • ROS2:提供了更好的跨平台兼容性,支持多种操作系统和硬件架构。

2. DDS 系统的引入

DDS 系统图

2.1 RMW 概述

不同厂商可以根据需要实现不同的 DDS 系统,如 OpenSplice 和 FastRTPS。为了统一不同 DDS 厂商的接口,ROS2 设计了 ROS Middleware(RMW)接口,使得各 DDS 厂商能够编写适配接口,将自家 DDS 系统移植到 ROS2 中。

ROS2 的核心概念与 ROS1 基本类似,但在架构上进行了优化,提供了更好的性能和灵活性。RMW 是构建 ROS 所需的原始中间件最小功能集,包括 Initialization and Shutdown、Nodes、Publisher、Subscription、Service Client、Service Server 等功能。

核心概念图

2.2 QoS(质量服务策略)

在开发过程中,需要关注 DDS 的 QoS 特性,它可以通过指定所需的网络传输质量来满足通信需求。

ros2 topic echo /example_topic --qos-reliability reliable

切换不同的 DDS 系统只需安装相应的包,并通过设置环境变量即可:

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

3. ROS2安装与配置

3.1 一键安装

提供简易的一键安装脚本,支持多个版本的 ROS2 安装。

wget http://fishros.com/install -O fishros && . fishros
# 支持 noetic(ROS1), foxy(ROS2), galactic(ROS2), rolling(ROS2), iron(ROS2), humble(ROS2)

3.2 官网教程

链接到 ROS2 的官方安装教程,为用户提供详细的安装指导。

https://docs.ros.org/

4. ROS2 底层切换 Iceoryx 官方实现

4.1 安装

以下步骤展示了如何安装 Iceoryx 的 RMW 实现。安装 rmw_iceoryx 非常简单,因为 Iceoryx 已包含在 ros2.repos 中。所有提供的包都可以使用 colcon 构建,因此你可以轻松地在 ROS 2 工作区内构建 rmw_iceoryxrmw_iceoryx 使用 rosidl_typesupport_introspection,这允许在现有的 ROS 2 工作区或 Debian 安装基础上构建 iceoryx,因为不需要再次构建 ROS 2 消息。

要在最新的 ROS 版本的 ROS 2 工作区中安装 rmw_iceoryx,请执行以下步骤:

mkdir -p ~/iceoryx_ws/src
cd $_
# LATEST_ROS_VERSION 可以是例如 iron
git clone --branch LATEST_ROS_VERSION https://github.com/ros2/rmw_iceoryx.git

有关替代安装说明和 iceoryx 内部详细信息,请参阅 iceoryx 的 GitHub 仓库。

rmw_iceoryx 与 ROS 2 从 Eloquent 版本开始兼容。假设你已正确安装 ROS 2,可以使用 colcon 编译 iceoryx 工作区:

cd ~/iceoryx_ws/
source /opt/ros/LATEST_ROS_VERSION/setup.bash  # 或者 source 你自己的 ROS 2 工作区
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro LATEST_ROS_VERSION -y
colcon build
# 或者使用更多选项
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF

就是这样!你已经安装了 iceoryx,现在可以开始使用了。

4.2 使用 rmw_iceoryx_cpp

Iceoryx 基于共享内存,并具有一个名为 RouDi 的共享内存管理应用。启动守护进程:

./iceoryx_ws/install/iceoryx_posh/bin/iox-roudi

然后指定 RMW 实现并运行 ROS 2 示例节点:

source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp talker

在另一个终端中订阅 talker

source ~/iceoryx_ws/install/setup.bash
RMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp listener

4.3 零拷贝传输

基本的零拷贝工作流程如下:

在这里插入图片描述

  1. loan_message():发布者请求借用一条消息。
  2. publish():发布者填写数据并发布消息。
  3. take_loaned_message():订阅者获取消息。
  4. return_loaned_message():订阅者回调完成后,消息返回中间件。

示例代码:

auto pod_pub_ = node->create_publisher<std_msgs::msg::Float64>("/float", 1);
auto pod_loaned_msg = pod_pub_->borrow_loaned_message();
pod_loaned_msg.get().data = 123.456f;
pod_pub_->publish(std::move(pod_loaned_msg));

在这里插入图片描述

5. 不同负载下的Iceoryx、cycloneDDS和FastDDS延迟对比

该对比数据展示了三种中间件解决方案(IceoryxcycloneDDSFastDDS)的延迟性能。延迟单位为微秒(us),测试负载范围从1KB到512MB。

5.1 进程间延迟

负载IceoryxcycloneDDSFastDDS
1KB2.47.353.95
2KB2.47.883.85
4KB2.47.413.98
8KB2.49.474.42
16KB2.411.975.22
32KB2.414.406.35
64KB2.420.868.72
128KB2.439.2910.11
256KB2.477.9023.06
512KB2.4238.3544.66
1MB2.4836.6489.74
2MB2.4984.68264.61
4MB2.42809.75526.03
8MBNA4874.371895.88
16MBNA8881.515112.93
32MBNA55535.9511998.55
64MBNA120856.5843563.32
128MBNANANA
256MBNANANA
512MBNANANA

5.2 进程内延迟

负载IceoryxcycloneDDSFastDDS
1KB1.5-1.22
2KB1.5-1.73
4KB1.5-1.82
8KB1.5-1.94
16KB1.5-2.34
32KB1.5-3.39
64KB1.5-4.45
128KB1.5-8.26
256KB1.5-23.09
512KB1.5-48.59
1MB1.5-103.26
2MB1.5-360.16
4MB1.5-687.45
8MBNA-1189.07
16MBNA-1951.29
32MBNA-3874.46
64MBNA-7967.83
128MBNA-15898.49
256MBNA-NA
512MBNA-NA

5.3 对比总结

  • Iceoryx在处理不同负载的进程间通信时,始终保持在2.4微秒的低稳定延迟,这显示了其在处理各种负载时的高效性。在进程内通信方面,其延迟更低,仅为1.5微秒。
  • cycloneDDS随着负载的增加,延迟逐渐增加,特别是在512KB以上,延迟显著增加,在64MB负载时达到120856.58微秒。
  • FastDDS的延迟性能优于cycloneDDS,但仍高于Iceoryx,负载增大时,特别是在4MB以上,延迟显著增加。

综上所述,Iceoryx在小到中等负载的进程间和进程内通信中表现最为高效。而cycloneDDS和FastDDS虽然具有一定的处理能力,但在大数据传输时存在延迟瓶颈。

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

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

相关文章

安全与效率并重:利用PowerShell脚本实现SQL Server网络配置的自动化监控与日志

目录 脚本概述 步骤实现 注意事项 创建一个PowerShell脚本&#xff0c;用于自动发现并记录SQL Server上所有连接的网络配置细节&#xff0c;包括端口、协议和安全性设置&#xff0c;是一个非常实用的操作&#xff0c;特别是在需要定期审计或新服务器部署时。以下是一个创意性…

【深度学习】【框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

实体业短视频基础剪辑:拍摄剪辑实用10大技巧+剪辑全集(29节)

课程目录 01.第一节|找对标.mp4 02.第二节|快速提取对标音乐.mp4 03.第三节|踩节拍.mp4 04.第四节|导入镜头.mp4 05.第五节|调节比例.mp4 06.第六节|变速.mp4 07.第七节|添加字幕.mp4 08.第一节|推镜头.mp4 09.第二节|拉镜头.mp4 10.第三节|下摇镜头.mp4 11.第四节|…

跟李沐学AI:AlexNet、VGG

目录 AlexNet架构 AlexNet总结 AlexNet实现 VGG块 VGG架构 VGG总结 AlexNet架构 输入图片为3x224x224维度&#xff1b;第一个卷积层核窗口大小为11x11&#xff0c;卷积层输出为96通道&#xff0c;步长为4&#xff1b;第一个最大池化层窗口大小为3x3&#xff0c;步长为2。…

C语言项目实战FTP文件传输(windows网络编程基础)

文章目录 前言一、客户端和服务端介绍二、客户端和服务器之间进行通信的过程客户端和服务器建立通信的流程通信过程的示例图流程说明 三、客户端代码编写代码解释 四、服务端代码编写代码解释 总结 前言 本篇文章开始将带大家来学习FTP文件传输助手的项目实现&#xff0c;这个…

【51单片机仿真】基于51单片机设计的温湿度采集检测系统仿真源码文档视频——文末资料下载

演示 目录 1.系统功能 2.背景介绍 3.硬件电路设计 4.软件设计 4.1 主程序设计 4.2 温湿度采集模块程序设计 4.3 LCD显示屏程序设计 5.系统测试 6.结束语 源码、仿真、文档视频等资料下载链接 1.系统功能 该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器…

makefile(1)

文章目录 概述简单Makefilemakefile三要素makefile&#xff1a;工作原理编译程序 小结 概述 makefile这个编译在c中很常见&#xff0c;看下操作系统&#xff0c;都是基于makefile编译的。来简单看下&#xff0c; 这个就不看了&#xff0c;每一个模块下都有一个对应的makefile…

前端:javaScript基础知识

一、输出语句 ①window.alert()&#xff1a;弹出框 ②ducument.write()&#xff1a;写入HTML输入 ③console.log()&#xff1a;在浏览器控制台输出 二、声明变量 ①使用关键字var来声明变量 ②javaScript是一门弱类型语言&#xff0c;变量可以存放不同类型的值 ③变量需要遵…

【Python】字符串练习题及代码示例

1、使用while循环实现对字符串中每个字符进行输出。 代码示例&#xff1a; 2、请将代码实现如下进制的转换。 &#xff08;1&#xff09;v1675,请将v1转换为二进制。 代码&#xff1a; 注意&#xff1a;将十进制数转换为二进制数的方法是&#xff1a;bin(a),a是整型&#x…

使用 addRouteMiddleware 动态添加中间

title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要&#xff1a;文章介绍了Nuxt3中addRouteMiddleware的使用方法&#xff0c;该功能允许开发者动态添加路由中间件&#xff0c;以实现诸如权限检查、动态重定向及…

html+css 实现hover双层按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此&#xff0c;许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是&#xff0c;在哪种编程语言中可以开发这些 AI 应用程序&#xff1f; 有各种编程语言&#xff0c…

Stable Diffusion绘画 | 图生图-基础使用介绍—提示词反推

按默认设置直接出图 拖入图片值图生图框中&#xff0c;保持默认设置&#xff0c;直接生成图片&#xff0c;出图效果如下&#xff1a; 因为重绘幅度0.7&#xff0c;所出图片与原图有差异&#xff0c;但整体的框架构图与颜色与原图类似。 输入关键词后出图 在正向提示词中输入…

PMP–知识卡片--Scrum框架

定义 Scrum框架包含由产品负责人、开发团队、敏捷专家构成的Scrum团队&#xff0c;以及活动工件。框架中的每一个组件都服务于一个特定的目标&#xff0c;且是Scrum成功和运用的基本要素。 Scrum的规则将角色、活动和工件绑定在一起&#xff0c;管理它们之间的关系和交互。 …

JavaEE 第2节 线程安全知识铺垫1

目录 一、通过jconsole.exe查看线程状态的方法 二、Thread类的几种常见属性 三、线程状态 一、通过jconsole.exe查看线程状态的方法 通过jconsole查看线程状态非常实用的方式 只要你安装了jdk&#xff0c;大致按照这个目录就可以找到这个可执行程序&#xff1a; 然后双击这…

YOLOv10改进 | 注意力篇 | YOLOv10引入24年最新的上下文锚注意力机制(CAA),并构建C2f_CAA(适用于小目标检测)

1. CAA介绍 1.1 摘要:遥感图像中的目标检测面临着越来越多的挑战,包括目标尺度的变化和背景的多样性。先前的方法试图通过扩大骨干的空间感受野来解决这些挑战,无论是通过大核卷积还是扩张卷积。然而,前者通常会引入相当大的背景噪声,而后者则会产生过于稀疏的特征表示。…

[CTF]-PWN:ORW题型综合解析

经典ORW&#xff1a; 例题&#xff08;极客大挑战 2019 Not Bad&#xff09;&#xff1a; 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始&#xff0c;大小位0x1000 权限为可写可执行&#xff08;可读0x1&#xff0c;可写0x2&#xff0c;可执行0x3&#xff09;…

Halcon 二维匹配

匹配&#xff1a;在训练图像中呈现一个所谓的模板。系统从这个模板中派生出一个模型&#xff0c;通过使用该模型来定位于搜索图像中的相似模板对象。此方法能够处理打光、杂乱、位置和旋转变换的图像。 匹配优点&#xff1a;鲁棒性和灵活性。匹配不需要对目标进行任何形式的分割…

50 选择结构

常见的选择结构有单分支选择结构、双分支选择结构、多分支选择结构及嵌套的分支结构&#xff0c;也可以构造跳转表来实现类似的逻辑。循环结构和异常处理结构中也可以实现带有 else 子句&#xff0c;可以看作特殊形式的选择结构。 所有的 Python 合法表达式都可以作为条件表达…

MySQL数据库入门:掌握数据管理的关键步骤!

前言 竹竹零将带您深入探索MySQL数据库的基础知识和实用技能&#xff0c;一同走进Java逻辑控制语句的 学习吧&#xff01;&#xff01;&#xff01; 本节目标 数据库的操作&#xff1a;创建数据库、删除数据库常用数据类型表的操作&#xff1a;创建表、删除表 1. 数据库的操作…