See also: Inference & Deployment Guide for all deployment options
This guide provides a complete workflow for running whole body tracking (WBT) policies on physical robot hardware.
Deploy and run WBT policies on physical Unitree G1 robots to perform motion tracking and dynamic movements.
Note: Booster T1 is not supported for WBT yet
- Physical robot hardware (Unitree G1)
- Ethernet cable
- Unitree G1 remote controller
- Laptop with holosoma inference environment set up
- Hang the robot on the gantry
- Turn on the robot and the controller
- Connect the robot to your laptop with an Ethernet cable
- Put the robot in damping mode
- Press
L2+R2on the controller to enter development mode
For detailed hardware setup instructions, see the Unitree Quick Start page.
Configure your laptop's network interface:
- IP Address:
192.168.123.224 - Netmask:
255.255.255.0
Identify which network interface is connected to the robot:
ifconfigLook for the interface with IP 192.168.123.224. Common names:
eth0- Common Ethernet interface nameenp0s31f6- Modern Linux Ethernet naming
source scripts/source_inference_setup.sh
python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-wbt \
--task.model-path src/holosoma_inference/holosoma_inference/models/wbt/fastsac_g1_29dof_dancing.onnx \
--task.use-joystick \
--task.rl-rate 50 \
--task.interface eth0Note: Replace eth0 with your network interface name (e.g., enp0s31f6). Find it using ifconfig.
Press Enter when prompted in the policy terminal. The robot enters stiff control mode and holds its initial pose.
Press A button on joystick to activate the policy.
Press Start button on joystick to start the motion clip. The robot will begin tracking the whole body motion.
Enter these commands in the policy terminal (where you ran run_policy.py):
| Action | Keyboard | Joystick |
|---|---|---|
| Start the policy | ] |
A button |
| Stop the policy | o |
B button |
| Set robot to default pose | i |
Y button |
| Kill controller program | - | L1 (LB) + R1 (RB) |
| Action | Keyboard | Joystick |
|---|---|---|
| Start motion clip | s |
Start button |
Default pose: Standing with raised arms
This is the default setup described above. The policy runs on your laptop and communicates with the robot over Ethernet.
Advantages:
- Easier to debug and monitor
- No need to modify robot software
- Quick iteration
Requirements:
- Stable Ethernet connection
- Laptop with sufficient compute
Run the policy directly on the robot's onboard Jetson computer for lower latency.
-
Complete hardware setup (see above)
-
SSH to the onboard Jetson:
ssh unitree@192.168.123.164 # Default password: '123' -
Set Jetson to maximum performance:
sudo jetson_clocks
-
Set up the environment on Jetson:
cd ~/holosoma bash scripts/setup_inference.sh source scripts/source_inference_setup.sh
-
Run the policy using
eth0interface:python3 src/holosoma_inference/holosoma_inference/run_policy.py inference:g1-29dof-wbt \ --task.model-path <path-to-onnx> \ --task.use-joystick \ --task.rl-rate 50 \ --task.interface eth0
Advantages:
- Lower latency
- No external laptop required after setup
- More portable
Run the policy inside a Docker container (works both onboard and offboard).
-
Complete hardware setup (see above)
-
Build the Docker image:
bash holosoma/src/holosoma_inference/docker/build.sh
-
Create and enter the Docker container:
bash holosoma/src/holosoma_inference/docker/run.sh
-
Run the policy inside the container:
- Use
eth0on Jetson - Use your interface name on laptop (check with
ifconfig)
- Use
Advantages:
- Consistent environment
- Easier dependency management
- Reproducible setup
- Cannot connect to robot: Check that your IP is
192.168.123.224and netmask is255.255.255.0 - Wrong interface: Use
ifconfigto verify which interface is connected to the robot - Connection drops: Ensure Ethernet cable is properly connected and not damaged
- Stiff mode: The
Enterprompt initializes stiff control mode - this is required for WBT policies to maintain balance before the policy starts - Emergency stop: Press
L1 + R1(LB + RB) on joystick to kill the controller - Default pose: Press
Ybutton to return the robot to standing pose with raised arms - Motion not starting: Ensure you pressed
Startbutton after activating the policy withA
- No joystick response: Ensure
--task.use-joystickflag is set - Keyboard control: Remove
--task.use-joystickflag and useskey to start motion clip - Low responsiveness: Check network latency if running offboard
- RL rate: Always use
--task.rl-rate 50for WBT policies (50 Hz control rate)
- Always keep the robot on the gantry for initial testing
- Have the emergency stop ready (
L1 + R1) - WBT motions can be dynamic - ensure adequate clearance around the robot
- Test with simple motions before attempting complex choreography
- Clip not playing: Ensure you pressed
Startbutton after starting the policy - Unstable tracking: Verify that stiff mode initialization completed successfully