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 :
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 .
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.
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}}]}'
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
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()
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.
Top 3 des problèmes spécifiques au bimanuel
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
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
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.