# OpenArm

[OpenArm](https://openarm.dev) هي ذراع إنسانية مفتوحة المصدر ذات سبع درجات حرية، مصممة لأبحاث ونشر الذكاء الاصطناعي المادي.

للحصول على OpenArm، سواءً كانت مجمّعة أو مبنية يدوياً، والانضمام إلى المجتمع العالمي، تصفّح المصنّعين المعتمدين والموثوقين حول العالم على [openarm.dev](https://openarm.dev).

## ما الذي يميزه؟

- **التصميم بمقياس بشري**: صُمم OpenArm بنسب تشبه الإنسان، مُصغَّرًا ليناسب شخصًا طوله حوالي 160-165 سم. وهذا يوفر توازنًا مثاليًا بين مدى عملي وإعجاز قابل للإدارة، لضمان تشغيل آمن وسريع الاستجابة.

- **بنية تضع السلامة في المقام الأول**: صُمم OpenArm بمحركات قابلة للتشغيل العكسي من نوع QDD وبمرونة عالية، مما يجعله يولي الأولوية للتفاعل الآمن بين الإنسان والروبوت مع الحفاظ على قدرات حمل عملية (6.0 كجم ذروة / 4.1 كجم اسمي) للقيام بمهام حقيقية.

- **مصمَّم ليدوم**: تُستخدم في المكونات الهيكلية الحرجة مواد من الألومنيوم والفولاذ المقاوم للصدأ، مما يضمن أداءً متينًا لجمع البيانات المتكرر والاستخدام المستمر في البحث.

- **قابلة للوصول والبناء بالكامل**: كل مكوّن، من الأجزاء المصنوعة بتقنية CNC والأغلفة المطبوعة بتقنية الطباعة ثلاثية الأبعاد إلى الأسلاك الكهربائية، مصمّم ليكون قابلاً للشراء والبناء من قبل الباحثين الأفراد والمختبرات، مع توفير بيانات التصنيع الكاملة.

- **عملي وبأسعار معقولة**: مقابل 6500 دولار أمريكي لنظام ثنائي اليد كامل، يوفر OpenArm قدرات بمستوى البحث العلمي بتكلفة أقل بكثير من تكلفة روبوتات humanoid التقليدية.

## متطلبات المنصة

  **لنكس فقط**: يعمل OpenArm حاليًا على نظام لينكس فقط. لا يتوفر سائق لنظام macOS لمحوّل USB الخاص بباص CAN، كما لم يُختبر على نظام ويندوز.

## دليل السلامة

قبل تشغيل OpenArm، يرجى قراءة [دليل السلامة الرسمي](https://docs.openarm.dev/getting-started/safety-guide). النقاط الرئيسية:

- **تثبيت آمن**: ثبّت الذراع على سطح مستوٍ وثابت باستخدام براغي أو مشابك
- **المسافة الآمنة**: إبقاء أجزاء الجسم والأجسام خارج نطاق الحركة أثناء التشغيل
- **معدات الحماية**: ارتدِ دائمًا نظارات السلامة؛ واستخدم معدات الحماية الشخصية الإضافية عند الحاجة
- **حدود الحمولة**: لا تتجاوز حدود الحمولة المحددة (6.0 كجم ذروة / 4.1 كجم اسمي لكل ذراع)
- **التوقف الطارئ**: معرفة موقع جهاز التوقف الطارئ وطريقة تشغيله
- **الفحص الدوري**: تحقق من براغي مفكوكة، حدود ميكانيكية تالفة، أصوات غير طبيعية، وأضرار في الأسلاك

## إعداد العتاد

اتبع [وثائق OpenArm المادية الرسمية](https://docs.openarm.dev) من أجل:

- قائمة المواد والمصادر
- تعليمات الطباعة ثلاثية الأبعاد
- التجميع الميكانيكي
- التوصيلات الكهربائية

تتوفر مستودعات العتاد على [github.com/enactic/openarm](https://github.com/enactic/openarm).

## إعداد حافلة CAN

OpenArm uses CAN bus communication with Damiao motors. Once you have the CAN bus USB adapter plugged into your Linux PC, follow the [Damiao Motors and CAN Bus guide](./damiao) to configure the interface.

الإعداد السريع:

```bash
# Setup CAN interfaces
lerobot-setup-can --mode=setup --interfaces=can0,can1

# Test motor communication
lerobot-setup-can --mode=test --interfaces=can0,can1
```

## تثبيت LeRobot 🤗

اتبع [دليل التثبيت](./installation)، ثم ثبّت دعم محرك Damiao:

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

## الاستخدام

### ذراع المتابعة (روبوت)

```bash
lerobot-calibrate \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower
```

```python
from lerobot.robots.openarm_follower import OpenArmFollower, OpenArmFollowerConfig

config = OpenArmFollowerConfig(
    port="can0",
    side="right",  # or "left" for left arm
    id="my_openarm_follower",
)

follower = OpenArmFollower(config)
follower.connect()

# Read current state
obs = follower.get_observation()
print(obs)

# Send action (position in degrees)
action = {
    "joint_1.pos": 0.0,
    "joint_2.pos": 0.0,
    "joint_3.pos": 0.0,
    "joint_4.pos": 45.0,
    "joint_5.pos": 0.0,
    "joint_6.pos": 0.0,
    "joint_7.pos": 0.0,
    "gripper.pos": 0.0,
}
follower.send_action(action)

follower.disconnect()
```

### ذراع القائد (مشغّل عن بُعد)

تُستخدم الذراع القائدة للتشغيل عن بُعد - أي تحريكها يدويًا للتحكم في الذراع المتتبعة.

```bash
lerobot-calibrate \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader
```

```python
from lerobot.teleoperators.openarm_leader import OpenArmLeader, OpenArmLeaderConfig

config = OpenArmLeaderConfig(
    port="can1",
    id="my_openarm_leader",
    manual_control=True,  # Disable torque for manual movement
)

leader = OpenArmLeader(config)
leader.connect()

# Read current position (as action to send to follower)
action = leader.get_action()
print(action)

leader.disconnect()
```

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

للتحكم في OpenArm عن بُعد باستخدام التحكم بالمتزعم والمتبوع:

```bash
lerobot-teleoperate \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader
```

استخدم نفس `--robot.id` و`--teleop.id` كما في مرحلة المعايرة، حتى يجد LeRobot ملفات المعايرة.

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

للتحكم عن بُعد في إعداد OpenArm ثنائي الذراع باستخدام ذراعين قائدتين وذراعين تابعتين:

```bash
lerobot-teleoperate \
    --robot.type=bi_openarm_follower \
    --robot.left_arm_config.port=can0 \
    --robot.left_arm_config.side=left \
    --robot.right_arm_config.port=can1 \
    --robot.right_arm_config.side=right \
    --robot.id=my_bimanual_follower \
    --teleop.type=bi_openarm_leader \
    --teleop.left_arm_config.port=can2 \
    --teleop.right_arm_config.port=can3 \
    --teleop.id=my_bimanual_leader
```

### تسجيل البيانات

لتسجيل مجموعة بيانات أثناء التشغيل عن بُعد:

```bash
lerobot-record \
    --robot.type=openarm_follower \
    --robot.port=can0 \
    --robot.side=right \
    --robot.id=my_openarm_follower \
    --teleop.type=openarm_leader \
    --teleop.port=can1 \
    --teleop.id=my_openarm_leader \
    --dataset.repo_id=${HF_USER}/my_openarm_dataset \
    --dataset.single_task="Describe your task here" \
    --dataset.fps=30 \
    --dataset.num_episodes=10
```

`lerobot-record` يضيف تاريخ الجلسة ووقتها إلى اسم مجموعة البيانات، لذا تُحفظ باسم `my_hf_username/my_openarm_dataset_YYYYMMDD_HHMMSS`. راجع [دليل التسجيل](./il_robots#record-a-dataset) للكاميرات والتحكم بلوحة المفاتيح وباقي سير العمل.

## خيارات التهيئة

### إعدادات المتابع

| معامل             | افتراضي   | الوصف                                                |
| --------------------- | --------- | ---------------------------------------------------------- |
| `port`                | -         | واجهة CAN (مثل `can0`)                               |
| `side`                | `None`    | الجهة: `"left"`، `"right"`، أو `None` للحدود المخصصة |
| `use_can_fd`          | `True`    | تفعيل CAN FD لمعدلات بيانات أعلى                        |
| `can_bitrate`         | `1000000` | معدل البت الاسمي (1 ميغابت في الثانية)                                   |
| `can_data_bitrate`    | `5000000` | معدل بيانات CAN FD (5 ميغابت/ثانية)                               |
| `max_relative_target` | `None`    | حد الأمان للمواقع النسبية للأهداف                 |
| `position_kp`         | لكل مفصل | كسب التناسب للتحكم في الموضع                        |
| `position_kd`         | لكل مفصل | مكاسب مشتقة التحكم في الموضع                          |

### إعدادات القائد

| معامل          | افتراضي   | الوصف                         |
| ------------------ | --------- | ----------------------------------- |
| `port`             | -         | واجهة CAN (مثل `can1`)        |
| `manual_control`   | `True`    | تعطيل العزم للحركة اليدوية  |
| `use_can_fd`       | `True`    | تفعيل CAN FD لمعدلات بيانات أعلى |
| `can_bitrate`      | `1000000` | معدل البت الاسمي (1 ميغابت في الثانية)            |
| `can_data_bitrate` | `5000000` | معدل بيانات CAN FD (5 ميغابت/ثانية)        |

## إعداد المحرك

يستخدم OpenArm محركات Damiao مع الإعداد الافتراضي التالي:

| مفصلي                       | نوع المحرك | إرسال المعرّف | معرف الاستلام |
| --------------------------- | ---------- | ------- | ------- |
| joint_1 (تدوير الكتف)      | DM8009     | 0x01    | 0x11    |
| joint_2 (رفع الكتف)     | DM8009     | 0x02    | 0x12    |
| joint_3 (دوران الكتف) | DM4340     | 0x03    | 0x13    |
| joint_4 (ثني المرفق)        | DM4340     | 0x04    | 0x14    |
| joint_5 (دوران المعصم)        | DM4310     | 0x05    | 0x15    |
| joint_6 (انحناء المعصم)       | DM4310     | 0x06    | 0x16    |
| joint_7 (دوران المعصم)    | DM4310     | 0x07    | 0x17    |
| gripper                     | DM4310     | 0x08    | 0x18    |

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

### لا توجد استجابة من المحركات

1. تحقق من توصيلات مصدر الطاقة
2. Verify CAN wiring (CAN-H, CAN-L, GND)
3. تشغيل التشخيصات: `lerobot-setup-can --mode=test --interfaces=can0`
4. راجع [دليل استكشاف أخطاء Damiao](./damiao#troubleshooting) لمزيد من التفاصيل

### لم يتم العثور على واجهة CAN

تأكد من إعداد واجهة CAN:

```bash
ip link show can0
```

## الموارد

- [موقع OpenArm](https://openarm.dev)
- [وثائق OpenArm](https://docs.openarm.dev)
- [مستودع OpenArm على GitHub](https://github.com/enactic/openarm)
- [دليل السلامة](https://docs.openarm.dev/getting-started/safety-guide)
- [سيارات داميانو وخط CAN](./damiao)

