iceoryx(冰羚)-简介

news2024/11/23 16:42:16

概要

RouDi

在这里插入图片描述

RouDi是Routing and Discovery的缩写。RouDi负责通信设置,但实际上并不参与发布者与订阅者或客户端与服务器之间的通信。鲁迪可以被认为是iceoryx的总机操作员。它的另一个主要任务是设置共享内存,应用程序使用共享内存交换有效负载数据。RouDi有时被称为守护进程,它管理共享内存并负责服务发现,即使订阅者/客户端能够找到发布者/服务器提供的主题。它还跟踪所有已初始化运行时的应用程序,从而能够创建发布者、订阅者、服务器或客户端。它为应用程序查询此信息提供了便利。
当应用程序崩溃时,RouDi会清理所有资源。由于我们的进程间机制大多是无锁的(只有最后一个锁;我们正在努力删除它),与使用锁定的传统机制相比,基于iceoryx的通信要可靠得多。

共享内存

为了实现零拷贝进程间通信,iceoryx使用共享内存方法,即发布者和订阅者或客户端和服务器可以通过共享内存进行通信,从而实现零拷贝通信。
共享内存是指多个进程可以通过映射到其虚拟地址空间中的内存区域来访问的物理内存。
有关更多信息,请参阅我们的共享内存概念文章。

Runtime

每个想要使用iceoryx的应用程序都必须实例化其运行时,这基本上实现了与RouDi的通信。
为此,需要以下代码行
iox::runtime::PoshRuntime::initRuntime(“some_unique_application_name”);

runtime是用户应用程序中的一个对象,它将共享内存映射到用户应用程序的地址空间中。
(注意)每个用户应用程序只允许有一个运行时对象。

Creating service descriptions for topics

iceoryx中的ServiceDescription表示一个主题,发布者和订阅者或客户端和服务器可以在该主题下交换数据,并由三个字符串标识符唯一标识。
1.Group name
2.Instance name
3.Topic name
由这样的字符串组成的三元组称为ServiceDescription。如果这三个字符串在元素上都相等,即组、实例和主题名称都相同,则两个ServiceDescriptions被视为匹配。这意味着可以忽略组和实例标识符来创建不同的ServiceDescriptions。它们将在未来用于高级过滤功能。
iceoryx的服务模型是从AUTOSAR派生的,并且仍然在API中使用这些名称(service、Instance、Event)。所谓的规范协议是在名称空间capo中实现的。
下表概述了不同的术语和当前映射:

服务与实例相关,就像类与C++中的对象相关一样。服务描述一个抽象主题,实例是该抽象的一个实例化,就像对象是一个实例化的类一样。事件在这种上下文中类似于类的成员。
Example:
class MyRadarService {
public:
bool hasObstacleDetected;
float distanceToObstacle;
};

MyRadarService frontLeftRadarInstance;
std::cout << frontLeftRadarInstance.hasObstacleDetected << std::endl;

例如,在iceoryx世界中,我们会订阅该服务(“MyRadarService”、“frontLeftRadarInstance”、“hasObstructureDetected”),并在检测到障碍物时接收样本。或者,我们会订阅distance ToObstruct,并收到一个恒定的数据流,显示到障碍物的距离。

限制

传输数据的数据类型可以是任何C++类、结构或纯旧数据类型,只要满足以下条件:
1.没有使用堆
2.数据结构完全包含在共享内存中——没有指向进程本地内存的指针,没有指向进程局部结构的引用,也没有动态分配器
3.数据结构必须是可重定位的,因此不能在内部使用指针/引用
4.没有虚拟成员函数

Publisher

发布者与主题相关,需要构建服务描述。如果它是类型化的,则需要额外指定数据类型作为模板参数。否则,发布者只知道原始内存,用户必须确保它被正确解释。
一旦提供了主题,就可以发布(发送)特定类型的数据。请注意,默认情况下,同一主题有多个发布者(n:m通信)。可以使用编译时选项将iceoryx限制为1:n通信。如果使用1:n通信,RouDi会检查同一主题的多个发布者,如果一个主题有多个发布器,则会引发错误。

Subscriber

对称地,订阅者也对应于主题,因此需要构建服务描述。至于出版商,我们区分打字订户和非打字订户。
一旦订阅者订阅了某个主题,它就能够接收与该主题相关的类型的数据。在非类型化的情况下,这是原始内存,用户必须注意以与实际发送的数据兼容的方式对其进行解释。
当多个发布者提供了相同的主题时,订阅者将接收所有发布者的数据(但不同发布者之间的顺序不确定)。请注意,订阅者不会从服务器或客户端接收数据,即使它们使用相同的主题。

client

与发布者和订阅者类似,客户端与主题相关,需要构建服务描述。如果客户端是类型化的,则需要将请求和响应数据类型指定为模板参数。在非类型化的情况下,客户端只知道原始内存,用户必须注意其正确解释。
一旦客户端连接到服务器,它就可以向服务器发送请求并从服务器接收响应。序列ID用于将响应与特定请求相匹配。它必须在用户请求时设置,并在用户响应时检查。

Server

与客户端一样,服务器需要构建服务描述,并且可以是类型化的或非类型化的。在类型化的情况下,用户必须提供请求和响应数据类型作为模板参数。否则,服务器处理原始内存,用户必须确保对其进行正确解释。
一旦连接,服务器就可以接收来自客户端的请求并发送相应的响应。

避免轮询

接收数据的最简单方法是定期轮询数据是否可用,如下图左侧所示,用于发布-订阅消息模式。这对于简单的用例来说已经足够了,但通常效率低下,因为它通常会导致不必要的延迟和在没有数据的情况下唤醒。接收数据的另一种方法是等待用户定义的事件发生。这是由我们的WaitSet和Listener提供的,它们将在以下部分中介绍。
在这里插入图片描述

WaitSet

WaitSet可以用来放弃控制,方法是让线程在非繁忙等待时进入睡眠状态,并等待用户定义的事件发生。通常,这些事件对应于特定订阅者或客户端的数据可用性。这样,我们可以在数据可用时立即醒来,并在没有数据可用时避免不必要的醒来。
一个典型的用例是创建一个WaitSet,连接多个订阅者和/或客户端以及用户触发器,然后等待一个或多个连接的对象发出事件信号。如果发生这种情况,则会收到一个名为notificationVector的所有已发生事件的列表。这使得当它向WaitSet发出新数据或新响应可用的信号时,可以直接从订户或客户端收集数据。
WaitSet使用reactor模式,并通过推送策略通知用户发生了一个附加事件。
有关如何使用WaitSet的更多信息,请参阅我们的WaitSet示例。

Listener

侦听器可用于将自定义回调连接到用户定义的事件。与WaitSet不同,它通过在后台线程中执行连接的自定义回调来对这些事件做出反应,该回调将由Listener创建。与WaitSet一样,后台线程在接收新数据时等待非繁忙状态。
一个用例可能是创建一个Listener并附加多个订阅者。每次有新的数据可用时,都会执行相应的连接回调,例如将某些内容打印到控制台或计算算法。另一个用例可能是,服务器连接到侦听器,每次接收到请求时,都会执行创建并发送响应的连接回调。
与WaitSet一样,Listener使用reactor模式。
有关Listener的更多信息,请参阅我们的回调示例。

API

API有两种语言,C++和C。详细信息可以在C++示例和C示例中找到。
C++API的许多部分都遵循函数式编程方法,这种方法的错误较少。这需要使用此处介绍的一元类型cxx::expected和cxx::optional。
使用C++API,我们可以区分类型化的API和非类型化的API。在类型化的API中,底层数据类型通过对某些数据类型T(通常是模板参数)的类型化指针或引用而变得明显。这允许以C++惯用和类型安全的方式处理数据,并且应该尽可能首选。类型化的API主要用于iceoryx独立使用时,即未集成到第三方框架中。
非类型化的API提供了指向数据的不透明(即无效)指针,这是灵活有效的,但也要求用户注意正确解释接收到的数据,即与实际发送的数据兼容的类型。这是与其他较低级别API交互和集成到第三方框架(如ROS)中所必需的。有关更多信息,请参阅相应的头文件。

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

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

相关文章

Go语言常用命令详解(一)

文章目录 前言常用命令go build示例参数说明 go test示例参数说明 go run示例参数说明 go clean示例参数介绍 总结写在最后 前言 Go语言是一种开源的编程语言&#xff0c;由Google开发并于2009年首次发布。它以其简洁、高效和并发性能而备受开发者的喜爱。作为一门相对年轻的语…

本地视频AI人脸替换,一键启动,傻瓜式操作

本地无须准备配置和运行环镜&#xff0c;整个压缩包下载后解压&#xff0c;一键启动程序&#xff0c;只需一张照片和一个视频&#xff0c;就可以把视频中的人物替换成您想要的人脸。支持CPU和GPU解码&#xff0c;使用GPU解码速度较快。 所有使用的软件安装包已上传网盘&#x…

提升pip速度!设置pip全局镜像源,速度飞起!

文章目录 💢 问题 💢💯 解决方案 💯🐾 镜像源🐾 镜像全局配置🍄 Windows系统🍄 Linux和macOS系统🍄 添加环境变量的方式💢 问题 💢 由于“某些网络限制”原因,我们在使用pip安装python模块的时候速度会比较慢,这个时候我们就需要用到一些镜像源,本文将…

requests 技术问题与解决方案:解决字典值中列表在URL编码时的问题

本文将探讨 issue 80 中提出的技术问题及其解决方案。该问题主要涉及如何在模型的 _encode_params 方法中处理列表作为字典值的情况。 问题背景 在处理用户提交的数据时&#xff0c;有时需要将字典序列化为 URL 编码字符串。在 requests 库中&#xff0c;这个过程通常通过 par…

点成分享丨如何提高旋转蒸发仪的蒸馏提纯效率

旋转蒸发仪&#xff1a; 主要用于医药、化工和制药等行业的浓缩、结晶、干燥、分离及溶媒回收。其原理为在真空条件下&#xff0c;恒温加热&#xff0c;使旋转瓶恒速旋转&#xff0c;物料在瓶壁形成大面积薄膜&#xff0c;高效蒸发。溶媒蒸气经高效玻璃冷凝器冷却&#xff0c;…

如何修改Hosts文件(Windows、Linux)本机配置域名解析

Hosts文件是一种在计算机网络中存储主机名与IP地址对应关系的文本文件。通过配置Hosts文件&#xff0c;可以避免在网络环境中DNS无法正常解析时&#xff0c;出现无法访问互联网的问题。 Windows修改hosts文件 1 以windows10系统为例&#xff0c;手指同时按住 windows 键和 X 键…

《洛谷深入浅出基础篇》P1536 村村通——并查集

上链接&#xff1a;P1536 村村通 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1536 上题干&#xff1a; 题目描述 某市调查城镇交通状况&#xff0c;得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程…

Flutter 3.16 发布,快来看有什么更新吧

参考原文&#xff1a;https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1 Flutter 又又又发布新季度更新啦&#xff0c;同时随着而来的还有 Dart 3.2&#xff0c;本次 3.16 开始 Material 3 会成为新的默认主题&#xff0c;另外 Android 也迎来了 Impeller 的…

力扣第797题 所有可能的路径 C++ 深度优先搜索 +java

题目 797. 所有可能的路径 中等 相关标签 深度优先搜索 广度优先搜索 图 回溯 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从…

郑州市管城区工信局局长任华民一行莅临中创算力调研指导工作

2023年11月15日&#xff0c;为深入了解企业生产经营情况&#xff0c;解决发展诉求。郑州市管城区工信局局长任华民等领导一行莅临中创算力&#xff0c;中创副总经理杨光、技术总监刘朝阳、行政主管生田等人员陪同调研。 调研期间&#xff0c;双方就生产经营、“算力数据中心”…

零基础学Python怎么学习?我来告诉你

对于IT新手来说&#xff0c;零基础学Python的话&#xff0c;之后可选择的职业方向非常多。Python全栈和爬虫一直以来都是市场的最火的就业岗位之一&#xff0c;它们的薪资回报也算是开发岗里面的顶级了。而且随着大数据和人工智能时代的到来&#xff0c;数据处理和人工智能行业…

Python | 机器学习之逻辑回归

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的…

通过注释来埋点

目录 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释&#xff0c;通过babel插件自动地&#xff0c;给相应函数插入埋点代码&#xff0c;在实现埋点逻辑和业务逻辑分离的基础上&#xff0c;配置更加灵活 这篇文章想要达到的效…

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包&#xff0c;鼠标右键&#xff0c;选择Diagrams->Show Diagram 1.2 对于UML类图中的包&#xff0c;选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…

inner join left join 什么情况效果相同

效果不同的情况 SELECT g.name AS groupName, g.root_code AS rootCode, g.data_sort AS groupDataSort, l.* FROM wise_system_point_group g LEFT JOIN wise_system_point_list l ON g.code l.group_code WHERE g.code "drug" ORDER BY g.data_sort, l.data_s…

DBA_IND_STATISTICS 字段含义

功能 展示数据库中所有索引的优化器统计信息。 字段说明 参考&#xff1a;https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000885743

骨传导式蓝牙耳机值得入手吗?盘点最值得入手的5款骨传导耳机

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…

一文解释对比学习

对比学习是一种无监督学习技术&#xff0c;其核心思想是通过比较不同样本之间的相似性和差异性来学习数据的表示&#xff08;features&#xff09;。它不依赖于标签数据&#xff0c;而是通过样本之间的相互关系&#xff0c;使得模型能够学习到有意义的特征表示。 在对比学习中…

金融行业备份容灾:如何满足严格行业标准同时实现成本效益优化?

北京时间11月9日&#xff0c;中国工商银行股份有限公司在美全资子公司——工银金融服务有限责任公司&#xff08;ICBCFS&#xff09;遭受勒索软件攻击&#xff0c;导致部分业务系统中断&#xff0c;造成部分市场的重大损失。中国工商银行的这次网络攻击事件也再次凸显了金融系统…

[Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件

Adobe XD是一个直观、强大的UI/UX开发工具&#xff0c;旨在设计、原型设计、用户之间共享材料&#xff0c;以及通过数字技术设计交互。Adobe XD为您提供开发网站、应用程序、语音界面、游戏界面、电子邮件模板等所需的一切。 无限制地创建 设计各种互动&#xff0c;创建看起来…