# 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) — это масштабная симуляционная платформа для обучения и бенчмаркинга **универсальных роботов** в повседневных кухонных задачах. Она включает 365 разнообразных задач манипулирования в 2500 кухонных средах, более 3200 объектов и более 600 часов данных человеческих демонстраций, на мобильном манипуляторе PandaOmron с 12 степенями свободы (манипулятор Franka на голономной базе).

- Статья: [RoboCasa: крупномасштабное моделирование повседневных задач для универсальных роботов](https://arxiv.org/abs/2406.02523)
- GitHub: [robocasa/robocasa](https://github.com/robocasa/robocasa)
- Сайт проекта: [robocasa.ai](https://robocasa.ai)
- Предобученная политика: [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa)
- Однозадачный набор данных (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%"
/>

## Доступные задачи

RoboCasa365 организует свои 365 задач в две семейства и три группы исходных бенчмарков, которые LeRobot предоставляет в виде первоклассных сокращений `--env.task`:

| Семейство    | Задачи | Описание                                                                     |
| --------- | ----- | ------------------------------------------------------------------------------- |
| Атомарный    | ~65   | Задачи с одним навыком: захват и размещение, манипуляции с дверцами/ящиками, управление бытовой техникой |
| Композитный | ~300  | Многоступенчатые задачи в более чем 60 категориях: приготовление пищи, уборка, организация и т. д.     |

**Примеры атомарных задач:** `CloseFridge`, `OpenDrawer`, `OpenCabinet`, `TurnOnMicrowave`, `TurnOffStove`, `NavigateKitchen`, `PickPlaceCounterToStove`.

**Составные категории задач:** выпечка, варка, заваривание, нарезка, уборка стола, разморозка продуктов, загрузка посудомоечной машины, заваривание чая, разогрев пищи в микроволновой печи, мытье посуды и другие.

`--env.task` принимает три формы:

- одно имя задачи (`CloseFridge`)
- список, разделённый запятыми (`CloseFridge,OpenBlenderLid,PickPlaceCoffee`)
- сокращение для группы бенчмарков — `atomic_seen`, `composite_seen`, `composite_unseen`, `pretrain50`, `pretrain100`, `pretrain200`, `pretrain300` — которое автоматически раскрывается в список исходных задач и автоматически устанавливает `split` набора данных (`target` или `pretrain`).

## Установка

RoboCasa и его зависимость `robosuite` не опубликованы на PyPI, а собственный `setup.py` RoboCasa жёстко фиксирует `lerobot==0.3.3`, что конфликтует с `lerobot` из этого репозитория. Поэтому LeRobot **не** предоставляет дополнительный пакет `robocasa` — установите оба пакета вручную в режиме редактирования (используя `--no-deps` для `robocasa`, чтобы пропустить его затенённую фиксацию `lerobot`):

```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 требует MuJoCo. Установите бэкенд рендеринга перед обучением или оценкой:

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

### Реестры объектов

По умолчанию env выбирает объекты только из реестра `lightwheel` (то, что поставляется с `--type objs_lw`), что позволяет избежать сбоя `Probabilities contain NaN`, если пакеты objaverse / aigen отсутствуют на диске. Если вы скачали полный набор ассетов, включите полный реестр во время выполнения:

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

## Оценка

Все приведённые ниже фрагменты кода для оценки повторяют команду CI (см. `.github/workflows/benchmark_tests.yml`). Аргумент `--rename_map` сопоставляет нативные ключи камер RoboCasa с входной конфигурацией из трёх камер (`camera1` / `camera2` / `camera3`), на которой обучалась опубликованная политика `smolvla_robocasa`: `robot0_agentview_left` → `camera1`, `robot0_agentview_right` → `camera2`, `robot0_eye_in_hand` → `camera3`. Это соответствие должно совпадать с маппингом, использованным при обучении политики (см. `rename_map` в файле `train_config.json` контрольной точки); перестановка двух ключей камер будет принята без предупреждения, поскольку все три вида имеют одинаковую форму.

По умолчанию каждая задача использует горизонт развёртки, зарегистрированный в RoboCasa. Установите `--env.episode_length=<steps>`, чтобы применить одинаковый явный горизонт для всех выбранных задач.

### Оценка по одной задаче (рекомендуется для быстрой итерации)

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

### Оценка по нескольким задачам

Передайте список задач, разделенных запятыми:

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

### Оценка группы бенчмарков

Запустите всю группу upstream (например, все 18 задач `atomic_seen` с `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"}'
```

### Рекомендуемые эпизоды оценки

**20 эпизодов на задачу** для воспроизводимого бенчмаркинга. Соответствует протоколу, использованному в опубликованных результатах.

## Входы и выходы политики

**Наблюдения** (исходные имена камер RoboCasa сохраняются без изменений):

- `observation.state` — 16-мерное проприоцептивное состояние (позиция базы, кватернион базы, относительная позиция конечного эффектора, относительный кватернион конечного эффектора, qpos захвата)
- `observation.images.robot0_agentview_left` — левый вид агента, 256×256 HWC uint8
- `observation.images.robot0_eye_in_hand` — вид с камеры на запястье, 256×256 HWC uint8
- `observation.images.robot0_agentview_right` — вид правого агента, 256×256 HWC uint8

**Действия:**

- Непрерывное управление в `Box(-1, 1, shape=(12,))` — базовое движение (4D) + режим управления (1D) + позиция исполнительного органа (3D) + ориентация исполнительного органа (3D) + захват (1D).

## Обучение

### Пример для одной задачи

Готовый к использованию однозадачный датасет доступен на Hub: [`pepijn223/robocasa_CloseFridge`](https://huggingface.co/datasets/pepijn223/robocasa_CloseFridge).

Довыучите базовую модель SmolVLA на `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
```

Оцените полученную контрольную точку:

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

## Воспроизведение опубликованных результатов

Опубликованная контрольная точка [`lerobot/smolvla_robocasa`](https://huggingface.co/lerobot/smolvla_robocasa) оценивается с помощью команд из раздела [Оценка](#evaluation). CI выполняет smoke-оценку из 10 атомарных задач (по одному эпизоду на каждую) для каждого PR, затрагивающего бенчмарк, выбирая задачи, ориентированные на фикстуры и не требующие пакета ассетов objaverse.

