Contributors: Songlin Wei*, Zhenhao Ni*, Jie Liu*, Zhenyu Zhao*, Junjie Ye, Hongyi Jing, Junkai Xia, Xiawei Liu, Michael Leong, Liang Heng, Di Huang, Yue Wangβ
- [2026-08-30] Integrate SONIC whole-body controller.
- [2026-07-14] We released support for World Action Models: Cosmos3 and DreamZero.
- What is SIMPLE?
- System Requirements
- Installation
- Quick start for SONIC wholebody VLA
- Data Generation & Pipeline
- Evaluation in SIMPLE
- π Simulation Benchmarking Results
- Citation
- License
SIMPLE stands for SIMulation-based Policy Learning and Evaluation.
It is a simple simulation environment supports:
- multiple agents: (franka arm/aloha bimanual arms/dexmate wheeled robot and unitree g1 humanoid!)
- 1000+ Objaverse assets
- 50+ Habitat HSSD scenes
- 50+ humanoid wholebody loco-manipulation tasks
SIMPLE is built on top of IsaacSim 4.5 and MuJoCo 3.3, and requires an RTX-class NVIDIA GPU on Ubuntu 22.04.
π See the full hardware and software requirements at psi-lab.ai/SIMPLE/docs.
Clone the project:
git clone git@github.com:physical-superintelligence-lab/SIMPLE.git
Change directory to the project root:
cd SIMPLE
Pull all submodules
git submodule update --init --recursive
We offer three options for setting up SIMPLE:
Prerequisits:
sudo apt-get update
sudo apt-get install curl cmake python3-dev ffmpeg
sudo apt-get install gstreamer1.0-libav
sudo apt-get install git-lfs && git lfs install && git lfs pull
Install uv if not already done
curl -LsSf https://astral.sh/uv/install.sh | sh
Install all dependencies at once
UV_HTTP_TIMEOUT=3000 GIT_LFS_SKIP_SMUDGE=1 uv sync --all-groups --index-strategy unsafe-best-match
If the sync fails with
Unable to uninstall lerobot==0.3.3. distutils-installed distributions do not include the metadata required to uninstall safely.β thelerobotwheel ships a stray top-levellerobot-<ver>.egg-infofile next to its.dist-info, and uv reads it as a second, legacy copy of the package. Delete it and re-run the sync:rm -f .venv/lib/python3.10/site-packages/lerobot-*.egg-info
Install CuRobo
bash scripts/install_curobo.sh
Activate the environment:
source .venv/bin/activate
Verify the installation by printing the version number
python -c "import simple; print(simple.__version__)"
[Optional] Build the docs.
make live
Open http://127.0.0.1:8005 in a browser to view the documentation.
The document are working in progress. Feel free to raise questions using github issue, we will try to complete the document construction as soon as possible.
We recommend nix on a fresh Linux host; if you already have the NVIDIA driver and CUDA installed, uv is the faster path.
π See the full Nix setup and runtime guide at psi-lab.ai/SIMPLE/docs/nix-setup.
We also support building and running SIMPLE in docker. Please refer to the documents for docker setup.
Evaluate a trained Psi-0 policy on the whole-body carry-box task with both sides in Docker. The two terminals below run two different images from two different repositories β the server on Psi-0's image, the client on SIMPLE's β and both are published on the GitHub Container Registry:
# Psi-0 server image
docker pull ghcr.io/physical-superintelligence-lab/psi0:latest
docker tag ghcr.io/physical-superintelligence-lab/psi0:latest psi:train
# SIMPLE client image
docker pull ghcr.io/physical-superintelligence-lab/simple:latest
docker tag ghcr.io/physical-superintelligence-lab/simple:latest simple:latestThe retags matter: each docker-compose.yml refers to its image by a bare local
tag (psi:${PSI_TAG:-train} and simple:${DATE:-latest}), so neither docker compose run below pulls from ghcr on its own β without the retag the Psi-0
service cannot resolve its image and the SIMPLE service rebuilds from source
instead.
The remaining prerequisites β checkpoint, eval episodes β and a native uv
alternative are in
Wholebody Loco-manipulation.
Terminal A β policy server (psi:train), from the Psi-0 workspace:
export RUN=sonic-wbcbox.neckle.flow1000.cosine.lr1.0e-04.b256.gpus8.2608260223
docker compose run --rm serve-psi0-sonic-http \
--policy psi0 \
--port 8014 \
--ckpt-step 40000 \
--run-dir .runs/finetune/$RUN \
--rtc \
--action-exec-horizon 24Wait for Server listens on 0.0.0.0:8014, then leave it running.
Terminal B β evaluation client (simple:latest), from the SIMPLE repository root:
GPUs=1 docker compose run --rm eval-sonic-wbc \
simple/G1WholebodyXMoveBendCarryBoxSonic-v0 psi0 \
--data-dir data/simple/G1WholebodyXMoveBendCarryBoxSonic-v0/dr-level-0 \
--host 127.0.0.1 \
--port 8014 \
--episode-start 0 \
--num-episodes 5 \
--dr-level 0 \
--eval-dir data/eval/sonic-psi0Both compose stacks are host-networked, so 127.0.0.1 reaches across them; --port
must match the server's. Keep --data-dir and --eval-dir under data/ β only that
tree is bind-mounted. Per-episode videos land in
data/eval/sonic-psi0/psi0/G1WholebodyXMoveBendCarryBoxSonic-v0/level-0/episode_*/.
SIMPLE provides a scalable pipeline to generate, process, and train policies using synthesized simulation data β covering data collection (teleoperation and automated motion planning), post-processing, and fine-tuning.
π See the full documentation at psi-lab.ai/SIMPLE/docs.
To rigorously evaluate the robustness and generalization of learned policies, we benchmark our foundation model Psi-0 using a decoupled Client-Server architecture. The server hosts the model inference, while the SIMPLE client runs the simulation environment.
Configure the evaluation environment variables and paths within your Psi-0 project workspace.
- Configure Environment Variables: Inside the Psi-0 project root, create and source your
.envfile based on the sample:
cp .env.sample .env
# Edit .env to include your HF_TOKEN, WANDB variables, and PSI_HOME path
source .env
echo $PSI_HOME # Verify the path is correctly set- Download Pre-trained Weights: Pull the Psi-0 checkpoints for the SIMPLE benchmark from our Hugging Face repository. Psi0's pre-trained weights for the SIMPLE benchmark are hosted on the Hugging Face Model Hub at USC-PSI-Lab/psi-model.
hf download USC-PSI-Lab/psi-model \
--include="psi0/simple-checkpoints/*" \
--local-dir=$PSI_HOME/.runs \
--repo-type=model
Before launching the simulation, initialize the model inference server.
# Set your target run directory and checkpoint step
export RUN_DIR=xxxx
export CKPT_STEP=40000
# Start the server (Listens on port 22085 by default)
bash scripts/deploy/serve_psi0_simple.sh $RUN_DIR $CKPT_STEP
β οΈ Important: Keep this terminal window open. The server must remain active for the duration of the evaluation.
Open a new terminal window to launch the environment. The execution parameters differ slightly based on the data source of the task:
-
For Teleop Tasks (suffix
*Teleop-v0): Use decoupled Whole-Body Control. -
export entry=eval_decoupled_wbc -
export agent=psi0_decoupled_wbc -
For Motion Planning Tasks (suffix
*MP-v0): Use standard evaluation. -
export entry=eval -
export agent=psi0
Execution Example (Teleop Task):
export task=G1WholebodyXMovePickTeleop-v0
export agent=psi0_decoupled_wbc
export dr=level-0
TASK_NAME=$task uv run eval-decoupled-wbc \
simple/$task \
$agent \
train \
--data-format lerobot \
--data-dir data/evals/simple-eval/$task/$dr \
--host 127.0.0.1 \
--port 21000 \
--headlessexport task=G1WholebodyXMovePickTeleop-v0
export entry=eval_decoupled_wbc
export agent=psi0_decoupled_wbc
export dr=level-0
env -u LD_LIBRARY_PATH nix --extra-experimental-features 'nix-command flakes' develop -c \
python -m simple.cli.$entry \
simple/$task \
$agent \
train \
--data-format lerobot \
--data-dir data/evals/simple-eval/$task/$dr \
--host 127.0.0.1 \
--port 21000 \
--headlessTask Success Rate Statistics: Upon completion, the terminal will display a summary of the results. A detailed log is also preserved automatically:
cat data/evals_decoupled_wbc/eval_stats.txt
Execution Videos:
Visual records of each episode are automatically rendered and saved. The files are named using the pattern episode_id/cam_name_{success_flag}.mp4 (e.g., success or failed).
# Example: Play a successful teleop evaluation video
mpv data/evals_decoupled_wbc/psi0_decoupled_wbc/G1WholebodyXMovePickTeleop-v0/level-0/episode_0/head_stereo_left_success.mp4
# Example: Play a successful motion planning evaluation video
mpv data/evals/psi0/G1WholebodyBendPickMP-v0/level-0/episode_0/front_stereo_left_success.mp4
This is a preliminary benchmark with 6 tasks accompanying the Psi-0 project. Please also checkout Psi-0 for more details of intergrating Psi-0 with SIMPLE.
To rigorously evaluate the robustness and generalization of the learned policies, we design three evaluation levels with progressive out-of-distribution variations applied to the training environment:
The evaluation environments are provided in the huggingface repository USC-PSI-Lab/psi-data.
- Level 0 (Visual & Distractors): Randomizes table materials and the types/initial positions of distractor objects.
- Level 1 (Lighting): Includes Level 0 variations + extreme changes in lighting conditions.
- Level 2 (Spatial pose): Includes Level 1 variations + perturbations to the initial positions of the target objects.
Success rates are reported out of 10 evaluation trials per level (Level 0 | Level 1 | Level 2).
| Baseline / Task | G1Wholebody XMove PickTeleop-v0 |
G1Wholebody BendPickMP-v0 |
G1Wholebody Handover Teleop-v0 |
G1Wholebody Locomotion PickBetweenTables Teleop-v0 |
G1Wholebody Tabletop GraspMP-v0 |
G1Wholebody XMove BendPick Teleop-v0 |
|---|---|---|---|---|---|---|
| Psi0 | 10 | 10 | 6 | 10 | 10 | 10 | 7 | 7 | 10 | 7 | 5 | 6 | 10 | 10 | 8 | 10 | 9 | 9 |
| GR00T N1.6 | 10 | 10 | 7 | 7 | 7 | 6 | 1 | 3 | 3 | 0 | 0 | 0 | 9 | 9 | 7 | 4 | 4 | 1 |
| OpenPi Ο0.5 | 7 | 5 | 1 | 10 | 10 | 8 | 5 | 4 | 5 | 3 | 3 | 3 | 10 | 10 | 8 | 0 | 0 | 0 |
| InternVLA-M1 | 0 | 0 | 0 | 5 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 7 |
| H-RDT | 0 | 0 | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| DreamZero | 10 | 10 | 10 | 9 | 9 | 8 | 7 | 8 | 9 | 5 | 3 | 3 | 9 | 10 | 7 | 0 | 0 | 1 |
| EgoVLA | 0 | 1 | 2 | 7 | 5 | 8 | 0 | 4 | 3 | 0 | 0 | 0 | 10 | 10 | 7 | 3 | 5 | 4 |
| Diff. Policy | 3 | 3 | 2 | 10 | 8 | 6 | 3 | 2 | 4 | 4 | 0 | 0 | 8 | 9 | 8 | 0 | 0 | 0 |
| ACT | 10 | 9 | 6 | 10 | 9 | 9 | 4 | 4 | 6 | 6 | 5 | 7 | 10 | 10 | 8 | 6 | 8 | 8 |
More interesting tasks, including articulated objects.
| Baseline / Task | G1Wholebody CloseDoor Teleop-v0 |
G1Wholebody OpenOven Teleop-v0 |
G1Wholebody OpenFaucet Teleop-v0 |
G1Wholebody PickAndPlace AndHugContainer Teleop-v0 |
|---|---|---|---|---|
| Psi0 | 10 | 10 | 10 | 7 | 5 | 4 | 3 | 3 | 4 | 7 | 6 | 3 |
Please also consider citing
Psi-0if you use its training code.
@article{wei2026simple,
title={SIMPLE: Simulation-Based Policy Learning and Evaluation for Humanoid Loco-manipulation},
author={Wei, Songlin and Ni, Zhenhao and Liu, Jie and Zhao, Zhenyu and Ye, Junjie and Jing, Hongyi and Xia, Junkai and Liu, Xiawei and Leong, Michael and Heng, Liang and Huang, Di and Wang, Yue},
journal={arXiv preprint arXiv:2606.08278},
year={2026}
}
@article{wei2026psi0,
title={{$\Psi_0$}: An Open Foundation Model Towards Universal Humanoid Loco-Manipulation},
author={Wei, Songlin and Jing, Hongyi and Li, Boqian and Zhao, Zhenyu and Mao, Jiageng and Ni, Zhenhao and He, Sicheng and Liu, Jie and Liu, Xiawei and Kang, Kaidi and others},
journal={arXiv preprint arXiv:2603.12263},
year={2026}
}
This project is licensed under the MIT.
See the LICENSE file for details.
