鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2.0 简单的多机通讯

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    ros2 humble ros2节点通讯 通讯 通信
    3
    12
    4.5k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 4379854374
      龍魂
      最后由 编辑

      环境
      2台 Win10电脑,ROS2 Humble
      项目代码
      ROS官网中的话题教程(cpp_pubsub)示例:
      Writing a simple publisher and subscriber (C++)
      问题详情
      1 两台电脑均能成功运行示例中的talker和listener节点,并单机内节点通讯
      2 两台电脑处于同一局域网中,互相能够ping通
      3 两台电脑均关闭了防火墙(域网络、专用网络、公用网络)
      尝试解决
      1 用 set ROS_DOMAIN_ID=2 在两电脑中设定一致的DOMAIN ID
      2 在系统环境变量中添加环境变量 ROS_DOMAIN_ID ,值为2
      3 使用 ros2 multicast receive/send 分别在两台电脑上执行
      --执行后,接收方没有收到发送的消息
      提问
      如何排查能够使两个电脑的 ros2 节点进行话题通讯

      1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @小鱼
        最后由 编辑

        @小鱼 在 ROS2.0 简单的多机通讯 中说:

        直接指定服务地址:http://fishros.org/doc/ros2/humble/Tutorials/Advanced/Discovery-Server/Discovery-Server.html?highlight=discovery

        建议测试下这个

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        4379854374 1 条回复 最后回复 回复 引用 0
        • 4379854374
          龍魂
          最后由 编辑

          求大佬提示,卡了很久,主要是不知道应该用什么方式进行排查,跪求!🙏

          小鱼小 1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @437985437
            最后由 编辑

            @437985437 多播走的udp,排查这个局域网自动发现样例,另外尝试两台电脑直连,配置静态ip通信试试

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            4379854374 小鱼小 2 条回复 最后回复 回复 引用 0
            • 4379854374
              龍魂 @小鱼
              最后由 编辑

              @小鱼
              感谢大佬回复!

              我根据你说的排查方式,通过netcat工具进行端口的udp联通性测试:

              监听机器(局域网ip:192.168.20.6):
              netcat -lu -p 7900
              发送机器:
              netcat -u 192.168.20.6 7900

              发送机器执行指令后,输入字符串回车后,能够在监听机器上收到。
              说明两机器端口为7900的udp通信时联通的。
              (选择7900是因为根据官网端口计算器,域id 为2时,多播端口是7900和7901)

              但是在这种情况下,立即用
              ros2 multicast receive 和 ros2 multicast send
              进行测试,发现无法接收。

              最后,通过
              setx ROS_DOMAIN_ID 2 设置域id
              尝试运行talker和listener的节点,topic也无法通信

              希望能得到提示!

              1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @小鱼
                最后由 小鱼 编辑

                @小鱼 在 ROS2.0 简单的多机通讯 中说:

                另外尝试两台电脑直连,配置静态ip通信试试

                这个有测试吗


                实在不行可以尝试不走多播,直接指定服务地址:http://fishros.org/doc/ros2/humble/Tutorials/Advanced/Discovery-Server/Discovery-Server.html?highlight=discovery

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                4379854374 小鱼小 2 条回复 最后回复 回复 引用 0
                • 4379854374
                  龍魂 @小鱼
                  最后由 编辑

                  @小鱼
                  看到你的回复后立即做了测试:

                  将之前提到的两台电脑的TCP/Ipv4都进行了配置,ip地址、子网掩码和网关都用了没改之前,通过ipconfig获取的各自的ip地址(掩码和网关相同)。

                  并且再次通过上述的netcat方式,测试udp的端口联通性可以发送字符串并接收到。

                  但是ros2的联通测试如下:
                  1 多播测试ros2 multicast send/receive :没有接收到发送的多播消息
                  2 在一端运行ros节点,另一端用ros2 topic list 查看话题,没有发现对应的话题
                  3 两机均设置ROS_DOMAIN_ID 为 2 后,在一端运行listener,另一端运行talker,没有接收到消息。

                  这个情况我实在很费解 T T

                  1 条回复 最后回复 回复 引用 0
                  • 小鱼小
                    小鱼 技术大佬 @小鱼
                    最后由 编辑

                    @小鱼 在 ROS2.0 简单的多机通讯 中说:

                    直接指定服务地址:http://fishros.org/doc/ros2/humble/Tutorials/Advanced/Discovery-Server/Discovery-Server.html?highlight=discovery

                    建议测试下这个

                    新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                    4379854374 1 条回复 最后回复 回复 引用 0
                    • 4379854374
                      龍魂 @小鱼
                      最后由 437985437 编辑

                      @小鱼
                      我按照文档中的方式,先在一台设备上进行测试:
                      1 启动发现服务
                      fastdds discovery --server-id 0
                      2 新终端设置环境变量,并启动listener节点:
                      setx ROS_DISCOVERY_SERVER 192.168.82.51:11811
                      ros2 run demo_nodes_cpp listener --ros-args --remap __node:=listener_discovery_server
                      3 新终端设置环境变量,并启动talker节点:
                      setx ROS_DISCOVERY_SERVER 192.168.82.51:11811
                      ros2 run demo_nodes_cpp talker --ros-args --remap __node:=talker_discovery_server
                      4 文档上为了说明这种方式和多播不同,运行了新的listnener和talker(均是新终端),并说明这种方式和上面的节点相互独立
                      ros2 run demo_nodes_cpp listener --ros-args --remap __node:=simple_listener
                      ros2 run demo_nodes_cpp talker --ros-args --remap __node:=simple_talker
                      5 到这里我的验证出现了问题:
                      两个talker发送的消息没有像文档中说的那样互相独立,而是混在一起被两个listener同时接收:
                      1.jpg

                      文档中说

                      请运行未连接到发现服务器的节点

                      rqt显示我最后创建的两个节点也连接到发现服务器了(但新创建的终端并没有运行 setx ROS_DISCOVERY_SERVER 192.168.82.51:11811)

                      我对 ”连接到发现服务器“ 这句话不是很理解,是这里出了问题吗?

                      小鱼小 1 条回复 最后回复 回复 引用 0
                      • 小鱼小
                        小鱼 技术大佬 @437985437
                        最后由 编辑

                        @437985437 在 ROS2.0 简单的多机通讯 中说:

                        11811

                        是默认的ddsserver和port,你可以尝试新的端口或domainid进行测试

                        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                        4379854374 2 条回复 最后回复 回复 引用 0
                        • 4379854374
                          龍魂 @小鱼
                          最后由 编辑

                          @小鱼
                          我通过更改dds服务端口号的方法,在单机上能够将两组不同的“服务-talker-listener”隔离开,分别发布和订阅。

                          完成了上述验证后,开始两台电脑通过这种方式进行连接:

                          环境:

                          • 电脑1:作为发布端,服务也在这台电脑上运行(ip 192.168.82.51)
                          • 电脑2:作为订阅端

                          操作:

                          • 在电脑1上设定环境变量,启动服务
                            $env:ROS_DISCOVERY_SERVER="192.168.82.51:11815"
                            fastdds discovery --server-id 0 --ip-address 192.168.82.51 --port 11815
                          • 在电脑1新建终端,设定环境变量,启动talker
                            $env:ROS_DISCOVERY_SERVER="192.168.82.51:11815"
                            ros2 run demo_nodes_cpp talker
                          • 在电脑2新建终端,设定环境变量,启动listener
                            $env:ROS_DISCOVERY_SERVER="192.168.82.51:11815"
                            ros2 run demo_nodes_cpp listener
                          • 为了排除话题发布配置错误的问题,在电脑1上新建终端,设定环境变量,启动listener
                            $env:ROS_DISCOVERY_SERVER="192.168.82.51:11815"
                            ros2 run demo_nodes_cpp listener

                          结果:

                          • 电脑1 内的订阅者能够监听到发布者的消息
                          • 电脑2 内的订阅者能够监听到电脑1发布者的消息

                          最后的结论是,电脑通过wifi在局域网里连接,虽然udp可以联通,但组播的方式仍收到限制,最后通过集中式的发现协议成功联通。(撒花 ❀\ ^^/)

                          1 条回复 最后回复 回复 引用 3
                          • 4379854374
                            龍魂 @小鱼
                            最后由 编辑

                            @小鱼
                            非常感谢大佬的解答,很有帮助!

                            1 条回复 最后回复 回复 引用 1
                            • 4379854374 437985437 将这个主题标记为已解决,在
                            • Z zhuhaier1992 在 中 引用了 这个主题
                            • 24384131712
                              我不和二极管说话
                              最后由 编辑

                              @小鱼 @437985437 大家好,我遇到了一样的问题。

                              环境描述:我一共有四台主机,两台是台式电脑,一台树莓派,一台jetson,运行的都是ubuntu22.04,humble。

                              项目代码:ROS官网中的话题教程(cpp_pubsub)示例:Writing a simple publisher and subscriber (C++)

                              基本情况:四台主机均连接在同一个局域网,能够互相ping通,设置了ROS_DOMAIN_ID保证了在同一个域内

                              问题详情:四台主机不能互相发现节点以及话题(最开始是能的,随着主机的增多就不能了)。我跟随着这个帖子使用fastdds发现服务成功解决了这个问题。但是我现在比较疑惑为什么会出现这个问题。

                              尝试解决:我现在认为的问题是占用了同一个端口导致了这个问题,例如我发现 使用sudo ss -tual命令,我发现不同的主机使用了相同的ROS节点间通信端口(如7410,7411),但我不知道该如何避免使用同样的端口。

                              很疑惑为什么会出现这样的问题,烦请解惑,万分感谢!

                              1 条回复 最后回复 回复 引用 0
                              • 名 名字真拿起 在 中 引用了 这个主题
                              • 第一个帖子
                                最后一个帖子
                              皖ICP备16016415号-7
                              Powered by NodeBB | 鱼香ROS