Isaac Sim Version
5.1.0
5.0.0
4.5.0
4.2.0
4.1.0
4.0.0
2023.1.1
2023.1.0-hotfix.1
Other (please specify):
Operating System
Ubuntu 24.04
Ubuntu 22.04
Ubuntu 20.04
Windows 11
Windows 10
Other (please specify):
GPU Information
- Model: NVIDIA RTX A4000
- Driver Version: 580.82.07 - CUDA 13.0
Topic Description
Detailed Description
I am working with a workstation running Ubuntu 22.04 with ROS2 Humble installed (which requires Python 3.10), and I have installed Isaac Sim 5.1 following the official documentation (Workstation Installation — Isaac Sim Documentation). In the simulation, I have successfully simulated a LiDAR, an IMU, and published a string to ROS2 using Action Graph nodes. However, to publish a radar point cloud to ROS2 for visualization in RVIZ2, it appears this can only be done via Python code. I have tried publishing via the scripting window and the script node in Action Graph, but both result in the same error: rclpy version incompatibility.
From my research, this seems to be because ROS2 Humble requires Python 3.10, but Isaac Sim uses Python 3.11 for proper extension functionality. To resolve this, I attempted to use the official Docker container for Isaac Sim 5.1 GUI version (Container Installation — Isaac Sim Documentation) to see if I could read topics on the host. I noticed the official container uses Ubuntu 24.04 and ROS2 Rolling, which I thought might be causing issues with topic reading from the host.
Next, I tried an alternative Docker setup from GitHub (GitHub - arambarricalvoj/nvidia_isaac-sim_ros2_docker: Run NVIDIA Isaac Sim in a Docker container with ROS2 Humble and ROS2 bridge already set up.) (adapted for Isaac Sim 5.1) using Ubuntu 22.04 and the official workstation installation, but encountered the same rclpy issues as in the local installation. Additionally, in this custom Docker setup, since I was interested in using all ROS2 tools, I attempted to use the full desktop version and update the Python version used by ROS2 to 3.11, but encountered ROS2 errors during the update, so I abandoned this approach. I then reverted to the official 5.1 container but configured it with additional options via a docker-compose file, including network_mode: host and extra volumes for development.
In this container setup, there are no rclpy errors, and I tested various DDS configurations to visualize topics that worked locally (LiDAR and IMU). I found a working combination with CycloneDDS in the container (with some warnings) and FastDDS in the host, allowing visualization in ROS2 Humble on the host. However, since using two different DDS implementations seemed odd and due to the warnings in Isaac Sim, I attempted to configure both environments with the same DDS but could not get topics to display on the host.
My main issue is the inability to include a radar (which can only be added via code, as far as I know) due to the rclpy error stemming from the Python version mismatch between ROS2 Humble (3.10) and Isaac Sim (3.11). After attempting to solve this by exploring Docker alternatives, I am now interested in obtaining or having explained a stable working environment regardless of the computer or platform—in other words, a robust Docker solution.
Steps to Reproduce
- Install Isaac Sim 5.1 on Ubuntu 22.04 with ROS2 Humble.
- Attempt to publish a radar point cloud via Python script in the scripting window or Action Graph script node.
- Import rclpy in the script.
- Run the simulation and observe the error.
Error Messages
ModuleNotFoundError: No module named 'rclpy._rclpy_pybind11'
The C extension '/opt/ros/humble/lib/python3.10/site-packages/_rclpy_pybind11.cpython-311-x86_64-linux-gnu.so' isn't present on the system. Please refer to 'https://docs.ros.org/en/humble/Guides/Installation-Troubleshooting.html#import-failing-without-library-present-on-the-system' for possible solutions
Full traceback:
At:
/home/usuario/isaacsim/kit/python/lib/python3.11/importlib/__init__.py(126): import_module
/opt/ros/humble/lib/python3.10/site-packages/rpyutils/import_c_library.py(57): import_c_library
/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/impl/implementation_singleton.py(32): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(940): exec_module
<frozen importlib._bootstrap>(705): _load_unlocked
<frozen importlib._bootstrap>(1150): _find_and_load_unlocked
<frozen importlib._bootstrap>(1176): _find_and_load
/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/exceptions.py(15): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(940): exec_module
<frozen importlib._bootstrap>(705): _load_unlocked
<frozen importlib._bootstrap>(1150): _find_and_load_unlocked
<frozen importlib._bootstrap>(1176): _find_and_load
/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/signals.py(15): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(940): exec_module
<frozen importlib._bootstrap>(705): _load_unlocked
<frozen importlib._bootstrap>(1150): _find_and_load_unlocked
<frozen importlib._bootstrap>(1176): _find_and_load
/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/__init__.py(49): <module>
<frozen importlib._bootstrap>(241): _call_with_frames_removed
<frozen importlib._bootstrap_external>(940): exec_module
<frozen importlib._bootstrap>(705): _load_unlocked
<frozen importlib._bootstrap>(1149): _find_and_load_unlocked
<frozen importlib._bootstrap>(1176): _find_and_load
/tmp/carb.YLKgDE/script_1763119302.py(22): <module>
/home/usuario/isaacsim/extscache/omni.kit.window.script_editor-2.0.1+69cbf6ad/omni/kit/window/script_editor/script_editor_widget.py(154): _execute_script_async
/home/usuario/isaacsim/kit/python/lib/python3.11/asyncio/events.py(84): _run
/home/usuario/isaacsim/kit/python/lib/python3.11/asyncio/base_events.py(1936): _run_once
/home/usuario/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(228): run_once
/home/usuario/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(296): <lambda>
In the working Docker setup with CycloneDDS, the following warnings appear:
[WARN] [1763105875.449461265] [rmw_cyclonedds_cpp]: Failed to parse type hash for topic 'ros_discovery_info' with type 'rmw_dds_common::msg::dds_::ParticipantEntitiesInfo_' from USER_DATA '(null)'.
[WARN] [1763105875.449871285] [rmw_cyclonedds_cpp]: Failed to parse type hash for topic 'rt/rosout' with type 'rcl_interfaces::msg::dds_::Log_' from USER_DATA '(null)'.
[WARN] [1763105875.449925140] [rmw_cyclonedds_cpp]: Failed to parse type hash for topic 'rt/parameter_events' with type 'rcl_interfaces::msg::dds_::ParameterEvent_' from USER_DATA '(null)'.
... (additional similar warnings)
Screenshots or Videos
(None provided)
Additional Information
What I’ve Tried
- Workstation installation of Isaac Sim 5.1 on Ubuntu 22.04 with ROS2 Humble, resulting in rclpy import errors.
- Official Docker container for Isaac Sim 5.1 (Ubuntu 24.04, ROS2 Rolling), but issues with topic visibility on host.
- Custom Docker setup based on GitHub repo, adapted for Isaac Sim 5.1 with Ubuntu 22.04, same rclpy errors. Additionally, since I was interested in using all ROS2 tools, I attempted to use the full desktop version and update the Python version used by ROS2 to 3.11, but encountered ROS2 errors during the update, so I abandoned this approach.
- Official Docker container configured via docker-compose with network_mode: host and extra volumes. This resolved rclpy errors.
- DDS configurations:
- Working setup: CycloneDDS in container (with warnings) and FastDDS in host, using provided XML configs.
- Attempted unified DDS but failed to display topics on host.
Docker-compose file used:
services:
isaac-sim:
image: nvcr.io/nvidia/isaac-sim:5.1.0
container_name: isaac-sim
entrypoint: ["sleep", "infinity"]
gpus: all
network_mode: host
environment:
- ACCEPT_EULA=Y
- PRIVACY_CONSENT=Y
- DISPLAY=${DISPLAY}
volumes:
- ${HOME}/.Xauthority:/isaac-sim/.Xauthority
- $HOME/workspace/proyecto/isaac-sim/cache/main:/isaac-sim/.cache:rw
- $HOME/workspace/proyecto/isaac-sim/cache/computecache:/isaac-sim/.nv/ComputeCache:rw
- $HOME/workspace/proyecto/isaac-sim/logs:/isaac-sim/.nvidia-omniverse/logs:rw
- $HOME/workspace/proyecto/isaac-sim/config:/isaac-sim/.nvidia-omniverse/config:rw
- $HOME/workspace/proyecto/isaac-sim/data:/isaac-sim/.local/share/ov/data:rw
- $HOME/workspace/proyecto/isaac-sim/pkg:/isaac-sim/.local/share/ov/pkg:rw
- $HOME/workspace/proyecto/isaac/workspace:$HOME/workspace:rw
user: "1234:1234"
tty: true
stdin_open: true
FastDDS config (host):
<?xml version="1.0" encoding="UTF-8"?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<!-- ==================== TRANSPORT DESCRIPTORS ==================== -->
<transport_descriptors>
<!-- LiDAR transport - Throttled for visualization-->
<transport_descriptor>
<transport_id>lidar_controlled_transport</transport_id>
<type>UDPv4</type>
<sendBufferSize>8388608</sendBufferSize> <!-- 8MB - Controlado -->
<receiveBufferSize>8388608</receiveBufferSize>
<maxMessageSize>65500</maxMessageSize>
<TTL>1</TTL>
<non_blocking_send>false</non_blocking_send> <!-- Blocking para estabilidad -->
</transport_descriptor>
<!-- RGB-D Camera transport - Balanced -->
<transport_descriptor>
<transport_id>rgbd_balanced_transport</transport_id>
<type>UDPv4</type>
<sendBufferSize>4194304</sendBufferSize> <!-- 4MB - Balanceado -->
<receiveBufferSize>4194304</receiveBufferSize>
<maxMessageSize>65500</maxMessageSize>
<TTL>1</TTL>
<non_blocking_send>false</non_blocking_send>
</transport_descriptor>
<!-- Camera transport - Estable -->
<transport_descriptor>
<transport_id>camera_stable_transport</transport_id>
<type>UDPv4</type>
<sendBufferSize>2097152</sendBufferSize> <!-- 2MB - Estable -->
<receiveBufferSize>2097152</receiveBufferSize>
<maxMessageSize>65500</maxMessageSize>
<TTL>1</TTL>
<non_blocking_send>false</non_blocking_send>
</transport_descriptor>
</transport_descriptors>
<!-- ==================== PARTICIPANT PROFILES ==================== -->
<!-- Default participant - Optimized form visualization -->
<participant profile_name="default_participant" is_default_profile="true">
<rtps>
<useBuiltinTransports>false</useBuiltinTransports>
<userTransports>
<transport_id>lidar_controlled_transport</transport_id>
</userTransports>
<builtin>
<discovery_config>
<discoveryProtocol>SIMPLE</discoveryProtocol>
<leaseDuration>
<sec>30</sec>
<nanosec>0</nanosec>
</leaseDuration>
</discovery_config>
</builtin>
<sendSocketBufferSize>8388608</sendSocketBufferSize>
<listenSocketBufferSize>8388608</listenSocketBufferSize>
</rtps>
</participant>
<!-- ==================== PUBLISHER PROFILES ==================== -->
<!-- LiDAR Publisher - Throttled -->
<data_writer profile_name="lidar_visualization_publisher">
<topic>
<kind>NO_KEY</kind>
<name>ouster/points</name>
<dataType>sensor_msgs::msg::dds_::PointCloud2_</dataType>
<historyQos>
<kind>KEEP_LAST</kind>
<depth>1</depth>
</historyQos>
</topic>
<qos>
<reliability>
<kind>BEST_EFFORT</kind>
</reliability>
<durability>
<kind>VOLATILE</kind>
</durability>
<publishMode>
<kind>SYNCHRONOUS</kind> <!-- Synchronous para control -->
</publishMode>
</qos>
<historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
<times>
<heartbeatPeriod>
<sec>0</sec>
<nanosec>100000000</nanosec> <!-- 100ms - 10Hz max -->
</heartbeatPeriod>
</times>
</data_writer>
<!-- ==================== SUBSCRIBER PROFILES ==================== -->
<!-- LiDAR Subscriber - with filters -->
<data_reader profile_name="lidar_visualization_subscriber">
<topic>
<kind>NO_KEY</kind>
<name>ouster/points</name>
<dataType>sensor_msgs::msg::dds_::PointCloud2_</dataType>
<historyQos>
<kind>KEEP_LAST</kind>
<depth>1</depth>
</historyQos>
</topic>
<qos>
<reliability>
<kind>BEST_EFFORT</kind>
</reliability>
<durability>
<kind>VOLATILE</kind>
</durability>
</qos>
<historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
</data_reader>
</profiles>
CycloneDDS config (container):
<?xml version="1.0" encoding="UTF-8"?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain Id="0"> <!-- Cambiado a 0 para coincidir con ROS_DOMAIN_ID -->
<General>
<Interfaces>
<NetworkInterface
address="MyIp" <!-- IP de tu interfaz principal enx489ebd15f638 -->
autodetermine="false"
multicast="false"
prefer_multicast="false"
priority="default"
/>
</Interfaces>
<AllowMulticast>false</AllowMulticast> <!-- Mantener unicast -->
<DontRoute>false</DontRoute>
<EnableMulticastLoopback>true</EnableMulticastLoopback>
<ExternalNetworkAddress>auto</ExternalNetworkAddress>
<ExternalNetworkMask>0.0.0.0</ExternalNetworkMask>
<FragmentSize>1344 B</FragmentSize>
<MaxMessageSize>65500 B</MaxMessageSize>
<MaxRexmitMessageSize>1456 B</MaxRexmitMessageSize>
<MulticastRecvNetworkInterfaceAddresses>preferred</MulticastRecvNetworkInterfaceAddresses>
<MulticastTimeToLive>32</MulticastTimeToLive>
<RedundantNetworking>false</RedundantNetworking>
<Transport>default</Transport>
</General>
<Internal>
<Watermarks>
<WhcHigh>500kB</WhcHigh>
</Watermarks>
</Internal>
<Discovery>
<ParticipantIndex>auto</ParticipantIndex>
<MaxAutoParticipantIndex>9</MaxAutoParticipantIndex>
<Peers>
<Peer address="MyIP" /> <!-- Peer único: IP del host (y contenedor, ya que comparten red) -->
<!-- Si tienes nodos en otras máquinas, agrégalas aquí, ej. <Peer address="otra.ip.aqui" /> -->
</Peers>
</Discovery>
</Domain>
</CycloneDDS>
Related Issues
Additional Context
I would like to work with a hybrid approach: publish all necessary sensor and robot topics from the simulation to develop in ROS2 Humble using both C++ and Python simultaneously. What is the best way to achieve this? Additionally, how should I configure the container or DDS settings in both the container and host to visualize simulation topics? I am seeking a stable, platform-independent Docker solution.