ROS2.0 简单的多机通讯
-
环境
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 节点进行话题通讯 -
-
求大佬提示,卡了很久,主要是不知道应该用什么方式进行排查,跪求!
-
@437985437 多播走的udp,排查这个局域网自动发现样例,另外尝试两台电脑直连,配置静态ip通信试试
-
@小鱼
感谢大佬回复!我根据你说的排查方式,通过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也无法通信希望能得到提示!
-
@小鱼 在 ROS2.0 简单的多机通讯 中说:
另外尝试两台电脑直连,配置静态ip通信试试
这个有测试吗
实在不行可以尝试不走多播,直接指定服务地址:http://fishros.org/doc/ros2/humble/Tutorials/Advanced/Discovery-Server/Discovery-Server.html?highlight=discovery
-
@小鱼
看到你的回复后立即做了测试:将之前提到的两台电脑的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 启动发现服务
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同时接收:
文档中说
请运行未连接到发现服务器的节点
rqt显示我最后创建的两个节点也连接到发现服务器了(但新创建的终端并没有运行
setx ROS_DISCOVERY_SERVER 192.168.82.51:11811
)我对 ”连接到发现服务器“ 这句话不是很理解,是这里出了问题吗?
-
-
@小鱼
我通过更改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可以联通,但组播的方式仍收到限制,最后通过集中式的发现协议成功联通。(撒花 ❀\ ^^/)
-
@小鱼
非常感谢大佬的解答,很有帮助! -
4 437985437 将这个主题标记为已解决,在
-