# 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) adalah benchmark manipulasi dengan augmentasi memori yang dibangun di atas ManiSkill (SAPIEN). Benchmark ini mengevaluasi kemampuan robot untuk mempertahankan dan menggunakan informasi sepanjang satu episode — menghitung, permanensi objek, referensi, dan imitasi.

- **16 tugas** di 4 suite keterampilan memori
- **1.600 demo pelatihan** (100 per tugas, 50 val, 50 test)
- **Dataset**: [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) — LeRobot v3.0, 768K frame pada 10 fps
- **Simulator**: ManiSkill / SAPIEN, lengan Panda, hanya Linux

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

## Tugas

| Suite                             | Tugas                                                         |
| --------------------------------- | ------------------------------------------------------------- |
| **Penjumlahan** (memori temporal)    | BinFill, PickXtimes, SwingXtimes, StopCube                    |
| **Permanence** (memori spasial)   | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap  |
| **Referensi** (memori objek)     | PickHighlight, VideoRepick, VideoPlaceButton, VideoPlaceOrder |
| **Imitasi** (memori prosedural) | MoveCube, InsertPeg, PatternLock, RouteStick                  |

## Instalasi

> RoboMME membutuhkan **Linux** (ManiSkill/SAPIEN menggunakan rendering Vulkan). Docker disarankan untuk mengisolasi konflik dependensi.

### 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'
```

> **Catatan dependensi**: `mani-skill` (ditarik oleh `robomme`) mengunci `gymnasium==0.29.1` dan `numpy<2.0.0`, yang bertentangan dengan `numpy>=2.0.0` dasar lerobot. Itulah mengapa `robomme` bukan extra pyproject — gunakan instalasi override di atas, atau pendekatan Docker di bawah untuk sepenuhnya menghindari konflik.

### Docker (dianjurkan)

Jalankan RoboMME dalam image simulatornya sendiri, sehingga pin `numpy`/`gymnasium` tidak pernah bertemu dengan pin kebijakan:

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

Lalu evaluasi dengan `--env.type=robomme --env.server.endpoint=tcp/127.0.0.1:7448` (lihat [Simulasi: lokal atau disajikan](./simulation)).

## Menjalankan Evaluasi

### Default (tugas tunggal, episode tunggal)

```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
```

### Evaluasi multi-tugas

Evaluasi beberapa tugas dalam satu eksekusi dengan memisahkan nama tugas menggunakan koma. Gunakan `task_ids` untuk mengontrol episode mana yang dievaluasi per tugas. Rekomendasi: 50 episode per tugas untuk split pengujian.

```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
```

### Opsi CLI utama untuk `env.type=robomme`

| Opsi               | Default       | Deskripsi                                        |
| -------------------- | ------------- | -------------------------------------------------- |
| `env.task`           | `PickXtimes`  | Salah satu dari 16 nama tugas di atas (dipisahkan koma)   |
| `env.dataset_split`  | `test`        | `train`, `val`, atau `test`                          |
| `env.action_space`   | `joint_angle` | `joint_angle` (8-D) atau `ee_pose` (7-D)             |
| `env.episode_length` | `300`         | Langkah maksimum per episode                              |
| `env.task_ids`       | `null`        | Daftar indeks episode untuk dievaluasi (null = `[0]`) |

## Dataset

Dataset [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) berada dalam **format LeRobot v3.0** dan dapat dimuat secara langsung:

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

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

### Fitur dataset

| Fitur            | Bentuk         | Deskripsi                     |
| ------------------ | ------------- | ------------------------------- |
| `image`            | (256, 256, 3) | Kamera depan RGB                |
| `wrist_image`      | (256, 256, 3) | Kamera pergelangan tangan RGB                |
| `actions`          | (8,)          | Sudut sendi + penjepit          |
| `state`            | (8,)          | Posisi sendi + status penjepit |
| `simple_subgoal`   | str           | Anotasi bahasa tingkat tinggi  |
| `grounded_subgoal` | str           | Anotasi bahasa berdasar    |
| `episode_index`    | int           | ID Episode                      |
| `frame_index`      | int           | Frame dalam episode            |

### Penyelarasan kunci fitur (pelatihan)

Env wrapper mengekspos kameranya di bawah `pixels/<camera_name>`, yang dinamai oleh `RoboMMEEnvConfig.front_camera_name` dan `RoboMMEEnvConfig.wrist_camera_name` (secara default `camera1` dan `camera2`). Policy menerimanya sebagai `observation.images.camera1` dan `observation.images.camera2`, serta state (`agent_pos`) sebagai `observation.state`.

Kolom mentah dataset tidak cocok dengan kunci kebijakan tersebut, sehingga berikan `--rename_map` saat fine-tuning:

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

Override `--env.front_camera_name` / `--env.wrist_camera_name` jika Anda melatih dengan nama kunci yang berbeda, sehingga observasi evaluasi cocok dengan kunci yang digunakan saat pelatihan policy.

## Ruang Aksi

| Tipe          | Dim | Deskripsi                                               |
| ------------- | --- | --------------------------------------------------------- |
| `joint_angle` | 8   | 7 sudut sendi + 1 gripper (−1 tertutup, +1 terbuka, absolut) |
| `ee_pose`     | 7   | xyz + roll/pitch/yaw + gripper                            |

Atur melalui `--env.action_space=joint_angle` (default) atau `--env.action_space=ee_pose`.

## Catatan Platform

- **Hanya Linux**: ManiSkill memerlukan SAPIEN/Vulkan. macOS dan Windows tidak didukung.
- **GPU disarankan**: Rendering dapat dilakukan dengan CPU tetapi lambat; CUDA + Vulkan memberikan kecepatan penuh.
- **konflik gymnasium / numpy**: Lihat catatan instalasi di atas. Citra Docker menangani ini secara otomatis.
- **Fork ManiSkill**: `robomme` bergantung pada fork ManiSkill tertentu (`YinpeiDai/ManiSkill`), yang ditarik secara otomatis melalui paket `robomme`.

