FastDDS:第一节

1. FastDDS

1.1. 什么是 FastDDS

1.1.1. 关键特性

1.1.2. DDS API

1.1.3. Fast DDS-Gen

1.1.4. RTPS 有线协议

1.1.5. 主要特点

1.2. 入门

1.2.1. 什么是 DDS

1.2.2. 什么是 RTPS


1. FastDDS

1.1. 什么是 FastDDS

DDS 是一套标准,它有很多实现,有商业的,也有开源的。

商业:RTI 开源: Cyclone DDS、Fast-DDS

所以,Fast DDS 是一个 C 实现 DDS(数据分发服务)规范,一种协议 由对象管理组(OMG)定义。 eProsima Fast DDS 库提供了 API (Application Programming Interface)和通信协议 ,部署 以数据为中心的发布者-订阅者(DCPS)模型,目的是建立高效、可靠的服务 实时系统之间的信息分布。

1.1.1. 关键特性

eProsima Fast DDS 在资源处理方面具有可预测、可扩展、灵活和高效的特点。 为了满足这些需求,它使用类型化接口并依赖于多对多 分布式网络范例,巧妙地允许通信的发布者和订阅者分离。 eProsima 快速 DDS 包括:

  • DDS API,DDS API 实现。
  • Fast DDS-Gen,用于桥接类型接口与中间件的生成工具 实现。
  • RTPS ,RTPS 底层有线协议实现。

对于上述所有功能,eProsima Fast DDS 被选为缺省中间件 机器人操作系统 2 (ROS 2)在每一个长期(LTS)的发布和大部分 非 lts 版本。

1.1.2. DDS API

DDS 采用的通信模型是一种多对多的单向数据交换,其中应用程序 生成数据,将其发布到属于使用该数据的应用程序的订阅者的本地缓存。 信息流由在实体之间建立的服务质量(QoS)策略来调节 负责数据交换。

作为一个以数据为中心的模型,DDS 建立在所有相关应用程序都可以访问的“全局数据空间”的概念之上。 想要提供信息的应用程序声明它们想要成为发布者,希望访问数据空间的人声明自己有意成为订阅者。 每当发布者将新数据发布到此空间时,中间件都会将该信息传播给所有感兴趣的用户。

通信发生在同一域中,只有属于同一域的实体才能进行交互,发布数据的实体由主题作为中介。主题是明确的标识符,它将域中唯一的名称与数据类型以及一组特定于数据的 QoS 关联起来。

DDS 实体可以建模为类或类型化接口。后者意味着更高效的资源处理,因为在执行之前了解数据类型可以提前分配内存,而不是动态分配。

DDS 域内信息流动的概念图。只有属于同一域的实体才能通过匹配的主题相互发现,从而在发布者和订阅者之间交换数据

1.1.3. Fast DDS-Gen

依赖接口意味着需要一个生成工具,将类型描述转换为合适的实现,以填补接口和中间件之间的空白。这项任务由专用的生成工具 Fast DDS-Gen执行,这是一个 Java 应用程序,它使用接口定义语言 (IDL)文件中定义的数据类型生成源代码

1.1.4. RTPS 有线协议

eProsima Fast DDS 在标准网络上交换消息时使用的协议是实时发布-订阅协议 (RTPS),这是由 OMG 联盟定义和维护的 DDS 互操作性有线协议。该协议通过 TCP/UDP/IP 等传输协议提供发布者-订阅者通信,并确保不同 DDS 实现之间的兼容性。

鉴于其发布-订阅模式的根源,以及其规范旨在满足 DDS 应用领域所提出的相同需求,RTPS 协议能够映射到许多 DDS 概念,因此成为 DDS 实现的自然之选。所有 RTPS 核心实体都与一个 RTPS 域相关联,该域代表一个端点匹配的隔离通信平面。RTPS 协议中指定的实体与 DDS 实体一一对应,从而允许进行通信。

1.1.5. 主要特点

  • 两个 API 层。eProsima Fast DDS 包含一个专注于可用性的高级 DDS 兼容层和一个提供对 RTPS 协议更精细访问的低级 RTPS 兼容层。

  • 实时行为。eProsima Fast DDS 可配置为提供实时功能,保证在指定的时间限制内做出响应。

  • 内置发现服务器。eProsima Fast DDS 基于对现有发布者和订阅者的动态发现,并持续执行此任务,无需连接或设置任何服务器。此外,还可以配置客户端-服务器发现以及其他发现模式。

  • 同步和异步发布模式。eProsima Fast DDS 支持同步和异步数据发布。

  • 尽力而为且可靠的通信。eProsima Fast DDS 支持基于 UDP 等“尽力而为”通信协议的可选可靠通信模式。此外,另一种设置可靠通信的方法是使用我们的 TCP 传输协议。

  • 传输层。eProsima Fast DDS 实现了可插拔传输架构。当前版本实现了五种传输协议:UDPv4、UDPv6、TCPv4、TCPv6 和 SHM(共享内存)。

  • 安全性。eProsima Fast DDS 可配置为提供安全通信。为此,它实现了三个级别的可插拔安全性:远程参与者的身份验证、实体的访问控制和数据加密。

  • 统计模块。eProsima Fast DDS 可以配置为收集并提供有关用户应用程序正在交换的数据的信息。

  • 流量控制器。我们支持用户可配置的流量控制器,可用于限制在特定条件下发送的数据量。

  • 即插即用连接。新的应用程序和服务会被自动发现,并且可以随时加入或离开网络,无需重新配置。

  • 可扩展性和灵活性。DDS 建立在全局数据空间的概念之上。中间件负责在发布者和订阅者之间传播信息。这保证了分布式网络能够适应重新配置,并可扩展到大量实体。

  • 应用程序可移植性。DDS 规范包含一个特定于平台的 IDL 映射,允许使用 DDS 的应用程序仅通过重新编译即可在 DDS 实现之间切换。

  • 可扩展性。eProsima Fast DDS 允许使用新服务扩展和增强协议,而不会破坏向后兼容性和互操作性。

  • 可配置性和模块化。eProsima Fast DDS 提供直观的配置方式,可通过代码或 XML 配置文件进行配置。模块化设计允许简单设备实现协议子集,同时仍可参与网络。

  • 高性能。eProsima Fast DDS 使用静态低级序列化库 Fast CDR,这是一个 C++ 库,根据 RTPS 规范中定义的标准 CDR 序列化机制进行序列化(请参阅数据封装章节作为参考)。

  • 易于使用。该项目附带一个开箱即用的示例 DDSHelloWorld(参见入门指南),用于实现发布者和订阅者的通信,并展示如何部署 eProsima Fast DDS 。此外,用户还可以使用交互式演示 ShapesDemo 深入了解 DDS 的世界。DDS 层和 RTPS 层部分详细解释了 DDSRTPS 层

  • 低资源消耗。eProsima Fast DDS:

    • 允许预先分配资源,以最小化动态资源分配。
    • 避免使用不受限制的资源。
    • 最大限度地减少复制数据的需要。
  • 多平台。操作系统依赖项被视为可插拔模块。用户可以使用 eProsima Fast DDS 库在其目标平台上轻松实现平台模块。默认情况下,该项目可在 Linux、Windows 和 MacOS 上运行。

  • 免费开源。Fast DDS 库、底层 RTPS 库、生成器工具、内部依赖项(例如 eProsima Fast CDR)以及外部依赖项(例如 foonathan 库)均为免费开源。

1.2. 入门

1.2.1. 什么是 DDS

数据分发服务(DDS)是一种以数据为中心的通信协议,用于分布式软件应用程序通信。它描述了实现数据提供者和数据消费者之间通信的通信应用程序编程接口 (API) 和通信语义。

由于它是一种以数据中心为中心发布订阅(DCPS)模型,因此在其实现中定义了三个关键的应用实体:发布实体,定义信息生成对象及其属性;订阅实体,定义信息消费对象及其属性;配置实体,定义作为主题传输的信息类型,并创建具有服务质量(QoS)属性的发布者和订阅者,确保上述实体的正确性能。

DDS 使用 QoS 来定义 DDS 实体的行为特征。QoS 由各个 QoS 策略(派生自 QoSPolicy 类型的对象)组成。

DCPS 概念模型

在 DCPS 模型中,为开发通信应用系统定义了四个基本元素。

  • 发布者 (Publisher)。它是 DCPS 实体,负责创建和配置其实现的 DataWriter。DataWriter 是负责实际发布消息的实体。每个 DataWriter 都会分配一个主题(Topic),消息将在该主题下发布。更多详情,请参阅发布者。
  • 订阅者 (Subscriber)。它是 DCPS 实体,负责接收其订阅的主题下发布的数据。它服务于一个或多个 DataReader 对象,这些对象负责将新数据的可用性告知应用程序。有关更多详细信息,请参阅订阅者
  • 主题 (Topic )。它是绑定发布和订阅的实体。它在 DDS 域内是唯一的。通过 TopicDescription,它允许发布和订阅的数据类型统一。有关更多详细信息,请参阅主题 (Topic) 。
  • 域。这是用于链接属于一个或多个应用程序的所有发布者和订阅者的概念,这些应用程序在不同主题下交换数据。参与域的这些单个应用程序称为 域参与者。DDS 域由域 ID 标识。域参与者定义域 ID 以指定其所属的 DDS 域。具有不同 ID 的两个域参与者彼此不知道对方在网络中的存在。因此,可以创建多个通信通道。这适用于涉及多个 DDS 应用程序的场景,它们各自的域参与者相互通信,但这些应用程序不得干扰。域参与者充当其他 DCPS 实体的容器,充当发布者、订阅者和主题实体的工厂,并在域中提供管理服务。有关更多详细信息,请参阅

1.2.2. 什么是 RTPS

RTPS 是 Real-Time Publish Subscribe 的缩写,它是 DDS 的通信中间件,是发布-订阅模式,通信能力强大,支持 UDP/IP、TCP 及共享内存。

RTPS 是 DDS 通信的根基,它内部有一样重要的概念:

RTPS 中定义了一个 Domain 的概念,它定义了一个单独的通信平面。几个域可以同时独立地共存。一个域包含任意数量的 RTPSParticipant,即能够发送和接收数据的元素。

RTPSParticipants 使用 EndPoint 进行通信:

  • RTPSWriter:能够发送数据的 EndPoint 端点。
  • RTPSReader:能够接收数据的 EndPoint 端点。

RTPSParticipant 可以有任意数量的写入器和读取器端点。

Topic 定义和标记正在交换的数据。主题不属于特定 DomainParticipant。DomainParticipant 通过 RTPSWriters 对 Topic 发布的数据进行更改,并通过 RTPSReaders 接收与其订阅的 Topic 相关的数据。

在 Fast DDS 中最基础的通信单元称为 Change,它表示在 Topic 下写入的数据的更新。RTPSReaders /RTPSWriters 将这些更改记录在其历史记录 (History ) 中,历史记录是一种用作更新缓存的数据结构。

在 eProsima Fast DDS 的默认配置中,当您通过 RTPSWriter 端点发布更改时,会在后台执行以下步骤:

  1. Change 将添加到 RTPSWriter 的 History 中。
  2. RTPSWriter 将 Change 发送到它知道的任何 RTPSReaders。
  3. 接收到数据后,RTPSReaders 用新的 Change 更新他们的 History。

Fast DDS 支持多种配置,允许更改 RTPSWriters/RTPSReaders 的行为。修改 RTPS 实体的默认配置意味着 RTPSWriters 和 RTPSReaders 之间的数据交换流发生变化。此外,通过选择服务质量 (QoS) 策略,您可以通过多种方式影响这些历史缓存的管理方式,但通信循环保持不变。

`class SubListener : public eprosima::fastdds::dds::DataReaderListener` 是一个C++类定义,表示 `SubListener` 类继承自 `eprosima::fastdds::dds::DataReaderListener` 类。这里是一些关键点的解释: 1. **继承**:`SubListener` 类通过 `public` 继承方式继承自 `eprosima::fastdds::dds::DataReaderListener` 类。这意味着 `SubListener` 类将继承 `DataReaderListener` 类的所有公有和保护成员。 2. **DataReaderListener**:`eprosima::fastdds::dds::DataReaderListener` 是一个监听器类,通常用于处理数据读取器(DataReader)的事件。数据读取器用于从DDS(Data Distribution Service)中的主题(Topic)读取数据。 3. **自定义监听器**:`SubListener` 类通过继承 `DataReaderListener` 类,可以重写其虚函数,以实现自定义的事件处理逻辑。例如,可以重写 `on_data_available` 方法来处理数据到达的事件。 以下是一个简单的示例代码,展示了如何实现 `SubListener` 类: ```cpp #include <fastdds/dds/subscriber/DataReaderListener.hpp> #include <fastdds/dds/subscriber/qos/DataReaderQos.hpp> #include <fastdds/dds/subscriber/Subscriber.hpp> #include <fastdds/dds/subscriber/DataReader.hpp> class SubListener : public eprosima::fastdds::dds::DataReaderListener { public: SubListener() {} virtual ~SubListener() {} virtual void on_data_available(eprosima::fastdds::dds::DataReader* reader) override { // 自定义的数据处理逻辑 // 例如,读取数据并进行处理 } virtual void on_subscription_matched(eprosima::fastdds::dds::DataReader* reader, const eprosima::fastdds::dds::SubscriptionMatchedInfo& info) override { // 处理订阅匹配事件 } // 其他需要重写的方法 }; ``` 在这个示例中,`SubListener` 类重写了 `on_data_available` 和 `on_subscription_matched` 方法,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值