Fast DDS简介
Fast DDS 是什么?
eProsima Fast DDS 是DDS (Data Distribution Service)规范的 C++ 实现,而 DDS 规范是由Object Management Group (OMG)定义的一种协议。eProsima Fast DDS 库既提供应用程序编程接口(API),也提供通信协议,二者均采用以数据为中心的发布 - 订阅(DCPS)模型,旨在为实时系统间建立高效、可靠的信息分发机制。
核心特性
eProsima Fast DDS 具备可预测性、可扩展性、灵活性,且资源处理效率高。为满足这些要求,它采用类型化接口,并依托多对多的分布式网络模式,这种模式能清晰地实现通信中发布端与订阅端的分离。eProsima Fast DDS 包含以下组成部分:
- DDS API 实现
- Fast DDS-Gen(一款生成工具,用于衔接类型化接口与中间件实现)
- 底层实时发布 - 订阅(RTPS)有线协议实现
正因具备上述特性,eProsima Fast DDS 被选为机器人操作系统 2(ROS 2)的默认中间件,适用于所有长期支持(LTS)版本以及大部分非 LTS 版本。
DDS API
DDS 采用的通信模型是多对多单向数据交换:生成数据的应用程序会将数据发布到订阅端的本地缓存中,而这些订阅端隶属于消费数据的应用程序。数据交换的信息流由负责数据交换的实体间设定的服务质量(QoS)策略进行调控。
作为以数据为中心的模型,DDS 基于 “全局数据空间” 的概念,所有相关应用程序均可访问该空间。想要提供信息的应用程序会声明其成为发布端的意图,而想要访问部分数据空间的应用程序则会声明其成为订阅端的意图。每当发布端向该空间发布新数据时,中间件就会将信息传播给所有相关的订阅端。
通信在 “域”(即隔离的抽象层面)内进行,这些 “域” 会将所有能够相互通信的分布式应用程序连接起来。只有属于同一域的实体才能交互,且订阅数据的实体与发布数据的实体之间的匹配需通过 “主题”(Topic)来介导。主题是明确的标识符,它会将一个在域内唯一的名称与一种数据类型以及一组附加的、与数据相关的 QoS 关联起来。
DDS 实体既可以建模为类,也可以建模为类型化接口。后者能实现更高效的资源处理,因为在执行前知晓数据类型,就可以提前分配内存,而非动态分配内存。
Fast DDS-Gen
依托接口意味着需要一款生成工具,将类型描述转换为合适的实现,以填补接口与中间件之间的空缺。这一任务由专用生成工具 Fast DDS-Gen 完成。它是一款 Java 应用程序,能够利用接口定义语言(IDL)文件中定义的数据类型生成源代码。
RTPS 有线协议
eProsima Fast DDS 在标准网络上用于交换消息的协议是实时发布 - 订阅(RTPS)协议,该协议是由 OMG 联盟定义并维护的一种 DDS 互操作有线协议。此协议支持通过 TCP/UDP/IP 等传输方式实现发布 - 订阅通信,并能确保不同 DDS 实现之间的兼容性。
由于 RTPS 协议源于发布 - 订阅模式,且其规范旨在满足 DDS 应用领域的相关要求,因此它与诸多 DDS 概念相契合,是 DDS 实现的理想选择。所有 RTPS 核心实体都与一个 RTPS 域相关联,该域代表一个隔离的通信层面,端点可在其中实现匹配。RTPS 协议中定义的实体与 DDS 实体一一对应,从而确保通信能够实现。
主要特性
- 两层 API 架构:eProsima Fast DDS 包含两层 API,一层是符合 DDS 规范的高层 API,侧重于易用性;另一层是符合 RTPS 规范的低层 API,能提供对 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 层的详细说明分别位于 “DDS 层” 和 “RTPS 层” 章节。
- 低资源消耗:eProsima Fast DDS 具有以下低资源消耗特性:
- 支持预分配资源,最大限度减少动态资源分配
- 避免使用无界资源
- 最大限度减少数据复制需求
- 跨平台性:操作系统相关依赖被视为可插拔模块,用户可借助 eProsima Fast DDS 库在目标平台上轻松实现平台模块。默认情况下,该项目可在 Linux、Windows 和 MacOS 系统上运行。
- 免费开源:Fast DDS 库、底层 RTPS 库、生成工具、内部依赖(如 eProsima Fast CDR)以及外部依赖(如 foonathan 库)均为免费开源软件。