# RoboCasa365

[RoboCasa365](https://robocasa.ai) es un marco de simulación a gran escala para el entrenamiento y la evaluación de **robots generalistas** en tareas cotidianas de cocina. Incluye 365 tareas de manipulación diversas en 2.500 entornos de cocina, más de 3.200 activos de objetos y más de 600 horas de datos de demostración humana, en un manipulador móvil PandaOmron de 12 GDL (brazo Franka sobre una base holonómica).

- Artículo: [RoboCasa: Simulación a gran escala de tareas cotidianas para robots generalistas](https://arxiv.org/abs/2406.02523)
- GitHub: [robocasa/robocasa](https://github.com/robocasa/robocasa)
- Sitio web del proyecto: [robocasa.ai](https://robocasa.ai)
- Política preentrenada: [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa)
- Conjunto de datos de una sola tarea (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%"
/>

## Tareas disponibles

RoboCasa365 organiza sus 365 tareas en dos familias y tres grupos de benchmarks upstream que LeRobot expone como atajos de primera clase `--env.task`:

| Familia    | Tareas | Descripción                                                                     |
| --------- | ----- | ------------------------------------------------------------------------------- |
| Atómico    | ~65   | Tareas de una sola habilidad: recoger y colocar, manipulación de puertas/gavetas, control de electrodomésticos |
| Compuesto | ~300  | Tareas de varios pasos en más de 60 categorías: cocina, limpieza, organización, etc.     |

**Ejemplos de tareas atómicas:** `CloseFridge`, `OpenDrawer`, `OpenCabinet`, `TurnOnMicrowave`, `TurnOffStove`, `NavigateKitchen`, `PickPlaceCounterToStove`.

**Categorías de tareas compuestas:** hornear, hervir, preparar infusiones, picar, limpiar la mesa, descongelar alimentos, cargar el lavavajillas, preparar té, calentar alimentos en el microondas, lavar los platos, y más.

`--env.task` acepta tres formas:

- un único nombre de tarea (`CloseFridge`)
- una lista separada por comas (`CloseFridge,OpenBlenderLid,PickPlaceCoffee`)
- un atajo de grupo de benchmarks — `atomic_seen`, `composite_seen`, `composite_unseen`, `pretrain50`, `pretrain100`, `pretrain200`, `pretrain300` — que se expande automáticamente a la lista de tareas upstream y fija automáticamente el `split` del dataset (`target` o `pretrain`).

## Instalación

RoboCasa y su dependencia `robosuite` no están publicados en PyPI, y el propio `setup.py` de RoboCasa fija `lerobot==0.3.3`, lo cual entra en conflicto con el `lerobot` de este repositorio. Por lo tanto, LeRobot no **expone** un extra `robocasa`: instale los dos paquetes manualmente como clones editables (usando `--no-deps` en `robocasa` para omitir su fijación de `lerobot` que queda en la sombra):

```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 requiere MuJoCo. Establezca el backend de renderizado antes de entrenar o evaluar:

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

### Registros de objetos

Por defecto, el entorno muestrea objetos solo del registro `lightwheel` (lo que incluye `--type objs_lw`), lo que evita un error de `Probabilities contain NaN` cuando los paquetes de objaverse / aigen no están en el disco. Si has descargado el conjunto completo de recursos, habilita el registro completo en tiempo de ejecución:

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

## Evaluación

Todos los fragmentos de evaluación a continuación replican el comando de CI (ver `.github/workflows/benchmark_tests.yml`). El argumento `--rename_map` asigna las claves de cámara nativas de RoboCasa al esquema de entrada de tres cámaras (`camera1` / `camera2` / `camera3`) con el que se entrenó la política `smolvla_robocasa` publicada: `robot0_agentview_left` → `camera1`, `robot0_agentview_right` → `camera2`, `robot0_eye_in_hand` → `camera3`. Esta correspondencia debe coincidir con el mapeo de entrenamiento de la política (ver `rename_map` en el `train_config.json` del checkpoint); intercambiar dos claves de cámara se acepta de forma silenciosa, ya que las tres vistas comparten la misma forma.

Por defecto, cada tarea utiliza el horizonte de despliegue registrado por RoboCasa. Establezca `--env.episode_length=<steps>` para aplicar el mismo horizonte explícito a todas las tareas seleccionadas.

### Evaluación de una sola tarea (recomendada para iteración rápida)

```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"}'
```

### Evaluación multitarea

Pase una lista de tareas separadas por comas:

```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"}'
```

### Evaluación de grupos de benchmarks

Ejecutar un grupo completo de upstream (p. ej., las 18 tareas `atomic_seen` con `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"}'
```

### Episodios de evaluación recomendados

**20 episodios por tarea** para un benchmarking reproducible. Coincide con el protocolo utilizado en los resultados publicados.

## Entradas y salidas de la política

**Observaciones** (los nombres de las cámaras de RoboCasa se conservan tal cual):

- `observation.state` — estado propioceptivo de 16 dimensiones (posición de la base, cuaternión de la base, posición relativa del efector final, cuaternión relativo del efector final, qpos del agarre)
- `observation.images.robot0_agentview_left` — vista del agente izquierdo, 256×256 HWC uint8
- `observation.images.robot0_eye_in_hand` — vista de la cámara de muñeca, 256×256 HWC uint8
- `observation.images.robot0_agentview_right` — vista del agente derecho, 256×256 HWC uint8

**Acciones:**

- Control continuo en `Box(-1, 1, shape=(12,))` — movimiento base (4D) + modo de control (1D) + posición del efector final (3D) + rotación del efector final (3D) + pinza (1D).

## Entrenamiento

### Ejemplo de una sola tarea

Hay un conjunto de datos de una sola tarea listo para usar en el Hub: [`pepijn223/robocasa_CloseFridge`](https://huggingface.co/datasets/pepijn223/robocasa_CloseFridge).

Ajusta un modelo base de SmolVLA en `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
```

Evalúe el punto de control resultante:

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

## Reproducción de resultados publicados

El checkpoint publicado [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa) se evalúa con los comandos de la sección [Evaluation](#evaluation). CI ejecuta una evaluación de humo de 10 tareas atómicas (un episodio cada una) en cada PR que modifica el benchmark, seleccionando tareas centradas en fixtures que no requieren el paquete de assets de objaverse.

