一、说明
ROS2是基于DDS实现的,然而DDS到底是啥?如果不用ROS2,单独用DDS实现一项工程可能吗?似乎DDS是个神秘的存在,但是,也能找到一些资料,其深度未必深刻,但是知道一些总是有益的。本文将介绍一些C++的库实现,使DDS更加清晰。
二、背景知识
eProsima Fast DDS 是 DDS(数据分发服务)规范的 C++ 实现,该规范由对象管理组 (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 建立在所有感兴趣的应用程序都可以访问的“全局数据空间”的概念之上。想要贡献信息的应用程序声明它们成为发布者的意图,而想要访问部分数据空间的应用程序声明它们成为订阅者的意图。每次发布者向该空间发布新数据时,中间件都会将信息传播给所有感兴趣的订阅者。
信息如何在 DDS 域内流动的概念图。只有属于同一域的实体才能通过匹配主题相互发现,从而在发布者和订阅者之间交换数据。
四、快速 DDS 生成依赖接口(Fast DDS-Gen Relying on interfaces)
依赖接口意味着需要一个生成工具,将类型描述转换为适当的实现,以填补接口和中间件之间的空白。此任务由专用生成工具 Fast DDS-Gen 执行,这是一个 Java 应用程序,它使用接口定义语言 (IDL) 文件中定义的数据类型生成源代码。
五、RTPS 中间协议
eProsima Fast DDS 用于通过标准网络交换消息的协议是实时发布-订阅协议 (RTPS),这是一种由 OMG 联盟定义和维护的 DDS 互操作性有线协议。该协议通过 TCP/UDP/IP 等传输提供发布者-订阅者通信,并保证不同 DDS 实现之间的兼容性。
鉴于其发布-订阅根源及其旨在满足 DDS 应用程序域所解决的相同要求的规范,RTPS 协议映射到许多 DDS 概念,因此是 DDS 实现的自然选择。所有 RTPS 核心实体都与一个 RTPS 域相关联,该域表示端点匹配的隔离通信平面。 RTPS 协议中指定的实体与 DDS 实体一一对应,从而允许通信发生。
六、主要特点
两个 API 层。 eProsima Fast DDS 包含一个专注于可用性的高级 DDS 兼容层和一个提供对 RTPS 协议的更精细访问的较低级别 RTPS 兼容层。 实时行为。 eProsima Fast DDS 可以配置为提供实时功能,保证在指定的时间限制内做出响应。 内置发现服务器。 eProsima Fast DDS 基于现有发布者和订阅者的动态发现,并连续执行此任务,无需联系或设置任何服务器。但是,也可以配置客户端-服务器发现以及其他发现范例。 同步和异步发布模式。 eProsima Fast DDS 支持同步和异步数据发布。 尽最大努力和可靠的沟通。 eProsima Fast DDS 支持基于 Best Effort 通信协议(例如 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 快速 DDS: 允许预分配资源,以尽量减少动态资源分配。 避免使用无限资源。 最大限度地减少复制数据的需要。 多平台。操作系统依赖项被视为可插入模块。用户可以在其目标平台上使用 eProsima Fast DDS 库轻松实现平台模块。默认情况下,该项目可以在 Linux、Windows 和 MacOS 上运行。 免费和开源。 Fast DDS 库、底层 RTPS 库、生成器工具、内部依赖项(例如 eProsima Fast CDR)和外部依赖项(例如 foonathan 库)都是免费和开源的。