# RoboCerebra

  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/robocerebra.yaml --sim.task= --docker=true`, where `` is the command's `--env.task`, and run the command with `--env.type=robocerebra --env.server.endpoint=tcp/127.0.0.1:7448`. A server runs the task it was started with (see [Simulation: local or served](./simulation)).

[RoboCerebra](https://robocerebra.github.io/) es un benchmark de manipulación de largo horizonte que evalúa el **razonamiento de alto nivel, la planificación y la memoria** en VLAs. Los episodios encadenan múltiples subobjetivos con instrucciones intermedias basadas en lenguaje, construidos sobre la pila de simuladores de LIBERO (MuJoCo + robosuite, Franka Panda 7-DOF).

- Artículo: [RoboCerebra: A Large-scale Benchmark for Long-horizon Robotic Manipulation Evaluation](https://arxiv.org/abs/2506.06677)
- Sitio web del proyecto: [robocerebra.github.io](https://robocerebra.github.io/)
- Dataset: [`lerobot/robocerebra_unified`](https://huggingface.co/datasets/lerobot/robocerebra_unified) — LeRobot v3.0, 6,660 episodios / 571,116 fotogramas a 20 fps, 1,728 subtareas con base lingüística.
- Política preentrenada: [`lerobot/smolvla_robocerebra`](https://huggingface.co/lerobot/smolvla_robocerebra)

## Tareas disponibles

RoboCerebra reutiliza el simulador de LIBERO, por lo que la evaluación se ejecuta contra la suite de largo horizonte `libero_10` de LIBERO:

| Suite     | Nombre de la CLI    | Tareas | Descripción                                                   |
| --------- | ----------- | ----- | ------------------------------------------------------------- |
| LIBERO-10 | `libero_10` | 10    | Tareas de cocina/sala de estar de largo horizonte que encadenan de 3 a 6 subobjetivos |

Cada episodio de RoboCerebra en el conjunto de datos está segmentado en múltiples subtareas con instrucciones en lenguaje natural, que el conjunto de datos unificado expone como señales de supervisión independientes.

## Instalación

RoboCerebra se basa en LIBERO, por lo que el extra `libero` es todo lo que necesitas:

```bash
pip install -e ".[libero]"
```

RoboCerebra requiere Linux (MuJoCo / robosuite). Establezca el backend de renderizado antes de entrenar o evaluar:

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

## Evaluación

RoboCerebra eval ejecuta contra el conjunto `libero_10` de LIBERO con la nomenclatura de cámaras de RoboCerebra (`image` + `wrist_image`) y un hueco adicional de cámara vacía para que una política entrenada con tres vistas reciba el diseño de entrada esperado:

```bash
lerobot-eval \
  --policy.path=lerobot/smolvla_robocerebra \
  --env.type=libero \
  --env.task=libero_10 \
  --env.fps=20 \
  --env.obs_type=pixels_agent_pos \
  --env.observation_height=256 \
  --env.observation_width=256 \
  '--env.camera_name_mapping={"agentview_image": "image", "robot0_eye_in_hand_image": "wrist_image"}' \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --eval.use_async_envs=false \
  --policy.device=cuda \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.wrist_image": "observation.images.camera2"}' \
  --policy.empty_cameras=1
```

### Episodios de evaluación recomendados

**10 episodios por tarea** en la suite `libero_10` (100 en total) para un benchmarking reproducible. Coincide con el protocolo utilizado en el paper de RoboCerebra.

## Entradas y salidas de la política

**Observaciones:**

- `observation.state` — estado propioceptivo de 8 dimensiones (7 posiciones de articulaciones + pinza)
- `observation.images.image` — vista en tercera persona, 256×256 HWC uint8
- `observation.images.wrist_image` — vista de la cámara montada en la muñeca, 256×256 HWC uint8

**Acciones:**

- Control continuo en `Box(-1, 1, shape=(7,))` — delta del efector final (6D) + pinza (1D)

## Entrenamiento

El conjunto de datos unificado en [`lerobot/robocerebra_unified`](https://huggingface.co/datasets/lerobot/robocerebra_unified) expone dos flujos RGB y anotaciones de subtareas basadas en lenguaje:

| Característica                          | Forma         | Descripción          |
| -------------------------------- | ------------- | -------------------- |
| `observation.images.image`       | (256, 256, 3) | Vista en tercera persona    |
| `observation.images.wrist_image` | (256, 256, 3) | Cámara montada en la muñeca |
| `observation.state`              | (8,)          | Posición conjunta + pinza  |
| `action`                         | (7,)          | EEF delta + pinza  |

Ajusta un modelo base de SmolVLA sobre él:

```bash
lerobot-train \
  --policy.path=lerobot/smolvla_base \
  --policy.repo_id=${HF_USER}/smolvla_robocerebra \
  --policy.empty_cameras=1 \
  --dataset.repo_id=lerobot/robocerebra_unified \
  '--rename_map={"observation.images.image": "observation.images.camera1", "observation.images.wrist_image": "observation.images.camera2"}' \
  --env.type=libero \
  --env.task=libero_10 \
  '--env.camera_name_mapping={"agentview_image": "image", "robot0_eye_in_hand_image": "wrist_image"}' \
  --output_dir=outputs/smolvla_robocerebra
```

`smolvla_base` espera cámaras denominadas `camera1`–`camera3`, por lo que las banderas de cámara son las mismas que en el comando [Evaluation](#evaluation): `--rename_map` asigna las cámaras del conjunto de datos a esos nombres, y `--env.camera_name_mapping` asigna a las cámaras de LIBERO los nombres del conjunto de datos para la evaluación durante el entrenamiento.

## Reproducción de resultados publicados

El checkpoint publicado [`lerobot/smolvla_robocerebra`](https://huggingface.co/lerobot/smolvla_robocerebra) se entrenó con `lerobot/robocerebra_unified` y se evaluó con el comando de la sección [Evaluation](#evaluation). CI ejecuta el mismo comando con `--eval.n_episodes=1` como prueba de humo en cada PR que modifica el benchmark.

