Skip to content

Workflow: DexMachina (Genesis) ​

The DexMachina workflow integrates SPIDER with Genesis simulator and DexMachina framework for dexterous manipulation with downstream RL training.

Quick Start (Reproducible Setup) ​

1. Download Data ​

All required data is hosted on HuggingFace. Download it into the spider directory:

bash
sudo apt install git-lfs
git lfs install
cd /path/to/spider
git clone https://huggingface.co/datasets/retarget/retarget_example example_datasets

2. Install DexMachina Environment ​

bash
# Create conda environment
conda create -n dexmachina python=3.10
conda activate dexmachina

# Install PyTorch
pip install torch==2.5.1

# Clone and install the Genesis fork (use the 'older' branch for API compatibility)
git clone https://github.com/MandiZhao/Genesis.git
cd Genesis
git checkout older
pip install -e .
pip install libigl==2.5.1  # Required: fixes igl.signed_distance API mismatch
cd ..

# Clone and install rl_games fork
git clone https://github.com/MandiZhao/rl_games.git
cd rl_games
pip install -e .
cd ..

# Clone and install dexmachina
git clone https://github.com/MandiZhao/dexmachina.git
cd dexmachina
pip install -e .
cd ..

# Install additional packages for video export and RL training
pip install moviepy==1.0.3 gymnasium ray seaborn

3. Install SPIDER (Minimal) ​

Install SPIDER without MuJoCo Warp (only need optimization components):

bash
cd /path/to/spider
conda activate dexmachina

# Install SPIDER without dependencies (DexMachina has its own)
pip install --ignore-requires-python --no-deps -e .
# Install other dependencies
pip install loguru tyro hydra-core rerun-sdk==0.26.2

4. Copy Pre-Generated Data to DexMachina Assets ​

Pre-generated inspire_hand data (7 clips) is stored in the HuggingFace dataset so you don't need to re-run the retargeting pipeline.

example_datasets/raw/dexmachina/
  contact_retarget/inspire_hand/s01/   # contact mapping (.npy) + videos (.mp4)
  retargeted/inspire_hand/s01/         # retargeted kinematics (.pt)
  retargeter_results/inspire_hand/s01/ # retargeter results (.npy)

Clips: box_use_01, ketchup_use_01, ketchup_use_02, laptop_use_01, mixer_use_01, notebook_use_01, waffleiron_use_01

After installing DexMachina, copy the data into its assets directory:

bash
DEXMACHINA_ASSETS=$(python -c "from dexmachina.asset_utils import get_asset_path; print(get_asset_path(''))")
SPIDER_DATA=/path/to/spider/example_datasets/raw/dexmachina

cp -r $SPIDER_DATA/retargeted/inspire_hand/        $DEXMACHINA_ASSETS/retargeted/inspire_hand/
cp -r $SPIDER_DATA/contact_retarget/inspire_hand/   $DEXMACHINA_ASSETS/contact_retarget/inspire_hand/
cp -r $SPIDER_DATA/retargeter_results/inspire_hand/  $DEXMACHINA_ASSETS/retargeter_results/inspire_hand/

If the data is missing at runtime, the error message will print the exact copy commands for your paths.

5. Run SPIDER ​

bash
conda activate dexmachina
cd /path/to/spider

# Run with default config (inspire hand, box-30-230 task)
python examples/run_dexmachina.py

This will:

  1. Initialize Genesis environment with DexMachina task
  2. Load reference motion from task
  3. Optimize trajectory with Sampling
  4. Save optimized trajectory and video

Output is saved to example_datasets/processed/arctic/inspire_hand/bimanual/{task}/{data_id}/:

  • trajectory_dexmachina.npz --- trajectory data
  • trajectory_dexmachina.mp4 --- video

Evaluate Trajectories ​

After running run_dexmachina.py, evaluate object tracking metrics (position, rotation, articulation distances) with:

bash
conda activate dexmachina
cd /path/to/spider

# Evaluate all tasks under the default data directory
python spider/postprocess/evaluate_dexmachina.py

# Evaluate specific tasks
python spider/postprocess/evaluate_dexmachina.py --tasks box-30-230 laptop-30-230

# Use a different dataset/robot configuration
python spider/postprocess/evaluate_dexmachina.py --dataset_name arctic --robot_type inspire_hand --embodiment_type bimanual

The script uses the same dataset path resolution as config.py (dataset_dir/processed/{dataset_name}/{robot_type}/{embodiment_type}/{task}/{data_id}/). You can also pass --data_dir to override with an explicit path.

Compare SPIDER vs RL (Multi-Seed) ​

To compare SPIDER (MPC) against RL rollouts across multiple seeds, use --compare mode. This loads both trajectory_dexmachina.npz (SPIDER) and rollout_rl.npz (RL) from each {task}/{seed}/ directory and prints mean +/- std tables.

bash
# Compare across seeds 0-4 (default), print Markdown tables
python spider/postprocess/evaluate_dexmachina.py --compare

# Compare with LaTeX tables and per-seed detail
python spider/postprocess/evaluate_dexmachina.py --compare --latex --detail

# Compare specific tasks / seeds
python spider/postprocess/evaluate_dexmachina.py --compare --tasks box-30-230 laptop-30-230 --seeds 0 1 2

Configuration ​

Key parameters in examples/config/dexmachina.yaml:

ParameterDefaultDescription
taskbox-30-230Object task (format: object_name-start_frame-end_frame)
robot_typeinspire_handDexterous hand model
embodiment_typebimanualHand configuration
num_samples1024Parallel CEM samples (Genesis envs)
max_num_iterations32CEM iterations per MPC step
horizon0.40Planning horizon (seconds)
ctrl_dt0.20Control timestep

Common Issues ​

  1. Missing DexMachina data: Copy pre-generated data from example_datasets/raw/dexmachina/ into the DexMachina assets directory (see "Copy Pre-Generated Data" section above).

  2. Genesis branch compatibility: You must use the older branch of the Genesis fork (git checkout older). The main and 0122 branches have upstream merges that break API compatibility with DexMachina (e.g., set_dofs_kp input shape broadcasting, inertial_quat None handling).

  3. igl.signed_distance unpacking error (ValueError: too many values to unpack): Install libigl==2.5.1 explicitly. Newer versions of libigl change the return signature.

  4. moviepy.editor not found: Install moviepy==1.0.3 (not the newer 2.x which removed moviepy.editor). This is needed for video export.

  5. torch weights loading error: If failed to load trajectory from dexmachina, ensure the data is loaded with torch.load(data_fname, weights_only=False).

  6. numpy version: Use numpy==1.26.4 to avoid compatibility issues with Genesis and taichi.

  7. First run is slow: The first run compiles taichi kernels (JIT) which can appear to hang for several minutes with no output. Subsequent runs use cached kernels and are faster.