ROS_DOMAIN_ID

概述

如其他地方所解释的,ROS 2用于通信的默认中间件是DDS。在DDS中,不同逻辑网络共享物理网络的主要机制被称为Domain ID。同一域中的ROS 2节点可以自由地发现和相互发送消息,而不同域中的ROS 2节点则不能。所有ROS 2节点默认使用域ID 0。为了避免在同一网络上运行ROS 2的不同计算机组之间的干扰,应为每个组设置不同的域ID。

选择域ID(简短版本)

下面的文本解释了应在ROS 2中使用的域ID范围的推导过程。如果想跳过这些背景知识,只需选择一个安全的数字,简单地选择一个介于0和101之间(包括0和101)的域ID即可。

选择域ID(详细版本)

域ID由DDS用于计算用于发现和通信的UDP端口。有关端口计算的详细信息,请参阅`此文章 <https://community.rti.com/content/forum-topic/statically-configure-firewall-let-omg-dds-traffic-through>`__。根据我们的基本网络知识,UDP端口是一个`无符号16位整数 <https://en.wikipedia.org/wiki/User_Datagram_Protocol#Ports>`__。因此,最高可以分配的端口号是65535。通过使用上述文章中的公式进行一些计算,可以得知可能分配的最高域ID是232,而最低域ID是0。

平台特定约束

为了最大兼容性,在选择域ID时应遵循一些额外的平台特定约束。特别是,在操作系统的`临时端口范围 <https://en.wikipedia.org/wiki/Ephemeral_port>`__中最好避免分配域ID。这样可以避免ROS 2节点和计算机上其他网络服务之间可能的端口冲突。

以下是有关临时端口的特定平台注意事项。

默认情况下,Linux内核使用32768-60999的端口作为临时端口。这意味着域ID为0-101和215-232的端口可以安全使用,不会与临时端口冲突。在Linux中,可以通过在``/proc/sys/net/ipv4/ip_local_port_range``中设置自定义值来配置临时端口范围。如果使用自定义临时端口范围,则可能需要相应地调整上述数字。

参与者限制

在计算机上运行的每个 ROS 2 进程都会创建一个 DDS“参与者”。由于每个 DDS 参与者占用计算机上的两个端口,如果在一台计算机上运行超过120个 ROS 2 进程,则可能会溢出到其他域ID或临时端口。

为了理解原因,请考虑域ID 1和2。

  • 域ID 1使用端口7650和7651进行组播。

  • 域ID 2使用端口7900和7901进行组播。

  • 在创建域ID为1的第一个进程(第零个参与者)时,使用端口7660和7661进行单播。

  • 在创建域ID为1的第120个进程(第119个参与者)时,使用端口7898和7899进行单播。

  • 在创建域ID为1的第121个进程(第120个参与者)时,使用端口7900和7901进行单播,并与域ID为2重叠。

如果已知计算机一次只会处于一个域ID上,并且域ID足够低,则可以安全地创建超过此数量的ROS 2进程。

当选择接近平台特定域ID范围顶部的域ID时,应考虑一个额外的约束条件。

例如,假设具有域ID为101的Linux计算机:

  • 计算机上的第零个ROS 2进程将连接到端口32650、32651、32660和32661。

  • 计算机上的第一个ROS 2进程将连接到端口32650、32651、32662和32663。

  • 计算机上的第53个ROS 2进程将连接到端口32650、32651、32766和32767。

  • 计算机上的第54个ROS 2进程将连接到端口32650、32651、32768和32769,并进入临时端口范围。

因此,在Linux上使用域ID 101时,应创建的最大进程数为54。同样,在Linux上使用域ID 232时,应创建的最大进程数为63,因为最大端口号为65535。

在macOS和Windows上的情况类似,但数字不同。在macOS和Windows上,选择域ID为166(范围顶部)时,计算机上在进入临时端口范围之前可以创建的最大ROS 2进程数为120。

域 ID 到 UDP 端口计算器