我是ROS项目的开发人员。最近,我尝试在WSL2()上使用ROS(旋律),一切都很好。但是当我想使用另一台也在同一个局域网(LAN)上的PC进行通信时,我遇到了一些麻烦。在设置诸如"ROS_MASTER_URI,ROS_IP“这样的环境变量之前,我知道由于WSL 2在Hyper-V上工作,所以WSL2上的IP显示并不是真正的局域网中的。为了让局域网中的每个人都能与特定的主机进行通信,我必须执行如下命令: WSL2上的端口。
netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr
但这里有一个新问题:
每次启动文件时,使用TCPROS相互通信的节点都有一个随机端口。
我该如何处理这种问题呢?或者互联网上有什么我可以看的信息?
谢谢。
发布于 2020-12-13 15:55:37
根源问题在WSL第4150期中描述。引用那条线索,
WSL 2似乎是NAT --它是虚拟网络,而不是连接到主机NIC。
选项1-登录时端口转发脚本
注意:从@kraego的评论(以及我根据评论看到的编辑的问题)来看,这对ROS来说可能不是一个好的选择,因为端口号是随机分配的。这使得端口转发必须动态地完成。
在这个问题中描述了一些解决方法,您已经知道了第一部分(端口转发)。主要技术似乎是创建一个PowerShell脚本来检测IP地址,并创建运行在Windows登录上的端口转发规则。在线程顶部附近的这个特别的评论似乎是典型的go-to答案,尽管许多人已经在整个很长的线程中发布了他们的调整或替代方案。
缺点之一--我认为这里提到的脚本需要在登录时运行,因为WSL子系统似乎只想在用户登录时运行。我已经发现,试图通过OpenSSH运行WSL服务或实例会导致该实例/服务在SSH会话关闭后不久关闭,除非用户已经使用打开的WSL实例登录到Windows。
备选方案2- WSL1
我还建议,假设它适合您的工作流,并且如果ROS在它上工作(考虑到您需要的设备访问权限,它可能不适用,但不确定),您可以简单地使用WSL1而不是WSL2来避免这种情况。你可以通过以下方法来尝试:
wsl --export <DistroName> <FileName>
)wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1
实例简单地更改版本是可能的,但是我倾向于在做备份之前有一个备份,而且只要您正在备份,您就可以保留原来的版本。
https://stackoverflow.com/questions/65275743
复制相似问题