# RoboCasa365

  The commands below run the simulator locally. To keep its dependencies away from your policy's, serve it instead with `lerobot-env-server --config_path=docker/sim/configs/robocasa.yaml --sim.task= --docker=true`, where `` is the command's `--env.task`, and add `--env.server.endpoint=tcp/127.0.0.1:7448` to the command. A server runs the task it was started with (see [Simulation: local or served](./simulation)).

[RoboCasa365](https://robocasa.ai) é um framework de simulação em larga escala para treinar e avaliar **robôs generalistas** em tarefas cotidianas de cozinha. Ele oferece 365 tarefas diversas de manipulação em 2.500 ambientes de cozinha, mais de 3.200 ativos de objetos e mais de 600 horas de dados de demonstração humana, em um manipulador móvel PandaOmron de 12 graus de liberdade (braço Franka em uma base holonômica).

- Artigo: [RoboCasa: Simulação em grande escala de tarefas diárias para robôs generalistas](https://arxiv.org/abs/2406.02523)
- GitHub: [robocasa/robocasa](https://github.com/robocasa/robocasa)
- Site do projeto: [robocasa.ai](https://robocasa.ai)
- Política pré-treinada: [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa)
- Conjunto de dados de tarefa única (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%"
/>

## Tarefas disponíveis

RoboCasa365 organiza suas 365 tarefas em duas famílias e três grupos de benchmarks upstream que o LeRobot expõe como atalhos de primeira classe `--env.task`:

| Família    | Tarefas | Descrição                                                                     |
| --------- | ----- | ------------------------------------------------------------------------------- |
| Atômico    | ~65   | Tarefas de habilidade única: pegar e posicionar, manipulação de portas/gavetas, controle de eletrodomésticos |
| Composto | ~300  | Tarefas em várias etapas em mais de 60 categorias: culinária, limpeza, organização, etc.     |

**Exemplos de tarefas atômicas:** `CloseFridge`, `OpenDrawer`, `OpenCabinet`, `TurnOnMicrowave`, `TurnOffStove`, `NavigateKitchen`, `PickPlaceCounterToStove`.

**Categorias de tarefas compostas:** assar, ferver, preparar, picar, limpar a mesa, descongelar alimentos, carregar a máquina de lavar louça, fazer chá, aquecer alimentos no micro-ondas, lavar louça, entre outras.

`--env.task` aceita três formas:

- um único nome de tarefa (`CloseFridge`)
- uma lista separada por vírgulas (`CloseFridge,OpenBlenderLid,PickPlaceCoffee`)
- um atalho de grupo de benchmark — `atomic_seen`, `composite_seen`, `composite_unseen`, `pretrain50`, `pretrain100`, `pretrain200`, `pretrain300` — que se expande automaticamente para a lista de tarefas upstream e define automaticamente o `split` do dataset (`target` ou `pretrain`).

## Instalação

RoboCasa e sua dependência `robosuite` não são publicados no PyPI, e o próprio `setup.py` do RoboCasa fixa `lerobot==0.3.3`, o que conflita com o `lerobot` deste repositório. O LeRobot, portanto, não **expõe** um extra `robocasa` — instale os dois pacotes manualmente como clones editáveis (usando `--no-deps` no `robocasa` para pular a fixação de `lerobot` que ele contém):

```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 requer MuJoCo. Defina o backend de renderização antes do treinamento ou da avaliação:

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

### Registros de objetos

Por padrão, o env amostra objetos apenas do registro `lightwheel` (o que o `--type objs_lw` fornece), o que evita uma falha de `Probabilities contain NaN` quando os pacotes objaverse / aigen não estão no disco. Se você baixou o conjunto completo de ativos, habilite o registro completo em tempo de execução:

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

## Avaliação

Todos os trechos de avaliação abaixo espelham o comando de CI (veja `.github/workflows/benchmark_tests.yml`). O argumento `--rename_map` mapeia as chaves nativas de câmera do RoboCasa para o layout de entrada de três câmeras (`camera1` / `camera2` / `camera3`) no qual a política `smolvla_robocasa` liberada foi treinada: `robot0_agentview_left` → `camera1`, `robot0_agentview_right` → `camera2`, `robot0_eye_in_hand` → `camera3`. Esse pareamento deve corresponder ao mapeamento da política no momento do treinamento (veja `rename_map` no `train_config.json` do checkpoint); a troca de duas chaves de câmera é aceita silenciosamente, pois as três visualizações compartilham a mesma forma.

Por padrão, cada tarefa usa o horizonte de rollout registrado pelo RoboCasa. Defina `--env.episode_length=<steps>` para aplicar o mesmo horizonte explícito a todas as tarefas selecionadas.

### Avaliação de tarefa única (recomendada para iteração 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"}'
```

### Avaliação multi-tarefa

Passe uma lista de tarefas separadas por vírgulas:

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_robocasa \
  --env.type=robocasa \
  --env.task=CloseFridge,OpenCabinet,OpenDrawer,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"}'
```

### Avaliação por grupo de benchmarks

Execute um grupo upstream inteiro (por exemplo, todas as 18 tarefas `atomic_seen` com `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"}'
```

### Episódios de avaliação recomendados

**20 episódios por tarefa** para benchmarking reproduzível. Corresponde ao protocolo usado nos resultados publicados.

## Entradas e saídas da política

**Observações** (os nomes brutos das câmeras do RoboCasa são preservados literalmente):

- `observation.state` — estado proprioceptivo de 16 dimensões (posição da base, quaterniô da base, posição relativa do efetuador final, quaterniô relativo do efetuador final, qpos do garra)
- `observation.images.robot0_agentview_left` — visão do agente esquerdo, 256×256 HWC uint8
- `observation.images.robot0_eye_in_hand` — visão da câmera do pulso, 256×256 HWC uint8
- `observation.images.robot0_agentview_right` — visão do agente direito, 256×256 HWC uint8

**Ações:**

- Controle contínuo em `Box(-1, 1, shape=(12,))` — movimento base (4D) + modo de controle (1D) + posição do efetuador final (3D) + rotação do efetuador final (3D) + garra (1D).

## Treinamento

### Exemplo de tarefa única

Um conjunto de dados de tarefa única pronto para uso está no Hub: [`pepijn223/robocasa_CloseFridge`](https://huggingface.co/datasets/pepijn223/robocasa_CloseFridge).

Ajuste fino de um SmolVLA base em `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
```

Avalie o checkpoint 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
```

## Reproduzindo resultados publicados

O checkpoint liberado [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa) é avaliado com os comandos da seção [Avaliação](#evaluation). O CI executa uma avaliação de fumaça com 10 tarefas atômicas (um episódio cada) em cada PR que afeta o benchmark, selecionando tarefas centradas em fixtures que não exigem o pacote de assets do objaverse.

