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