【问题标题】:ROS2 on multiple machines: ros2 multicast working, talker/listener not working多台机器上的 ROS2:ros2 多播工作,talker/listener 不工作
【发布时间】:2023-02-08 02:39:38
【问题描述】:

问题

我在 2 台计算机上安装了 ROS 2 foxy,并尝试在一台机器上运行 demo talker,在另一台机器上运行 demo listener。不幸的是它不起作用。

然而:

  • ros2 多播测试有效;
  • 当我完全禁用防火墙时,talker/listener 确实可以工作。

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

请注意,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 以允许在两台机器上按照 ref 进行 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

【问题讨论】:

    标签: ubuntu udp ros ros2 ufw


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      解决方案

      好吧,问题是我的防火墙阻止了我的计算机之间的通信......通过在两台机器上允许 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,如前所述 here)。

      按照 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
      

      【讨论】:

        【解决方案3】:

        以防万一这对其他人有帮助:关注this simple guide 我遇到了同样的情况,即使 ping 和多播工作,ROS2 节点也不会发现彼此。我试图解决这个问题

        • 本帖所示方式(配置防火墙)
        • 确保两者的 ROS_DOMAIN_ID 一致(如here 所回答)
        • 通过使用 Fast DDS Discovery Server(表示为 here
        • 安装CycloneDDS
        • 按照this answer的步骤,涉及防火墙,DDS,多播

        最后我发现ROS_LOCALHOST_ONLY 被设置为 1一直以来。自安装以来它没有改变(在 ROS2 第一个教程之后它被提到并且通常与 ROS_DOMAIN_ID 一起添加到 bash 中)。所以(很明显)解决方案是取消设置 ROS_LOCALHOST_ONLY。

        【讨论】:

          猜你喜欢
          • 2022-01-02
          • 2022-08-15
          • 2016-07-12
          • 2011-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-10
          相关资源
          最近更新 更多