Configuration du logiciel

Installation du plugin, configuration du bras leader/suiveur, contrôle bimanuel ROS2, intégration LeRobot DK1, API Python et dépannage. D'une nouvelle installation d'Ubuntu à un système bimanuel en mouvement.

Accéder à une section :

Étape 1 — Installation du SDK

Installation de votre SDK

Le SDK DK1 est distribué sous forme de plugin LeRobot via le trlc-dk1 dépôt. Il enregistre quatre types d'appareils : dk1_leader, dk1_follower, bi_dk1_leader, et bi_dk1_follower.

Installez d'abord LeRobot

pip install lerobot

Cloner et installer le plugin DK1

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

Vérifier l'installation

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)
"

Tu devrais voir dk1_leader, dk1_follower, bi_dk1_leader, bi_dk1_follower imprimé. Sinon, assurez-vous que le plugin est correctement installé avec uv pip show trlc-dk1.

Installer à partir d'un commit spécifique (pour la reproductibilité)

cd trlc-dk1
git checkout v0.3.0
uv pip install -e .
Étape 2 — Configuration leader/suiveur

Configuration du bras leader/suiveur

Le système bimanuel du DK1 s'appuie sur l'affectation des ports pour distinguer le bras leader (Dynamixel XL330) du bras suiveur (DM4340 + DM4310). Les attributions de ports incorrectes constituent l'erreur de configuration la plus courante.

Détecter les ports série USB

Exécutez l'utilitaire de détection de port LeRobot avec un bras connecté à la fois :

# 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

Créer la configuration du robot bimanuel

Créez un fichier de configuration YAML pour la paire bimanuelle. LeRobot l'utilise pour acheminer les commandes vers le bon bras :

# ~/.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

Vérifier la configuration

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

Cela se connecte aux deux bras sans les déplacer. Vérifiez les erreurs de connexion. Si l'un des bras ne parvient pas à se connecter, réexécutez la détection des ports ou échangez les attributions de ports.

Persistance du port : Les ports série USB peuvent changer entre les redémarrages. Utilisez les règles udev pour lier un port à un bras spécifique par numéro de série USB. Voir le Guide de configuration pour le modèle de règle udev.

Étape 3 — Configuration bimanuelle de ROS2

Commande bimanuelle ROS2

ROS2 Humble fournit une couche de contrôle de niveau supérieur pour le DK1 avec une prise en charge complète de la planification bimanuelle MoveIt2. Ceci est facultatif pour les flux de travail de collecte de données réservés à LeRobot.

Installer les packages ROS2 Humble et bimanuels

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

Cloner et créer le package 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

Lancement en mode bimanuel

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

Testez avec du faux matériel (aucun bras nécessaire)

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

Envoyer une trajectoire bimanuelle

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}}]}'
Étape 4 — Configuration du LeRobot DK1

Configuration du Robot DK1

LeRobot avec le plugin DK1 gère nativement l'enregistrement de téléopération bimanuel. Le bi_dk1_follower Le type d'appareil enregistre simultanément les deux bras et toutes les caméras.

Calibrer les deux bras

# 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

Démarrer la téléopération bimanuelle

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

Enregistrer un ensemble de données bimanuel

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

Pousser vers HuggingFace Hub

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/dk1-bimanual-pick-place-v1
Étape 5 — API Python

API Python pour le contrôle bimanuel

L'API Python DK1 fournit un accès direct aux deux bras via série. Aucun ROS2 n'est requis pour le contrôle de base et l'enregistrement des données.

Connectez les deux bras

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()

Lire les états communs des deux bras

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()

Exécuter manuellement la boucle leader-suiveur

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()
Facultatif — Simulation

Prise en charge des simulations

Le DK1 prend en charge la simulation bimanuelle MuJoCo avec un modèle calibré qui reflète la cinématique du matériel réel. Entraînez les politiques en simulation avant de les déployer sur le matériel.

Simulation bimanuelle 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

Former une politique contre l’environnement 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

Alignement du Sim au Réel : Le modèle DK1 MuJoCo utilise la géométrie du fichier STEP TRLC-DK1-Follower_v0.3.0 et les courbes de couple moteur DM4340/DM4310 mesurées. Les politiques formées au transfert de simulation vers du matériel réel avec un réglage minimal pour les tâches structurées de sélection et de placement.

Dépannage

Top 3 des problèmes spécifiques au bimanuel

Erreur 1 Armes assignées au même port – le suiveur reflète le leader mais est très en retard

Les deux bras connectés au même /dev/ttyACM* port ou les attributions de ports ont été échangées. Le bras leader (Dynamixel XL330) et le bras suiveur (série DM) utilisent des protocoles différents ; une mauvaise affectation provoque une défaillance immédiate du contrôle.

Réparer:

# 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
Erreur 2 Le bras suiveur oscille ou dépasse pendant la téléopération

Les gains PD du bras suiveur sont trop élevés pour la charge utile ou la configuration actuelle du bras. Ceci est particulièrement fréquent lorsque les bras sont chargés d'effecteurs terminaux ou lorsqu'ils fonctionnent en extension complète.

Réparer:

# 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
Erreur 3 Les images de la caméra chutent ou se désynchronisent pendant l'enregistrement bimanuel

Conflit de bande passante USB avec deux caméras et deux bras série USB sur le même contrôleur de bus. Le décalage de l'horodatage LeRobot entre les flux de caméras et les lectures d'état conjointes dépasse les limites acceptables.

Réparer:

# 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

Toujours bloqué ? Demandez sur le Forum DK1 ou vérifiez existant Problèmes GitHub.

Le logiciel fonctionne ? Commencez à collecter des données bimanuelles.

Une fois les deux bras en mouvement, l’étape suivante est la téléopération et l’enregistrement bimanuel des jeux de données.