通过局域网 (LAN) 与 WSL2 上的 ROS 进行通信时出现问题

元哼黃*_*元哼黃 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 相互通信的节点都有一个随机端口。

我该如何处理这种问题?或者网上有什么资料可以看一下吗?

谢谢。

Not*_*1ds 4

WSL 问题 #4150中描述了根本问题。引用该线程,

WSL 2 似乎对其虚拟网络进行 NAT,而不是将其桥接到主机 NIC。

选项 1 - 登录时的端口转发脚本

注意:从 @kraego 的评论(以及编辑后的问题,我只是根据评论看到的)来看,这对于 ROS 来说可能不是一个好的选择,因为端口号是随机分配的。这使得端口转发必须动态完成。

该问题中描述了许多解决方法,您已经弄清楚了第一部分(端口转发)。主要技术似乎是创建一个 PowerShell 脚本来检测 IP 地址并创建在 Windows 登录时运行的端口转发规则。 尽管许多人在很长的线程中发布了他们的调整或替代方案,但线程顶部附近的这个特定评论似乎是规范的首选答案。

一个缺点 - 我相信提到的脚本需要在登录时运行,因为 WSL 子系统似乎只想在用户登录时运行。我发现尝试通过 Windows OpenSSH 运行 WSL 服务或实例导致该实例/服务在 SSH 会话关闭后很快关闭,除非用户已经登录到 Windows 并且打开了 WSL 实例。

选项 2 - WSL1

我还建议,假设它适合您的工作流程,并且 ROS 可以在其上工作(考虑到您需要的设备访问权限,但不确定),您可以简单地使用 WSL1 而不是 WSL2 来避免这种情况。您可以通过以下方式尝试一下:

  1. 备份现有发行版(从 PowerShell 或 cmd,使用wsl --export <DistroName> <FileName>
  2. 将备份导入到新的 WSL1 实例中wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1

可以简单地更改版本,但我倾向于在执行此操作之前先进行备份,并且只要您进行备份,您也可以将原始版本保留在原处。

  • 经过反复试验,可以采用方案2;选项1,由于我不太擅长脚本,所以我需要更多时间学习和尝试。无论如何,这是一个非常有用的答案。太感谢了。(选项2参考:https://winaero.com/export-import-wsl-linux-distro-windows-10/) (2认同)