Collecting demonstrations (VR)#
Note
Collection needs an OpenXR runtime, so it runs on Linux and not on macOS.
Install with uv sync --extra vr --extra agent (see
Installation).
An operator wears an OpenXR headset. We use a Quest 3 streamed over Wi-Fi with WiVRn. The frozen lower body walks the robot from stick commands, and the operator’s hand poses drive the arms through mink differential IK [2].
Running the collector#
bigym-collect records in the task’s official environment,
bigym.loco.make(task), with the G1 legs under groot_wbc_g1. Every
released demonstration was recorded this way. The collector’s env differs
from the official one in two settings: a longer success hold (below) and an
episode cap of at least 2 min that never binds.
uv run --no-sync bigym-collect --task move_plate
uv run --no-sync bigym-collect --task pick_box --episodes 10 --spectator viser
bigym-collect --help lists the session settings. Batches go to
./bigym_demos/<task>/<timestamp> unless --out-dir says otherwise. Play
them back with uv run bigym-view --demo-dir bigym_demos.
The engage moment#
After reset(), the robot stands and settles with its arms held. The
operator moves their hands to a comfortable pose and engages hand tracking.
The IK tracks pose changes from that pose, so the hands never jump.
Recording starts at the engage. The collector saves the full simulator and
controller state at that instant (see
Determinism and versioning), and replay
restores it and replays the actions bit-exactly. The demos start after the
settle, so evaluation must let the robot settle after reset too
(reset_warmup_steps).
Command mapping#
input |
command |
range |
|---|---|---|
left stick Y / X |
|
±0.35 m/s / ±0.25 m/s |
right stick X |
|
±0.5 rad/s |
right stick Y |
height, integrated at 4 mm per step |
0.4–0.8 m |
hold left grip, then left stick Y |
torso pitch, integrated at 0.8 rad/s (pitch tasks only) |
−0.2 to 0.8 rad |
triggers |
grippers |
open or closed |
The collector caps the height command at 0.80 m. Above that, the GR00T-WBC policy locks the knees and stops stepping. Height and pitch keep their value when the stick is released. Holding the left grip suspends walking.
Success and the training view#
The collector saves successful episodes only, and the operator keeps or discards each one. Every benchmark task has 60 human demonstrations.
An attempt succeeds by the evaluation’s definition: the task reported
success and the robot never fell. Only the hold differs. The collector
requires the success predicate to hold for 3.0 s, where training and
evaluation require 1.0 s (success_hold_seconds).
Cut the raw batch before training. The collector prints this command when it
exits and runs it itself with --export-lerobot:
python -m bigym.loco.demos.success_hold --demo-dir <raw batch>
The cut replays each episode from its engage snapshot on the official env
and ends it on the step where that env latches success. It writes
<raw batch>_hold1s and leaves the raw batch untouched.
Validating a batch#
uv run python bigym/tools/loco/validate_demos.py <demo_dir>
It checks every episode against the npz schema and the batch’s
metadata.json, and exits non-zero on any violation. Before training, check
that the batch’s demo_down_sample_rate matches your env.