Elastra ProtoMotions residual policy
This residual policy lets the ProtoMotions motion tracker stand the Unitree G1 humanoid up on soft mattresses and trampolines, from fallen postures it never saw in training. It was trained with reinforcement learning in Elastra, a MuJoCo simulation of elastic supports.
- Paper: Elastra: A Simulation Framework for Elastic Bodies
- Code: github.com/yichg/elastra
- Companion model: HoST residual policy
How it works
The motion tracker g1-bones-deploy of NVIDIA ProtoMotions follows a get-up reference motion. It was trained on rigid ground and stays frozen.
At every control step, 50 times per second, the residual policy reads the robot state and the joint targets of the tracker, and adds a bounded correction to these targets.
delta = 0.85 * tanh(mu(obs))
The correction is in radians, so the bound is 0.85 rad per joint.
The corrected targets go to the PD controller of the tracker.
At test time the policy uses the mean action mu.
It does not observe the surface or the position of the robot.
Files
| File | Content |
|---|---|
protomotions_residual.pt |
The checkpoint evaluated in the paper. It is identical to checkpoints/protomotions_residual.pt in the code repository, sha256 50ec81abaf96. |
config.json |
The settings stored in the checkpoint and the observation layout. |
The checkpoint is a dictionary of tensors and numbers and loads with torch.load(path, weights_only=True).
actor is an MLP with layers of 98, 256, 128 and 29 units, tanh activations and a state-independent log_std.
critic is the value network with the same hidden layers.
Usage
The policy runs together with the ProtoMotions tracker inside the Elastra code. The reference motions come from the gated BONES-SEED dataset, so the download needs a Hugging Face account that accepted its license.
git clone https://github.com/yichg/elastra && cd elastra
uv sync
export HF_TOKEN=... # an account that accepted the BONES-SEED license
uv run elastra-download-assets
uvx --from huggingface_hub hf download chugangyi/elastra-protomotions-residual --local-dir hf/protomotions
uv run elastra-evaluate controller=protomotions policy=hf/protomotions/protomotions_residual.pt out=outputs/evaluation/protomotions_residual
Observation
98 inputs, in this order.
| Input | Size |
|---|---|
| Joint positions | 29 |
| Joint velocities x 0.1 | 29 |
| Base orientation quaternion | 4 |
| Base angular velocity x 0.25 | 3 |
| Joint targets of the tracker | 29 |
| Torso height, torso uprightness, pelvis height | 3 |
| Progress of the trial | 1 |
Training
- 500 PPO updates with 256 environments and 64 control steps per update, on 32 CPU cores in 3.4 h, with training seed 287121.
- The surfaces are rigid ground, mattresses with α = 8, 16, 32 and 64, and trampolines with α = 1 and 2.
- 39 training initial states, lying poses from the HumanUP pose pool. None of them is a test state.
- A checkpoint was saved every 10 updates. The released policy is update 260, the checkpoint with the highest success rate of the training episodes in the 50 updates up to it.
Training data
The reference motions tracked by ProtoMotions are three get-up clips of the BONES-SEED dataset. The clips are not part of this repository.
Training data includes Motion Data by Bones Studio. Use of the underlying dataset is subject to the BONES Motion Capture Dataset License Agreement.
Results
Simulated evaluation from the paper, with 40 test initial states per surface. They are passive falls of the robot with its motors off from a perturbed standing pose, and none of them is used in training. A trial succeeds when the robot stands for 1 s without leaving the task area. Standing means that the pelvis is at least 0.7 m above the support surface and the pelvis z axis has a world-z component of at least 0.9. The factor α scales the stiffness of a surface, and a smaller α is softer. The table gives the successes out of 40 per surface.
| Surface | ProtoMotions | ProtoMotions + residual |
|---|---|---|
| Rigid ground | 17 | 29 |
| Mattress, α = 64 | 16 | 26 |
| Mattress, α = 32 | 15 | 25 |
| Mattress, α = 16 | 7 | 24 |
| Mattress, α = 8 | 9 | 22 |
| Mattress, α = 4 | 1 | 7 |
| Mattress, α = 2 | 1 | 1 |
| Mattress, α = 1, the softest | 0 | 1 |
| Trampoline, α = 1 | 4 | 21 |
| Trampoline, α = 2 | 6 | 24 |
| All 400 trials | 76 (19.0 %) | 180 (45.0 %) |
Limitations
- All results are in simulation. The policy has not been run on a real robot.
- It needs the ProtoMotions tracker and the BONES-SEED reference motions.
elastra-download-assetsfetches both. - The surfaces are level and uniform.
License
MIT, like the Elastra code. ProtoMotions, the robot model and the BONES-SEED motions keep their own licenses, listed in THIRD_PARTY.md of the code repository.
Citation
@misc{sun2026elastra,
title = {Elastra: A Simulation Framework for Elastic Bodies},
author = {Youran Sun and Chugang Yi and Xingyu Ren and Haizhao Yang},
year = {2026},
eprint = {2611.15112},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
url = {https://arxiv.org/abs/2611.15112}
}
- Downloads last month
- 27