IsaacSim 5.1 ROS2 connection issue when running WSL2 in mirrored mode

Version

6.0.0
5.1.0
5.0.0
4.5.0
4.2.0

Operating System

Ubuntu 24.04
Ubuntu 22.04 (WSL2)
Ubuntu 20.04
Windows 11
Windows 10
Other (please specify):

Issues when discovering ROS2 topics when running WSL2 in mirrored mode

Detailed Description

I have Isaac sim installed on a windows 11 machine with the goal of running a robotics system with custom ROS2 nodes. Due to my IT department, I am not able to run both Isaac Sim and ROS2 in Linux.

The second best option I found was running Isaac Sim in Windows 11 and using WSL2 to run Ubuntu 22.04 and use ROS2 Humble in WSL2. However, due to my IT department, I cannot do the port-forwarding that the tutorial for WSL2 with Isaac Sim requires. Instead, I set WSL2 to ‘mirrored’ network mode.

At the start, this worked and my Isaac Sim ROS2 nodes showed up in WSL2 ROS2. However, after some restarts, this method broke. The only topics that show up in WSL2 are /parameter_events and /rosout.
A restart of the daemon does not help. Neither does restarting WSL2 or the entire system.

FYI, I checked the ROS_DOMAIN_ID on both sides and the RMW_IMPLEMENTATION to be rmw_fastrtps_cpp.

To check whether basic networking between Windows and WSL2 is working, I started a simple HTTP server inside WSL2:

WSL2:
cd ~
python3 -m http.server 8000

Then I opened the following URL in Chrome on the Windows host:

http://localhost:8000

This worked: Chrome on Windows was able to load the directory listing served from inside WSL2.

My questions are:

  1. Is Windows Isaac Sim + ROS 2 Humble in WSL2 using mirrored networking officially supported?
  2. Does Isaac Sim require WSL2 port forwarding, or should mirrored networking also work?
  3. Are there known issues with Fast DDS discovery between Windows and WSL2 mirrored mode?
  4. Are there recommended Fast DDS XML profiles or discovery server settings for this setup?

Hi @stefan.geerts, thanks for the detailed report and for the thorough troubleshooting steps you’ve already taken.

To answer your questions directly:

  1. Official support: The documented and officially supported path for Windows + ROS2 is the WSL2 NAT mode with port-forwarding as described in the Isaac Sim tutorials. WSL2 mirrored mode is not an officially tested or supported configuration at this time, though it can work in practice.

  2. Root cause of intermittent failure: Even though basic TCP/HTTP works (as your HTTP server test confirms), ROS2 Fast DDS participant discovery relies on UDP multicast (default multicast group 239.255.0.1, port 7400). UDP multicast behavior across the Windows↔WSL2 boundary is unreliable and can break after restarts even in mirrored mode — this is a known limitation of the Windows networking stack with WSL2, not specific to Isaac Sim.

  3. Recommended workaround — Force unicast discovery via Fast DDS XML profile: Create a fastdds_profile.xml on both the Windows side (Isaac Sim) and the WSL2 side (your ROS2 nodes) that disables multicast and uses explicit unicast peer addresses. Since mirrored mode shares 127.0.0.1, you can use localhost as the peer:

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
  <transport_descriptors>
    <transport_descriptor>
      <transport_id>udpv4_transport</transport_id>
      <type>UDPv4</type>
    </transport_descriptor>
  </transport_descriptors>
  <participant profile_name="default_profile" is_default_profile="true">
    <rtps>
      <userTransports>
        <transport_id>udpv4_transport</transport_id>
      </userTransports>
      <useBuiltinTransports>false</useBuiltinTransports>
      <builtin>
        <metatrafficUnicastLocatorList>
          <locator>
            <udpv4>
              <address>127.0.0.1</address>
            </udpv4>
          </locator>
        </metatrafficUnicastLocatorList>
        <initialPeersList>
          <locator>
            <udpv4>
              <address>127.0.0.1</address>
            </udpv4>
          </locator>
        </initialPeersList>
        <discovery_config>
          <discoveryProtocol>SIMPLE</discoveryProtocol>
          <use_SIMPLE_EndpointDiscoveryProtocol>true</use_SIMPLE_EndpointDiscoveryProtocol>
          <use_WriterLivelinessProtocol>true</use_WriterLivelinessProtocol>
        </discovery_config>
      </builtin>
    </rtps>
  </participant>
</profiles>

Set the environment variable on both sides before launching:

export FASTRTPS_DEFAULT_PROFILES_FILE=/path/to/fastdds_profile.xml

On Windows (PowerShell before launching Isaac Sim):

$env:FASTRTPS_DEFAULT_PROFILES_FILE = "C:\path\to\fastdds_profile.xml"
  1. Alternative — Fast DDS Discovery Server: If the unicast approach is still unreliable, consider running a Fast DDS Discovery Server on the WSL2 side and pointing both Isaac Sim and your ROS2 nodes to it via ROS_DISCOVERY_SERVER. This is more robust than peer-to-peer discovery across OS boundaries.

The reason this breaks intermittently after restarts is likely that Windows re-initializes the virtual network adapter, causing previously cached multicast routes to become invalid. The unicast profile avoids this entirely. Let us know if this helps!

closing this thread since there is no update for more than 2 weeks. Please re-open it or open a new one if you still need any support