# RoboCasa365

[RoboCasa365](https://robocasa.ai) est un cadre de simulation à grande échelle pour l’entraînement et l’évaluation de **robots généralistes** sur des tâches domestiques courantes en cuisine. Il propose 365 tâches de manipulation variées réparties sur 2 500 environnements de cuisine, plus de 3 200 objets et plus de 600 heures de données de démonstration humaine, sur un manipulateur mobile PandaOmron 12-DOF (bras Franka sur une base holonomique).

- Article : [RoboCasa : Simulation à grande échelle de tâches quotidiennes pour robots généralistes](https://arxiv.org/abs/2406.02523)
- GitHub : [robocasa/robocasa](https://github.com/robocasa/robocasa)
- Site web du projet : [robocasa.ai](https://robocasa.ai)
- Politique pré-entraînée : [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa)
- Jeu de données à tâche unique (CloseFridge) : [`pepijn223/robocasa_CloseFridge`](https://huggingface.co/datasets/pepijn223/robocasa_CloseFridge)

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/robocasa-banner.webp"
  alt="RoboCasa365 benchmark overview"
  width="85%"
/>

## Tâches disponibles

RoboCasa365 organise ses 365 tâches en deux familles et trois groupes de benchmarks amont que LeRobot expose comme des raccourcis de premier niveau `--env.task` :

| Famille    | Tâches | Description                                                                     |
| --------- | ----- | ------------------------------------------------------------------------------- |
| Atomique    | ~65   | Tâches à compétence unique : prise et placement, manipulation de portes/tiroirs, contrôle d'appareils |
| Composite | ~300  | Tâches multi-étapes dans plus de 60 catégories : cuisine, ménage, rangement, etc.     |

**Exemples de tâches atomiques :** `CloseFridge`, `OpenDrawer`, `OpenCabinet`, `TurnOnMicrowave`, `TurnOffStove`, `NavigateKitchen`, `PickPlaceCounterToStove`.

**Catégories de tâches composites :** cuisson au four, ébullition, brassage, hachage, nettoyage de la table, décongélation d'aliments, chargement du lave-vaisselle, préparation de thé, cuisson au micro-ondes, lavage de la vaisselle, et plus encore.

`--env.task` accepte trois formes :

- un seul nom de tâche (`CloseFridge`)
- une liste séparée par des virgules (`CloseFridge,OpenBlenderLid,PickPlaceCoffee`)
- un raccourci de groupe de référence — `atomic_seen`, `composite_seen`, `composite_unseen`, `pretrain50`, `pretrain100`, `pretrain200`, `pretrain300` — qui se déploie automatiquement en liste de tâches en amont et définit automatiquement le `split` du jeu de données (`target` ou `pretrain`).

## Installation

RoboCasa et sa dépendance `robosuite` ne sont pas publiés sur PyPI, et le `setup.py` de RoboCasa lui-même impose `lerobot==0.3.3`, ce qui entre en conflit avec le `lerobot` de ce dépôt. LeRobot n'expose donc **pas** d'extra `robocasa` — installez les deux packages manuellement en tant que clones éditables (en utilisant `--no-deps` sur `robocasa` pour ignorer son verrouillage de `lerobot` masqué) :

```bash
# After following the standard LeRobot installation instructions.

git clone https://github.com/robocasa/robocasa.git ~/robocasa
git clone https://github.com/ARISE-Initiative/robosuite.git ~/robosuite
pip install -e ~/robocasa --no-deps
pip install -e ~/robosuite

# Robocasa's runtime deps (the ones its setup.py would have pulled, minus
# the bad lerobot pin).
pip install numpy numba scipy mujoco pygame Pillow opencv-python \
            pyyaml pynput tqdm termcolor imageio h5py lxml hidapi \
            tianshou gymnasium

python -m robocasa.scripts.setup_macros
# Lightweight assets (lightwheel object meshes + textures). Enough for
# the default env out of the box.
python -m robocasa.scripts.download_kitchen_assets \
  --type tex tex_generative fixtures_lw objs_lw
# Optional: full objaverse/aigen registries (~30GB) for richer object
# variety. Enable at eval time via --env.obj_registries (see below).
# python -m robocasa.scripts.download_kitchen_assets --type objs_objaverse
```

RoboCasa nécessite MuJoCo. Définissez l’arrière-plan de rendu avant l’entraînement ou l’évaluation :

```bash
export MUJOCO_GL=egl  # for headless servers (HPC, cloud)
```

### Registres d'objets

Par défaut, l'environnement échantillonne des objets uniquement depuis le registre `lightwheel` (ce que `--type objs_lw` fournit), ce qui évite un plantage `Probabilities contain NaN` lorsque les packs objaverse / aigen ne sont pas présents sur le disque. Si vous avez téléchargé l'ensemble complet des ressources, activez le registre complet à l'exécution :

```bash
--env.obj_registries='[objaverse,lightwheel]'
```

## Évaluation

Tous les extraits d’évaluation ci-dessous reproduisent la commande CI (voir `.github/workflows/benchmark_tests.yml`). L’argument `--rename_map` associe les clés de caméra natives de RoboCasa à la disposition d’entrée à trois caméras (`camera1` / `camera2` / `camera3`) sur laquelle la politique `smolvla_robocasa` publiée a été entraînée : `robot0_agentview_left` → `camera1`, `robot0_agentview_right` → `camera2`, `robot0_eye_in_hand` → `camera3`. Cette association doit correspondre au mapping utilisé lors de l’entraînement de la politique (voir `rename_map` dans le fichier `train_config.json` du checkpoint) ; l’échange de deux clés de caméra est accepté silencieusement, car les trois vues partagent la même forme.

Par défaut, chaque tâche utilise l'horizon de déroulement enregistré par RoboCasa. Définissez `--env.episode_length=<steps>` pour appliquer le même horizon explicite à toutes les tâches sélectionnées.

### Évaluation monotâche (recommandée pour une itération rapide)

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_robocasa \
  --env.type=robocasa \
  --env.task=CloseFridge \
  --eval.batch_size=1 \
  --eval.n_episodes=20 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.robot0_agentview_left": "observation.images.camera1", "observation.images.robot0_agentview_right": "observation.images.camera2", "observation.images.robot0_eye_in_hand": "observation.images.camera3"}'
```

### Évaluation multi-tâches

Passer une liste de tâches séparées par des virgules :

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_robocasa \
  --env.type=robocasa \
  --env.task=CloseFridge,OpenCabinet,OpenDrawer,TurnOnMicrowave,TurnOffStove \
  --eval.batch_size=1 \
  --eval.n_episodes=20 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.robot0_agentview_left": "observation.images.camera1", "observation.images.robot0_agentview_right": "observation.images.camera2", "observation.images.robot0_eye_in_hand": "observation.images.camera3"}'
```

### Évaluation par groupe de benchmarks

Exécuter un groupe amont entier (par exemple, les 18 tâches `atomic_seen` avec `split=target`) :

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_robocasa \
  --env.type=robocasa \
  --env.task=atomic_seen \
  --eval.batch_size=1 \
  --eval.n_episodes=20 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.robot0_agentview_left": "observation.images.camera1", "observation.images.robot0_agentview_right": "observation.images.camera2", "observation.images.robot0_eye_in_hand": "observation.images.camera3"}'
```

### Épisodes d'évaluation recommandés

**20 épisodes par tâche** pour un benchmarking reproductible. Correspond au protocole utilisé dans les résultats publiés.

## Entrées et sorties de la politique

**Observations** (les noms bruts des caméras RoboCasa sont conservés tels quels) :

- `observation.state` — état proprioceptif de 16 dimensions (position de la base, quaternion de la base, position relative de l'effecteur, quaternion relatif de l'effecteur, qpos de la pince)
- `observation.images.robot0_agentview_left` — vue de l’agent gauche, 256×256 HWC uint8
- `observation.images.robot0_eye_in_hand` — vue de la caméra de poignet, 256×256 HWC uint8
- `observation.images.robot0_agentview_right` — vue de l’agent droit, 256×256 HWC uint8

**Actions :**

- Contrôle continu dans `Box(-1, 1, shape=(12,))` — mouvement de base (4D) + mode de contrôle (1D) + position de l'effecteur terminal (3D) + rotation de l'effecteur terminal (3D) + pince (1D).

## Entraînement

### Exemple de tâche unique

Un jeu de données monotâche prêt à l'emploi est disponible sur le Hub : [`pepijn223/robocasa_CloseFridge`](https://huggingface.co/datasets/pepijn223/robocasa_CloseFridge).

Effectuer un fine-tuning d'un SmolVLA de base sur `CloseFridge` :

```bash
lerobot-train \
  --policy.type=smolvla \
  --policy.repo_id=${HF_USER}/smolvla_robocasa_CloseFridge \
  --policy.load_vlm_weights=true \
  --policy.push_to_hub=true \
  --dataset.repo_id=pepijn223/robocasa_CloseFridge \
  --env.type=robocasa \
  --env.task=CloseFridge \
  --output_dir=./outputs/smolvla_robocasa_CloseFridge \
  --steps=100000 \
  --batch_size=4 \
  --env_eval_freq=5000 \
  --eval.batch_size=1 \
  --eval.n_episodes=5 \
  --save_freq=10000
```

Évaluer le point de contrôle résultant :

```bash
lerobot-eval \
  --policy.path=${HF_USER}/smolvla_robocasa_CloseFridge \
  --env.type=robocasa \
  --env.task=CloseFridge \
  --eval.batch_size=1 \
  --eval.n_episodes=20
```

## Reproduire des résultats publiés

Le point de contrôle publié [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa) est évalué à l'aide des commandes de la section [Évaluation](#evaluation). CI exécute une évaluation de fumée sur 10 tâches atomiques (un épisode chacune) pour chaque PR touchant le benchmark, en sélectionnant des tâches centrées sur les fixtures qui ne nécessitent pas le pack d'actifs objaverse.

