HAMPER β G1 basket pickup policy
Pretrained weights for HAMPER: a Unitree G1 humanoid that walks up to a basket on the floor, threads its forearm through the handle, lifts it, and carries it away. Trained with PPO (rsl_rl) in Isaac Lab through a staged curriculum, on a single RTX A6000.
These weights only work with the HAMPER repository at a matching commit.
The checkpoint is half of the controller: the other half is the state machine in
basket_pickup/commander.py, which sequences approach β squat β thread β lift β
carry and presents the policy with the same commands and stage flag it trained
under. The observation and action layouts are frozen in interface.py; running
the network under any other layout produces garbage rather than an error.
Pinned stack: Isaac Sim 5.1.0, Isaac Lab v2.3.2, rsl_rl 3.1.2, torch 2.7.0+cu128
(see configs/versions.lock in the repository). Scope: simulated whole-body
loco-manipulation with a hybrid PPO + state-machine controller; basket pose is
read from the simulator with synthetic noise β vision-based perception and
sim-to-real transfer are out of scope. SHA-256 hashes of these files are in the
repository's results/manifest.json.
Files
| File | What it is | Cumulative PPO updates | Checkpoint index |
|---|---|---|---|
chain.pt |
The final policy β the full task | 9,500 (2,000 on the chain stage) | model_9495 |
stage_thread.pt |
Parent of chain.pt: walk + carry + lift + thread |
7,500 | model_7496 |
stage_lift.pt |
Parent of stage_thread.pt: walk + carry + lift |
5,500 | model_5497 |
stage_carry.pt |
Parent of stage_lift.pt: walk + carry |
3,500 | model_3498 |
generalist.pt |
Root of the chain: squat-capable walking with a commanded hand target; no basket | 2,000 | model_1999 |
banks/standing_states.pt (+ .json) |
5,000 harvested standing states used to initialize episodes | β | β |
banks/squat_states.pt (+ .json) |
5,000 harvested squatting states used to initialize the lift and thread stages | β | β |
hero_video.mp4 |
60 s demo: full chain, threading close-up, robustness, failure case, ablation | β | β |
Checkpoint indices are rsl_rl iteration indices, which undercount cumulative updates by one per resume; the update column is the number of PPO updates. The staged pipeline additionally used a separate 1,500-update reach policy plus state-bank harvesting to produce the banks above.
Each checkpoint is an rsl_rl OnPolicyRunner save (actor, critic, optimizer
state). The banks are required for evaluating or fine-tuning any stage other
than plain walking: episodes of the carry, lift, thread and chain stages start
from bank states.
Results (chain.pt with the repository's commander)
All numbers use this one checkpoint (training seed 42); the baseline uses three evaluation seeds of 500 episodes each; the 15 s, held-out and training-conditions checks use one seed each. Strict full-chain success requires reaching the carry phase, keeping the elevated basket to episode timeout, and moving it at least 1.0 m after the carry begins.
- Strict, 10 s episodes (the training horizon): 1,216 of 1,500 β 81.1 % (95 % Wilson CI 79.0β83.0 %; per-seed 80.8 / 81.0 / 81.4 %). The shortfall against the softer metric is the episode clock: carry distances have a median of 1.4 m (10th percentile 0.87 m), and with 15 s episodes on the same spawn distribution (one evaluation seed, 500 episodes) strict success is 99.4 % (median carry distance 3.2 m).
- Reached the carry phase and retained the elevated basket through timeout (no distance requirement): 1,476 of 1,500 β 98.4 % (97.6β98.9 %; per-seed 98.4 / 97.8 / 99.0 %).
We observed zero falls, zero basket knock-away events, and three transient retention-latch loss events (0.002 per episode); an episode can re-establish retention after a latch loss.
Per-stage evaluation β reached-phase/retention metrics, no carry-distance requirement (strict full-chain numbers are above):
| Walk | Carry | Lift | Thread | Full chain (reached-carry) | |
|---|---|---|---|---|---|
| Success | 98.9 % | 95.9 % | 98.9 % | 82.2 % | 98.4 % |
Robustness (one policy, no retraining): mean success per tested handle opening stayed at or above 95.5 % across 15β35 cm (lowest single evaluation seed: 94.6 %, at 35 cm; trained on 25 cm) and was flat across basket masses of 0.3β1.5 kg (trained on 0.4β1.0 kg). Among the variables tested, basket-pose noise had the largest effect. The noise is bounded uniform per Cartesian coordinate with the stated half-width (the policy and the state machine share the observation model and bounds but draw independent samples): above 97 % up to a 5 cm half-width, 23.5 % at 10 cm (time-outs, not falls; sweep numbers use the reached-carry metric). On a spawn distribution the state machine was never tuned on (basket 1β3 m away, Β±90Β°, one evaluation seed, 15 s episodes) the chain reaches 98.2 % strict success over 500 episodes.
Things the numbers do not show: the 3 seeds are evaluation seeds of one trained policy (retraining variance was not measured); the evaluation environment turns off Isaac Lab's proprioceptive noise and pushes (under full training conditions the chain scores 87.6 % strict / 100 % reached-carry over 500 episodes, one evaluation seed); the state machine's constants were tuned on the training spawn distribution. The repository README has the full discussion, sweep plots, and ablations.
How to run
Set up the repository as described in its README (Isaac Sim, Isaac Lab v2.3.2,
uv pip install -e source/basket_pickup), then from the repository root:
hf download WillXH/HAMPER --local-dir weights
cp weights/banks/* banks/ # the stage evaluations need the state banks
# full task, 200 episodes, records a video next to the checkpoint
python scripts/eval_stage.py --checkpoint weights/chain.pt --stage D_CHAIN
# individual stages
python scripts/eval_stage.py --checkpoint weights/chain.pt --stage C_THREAD # or B_LIFT, A_CARRY, LOCO
To fine-tune from a stage checkpoint, rsl_rl expects it inside a run directory
under logs/rsl_rl/basket_pickup/:
mkdir -p logs/rsl_rl/basket_pickup/hf_stage_thread
cp weights/stage_thread.pt logs/rsl_rl/basket_pickup/hf_stage_thread/model_7496.pt
python scripts/rsl_rl/train.py --task Basket-Pickup-v0 --headless --num_envs 4096 \
--resume --load_run hf_stage_thread --checkpoint model_7496.pt --max_iterations 2000 --run_name my_chain
License
Weights: MIT. The G1 robot description and Isaac Lab are BSD-3-Clause (NVIDIA / Unitree); rsl_rl is BSD-3-Clause.