taskname evalcfg trainconfig modelname seed gpu

September 15, 2026 Β· View on GitHub

RoboSPA

Can VLA Models Go Beyond Simple Scenes and Short-Horizon Tasks? [EMNLP 2026]πŸ”₯πŸ”₯

🌐 Project Page Β· πŸ“„ Paper Β· πŸ’» Code Β· πŸ€— Dataset Β· ✨ ModelScope

Zhenxuan Fan1, Bo Zhang2, Yutong Lin1, Yuqian Yuan1, Juekai Lin1, Liang Liang1, Zhuoyi Huang3, Wenqiao Zhang1,*, Juncheng Li1,*, Siliang Tang1, Jun Xiao1, Yueting Zhuang1

1 Zhejiang University Β Β  2 University of Electronic Science and Technology of China Β Β  3 South China Normal University

* Corresponding authors


RoboSPA (Robot Spatial-Procedural Assessment) is a large-scale robotic manipulation dataset and benchmark for diagnosing embodied reasoning in Vision-Language-Action (VLA) models. It is built on the RoboTwin 2.0 simulation and data-generation framework (SAPIEN + CuRobo).

RoboSPA focuses on two capability dimensions:

  • πŸ” Fine-Grained Spatial Reasoning β€” identify the intended target among visually similar candidates
  • 🧭 Long-Horizon Procedural Planning β€” complete multi-step procedures under ordering, repetition, and memory constraints
ItemScale
Task categories10
Base tasks56
Difficulty levels5 (L1–L5)
Task variants280
Trajectories527K
Interaction video997 hours
Timesteps108M
EmbodimentsAloha-AgileX, ARX-X5, Piper, Franka, UR5

πŸ“‘ Table of Contents


πŸ“š Overview

Existing VLA benchmarks mostly score binary task completion in clean, short-horizon settings. RoboSPA instead scales spatial ambiguity and procedural horizon in a controlled way, while keeping task semantics fixed.

Each of the 56 base tasks has five variants (_1 … _5):

  • Spatial tasks add more plausible candidates
  • Procedural tasks add more subgoals / longer sequences

Beyond Success Rate (SR), RoboSPA reports:

  • ONTA (Object-Normalized Target Accuracy) for spatial tasks β€” chance-corrected target selection
  • Progress Score (PS) for procedural tasks β€” fraction of completed subgoals

The paper evaluates RDT, GO-1, Ο€0.5, and X-VLA in a single-task setting on clean-scene Aloha-AgileX data. At L5, every evaluated model stays below 25% overall success.

This repository reuses RoboTwin 2.0's expert-script data pipeline: task environments live in envs/, collection is driven by collect_data.sh, and policy evaluation goes through script/eval_policy.py.


🐣 News

  • πŸ“„ 2026/09/04 β€” Paper on arXiv: arXiv:2609.05324
  • πŸŽ‰ 2026/08 β€” Accepted at EMNLP 2026 (Main Conference)

πŸ› οΈ Installation

Please follow the RoboTwin 2.0 installation guide to set up the environment and download assets.


πŸš€ Quick Start

Train and evaluate Ο€0.5 on Pick_Blocks_Size_1 (demo_clean). Put training HDF5 under data/ from the released dataset. Ο€0.5 env setup (uv, CuRobo): RoboTwin Ο€0.5 guide.

conda activate RoboTwin
cd policy/pi05
mkdir -p processed_data training_data

1. Train

bash process_data_pi05.sh Pick_Blocks_Size_1 demo_clean 50
mkdir -p training_data/demo_clean
cp -r processed_data/Pick_Blocks_Size_1-demo_clean-50 training_data/demo_clean/
bash generate.sh ./training_data/demo_clean/ demo_clean_repo

Set repo_id="demo_clean_repo" on pi05_aloha_full_base in src/openpi/training/config.py, then:

uv run scripts/compute_norm_stats.py --config-name pi05_aloha_full_base
bash finetune.sh pi05_aloha_full_base demo_clean 0
#                train_config          model_name  gpu

Checkpoints: policy/pi05/checkpoints/pi05_aloha_full_base/demo_clean/. Default eval checkpoint_id is 30000 in deploy_policy.yml.

2. Evaluate

bash eval.sh Pick_Blocks_Size_1 demo_clean pi05_aloha_full_base demo_clean 0 0
#            task_name          eval_cfg  train_config         model_name seed gpu

100 rollouts, unseen instructions. Results go to eval_result/.

Train clean, test randomized:

bash eval.sh Pick_Blocks_Size_1 demo_randomized pi05_aloha_full_base demo_clean 0 0

βš™οΈ Task Configurations

YAML files live in task_config/. Create a new one with:

bash task_config/create_task_config.sh my_config

Shipped configs:

FileTypical use
demo_clean.ymlClean table, no clutter / lighting randomization. Paper training & eval setting.
demo_randomized.ymlRandom background, clutter, lighting, table height. Robustness split.

Important fields (defaults match demo_clean.yml):

FieldMeaning
episode_numNumber of successful demos to collect (paper uses 50 per variant).
embodimentRobot. Dual-arm: [aloha-agilex]. Two single arms: [piper, franka-panda, 0.6].
language_numInstruction templates instantiated per episode (default 100).
save_freqSave every N sim steps.
collect_dataIf false, only search seeds, do not write HDF5.
use_seedIf true, replay an existing seed.txt instead of searching.

Supported embodiment names: aloha-agilex, ARX-X5, piper, franka-panda, ur5-wsg.

Camera names are in task_config/_camera_config.yml (D435, L515, and larger variants). Domain-randomization keys match RoboTwin 2.0 configuration docs. Paths in this repo are task_config/ (not env_cfg/task_config/).

Example: collect on Franka instead of Aloha-AgileX:

embodiment: [franka-panda]

πŸ“¦ Data Collection

For each task variant you care about:

bash collect_data.sh ${task_name} ${task_config} ${gpu_id}

Examples:

# Spatial L1, clean Aloha-AgileX (default embodiment in demo_clean.yml)
bash collect_data.sh Pick_Blocks_Size_1 demo_clean 0

# Same task, domain-randomized scenes
bash collect_data.sh Pick_Blocks_Size_1 demo_randomized 0

# Procedural L5
bash collect_data.sh Place_Phone_Press_Stapler_5 demo_clean 0

In the paper:

  • Expert scripts in envs/ are executed with CuRobo motion planning
  • Each variant uses 50 successful trajectories
  • For each base task, a policy is trained on all five levels (250 demos)
  • Instructions: 60 templates per variant (50 train / 10 held-out), instantiated into 100 train / 100 eval utterances
  • Clean vs randomized scenes share the same success conditions; randomization only changes visuals and clutter

task_name must match an envs/<task_name>.py class of the same name, e.g. Pick_Blocks_Size_1.

Resume

Collection is resumable. Existing seed.txt and data/episode*.hdf5 are skipped. If a run dies, run the same command again.

Instructions only

Templates already live in description/task_instruction/<task_name>.json. After HDF5 exists, you can regenerate episode-level instructions with:

cd description
bash gen_episode_instructions.sh Pick_Blocks_Size_1 demo_clean 100
cd ..

πŸ’½ Released Dataset

Pre-collected trajectories (527K, 5 embodiments, clean + randomized) are released at:

Use the released dataset if you only need training data. Collect locally when you need a new embodiment, camera, or randomization setting.


πŸ€– Other Policy Baselines

These stacks are inherited from RoboTwin 2.0. Ο€0.5 train / eval is in Quick Start. For other policies, follow that folder’s README, then run its eval.sh. Results land in eval_result/.

PolicyPathNotes
RDTpolicy/RDT/Paper baseline
GO-1policy/GO1/Paper baseline; separate GO-1 conda env
Ο€0 / Ο€0.5policy/pi0/, policy/pi05/Ο€0.5 is a paper baseline; see Quick Start
X-VLAβ€”Paper baseline; see RMBench X-VLA README
OpenVLA-OFTpolicy/openvla-oft/RLDS conversion required
DP / DP3policy/DP/, policy/DP3/Diffusion policies
ACTpolicy/ACT/Inherited from RoboTwin 2.0
TinyVLA / DexVLA / LLaVA-VLApolicy/TinyVLA/, policy/DexVLA/, policy/LLaVA-VLA/Community ports

X-VLA training and evaluation follow the RMBench X-VLA README. Replace RMBench paths and task names with RoboSPA equivalents (Pick_Blocks_Size_1, etc.).

Paper eval setting: clean scene, Aloha-AgileX, 100 trials per variant, unseen instructions.

Official RoboTwin policy docs: https://robotwin-platform.github.io/doc/usage/index.html. Replace original RoboTwin task names (e.g. beat_block_hammer) with RoboSPA names (e.g. Hit_Blocks_Hammer_Order_1).


🧩 Deploy Your Own Policy

Copy policy/Your_Policy/ and implement three files:

  1. deploy_policy.py β€” get_model, eval (call TASK_ENV.take_action), reset_model
  2. deploy_policy.yml β€” checkpoint paths and instruction_type
  3. eval.sh β€” CLI overrides passed into script/eval_policy.py

Action interfaces:

TASK_ENV.take_action(action, action_type="qpos")      # joints + grippers
TASK_ENV.take_action(action, action_type="ee")         # xyz + quaternion + gripper
TASK_ENV.take_action(action, action_type="delta_ee")

qpos layout: [left_arm_joints, left_gripper, right_arm_joints, right_gripper].

cd policy/Your_Policy
bash eval.sh Pick_Blocks_Size_1 demo_clean <ckpt_setting> 0 0

More detail: RoboTwin β€” Deploy Your Policy.


Task List

task_name = {BaseTask}_{level} with level ∈ {1,2,3,4,5}. Example: Pick_Blocks_Size_1, Place_Phone_Press_Stapler_5.

Fine-Grained Spatial Reasoning

AbbrCategoryBase tasks
GACGeometric Attribute CognitionPick_Blocks_Size, Pick_Blocks_Height, Pick_Blocks_Length, Pick_Blocks_Area
SDESpatial Distance EstimationPick_Blocks_Distance, Pick_Mugs_Distance, Pick_Pill_Bottles_Distance, Pick_Mixed_Objects_Distance_A, Pick_Mixed_Objects_Distance_B
CPICanonical Position IndexingPick_Blocks_Canonical, Pick_Cups_Canonical, Pick_Rubik_Cubes_Canonical, Pick_Mixed_Objects_Canonical_A, Pick_Mixed_Objects_Canonical_B
RRRReferential Relational ReasoningPick_Cans_Relational, Pick_Soaps_Relational, Pick_Tea_Box_Relational, Pick_Mixed_Objects_Relational_A, Pick_Mixed_Objects_Relational_B
CVRCross-View ReasoningPick_Breads_Multi_View, Pick_Sauce_Can_Multi_View, Pick_Seals_Multi_View, Pick_Mixed_Objects_Multi_View_A, Pick_Mixed_Objects_Multi_View_B

Long-Horizon Procedural Planning

AbbrCategoryBase tasks
RPFRepetitive Procedure FollowingPress_Stapler_Repeat, Lift_Pot_Repeat, Lift_Fan_Repeat, Click_Bell_Repeat
OFEOrder-Free ExecutionPut_Bottles_Dustbin, Move_Blocks_Apart, Move_Playing_Cards_Away, Place_Bowls_Plates, Separate_Fries_Bread, Rank_Blocks_Height, Rank_Blocks_Color, Rank_Blocks_Size
OCEOrder-Constrained ExecutionHit_Blocks_Hammer_Order, Click_Objects_Order, Stamp_Seals_Order, Click_Bell_Clockwise_Order, Stack_Blocks_Color_Order, Stack_Blocks_Size_Order, Stack_Blocks_Length_Order
CACComposite Action CoordinationPlace_Phone_Press_Stapler, Place_Bottle_Cup, Hang_Mug_Stack_Blocks, Place_Object_Scale_Click, Place_Burger_Fries_Click_Bell, Click_Can_Place_Items, Stamp_Seals_Press_Stapler, Click_Bell_Open_Microwave_Place_Object
MIPMemory-Intensive PlanningObserve_Blocks_Move_Memory, Observe_Objects_Click_Memory, Remember_Color_Cover, Remember_Orientation_Restore, Press_Stapler_Memory

Environment files: envs/<task_name>.py. Instruction templates: description/task_instruction/<task_name>.json. Per-task eval step limits: task_config/_eval_step_limit.yml.


Citation

If you use RoboSPA, please cite:

@inproceedings{robospa2026,
  title     = {RoboSPA: Can VLA Models Go Beyond Simple Scenes and Short-Horizon Tasks?},
  author    = {Zhenxuan Fan and Bo Zhang and Yutong Lin and Yuqian Yuan and Juekai Lin
               and Liang Liang and Zhuoyi Huang and Wenqiao Zhang and Juncheng Li
               and Siliang Tang and Jun Xiao and Yueting Zhuang},
  booktitle = {Proceedings of EMNLP},
  year      = {2026}
}

πŸ“¬ Contact

Questions or suggestions: zxfan@zju.edu.cn.


😺 Acknowledgement

Simulation, expert data collection, embodiment assets, and the policy-eval interface are based on RoboTwin 2.0. Physics and rendering use SAPIEN. Motion planning uses CuRobo.


License

This repository is released under the MIT license. See LICENSE.