fastdds学习之3——库概览

发布时间 2023-04-15 21:51:17作者: 星星星星yu

Fast DDS(前身为Fast RTPS)是DDS规范的高效高性能实现,DDS规范是一种用于分布式应用软件的以数据为中心的通信中间件(DCPS)。本节回顾Fast DDS的体系结构、操作和关键特性。

1、架构

Fast DDS的架构如下图所示,其中可以看到具有以下不同环境的层模型。

  • Application Layer:使用Fast DDS API在分布式系统中实现通信的用户应用程序。
  • Fast DDS Layer:DDS通信中间件的稳健实现。它允许部署一个或多个DDS域,在这些域中,同一域中的域参与者通过在域主题下发布/订阅来交换消息。
  • RTPS Layer:实时发布订阅(RTPS)协议的实现,以实现与DDS应用程序的互操作性。该层充当传输层的抽象层。
  • Transport Layer:fastDDS可用于各种传输协议,udp、tcp和SHM等。

image

1.1 DDS层

在DDS层中定义了通信的几个关键元素。用户将在其应用程序中创建这些元素,从而合并DDS应用程序元素并创建以数据为中心的通信系统。Fast DDS遵循DDS规范,将通信中涉及的这些元素定义为实体。DDS实体是支持服务质量配置(QoS)并实现侦听器的任何对象。

  • QoS:定义每个实体行为的机制。

  • Listener:向实体通知应用程序执行期间可能发生的事件的机制。

下面列出了DDS实体及其描述和功能。有关每个实体、其QoS及其侦听器的更详细说明,请参阅DDS层部分。

Domain:标识DDS域的正整数。每个DomainParticipant都将分配一个DDS域,以便同一域中的DomainParticipants可以进行通信,并隔离DDS域之间的通信。此值必须由应用程序开发人员在创建DomainParticipant时提供。

  • DomainParticipant:包含其他DDS实体(如发布者、订阅者、主题和多主题)的对象。它可以创建包含在自己中的实体以及实体的配置。

  • Publisher:发布服务器使用DataWriter发布主题下的数据,DataWriter将数据写入传输。它是创建和配置其包含的DataWriter实体的实体,并且可能包含一个或多个DataWriter实体。

  • DataWriter:它是负责发布消息的实体。用户在创建此实体时必须提供一个主题,该主题将是发布数据的主题。发布是通过将数据对象作为更改写入DataWriterHistory来完成的。

  • DataWriterHistory:这是对数据对象的更改列表。当DataWriter继续发布特定主题下的数据时,它实际上会对该数据进行更改。历史记录中记录的正是这一更改。然后将这些更改发送到订阅该特定主题的DataReader。

  • Subscriber:订阅服务器使用DataReader订阅主题,DataReader从传输中读取数据。它是创建和配置其包含的DataReader实体的实体,可以包含一个或多个DataReader实体。

  • DataReader:它是订阅出版物接收主题的实体。创建此实体时,用户必须提供订阅主题。DataReader接收消息作为其HistoryDataReader中的更改。

  • DataReaderHistory:它包含DataReader由于订阅某个主题而接收的数据对象中的更改。

  • Topic:将发布服务器的DataWriter与订阅服务器的DataReader绑定的实体。

1.2 RTPS层

如上所述,Fast DDS中的RTPS协议允许从传输层抽象DDS应用实体。根据上面显示的图表,RTPS层有四个主要实体。

  • RTPSDomain:它是RTPS协议对DDS域的扩展。

  • RTPSParticipant:包含其他RTPS实体的实体。它允许配置和创建包含的实体。

  • RTPSWriter:消息的来源。它读取写入DataWriterHistory中的更改,并将其传输到先前匹配的所有RTPSReader。

  • RTPSReader:消息的接收实体。它将RTPSWriter报告的更改写入DataReaderHistory。

有关每个实体、其属性和侦听器的更详细说明,请参阅RTPS层部分。

1.3 Transport层

Fast DDS支持通过各种传输协议实现应用程序。这些是UDPv4、UDPv6、TCPv4、TCPv6和共享内存传输(SHM)。默认情况下,DomainParticipant实现UDPv4和SHM传输协议。传输层部分详细介绍了所有支持的传输协议的配置。

2、 编程和执行模型

Fast DDS是并发的和基于事件的。以下说明了控制Fast DDS操作的多线程模型以及可能的事件。

2.1 并发和多线程

Fast DDS实现了一个并发多线程系统。每个DomainParticipant都产生一组线程来处理后台任务,如日志记录、消息接收和异步通信。这不会影响您使用库的方式,即Fast DDS API是线程安全的,因此您可以从不同的线程调用同一DomainParticipant上的任何方法。但是,当外部函数访问由库内部运行的线程修改的资源时,必须考虑此多线程实现。这方面的一个例子是实体侦听器回调中修改的资源。以下是Fast DDS多线程调度工作原理的简要概述:

  • Main thread: 有应用程序管理。

  • Event thread: 每个DomainParticipant都拥有其中一个。它处理周期性和触发的时间事件。

  • Asynchronous writer thread: 此线程管理所有DomainParticipant的异步写入。即使对于同步写入程序,某些形式的通信也必须在后台启动。

  • Reception threads: DomainParticipes为每个接收信道生成一个线程,其中信道的概念取决于传输层(例如UDP端口)。

2.2 事件驱动架构

Fast DDS的事件驱动原理是基于回调函数的。当某个事件(如数据到达)发生时,系统会触发相应的回调函数来执行相应的处理逻辑。Fast DDS依赖于Boost ASIO库来实现事件驱动,采用异步I/O机制,使得Fast DDS能够高效地进行数据传输和交换。