# reBot B601

الذراع الروبوتية reBot B601 هي ذراع روبوتية مفتوحة المصدر من Seeed Studio مخصصة لتعلم التقليد والذكاء الاصطناعي التجسدي. يتكون الإعداد من ذراع متتبعة بست درجات حرية مزودة بمقبض، وذراع reBot Arm 102 قائدة للتحكم عن بُعد.

يتوفر المتتبع مع محركات Damiao (DM) أو RobStride (RS). تستخدم كلا التوليفات نفس نوع روبوت LeRobot وأسماء المفاصل؛ اختر العتاد باستخدام `--robot.motor_family`.

| البناء                                                              | `motor_family` | محركات                                   | اتصال افتراضي   |
| ------------------------------------------------------------------ | -------------- | ---------------------------------------- | -------------------- |
| [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) | `dm`           | داميانو (قاعدة `4340P`، معصمان `4310`)     | جسر Damiao التسلسلي |
| [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/) | `rs`           | RobStride (قاعدة `rs-06`، معصم `rs-00`) | CAN الأصلي           |

يتناول هذا الدليل إعداد العتاد، والمعايرة، والتشغيل عن بُعد، والتسجيل، وذلك للإعدادات ذات الذراع الواحدة والإعدادات ذات الذراعين.

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm"
    width="48%"
  />

_متتبع B601 (يسارًا) وقائد reBot Arm 102 (يمينًا). يتشارك متتبعا DM وRS نفس ترتيب المفاصل والمظهر العام، لكنهما يستخدمان محركات مختلفة. الصور بترتيب من Seeed Studio._

## المعدات والسلامة

اجمع المحركات وصِلها وضبطها باستخدام دليل Seeed Studio الخاص بمتابِعك: [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) أو [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/).

  ثبّت المتبوع على سطح مستقر وأبقِ مساحة عمله خالية من العوائق. ادعم الذراع في أي وقت يُعطَّل فيه العزم أو ينقطع البرنامج، إذ يمكن أن يتحرك تحت تأثير الجاذبية. إذا انقطع مصدر الطاقة أو كابل البيانات أثناء التشغيل، أوقف البرنامج، أعدّ المتبوع والمتبِع إلى موضعيهما الصفرين، ثم أعد التوصيل وأعد التشغيل.

## تثبيت LeRobot 🤗

اتبع [دليل التثبيت](./installation)، ثم ثبّت دعم reBot:

```bash
pip install -e ".[rebot]"
```

يقوم هذا الأمر بتثبيت `motorbridge` للمتابعة و`motorbridge-smart-servo` ليد الروبوت reBot Arm 102.

## اتصال العتاد

يستخدم DM جسر التسلسل الافتراضي بشكل افتراضي ويمكنه اختيارياً استخدام CAN الأصلي. يتطلب RS استخدام CAN الأصلي.

| `can_adapter` | استخدام                                     | منفذ مثال   |
| ------------- | --------------------------------------- | -------------- |
| `damiao`      | جسر Damiao التسلسلي؛ DM فقط           | `/dev/ttyACM0` |
| `socketcan`   | CAN الأصلي في MotorBridge؛ مطلوب لـ RS | `can0`         |

تختار عائلة المحرك المُكيّف الافتراضي. لتشغيل DM عبر CAN الأصلي بدلاً من ذلك، أضف `--robot.can_adapter=socketcan` واستخدم قناة CAN الخاصة به كـ `--robot.port`.

### جسر تسلسلي

استخدم `lerobot-find-port` لتحديد منفذي جسر التسلسل DM والقائد. إذا كانت أسماء الأجهزة صعبة التمييز، فقم بتوصيل جهاز تسلسلي واحد في كل مرة.

```bash
lerobot-find-port
```

  على نظام لينكس، احذف `brltty` (`sudo apt remove brltty`) إذا كان يلتقط جهازًا تسلسليًا. قد تحتاج أيضًا إلى وصول مؤقت باستخدام `sudo chmod 666 /dev/ttyACM* /dev/ttyUSB*`.

### CAN الأصلي

يُحافظ على اسم التهيئة `socketcan` عبر المنصات. يستخدم نظام Linux تقنية SocketCAN. يتطلب نظام macOS محوّل PCAN متوافقًا وبيئة التشغيل MacCAN PCBUSB. دعم CAN الأصلي في نظام Windows تجريبي ويتطلب محوّل PEAK PCAN ومكتبة PCAN-Basic. راجع [إعداد منصة MotorBridge](https://github.com/motorbridge/motorbridge/tree/v0.5.1) لمعرفة تفاصيل التثبيت.

على نظام لينكس، قم بإعداد كل واجهة CAN أصلية بسرعة 1 ميغابت في الثانية قبل توصيل متابع RS:

```bash
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
ip -details link show can0
```

استبدل `can0` بالقناة التي يوفرها نظام CAN الخاص بك. تتطلب الإعدادات الثنائية اليدوية الأصلية لـ CAN قنوات منفصلة مثل `can0` و`can1` لأن كلا الذراعين يستخدمان نفس معرّفات المحركات.

## أنواع الأجهزة

| النوع                     | الجهاز                        |
| ------------------------ | ----------------------------- |
| `rebot_b601_follower`    | متابع واحد               |
| `bi_rebot_b601_follower` | المتتبع ذو اليد             |
| `rebot_102_leader`       | ذراع روبوت واحدة 102 قائد   |
| `bi_rebot_102_leader`    | Bimanual reBot Arm 102 leader |

`motor_family` افتراضيًا هو `dm`. في تكوين ثنائي اليد، لكل ذراع إعداداتها الخاصة `left_arm_config.*` أو `right_arm_config.*` ويمكنها اختيار عائلة المحركات الخاصة بها بشكل مستقل.

## المعايرة

تُضبط المحاور (Calibration) الوضع الفيزيائي الحالي كموضع الصفر للمحرك وتُحفظ ملف معايرة LeRobot. ضع كل ذراع في موضع الصفر الموضح أدناه مع إغلاق الماسك (Gripper) بالكامل، ثم اضغط ENTER عند الطلب.

  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/b601dm_zeroposition.jpg"
    alt="reBot B601 follower arm at its zero position"
    width="48%"
  />
  <img
    src="https://files.seeedstudio.com/wiki/robotics/projects/lerobot/102_zeroposition.jpg"
    alt="reBot Arm 102 leader arm at its zero position"
    width="48%"
  />

_موضع الصفر للمتبّع (يسار) وموضع الصفر للقائد (يمين). يُظهر الشكل المتبّع DM؛ بينما يستخدم المتبّع RS نفس ترتيب المفاصل._

أعد استخدام نفس `--robot.id` و`--teleop.id` في الأوامر اللاحقة حتى يقوم LeRobot بتحميل المعايرة المحفوظة. إذا كانت المعايرة موجودة مسبقًا، يتيح لك الأمر إعادة استخدامها أو إدخال `c` لإعادة المعايرة.

### متابع

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower
```

```bash
lerobot-calibrate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower
```

تُنفَّذ عمليات المعايرة للمتبِع الأيسر ثم للمتبِع الأيمن.

```bash
lerobot-calibrate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1
```

لأتباع RS اثنين، اضبط كلا العائلتين على `rs` واستخدم قنوات CAN أصلية منفصلة للميناءين. تستخدم ملفات معايرة كل ذراع لاحقات `_left` و`_right`.

### القيادي

```bash
lerobot-calibrate \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-calibrate \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## التشغيل عن بُعد

ابدأ بحركات صغيرة وتحقق من اتجاه كل مفصل قبل استخدام مساحة العمل الكاملة.

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=rs \
    --robot.port=can0 \
    --robot.id=follower \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader
```

```bash
lerobot-teleoperate \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1
```

## تسجيل مجموعة بيانات

اختبر التشغيل عن بُعد قبل التسجيل. لإضافة كاميرا، حدّدها أولاً باستخدام:

```bash
lerobot-find-cameras opencv
```

### ذراع واحد

يسجّل هذا المثال خمس حلقات DM محليًا باستخدام كاميرا OpenCV واحدة:

```bash
lerobot-record \
    --robot.type=rebot_b601_follower \
    --robot.motor_family=dm \
    --robot.port=/dev/ttyACM0 \
    --robot.id=follower \
    --robot.cameras='{"front": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=rebot_102_leader \
    --teleop.port=/dev/ttyUSB0 \
    --teleop.id=leader \
    --dataset.repo_id=your_username/rebot-dm-test \
    --dataset.single_task="Pick up the object" \
    --dataset.num_episodes=5 \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=true
```

بالنسبة إلى RS، غيّر `motor_family` إلى `rs` ومنفذ الروبوت إلى قناة CAN الأصلية. احذف معامل الكاميرا لاختبار المحرك فقط.

### اليدوي

يسجّل هذا المثال الخاص بـ DM كاميرا علوية مشتركة وكاميرا معصم واحدة لكل ذراع. مفاتيح الكاميرات في مجموعة البيانات هي `top` و`left_wrist` و`right_wrist`.

```bash
lerobot-record \
    --robot.type=bi_rebot_b601_follower \
    --robot.id=bi_follower \
    --robot.left_arm_config.motor_family=dm \
    --robot.left_arm_config.port=/dev/ttyACM0 \
    --robot.right_arm_config.motor_family=dm \
    --robot.right_arm_config.port=/dev/ttyACM1 \
    --robot.cameras='{
      top: {
        type: opencv,
        index_or_path: "/dev/video2",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.left_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video0",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --robot.right_arm_config.cameras='{
      wrist: {
        type: opencv,
        index_or_path: "/dev/video4",
        width: 640,
        height: 480,
        fps: 30,
        fourcc: "MJPG"
      }
    }' \
    --teleop.type=bi_rebot_102_leader \
    --teleop.id=bi_leader \
    --teleop.left_arm_config.port=/dev/ttyUSB0 \
    --teleop.right_arm_config.port=/dev/ttyUSB1 \
    --dataset.repo_id=local/rebot-bimanual-dm-camera-test \
    --dataset.root=/tmp/rebot-bimanual-dm-camera-test \
    --dataset.single_task="Test coordinated movement of both reBot DM arms" \
    --dataset.fps=30 \
    --dataset.num_episodes=2 \
    --dataset.episode_time_s=20 \
    --dataset.reset_time_s=10 \
    --dataset.push_to_hub=false \
    --display_data=false
```

> [!TIP]
> لإعداد ثنائي اليد من نوع RS، اضبط كلا عائلتي المحركات على `rs` واستخدم قنوات CAN أصلية منفصلة. يمكن لإعداد مختلط اختيار `dm` ليد واحدة و`rs` لليد الأخرى.

راجع [التعلّم بالتقليد للروبوتات](./il_robots) لرفع البيانات وإعادة تشغيلها وتدريب سياسة وتقييمها.

## التحكم المتقدم

تُعرّض كلتا النسختين نفس أسماء المفاصل والمواضع العامة بالدرجات. يطبّق LeRobot إشارات اتجاه المحرك الخاصة بكل عائلة على الإجراءات والملاحظات، لذا لا حاجة إلى سياسات التشغيل عن بُعد لتحويل إشارات المحرك.

- يستخدم DM التحكم MIT للذراع و`force_pos` للمقبض افتراضياً. القيمة الافتراضية لـ`gripper_torque_ratio` هي `0.07`؛ كما يدعم DM أيضاً `--robot.control_mode=pos_vel`.
- يستخدم RS التحكم MIT ومقبض عزم مقاوم محدود القوة لأن MotorBridge لا يوفر `force_pos` لـ RobStride. اعتمادًا على حركة المقبض المقاسة، يُحدَّد العزم المُمرَّر بحد أقصى `3.5` نيوتن·متر أثناء الحركة أو `1.0` نيوتن·متر أثناء الإمساك. إذا فشل التغذية الراجعة، يحاول LeRobot تمرير عزم صفر للمقبض ثم يعطّل الذراع.
- `mit_kp` و`mit_kd` و`pos_vel_velocity` تقبل قيمة عددية واحدة لكل مفصل أو تخطيطًا مفاتيحيًا للمفاصل.
- `max_relative_target` يحدد الحد الأقصى للفارق بين الأمر والموقع المقاس الأخير. على سبيل المثال، `--robot.max_relative_target=5.0` يقيّد كل مفصل مُصدر أمر له بتغيير قدره خمس درجات.
- `joint_limits` يتجاوز افتراضات العائلة اختيارياً في درجات المفاصل العامة.

تُختار اتجاهات محرك المتبوع داخلياً من عائلة المحرك. وتبقى `joint_directions` الخاصة بالمتصدر قابلة للتهيئة إذا تحرك مفصل التشغيل عن بُعد في الاتجاه الخاطئ.

  تستخدم DM و RS نفس اتفاقية الإحداثيات، لكن هندستهما وكسبهما وديناميكياتهما تختلف. تحقق من السياسات ومجموعات البيانات قبل نقلها بين الإصدارات.

## استكشاف الأخطاء وإصلاحها

| المشكلة                                  | تحقق                                                                                                       |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| الجهاز التسلسلي مفقود أو مشغول         | أعد توصيل جهاز واحد في كل مرة، وأعد تشغيل `lerobot-find-port`، وتحقق من الصلاحيات، وأزل `brltty` على نظام Linux. |
| لا يمكن لـ CAN الأصلي الاتصال                | تحقق من وقت تشغيل المحوّل، واسم القناة، ومعدل البت 1 ميغابت في الثانية، وقوة المحرك، وتوصيلات CAN، والإنهاء.          |
| يتحرك مفصل مُدار عن بُعد في الاتجاه الخاطئ | أوقف البرنامج، وتأكد من `motor_family`، وتحقق من `joint_directions` للقائد.                        |
| لا يتم إعادة استخدام المعايرة                | استخدم `id` نفسه للروبوت أو المشغّل عن بُعد الذي تم استخدامه أثناء المعايرة.                                   |

بالنسبة للتجميع والتوصيل وتشخيصات الأجهزة المحددة، راجد أدلة Seeed Studio الخاصة بـ [B601-DM](https://wiki.seeedstudio.com/rebot_arm_b601_dm_lerobot/) و [B601-RS](https://wiki.seeedstudio.com/rebot_arm_b601_rs_lerobot/).

