当前位置: 首页 > news >正文

FastDDS-0.简介



FastDDS简介

eProsima Fast DDS 是 DDS (Data Distribution Service) 协议的一个C++语言实现版本,该协议由 Object Management Group (OMG) 组织定义。
eProsima Fast DDS 库既提供了一个应用编程接口(API),又提供了一种通信协议,使用这种通信协议可以部署以数据为中心的发布者-订阅者模型。这些模型的目的是为实时系统建立高效可靠的数据分发功能。
eProsima Fast DDS 在资源处理方面是可预测,可扩展,灵活以及高效的。
为了实现这些功能,它使用了类型接口,并且依赖多对多的分布式网络范式,这些使得进行通信的发布者与订阅者可以分离解耦。

eProsima Fast DDS 包含:
(1)The DDS API 实现。
(2)Fast DDS-Gen, 一个代码生成工具,用来将类型化接口和中间件实现连接起来。
(3)下层的 RTPS 协议实现。

由于有上述特性, eProsima Fast DDS 目前已经被选为ROS2系统的默认中间件。



DDSAPI

DDS采用的通信模型是多对多单项数据交换,生产数据的应用程序发布数据到消费者应用程序的本地缓存中。 数据流由负责数据交换的实体根据QOS来进行调节。

作为一个以数据为中心的模型,DDS建立在“全局数据空间“(”global data space”)的概念上,该数据空间是所有对数据有兴趣的应用都可以访问的。想要发布数据的应用需要声明它们的意图,以便成为数据的发布者。同时,想要获取全局空间数据的应用也需要声明意图,用于成为数据的订阅者。每当发布者发布一个新的数据到这个数据空间,中间件会将这个数据传递给所有对该数据感兴趣的订阅者。

数据交换是在域内进行的,域是一个隔离的抽象平面,它把所有能够相互通信的分布式应用程序连接在一起。只有属于同一个域的实体才能够互相通信,发布数据的实体和订阅数据的实体是通过主题来进行匹配的。

topic有明确的标识符,并将一个名称和一种数据类型和一组附加的数据特定的QoS。

DDS实体是一个类,或者一个类型接口。类型化接口意味着更高效的资源处理,因为其能够获取数据的类型的特点可以在处理数据前就提前分配存储空间,而不是处理时动态分配存储空间。


上面的示意图解释了在DDS域之间信息如何流转。只有属于同一个域的实体可以通过匹配主题的方式发现对方,从而可以在发布者和订阅者之间交换数据。



Fast DDS-Gen

对接口的依赖意味着需要有一种生成工具,这种生成工具可以将类型描述翻译成合适的代码实现,这个工具可以填补接口定义和中间件之间的空缺。这个任务由一个专用的生成工具来执行——Fast DDS-Gen, 一个java应用程序,它根据IDL (Interface Definition Language) 文件中的数据类型定义生成源代码。



RTPS Wire Protocol

eProsima Fast DDS 通过标准网络进行数据交换所使用的协议是RTPS,一个由OMG定义并且维护的DDS互操作有线协议。这个协议提供了基于TCP/UDP/IP传输的发布订阅通信功能,并且使得FastDDS和其他的DDS实现之间保持兼容。

鉴于发布-订阅根节点、以及为了满足DDS应用程序域所要解决的相同的需求而设计的规范, RTPS协议映射到了许多DDS概念,因此其是DDS实现的自然选择。所有的RTPS核心实体通过RTPS域被连接在一起,RTPS域代表了隔离的通信平面,在这个通信平面可以让各个通信端点进行匹配。RTPS协议中的实体和DDS实体一对一的对应,从而完成相互的数据通信。



Main Features

  • 两层API(Two API Layers). FastDDS 由一个高层的DDS兼容层和一个底层的RTPS兼容层组成,高层dds层关注的可用性,低层的dds层可以更好的访问rtps协议。

  • 实时性能表现(Real-Time behaviour). FastDDS 可以通过配置来提供特定时间约束下的实时性保证。

  • 内建的发现服务器(Built-in Discovery Server). FastDDS 是建立在对于已存在的发布者和订阅者的动态发现机制上,这套机制并不需要设定任何服务器。尽管如此,FastDDS也是可以被设置为客户端-服务器模式的。

  • 同步和异步的发布模式(Sync and Async publication modes). FastDDS 支持同步和异步两种数据发布模式。

  • 更好并且更可靠的通信(Best effort and reliable communication). FastDDS 中可以选择基于类似UDP传输协议的可靠通信模式。此外,可以设置基于TCP传输协议的可靠通信模式。

  • 传输层(Transport layers). FastDDS 实现了一个插件化的传输层架构,当前的版本实现了五种传输层协议:UDPv4, UDPv6, TCPv4, TCPv6 and SHM (shared memory).

  • 安全(Security). FastDDS 通过配置,可以提供安全的通信。为了实现安全通信, 它在三个方面实现了可配置的安全性:远程参与者的验证,实体的访问控制,数据的加密。

  • 统计模块. FastDDS 可以配置拥有能够统计通信数据量。

  • 流量控制(Flow controllers). FastDDS支持用户配置流量控制,用户可以手动配置在特定环境下的数据发送量(吞吐量)。

  • 即插即用的连接(Plug-and-play Connectivity). 新的应用和服务可以自动的被发现,可以在任意时刻加入或者离开离开通信网络。发现,加入和退出,这些操作都不需要事先进行配置。

  • 可扩展性和灵活性(Scalability and Flexibility). DDS建立了全局数据空间的概念。中间件负责在发布者和订阅者之间传送信息。这保证了分布式网络能够适应重新配置以及拓展更多的实体。

  • 应用可移植性(Application Portability). DDS规范可以将IDL映射到特定平台,允许使用DDS的应用可以在不修改代码的情况下,仅仅重新编译即可切换不同的DDS实现(例如RTPS)。

  • 可拓展性(Extensibility). eProsima Fast DDS 允许新的服务在不改变兼容和互操作性的前提下拓展和增强协议。

  • 配置和模块化(Configurability and Modularity). FastDDS 提供了直观的方式让用户进行配置,可以通过代码或者xml配置文件来进行配置。而模块化使得运行协议简单子集的设备也可以加入分布式网络中。

  • 高性能(High performance). eProsima Fast DDS 使用静态的底层序列化库FastCDR ,一个C++库,根据标准CDR序列机制对数据进行序列化操作。CDR序列化在RTPS Specification中定义.

  • 易用性(Easy to use). 项目中自带了开箱的范例程序, DDSHelloWorld (参阅 Getting Started) 中有一个发布者和一个订阅者之间的通信范例,展示了FastDDS应该如何部署使用。此外,一个交互的示例ShapesDemo也可以帮助开发者进入dds世界。DDS层和RTPS层在 DDS Layer 和RTPS Layer两章节中也做了详细解释。

  • 低开销(Low resources consumption). FastDDS:

    • 预先分配资源,最小化动态资源分配
    • 避免使用没有边界的资源
    • 将数据拷贝降到最低,基本不需要数据拷贝
  • 多平台(Multi-platform). OS依赖部分设置为可插拔的模块。用户可以轻易的使用基于目标系统平台的FastDDS库来实现平台模块,默认情况,应用可以运行在 Linux, Windows 和MacOS.

  • 开源。



相关文章:

FastDDS-0.简介

FastDDS简介 eProsima Fast DDS 是 DDS (Data Distribution Service) 协议的一个C语言实现版本,该协议由 Object Management Group (OMG) 组织定义。 eProsima Fast DDS 库既提供了一个应用编程接口(API),又提供了一种通信协议&a…...

Flutter入门进阶之旅 -开源Flutter项目

开源Flutter项目 该项目为纯flutter端项目,采用aar方式寄生在原生APP中,作为APP中的一个独立模块 在业务逻辑上做到与原生APP完全隔离,Flutter端开发者,可完全不用关注原生端的业务模块 两端开发彼此业务隔离,缩小了对…...

Opencv项目实战:21 美国ASL手势识别

0、项目介绍 首先,我可以保证在这里,你并不需要多么了解深的机器学习算法,我的初衷是通过本项目,激发大家学习机器学习的动力。选择这种手势原因是因为只有24个字母,你的电脑足以带的动,虽然我只训练A、B、…...

强化学习RL 01: Reinforcement Learning 基础

目录 RL理解要点 1. RL数学基础 1.1 Random Variable 随机变量 1.2 概率密度函数 Probability Density Function(PDF) 1.3 期望 Expectation 1.4 随机抽样 Random Sampling 2. RL术语 Terminologies 2.1 agent、state 和 action 2.2 策略 policy π 2.3 奖励 reward …...

C语言之练习题合集

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 文章目录leetcode 题号:728. 自除数leetcode 题号:238.…...

sublimeText3新建文件自动添加注释头

参考: https://github.com/shiyanhui/FileHeader/blob/master/README.rst https://packagecontrol.io/packages/FileHeader https://github.com/shiyanhui/FileHeader fileheader:https://codeload.github.com/shiyanhui/FileHeader/zip/refs/heads/m…...

AndroidStudio打包HBuilderX的H5+项目为安卓App【一次过,无任何异常报错】

目录 1.查看HBuilderX的版本号 2.下载Dcloud上对应的安卓SDK 3.下载完安卓SDK后,我们解压它,注意不要放在任何有中文组成的文件夹中【是否有中文决定于你鼠标单击上面路径后,第一张图还没鼠标单击,第二张已鼠标单击&#xff0c…...

【Linux】进程概念

目录 一、基本概念 二、查看进程 三、系统调用获取进程标示符 1、获取自己的PID 2、获取父进程的PID 四、创建进程 1、初识fork 2、使用fork的方式 五、进程状态 1、阻塞 2、挂起 3、R状态 4、S状态 5、D状态 6、T状态 6.1、kill指令 6.2、暂停进程与继续进程 …...

使用pyinstaller库打包exe时显示KeyError怎么办

PyInstaller是一个Python库,用于将Python应用程序转换为独立的可执行文件(executable)文件,支持多平台。它可以将Python解释器、依赖的库和脚本打包成一个单独的可执行文件,从而使应用程序可以独立运行,而无…...

k8s新增节点机器,无法拉取和推送镜像的解决方案

1、首先检查配置,查看镜像仓库是否已授权,若无授权,则进行授权。 命令:cat /etc/systemd/system/docker.service.d/docker-options.conf内容如果有这样一句就是已经授权,如果没有,就需要把这句加进去&…...

测试报告踩坑的点

测试报告作为测试人员的核心输出项,是体现自己工作价值的重要承载工具,需要我们认真对待,所以我们要重视测试报告的输出,那么在编写测试报告的时候,我们有哪些点需要注意的呢? 01 不要乱用模板 很多测试新人在编写测试…...

【Java】创建多线程的四种方式

一、方式1:继承Thread类 步骤: 创建一个继承于Thread类的子类重写Thread类的run()方法 ----> 此线程执行的操作声明在方法体中创建当前Thread子类的对象通过实例对象调用start()方法,启动线程 ----> Java虚拟机会调用run()方法 注意…...

【数据结构】队列的接口实现(附图解和源码)

队列的接口实现(附图解和源码) 文章目录队列的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.初始化队列2.销毁队列3.队尾入队列4.判断队列是否为空5.队头出队列6.获取队列头部元素7…...

日本知名动画公司东映动画加入 The Sandbox 元宇宙

与 Minto 合作将东映动画的 IP 呈现在元宇宙。 The Sandbox 很荣幸能与东映动画合作,与 Minto 携手在 The Sandbox 元宇宙中创建基于东映动画 IP 的相关体验。 作为日本动画的先驱,东映动画制作了日本最大和世界领先的动画作品,包括《龙珠》、…...

QuickHMI Hawk R3 Crack

基于网络的 SCADA / HMI 系统 QuickHMI Hawk R3 QuickHMI是一个 100% 基于网络的SCADA/HMI 系统。 得益于HTML5、SVG和Javascript等现代网络技术,可视化可以在任何当前浏览器和设备中显示。作为浏览器的替代品,可以使用“独立查看器”和移动应用程序。 Q…...

【C语言】寻找隐藏字母游戏

编程实现一个游戏程序,会将连续三个字母中的一个隐去,由玩家填写隐去的那个字母,如屏幕上显示A ? C,则玩家需要输入B;屏幕上显示?B C,则玩家需要输入A。记录玩家完成20次游戏的时间以及正确率。…...

【C++】list 相关接口的模拟实现

list 模拟实现回顾准备构造析构函数的构造构造方法析构方法赋值运算符重载容量相关接口元素获取元素修改相关接口push 、popinserterase清空交换迭代器 **(重点)迭代器基本概念迭代器模拟实现回顾 在上一篇博客中我们大致了解了 list 相关接口的使用方法…...

快速找到外贸客户的9种方法(建议收藏)

所有外贸企业想要做好外贸出口的头等大事,就是要快速的找到优质的外贸客户和订单,没有订单的达成,所有的努力都是图劳,还有可能会陷入一种虚假的繁荣,每天都很忙,但是没有结果。今天,小编就来分…...

TCP状态转换

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP状态转换专栏:《Linux从小白到大神》《网络编程》 TCP状态转换示意图如下 针对上面的示…...

3500年里,印度被11个文明征服

转自:3500年里,印度被11个文明征服,如今看似统一,实际上却是缝合怪 (qq.com)今天的印度是亚洲第二大国,南亚第一大国,世界第二人口大国。如果我们将时间线拉长,纵观历史的长河,就会惊…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...