إعداد البرامج
تثبيت البرنامج المساعد، وتكوين ذراع القائد/التابع، والتحكم اليدوي في ROS2، وتكامل LeRobot DK1، وPython API، واستكشاف الأخطاء وإصلاحها. من تثبيت Ubuntu جديد إلى نظام يدوي متحرك.
انتقل إلى القسم:
تثبيت 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 .
تكوين ذراع القائد/التابع
يعتمد نظام 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.
التحكم اليدوي 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}}]}'
تكوين ليروبوت 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
واجهة برمجة تطبيقات 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 مشكلات خاصة بكلتا اليدين
كلا الذراعين متصلتين بنفس الشيء /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
تعتبر مكاسب 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
تنافس عرض النطاق الترددي 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 أو التحقق من الموجود قضايا جيثب.