Teleoperation¶
Full-body SMPL pose tracking — squats, crouching, arm manipulation and gait — streamed from the PICO headset and ankle trackers to the robot. Complete Setup first.
Launch¶
From the repository root:
bash scripts/run_teleop_wbc.sh simple/G1WholebodyXMoveBendCarryBoxSonic-v0
The launcher starts the external SONIC controller and the simulation together;
Ctrl+C stops both.
Options
Recording is on by default — the launcher passes
--record, writing a LeRobot dataset underdata/teleop_wbc/<env_id>/level-0. Pass--no-recordto disable it, or--save-dir/--num-episodesto change the destination and episode count.HEADLESS=1— skip the desktop viewer and stream only to the headset.Engaging enters PLANNER, then auto-advances to POSE;
A+Xtoggles between them at runtime.
Stabilize and stand¶
There is no crane used. Each episode reset disables the elastic band
(band.enable = False) and the robot is held instead by an in-process
decoupled WBC: the lower-body RL policy balances while the upper body ramps to
the WBC default pose. This runs from spawn until robot.stabilized latches —
max |qvel[0:6]| < 1e-3 after at least 100 steps (1 s at 200 Hz) — at which
point control hands over to the external SONIC controller and the terminal
prints Robot stabilized — handing control to the SONIC controller.
To engage:
Stand in the calibration pose: stiff upright stance, feet together, upper arms at your sides, forearms bent 90° forward (L-shape at the elbows), palms facing inward.
Press
A+X(A+B+X+Yalso works). This calibrates VR 3-point tracking against the current SMPL frame and engages the controller.
Engaging always enters PLANNER mode first — the controller only latches
operator_state.start from a PLANNER command, so entering POSE straight from
OFF would leave the policy in WAIT_FOR_CONTROL with the arms frozen. The robot
stands in PLANNER. With --auto_pose (set by the launcher) the manager then
advances to POSE on its own as soon as control is confirmed live via g1_debug,
or after a 6 s fallback if that telemetry is unavailable:
[Manager] auto_pose: engaging PLANNER first to latch control, then advancing to POSE
[Manager] auto_pose: control confirmed via g1_debug -> advancing to POSE
Controls¶
Action |
Input |
Description |
|---|---|---|
Engage & calibrate |
|
Calibrate + engage; enters PLANNER, then auto-advances to POSE. |
Toggle POSE / PLANNER |
|
Full-body SMPL teleop ⟷ stick locomotion. |
VR 3-point mode |
Left joystick click |
Head + wrists tracking, planner legs. |
Left / right hand |
Left / right index trigger |
Open / close the dexterous hand. |
Reset episode |
Left grip + right grip |
Force a simulation episode reset. |
Emergency stop |
|
Disengage the policy, manager returns to |
Modes¶
POSE — streams all 24 SMPL joints from the headset and ankle trackers; squatting, bending and arm reach are mirrored in real time.
PLANNER — joystick base movement, VR body tracking disabled.
VR_3PT — head and wrists tracked, legs driven by the reference planner.
Workflow¶
Start the stack with
run_teleop_wbc.sh.Wait for the in-process WBC to settle the robot (
[status]line showsfree, then the handover message).Stand in the calibration pose and press
A+X.The manager latches control in PLANNER and advances to POSE.
Teleoperate.
Squeeze both grips to reset the episode when done.