ROS2-008-通信机制补完:分布式通信和 ROS_DOMAIN_ID
简介
在之前的核心内容中,我们系统地学习了四种通信机制。这四种通信机制在当时的应用场景都为单个ROS设备内相关节点、话题之间的相互沟通。那么当我们涉及到多台 ROS2 设备之间的相互通信时,我们应该如何实现?
分布式通信
分布式通信就是这样一种 通过网络 在不同主机之间实现 数据交互 的通信策略。
首先我们应该了解, ROS2 本身就是一个分布式通信框架,它可以通过中间件很方便的实现不同设备之间的通信。
ROS2 所基于的中间件为数据分发服务(Data Distribution Service, 简称DDS),当多台 ROS2 设备处于同一网络时,通过 DDS 的 域ID机制(ROS_DOMAIN_ID) 便可以实现分布式通信。其大致流程为:
- 在启动节点之前设置 域ID 的值
- 当不同的节点间 域ID 的值相同时,则可以被互相发现并进行通信。
- 反之,当不同的节点间 域ID 的值不同时,则无法实现上述功能。
- 当然由于在默认情况下,所有的节点在启动时所使用的 域ID 的值皆为 “0”,因此只要在同一网络下,不需要针对 域ID 的值做任何配置,在理论上节点间就已经在进行分布式通信了。
它的应用场景是?
有许多数据交互的应用场景都依赖于分布式通信。例如:
- 无人机编队、机器人编队等,作为单个机器人需要获取周边机器人的速度、位置、运行轨迹等等相关的信息。
- 远程控制机器人等时,可能需要获取该机器人所采集的环境信息,并下发相关的控制指令。
- 其他未提及但是是在多设备之间进行数据交互的应用场景等
如何实现?
在多机通信时,可以通过 域ID 对节点进行分组,同一个组内的节点之间可以实现自由通信,而不同组之间的节点就无法进行相互通信。如果你希望所有节点都属于同一个组,那么直接使用默认的 域ID 即可。如果希望将不同的节点之间划分为多个组,那么可以在终端启动该节点前,在终端内设置 该节点的 域ID (例如设置为6)。具体执行命令为:
export ROS_DOMAIN_ID=6
执行上述命令后,在该终端内启动的该节点就会被划分到 域ID 为 6 的域内。
如果希望将当前ROS2所在设备下的 所有节点 设置统一的 域ID,那么你可以在终端内执行:
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
执行完毕后再 重新启动终端,那么之后 该设备内 所运行的 所有节点 将自动的被划分到 域ID 为 6 的域内。
⚠注意事项⚠
在设置 ROS_DOMAIN_ID 的时候应遵守以下事项:
- 建议 ROS_DOMAIN_ID 的取值在 [0,101] 之间;
- 每个 ROS_DOMAIN_ID 内的节点总数是有限制的,节点总数需要小于等于 120;
- 如果 ROS_DOMAIN_ID 等于 101, 则该 域ID 内的节点总数是有更大限制,节点总数需要小于等于 54 。
究其原因是由于以下两个计算规则👇仅供了解。(反正你遵守这个注意事项就不会有啥问题,真想知道为什么再往下看)
1. DDS 内 ROS_DOMAIN_ID 的计算规则
- DDS 是基于 TCP/IP 或者 UDP/IP 网络通信协议的,网络通信时需要指定端口号。该端口号由2个字节 (即 2*8=16 bit)的无符号整数表示,其取值范围在 [0, ],即[0,65535] 之间;
- 端口号的分配亦遵循相应规则,根据 DDS 协议规定,以 7400 作为起始端口,因此可用端口缩小为 [7400,65535]。并且由于 DDS 协议在默认情况下,每个 ROS_DOMAIN_ID 都需要占用 250 个端口,因此 ROS_DOMAIN_ID 的个数为: ,对应的取值范围为[0,231];
- 不同的操作系统会预留不同的端口,在 DDS 中使用端口时还需要避开这些预留的端口,以免产生使用冲突。在 Linux 下 可以使用的 ROS_DOMAIN_ID 为 ,在 Windows & Mac 中可用的域为 [0,166]。因此综上,为了兼容多平台,建议 ROS_DOMAIN_ID 的取值在 [0,101] 之间。
2. ROS_DOMAIN_ID 内的节点总数的计算规则
- 每一个 DOMAIN_ID 默认需要占用 250 个端口,在这 250 个端口内,每一个 ROS2 节点都需要占用 两个 端口。
- 在DDS 协议中定义,每一个 DOMAIN_ID 的端口段内,第一个和第二个端口分别为 Discovery Multicast 端口和 User Multicast 端口,并且 DOMAIN_ID 内的第一个节点是从端口段内的 第十个端口 开始使用的,即第十个和第十一个端口分别为第一个节点所使用的 Discovery Unicast 端口和 User Unicast 端口,第十二个和第十三个端口分别为第二个节点所使用的 Discovery Unicast 端口和 User Unicast 端口,以此类推。
- 因此一个 DOMAIN_ID 内所能使用的最大节点个数为 个
- 当 DOMAIN_ID 值为 101 时,由于其后半段端口为操作系统的预留端口,因此在该 DOMAIN_ID 下,其节点的最大个数为 54 个。
相关信息
若希望在文档中参考具体计算公式,请参考以下网址:Statically configure a Firewall to let OMG DDS Traffic through | Data Distribution Service (DDS) Community RTI Connext Users 注:该网站为全英文