Get started

Installation

Install the package with uv, set up Vulkan for rendering, and download the scene assets the benchmark environments depend on.

Requirements

The benchmark builds on ManiSkill and SAPIEN. You need a Python 3.11 environment, a uv installation, and a Vulkan-capable GPU driver for rendering. All commands below run from the repository root.

Install the package

Installation only requires a few pip installs plus a Vulkan setup for rendering. The repository uses uv to manage the environment:

bash
# install the package
uv sync --active

# activate the uv environment
source .venv/bin/activate

# patch a known lerobot bug
curl -sSL https://raw.githubusercontent.com/huggingface/lerobot/0e81a275fcdbf03d74f78aa69eaa28c172a9f256/src/lerobot/datasets/lerobot_dataset.py -o .venv/lib/python3.11/site-packages/lerobot/datasets/lerobot_dataset.py
Use the vendored ManiSkill

Always use the mani_skill package inside this repository, not an independently installed copy. The benchmark extends it with 50 dual-arm tabletop tasks, the four scene-mismatch levels, motion-planning solutions, and the shared level utilities.

Vulkan rendering

Rendering is done with Vulkan. Follow the ManiSkill installation instructions to set up the Vulkan driver and the SAPIEN renderer on your platform.

Downloading assets

Scene objects and datasets are downloaded into ~/.maniskill/data. The standard YCB assets are fetched with the built-in downloader:

IG-10K Assets (one-shot)

The recommended path is to download the shared asset package into ~/.maniskill/data. It includes the assets used by the benchmark; the individual ManiSkill download commands below remain useful when you only need one namespace.

bash
mkdir -p ~/.maniskill/data
hf download imitator-game/IG-10K-Assets --repo-type dataset --local-dir ~/.maniskill/data
# ModelScope alternative:
# modelscope download --dataset Zhouxunzhe/IG-10K-Assets --local_dir ~/.maniskill/data

for f in ~/.maniskill/data/*.tar.zst; do
  tar --use-compress-program=unzstd -xf "$f" -C ~/.maniskill/data
done
rm ~/.maniskill/data/*.tar.zst
bash
# download assets for a specific environment id
python -m mani_skill.utils.download_asset ${ENV_ID}

# standard YCB assets
python -m mani_skill.utils.download_asset ycb

RoboTwin objects & background textures

RoboTwin objects and the background textures used by random_background=True (see the domain randomization guide) come from the RoboTwin asset set:

bash
mkdir -p ~/.maniskill/data/robotwin
python -m mani_skill.utils.download_robotwin
cd ~/.maniskill/data/robotwin
unzip objects.zip && rm -rf objects.zip
unzip background_texture.zip && rm -rf background_texture.zip

PartNet-Mobility

PartNet-object assets (microwave, cabinet, and other articulated objects) follow the download scripts' instructions:

bash
# PartNet-mobility dataset
python -m mani_skill.utils.download_partnet
mkdir -p ~/.maniskill/data/partnet_mobility/dataset
mv ~/Downloads/downloads/* ~/.maniskill/data/partnet_mobility/dataset/
cd ~/.maniskill/data/partnet_mobility/dataset && find . -name "*.zip" -execdir unzip -o {} \;

Scene datasets (RoboCasa / AI2THOR)

bash
python -m mani_skill.utils.download_asset RoboCasa
python -m mani_skill.utils.download_asset AI2THOR

ReplicaCAD's link in download_asset.py is expired; download the dataset from this google drive link and unpack it manually:

bash
pip install gdown
mkdir -p ~/.maniskill/data/scene_datasets/replica_cad_dataset
gdown "https://drive.google.com/uc?id=1mqImztNX1LYZFBzt9z895C814RsyGe4N" -O replica_cad_dataset.zip
unzip -o replica_cad_dataset.zip -d ~/.maniskill/data/scene_datasets/replica_cad_dataset && rm replica_cad_dataset.zip

External GLB assets

External GLB assets (Sketchfab models, Hunyuan-generated meshes, etc.) are downloaded to ~/.maniskill/data/sketchfab/objects/{object_key}/model.glb, registered in mani_skill/assets/sketchfab_registry.json, and loaded in tasks with create_sketchfab_actor(...). See mani_skill/assets/sketchfab_README.md for the full pipeline. Three L3 environments also require the balance_scale and weight_on_scale GLBs from the shared GLB asset folder:

text
~/.maniskill/data/sketchfab/objects/balance_scale/model.glb
~/.maniskill/data/sketchfab/objects/weight_on_scale/model.glb

Asset namespaces

The benchmark uses four asset namespaces. MS_ASSET_DIR can override the default ~/.maniskill root; the paths below show the default layout.

Asset setRequired location
ManiSkill YCB~/.maniskill/data/assets/mani_skill2_ycb/
RoboTwin objects~/.maniskill/data/robotwin/objects/
RoboTwin background textures~/.maniskill/data/robotwin/background_texture/
PartNet-Mobility~/.maniskill/data/partnet_mobility/dataset/
External GLB objects~/.maniskill/data/sketchfab/objects/{object_key}/model.glb

Verify the install

Quick sanity check: create and step one of the smallest benchmark environments. You should see a success-rate tensor from evaluate():

python
import gymnasium as gym
import mani_skill.envs  # Registers all benchmark environments.

from mani_skill.envs.tasks.tabletop.utils.dual_task_camera_utils import (
    configure_dual_task_level,
)

configure_dual_task_level("L0")
env = gym.make(
    "TwoRobotStirSpoon-v1",
    obs_mode="state",
    control_mode="pd_joint_pos",
    reward_mode="dense",
    sim_backend="physx_cpu",
)

obs, info = env.reset(seed=0)
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)

evaluation = env.unwrapped.evaluate()
print(evaluation["success"])
env.close()
Next steps

Once installed, continue with the quickstart to run your first baseline, or jump straight to the domain randomization tutorial.