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

تثبيت البرنامج المساعد، وتكوين ذراع القائد/التابع، والتحكم اليدوي في ROS2، وتكامل LeRobot DK1، وPython API، واستكشاف الأخطاء وإصلاحها. من تثبيت Ubuntu جديد إلى نظام يدوي متحرك.

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

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

تثبيت SDK

يتم توزيع DK1 SDK كمكون إضافي لـ LeRobot عبر trlc-dk1 مستودع. يسجل أربعة أنواع من الأجهزة: dk1_leader, dk1_follower, bi_dk1_leader، و bi_dk1_follower.

قم بتثبيت LeRobot أولاً

pip install lerobot

استنساخ وتثبيت البرنامج المساعد DK1

git clone https://github.com/TRLC-AI/trlc-dk1.git
cd trlc-dk1
uv pip install -e .

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

python3 -c "from lerobot.common.robots import make_robot; print('DK1 plugin OK')"

# Check that DK1 device types are registered
python3 -c "
from lerobot.common.robots.factory import get_robot_types
types = get_robot_types()
for t in types:
    if 'dk1' in t:
        print(t)
"

يجب أن ترى dk1_leader, dk1_follower, bi_dk1_leader, bi_dk1_follower مطبوعة. إذا لم يكن الأمر كذلك، تأكد من تثبيت البرنامج المساعد بشكل صحيح مع uv pip show trlc-dk1.

التثبيت من التزام محدد (لقابلية التكرار)

cd trlc-dk1
git checkout v0.3.0
uv pip install -e .
الخطوة 2 – تكوين القائد/التابع

تكوين ذراع القائد/التابع

يعتمد نظام DK1 ثنائي اليد على تخصيص المنفذ لتمييز الذراع القائد (Dynamixel XL330) عن الذراع التابع (DM4340 + DM4310). تعد تعيينات المنافذ غير الصحيحة هي خطأ الإعداد الأكثر شيوعًا.

كشف منافذ USB التسلسلية

قم بتشغيل الأداة المساعدة لاكتشاف منفذ LeRobot مع توصيل ذراع واحدة في كل مرة:

# Connect ONLY the leader arm (Dynamixel XL330)
python -m lerobot.scripts.find_motors_bus_port
# Note the reported port, e.g. /dev/ttyACM0

# Disconnect leader, connect ONLY the follower arm (DM series)
python -m lerobot.scripts.find_motors_bus_port
# Note the reported port, e.g. /dev/ttyACM1

قم بإنشاء تكوين الروبوت الثنائي

قم بإنشاء ملف تكوين YAML للزوج الثنائي. يستخدم LeRobot هذا لتوجيه الأوامر إلى الذراع الصحيحة:

# ~/.lerobot/robots/dk1_bimanual.yaml
robot_type: bi_dk1_follower
leader_arms:
  left:
    port: /dev/ttyACM0
    motors: [shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper_left, gripper_right]
follower_arms:
  left:
    port: /dev/ttyACM1
    motors: [shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper_left, gripper_right]
cameras:
  wrist_left:
    type: opencv
    index: 0
    fps: 30
    width: 640
    height: 480
  overhead:
    type: opencv
    index: 2
    fps: 30
    width: 640
    height: 480

التحقق من التكوين

python -m lerobot.scripts.control_robot \
  --robot.type=bi_dk1_follower \
  --robot.config=~/.lerobot/robots/dk1_bimanual.yaml \
  --control.type=none

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

استمرارية المنفذ: يمكن أن تتغير منافذ USB التسلسلية بين عمليات إعادة التشغيل. استخدم قواعد udev لربط منفذ بذراع معين بواسطة الرقم التسلسلي USB. انظر دليل الإعداد لقالب قاعدة udev.

الخطوة 3 - إعداد ROS2 ثنائيًا

التحكم اليدوي ROS2

يوفر ROS2 Humble طبقة تحكم عالية المستوى لـ DK1 مع دعم التخطيط اليدوي الكامل لـ MoveIt2. يعد هذا أمرًا اختياريًا لعمليات سير عمل جمع البيانات الخاصة بـ LeRobot فقط.

قم بتثبيت حزم ROS2 المتواضعة والثنائية

sudo apt update && sudo apt install ros-humble-desktop \
  ros-humble-ros2-control ros-humble-ros2-controllers \
  ros-humble-moveit ros-humble-joint-state-publisher-gui -y

استنساخ وبناء حزمة DK1 ROS2

mkdir -p ~/dk1_ws/src && cd ~/dk1_ws/src
git clone https://github.com/TRLC-AI/trlc-dk1-ros2.git
cd ~/dk1_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install

إطلاق في الوضع الثنائي

source ~/dk1_ws/install/setup.bash

# Launch both arms (use_fake_hardware for testing without hardware)
ros2 launch trlc_dk1_ros2 dk1_bimanual.launch.py \
  use_fake_hardware:=false \
  leader_port:=/dev/ttyACM0 \
  follower_port:=/dev/ttyACM1

الاختبار باستخدام أجهزة مزيفة (لا حاجة للأسلحة)

ros2 launch trlc_dk1_ros2 dk1_bimanual.launch.py \
  use_fake_hardware:=true

إرسال مسار ثنائي

ros2 topic pub /follower_left/joint_trajectory_controller/joint_trajectory \
  trajectory_msgs/msg/JointTrajectory \
  '{joint_names: ["shoulder_pan"], points: [{positions: [0.3], time_from_start: {sec: 2}}]}'
الخطوة 4 – تكوين LeRobot DK1

تكوين ليروبوت DK1

يتعامل LeRobot مع المكون الإضافي DK1 مع تسجيل التشغيل عن بعد ثنائيًا يدويًا بشكل أصلي. ال bi_dk1_follower يسجل نوع الجهاز من كلا الذراعين وجميع الكاميرات في وقت واحد.

معايرة كلا الذراعين

# Calibrate the leader arm
python -m lerobot.scripts.control_robot \
  --robot.type=dk1_leader \
  --robot.port=/dev/ttyACM0 \
  --control.type=calibrate

# Calibrate the follower arm
python -m lerobot.scripts.control_robot \
  --robot.type=dk1_follower \
  --robot.port=/dev/ttyACM1 \
  --control.type=calibrate

بدء التشغيل عن بعد بكلتا اليدين

python -m lerobot.scripts.control_robot \
  --robot.type=bi_dk1_follower \
  --robot.config=~/.lerobot/robots/dk1_bimanual.yaml \
  --control.type=teleoperate

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

python -m lerobot.scripts.control_robot \
  --robot.type=bi_dk1_follower \
  --robot.config=~/.lerobot/robots/dk1_bimanual.yaml \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=your-username/dk1-bimanual-pick-place-v1 \
  --control.num_episodes=50 \
  --control.single_task="Bimanual: pick up the block with left arm, transfer to right arm" \
  --control.warmup_time_s=5 \
  --control.reset_time_s=10

ادفع إلى HuggingFace Hub

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/dk1-bimanual-pick-place-v1
الخطوة 5 - واجهة برمجة تطبيقات بايثون

واجهة برمجة تطبيقات Python للتحكم اليدوي

توفر DK1 Python API وصولاً مباشرًا إلى كلا الذراعين عبر التسلسل. لا يلزم وجود ROS2 للتحكم الأساسي وتسجيل البيانات.

ربط كلا الذراعين

from trlc_dk1 import DK1Leader, DK1Follower, BimanualDK1

# Connect individually
leader = DK1Leader(port="/dev/ttyACM0")
follower = DK1Follower(port="/dev/ttyACM1")
leader.connect()
follower.connect()

# Or use the bimanual controller (recommended)
robot = BimanualDK1(
    leader_port="/dev/ttyACM0",
    follower_port="/dev/ttyACM1"
)
robot.connect()

قراءة الدول المشتركة من كلا الذراعين

import time
from trlc_dk1 import BimanualDK1

robot = BimanualDK1(leader_port="/dev/ttyACM0", follower_port="/dev/ttyACM1")
robot.connect()

for _ in range(100):
    leader_state = robot.get_leader_state()
    follower_state = robot.get_follower_state()
    print(f"Leader:   {leader_state.positions}")
    print(f"Follower: {follower_state.positions}")
    time.sleep(0.033)  # 30 Hz

robot.disconnect()

قم بتشغيل حلقة القائد والتابع يدويًا

from trlc_dk1 import BimanualDK1
import time

robot = BimanualDK1(leader_port="/dev/ttyACM0", follower_port="/dev/ttyACM1")
robot.connect()
robot.enable_follower()

try:
    while True:
        leader_state = robot.get_leader_state()
        # Apply leader positions to follower (scaled if needed)
        robot.set_follower_positions(leader_state.positions)
        time.sleep(0.01)  # 100 Hz control loop
finally:
    robot.disable_follower()
    robot.disconnect()
اختياري – محاكاة

دعم المحاكاة

يدعم DK1 المحاكاة اليدوية MuJoCo بنموذج مُعاير يعكس حركيات الأجهزة الحقيقية. تدريب السياسات في المحاكاة قبل نشرها على الأجهزة.

محاكاة MuJoCo ثنائية اليد

pip install mujoco
git clone https://github.com/TRLC-AI/trlc-dk1-mujoco.git
cd trlc-dk1-mujoco

# Run the bimanual simulation with leader/follower
python examples/bimanual_sim.py

# Run with keyboard teleop
python examples/bimanual_sim.py --teleop keyboard

تدريب سياسة ضد بيئة MuJoCo

python -m lerobot.scripts.train \
  --policy.type=act \
  --env.type=dk1_bimanual_sim \
  --policy.chunk_size=100 \
  --training.num_epochs=5000 \
  --output_dir=outputs/dk1-act-sim

محاذاة Sim-to-Real: يستخدم نموذج DK1 MuJoCo هندسة الملف TRLC-DK1-Follower_v0.3.0 STEP ومنحنيات عزم دوران المحرك DM4340/DM4310 المُقاسة. سياسات تم تدريبها على نقل شرائح sim إلى أجهزة حقيقية مع الحد الأدنى من الضبط لمهام الاختيار والمكان المنظمة.

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

أهم 3 مشكلات خاصة بكلتا اليدين

خطأ 1 الأذرع المخصصة لنفس المنفذ - التابع يعكس القائد ولكنه يتأخر بشدة

كلا الذراعين متصلتين بنفس الشيء /dev/ttyACM* تم تبديل تعيينات المنفذ أو المنفذ. يستخدم الذراع القائد (Dynamixel XL330) والذراع التابع (سلسلة DM) بروتوكولات مختلفة؛ يؤدي التعيين الخاطئ إلى فشل التحكم الفوري.

يصلح:

# 1. Unplug both arms
# 2. Connect ONLY the leader arm (XL330 servos)
python -m lerobot.scripts.find_motors_bus_port
# Note: leader_port = /dev/ttyACM?

# 3. Disconnect leader, connect ONLY the follower arm (DM servos)
python -m lerobot.scripts.find_motors_bus_port
# Note: follower_port = /dev/ttyACM?

# 4. Update your YAML config with the correct ports
# 5. Create udev rules to make assignments permanent
خطأ 2 يتأرجح ذراع التابع أو يتجاوز حدوده أثناء التشغيل عن بعد

تعتبر مكاسب PD للذراع التابع مرتفعة جدًا بالنسبة للحمولة الصافية أو تكوين الذراع الحالي. يعد هذا أمرًا شائعًا بشكل خاص عندما يتم تحميل الأذرع بمؤثرات نهائية أو عند التشغيل بكامل امتدادها.

يصلح:

# Reduce follower PD gains in the DK1 config
# Edit trlc-dk1/configs/follower_gains.yaml:
joint_gains:
  default:
    kp: 30   # reduce from default 50
    kd: 0.5  # reduce from default 1.0
  wrist:
    kp: 15   # wrist joints need lower gains
    kd: 0.3

# Apply and restart teleoperation
python -m lerobot.scripts.control_robot \
  --robot.type=bi_dk1_follower \
  --control.type=teleoperate
خطأ 3 تنخفض إطارات الكاميرا أو تخرج عن المزامنة أثناء التسجيل اليدوي

تنافس عرض النطاق الترددي USB مع كاميرتين بالإضافة إلى ذراعين تسلسليين USB على نفس وحدة تحكم الناقل. إن انحراف الطابع الزمني لـ LeRobot بين تدفقات الكاميرا وقراءات الحالة المشتركة يتجاوز الحدود المقبولة.

يصلح:

# 1. Check which USB bus each device is on
lsusb -t

# 2. Spread devices across separate USB bus controllers
#    - Cameras: use a powered USB hub on one controller
#    - Arms: connect directly on a different controller

# 3. Reduce camera resolution if bandwidth is still tight
# In dk1_bimanual.yaml:
cameras:
  wrist_left:
    width: 480
    height: 320   # lower resolution reduces USB bandwidth

# 4. Verify timestamp skew is acceptable
python -m trlc_dk1.tools.check_sync \
  --config ~/.lerobot/robots/dk1_bimanual.yaml
# Target: < 5ms skew between all streams

لا تزال عالقة؟ اسأل على منتدى DK1 أو التحقق من الموجود قضايا جيثب.

عمل البرمجيات؟ البدء في جمع البيانات الثنائية.

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