ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)

1、问题描述

在两台电脑上部署vm虚拟机,且在虚拟机Ubuntu中安装ROS2,两台电脑位于同一个局域网下。在ROS2中,理想情况是,多个机器上的不同节点只要在同一个ROS_DOMAIN_ID、同一个局域网下,既可以进行多机通讯,即在设备1上运行节点,在设备2上的命令行输入如下指令即可查看运行于设备1中的节点名称。

ros2 node list

然而在我的实验中却没生效,我几乎尝试了能想到的、网上能找到的所有方法,废了好大的功夫,最终成功解决问题。如果你也有同样的问题,那么这篇文章可能会帮助到你。

2、预备知识

如果你是计算机专业的,或学习过计算机网络相关知识,那你的知识储备是够用的。如果你像我一样,是传统工科专业,没有系统学习过相关知识,那么你需要先了解一下IP地址、子网掩码、组播等相关概念,以及vm虚拟机网络的桥接、NAT等模式代表的含义。最基本的还有命令行中的ping命令。

3、解决方法

基础要求:关闭win防火墙,并在 “网络和internet->状态->高级网络设置->网络和共享中心->更改高级共享设置”中启用网络发现和打印机共享。
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第1张图片

3.1 方法一:虚拟机网络连接采用桥接(对我有效的方法)

虚拟机默认的NAT模式,可以使虚拟机与主机共用IP,可以访问局域网的其他主机,但局域网的其他主机无法访问虚拟机,虽然可以调整,但较为麻烦就没有尝试。
而桥接模式,则相当于直接连接主机的物理端口,虚拟机使用独立的IP,虚拟机和主机在局域网中属于平级关系,而桥接的设置流程主要如下:

3.1.1 VMware 虚拟机设置选项中把模式选为桥接

ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第2张图片

3.1.2 桥接的端口设置为实际物理采用的端口

比如我电脑的采用的物理端口名称为“Realtek PCIe GBE …”

ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第3张图片

player 版 vm,桥接端口选项就在桥接模式旁。
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第4张图片

pro版则在上方“编辑->虚拟网络编辑器”中设置。

3.1.3 确保相应虚拟网卡开启桥接服务

如不确定,则可以全部开启。

虚拟网卡
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第5张图片

3.1.4 打开虚拟机Ubuntu,配置静态IP

sudo ifconfig ens33 192.168.1.155 netmask 255.255.255.0

其中 ens33 为虚拟机网口名称,192.168.1.155是为虚拟机设置的静态IP,需要与局域网其他机器处于同一个网络段,255.255.255.0为子网掩码,需要根据实际情况调整,网口名称可用ifconfig命令查看。

ifconfig #该命令会显示相关网络信息

ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第6张图片

3.1.5 重启网络

sudo service network-manager restart

3.1.6 检查网络

ping 192.168.1.160#主机IP
ping 192.168.1.170#另一台虚拟机的IP,当然另一台虚拟机也要如上设置

3.1.7 运行节点并查看

此时,在一台设备上运行节点,在另外一台设备上即可查看

ros2 topic list

3.1.8 注意事项

上述设置的静态IP是临时的,重启虚拟机后将失效,如果想永久设置,则在临时设置的基础上,打开Ubuntu网络设置,将当前连接设置成自动连接。

ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第7张图片
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第8张图片
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第9张图片

3.2 方法二:开启路由多播功能(其他情况可能有用的方法)

ros2的多机通讯需要开启多播功能,但有一些系统没有默认开启,官方提供解决办法,这里提供了截图和链接。
官方解决方法连接
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第10张图片

3.3 多播测试

可以通过多播测试,对ros2的多机通信进行测试,并检测多播是否有效。在一台设备上开启接收:

ros2 multicast reiceve

在令一台设备上发送:

ros2 multicast send

如果接收端收到信息,则代表网络通讯没有问题。

4 总结

ros2学习坑很多,还得慢慢踩。。。。。。

5 补充更新

在方法一中,设置完桥接之后,虽然虚拟机和其他机器可以相互PING通,但是却无法上网,那么有没有一种方法,可以在此基础上实现虚拟机的上网呢? 答案是肯定的,而且十分简单。
如图,在虚拟机设置中,添加一个新的网络适配器,并将新的网络适配器设置成NAT模式即可。
ROS2多机通讯,基于两台VM虚拟机的多机通讯,通讯失败解决办法(适用于多台虚拟机或物理机间的互PING)_第11张图片

你可能感兴趣的:(问题解答,网络,ubuntu)