# 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). يقيّم قدرة الروبوت على الاحتفاظ بالمعلومات واستخدامها عبر حلقة كاملة — بما في ذلك العدّ، وثبات الكائنات، والإشارة، والمحاكاة.

- **16 مهمة** عبر 4 مجموعات مهارات الذاكرة
- **1,600 عرض تدريب** (100 لكل مهمة، 50 للتحقق، 50 للاختبار)
- **مجموعة البيانات**: [`lerobot/robomme`](https://huggingface.co/datasets/lerobot/robomme) — LeRobot v3.0، 768 ألف إطار بمعدل 10 إطارات في الثانية
- **المحاكي**: ManiSkill / SAPIEN، ذراع Panda، يعمل على نظام Linux فقط

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

## المهام

| Suite                             | المهام                                                         |
| --------------------------------- | ------------------------------------------------------------- |
| **العدّ** (الذاكرة الزمنية)    | BinFill, PickXtimes, SwingXtimes, StopCube                    |
| **الثبات** (الذاكرة المكانية)   | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap  |
| **مرجع** (ذاكرة الكائنات)     | PickHighlight, VideoRepick, VideoPlaceButton, VideoPlaceOrder |
| **المحاكاة** (الذاكرة الإجرائية) | MoveCube، InsertPeg، PatternLock، RouteStick                  |

## التثبيت

> يتطلب RoboMME نظام **Linux** (حيث يستخدم ManiSkill/SAPIEN عرض Vulkan). يُنصح باستخدام Docker لعزل تعارضات الاعتماديات.

### Native (لينكس)

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

> **ملاحظة حول الاعتماديات**: يُثبّت `mani-skill` (الذي يجلبه `robomme`) الإصدار `gymnasium==0.29.1` و`numpy<2.0.0`، مما يتعارض مع الإصدار الأساسي لـ lerobot وهو `numpy>=2.0.0`. ولهذا السبب، لا يُعد `robomme` إضافة في pyproject — استخدم تثبيت التجاوز المذكور أعلاه، أو اتبع نهج 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
```

### التقييم متعدد المهام

قيّم مهام متعددة في تشغيل واحد عن طريق فصل أسماء المهام بفواصل. استخدم `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`

| خيار               | افتراضي       | الوصف                                        |
| -------------------- | ------------- | -------------------------------------------------- |
| `env.task`           | `PickXtimes`  | أي من أسماء المهام الستة عشر المذكورة أعلاه (مفصولة بفواصل)   |
| `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")
```

### خصائص مجموعة البيانات

| ميزة            | الشكل         | الوصف                     |
| ------------------ | ------------- | ------------------------------- |
| `image`            | (256, 256, 3) | كاميرا أمامية RGB                |
| `wrist_image`      | (256, 256, 3) | كاميرا معصم RGB                |
| `actions`          | (8,)          | زوايا المفاصل + القابض          |
| `state`            | (8,)          | مواضع المفاصل + حالة الماسك |
| `simple_subgoal`   | str           | التعليق بلغة عالية المستوى  |
| `grounded_subgoal` | str           | التعليق اللغوي الموثق    |
| `episode_index`    | int           | معرف الحلقة                      |
| `frame_index`      | int           | الإطار داخل الحلقة            |

### محاذاة مفاتيح الميزات (التدريب)

تُعرّض غلاف البيئة كاميراته تحت `pixels/<camera_name>`، حيث تُسمّى بواسطة `RoboMMEEnvConfig.front_camera_name` و`RoboMMEEnvConfig.wrist_camera_name` (و`camera1` و`camera2` افتراضياً). يستقبلها السياسة كـ`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`.

## ملاحظات المنصة

- **لنكس فقط**: يتطلب ManiSkill استخدام SAPIEN/Vulkan. لا يتم دعم macOS و Windows.
- **يُوصى باستخدام وحدة معالجة رسومية**: يمكن تنفيذ العرض على وحدة المعالجة المركزية لكنه بطيء؛ بينما يوفر كل من CUDA وVulkan السرعة الكاملة.
- **تعارض بين gymnasium و numpy**: راجع ملاحظة التثبيت أعلاه. يتعامل صورة Docker مع هذا تلقائيًا.
- **نسخة مشتقة من ManiSkill**: يعتمد `robomme` على نسخة مشتقة محددة من ManiSkill (`YinpeiDai/ManiSkill`)، يتم جلبها تلقائيًا عبر حزمة `robomme`.

