win11系统 通过镜像配置 打通 WSL 下的ros2与 同IP端的里一台设备ros2通信;
一、win11 设备 先关闭wsl 关闭指令 wsl --shutdown;
二、win11 设备端 修改 .wslconfig 文件路径:C:\Users\LHAYR\.wslconfig
wsl2
processors=12
swapFile=D:\\AvM\\swap.vhdx
debugConsole=true
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
三、win11电脑重新启动 WSL ,启动完成后 再wsl Ubuntu里验证是否修改成功,输入 ip a | grep eth
正常修改成功后,wsl 会出现192.168.1.X的 IPv4的地址(和你电脑win11 端地址同网段);
robot@LHAYR:~$ ip a | grep eth
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether c2:bf:be:8f:31:7e brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 60:cf:84:c2:54:1a brd ff:ff:ff:ff:ff:ff
link/ether 00:15:5d:a4:b8:f8 brd ff:ff:ff:ff:ff:ff
5: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1492 qdisc mq state UP group default qlen 1000
link/ether bc:9d:ec:34:1f:27 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global noprefixroute eth2
6: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether c2:bf:be:8f:21:6e brd ff:ff:ff:ff:ff:ff
四、win11电脑 设置ros2 的域ID,只有 DOMain ID 相同的节点,才能互相发现,收发话题;
robot@LHAYR:~$ source /opt/ros/jazzy/setup.bash
robot@LHAYR:~$ export ROS_DOMAIN_ID=0
五、运行demo接收
robot@LHAYR:~$ ros2 run demo_nodes_py listener
六、 其它设备:再同一个路由器或者IP网段下,另一台设备运行 ros2(版本相同,这里使用的是jazzy版本); 先设置export ROS_DOMAIN_ID=0;
robot@armbian:~$ source /opt/ros/jazzy/setup.bash
robot@armbian:~$ export ROS_DOMAIN_ID=0
robot@armbian:~$ export ROS_IP=192.168.1.84
七、其它设备:运行发送demo。
robot@armbian:~$ ros2 run demo_nodes_cpp talker
INFO 1786962160.159081428 talker: Publishing: 'Hello World: 1'
INFO 1786962161.159048127 talker: Publishing: 'Hello World: 2'
INFO 1786962162.159064909 talker: Publishing: 'Hello World: 3'
INFO 1786962163.159050941 talker: Publishing: 'Hello World: 4'
INFO 1786962164.159407807 talker: Publishing: 'Hello World: 5'
INFO 1786962165.159384131 talker: Publishing: 'Hello World: 6'
八、 win11设备,会接收到 发送的数据
robot@LHAYR:~$ ros2 run demo_nodes_py listener
INFO\] \[1786962199.409450095\] \[listener\]: I heard: \[Hello World: 40
INFO\] \[1786962200.404100320\] \[listener\]: I heard: \[Hello World: 41
INFO\] \[1786962201.403400571\] \[listener\]: I heard: \[Hello World: 42
INFO\] \[1786962202.404231047\] \[listener\]: I heard: \[Hello World: 43
INFO\] \[1786962203.403598134\] \[listener\]: I heard: \[Hello World: 44
INFO\] \[1786962204.406740564\] \[listener\]: I heard: \[Hello World: 45
INFO\] \[1786962205.403906505\] \[listener\]: I heard: \[Hello World: 46
十、备注 如果 win11 设备 没有显示接收到的 Hello World 信息;
如果还是收不到消息怎么办? 在镜像模式下,如果 talker 和 listener 依然无法通信,99% 是 Windows 防火墙拦截了 UDP 广播包。
10.1快速验证方法:1在 Windows 上暂时关闭"专用网络"的防火墙。
重新测试 talker 和 listener。
如果关闭防火墙后能收到消息,说明就是防火墙的问题。你可以重新开启防火墙,并手动添加入站规则放行 UDP 端口。
十一、设置win11系统的防火窗放行:
第一步:永久放行 ROS2 通信(恢复防火墙)
你现在可以重新打开 Windows 防火墙了。为了防止被拦截,我们需要在防火墙中为 ROS2 添加专门的放行规则。
请在 Windows PowerShell(以管理员身份运行) 中执行以下命令:
1. 放行 ROS2 发现机制(UDP 多播)
New-NetFirewallRule -DisplayName "ROS2 DDS Discovery (UDP)" -Direction Inbound -Protocol UDP -LocalPort 7400-7500 -Action Allow
2. 放行 ROS2 数据传输(TCP)
New-NetFirewallRule -DisplayName "ROS2 DDS Data (TCP)" -Direction Inbound -Protocol TCP -LocalPort 7400-7500 -Action Allow
3. 允许 WSL2 虚拟交换机通过防火墙(关键!)
New-NetFirewallRule -DisplayName "WSL2 vEthernet" -Direction Inbound -InterfaceAlias "vEthernet (WSL*)" -Action Allow
第二步:持久化 ROS2 环境变量
为了避免每次打开终端都要手动输入 export,我们把配置写入 ~/.bashrc。
- 在 WSL2 终端中执行:
echo 'export ROS_DOMAIN_ID=0' >> ~/.bashrc
source ~/.bashrc
- 在里一个终端设备上执行(上述6、7步骤中发送设备):
echo 'export ROS_DOMAIN_ID=0' >> ~/.bashrc
echo 'export ROS_IP=192.168.1.84' >> ~/.bashrc
source ~/.bashrc