最近在 WSL2 + ROS2 Humble + Webots 环境中运行 webots_ros2_universal_robot 示例时,发现 webots-controller 启动后立刻退出。日志显示它自动使用了一个明显不对的地址:
[ERROR] [webots_controller_UR5e-3]: process has died [pid 2087, exit code 1, cmd '/opt/ros/humble/share/webots_ros2_driver/scripts/webots-controller --robot-name=UR5e --protocol=tcp --ip-address=10.255.255.254 --port=1234 ...']
但当前 WSL2 中明明存在正确可用的业务网卡地址,例如 eth3 (192.168.10.88) 或 eth1 (192.168.192.160)。一开始很容易怀疑是 Webots 选错了网卡,实际上问题更准确地说是:webots_ros2_driver 在 WSL2 下自动推断 Webots 主机地址时,错误地读取了 /etc/resolv.conf 中的 nameserver,并把它当成了 Webots 服务器地址。
如果你的 /etc/resolv.conf 恰好包含 nameserver 10.255.255.254,那么最终 webots-controller 就会拿着这个错误地址去连接,导致启动失败。
为什么会出现 10.255.255.254
1. WSL2 可能自动生成 nameserver
在一些 WSL2 环境中,/etc/resolv.conf 里可能会出现这样的内容:
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 10.255.255.254
这类地址本质上是 DNS 相关配置,并不是 Webots 服务地址。
2. webots_ros2_driver 误把 nameserver 当成 Webots 主机地址
webots_ros2_driver 在 WSL2 环境下会尝试自动获取 Windows 主机地址,以便 Linux 侧的 controller 去连接 Windows 侧运行的 Webots。问题在于,它的推断逻辑会去读取 /etc/resolv.conf 的 nameserver,然后直接把它当成目标地址返回。
这就导致了如果 resolv.conf 里是 127.0.0.53、8.8.8.8 或者 10.255.255.254,驱动就会拿对应的 IP 去连接。于是最终在启动参数中出现 --ip-address=10.255.255.254,这显然不是你真正的 Webots 主机地址,所以连接失败。
到底应该用哪个地址
这里要先分两种情况。
情况一:WSL2 使用 mirrored networking(镜像网络)
如果你开启了 mirrored networking,那么最推荐的地址不是某张物理网卡的 IP,而是 127.0.0.1。也就是说 Windows 上运行 Webots,WSL2 中运行 ROS2 controller,两者之间直接通过 127.0.0.1 通信。这种方式通常更稳定,也更符合 mirrored networking 的设计思路。
情况二:特殊 NAT / 多网卡 / 指定业务网络场景
如果你没有使用 mirrored networking,或者你的环境明确要求通过某张业务网卡通信,那么可以手工指定固定地址,例如 192.168.10.88。

