הגדרת תוכנה

התקנת פלאגין, תצורת זרוע מנהיג/עוקבת, שליטה דו-ידנית של ROS2, שילוב LeRobot DK1, Python API ופתרון בעיות. מהתקנה חדשה של אובונטו למערכת דו-מנואלית נעה.

קפוץ לקטע:

שלב 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.

התקן מ-commit ספציפי (לשחזור)

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 Humble וחבילות דו-ידניות

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 Config

תצורת LeRobot 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 API

Python API עבור בקרה דו-ידנית

ה-API של DK1 Python מספק גישה ישירה לשתי הזרועות באמצעות סידורי. לא נדרש 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 או לבדוק קיים בעיות GitHub.

תוכנה עובדת? התחל לאסוף נתונים דו-ידניים.

ברגע ששתי הזרועות זזות, השלב הבא הוא הפעלה טלפונית והקלטת נתונים דו-ידניים.