• 【ROS2原理8】节点到参与者的重映射


     
    

    一、背景知识

    1.1 节点

            在 ROS 中,节点是用于对其他实体进行分组的实体。例如:节点内部可以组织有发布者、订阅者、服务器、客户端。节点简化了组织和代码重用,因为它们可以以不同的方式组成。本篇谈ROS和DDS中间有一种“域参与者”与节点类同,它们之间的传送效率问题。

    1.2 域参与者(domain Participant )

            参与者是一种 DDS 实体。参与者还对其他实体进行分组,如发布者、订阅者、数据写入者、数据读取者等。创建更多参与者会增加应用程序的开销:

    • 每个参与者都参与发现。创建多个 Participant 通常会增加 CPU 使用率和网络 IO 负载。
    • 每个参与者都跟踪其他 DDS 实体。在单个进程中使用多个可能会导致数据重复。
    • 每个参与者可以为事件处理、发现等创建多个线程。每个参与者创建的线程数取决于 DDS 供应商(例如:RTI Connext)。

            由于这些原因,参与者是重量级实体。

            注意:这实际上可能取决于 DDS 供应商,其中一些供应商在参与者之间共享这些资源(例如 OpenSplice)。然而,许多 DDS 供应商不执行这种优化(例如:RTI Connext 和 Fast-RTPS),实际上建议每个进程只创建一个参与者。

    1.3 语境(Context)

            在 ROS 中,上下文是 init-shutdown 循环的非全局状态。它还封装了节点和其他实体之间的共享状态。在大多数应用程序中,一个进程中只有一个 ROS 上下文。

    二、行为 pre-Foxy

            节点和 DDS 参与者之间存在一对一的映射关系。这简化了原始实现,因为 DDS 参与者提供了许多与 ROS 节点等效的功能。这种方法的缺点是创建许多参与者会带来开销。此外,域参与者的最大数量相当少。例如,在 RTI Connext 中,每个域限制为 120 名参与者。

    三、建议的方法

            该提案的目标是通过避免每个节点创建一个参与者来提高整体性能。如果可能,将避免 API 更改。

     

    3.1 将 DDS 参与者映射到 ROS 实体

            除了在 Foxy 之前使用的一对一节点到参与者映射之外,还有两种选择:

    • 每个进程使用一个参与者。
    • 每个上下文使用一个参与者。

            第二种方法更加灵活,允许多个参与者在一个应用程序中为需要它的人提供,例如域桥应用。因此,选择了一对一的参与者到上下文映射。

            当多个节点在单个进程中运行时,可以通过不同的选项对它们进行分组 - 从每个节点的单独上下文,到在同一上下文中对几个节点进行分组,再到对所有节点使用单个上下文。对于大多数应用程序,只创建一个上下文。

    3.2 发现信息

            如果不使用节点到参与者的一对一映射,则需要额外的发现信息才能将其他实体与节点匹配,例如发布者、订阅者等。可以使用多种方法来共享此信息。建议的方法使用一个主题。每个参与者发布一条消息,其中包含将实体与节点匹配所需的所有信息。消息结构如下:

    • ParticipantInfo
      • gid
      • NodeInfo
        • Node namespace
        • Node name
        • Reader gid
        • writed gid

     

            当一个实体被更新时(例如:一个发布者被创建或销毁),一个新的消息被发送。

            客户端和服务器的识别根据主题名称的 ROS 约定进行(请参阅主题和服务名称映射到 DDS)。

            本主题被视为实现细节,并非所有 rmw 实现都必须使用它。因此,所有必要的逻辑都必须在 rmw 实现本身或上游包中。在 rcl 中实现此逻辑将使其成为 API 的一部分,而不是实现细节。

            为避免代码重复,rmw_dds_common 包提供了此逻辑的通用实现。

    3.3 ROS 发现主题的详细信息

    • topic name: ros_discovery_info
    • Writer qos:
      • durability: transient local
      • history: keep last
      • history depth: 1
      • reliability: reliable
    • Reader qos:
      • durability: transient local
      • history: keep all
      • history depth: 1
      • reliability: reliable

    四、其它用途

    4.1 安全

            以前,每个节点可能有不同的安全工件。这是可能的,因为每个节点都映射到一个参与者。新方法允许为每个进程指定不同的安全工件。有关更多详细信息,请参阅 ROS 2 安全飞地。

    4.2 忽略本地public选项

            在创建订阅时可以设置一个 ignore_local_publications 选项。该选项可避免从同一节点内的发布者接收消息。这并未在所有 rmw 实现中实现(例如:FastRTPS)。

            在此更改之后,实现此功能将不那么直接。需要添加一些额外的逻辑来识别发布者是从哪个节点创建的。

  • 相关阅读:
    vscode运行Live Server报错:Windows找不到文件Microsoft Edge
    平面设计实验四 绘制工具和修饰工具
    通信原理 | 滤波器:模拟滤波器和数字滤波器
    ElasticSearch统计总数据量
    系统架构师备考倒计时16天(每日知识点)
    linux常用命令
    steam搬砖项目,月利润9000+
    0824(038天 泛型01)
    mp4封装格式各box类型讲解及IBP帧计算
    iOS 使用runtime 解决按钮重复点击的问题
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/126236446