Skip to content

System Architecture

Two modes: simulation (Isaac Sim on workstation) and real robot (Unitree G1 with Jetson Orin). Both share the same Isaac ROS container on the workstation for GPU perception and visualization.


  1. Isaac Sim renders scene + simulates physics for G1 robot
  2. Bundled ROS 2 bridge publishes camera, IMU, joint state topics via DDS
  3. Isaac ROS container receives topics over UDP DDS (FastDDS SHM disabled)
  4. GPU perception runs on RTX 3090: SLAM, AprilTag, nvblox
  5. H.264 NVENC republisher encodes camera feeds for remote viewing
  6. foxglove-bridge exposes all topics over WebSocket on port 8765
  7. Foxglove Studio connects from browser (Mac via Tailscale)
  • Isaac Lab runs headless in the isaaclab conda env
  • Trains RL policies for G1 locomotion, manipulation
  • No Isaac ROS container needed during training (pure sim loop)
  • Trained policies deploy to real G1 via unitree_ros2

  1. G1’s Orin publishes camera, IMU, joint state topics via CycloneDDS
  2. Workstation’s Isaac ROS container receives topics over DDS (Ethernet)
  3. GPU perception runs on RTX 3090 (offloaded from Orin for heavy tasks)
  4. Results published back to G1 over DDS (SLAM pose, detections, maps)
  5. foxglove-bridge + H.264 republisher provide remote visualization
  6. Foxglove Studio connects from browser
DeviceIPRole
Development PC (workstation)192.168.123.99Isaac ROS container, visualization
G1 internal RockChip192.168.123.161Low-level motor control
G1 internal Orin192.168.123.164High-level control, sensors, ROS 2
TopicTypeDirection
/lowstateunitree_hg::LowStateG1 -> workstation
/lowcmdunitree_hg::LowCmdworkstation -> G1
/api/sport/requestHigh-level motionworkstation -> G1
Camera topicssensor_msgs/ImageG1 -> workstation
IMU topicssensor_msgs/ImuG1 -> workstation

G1 uses CycloneDDS (not FastDDS). Set in the Isaac ROS container:

Terminal window
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI='<CycloneDDS><Domain><General><Interfaces>
<NetworkInterface name="eth0" priority="default" multicast="default"/>
</Interfaces></General></Domain></CycloneDDS>'

ros2_jazzy base image ships with rmw_cyclonedds_cpp pre-installed.

The G1’s Orin can run Isaac ROS perception locally, but the RTX 3090 is far more powerful.

WorkloadLocationExamples
Heavy perceptionWorkstation (RTX 3090)SLAM, nvblox, large model inference
Latency-criticalOrin (final deployment)Obstacle detection, emergency stop

During development, run everything on workstation.


nvcr.io/nvidia/isaac/ros:noble-ros2_jazzy_<hash>-amd64

Includes ROS 2 Jazzy (50+ packages), TensorRT, PyTorch, nav2, rviz2, foxglove-bridge, slam_toolbox, OpenCV, CUDA dev tools, VPI, CV-CUDA, and Triton.

PackagePurpose
ros-jazzy-isaac-ros-apriltagGPU AprilTag detection
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-decoderffmpeg NVENC support
ffmpegCLI tool
FastDDS no-SHM XMLFix SHM transport for sim mode
Entrypoint: 50-foxglove-bridge.shAuto-start foxglove-bridge
Entrypoint: 60-h264-republisher.shAuto-start H.264 NVENC republisher
  • Unitree SDK — runs on the G1’s Orin, not the workstation
  • Unitree ROS 2 packages — G1 publishes standard ROS 2 topics, container just subscribes
  • System ROS 2 on host — conflicts with Isaac Sim’s bundled Python 3.11 rclpy
  • Separate Unitree Docker container — G1 is a standard ROS 2 robot from the container’s perspective

Runs on the G1, not the workstation.

PackageLocationPurpose
unitree_sdk2G1 OrinC++ SDK for motor control
unitree_sdk2_pythonG1 OrinPython bindings via pybind11
unitree_ros2G1 OrinROS 2 bridge (publishes topics)
CycloneDDS 0.10.2+G1 OrinDDS middleware
RealSimulated
unitree_ros2 on OrinIsaac Sim’s bundled ROS 2 bridge
Physical sensorsSimulated cameras/IMU in Isaac Sim
unitree_sdk2 motor controlIsaac Sim physics engine
G1 USD modelunitree_sim_isaaclab or Isaac Lab g1.usd