SimplerEnv WidowX Evaluation#
SimplerEnv is a real-to-sim robot manipulation evaluation benchmark. This page covers the WidowX (Bridge) setups used by the LoongForge eval module: 4 standard Bridge tasks (widowx_spoon_on_towel, widowx_carrot_on_plate, widowx_stack_cube, widowx_put_eggplant_in_basket) plus 2 drawer tasks (widowx_open_drawer / widowx_close_drawer, GR00T fork only).
Weight coverage: xvla reaches task success with absolute EE control; GR00T-N1.6 (bridge) reaches task success with delta control on the stock env; pi05 has no Bridge weights (connectivity only).
Step 0: Download weights#
Model |
Weights |
|---|---|
xvla |
|
GR00T-N1.6 |
nvidia/GR00T-N1.6-bridge (safetensors + |
pi05 |
none released (connectivity only) |
Step 1: Environment setup#
Standard environment#
Install SimplerEnv following the official SimplerEnv repository instructions (with the ManiSkill2_real2sim submodule), then install the additional dependencies:
pip install websockets msgpack msgpack-numpy pyyaml
pip install numpy==1.24.4 # downgrade numpy for simulator compatibility
⚠️ Common issues:
Vulkan / SAPIEN. SimplerEnv renders with SAPIEN and needs a real NVIDIA Vulkan ICD.
nvidia-smiis not enough — verify withvulkaninfoand expectdeviceName = NVIDIA .... If onlyllvmpipe/lavapipeappears, camera images and replays are unreliable.Set
LD_LIBRARY_PATH,VK_ICD_FILENAMES, andXDG_RUNTIME_DIRbefore SAPIEN is imported; the runner re-execs the process so these take effect.numpy==1.24.4is pinned for compatibility — do not upgrade.
Model-specific environment changes#
1. xvla — absolute EE control#
X-VLA emits absolute EE poses, but upstream SimplerEnv WidowX only ships delta control. Use the official fork 255isWhite/SimplerEnv (recommended) or apply the two manual patches: register controller arm_pd_ee_target_base_pose in WidowXDefaultConfig, and make PDEEPoseController.compute_target_pose parse the non-delta branch’s rotation as Euler xyz. Delta control modes (arm_pd_ee_target_delta_pose_align2_*) are unaffected. See the SimplerEnv patch guide.
2. GR00T-N1.6 (drawer tasks) — drawer task port#
The 2 drawer tasks (widowx_open_drawer / widowx_close_drawer) use fork-specific env files: ports 3 files from the NVIDIA fork (drawer env class, small_drawer.urdf, bridge_small_drawer.png), registers the two drawer envs, and exposes tcp_pose in the drawer env obs for proprio. Port steps in the GR00T-N1.6 SimplerEnv guide.
The benchmark dataset/assets come from the SimplerEnv repo itself; no separate dataset download is needed beyond the environment install.
Step 2: Run evaluation#
Two conda environments: the SimplerEnv client env and the model server env. The run scripts and eval YAMLs ship with /path/to/... placeholders — fill them in before running:
cd /path/to/LoongForge-VLA
# xvla (task success template)
examples/embodied/xvla/eval/run_simplerenv_eval.sh
# GR00T-N1.6 (public template)
bash examples/embodied/groot_n1_6/eval/run_simplerenv_eval.sh
Environment variables:
Variable |
Meaning |
Default |
|---|---|---|
|
eval YAML config path |
|
|
SimplerEnv env interpreter |
|
|
GPU id for the policy server |
|
|
NVIDIA libs (must include |
|
|
NVIDIA Vulkan ICD |
|
|
runtime dir for Vulkan |
|
Key config fields (xvla, see examples/embodied/xvla/eval/configs/simplerenv/widowx_stack_cube_smoke.yaml):
benchmark.control_mode—arm_pd_ee_target_base_pose_gripper_pd_joint_pos(needs the absolute EE env, see the model-specific environment changes above)benchmark.max_steps—1200(official horizon)benchmark.task_name/robot_setup/scene_name/rgb_overlay_path— switch among the 4 standard Bridge tasksmodel.domain_id—0(WidowX)GR00T-N1.6:
benchmark.prepackaged_config: true(official visual-matching config),server.chunk_execute_steps: 4(officialn_action_steps; replanning every step is unstable for grasping),model.use_flash_attention: true(orfalsefor sdpa ifflash_attnis missing). The run script also exportsCUDA_GRAPH_IMPL=localso the Eagle backbone loads via the repo-local builder (offline, from the processor dir’sconfig.json) instead of HF remote code. GR00T runs on the stock upstream delta controller — no env change for the 4 standard tasks (see the GR00T-N1.6 SimplerEnv guide).
Verification#
Model |
Status |
Notes |
|---|---|---|
xvla |
✅ task success |
WidowX + absolute EE control (needs the model-specific environment changes above) |
GR00T-N1.6 |
✅ task success |
per-task rates below |
pi05 |
connectivity only |
|
GR00T-N1.6 (bridge weights) under the official protocol — prepackaged_config: true,
max_steps: 300, chunk_execute_steps: 4, one process per run.episode_idx:
Task |
Measured |
|---|---|
|
10/10 |
|
9/10 |
|
7/10 |
|
17/20 |
|
16/30 |
|
2/10 |
Report rates as successes/episodes over ≥30 episodes — GR00T flow-matching sampling
is unseeded, so the same config over the same episodes does not reproduce: eggplant
episode_idx 0-9 scored 8/10, 9/10 and 6/10 across three runs (the same task over
0-19 scored 17/20), and carrot’s 0-9 subset moved 2/10 → 6/10 between sweeps. Never
compare two configs at different sample sizes, and do not quote single-episode smoke
runs as rates.
Do not hand-set a single scene_name / rgb_overlay_path / robot_init_x/y in
place of prepackaged_config: true: the env then applies its official
visual-matching configuration and randomizes overlay + robot/object init per
episode from run.seed + run.episode_idx, which is what simpler_env.make(task)
does officially. A hand-fixed scene is off-distribution — measured on eggplant over
20 episodes, 7/20 with a hand-fixed scene vs 20/20 with the official config.