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``中设置自定义值来配置临时端口范围。如果使用自定义临时端口范围,则可能需要相应地调整上述数字。
默认情况下,macOS的临时端口范围是49152-65535。这意味着域ID为0-166的端口可以安全使用,不会与临时端口冲突。在macOS中,可以通过设置``net.inet.ip.portrange.first``和``net.inet.ip.portrange.last``的自定义sysctl值来配置临时端口范围。如果使用自定义临时端口范围,则可能需要相应地调整上述数字。
默认情况下,Windows 上的临时端口范围是49152-65535。这意味着可以安全地使用域ID 0-166,而不会与临时端口冲突。在 Windows 中,可以通过`使用 netsh <https://docs.microsoft.com/en-us/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang>`__ 来配置临时端口范围。如果使用了自定义的临时端口范围,上述数字可能需要相应地进行调整。
参与者限制
在计算机上运行的每个 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。