>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。源