Configuração do Software

Instalação de plugins, configuração de braço líder/seguidor, controle bimanual ROS2, integração do LeRobot DK1, API Python e solução de problemas. Desde uma instalação limpa do Ubuntu até um sistema bimanual em movimento.

Ir para uma seção:

Etapa 1 — Instalação do SDK

Instalação do SDK

O SDK DK1 é distribuído como um plugin LeRobot via o trlc-dk1 repositório. Ele registra quatro tipos de dispositivos: dk1_leader, dk1_follower, bi_dk1_leader, e bi_dk1_follower.

Instale o LeRobot primeiro

pip install lerobot

Clone e instale o plugin DK1

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

Verifique a instalação

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

Você deve ver dk1_leader, dk1_follower, bi_dk1_leader, bi_dk1_follower impresso. Se não, verifique se o plugin foi instalado corretamente com uv pip show trlc-dk1.

Instale a partir de um commit específico (para reprodutibilidade)

cd trlc-dk1
git checkout v0.3.0
uv pip install -e .
Passo 2 — Configuração Líder/Seguidor

Configuração do Braço Líder/Seguidor

O sistema bimanual do DK1 depende da atribuição de portas para distinguir o braço líder (Dynamixel XL330) do braço seguidor (DM4340 + DM4310). Atribuições de porta incorretas são o erro de configuração mais comum.

Detectar portas seriais USB

Execute a utilidade de detecção de porta LeRobot com um braço conectado por vez:

# 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

Crie a configuração do robô bimanual

Crie um arquivo de configuração YAML para o par bimanual. O LeRobot usa isso para direcionar comandos para o braço correto:

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

Verifique a configuração

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

Isso se conecta a ambos os braços sem movê-los. Verifique se há erros de conexão. Se algum dos braços falhar ao se conectar, execute novamente a detecção de porta ou troque as atribuições de porta.

Persistência de porta: As portas seriais USB podem mudar entre reinicializações. Use regras udev para vincular uma porta a um braço específico pelo número de série USB. Veja o Guia de Configuração para o modelo de regra udev.

Etapa 3 — Configuração Bimanual ROS2

Controle Bimanual ROS2

O ROS2 Humble fornece uma camada de controle de nível superior para o DK1 com suporte completo para planejamento bimanual MoveIt2. Isso é opcional para fluxos de trabalho de coleta de dados apenas do LeRobot.

Instale o ROS2 Humble e pacotes bimanual

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

Clone e construa o pacote ROS2 DK1

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

Iniciar no modo bimanual

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

Teste com hardware falso (nenhum braço necessário)

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

Envie uma trajetória bimanual

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}}]}'
Etapa 4 — Configuração LeRobot DK1

Configuração LeRobot DK1

O LeRobot com o plugin DK1 lida com a gravação de teleoperação bimanual nativamente. O bi_dk1_follower tipo de dispositivo grava de ambos os braços e todas as câmeras simultaneamente.

Calibre ambos os braços

# 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

Inicie a teleoperação bimanual

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

Grave um conjunto de dados bimanual

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

Envie para o HuggingFace Hub

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

API Python para Controle Bimanual

A API Python DK1 fornece acesso direto a ambos os braços via serial. Nenhum ROS2 é necessário para controle básico e registro de dados.

Conecte ambos os braços

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

Leia os estados das juntas de ambos os braços

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

Execute o loop líder-seguidor manualmente

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()
Opcional — Simulação

Suporte à Simulação

O DK1 suporta simulação bimanual MuJoCo com um modelo calibrado que espelha a cinemática do hardware real. Treine políticas na simulação antes de implantar no hardware.

Simulação bimanual 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

Treine uma política contra o ambiente 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

Alinhamento Sim-para-Real: O modelo MuJoCo DK1 usa a geometria do arquivo STEP TRLC-DK1-Follower_v0.3.0 e curvas de torque do motor DM4340/DM4310 medidas. Políticas treinadas na simulação transferem para o hardware real com mínima ajuste para tarefas estruturadas de pegar e colocar.

Solução de Problemas

Os 3 principais problemas específicos bimanuais

Erro 1 Braços atribuídos ao mesmo porto — o seguidor espelha o líder, mas atrasa muito

Ambos os braços conectados ao mesmo /dev/ttyACM* porto, ou atribuições de porto trocadas. O braço líder (Dynamixel XL330) e o braço seguidor (série DM) usam protocolos diferentes; atribuição errada causa falha de controle imediata.

Correção:

# 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
Erro 2 O braço seguidor oscila ou ultrapassa durante a teleoperação

Os ganhos PD do braço seguidor são muito altos para a carga atual ou configuração do braço. Isso é especialmente comum quando os braços estão carregados com efetores finais ou quando operando em extensão total.

Correção:

# 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
Erro 3 Quadros da câmera caem ou ficam fora de sincronia durante a gravação bimanual

Contenção de largura de banda USB com duas câmeras mais dois braços seriais USB no mesmo controlador de barramento. O desvio de timestamp do LeRobot entre os fluxos de câmera e as leituras do estado das juntas excede os limites aceitáveis.

Correção:

# 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

Ainda preso? Pergunte no Fórum DK1 ou verifique os existentes Problemas do GitHub.

Software funcionando? Comece a coletar dados bimanual.

Uma vez que ambos os braços estejam se movendo, o próximo passo é a teleoperação e a gravação do conjunto de dados bimanual.