Type Specific Interfaces(Rolling特殊类型接口)

Type Specific Interfaces

一直以来,API的某些部分必然特定于所交换的消息类型,例如发布消息或订阅主题,因此需要为每个消息类型生成代码。下图布局了从用户定义的rosidl文件(如.msg文件)到用户和系统用于执行特定类型功能的特定类型代码的路径:
在这里插入图片描述
图:“静态”类型支持生成的流程图,从rosidl文件到面向用户的代码。
图的右侧显示了.msg文件是如何直接传递给特定语言的代码生成器的,例如rosidl_generator_cpp或rosidl_generator_py。这些生成器负责创建用户将包含(或导入)的代码,并用作.msg文件中定义的消息的内存表示。例如,考虑消息std_msgs/String,用户可能会在C++中使用此文件,并使用语句#include<std_msgs/msg/String.hpp>,或者在Python中使用std_msgs.msg-import String中的语句。这些语句之所以有效,是因为这些特定于语言(但与中间件无关)的生成器包生成了文件。
另外,.msg文件用于为每个类型生成类型支持代码。在这种情况下,类型支持意味着:特定于给定类型并由系统用于执行给定类型的特定任务的元数据或函数。对给定消息的类型支持可能包括消息中每个字段的名称和类型列表。它还可能包含对代码的引用,这些代码可以执行该类型的特定任务,例如发布消息。

Static Type Support

当类型支持引用代码来执行特定消息类型的特定功能时,该代码有时需要执行特定于中间件的工作。例如,考虑特定于类型的发布函数,当使用“vendor a”时,该函数需要调用“vendor B”的某些API,但当使用“vendor B”时,它需要调用“VendorB”的API。为了允许使用特定于中间件供应商的代码,用户定义的.msg文件可能会导致生成特定于供应商的代码。通过类型支持抽象,该特定于供应商代码仍然对用户隐藏,这类似于“Private Implementation”(或Pimpl)模式的工作方式。

Static Type Support with DDS

对于基于DDS的中间件供应商,特别是那些基于OMG IDL文件(.IDL文件)生成代码的供应商,用户定义的rosidl文件(.msg文件)将转换为等效的OMG IDL文件(.id1文件)。从这些OMG IDL文件中,创建特定于供应商的代码,然后在特定于类型的函数中使用,这些函数由给定类型的类型支持引用。上图在左侧显示了这一点,其中.msg文件由rosidl_dds包使用以生成.idl文件,然后将这些.idl文件提供给特定于语言和特定于dds供应商的类型支持生成包。

例如,考虑Fast DDS实现,它有一个名为rosidl_typesupport_fastrtps_cpp的包。这个包负责生成代码来处理诸如将C++消息对象转换为要在网络上写入的串行八位字节缓冲区之类的事情。这个代码虽然特定于Fast DDS,但由于类型支持代码中的抽象,仍然没有向用户公开。

Dynamic Type Support

实现类型支持的另一种方法是为发布到主题之类的事情提供通用函数,而不是为每个消息类型生成函数的版本。为了实现这一点,这个通用函数需要一些关于正在发布的消息类型的元信息,比如字段名和类型在消息类型中出现的顺序列表。然后,要发布消息,您需要调用一个通用发布函数,并传递一个要发布的消息以及一个包含有关消息类型的必要元数据的结构。这被称为“动态”类型支持,而“静态”类型支持需要为每个类型生成函数的版本。
在这里插入图片描述
图:“动态”类型支持生成的流程图,从rosidl文件到面向用户的代码。
上图显示了从用户定义的rosidl文件到生成的面向用户的代码的流程。它与静态类型支持的图表非常相似,不同之处仅在于如何生成类型支持(由图表的左侧表示)。在动态类型支持中,.msg文件直接转换为面向用户的代码。
此代码也是中间件无关的,因为它只包含有关消息的元信息。实际完成工作的函数,例如发布到主题,是消息类型的通用函数,将对中间件特定的API进行任何必要的调用。请注意,与静态类型支持中的情况不同,这种方法具有用于每种语言的中间件无关的包,例如rosidl_typesupport_introspection_c和rosidl_ypesupport_intropection_cpp,而不是提供类型支持代码的特定于dds供应商的包。包名称的内省部分指的是使用为消息类型生成的元数据内省任何消息实例的能力。这是允许“发布到主题”等函数的通用实现的基本功能。
这种方法的优点是,所有生成的代码都与中间件无关,这意味着它可以被不同的中间件实现重用,只要它们允许动态类型支持。它还导致生成的代码更少,从而减少了编译时间和代码大小。
然而,动态类型支持要求底层中间件支持类似形式的动态类型支持。在DDS的情况下,DDS XTypes标准允许使用元信息而不是生成的代码发布消息。为了支持动态类型支持,底层中间件中需要DDSXTypes或类似的东西。此外,这种类型支持方法通常比静态类型支持方法慢。静态类型支持中的特定类型生成的代码可以写得更高效,因为它不需要迭代消息类型的元数据来执行序列化等操作。

参考

rosidl

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

透明屏幕的可视角度有多大?在不同角度观看显示效果是否受影响?

透明屏幕的可视角度大小会因不同的技术、设计和应用场景而有所差异。以OLED透明屏为例,其可视角度通常可以达到178/178,这意味着在广阔范围内,观察者都能保持清晰的视觉效果。 然而,在不同角度观看透明屏幕时,显示效果…

【七十九】【算法分析与设计】并查集模板!!!并查集的实现_牛客题霸_牛客网,【模板】并查集 - 洛谷,并查集代码!!!

并查集的实现_牛客题霸_牛客网 描述 给定一个没有重复值的整形数组arr,初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构,并提供以下两个操作。 boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合 void u…

python从0开始学习(四)

目录 前言 1、算数运算符 1.1 //:整除运算符 1.2 %:取模操作 1.3 **:幂运算 2、赋值运算符 3、比较运算符 4、逻辑运算符 5、位运算符 5.1 &:按位与 5.2 |:按位或 5.3 ^:按位异或 5.4 ~:按位取反 5.5…

细粒度数据设计对于微调的重要性

原文地址:the-importance-of-granular-data-design-for-fine-tuning 利用数据设计来训练LLM,以充分利用上下文,同时解决“Lost-In-The-Middle”的挑战。 2024 年 5 月 2 日 介绍 对话设计师难道不是杰出的数据设计师吗? 请允许我详…

机器学习之基于Jupyter中国环境治理投资数据分析及可视化

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 机器学习之基于Jupyter中国环境治理投资数据分析及可视化项目是一个结合了机器学习和数据可视化技术的项目&#xf…

【算法练级js+java】重复给定字符n次

题目 Repeats the given string n times.(复制指定的字符串n次) 期望结果 /** * Repeats the given string n times. * * repeat(‘, 3) * // > **’ * * repeat(‘abc’, 2) * // > ‘abcabc’ * * repeat(‘abc’, 0) * // > “” **/ 代码…

一步教你网站怎么免费实现https,看这里!!

要想网站实现https访问最简单有效的方法就是安装SSL证书。只要证书安装上,浏览器就不会再有提示网站不安全或者访问被拦截的情况。现在我来教大家怎么去获取免费的SSL证书,又怎么安装来证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提供免…

excel公式后面加的““是什么意思呢?

这个大体上有两种用意。 1.将数值转换成文本 VLOOKUP(F2,A:C,3,0) 举个使用VLOOKUP函数的场景,如下图所示,员工信息表A:C区域中,A列员工号是文本型数字,使用VLOOKUP函数查询找的时候,F列的员工号数值型、文本型都有…

SinoDB数据库的RAW TABLE

RAW表是不记录日志的永久表,类似于无日志模式数据库中的表。对于RAW表,支持对其进行更新、插入和删除操作,但日志是不会记录这些操作。可以在RAW表上定义索引,但不能在RAW表上定义唯一约束、主键约束或引用约束(refere…

java SPI思想机制

目录 如何解释简单概括SPI 和 APISPI 实现原理(重要-线程上下文类加载器) 如何使用一个Demo功能介绍使用效果(直接在本地模拟服务商提供服务)使用效果(通过 jar 的方式引入) 应用分析参考文章 如何解释 简…

【Altium】AD-在原理图中如何绘制贝塞尔曲线

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在原理图中绘制贝塞尔曲线的方法 2、 问题场景 贝塞尔曲线主要用来描述各种波形曲线,如正弦、余弦曲线等。贝塞尔曲线的绘制和直线类似,需要固定多个顶点(最少4个)后即…

深度学习之基于Matlab特征匹配的手写电话号码、数字识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在信息化日益发展的今天,手写电话号码和数字的识别技术显得尤为重要。这种技术不仅能够提…

包管理工具npm的安装和使用

包管理工具 管理 包 的应用软件,可以对 包 进行下载 安装,更新,删除,上传 等操作。 借助包管理工具,可以快速开发项目,提升开发效率。 包管理工具是一个通用的概念,很多编程语言都有包管理工…

【统计推断】-01 抽样原理之(六):三个示例

目录 一、说明二、处理有限的、大尺度的母体抽样三、非参数的估计四、连续母体抽样技巧--分箱 一、说明 对于抽样问题,前几期文章都是理论探讨。本篇给出若干示例,展现具体的情况下,面对数据,如何给出处理策略。 二、处理有限的…

73. 矩阵置零/54. 螺旋矩阵

73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 思路&#x…

微信/支付宝支付服务搭建,一次性搞定!

微信支付 付款码支付 付款码支付是指用户展示微信钱包内的“付款码”给商户系统扫描后直接完成支付,适用于线下场所面对面收银的场景,例如商超、便利店、餐饮、医院、学校、电影院和旅游景区等具有明确经营地址的实体场所JSAPI支付 JSAPI支付是指商户通过…

OpenCV 库来捕获和处理视频输入和相似度测量(73)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :使用 OpenCV 创建视频(74) ​ 目标 如今,拥有数字视频录制系统供您使用是很常见的。因此,您最终会遇到不再处理一批图像&#xf…

连锁收银系统总仓到门店库存调拨操作教程

1、进入系统后台,系统后台登录网址: 2、点击商品>门店调拨 3、选择调出仓库和调入门店 4、可选择添加商品逐个进行调拨,也可以批量导入需要调拨的商品 然后点击确定。 5、新增调拨后,系统会显示“待出库”状态 6、仓库已经准备…

Python 中使用私有成员的子类化

1、问题背景 Python 语言中,变量名与访问器同名是一个非常好的特性: self.__value 1def value():return self.__value但是,当我们想要子类化一个类,并访问其私有成员时,却没有一种简单的方法。通常,我们…

高速、简单、安全的以太彩光,锐捷网络发布极简以太全光 3.X 方案

从 2021 年 3 月正式推出到现在,锐捷网络极简以太全光方案已经走进第四个年头。IT 仍在不断向前发展,数字化进程深入,数字化业务增多,更广泛的终端设备接入企业级园区网络,对园区网络提出了更高的要求,例如…
最新文章