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

2024-05-07 11:52

本文主要是介绍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

这篇关于Type Specific Interfaces(Rolling特殊类型接口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967279

相关文章

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

特殊JSON解析

一般的与后台交互;都会涉及到接口数据的获取;而这里的数据一般情况就是JSON 了;JSON 解析起来方便;而且数据量也较小一些;所以JSON在接口数据返回中是个很不错的选择。 下面简单说下JSON解析过程中的一些案例: 这里我用到了三方的架包:fastjson-1.1.39.jar 架包 可以在我的博客中找到下载;或者网上找下 很多的; 这里主要就是映射  关系了;这就要求:实体类的名称和

广东省特殊食品生产试题分享

1.食品污染是指在各种条件下,导致有毒有害物质进入到食物中,造成以下哪项发生转变的过程。(D) A.食品的安全性 B.食品的养分性 C.食品的感官性状 D.以上都是 2.食品污染物是指(D) A.生物性污染物 B.化学性污染物 C.物理性污染物 D.以上都是 3.关于菌落总数的表达,错误的选项是(A) A.反映食品对人体安康的危害程度 B.是食品清洁状态的标志 C.推测食品的耐保藏性 D.指1g检

批量文件编码转换用python实现的utf8转gb2312,vscode设置特殊文件的默认打开编码

批量文件编码转换用python实现的utf8转gb2312, 任意编码之间的相互转换都是可以的.改一下下面的参数即可 convert.py文件内容如下 import osimport globimport chardet#检测文件编码类型def detect_file_encoding(file_path):with open(file_path, 'rb') as f:data = f

兔子--The method setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent) from the type

notification.setLatestEventInfo(context, title, message, pendingIntent);     不建议使用 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。  Intent  intent = new Intent(

AI模型:追求全能还是专精?-- 之6 语言复杂度类别(Category 0~3 类)和语言功能性类型(Type 0~Ⅲ 型)之2

Q17、我前面说过,语言复杂度的0~3级(Category 0~3)表示了语言的的上下文相关性 : 完全不相关, 单相关的 单词上下文, 双相关的句子上下文 全相关的文章上下文 。我准备翻译为 Context - irrelative /relative/correlative/ full-correlative,显式表达了语言复杂度的0~3级(Category 0~3)区别的上下文相关性是一种关

ArcGIS Pro SDK (十三)地图创作 3 特殊图层

ArcGIS Pro SDK (十三)地图创作 3 特殊图层 文章目录 ArcGIS Pro SDK (十三)地图创作 3 特殊图层1 高程表面图层1.1 创建具有地表图层的场景1.2 创建新的高程表面1.3 将自定义高程表面设置为 Z 感知图层1.4 将高程源添加到现有高程表面图层1.5 从地图中获取高程表面图层和高程源图层1.6 查找高程表面图层1.7 移除高程表面图层1.8 从曲面获