Standalone MuJoCo Simulator for Unitree G1
This is a standalone MuJoCo physics simulator for the Unitree G1 robot, extracted from the GR00T-WholeBodyControl repository.
Features
- Physics Simulation: Runs G1 robot in MuJoCo at 500Hz (2ms timestep)
- DDS Communication: Uses Unitree SDK2 DDS for robot communication
- Compatible: Works with existing
unitree_g1.pycontrol code via DDS - Visualization: Real-time 3D visualization of robot motion
Directory Structure
mujoco_sim_g1/
βββ requirements.txt # Python dependencies
βββ run_sim.py # Main launcher script
βββ config.yaml # Simulation configuration
βββ sim/ # Simulation modules
β βββ base_sim.py
β βββ simulator_factory.py
β βββ unitree_sdk2py_bridge.py
β βββ ...
βββ assets/ # Robot models
βββ g1_29dof_with_hand.xml
βββ meshes/*.STL
Installation
1. Create Virtual Environment (Recommended)
cd mujoco_sim_g1
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
2. Install Dependencies
pip install -r requirements.txt
Note: If you encounter issues with rclpy, you can comment out the ROS2 imports in sim/base_sim.py (lines 11, 609-617) if you don't need camera publishing.
Usage
Basic Usage
# Activate environment
source venv/bin/activate
# Run the simulator
python run_sim.py
The simulator will:
- Load the G1 robot model
- Initialize DDS communication on domain 0
- Open a MuJoCo visualization window
- Start listening for motor commands via DDS
Running with Your Robot Control Code
Once the simulator is running, you can control it from another terminal:
# In another terminal
cd /home/yope/Documents/lerobot
conda activate unitree_lerobot
# Run your existing control code
python test_locomotion_minimal.py
Your unitree_g1.py code will automatically connect to the simulator via DDS!
Configuration
Edit config.yaml to customize:
- SIMULATE_DT: Simulation timestep (default: 0.002s = 500Hz)
- DOMAIN_ID: DDS domain ID (default: 0)
- ENABLE_ONSCREEN: Show visualization (default: true)
- USE_JOYSTICK: Enable gamepad control (default: false)
- ROBOT_SCENE: Path to MuJoCo XML scene
PD Gains
The simulator uses the following PD gains (matching NVIDIA GR00T):
Legs (indices 0-11):
- Hip joints: KP=150, KD=2
- Knee joints: KP=300, KD=4
- Ankle joints: KP=40, KD=2
Waist (indices 12-14):
- All waist joints: KP=250, KD=5
Arms (indices 15-28):
- Shoulders: KP=100, KD=2-5
- Elbows/Wrists: KP=20-40, KD=1-2
Troubleshooting
ImportError: cannot import name 'ChannelFactoryInitialize'
pip install --upgrade unitree-sdk2py
ROS2/rclpy errors
If you don't need camera publishing, edit sim/base_sim.py:
- Comment out line 11:
import rclpy - Comment out lines 609-617 (ROS2 initialization)
Meshes not found
Make sure mesh paths in assets/g1_29dof_with_hand.xml are relative:
<mesh file="meshes/pelvis.STL"/> <!-- Not absolute path -->
Robot falls immediately
Check that:
- PD gains match NVIDIA's values (see config.yaml)
- Velocity command scaling is correct (ang_vel_scale=0.25, cmd_scale=[2.0, 2.0, 0.25])
- Observations for missing joints are zeroed out (indices 12, 14, 20, 21, 27, 28)
Technical Details
Communication
The simulator publishes:
rt/lowstate: Robot state (joint positions, velocities, IMU, etc.)rt/wirelesscontroller: Wireless remote controller state (if joystick enabled)
The simulator subscribes to:
rt/lowcmd: Motor commands (position, velocity, torque, KP, KD)
Coordinate Frames
- World frame: Z-up
- Joint ordering: 29 DOF (12 legs + 3 waist + 14 arms)
- IMU: Quaternion in [w, x, y, z] format
Performance
- Simulation runs at ~500Hz (2ms timestep)
- Viewer updates at ~50Hz (20ms)
- Typical CPU usage: 20-40% on single core
Files from GR00T-WholeBodyControl
This standalone simulator was extracted from:
gr00t_wbc/control/envs/g1/sim/(simulation modules)gr00t_wbc/control/robot_model/model_data/g1/(robot model files)gr00t_wbc/control/main/teleop/configs/g1_29dof_gear_wbc.yaml(configuration)
License
Follows the license of the original GR00T-WholeBodyControl repository.
- Downloads last month
- -