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

Problem communicating over a local area network (LAN) with ROS on WSL2

我是ROS项目的开发者。最近我正在尝试在 WSL2(Windows 子系统 Linux)上使用 ROS(旋律),一切都很好。但是当我想使用也在同一个局域网(LAN)中的另一台PC进行通信时,我遇到了一些麻烦。在设置像“ROS_MASTER_URI, ROS_IP”这样的环境变量之前,我知道由于 WSL 2 在 Hyper-V 上工作,所以 WSL2 上显示的 IP 不是真实局域网中的 IP。为了让局域网中的每个人都与 WSL2 上的特定 host:PORT 进行通信,我必须执行如下命令。

netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr

但是新问题来了:

The nodes which use TCPROS to communicate with each other have a random PORT every time I launch the file.

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

谢谢。

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

WSL 2 seems to NAT it's virtual network, instead of making it bridged to the host NIC.

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

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

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

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

选项 2 - WSL1

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

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

可以简单地就地更改版本,但我倾向于在执行之前无论如何都要进行备份,只要您正在备份,您也可以将原始版本留在原地。