README.md

August 25, 2026 ยท View on GitHub

๐Ÿ‘ CLAP: Cross-Embodiment Action-Conditioned Video World Models are Zero-Shot Physical Simulators

Paper Website License HF Video Models

CLAP is a cross-embodiment, action-conditioned video generation framework that unifies disparate human and robot action spaces via end-effector poses, language, and latent actions.

  • Two-Stage Curriculum: Learns unsupervised physical priors from unlabeled video, then grounds them in end-effector space for zero-shot deployment.

  • Sample-Efficient Adaptation: Facilitates few-shot transfer to target robots, matching or beating single-embodiment baselines like DROID (without post-training) and Bridge (with post-training).

  • Zero-Shot Real-World Generalization: Generalizes out-of-the-box to power real-world inference planning and RL finetuning with robot policies like ฯ€โ‚€.โ‚… and MolmoAct-2.

This package covers the full lifecycle: cross-embodiment video modeling, post-training, novel-embodiment adaptation, offline evaluation, and real-robot policy-in-the-loop deployment. New to the terminology? See the Glossary for EE, LAM, OXE, DROID, and other terms used throughout.

Contents

๐Ÿ“ข Updates

  • [2026/08/12] ๐Ÿš€ CLAP is live.

โœจ Features

CLAP delivers the most comprehensive suite of action-conditioned video world models to date โ€” spanning diverse action-conditioning spaces (end-effector, language, and latent) and robot morphologies, across DROID, Bridge, bimanual YAM robots, and G1 humanoids.

conditioningAction representationTypical use
๐Ÿฆพ "ee"7-dim end-effector cartesian pose + gripper (or raw joint angles for joint-space embodiments)Cross-embodiment, post-training, adaptation
๐Ÿงฌ "lam"32-dim latent-action-model embedding (learned, not physical)Curriculum cross-embodiment training, including egocentric human video
๐Ÿ’ฌ "language"Per-frame CLIP-encoded text captions of the actionLanguage-conditioned, post-training, adaptation

๐Ÿ“‹ Requirements

  • Python โ‰ฅ 3.9 (use 3.11 for in-process openpi policies).

  • A CUDA GPU: A single โ‰ฅ12GB GPU (e.g., RTX 3060) comfortably runs eval/replay/teleop/deploy; in-process openpi deployment needs โ‰ฅ32GB (e.g., RTX 5090) โ€” server mode instead runs openpi on its own machine/GPU, so clap-rollout-deploy itself only needs CLAP's own ~10GB. Inference VRAM usage and timing statistics per nominal prediction (11 total frames, 25 denoising steps, mean ยฑ std with n = 20 trials):

    A100-40GBA100-80GBH200
    CLAP alone, idle9.6GB9.6GB9.7GB
    + openpi in-process, idle17.6GB17.6GB17.7GB
    + openpi in-process, inference peak24.2GB24.2GB25.6GB
    predict_chunk (steady-state)3.24s ยฑ 0.02s2.88s ยฑ 0.00s1.49s ยฑ 0.00s

    Steady-state excludes each process's first predict_chunk call, which pays a one-time cuDNN kernel-autotuning cost. How much that first call costs depends on whether anything else already touched the GPU first: for clap-rollout-deploy --in-process (the table above), openpi loads before CLAP's first prediction and absorbs part of that cost, so the first call only takes ~3s; for clap-rollout-replay/clap-teleop/clap-eval, which never load openpi, the very first call is genuinely cold and can take ~15s instead. Either way, it's a one-time cost โ€” every call after the first lands at the steady-state numbers above.

  • Full cross-embodiment modeling runs (examples/slurm/*.slurm) are sized for 8-GPU nodes (80GB-class GPUs, ~180-450GB system RAM) โ€” post-training/adaptation runs on a single dataset need much less.

  • CUDA 12.8-compatible driver โ€” torch/torchvision are pinned to the cu128 wheel index (see Installation below).

  • Real training/eval against the full OXE mix needs the underlying video datasets on disk (not included โ€” see Dataset registry); the Getting started walkthrough below needs none of that.

๐Ÿ“ฆ Installation

1. Core package

This package is developed and tested with uv โ€” recommended:

git clone <this-repo> clap && cd clap
VENV_HOME=${UV_ENV_DIR:-".venv"}
uv venv ${VENV_HOME}/clap --python 3.11   # or point --python at any interpreter >= 3.9
source ${VENV_HOME}/clap/bin/activate
uv pip install -e .

Or, in one step with uv sync (creates the venv and installs the exact locked versions from uv.lock together โ€” more reproducible, since uv pip install -e . above re-resolves versions each time instead of pinning to the committed lockfile):

git clone <this-repo> clap && cd clap
VENV_HOME=${UV_ENV_DIR:-".venv"}
UV_PROJECT_ENVIRONMENT=${VENV_HOME}/clap uv sync --python 3.11
source ${VENV_HOME}/clap/bin/activate

2. Policy backends (optional)

Real-robot/policy-in-the-loop deployment (clap-rollout-deploy) additionally needs a trained policy โ€” openpi or MolmoAct2, matching deploy_config.policy_type. Both are only imported inside clap.rollout.policies.{openpi_policy,molmoact_policy} when you actually construct one; skip this step for training/eval/replay/teleop.

๐Ÿค– openpi (pi0 / pi05 / pi0fast)

git clone --recurse-submodules git@github.com:Physical-Intelligence/openpi.git optional_dependencies/openpi
cd optional_dependencies/openpi
# Or, if you already cloned without --recurse-submodules:
#   git submodule update --init --recursive

# For separate server-based policy calls
#   for in-process (comment the next line)
GIT_LFS_SKIP_SMUDGE=1 uv sync
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .

Full details (other install methods): Physical-Intelligence/openpi#installation. Checkpoints, and in-process vs. server tradeoffs, are covered under Tips and Troubleshooting.

๐Ÿค– MolmoAct2

git clone https://github.com/allenai/molmoact2.git optional_dependencies/molmoact2
cd optional_dependencies/molmoact2
# CLAP supports only server-based policy calls for now
uv sync

Full details (other install methods): allenai/molmoact2#4-start-a-server. Checkpoints and bimanual_yam setup are covered under Tips and Troubleshooting.

Server warmup crashing with predict_action() got an unexpected keyword argument 'action_mode'? See Tips and Troubleshooting.

3. Environment

All cluster/site-specific paths are read from CLAP_* environment variables (never hardcoded) โ€” see setup/env.example.sh for the full list with explanations. At minimum:

cp setupe/env.example.sh setup/env.sh
# edit env.sh: set CLAP_OXE_BASE_PATH, and any per-dataset overrides your data needs
source setup/env.sh

CLAP_OXE_BASE_PATH is the only strictly required variable (clap.config.paths.PathConfig raises immediately if it's unset). Everything else has a generic default โ€” dataset_meta_info/ (per-dataset stat.json normalization bounds) ships pre-populated in this repo for every registered dataset, so most setups don't need CLAP_META_INFO_ROOT at all.

๐Ÿ Getting started

No dataset or account setup needed for this section โ€” everything below runs against sample_data/oxe/ (~232MB, real full-length val episodes for droid/ bridge/taco_play and the two novel-embodiment adaptation targets bimanual_yam/g1_humanoid, shipped in this repo) and downloads one checkpoint from HF on first use. To get started, activate your virtual environment:

source ${UV_ENV_DIR:-.venv}/clap/bin/activate   # activate the venv created in Installation โ–ธ 1. Core package

๐Ÿ“ฅ Download a checkpoint (optional)

Checkpoints are automatically downloaded on demand to model_ckpt/<CKPT_NAME>/ โ€” set CKPT_NAME to pick the default; see the checkpoints table. To pre-fetch one manually instead:

hf download omni-CLAP/CLAP --include "cross_embodiment_oxe_ee/checkpoint-100000.pt" --local-dir model_ckpt

๐Ÿ” Replay demonstration trajectories

Roll a checkpoint out against a sample episode and write a side-by-side GT/prediction video + PSNR/SSIM/LPIPS:

bash examples/getting_started/replay.sh                                 # droid, clap-curr
DATASET=bridge bash examples/getting_started/replay.sh                  # or: droid | bridge | taco_play
CKPT_NAME=clap-lam DATASET=bridge bash examples/getting_started/replay.sh  # or other models: clap-lam, clap-lang, clap-ee-droid, clap-curr-bridge, ...
CKPT_NAME=clap-ee DATASET=droid MAX_EPISODES=3 bash examples/getting_started/replay.sh  # multiple episodes

# Novel-embodiment adaptation targets (14-/26-dim joint-space actions, not 7-dim EE
# cartesian) -- pair with their matching adapt_* checkpoint; MAX_CHUNKS caps their
# much longer sample episodes (1000+ frames) for a quick demo
CKPT_NAME=adapt-yam DATASET=bimanual_yam MAX_EPISODES=3 MAX_CHUNKS=20 TRIM_STATIC=1 bash examples/getting_started/replay.sh
CKPT_NAME=adapt-g1 DATASET=g1_humanoid MAX_EPISODES=3 MAX_CHUNKS=20 bash examples/getting_started/replay.sh

See Tips and Troubleshooting for what --num-inference-steps (25 here, vs. the real default of 50), MAX_EPISODES, and MAX_CHUNKS (all used above) do.

Output: eval_outputs/getting_started_replay/<CKPT_NAME>_<timestamp>/{video,info}/.

๐ŸŽฎ Live Teleop for DROID, BRIDGE, TACO-PLAY, BIMANUAL YAM, G1 Humanoid

Interactively drive the world model's imagined next frame with your keyboard, seeded from a sample episode (Ctrl-C to quit). droid/bridge/taco_play use a single-arm cartesian scheme (w/a/s/d/z/x + roll/pitch/yaw + gripper); bimanual_yam/g1_humanoid use a shared per-joint scheme targeting whichever arm/hand is active (Tab cycles it, Space mirrors keypresses onto its left/right counterpart too). The live-preview browser page (below) shows the actual key map and highlights each key as you press it, which is easier to follow live than reading it here โ€” see clap.rollout.teleop_controls's module docstring if you want the exact static reference instead:

bash examples/getting_started/teleop.sh                              # default DATASET=droid, CKPT_NAME=clap-curr
DATASET=bridge bash examples/getting_started/teleop.sh                # or: bridge | droid | taco_play
DATASET=bimanual_yam bash examples/getting_started/teleop.sh          # CKPT_NAME auto-set to adapt_bimanual_yam
DATASET=g1_humanoid bash examples/getting_started/teleop.sh           # CKPT_NAME auto-set to adapt_g1_humanoid
EPISODE=1002 DATASET=bridge bash examples/getting_started/teleop.sh   # other episodes: bridge -> 10|1002|1003, droid -> 2799|7099|9199, taco_play -> 1002|1003|1010
CKPT_NAME=clap-ee DATASET=droid bash examples/getting_started/teleop.sh  # or other checkpoints (clap-lang, clap-ee-droid, post-trained, ...); explicit CKPT_NAME always wins over the auto-default above
LIVE_VIEW_WS_PORT=7765 LIVE_VIEW_HTTP_PORT=7766 bash examples/getting_started/teleop.sh  # modify the websocket/html viewer ports

Output: eval_outputs/getting_started_teleop/<CKPT_NAME>_<timestamp>/. See Tips and Troubleshooting for the live-preview viewer, scripted (KEYS=) mode, --num-inference-steps, workspace bounds, g1_humanoid control tips, and camera stacking order.

๐Ÿš€ Deploy (policy-in-the-loop) on DROID and Bimanual YAM with Live Preview

Simulated closed-loop deployment: a real policy outputs actions and the world model predicts the future each round with live preview. Needs MolmoAct2 or openpi installed (see Installation) and a policy server/checkpoint filled into examples/getting_started/deploy_config.yaml first โ€” see Tips and Troubleshooting for other deploy-specific notes:

bash examples/getting_started/deploy.sh                                       # uses deploy_config.yaml's own policy_type/policy_server/policy_ckpt setting
POLICY_SERVER_OVERRIDE=127.0.0.1:8001 bash examples/getting_started/deploy.sh  # or a different policy server host/port
POLICY_TYPE=pi05 bash examples/getting_started/deploy.sh                      # or openpi/pi05 instead of the MolmoAct2 default
POLICY_TYPE=pi05 IN_PROCESS=1 bash examples/getting_started/deploy.sh         # or an in-process policy instead of a server
CKPT_NAME=clap-ee POLICY_SERVER_OVERRIDE=127.0.0.1:8001 bash examples/getting_started/deploy.sh  # or other checkpoints
LIVE_VIEW_WS_PORT=6765 LIVE_VIEW_HTTP_PORT=6766 bash examples/getting_started/deploy.sh  # modify the websocket/html viewer ports

bash examples/getting_started/deploy_yam.sh  # bimanual_yam instead of DROID -- joint-space, MolmoAct2 server mode only (see the bimanual_yam paragraph under Installation's MolmoAct2 section)

Output: eval_outputs/getting_started_deploy/<CKPT_NAME>_<timestamp>/ (or eval_outputs/getting_started_deploy_yam/<CKPT_NAME>_<timestamp>/ for deploy_yam.sh).

๐Ÿงฉ Sample-efficient adaptation to new embodiments

CLAP establishes a paradigm for training high-fidelity single-embodiment video world models via sample-efficient, few-shot adaptation of cross-embodiment models to target robot platforms. This section provides a worked example using bimanual_yam (and g1_humanoid โ€” see the notes inline). This repo ships one train-split sample episode for both, alongside their existing val episodes (sample_data/oxe/{bimanual_yam,g1_humanoid}/{videos,annotation}/train/), just enough to exercise this whole pipeline end to end.

1. Format your data as <oxe_base_path>/<dataset_name>/{videos,annotation}/<split>/... โ€” sample_data/oxe/bimanual_yam is a concrete (tiny) reference for the expected layout: one videos/<split>/<episode_id>/<cam>.mp4 per camera, one annotation/<split>/<episode_id>.json per episode (state, texts, ... โ€” see Dataset registry). g1_humanoid's annotations instead come from its own clap-preprocess-g1 pipeline, which builds this same layout from unitreerobotics/* HF datasets.

CLAP_OXE_BASE_PATH=$CLAP_OXE_BASE_PATH bash examples/preprocess/compute_g1_meta_info.sh  # only needed for g1_humanoid

2. Compute action-normalization stats (dataset_meta_info/<name>/stat.json, what BoundNormalizer reads at train/eval time โ€” train split only, so val stays unseen by anything derived from training data, including the normalization bounds themselves):

clap-preprocess-oxe-meta --oxe-base-path sample_data/oxe --dataset-name bimanual_yam --full-state
# --full-state: bimanual_yam's 14-dim action is the raw `state` array, not state[:6]+gripper
# like cartesian ee7 datasets. g1_humanoid gets its stat.json from clap-preprocess-g1 (see step 1 instead)

3. Point CLAP at your data โ€” two env vars (see env.example.sh):

export CLAP_OXE_BASE_PATH=sample_data/oxe    # your real dataset root, in practice
export CLAP_META_INFO_ROOT=dataset_meta_info # where step 2 wrote stat.json (this is the default -- only needed if you chose a different --meta-info-path)

4. Launch adaptation training (finetunes from the cross-embodiment curriculum checkpoint; configs/experiment/adapt_bimanual_yam.yaml resets the action encoder since the input dim changes 7 โ†’ 14; see Tips and Troubleshooting for how this script picks up your CLAP_* env vars):

bash examples/adapt/adapt_bimanual_yam.sh
# g1_humanoid: bash examples/adapt/adapt_g1_humanoid.sh

5. Build a test set (episode selection cached under clap/eval/test_sets_cache/, so every eval run pins to the same episodes):

clap-build-test-sets --names bimanual_yam_val --oxe-base-path "$CLAP_OXE_BASE_PATH" --no-lam-intersection
# --no-lam-intersection: episode selection normally also requires LAM latent-action data
# (ann_keys & lam_keys) -- skip that for datasets that never compute LAM at all, like
# bimanual_yam/g1_humanoid (joint-space-only), or it'll always select 0 episodes for them.
# g1_humanoid:
# clap-build-test-sets --names g1_humanoid_val --oxe-base-path "$CLAP_OXE_BASE_PATH" --no-lam-intersection

6. Evaluate the adapted checkpoint:

clap-eval --config configs/experiment/adapt_bimanual_yam.yaml --experiment adapt_bimanual_yam \
    --test-set bimanual_yam_val
# g1_humanoid:
# clap-eval --config configs/experiment/adapt_g1_humanoid.yaml --experiment adapt_g1_humanoid \
#     --test-set g1_humanoid_val

Trying this locally without touching your repo's own dataset_meta_info/bimanual_yam/stat.json โ€” point every step at a scratch dir instead of its default output location:

SCRATCH=$(mktemp -d)
clap-preprocess-oxe-meta --oxe-base-path sample_data/oxe --dataset-name bimanual_yam --full-state \
    --meta-info-path "$SCRATCH/dataset_meta_info"
export CLAP_OXE_BASE_PATH=sample_data/oxe
export CLAP_META_INFO_ROOT="$SCRATCH/dataset_meta_info"
clap-build-test-sets --names bimanual_yam_val --oxe-base-path "$CLAP_OXE_BASE_PATH" \
    --no-lam-intersection --out-dir "$SCRATCH/test_sets_cache"
clap-eval --config configs/experiment/adapt_bimanual_yam.yaml --experiment adapt_bimanual_yam \
    --test-set bimanual_yam_val --test-sets-cache-dir "$SCRATCH/test_sets_cache" \
    --max-chunks 1   # fast test -- 1 autoregressive chunk (config.model.num_frames predicted
                     # frames) per episode instead of a full rollout; omit for a full-duration eval

๐Ÿ—‚๏ธ Checkpoints

We provide a broad suite of cross-embodiment video model checkpoints at omni-CLAP/CLAP โ€” trained for 100K steps โ€” and finetuned checkpoints derived from them for target embodiments.

๐ŸŒ Cross-embodiment models

The cross-embodiment models are trained on a mix of OXE datasets: (fractal/fmb/bc_z/taco_play/furniture_bench/bridge/droid, egodex too for lam). All ee-conditioned models use absolute actions, while the lang-conditioned model uses relative-to-anchor-frame language captions.

Model nameConditioningUse case
clap-curree, continued from a LAM-pretrained checkpointDefault โ€” getting-started default; base checkpoint for novel-embodiment adaptation
clap-eeee โ€” 7-dim end-effector cartesianCross-embodiment world model, EE-only (no LAM pretraining stage)
clap-lamlam โ€” 32-dim latent actionCurriculum LAM pretraining stage
clap-langlanguage, relative-to-anchor-frame captionsLanguage-conditioned generation/eval

๐ŸŽฏ Post-trained on a single robot platform

Each finetunes the matching cross-embodiment checkpoint above onto one dataset alone (still ee-conditioned regardless of the base's own conditioning โ€” see clap.eval.experiments' _POST_TRAIN_BASES comment).

DROID

Model nameConditioningUse case
clap-curr-droidee โ€” 7-dim EE cartesianPost-trained on droid, from the clap-curr base
clap-ee-droidee โ€” 7-dim EE cartesianPost-trained on droid, from the clap-ee base
clap-lam-droidee โ€” 7-dim EE cartesianPost-trained on droid, from the clap-lam base
clap-lang-droidee โ€” 7-dim EE cartesianPost-trained on droid, from the clap-lang base

Bridge

Model nameConditioningUse case
clap-curr-bridgeee โ€” 7-dim EE cartesianPost-trained on bridge, from the clap-curr base
clap-ee-bridgeee โ€” 7-dim EE cartesianPost-trained on bridge, from the clap-ee base
clap-lam-bridgeee โ€” 7-dim EE cartesianPost-trained on bridge, from the clap-lam base
clap-lang-bridgeee โ€” 7-dim EE cartesianPost-trained on bridge, from the clap-lang base

๐Ÿ†• Novel-embodiment adaptation

Finetune on data for a new robot embodiment, builds on physical priors from the cross-embodiment models (defaults to clap-curr)

Model nameConditioningUse case
adapt-yamee, 14-dim joint-spaceNovel-embodiment adaptation target: bimanual_yam
adapt-g1ee, 26-dim joint-spaceNovel-embodiment adaptation target: g1_humanoid

๐Ÿ“ Project layout

src/clap/
  config/       dataclass configs (CLAPModelConfig, DataConfig, TrainingConfig, PathConfig, ...)
                + load_config() (Hydra-style YAML composition)
  data/         per-embodiment dataset registry + EE/LAM/Language dataset classes
  models/       CLAPModel (SVD-based UNet + action/text conditioning)
  training/     clap-train and its dataloader/checkpoint/validation helpers
  eval/         clap-eval and the checkpoint-comparison/test-set-building utilities
  rollout/      autoregressive replay, real-robot deployment, keyboard teleop
  preprocess/   per-dataset stat.json / G1-humanoid data prep
  utils/        shared rich-console logging setup

configs/        YAML configs consumed by load_config() (model/, data/, training/, experiment/)
examples/       runnable shell scripts wrapping the CLI entrypoints below (train/eval/rollout/adapt/slurm)
dataset_meta_info/   shipped stat.json per dataset (normalization bounds)
tests/          unit/ (no data needed) + integration/ (needs real OXE data / a GPU, auto-skipped otherwise)

๐Ÿ“š Reference

Full configuration reference, the complete entrypoint/CLI documentation, the dataset registry, and testing instructions live in docs/REFERENCE.md โ€” split out to keep this README focused on getting up and running.

๐Ÿ› ๏ธ Tips and Troubleshooting

Getting-started demo knobs (--num-inference-steps, MAX_EPISODES, MAX_CHUNKS, KEYS)

Every getting-started script (replay.sh/teleop.sh/deploy.sh/deploy_yam.sh) runs with --num-inference-steps 25 (vs. the real default of 50 โ€” see each entrypoint's --help) to keep the demo quick; drop the flag in the script, or pass a higher value, for full-quality output at the cost of slower inference. replay.sh's MAX_EPISODES=<n> rolls out <n> sample episodes instead of the default 1, writing one video/metrics set per episode. MAX_CHUNKS=<n> (replay/teleop) caps how many autoregressive chunks each episode runs for โ€” useful for the much longer bimanual_yam/g1_humanoid sample episodes (1000+ frames vs. tens of frames for droid/bridge/taco_play). teleop.sh's KEYS=<sequence> (e.g. KEYS=wasdcv) replaces the default live interactive session with a fixed non-interactive scripted key sequence โ€” useful for a demo/CI run.

Teleop tips: workspace bounds & g1_humanoid controls

If teleop's tracked cartesian pose runs out of a sensible range mid-session (droid/bridge/ taco_play only), _X_RANGE/_Y_RANGE/_Z_RANGE in clap.rollout.teleop_controls can be widened directly in that file โ€” there's no CLI flag for it yet.

g1_humanoid's 26-dim joint-space control is higher-dimensional than the other targets and can feel subtle at first โ€” e (an arm dim) tends to produce more visually obvious motion and similarly for q (a hand target's first dim, the thumb); Tab cycles which arm/hand is active. Its adapt_* checkpoint was also finetuned on comparatively limited data despite a harder prediction landscape than the other embodiments, so fidelity may be lower than what you see on DROID/bridge.

Deploy tips: live viewer, policy_type, history_idx, bimanual_yam's policy_skip_step_schedule

policy_type selects the policy: pi05/pi0/pi0fast (openpi, DROID only) or molmoact2 (DROID or bimanual_yam). The policy needs a language instruction per episode โ€” the shipped sample data already provides one, so there's nothing to set up there. Like Teleop, this also starts a live-preview server by default โ€” it prints a http://localhost:<port>/deploy_viewer.html URL to open in a browser, showing each round's imagined prediction as it's generated; set NO_LIVE_VIEW=1 to skip it, or override LIVE_VIEW_WS_PORT/LIVE_VIEW_HTTP_PORT (see the examples above).

history_idx in deploy_config.yaml/deploy_config_yam.yaml is set to sparse offsets by default ([0, 0, -48, -32, -24, -16]), giving the world model longer temporal context each round, which is useful if predictions degrade under fast robot motion; comment it out to fall back to the last num_history contiguous frames instead.

bimanual_yam's MolmoAct2 policy can produce robot motion with higher accelerations than DROID's โ€” policy_skip_step_schedule in deploy_config_yam.yaml ([4, 2, 2, 2, 2, 1] by default) varies how many raw policy timesteps are skipped between world-model-conditioning frames per round, covering more ground early on and settling to a finer step later; see RolloutDeployConfig.policy_skip_step_schedule's docstring for the exact semantics.

DROID and bimanual_yam only, for now โ€” clap.rollout.deploy doesn't yet support g1_humanoid's 4-camera/26-dim-joint-space policy interface (no MolmoAct2/openpi server exists for it either). Pointing deploy_config.yaml at dataset_name: g1_humanoid will not raise an error; it'll just silently misbehave (see PolicyInTheLoopAgent.__init__'s is_joint_space note in deploy.py).

Adaptation training/finetuning: env vars & bash_scripts/setup.bash

examples/adapt/*.sh (used in Sample-efficient adaptation to new embodiments) rely on whatever CLAP_* variables are already exported in your shell โ€” they only source examples/_common.sh (GPU count/port setup), not any cluster-specific env file. The SLURM-submitted variants (examples/slurm/*.slurm) instead auto-source bash_scripts/setup.bash for you; if you maintain your own cluster config there, source it before running the plain examples/adapt/*.sh scripts too. When finetuning, ensure that the CLAP model checkpoint is downloaded before training begins; if absent, the new model will train from scratch.

Camera stacking order (four_view / three_view / two_view)

Every embodiment's camera frames get resized to 192x320 and stacked vertically into one fixed-shape input (clap.data.camera_stacking), so the world model always sees the same input shape regardless of how many physical cameras an embodiment has:

Stacking modeSlots (top โ†’ bottom)Datasets
four_view4 distinct cameras: right_high โ†’ left_high โ†’ right_wrist โ†’ left_wristg1_humanoid
three_view3 distinct cameras: right โ†’ left โ†’ wristdroid, fmb, bimanual_yam
two_view2 distinct cameras: right (scene) โ†’ left (wrist) โ€” wrist duplicated into the middle+bottom slots to fill out 3furniture_bench, austin_sailor, berkeley_autolab_ur5, stanford_hydra, utaustin_mutex
single-camera1 camera, tiled into all 3 slotsbridge, fractal, bc_z, taco_play, egodex

bimanual_yam deploy-time camera wire keys: clap.rollout.deploy sends bimanual_yam's 3 stacked camera crops to MolmoAct2's host_server_yam.py, whose own HTTP wire keys don't match these slot names directly โ€” EmbodimentConfig's three_view slots map to the server's wire keys as right โ†’ top_cam, left โ†’ left_cam, wrist โ†’ right_cam.

What's in the 7-dim EE-cartesian action ([x, y, z, roll, pitch, yaw, gripper])

ee-conditioned datasets (droid/bridge/taco_play) represent each action as 7 floats: [x, y, z, roll, pitch, yaw, gripper]. The first 6 dims (state[:, :6]) are the end-effector's cartesian pose โ€” xyz position plus roll/pitch/yaw orientation โ€” and the 7th is the continuous gripper state, concatenated on separately (see EEDataset._load_action in src/clap/data/ee.py). This is the "ee7" convention (action_mode="ee7", the default for these embodiments); it's distinct from the raw joint-space actions (joint14/joint26) used by bimanual_yam/g1_humanoid, which have no fixed cartesian meaning per dim. All 7 dims are normalized against the dataset's stat.json p01/p99 bounds before being fed to the model. See also the EE entry in the Glossary.

MolmoAct2 server error: predict_action() got an unexpected keyword argument 'action_mode'

examples/droid/host_server_droid.py's predict_action(...) call in the molmoact2 repo (cloned per Installation, external to clap) passes action_mode="continuous", but the currently-published allenai/MolmoAct2-DROID checkpoint's remote code expects inference_action_mode="continuous" instead (same kwarg host_server_yam.py already uses correctly) โ€” this fails at server warmup with that TypeError. It's a version-skew bug between the molmoact2 GitHub repo and its HF Hub checkpoint's remote code, not a clap issue, so it won't be fixed by anything in this repo โ€” patch your own clone:

# in the molmoact2 repo
sed -i 's/action_mode="continuous"/inference_action_mode="continuous"/' examples/droid/host_server_droid.py

If this resurfaces (e.g. after a fresh clone/checkpoint re-download), check the actually-cached signature directly rather than trusting this note โ€” snapshot_download there isn't revision-pinned, so upstream can rename the kwarg again: ~/.cache/huggingface/hub/models--allenai--MolmoAct2-DROID/snapshots/<rev>/modeling_molmoact2.py.

openpi: checkpoints & in-process vs. server

Checkpoints are hosted on GCS under gs://openpi-assets/checkpoints/<name> โ€” e.g. the DROID pi05 checkpoint is gs://openpi-assets/checkpoints/pi05_droid. Point deploy_config.yaml's policy_ckpt directly at a gs://... path (openpi downloads/caches it on first use) to use any published checkpoint, or a local path if you've already fetched one yourself. policy_type selects which training config it loads under (pi05 / pi0 / pi0fast, see OpenPIPolicy's docstring) โ€” set it to match whichever checkpoint you pick. gs://... downloads cache under ~/.cache/openpi by default; set OPENPI_DATA_HOME=/path/to/cache (before running clap-rollout-deploy) to put that cache somewhere else.

Server mode is recommended (see Installation โ–ธ openpi) โ€” start the server from the openpi repo:

cd optional_dependencies/openpi
OPENPI_POLICY_BASE_DIR=${OPENPI_POLICY_BASE_DIR:-~/.cache/openpi}
# an example with pi05
uv run scripts/serve_policy.py policy:checkpoint --port=8000 \
    --policy.config=pi05_droid --policy.dir=${OPENPI_POLICY_BASE_DIR}/pi05_droid

then set deploy_config.yaml's policy_server: "host:port" instead of policy_ckpt. clap-rollout-deploy --policy-server host:port / --in-process (see clap-rollout-deploy) override whichever the YAML sets, without editing it โ€” examples/getting_started/deploy.sh exposes the same override as POLICY_SERVER_OVERRIDE=host:port / IN_PROCESS=1.

MolmoAct2: checkpoints & starting servers

Checkpoints (~22GB each) download from HF, from inside the molmoact2 repo. To put the HF cache on a different disk, set HF_HOME=/path/to/cache before both the download below and before starting the server (it re-resolves the checkpoint from the same cache at load time).

export HF_HUB_ENABLE_HF_TRANSFER=1
uv run hf download allenai/MolmoAct2-DROID          # for the DROID server
uv run hf download allenai/MolmoAct2-BimanualYAM    # for the YAM server

Then start the server (from the molmoact2 repo):

uv run python examples/droid/host_server_droid.py --host 0.0.0.0 --port 8000 --dtype bfloat16
# or, for bimanual YAM:
uv run python examples/yam/host_server_yam.py --host 0.0.0.0 --port 8202 --dtype bfloat16

bimanual_yam (joint-space, MolmoAct2 server mode only โ€” no openpi checkpoint exists for it): clap.rollout.deploy skips forward kinematics entirely and conditions the world model on the raw predicted 14-dim dual-arm joint+gripper state directly, and sends 3 camera crops to host_server_yam.py โ€” see the Camera stacking order note below for the exact slot/wire-key mapping. examples/getting_started/deploy_config_yam.yaml/deploy_yam.sh has a runnable example against this repo's shipped sample bimanual_yam episodes.

๐Ÿ™ Acknowledgment

CLAP builds on and integrates with several open-source projects:

  • Stable Video Diffusion (Stability AI) โ€” the pretrained video diffusion backbone CLAPModel's UNet is built on.
  • Ctrl-World โ€” state-of-the-art action-conditioned video world model for the DROID robot platform.
  • openpi (Physical Intelligence) โ€” policy backend supported for policy-in-the-loop deployment (ฯ€โ‚€/ฯ€โ‚€.โ‚…/ฯ€โ‚€-FAST).
  • MolmoAct2 (Allen Institute for AI) โ€” policy backend supported for policy-in-the-loop deployment.

We thank the authors of these projects for making their code and models available.

(More coming soon)

๐Ÿ“„ BibTeX

Coming soon

๐Ÿ“– Glossary

EE, LAM, OXE, DROID, and other terms used throughout
TermMeaning
EEEnd-effector โ€” the robot's gripper/hand; ee-conditioning uses its 7-dim cartesian pose (position + orientation) + gripper, as opposed to raw joint angles
LAMLatent Action Model โ€” a learned, unsupervised action representation extracted directly from video (not a physical quantity), letting CLAP pretrain on video with no paired action labels, including egocentric human video
FKForward kinematics โ€” computing a robot's end-effector pose from its joint angles; used for DROID's cartesian-conditioned world model, skipped entirely for joint-space embodiments (bimanual_yam/g1_humanoid)
OXEOpen X-Embodiment โ€” the multi-robot, multi-dataset collection CLAP's cross-embodiment training draws from (fractal/fmb/bc_z/taco_play/furniture_bench/bridge/droid, egodex for lam)
DROIDA large-scale real-world Franka-arm manipulation dataset/platform; one of CLAP's core cross-embodiment/post-training targets
FrankaThe single-arm robot platform DROID's data was collected on
bimanual YAM / bimanual_yamA dual-arm robot platform; one of CLAP's novel-embodiment adaptation targets (14-dim joint-space action)
G1 / g1_humanoidUnitree G1, a bipedal humanoid robot (2 arms + 2 hands); the other novel-embodiment adaptation target (26-dim joint-space action)
SVDStable Video Diffusion โ€” the pretrained video diffusion backbone CLAPModel's UNet is built on
FVD / FIDFrรฉchet Video/Inception Distance โ€” distributional video/image-quality metrics clap-eval reports alongside PSNR/SSIM/LPIPS
PSNR / SSIM / LPIPSPer-frame image-similarity metrics (pixel error, structural similarity, learned perceptual similarity) clap-eval/clap-rollout-replay report against ground truth
policy-in-the-loopA deployment mode where a real trained policy (openpi or MolmoAct2), not ground-truth replay, drives what the world model conditions on each round โ€” see clap-rollout-deploy

โš–๏ธ License

MIT โ€” see LICENSE.