Step 1 · Clone

Clone the repository.

git clone https://github.com/robopro-bench/RoboPRO.git
cd RoboPRO

Step 2 · System

System packages.

RoboTwin needs Vulkan and ffmpeg present at the OS level:

sudo apt install libvulkan1 mesa-vulkan-drivers vulkan-tools ffmpeg
vulkaninfo  # smoke test

NVIDIA driver with CUDA 12.x is required (the torch wheel below targets CUDA 12.1).

Step 3 · Conda env

Create the robopro env.

conda create -n robopro python=3.10 -y
# Block ~/.local/lib site-packages from leaking into the env:
conda env config vars set -n robopro PYTHONNOUSERSITE=1
conda activate robopro

The PYTHONNOUSERSITE step matters: without it, a prior ~/.local/lib/python3.10/site-packages/sapien (or torch) will be picked up ahead of the conda env's copy and break imports.

Step 4 · Python deps

Install RoboTwin deps + CuRobo.

cd customized_robotwin
pip install -r script/requirements.txt
pip install setuptools==69.5.1
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable" --no-build-isolation
bash script/_install.sh

script/_install.sh patches sapien/wrapper/urdf_loader.py (utf-8 encoding) and mplib/planner.py (drops a too-strict collision check), then clones CuRobo v0.7.8 into envs/curobo/ and pip-installs it editable. It re-pins warp-lang==1.12.0 and setuptools==69.5.1 at the end. A scikit-image vs scipy version warning is harmless — the simulator needs scipy==1.10.1.

Step 5 · Assets

Fetch the asset bundle (~15 GB).

cd ..
python scripts/install/download_assets.py

Pulls from Hoshipu/RoboPRO_assets into benchmark/assets/ (objects, embodiments, background_texture, backgrounds). The bundle already includes aloha-agilex/.../meshes/box2_Link.dae (~206 MB) — no separate fetch needed.

The shipped task_config/_embodiment_config.yml uses upstream-relative paths (./assets/embodiments/...). RoboPRO keeps assets under benchmark/assets/, so add a one-line symlink so the upstream paths resolve:

ln -sfn ../benchmark/assets customized_robotwin/assets

Generate the local-path curobo configs from the shipped templates, and patch them so CuRobo can attach grasped objects (the shipped configs lack the attached_object link entries):

ASSETS_PATH="$(pwd)/benchmark"
cd benchmark/assets/embodiments/aloha-agilex
for side in left right; do
  sed "s|\${ASSETS_PATH}|$ASSETS_PATH|g" curobo_${side}_tmp.yml > curobo_${side}.yml
done
cd -
python scripts/install/patch_aloha_curobo.py

Step 6 · CuRobo cache patch

Replace clear_cache.

In customized_robotwin/envs/curobo/src/curobo/geom/sdf/world_mesh.py, replace the clear_cache method with:

def clear_cache(self):
    self._wp_mesh_cache = {}
    if self._mesh_tensor_list is not None:
        self._mesh_tensor_list[2][:] = 0
    if self._env_n_mesh is not None:
        self._env_n_mesh[:] = 0
    if self._env_mesh_names is not None:
        for i in range(self.n_envs):
            for j in range(len(self._env_mesh_names)):
                self._env_mesh_names[i][j] = None
    super().clear_cache()

Step 7 · Verify (headless)

Run one rollout.

cd customized_robotwin
source set_env.sh
export ROBOTWIN_BENCH_TASK="bench"

python script/bench_script/visualize_task_scene.py \
    put_mouse_on_pad bench_demo_office_clean \
    --bench-subdir office --rollout --no-render --seed 0 --save_data

On success you'll see Success: True and an MP4 at customized_robotwin/data/bench_data/video/episode_put_mouse_on_pad_0.mp4 (~176 frames @ 320×240, ~6 s). Drop --no-render --save_data to use the interactive SAPIEN viewer instead.