Yuanhang Zhang, Younggyo Seo, Juyue Chen, Yifu Yuan, Koushil Sreenath, Pieter Abbeel†, Carmelo Sferrazza†, Karen Liu†, Rocky Duan†, Guanya Shi†
Project Website | Paper | Video
Note
Research release only. For potential issues and future support, please open an issue here or directly contact Yuanhang Zhang (yuanhang0610@gmail.com). Any integration of RPL features into Holosoma mainline is a separate effort and will not be reflected here. We use IsaacGym as the training backend since IsaacSim is not fully supported yet (force perturbation not implemented in IsaacSim API).
Code for RPL - per-terrain experts RL training, multi-depth distillation, and sim2sim, built on Holosoma.
Capabilities:
- Bidirectional Multi-Terrain Locomotion - walks forward and backward across stairs, stepping stones, and slopes.
- Whole-Body Teleoperation - tracks commanded base velocity and end-effector pose, with base height and torso orientation adjustable during stance.
- Force-Adaptive Payload Carrying - compensates for unknown external forces at the end effectors.
| Path | What it holds |
|---|---|
thirdparty/holosoma/ |
Holosoma core (git submodule): warp ray-cast multi-depth rendering, PPO-MA, DAgger-MA, ViT / CNN modules, terrains |
rpl_training/ |
Everything outside Holosoma core: loco-manipulation env, manager terms, presets, launchers, tests |
rpl_training/data/ |
ACCAD upper-body motion clips and the four teachers (models/) |
rpl_sim2sim/ |
Sim2sim: MuJoCo environment (sim side), the depth student for holosoma_inference (policy side), reference student exports |
Linux with NVIDIA GPUs.
git clone --recurse-submodules https://github.com/amazon-far/RPL.git
cd RPLThe sim2sim demo and training each install their own conda envs.
rpl_sim2sim.mp4
Runs the depth student in the MuJoCo sim2sim environment in
rpl_sim2sim/ (video). The sim and the policy run
as two processes communicating over Unitree sdk2py (DDS), with depth images passed through shared memory.
bash rpl_sim2sim/setup_env.shThis builds two conda envs under ~/.holosoma_deps/miniconda3 (override with CONDA_ROOT):
| Env | Role | Override |
|---|---|---|
rplmujoco |
Sim: MuJoCo, depth renderer, Xbox pad, Unitree SDK bridge | SIM_ENV |
rplinference |
Policy: holosoma_inference + the RPL depth student |
POLICY_ENV |
The script needs an existing conda at CONDA_ROOT. If you have none, run
thirdparty/holosoma/scripts/setup_mujoco.sh once first.
Tip
We highly recommend an Xbox controller for sim2sim. Plug it into the host running run_sim.sh.
The keyboard works, but it's harder to steer smoothly.
Start the sim first, then the policy, each in its own terminal:
# Terminal 1: sim (terrain course, Xbox pad on this host)
bash rpl_sim2sim/run_sim.sh
# Terminal 2: policy (shipped student)
bash rpl_sim2sim/run_policy.sh| Goal | Command |
|---|---|
| Run your own student | run_policy.sh --task.model-path /path/model_XXXXX.onnx |
| Use the keyboard instead of an Xbox pad | run_sim.sh --no-joystick (see Controls) |
run_sim.sh --help and run_policy.sh --help list the rest.
- Release the elastic band: press
9in the MuJoCo window. - Start the policy right away:
starton the pad (]on the keyboard). - Switch to walking:
R2(=). - Drive with the sticks (
w/s/a/d,q/e).
Policy, Xbox pad:
Policy, keyboard (instead of the Xbox pad)
Run run_sim.sh --no-joystick and
run_policy.sh --task.velocity-input keyboard --task.state-input keyboard:
| Key | Action |
|---|---|
] |
Start the policy |
i |
Init pose |
= |
Toggle stand / walk |
w / s / a / d |
Linear velocity |
q / e |
Angular yaw velocity |
o |
Stop |
MuJoCo window:
| Key | Action |
|---|---|
9 |
Release the elastic band |
7 / 8 |
Band length |
3 - 6 |
Move the band anchor |
R |
Toggle video recording (logs/sim2sim/simulation.mp4) |
bash rpl_training/training_runs/setup_env.shThis builds the IsaacGym conda env hsgym. Optional environment variables:
| Variable | Effect |
|---|---|
ENV_NAME |
Conda env name (default hsgym) |
HOLOSOMA_LOCAL_DIR |
Use another Holosoma checkout instead of thirdparty/holosoma |
The launchers log to W&B by default. Set LOGGER=disabled to keep logs local under logs/, or
WANDB_PROJECT / WANDB_ENTITY / RUN_NAME to pick the W&B destination. NGPUS sets the number of GPUs,
and extra arguments pass through to rpl_training.train_agent.
We recommend training the experts on 4 GPUs.
NGPUS=4 EXPERT=stones bash rpl_training/training_runs/run_expert.sh --training.name stones-expert
NGPUS=4 EXPERT=stairs bash rpl_training/training_runs/run_expert.sh --training.name stairs-expert
NGPUS=4 EXPERT=slopes bash rpl_training/training_runs/run_expert.sh --training.name slopes-expertWe recommend training the student on 8 GPUs.
NGPUS=8 bash rpl_training/training_runs/run_distill.sh --training.name rpl-studentIt loads the shipped teachers by default. To distill your own experts, pass either:
# A directory with the same per-terrain layout as rpl_training/data/models
--algo.config.ckpt-teacher DIR
# Or one W&B checkpoint per terrain (slopes, stairs_up, stairs_down, stepping_stones_columns)
--algo.config.ckpt-teacher-wandb.slopes wandb://ENTITY/PROJECT/RUN_ID/model_XXXXX.ptDistillation runs export model_XXXXX.onnx next to each checkpoint for sim2sim.
@article{zhang2026rpl,
title = {RPL: Learning Robust Humanoid Perceptive Locomotion on Challenging Terrains},
author = {Zhang, Yuanhang and Seo, Younggyo and Chen, Juyue and Yuan, Yifu and Sreenath, Koushil and Abbeel, Pieter and Sferrazza, Carmelo and Liu, Karen and Duan, Rocky and Shi, Guanya},
journal = {arXiv preprint arXiv:2602.03002},
year = {2026}
}Related: FALCON
Apache-2.0, see LICENSE.
