多台机器上的 ROS2:ros2 组播工作,说话者/侦听器不工作



>PROBLEM

我已经在 2 台计算机上安装了 ROS 2 foxy,并尝试在一台机器上运行演示谈话者,在另一台机器上运行演示侦听器。不幸的是,它不起作用。

然而:

  • ROS2 组播测试有效;
  • 当我完全禁用防火墙时,说话者/听众确实可以工作。

我想知道如何配置防火墙(或任何其他系统参数),以便说话者/听众无需完全禁用防火墙即可工作。

请注意,ros2 直接安装在操作系统上,而不是在 Docker 中。

计算机

两台计算机:

  • 在同一网络上(带有简单路由器的家庭网络);
  • 通过电缆连接到路由器;
  • 具有静态 IP;
  • 运行 Ubuntu 20.04.5 LTS(焦点)。
$ lsb_release --all
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.5 LTS
Release:    20.04
Codename:   focal

防火墙:已启用 UDP 组播

我已经配置ufw以允许两台机器上的UDP组播,如下面的参考[1]所示。

$ sudo ufw allow in proto udp to 224.0.0.0/4
Rule added
$ sudo ufw allow in proto udp from 224.0.0.0/4
Rule added
$ sudo ufw status numbered
Status: active
To                         Action      From
--                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 224.0.0.0/4/udp            ALLOW IN    Anywhere                  
[ 3] Anywhere                   ALLOW IN    224.0.0.0/4/udp           
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)  

按照此配置,我可以在两台计算机之间运行 ros2 组播测试。

machine1 $ ros2 multicast send
Sending one UDP multicast datagram...
machine2 $ ros2 multicast receive
Waiting for UDP multicast datagram...
Received from 192.168.1.108:34434: 'Hello World!'

但是,说话者/听众听不到对方的声音。

machine1 $ ros2 run demo_nodes_cpp talker
[INFO] [1672838648.074547042] [talker]: Publishing: 'Hello World: 1'
[INFO] [1672838649.074330969] [talker]: Publishing: 'Hello World: 2'
machine2 $ ros2 run demo_nodes_cpp listener
(waits forever...)

防火墙:已禁用

通过在两台计算机上禁用防火墙,发言者/听众可以相互听到对方的声音。

machine1 $ sudo ufw disable
Firewall stopped and disabled on system startup
machine1 $ ros2 run demo_nodes_cpp listener
[INFO] [1672838846.953415499] [listener]: I heard: [Hello World: 1]
[INFO] [1672838847.953088937] [listener]: I heard: [Hello World: 2]
machine2 $ sudo ufw disable
Firewall stopped and disabled on system startup
machine2 $ ros2 run demo_nodes_cpp talker
[INFO] [1672838846.944245747] [talker]: Publishing: 'Hello World: 1'
[INFO] [1672838847.944211861] [talker]: Publishing: 'Hello World: 2'

问题

如何配置防火墙(或任何其他操作系统参数),以便讲话者/听众可以在不禁用防火墙的情况下看到彼此?

引用

[1] https://docs.ros.org/en/foxy/How-To-Guides/Installation-Troubleshooting.html

我认为这取决于您要将哪个DDS实现用作中间件。 默认情况下,foxy使用eProsima。他们的手动eprosima-fast-rtps.pdf可能有您正在寻找的端口。

也许您也可以使用wireshark来检查使用了哪些端口并启用这些端口。

解决方案

好吧,所以问题是我的防火墙阻止了我的计算机之间的通信......只需在两台计算机上允许UDP即可解决此问题。

Machine 1 $ sudo ufw allow in proto udp from 192.168.1.0/24
Machine 2 $ sudo ufw allow in proto udp from 192.168.1.0/24

一个好的做法可能是指定每台机器的确切 IP 和每台机器上的确切源/目标端口,但由于这是 2 台计算机,我只偶尔使用上面指定的规则对我来说是可以的......

关于ros2 multicast

的说明仍然困扰我的一件事是,当在同一台机器上运行时,ros2 run demo_nodes_cpp正常工作,而ros2 multicast则不能(ros2 multicast需要sudo ufw allow in proto udp to/from 224.0.0.0/4,如此处所述)。

通过遵循 ignacio 的建议并使用wireshark,我观察到ros2 run demo_nodes_cpp实际上广播到地址 239.255.0.1,而ros2 multicast广播到 224.0.0.0。

我觉得很奇怪,ros2 multicast广播到与ros2 run不同的地址,因为ros2 multicast的目标是验证ros2 run可以发送数据......这似乎与 ROS2 不一致。也许ros2 multicast是为早期版本的 ROS2(在 foxy 之前)开发的,并且不再与新版本相关?我不知道。。。我必须承认我对多播的了解是有限的。

所以现在,我只是假设ros2 multicast是一个不应该使用的工具,并且在同一网络上的多台机器上运行 ROS2 系统时必须运行以下命令。

$ sudo ufw allow in proto udp from 192.168.1.0/24

我发现ROS_LOCALHOST_ONLY在我的服务器上设置为 1。自安装以来一直没有更改(在ROS2的第一个教程之后,它被提及,通常与ROS_DOMAIN_ID一起添加到bash中)。所以我的解决方案是取消设置ROS_LOCALHOST_ONLY.

就我而言:我只需要设置export RMW_IMPLEMENTATION=rmw_fastrtps_cpp.我知道这很奇怪,因为文档指出 eProsima 是默认的 DDS。源

最新更新