元哼黃*_*元哼黃 6 ip port host ros wsl-2
我是 ROS 项目的开发人员。最近我尝试在 WSL2(Linux 的 Windows 子系统)上使用 ROS(melodic),一切都很好。但是当我想使用另一台也在同一局域网(LAN)中的PC进行通信时,我遇到了一些麻烦。在设置“ROS_MASTER_URI、ROS_IP”等环境变量之前,我知道由于 WSL 2 在 Hyper-V 上工作,因此 WSL2 上显示的 IP 不是真实 LAN 中的 IP。我必须执行如下命令才能使 LAN 中的每个人与 WSL2 上的特定主机:PORT 进行通信。
netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr
Run Code Online (Sandbox Code Playgroud)
但新的问题又来了:
每次我启动文件时,使用 TCPROS 相互通信的节点都有一个随机端口。
我该如何处理这种问题?或者网上有什么资料可以看一下吗?
谢谢。
WSL 问题 #4150中描述了根本问题。引用该线程,
WSL 2 似乎对其虚拟网络进行 NAT,而不是将其桥接到主机 NIC。
注意:从 @kraego 的评论(以及编辑后的问题,我只是根据评论看到的)来看,这对于 ROS 来说可能不是一个好的选择,因为端口号是随机分配的。这使得端口转发必须动态完成。
该问题中描述了许多解决方法,您已经弄清楚了第一部分(端口转发)。主要技术似乎是创建一个 PowerShell 脚本来检测 IP 地址并创建在 Windows 登录时运行的端口转发规则。 尽管许多人在很长的线程中发布了他们的调整或替代方案,但线程顶部附近的这个特定评论似乎是规范的首选答案。
一个缺点 - 我相信提到的脚本需要在登录时运行,因为 WSL 子系统似乎只想在用户登录时运行。我发现尝试通过 Windows OpenSSH 运行 WSL 服务或实例导致该实例/服务在 SSH 会话关闭后很快关闭,除非用户已经登录到 Windows 并且打开了 WSL 实例。
我还建议,假设它适合您的工作流程,并且 ROS 可以在其上工作(考虑到您需要的设备访问权限,但不确定),您可以简单地使用 WSL1 而不是 WSL2 来避免这种情况。您可以通过以下方式尝试一下:
wsl --export <DistroName> <FileName>wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1可以简单地更改版本,但我倾向于在执行此操作之前先进行备份,并且只要您进行备份,您也可以将原始版本保留在原处。
| 归档时间: |
|
| 查看次数: |
5064 次 |
| 最近记录: |