Fast DDS入门(On-Going)

1. Fast DDS功能模块

TODO

2. 发现协议

发现协议类型枚举定义(include/fastdds/rtps/attributes/RTPSParticipantAttributes.hpp):

enum class DiscoveryProtocol
{
    NONE,
    /*!<
        NO discovery whatsoever would be used.
        Publisher and Subscriber defined with the same topic name would NOT be linked.
        All matching must be done manually through the addReaderLocator, addReaderProxy, addWriterProxy methods.
     */
    SIMPLE,
    /*!<
        Discovery works according to 'The Real-time Publish-Subscribe Protocol(RTPS) DDS
        Interoperability Wire Protocol Specification'
     */
    EXTERNAL,
    /*!<
        A user defined PDP subclass object must be provided in the attributes that deals with the discovery.
        Framework is not responsible of this object lifetime.
     */
    CLIENT, /*!< The participant will behave as a client concerning discovery operation.
                 Server locators should be specified as attributes. */
    SERVER, /*!< The participant will behave as a server concerning discovery operation.
                 Discovery operation is volatile (discovery handshake must take place if shutdown). */
    BACKUP,  /*!< The participant will behave as a server concerning discovery operation.
                 Discovery operation persist on a file (discovery handshake wouldn't repeat if shutdown). */
    SUPER_CLIENT  /*!< The participant will behave as a client concerning all internal behaviour.
                     Remote servers will treat it as a server and will share every discovery information. */

};

TODO

3. Fast DDS中的环境变量

Fast DDS提供了一些运行时环境变量,用于配置和调整DDS实体的行为。这些环境变量可以在系统环境中设置,也可以通过一个环境文件(json)中加载,这个环境文件路径通过环境变量FASTDDS_ENVIRONMENT_FILE指定。环境文件的优先级高于系统环境变量,一个例外是,ROS_DISCOVERY_SERVER可以在运行时通过环境变量动态修改。

3.1. FASTDDS_DEFAULT_PROFILES_FILE、SKIP_DEFAULT_XML

FASTDDS_DEFAULT_PROFILES_FILE、SKIP_DEFAULT_XML用于定义默认XML配置文件路径的环境变量。比如:

export FASTDDS_DEFAULT_PROFILES_FILE=/home/user/profiles.xml

加载profile文件的优先级为:优先加载环境变量指定的文件路径。如果环境变量未设置,则默认加载工作目录下的文件DEFAULT_FASTDDS_PROFILES.xml,这个默认文件名是写死在Fast DDS源码中的。

当定义了SKIP_DEFAULT_XML环境变量并设置为1时,Fast DDS将跳过加载默认XML配置文件,以与Discovery Server的配置分开(CliDiscoveryManager::load_XML_file)。此时FASTDDS_DEFAULT_PROFILES_FILE、SKIP_DEFAULT_XML环境变量仍然起作用,即SKIP_DEFAULT_XML只决定是否跳过默认XML配置文件(工作目录下的DEFAULT_FASTDDS_PROFILES.xml)的加载。

3.2. FASTDDS_BUILTIN_TRANSPORTS

环境变量FASTDDS_BUILTIN_TRANSPORTS用于指定DomainParticipant选用的内置传输类型,该环境变量直接影响DDS实体的通信方式。仅当use_builtin_transports为true时,才会使用内置传输类型。传输类型有以下几种:

传输类型 描述
NONE 不使用任何内置传输,用户需要手动添加传输实例,否则DomainParticipant创建失败。
DEFAULT 实例化UDPv4和SHM传输。在可行的情况下,参与者会优先选择SHM。
DEFAULTv6 实例化UDPv6和SHM传输。在可行的情况下,参与者会优先选择SHM。
SHM 仅实例化SHM,适用于同一主机上的进程间通信。
UDPv4 仅实例化UDPv4。
UDPv6 仅实例化UDPv6。
LARGE_DATA 实例化UDPv4、TCPv4和SHM。其中UDP用于参与者发现阶段多播,参与者的活跃度和应用程序数据交付通过TCP/SHM进行。

FASTDDS_BUILTIN_TRANSPORTS带有一些参数,主要的参数有(相关代码RTPSParticipantImpl::setup_transports):

参数名称 描述
max_msg_size / uint32_t DDS传输层(RTPS)的最大消息大小,单位为字节。
sockets_size / uint32_t 操作系统收发缓冲区大小(socket的SO_SNDBUF / SO_RCVBUF选项),单位为字节。
non_blocking / bool 是否启用非阻塞模式。如果启用,在操作系统缓冲区已满的时候,消息会被丢弃。
tcp_negotiation_timeout / uint32_t TCP连接的协商超时时间,单位为毫秒。仅在LARGE_DATA传输类型下有效。

max_msg_sizesockets_size这两个参数应该设置为消息的最大大小,否则可能导致分片,从而降低传输效率。在使用LARGE_DATA传输类型时,将non_blocking设置为true应该是一个优选。另外,在LARGE_DATA传输类型下,才能将max_msg_size设置大于65500 KB,其他传输类型下将导致创建参与者失败。

TCPv4传输使用以下配置初始化:

  • calculate_crccheck_crcapply_security设置为false。
  • enable_tcp_nodelay设置为true。
  • keep_alive_threadaccept_thread使用默认配置。

一个示例配置如下:

export FASTDDS_BUILTIN_TRANSPORTS=LARGE_DATA?max_msg_size=200KB&sockets_size=1MB&non_blocking=true&tcp_negotiation_timeout=50

3.3. 发现协议相关环境变量:ROS_DISCOVERY_SERVER、ROS2_EASY_MODE、ROS_SUPER_CLIENT

Fast DDS发现机制分为两种:基于多播的Simple Discovery Protocol (SDP)(去中心化),和基于客户端-服务器的Discovery Server。当参与者DomainParticipant实例的发现协议为SIMPLESERVER或者BACKUP时,环境变量ROS_DISCOVERY_SERVER起作用(其他发现协议时无效)。

如果定义了ROS_DISCOVERY_SERVER环境变量,会对DomainParticipant实例初始化的发现协议作一些更新:

  • 当发现协议是SIMPLE时,更新为CLIENT
  • 当发现协议是SERVER/BACKUP时,保持不变。

相关代码:RTPSDomainImpl::client_server_environment_attributes_override

ROS_DISCOVERY_SERVER格式举例:

  • 192.168.2.23,默认使用UDPv4协议,UDP协议的默认端口11811
  • TCPv4:[127.0.0.1]TCPv4:[127.0.0.1]:42100,TCP协议的默认端口42100。TCP协议用于与服务器通信。
  • 域名(使用DNS解析):eprosima.comeprosima.com:4567,即不指定协议时,被解析为UDP协议。TCPv4:[eprosima.com]TCPv4:[eprosima.com]:42100(UDP格式类似)。

如上的格式中,也可以指定TCPv6/UDPv6协议,格式类似于TCPv4/UDPv4。一个包含多个地址的示例如下:

export ROS_DISCOVERY_SERVER="84.22.259.329:8888;localhost:1234"

3.3.1. ROS_SUPER_CLIENT

环境变量ROS_SUPER_CLIENT用于启用Discovery Server的超级客户端模式。SUPER_CLIENT可以从Server收到所有DomainParticipant实例的订阅信息(等同于Server间同步),即可以监控所有client的状态。一般用作telemetry或监控工具。启用方法如下:

export ROS_SUPER_CLIENT=true # TRUE/FALSE, True/False, 1/0,true/false

环境变量ROS_SUPER_CLIENT是配合ROS_DISCOVERY_SERVER使用的。只有当ROS_DISCOVERY_SERVER环境变量被定义,且DomainParticipant实例的发现协议为SIMPLE时(默认为SIMPLE,其他发现方式为显式定义,此时不应该改变),环境变量ROS_SUPER_CLIENT才会生效。相关代码:RTPSDomainImpl::run_easy_mode_discovery_server

3.3.2. ROS2_EASY_MODE

环境变量ROS2_EASY_MODE也要求DomainParticipant实例的发现协议为SIMPLE时(默认为SIMPLE),并更改发现机制为Discovery Server。同时,将DomainParticipant变更为SUPER_CLIENT,以保持跟SIMPLE发现协议的时候一样可以收到所有其他参与者的信息。

当定义了ROS2_EASY_MODE环境变量并设置为1时,会在本地创建一个Discovery Server,这个本地server连接到远程Discovery Server,启动之后作为守护进程驻守后台。本地的DomainParticipant实例将连接到本地的Discovery Server,以避免直接与远程server通信(减小连接overhead、传输开销)。

3.4. FASTDDS_STATISTICS

环境变量FASTDDS_STATISTICS用于启用使能DomainParticipant实例的统计功能:启用统计信息DataWriter,即对外发布指定的统计信息。使用Fast DDS的监控工具Fast DDS Monitor,或者其他参与者可以订阅这些统计信息。Fast DDS Monitor可视化展示延迟、丢包、吞吐量、发现事件等指标。

如下示例启用节点的延迟测量统计:

export FASTDDS_STATISTICS="HISTORY_LATENCY_TOPIC;NETWORK_LATENCY_TOPIC"

实际的统计信息,是环境变量FASTDDS_STATISTICS中指定的统计主题(topic)与环境文件中指定的统计信息配置的合集。

编译时,需要启用编译选项FASTDDS_STATISTICS

A. 资料




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • NVIDIA GPU 架构:SP、SM 与 LSU 工作原理详解
  • al-folio 模板定制修改总结
  • al-folio 部署记录(Ubuntu 24.04)
  • Ubuntu 26.04 安装 Docker 和 Docker Compose
  • C++ Traits