# 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) là một benchmark thao tác có bổ trợ bộ nhớ được xây dựng trên ManiSkill (SAPIEN). Nó đánh giá khả năng của robot trong việc giữ và sử dụng thông tin xuyên suốt một episode — đếm, tính bền vững của vật thể, tham chiếu và bắt chước.

- **16 tác vụ** trong 4 bộ kỹ năng bộ nhớ
- **1.600 demo huấn luyện** (100 cho mỗi tác vụ, 50 val, 50 test)
- **Bộ dữ liệu**: [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) — LeRobot v3.0, 768K khung hình ở 10 fps
- **Trình mô phỏng**: ManiSkill / SAPIEN, cánh tay Panda, chỉ hỗ trợ Linux

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

## Nhiệm vụ

| Bộ                             | Nhiệm vụ                                                         |
| --------------------------------- | ------------------------------------------------------------- |
| **Đếm** (bộ nhớ thời gian)    | BinFill, PickXtimes, SwingXtimes, StopCube                    |
| **Tính bền vững** (bộ nhớ không gian)   | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap  |
| **Tham chiếu** (bộ nhớ đối tượng)     | PickHighlight, VideoRepick, VideoPlaceButton, VideoPlaceOrder |
| **Bắt chước** (trí nhớ thủ tục) | MoveCube, InsertPeg, PatternLock, RouteStick                  |

## Cài đặt

> RoboMME yêu cầu **Linux** (ManiSkill/SAPIEN sử dụng Vulkan rendering). Khuyến nghị sử dụng Docker để cách ly các xung đột phụ thuộc.

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

> **Ghi chú về phụ thuộc**: `mani-skill` (được kéo theo bởi `robomme`) cố định `gymnasium==0.29.1` và `numpy<2.0.0`, gây xung đột với `numpy>=2.0.0` cơ bản của lerobot. Đó là lý do `robomme` không phải là một extra trong pyproject — hãy sử dụng lệnh cài đặt ghi đè ở trên, hoặc cách tiếp cận Docker ở dưới để tránh hoàn toàn các xung đột.

### Docker (được khuyến nghị)

Chạy RoboMME trong image mô phỏng riêng của nó, để các phiên bản `numpy`/`gymnasium` của nó không bao giờ xung đột với phiên bản của policy:

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

Sau đó, đánh giá với `--env.type=robomme --env.server.endpoint=tcp/127.0.0.1:7448` (xem [Mô phỏng: cục bộ hoặc được phục vụ](./simulation)).

## Chạy đánh giá

### Default (một tác vụ, một tập)

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

### Đánh giá đa nhiệm

Đánh giá nhiều tác vụ trong một lần chạy bằng cách phân tách tên tác vụ bằng dấu phẩy. Sử dụng `task_ids` để kiểm soát các episode được đánh giá cho từng tác vụ. Khuyến nghị: 50 episode cho mỗi tác vụ đối với tập test.

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

### Các tùy chọn CLI chính cho `env.type=robomme`

| Tùy chọn               | Mặc định       | Mô tả                                        |
| -------------------- | ------------- | -------------------------------------------------- |
| `env.task`           | `PickXtimes`  | Bất kỳ tên tác vụ nào trong 16 tên tác vụ ở trên (phân tách bằng dấu phẩy)   |
| `env.dataset_split`  | `test`        | `train`, `val` hoặc `test`                          |
| `env.action_space`   | `joint_angle` | `joint_angle` (8-D) hoặc `ee_pose` (7-D)             |
| `env.episode_length` | `300`         | Số bước tối đa mỗi tập                              |
| `env.task_ids`       | `null`        | Danh sách các chỉ số tập để đánh giá (null = `[0]`) |

## Bộ dữ liệu

Bộ dữ liệu [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) ở **định dạng LeRobot v3.0** và có thể được nạp trực tiếp:

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

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

### Đặc điểm của bộ dữ liệu

| Tính năng            | Hình dạng         | Mô tả                     |
| ------------------ | ------------- | ------------------------------- |
| `image`            | (256, 256, 3) | Camera RGB phía trước                |
| `wrist_image`      | (256, 256, 3) | Camera RGB cổ tay                |
| `actions`          | (8,)          | Góc khớp + kẹp          |
| `state`            | (8,)          | Vị trí khớp + trạng thái gắp |
| `simple_subgoal`   | str           | Ghi chú ngôn ngữ cấp cao  |
| `grounded_subgoal` | str           | Ghi chú ngôn ngữ có cơ sở    |
| `episode_index`    | int           | ID tập                      |
| `frame_index`      | int           | Khung trong tập            |

### Căn chỉnh khóa tính năng (đào tạo)

Env wrapper phơi bày các camera của nó dưới `pixels/<camera_name>`, được đặt tên bởi `RoboMMEEnvConfig.front_camera_name` và `RoboMMEEnvConfig.wrist_camera_name` (mặc định là `camera1` và `camera2`). Policy nhận chúng dưới dạng `observation.images.camera1` và `observation.images.camera2`, và trạng thái (`agent_pos`) dưới dạng `observation.state`.

Các cột thô của tập dữ liệu không khớp với các khóa chính sách đó, vì vậy hãy truyền `--rename_map` khi tinh chỉnh:

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

Ghi đè `--env.front_camera_name` / `--env.wrist_camera_name` nếu bạn huấn luyện với các tên khóa khác nhau, để các quan sát trong đánh giá khớp với các tên khóa mà chính sách đã được huấn luyện.

## Không gian hành động

| Loại          | Chiều | Mô tả                                               |
| ------------- | --- | --------------------------------------------------------- |
| `joint_angle` | 8   | 7 góc khớp + 1 kẹp (−1 đóng, +1 mở, tuyệt đối) |
| `ee_pose`     | 7   | xyz + roll/pitch/yaw + gripper                            |

Được đặt thông qua `--env.action_space=joint_angle` (mặc định) hoặc `--env.action_space=ee_pose`.

## Ghi chú về nền tảng

- **Chỉ hỗ trợ Linux**: ManiSkill yêu cầu SAPIEN/Vulkan. macOS và Windows không được hỗ trợ.
- **Khuyến nghị GPU**: Việc render có thể chạy trên CPU nhưng chậm; CUDA + Vulkan cho tốc độ đầy đủ.
- **xung đột giữa gymnasium và numpy**: Xem ghi chú cài đặt ở trên. Ảnh Docker xử lý điều này tự động.
- **Fork ManiSkill**: `robomme` phụ thuộc vào một fork cụ thể của ManiSkill (`YinpeiDai/ManiSkill`), được kéo vào tự động thông qua gói `robomme`.

