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

    ROS2.0 简单的多机通讯

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