# RoboMME

  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/robomme.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)).

[RoboMME](https://robomme.github.io) es un benchmark de manipulación con memoria, construido sobre ManiSkill (SAPIEN). Evalúa la capacidad de un robot para retener y utilizar información a lo largo de un episodio: conteo, permanencia de objetos, referencia e imitación.

- **16 tareas** en 4 suites de habilidades de memoria
- **1.600 demostraciones de entrenamiento** (100 por tarea, 50 de validación, 50 de prueba)
- **Conjunto de datos**: [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) — LeRobot v3.0, 768K fotogramas a 10 fps
- **Simulador**: ManiSkill / SAPIEN, brazo Panda, solo Linux

![RoboMME benchmark tasks overview](/static-proxy?url=https%3A%2F%2Fcdn-thumbnails.huggingface.co%2Fsocial-thumbnails%2Fpapers%2F2603.04639%2Fgradient.png)

## Tareas

| Suite                             | Tareas                                                         |
| --------------------------------- | ------------------------------------------------------------- |
| **Conteo** (memoria temporal)    | BinFill, PickXtimes, SwingXtimes, StopCube                    |
| **Permanencia** (memoria espacial)   | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap  |
| **Referencia** (memoria de objetos)     | PickHighlight, VideoRepick, VideoPlaceButton, VideoPlaceOrder |
| **Imitación** (memoria procedural) | MoveCube, InsertPeg, PatternLock, RouteStick                  |

## Instalación

> RoboMME requiere **Linux** (ManiSkill/SAPIEN usa renderizado con Vulkan). Se recomienda usar Docker para aislar conflictos de dependencias.

### Native (Linux)

```bash
uv pip install --override <(printf 'gymnasium==0.29.1\nnumpy==1.26.4\n') \
  -e '.[smolvla,av-dep]' \
  'robomme @ git+https://github.com/RoboMME/robomme_benchmark.git@main'
```

> **Nota sobre dependencias**: `mani-skill` (traído por `robomme`) fija `gymnasium==0.29.1` y `numpy<2.0.0`, lo cual entra en conflicto con la base de lerobot `numpy>=2.0.0`. Por eso `robomme` no es un extra de pyproject: usa la instalación con anulación anterior o el enfoque con Docker a continuación para evitar conflictos por completo.

### Docker (recomendado)

Ejecuta RoboMME en su propia imagen de simulador, para que sus fijaciones de `numpy`/`gymnasium` nunca coincidan con las de la política:

```bash
lerobot-env-server --config_path=docker/sim/configs/robomme.yaml --docker=true
```

Luego evalúe con `--env.type=robomme --env.server.endpoint=tcp/127.0.0.1:7448` (consulte [Simulación: local o servida](./simulation)).

## Ejecución de la evaluación

### Default (tarea única, episodio único)

```bash
lerobot-eval \
    --policy.path=<your_policy_repo> \
    --env.type=robomme \
    --env.task=PickXtimes \
    --env.dataset_split=test \
    --env.task_ids=[0] \
    --eval.batch_size=1 \
    --eval.n_episodes=1
```

### Evaluación multitarea

Evalúe varias tareas en una sola ejecución separando los nombres de tareas con comas. Use `task_ids` para controlar qué episodios se evalúan por tarea. Recomendado: 50 episodios por tarea para la división de prueba.

```bash
lerobot-eval \
    --policy.path=<your_policy_repo> \
    --env.type=robomme \
    --env.task=PickXtimes,BinFill,StopCube,MoveCube,InsertPeg \
    --env.dataset_split=test \
    --env.task_ids=[0,1,2,3,4,5,6,7,8,9] \
    --eval.batch_size=1 \
    --eval.n_episodes=50
```

### Opciones principales de CLI para `env.type=robomme`

| Opción               | Predeterminado       | Descripción                                        |
| -------------------- | ------------- | -------------------------------------------------- |
| `env.task`           | `PickXtimes`  | Cualquiera de los 16 nombres de tareas anteriores (separados por comas)   |
| `env.dataset_split`  | `test`        | `train`, `val` o `test`                          |
| `env.action_space`   | `joint_angle` | `joint_angle` (8-D) o `ee_pose` (7-D)             |
| `env.episode_length` | `300`         | Pasos máximos por episodio                              |
| `env.task_ids`       | `null`        | Lista de índices de episodios a evaluar (null = `[0]`) |

## Dataset

El conjunto de datos [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) está en **formato LeRobot v3.0** y se puede cargar directamente:

```python
from lerobot.datasets.lerobot_dataset import LeRobotDataset

dataset = LeRobotDataset("lerobot/robomme")
```

### Características del conjunto de datos

| Característica            | Forma         | Descripción                     |
| ------------------ | ------------- | ------------------------------- |
| `image`            | (256, 256, 3) | Cámara frontal RGB                |
| `wrist_image`      | (256, 256, 3) | Cámara RGB de muñeca                |
| `actions`          | (8,)          | Ángulos articulares + pinza          |
| `state`            | (8,)          | Posiciones articulares + estado del agarre |
| `simple_subgoal`   | str           | Anotación de alto nivel  |
| `grounded_subgoal` | str           | Anotación de lenguaje con base    |
| `episode_index`    | int           | ID del episodio                      |
| `frame_index`      | int           | Marco dentro del episodio            |

### Alineación de claves de características (entrenamiento)

El env wrapper expone sus cámaras bajo `pixels/<camera_name>`, nombradas por `RoboMMEEnvConfig.front_camera_name` y `RoboMMEEnvConfig.wrist_camera_name` (`camera1` y `camera2` por defecto). La política las recibe como `observation.images.camera1` y `observation.images.camera2`, y el estado (`agent_pos`) como `observation.state`.

Las columnas crudas del conjunto de datos no coinciden con esas claves de política, por lo que pase un `--rename_map` al realizar el ajuste fino:

```bash
--rename_map='{"image": "observation.images.camera1", "wrist_image": "observation.images.camera2", "state": "observation.state", "actions": "action"}'
```

Sobrescribe `--env.front_camera_name` / `--env.wrist_camera_name` si entrenas con nombres de clave diferentes, para que las observaciones de evaluación coincidan con las claves en las que se entrenó la política.

## Espacios de acciones

| Tipo          | Dim | Descripción                                               |
| ------------- | --- | --------------------------------------------------------- |
| `joint_angle` | 8   | 7 ángulos articulares + 1 pinza (−1 cerrada, +1 abierta, absoluta) |
| `ee_pose`     | 7   | xyz + roll/pitch/yaw + pinza                            |

Establecido mediante `--env.action_space=joint_angle` (predeterminado) o `--env.action_space=ee_pose`.

## Notas de la plataforma

- **Solo Linux**: ManiSkill requiere SAPIEN/Vulkan. macOS y Windows no son compatibles.
- **Se recomienda GPU**: El renderizado es posible con CPU pero lento; CUDA + Vulkan ofrece la velocidad completa.
- **conflicto entre gymnasium y numpy**: consulte la nota de instalación anterior. La imagen de Docker lo gestiona automáticamente.
- **Fork de ManiSkill**: `robomme` depende de un fork específico de ManiSkill (`YinpeiDai/ManiSkill`), que se incorpora automáticamente a través del paquete `robomme`.

