RoboTwin Evaluation#
RoboTwin is a dual-arm tabletop manipulation benchmark. The LoongForge eval module reuses RoboTwin’s official evaluator, which calls the policy through a plugin (the action_bridge protocol). Two model × bridge combinations reach task success.
Step 0: Download weights#
Model |
Weights |
|---|---|
pi05 |
motus-robotics/pi0.5_robotwin2 (openpi |
xvla |
Step 1: Environment setup#
Standard environment#
Install RoboTwin following the official repository instructions (SAPIEN-based), then install the additional dependencies:
pip install websockets msgpack msgpack-numpy pyyaml
The official evaluator video logging launches ffmpeg directly — link the imageio-ffmpeg executable into the env bin directory.
⚠️ Common issues:
Vulkan / SAPIEN. Verify a real NVIDIA Vulkan ICD with
vulkaninfo(expectdeviceName = NVIDIA ...); setLD_LIBRARY_PATH/VK_ICD_FILENAMESbefore SAPIEN is imported.numpypin: internal env usesnumpy 1.26.4/torch 2.4.1/sapien 3.0.0b1.
Step 2: Run evaluation#
Run from inside the benchmark environment. The run scripts and eval YAMLs ship with /path/to/... placeholders — fill them in before running:
cd /path/to/LoongForge-VLA
examples/embodied/pi05/eval/run_robotwin_eval.sh # pi05, action_bridge: pi05_aloha_14d
examples/embodied/xvla/eval/run_robotwin_eval.sh # xvla, action_bridge: ee6d_dual
Environment variables: CONFIG, BENCHMARK_PYTHON, CUDA_VISIBLE_DEVICES, plus the SAPIEN Vulkan variables (LD_LIBRARY_PATH / VK_ICD_FILENAMES).
Key config fields (see examples/embodied/<model>/eval/configs/robotwin/adjust_bottle_smoke.yaml):
benchmark.action_bridge— selects the official-evaluator protocol:
|
Model |
Protocol |
|---|---|---|
|
pi05 |
openpi Aloha joint protocol; |
|
xvla |
X-VLA dual-arm end-effector protocol; |
pi05 + RoboTwin additionally needs
server.dataset_statistics_pathpointing at a stats file derived from the weights’ openpinorm_stats.json; a ready-made copy ships atexamples/embodied/pi05/eval/assets/pi05_robotwin2_dataset_stats.json. To regenerate from another openpi-style weights:import json from pathlib import Path raw = json.loads(Path("<weight_dir>/assets/.../norm_stats.json").read_text())["norm_stats"] out = {"observation.state": raw["state"], "action": raw["actions"]} Path("dataset_stats.json").write_text(json.dumps(out, indent=2))
Verification#
Model |
Status |
Notes |
|---|---|---|
pi05 |
✅ task success |
|
xvla |
✅ task success |
|
Outputs#
In addition to the standard outputs (see the user guide §4 Outputs), RoboTwin collects the official evaluator logs, deploy config, result file, and mp4 videos under artifacts/robotwin/<task_name>/<task_config>/, and writes one results.jsonl row per completed episode.