# 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)は、ManiSkill (SAPIEN) を基盤とする、メモリ拡張型マニピュレーションベンチマークです。エピソード全体を通じて情報を保持し活用するロボットの能力、すなわち、カウント、物体永続性、参照、模倣を評価します。

- 4つのメモリスキルスイートにまたがる**16タスク**
- **1,600件の学習デモ**（タスクごとに100件、検証用50件、テスト用50件）
- **データセット**: [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) — LeRobot v3.0、10 fpsで768Kフレーム
- **シミュレーター**: ManiSkill / SAPIEN、Pandaアーム、Linuxのみ

![RoboMME benchmark tasks overview](https://cdn-thumbnails.huggingface.co/social-thumbnails/papers/2603.04639/gradient.png)

## タスク

| スイート                             | タスク                                                         |
| --------------------------------- | ------------------------------------------------------------- |
| **カウント**（時間的メモリ）    | BinFill, PickXtimes, SwingXtimes, StopCube                    |
| **永続性**（空間記憶）   | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap  |
| **リファレンス**（オブジェクトメモリ）     | PickHighlight、VideoRepick、VideoPlaceButton、VideoPlaceOrder |
| **模倣**（手続き記憶） | MoveCube、InsertPeg、PatternLock、RouteStick                  |

## インストール

> RoboMMEには**Linux**が必要です（ManiSkill/SAPIENはVulkanレンダリングを使用します）。依存関係の競合を分離するため、Dockerの使用を推奨します。

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

> **依存関係に関する注意**: `robomme` によって引き込まれる `mani-skill` は `gymnasium==0.29.1` と `numpy<2.0.0` を固定しており、lerobot のベースである `numpy>=2.0.0` と競合します。そのため、`robomme` は pyproject の extra には含まれていません。競合を完全に回避するには、上記のオーバーライドによるインストール、または下記の Docker によるアプローチを使用してください。

### Docker (推奨)

RoboMMEを独自のシミュレーターイメージで実行し、その`numpy`/`gymnasium`のバージョン固定がポリシー側のものと衝突しないようにします:

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

その後、`--env.type=robomme --env.server.endpoint=tcp/127.0.0.1:7448` を使用して評価を実行します（[シミュレーション: ローカルまたはサーブ](./simulation)を参照）。

## 評価の実行

### Default （単一タスク、単一エピソード）

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

### マルチタスク評価

タスク名をカンマ区切りで指定することで、1回の実行で複数のタスクを評価できます。`task_ids` を使用して、タスクごとに評価するエピソードを制御します。推奨: テスト分割ではタスクごとに50エピソード。

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

### `env.type=robomme`の主なCLIオプション

| オプション               | デフォルト       | 説明                                        |
| -------------------- | ------------- | -------------------------------------------------- |
| `env.task`           | `PickXtimes`  | 上記の16のタスク名（カンマ区切り）のいずれか   |
| `env.dataset_split`  | `test`        | `train`、`val`、または`test`                          |
| `env.action_space`   | `joint_angle` | `joint_angle`（8次元）または`ee_pose`（7次元）             |
| `env.episode_length` | `300`         | エピソードあたりの最大ステップ数                              |
| `env.task_ids`       | `null`        | 評価するエピソードのインデックスのリスト（null = `[0]`） |

## データセット

データセット [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) は **LeRobot v3.0 形式** であり、直接読み込むことができます:

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

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

### Datasetの機能

| 機能            | 形状         | 説明                     |
| ------------------ | ------------- | ------------------------------- |
| `image`            | (256, 256, 3) | フロントカメラRGB                |
| `wrist_image`      | (256, 256, 3) | 手首カメラRGB                |
| `actions`          | (8,)          | 関節角度 + グリッパー          |
| `state`            | (8,)          | 関節位置 + グリッパー状態 |
| `simple_subgoal`   | str           | 高レベル言語アノテーション  |
| `grounded_subgoal` | str           | グラウンデッド言語アノテーション    |
| `episode_index`    | int           | エピソードID                      |
| `frame_index`      | int           | エピソード内のフレーム            |

### Feature key alignment (training)

env ラッパーは、`RoboMMEEnvConfig.front_camera_name` および `RoboMMEEnvConfig.wrist_camera_name`（デフォルトでは `camera1` と `camera2`）で命名された `pixels/<camera_name>` 配下にカメラを公開します。ポリシーはこれらを `observation.images.camera1` および `observation.images.camera2` として受信し、状態（`agent_pos`）は `observation.state` として受信します。

データセットの生カラムがポリシーのキーと一致しないため、ファインチューニング時には`--rename_map`を渡してください:

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

異なるキー名で学習を行う場合は、`--env.front_camera_name` / `--env.wrist_camera_name` をオーバーライドしてください。これにより、評価時の観測値が、ポリシーが学習されたキーと一致します。

## アクションスペース

| 型          | 次元 | 説明                                               |
| ------------- | --- | --------------------------------------------------------- |
| `joint_angle` | 8   | 7つの関節角度 + 1つのグリップ（-1: 閉、+1: 開、絶対値） |
| `ee_pose`     | 7   | xyz + roll/pitch/yaw + gripper                            |

`--env.action_space=joint_angle`（デフォルト）または`--env.action_space=ee_pose`で設定します。

## プラットフォームに関する注意事項

- **Linux のみ**: ManiSkill は SAPIEN/Vulkan が必要です。macOS と Windows はサポートされていません。
- **GPU推奨**: レンダリングはCPUでも実行可能ですが低速です。CUDA + Vulkanを使用するとフルスピードで動作します。
- **gymnasium / numpy の競合**: 上記のインストールに関する注記を参照してください。Docker イメージでは自動的に処理されます。
- **ManiSkill のフォーク**: `robomme` は特定の ManiSkill のフォーク（`YinpeiDai/ManiSkill`）に依存しており、`robomme` パッケージを介して自動的に取得されます。

