Browse by type
https://private-user-images.githubusercontent.com/88101805/463126988-e3ba1575-4411-4a36-ad65-f0b2f49890c3.mp4
RoboTwin 2.0 (ICML 2026) — Webpage · Doc · Paper · Talk · 机器之心 · Leaderboard
Earlier papers & challenge report
Prefer the RoboTwin Document for full guides — this README is a quick start.
RoboTwin 2.0 and RoboDojo share deployment via XPolicyLab: one policy-serving / eval stack across both benchmarks (single-task, multi-GPU, and remote server + local sim).
Default branch: main (RoboTwin 2.0).
Other branches (legacy / special-purpose)
See RoboTwin 2.0 Document (Usage - Install & Download) for installation instructions. It takes about 20 minutes for installation.
XPolicyLab is embedded as a Git submodule. For a fresh checkout, clone RoboTwin recursively:
git clone --recurse-submodules https://github.com/RoboTwin-Platform/RoboTwin.git
cd RoboTwin
For an existing checkout, initialize the version pinned by RoboTwin:
git submodule update --init --recursive XPolicyLab
To pull the latest XPolicyLab commit on its configured main branch and refresh RoboTwin's submodule pin:
bash scripts/update_xpolicylab.sh
# optional: stage the pin / reinstall the editable package
bash scripts/update_xpolicylab.sh --stage --install
See RoboTwin 2.0 Tasks Doc for more details.

Full usage details live in the RoboTwin Document — start from Usage. Prefer the Doc over this README when anything conflicts.
We provide over 100,000 pre-collected trajectories as part of the open-source release RoboTwin Dataset. We recommend downloading the pre-collected data (step 1) as the default path — it is ready to train on immediately. Collect data yourself (step 2) only when you need custom task configs, domain randomization, or embodiment setups.

Download and extract all available XPolicyLab-format trajectories from Hugging Face:
bash scripts/download_xpolicylab_data.sh
To download only selected tasks, pass their names:
bash scripts/download_xpolicylab_data.sh adjust_bottle beat_block_hammer
Downloads and extractions both run in parallel (defaults: 8 workers each). As soon as a task ZIP finishes downloading, extraction starts without waiting for the rest. Tune concurrency with:
# Parallel download / extract workers (extract defaults to HF_MAX_WORKERS)
HF_MAX_WORKERS=8 HF_EXTRACT_WORKERS=16 bash scripts/download_xpolicylab_data.sh
Downloads land under data/demo_clean/<task_name>/aloha_agilex/data/ (note: self-collected data lands under data/<task_config>/... instead).
For custom task configs, domain randomization, or embodiment setups, collect data yourself. The following command will first search for a random seed for the target collection quantity, and then replay the seed to collect data.
bash collect_data.sh ${task_name} ${task_config} ${gpu_id}
# Example: bash collect_data.sh beat_block_hammer demo_randomized 0
Collected demonstrations are saved directly in the XPolicyLab trajectory format — no extra conversion step is needed:
data/<task_config>/<task_name>/<embodiment>/data/episode_0000000.hdf5
<embodiment> follows the embodiment field of the task config (aloha_agilex for the default aloha-agilex setup).
Migrating data collected with older RoboTwin versions
Data collected before the XPolicyLab-native format landed used the legacy raw layout data/<task_name>/<task_config>/data/episode0.hdf5. scripts/process_data_xpolicylab.py converts that legacy layout only; it is not needed for (and does not work on) freshly collected data.
Many XPolicyLab policies train on LeRobot datasets. After you have XPolicyLab-format HDF5 under data/<task_config>/<task>/<embodiment>/data/ (from download or collection), convert with the shared scripts in XPolicyLab/scripts/.
Patterns are <task_config>.<task>.<embodiment> and may use * wildcards. They resolve against data/ next to the RoboTwin root (for example demo_clean.*.aloha_agilex). Keep --data_type as the default RoboDojo — RoboTwin XPolicyLab trajectories share that HDF5 layout.
Run in an environment that already has the matching LeRobot package (v2.1 vs v3.0). Conversion writes under HF_LEROBOT_HOME (default ~/.cache/huggingface/lerobot); point it at a large disk if needed:
export HF_LEROBOT_HOME=/path/with/enough/space/lerobot
# LeRobot v2.1 — all demo_clean tasks
python XPolicyLab/scripts/transform_lerobot_v21_format.py \
"demo_clean.*.aloha_agilex" \
--repo_id robotwin_demo_clean_aloha_agilex \
--max_episode 50
# LeRobot v3.0 — same selection
python XPolicyLab/scripts/transform_lerobot_v30_format.py \
"demo_clean.*.aloha_agilex" \
--repo_id robotwin_demo_clean_aloha_agilex_v30 \
--max_episode 50
# Single task
python XPolicyLab/scripts/transform_lerobot_v21_format.py \
"demo_clean.beat_block_hammer.aloha_agilex" \
--repo_id beat_block_hammer_demo_clean
Useful flags: --repo_id (output dataset name), --max_episode (cap episodes per task/embodiment), --resolution HxW or --image_height / --image_width (default: auto-detect; RoboTwin is often 240x320). Output lands at ${HF_LEROBOT_HOME}/<repo_id>.
☝️ See RoboTwin 2.0 Tasks Configurations Doc for more details.
Task settings such as demo_clean and demo_randomized are stored in env_cfg/task_config/.
All evaluation goes through scripts/eval_policy.sh. The policy adapter must exist under XPolicyLab/policy/<policy_name>/ (see the XPolicyLab policy catalog).
--env-cfg-type selects the XPolicyLab action profile (validated against XPolicyLab/utils/robot/_robot_info.json; arx_x5 matches RoboTwin's default aloha-agilex layout), while the simulator embodiment stays controlled by --task-config.
Local evaluation (multi-task, multi-GPU). The scheduler starts a policy server and simulator per task on your GPU pool. Task lists and GPU settings live in env_cfg/eval/all_tasks.yml (trim tasks to a single entry for single-task evaluation):
bash scripts/eval_policy.sh multitask \
--config env_cfg/eval/all_tasks.yml \
--policy-name <policy_name> \
--ckpt-name <checkpoint> \
--env-cfg-type arx_x5 \
--policy-conda-env <policy_env> \
--eval-env-conda-env <robotwin_env> \
--action-type <action_type>
Add --dry-run to validate the schedule without launching anything. Results are written to eval_result/multitask/ by default.
Split deployment (remote policy server + local simulator). Start the server pool on the policy host, then point the local scheduler at it:
# On the policy-server host (fill in the placeholders first):
bash scripts/eval_policy.sh serve --config env_cfg/eval/remote_server.yml
# On the simulator host:
bash scripts/eval_policy.sh multitask \
--config env_cfg/eval/all_tasks.yml \
--policy-name <policy_name> \
--env-cfg-type arx_x5 \
--eval-env-conda-env <robotwin_env> \
--enable-remote \
--policy-server-ip <server_ip> --policy-server-port <port>
--policy-server-ip/--policy-server-port can be repeated to use a server pool, or configured once via enable_remote / policy_server_ip / policy_server_port in the eval config.
We recommend that the RoboTwin Platform can be used to explore the following topics: 1. single - task fine - tuning capability 2. visual robustness 3. language diversity robustness (language condition) 4. multi-tasks capability 5. cross-embodiment performance
The full leaderboard and setting can be found in: https://robotwin-platform.github.io/leaderboard.
Please refer to RoboTwin 2.0 Dataset - Huggingface.
If you find our work useful, please consider citing:
RoboTwin 2.0: A Scalable Data Generator and Benchmark with Strong Domain Randomization for Robust Bimanual Robotic Manipulation ``` @article{chen2025robotwin, title={Robotwin 2.0: A scalable data generator and benchmark with strong domain randomization for robust bimanual robotic manipulation}, author={Chen, Tianxing and Chen, Zanxin and Chen, Baijun and Cai, Zijian and Liu, Yibin and Li, Zixuan and Liang, Qiwei and Lin, Xianliang and Ge, Yiheng and Gu, Zhe
$ claude mcp add RoboTwin \
-- python -m otcore.mcp_server <graph>