إعداد البرامج

تثبيت LeRobot، وتكوين الروبوت SO-101، ومعايرة المؤازرة، وإعداد teleop بين القائد والتابع، وPython API، واستكشاف الأخطاء وإصلاحها. كل شيء بدءًا من تثبيت Python الجديد وحتى الذراع الجارية.

انتقل إلى القسم:

الخطوة 1 – تثبيت LeRobot

تركيب ليروبوت

LeRobot هي حزمة البرامج الوحيدة التي تحتاجها لـ SO-101. إنه يتعامل مع الاتصالات المؤازرة والمعايرة والتقريب وتسجيل البيانات.

إنشاء بيئة افتراضية

python -m venv ~/.venvs/so101
source ~/.venvs/so101/bin/activate   # Windows: .venvs\so101\Scripts\activate

تثبيت ليروبوت

pip install lerobot

التحقق من التثبيت

python -c "import lerobot; print(lerobot.__version__)"

التثبيت من المصدر (اختياري — للحصول على أحدث الميزات)

git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[so101]"
الخطوة 2 - تكوين الروبوت

تكوين الروبوت SO-101

يشتمل LeRobot على تكوين روبوت SO-101 مدمج. يمكنك تحديد منفذ USB للذراع التابع (والذراع القائد في حالة استخدام teleop ثنائي الذراع).

ابحث عن منفذ USB الخاص بك

# Linux / macOS
ls /dev/ttyUSB*    # typical: /dev/ttyUSB0, /dev/ttyUSB1
ls /dev/tty.usbserial*   # macOS alternative

# Windows — check Device Manager → Ports → COMx

تكوين SO-101 YAML

يستخدم LeRobot تكوينًا مضمّنًا في سطر الأوامر أو ملف YAML. لإعداد ذراع واحدة:

# ~/.lerobot/robots/so101_follower.yaml
robot_type: so101
port: /dev/ttyUSB0   # update to your port
cameras:
  wrist_cam:
    type: opencv
    index_or_path: 0
    fps: 30
    width: 640
    height: 480

تكوين ثنائي الذراع (القائد – التابع).

# ~/.lerobot/robots/so101_bimanual.yaml
robot_type: so101
port: /dev/ttyUSB1      # follower arm
leader_arms:
  main:
    type: so101
    port: /dev/ttyUSB0   # leader arm
cameras:
  top_cam:
    type: opencv
    index_or_path: 0
    fps: 30
    width: 640
    height: 480

اتصال الاختبار

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=none   # just connects and reads state

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

الخطوة 3 – معايرة المؤازرة

معايرة المؤازرة

على عكس أذرع CAN-bus التي تستخدم أجهزة التشفير المطلقة، تحتاج ماكينات Feetech STS3215 إلى المعايرة لتحديد مواضعها الصفرية. يتعامل LeRobot مع هذا تلقائيًا.

تشغيل المعايرة

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate

سيطالبك البرنامج النصي بتحريك الذراع إلى مواضع محددة (الصفحة الرئيسية، الحد الأدنى، الحد الأقصى لكل مفصل) ثم اضغط على Enter في كل موضع. يقوم بحفظ بيانات المعايرة ل ~/.cache/huggingface/lerobot/calibration/so101/.

مواقف المعايرة

سيطلب منك LeRobot وضع كل مفصل في ثلاث أوضاع:

  • موقف المنزل: الذراع ممتدة بالكامل، والمؤثر النهائي يشير إلى الأمام
  • موقف عزم الدوران صفر: الذراع معلقة بشكل طبيعي تحت الجاذبية
  • مرجع 90 درجة: كل مفصل عند نقطة المنتصف

التحقق من المعايرة

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate   # move arm by hand to verify joint readout

حرك الذراع يدوياً (وضع الإمتثال). يجب أن تكون قراءة مواضع المفاصل قريبة من الصفر في المنزل وتزيد/تنقص بسلاسة أثناء تحريك كل مفصل.

نصيحة إعادة المعايرة: قم بإجراء المعايرة مرة أخرى في أي وقت تقوم فيه بتفكيك مفصل، أو استبدال جهاز مؤازر، أو تجد أن مواضع المفصل تنحرف. يتم تخزين ملفات المعايرة برقم تسلسلي لكل ذراع وإعادة تحميلها تلقائيًا.

الخطوة 4 - Teleop القائد – التابع

القائد - التابع للعملية عن بعد

تم تصميم SO-101 للعمل عن بعد بين القائد والتابع: ذراع واحدة (القائد) تلتقط حركات يدك، والذراع الثاني (التابع) يعكسها في الوقت الفعلي. وهذا ينتج عروضًا تدريبية بأعلى جودة.

بدء teleop القائد - التابع

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB1 \
  --robot.leader_arms.main.type=so101 \
  --robot.leader_arms.main.port=/dev/ttyUSB0 \
  --control.type=teleoperate

لوحة مفاتيح بذراع واحدة (لا يوجد ذراع ثانٍ)

إذا كان لديك ذراع واحدة فقط، فاستخدم وضع التحكم بلوحة المفاتيح:

python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=teleoperate \
  --control.teleop_keys=true

وضع تعويض الامتثال / الجاذبية

ضع الذراع القائد في وضع عزم الدوران المنخفض حتى تتمكن من تحريكه بحرية بيدك:

python -c "
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port='/dev/ttyUSB0')
robot.connect()
robot.set_compliance_mode(True)   # arm moves freely under hand guidance
"
الخطوة 5 - واجهة برمجة تطبيقات بايثون

بداية سريعة لواجهة برمجة تطبيقات بايثون

يمكنك التحكم في SO-101 مباشرة عبر LeRobot robot API بدون البرامج النصية لـ CLI.

السيطرة المشتركة الأساسية

from lerobot.common.robot_devices.robots.so101 import SO101Robot
import torch

robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()

# Read current joint positions (6 DOF)
obs = robot.capture_observation()
print("Joint positions:", obs["observation.state"])

# Send joint position command (in degrees, normalized to [-1, 1] range)
action = torch.zeros(6)   # all joints to zero position
robot.send_action(action)

robot.disconnect()

تعويض الجاذبية (وضع القيادة الخلفية)

from lerobot.common.robot_devices.robots.so101 import SO101Robot

robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()

# Enable backdrive — arm can be moved freely by hand
robot.set_compliance_mode(True)

import time
for _ in range(100):
    obs = robot.capture_observation()
    print(obs["observation.state"])   # prints live joint positions as you move arm
    time.sleep(0.02)

robot.disconnect()

قراءة حالة المؤازرة

from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus

bus = FeetechMotorsBus(port="/dev/ttyUSB0",
                       motors={"joint1": (1, "sts3215"),
                               "joint2": (2, "sts3215"),
                               "joint3": (3, "sts3215"),
                               "joint4": (4, "sts3215"),
                               "joint5": (5, "sts3215"),
                               "gripper": (6, "sts3215")})
bus.connect()
positions = bus.read("Present_Position", ["joint1", "joint2", "joint3"])
print("Positions:", positions)
bus.disconnect()
استكشاف الأخطاء وإصلاحها

أعلى 3 قضايا مشتركة

خطأ 1 لم يتم العثور على المنفذ التسلسلي: FileNotFoundError: /dev/ttyUSB0

لم يتم الكشف عن وحدة تحكم مضاعفات USB. عادةً ما يكون برنامج التشغيل المفقود أو الكابل غير موصول.

يصلح:

# Check if the device is listed
ls /dev/ttyUSB*   # Linux
ls /dev/tty.usbserial*   # macOS

# Linux: add yourself to the dialout group (requires logout)
sudo usermod -aG dialout $USER

# Windows: install CP2102 or CH340 USB driver,
# then check Device Manager for COM port number
خطأ 2 الخوادم لا تستجيب بعد الاتصال

الماكينات متصلة فعليًا ولكن LeRobot لا يمكنه قراءة مواقعها. عادةً ما تكون مشكلة في الطاقة أو معدل باود خاطئ.

يصلح:

# 1. Verify 5V power supply is connected and LED on servo board is on
# 2. Check all servo daisy-chain cables are fully seated
# 3. Try scanning for servos directly:
python -c "
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus('/dev/ttyUSB0', motors={})
bus.connect()
ids = bus.find_motor_ids()
print('Found motor IDs:', ids)
bus.disconnect()
"
خطأ 3 لم يتم العثور على بيانات المعايرة في التشغيل التالي

يحفظ LeRobot المعايرة لكل رقم تسلسلي للذراع. إذا لم يتمكن من العثور على ملف المعايرة، فسيتم تحذيره واستخدام قيم التشفير الأولية.

يصلح:

# Check calibration file location
ls ~/.cache/huggingface/lerobot/calibration/so101/

# Re-run calibration if the file is missing
python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --control.type=calibrate

# Pass explicit calibration path if needed
python -m lerobot.scripts.control_robot \
  --robot.type=so101 \
  --robot.port=/dev/ttyUSB0 \
  --robot.calibration_dir=/path/to/calibration \
  --control.type=teleoperate

لا تزال عالقة؟ اسأل على منتدى SO-101 أو التحقق من مشكلات LeRobot GitHub.

عمل البرمجيات؟ ابدأ بجمع البيانات.

بمجرد تحريك الذراع، فإن الخطوة التالية هي تسجيل أول مجموعة بيانات LeRobot.