当前位置:网站首页>【ROS2原理8】节点到参与者的重映射
【ROS2原理8】节点到参与者的重映射
2022-08-09 06:48:00 【无水先生】
一、背景知识
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)。
在此更改之后,实现此功能将不那么直接。需要添加一些额外的逻辑来识别发布者是从哪个节点创建的。
边栏推荐
猜你喜欢
随机推荐
Mysql实操
事务总结
Inception V3 闭眼检测
图论,二叉树,dfs,bfs,dp,最短路专题
推进产教融合 赋能教育创新发展 | 华云数据荣获“企业贡献奖”
Fragments
找出数组中不重复的值php
AD的library中 库文件后缀有.intlib .schlib .pcblib 的区别
The Integer thread safe
Transaction concluded
Use of PlantUML plugin in idea
高项 04 项目整体管理
物理层课后作业
简单使用Lambda表达式
shardingsphere数据分片配置项说明和示例
shardingsphere data sharding configuration item description and example
力扣第 305 场周赛复盘
crc calculation
dp学习笔记
String.toLowerCase(Locale.ROOT)