Skip to content

Isaac ROS Container

Terminal window
# Start container (from committed image, NOT isaac-ros-cli)
docker run -d --name isaac_ros_dev_container \
--runtime nvidia --network host --ipc host --privileged \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-v ~/workspaces/isaac_ros-dev:/workspaces/isaac_ros-dev \
--entrypoint /usr/local/bin/scripts/workspace-entrypoint.sh \
-e HOST_USER_UID=$(id -u) -e HOST_USER_GID=$(id -g) -e USERNAME=admin \
isaac-ros-apriltag:latest \
bash -c "sleep infinity"
# Attach a shell
docker exec -it -u admin isaac_ros_dev_container bash
# Stop
docker stop isaac_ros_dev_container && docker rm isaac_ros_dev_container

Safe for attaching to an already running container (docker exec bash), but never use it to start one.


Current imageisaac-ros-apriltag:latest (~19.8 GB, hand-built via docker commit)
New base (pulled)nvcr.io/nvidia/isaac/ros:noble-ros2_jazzy_d3e84470d576702a380478a513fb3fc6-amd64

Switching to a reproducible Dockerfile. See Dockerfile Plan.

New base: full NVIDIA image (noble + ros2_jazzy layers) with ROS 2 Jazzy, TensorRT, PyTorch, nav2, rviz2, foxglove-bridge, slam_toolbox, OpenCV, and CUDA dev tools.

Custom additions on top (Dockerfile):

PackagePurpose
ros-jazzy-isaac-ros-apriltagGPU AprilTag
ros-jazzy-isaac-ros-visual-slamcuVSLAM
ros-jazzy-isaac-ros-nvbloxGPU 3D reconstruction
ros-jazzy-foxglove-compressed-video-transportH.264 NVENC for Foxglove
ros-jazzy-ffmpeg-encoder-decoder + ffmpegNVENC encoding
FastDDS no-SHM XML/etc/fastdds_no_shm.xml
Entrypoint scriptsfoxglove-bridge + H.264 republisher auto-start

Not needed in container:

  • Unitree SDK/packages — runs on G1’s Jetson Orin, not workstation
  • System ROS 2 on host — conflicts with Isaac Sim’s Python 3.11

ros-jazzy-isaac-ros-apriltag # GPU AprilTag detection
ros-jazzy-foxglove-bridge # WebSocket bridge (port 8765)
ros-jazzy-foxglove-compressed-video-transport # H.264 NVENC video for Foxglove
ros-jazzy-ffmpeg-encoder-decoder # ffmpeg with NVENC
ffmpeg # CLI tool

Path: /tmp/fastdds_no_shm.xml (Dockerfile moves to /etc/fastdds_no_shm.xml)

Fixes SHM transport breakage between Isaac Sim (host) and container. Without it, topics are discoverable but data doesn’t flow.

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>udp_transport</transport_id>
<type>UDPv4</type>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="default_participant" is_default_profile="true">
<rtps>
<userTransports>
<transport_id>udp_transport</transport_id>
</userTransports>
<useBuiltinTransports>false</useBuiltinTransports>
</rtps>
</participant>
</profiles>
</dds>

Set in /etc/profile.d/fastdds-fix.sh — login shells pick it up automatically.

Path: /usr/local/bin/scripts/entrypoint_additions/50-foxglove-bridge.sh

Auto-starts foxglove-bridge on port 8765 at container launch.

#!/bin/bash
export FASTRTPS_DEFAULT_PROFILES_FILE=/tmp/fastdds_no_shm.xml
source /opt/ros/jazzy/setup.bash
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765 &

Port8765 (WebSocket)
Connect from Macws://100.101.214.44:8765 (Tailscale) or ws://workstation:8765
Auto-startsVia entrypoint addition when container uses workspace-entrypoint

Start manually after container is up:

Terminal window
docker exec -d isaac_ros_dev_container bash -c \
"export FASTRTPS_DEFAULT_PROFILES_FILE=/tmp/fastdds_no_shm.xml && \
source /opt/ros/jazzy/setup.bash && \
ros2 run image_transport republish raw foxglove --ros-args \
-r in:=/front_stereo_camera/left/image_rect_color \
-r out/foxglove:=/front_stereo_camera/left/compressed_video \
-p out.foxglove.encoder:=h264_nvenc \
-p out.foxglove.gop_size:=10 \
-p out.foxglove.bit_rate:=5000000 \
-p out.foxglove.qmax:=10 \
-p 'out.foxglove.encoder_av_options:=forced-idr:1,preset:p1,tune:ll'"
  • Subscribes to raw /front_stereo_camera/left/image_rect_color
  • Publishes H.264 NVENC encoded to /front_stereo_camera/left/compressed_video
  • H.265 does NOT work with Foxglove browser (can’t decode keyframes)
  • NVENC requires gop_size > 1

Runs ros2 inside the container with FastDDS fix:

Terminal window
docker exec isaac_ros_dev_container bash -c \
"export FASTRTPS_DEFAULT_PROFILES_FILE=/tmp/fastdds_no_shm.xml && \
source /opt/ros/jazzy/setup.bash && \
ros2 $*"

FastDDS XML file or env var is missing. Recreate:

Terminal window
docker exec isaac_ros_dev_container bash -c 'cat > /tmp/fastdds_no_shm.xml << "XML"
<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>udp_transport</transport_id>
<type>UDPv4</type>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="default_participant" is_default_profile="true">
<rtps>
<userTransports>
<transport_id>udp_transport</transport_id>
</userTransports>
<useBuiltinTransports>false</useBuiltinTransports>
</rtps>
</participant>
</profiles>
</dds>
XML'

Foxglove says “Check that WebSocket server is reachable”

Section titled “Foxglove says “Check that WebSocket server is reachable””

foxglove-bridge isn’t running. Start it:

Terminal window
docker exec -d isaac_ros_dev_container bash -c \
"export FASTRTPS_DEFAULT_PROFILES_FILE=/tmp/fastdds_no_shm.xml && \
source /opt/ros/jazzy/setup.bash && \
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765"

foxglove-bridge started without FastDDS fix. Kill and restart:

Terminal window
docker exec isaac_ros_dev_container bash -c \
"pkill -f foxglove_bridge; sleep 1; \
export FASTRTPS_DEFAULT_PROFILES_FILE=/tmp/fastdds_no_shm.xml && \
source /opt/ros/jazzy/setup.bash && \
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765 &"

isaac-ros activate recreated from base image. Use docker run from isaac-ros-apriltag:latest instead.