Skip to content

Repository files navigation

Chat on Discord

An Open Source Dev Kit for AI-native Robotics

by The Robot Learning Company

Demo

CAD

TRLC-DK1 Follower CAD (Fusion)
TRLC-DK1 Leader CAD (Fusion)
Copyright 2025 The Robot Learning Company UG (haftungsbeschränkt). All rights reserved.

Installation

Poetry >= 2.1 is required for this repo because lerobot is pulled from a git revision and uses PEP 621 metadata.

conda create -n dk1 python=3.10
conda activate dk1
# Install Poetry (example)
# python -m pip install --user "poetry>=2.1.4"
#
# Install dependencies via Poetry into the active env (recommended)
poetry config virtualenvs.create false --local
poetry install --with dev

# If you want OpenCV GUI support (cv2.imshow previews), add:
# poetry install --with dev -E gui

(This installs TRLC's fork of LeRobot at rev trlc-dk1.)

Examples

Use LeRobot's CLI to identify your teleop and robot ports:

lerobot-find-port

To identify which camera indices correspond to which physical cameras:

python examples/find_cameras.py

This will scan camera indices (0-10 by default) and show preview windows for each available camera. You can visually identify which camera is which and note the corresponding index. Use --no-preview to skip previews and just list available cameras, or --max-index N to check a different range.

Teleoperation
lerobot-record \
    --robot.type=dk1_follower \
    --teleop.type=dk1_leader \
    --robot.port=/dev/tty.usbmodem00000000050C1 \
    --teleop.port=/dev/tty.usbmodem58FA0824311 \
    --robot.joint_velocity_scaling=0.5 \
    --robot.cameras="{ 
        context: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}, 
        wrist1: {type: opencv, index_or_path: 1, width: 1280, height: 720, fps: 30}
        wrist2: {type: opencv, index_or_path: 2, width: 1280, height: 720, fps: 30}
      }" \
    --display_data=true
Recording
lerobot-record \
    --robot.type=dk1_follower \
    --robot.port=/dev/tty.usbmodem00000000050C1 \
    --robot.joint_velocity_scaling=1.0 \
    --robot.cameras="{ 
        context: {type: opencv, index_or_path: 0, width: 640, height: 360, fps: 30}, 
        wrist1: {type: opencv, index_or_path: 1, width: 640, height: 360, fps: 30}
        wrist2: {type: opencv, index_or_path: 2, width: 640, height: 360, fps: 30}
      }" \
    --teleop.type=dk1_leader \
    --teleop.port=/dev/tty.usbmodem58FA0824311 \
    --display_data=true \
    --dataset.repo_id=$USER/my_dataset \
    --dataset.push_to_hub=false \
    --dataset.num_episodes=50 \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=15 \
    --dataset.single_task="My task description."
    --resume=true
Inference
lerobot-record  \
  --robot.type=dk1_follower \
  --robot.port=/dev/tty.usbmodem00000000050C1 \
  --robot.joint_velocity_scaling=0.5 \
  --robot.cameras="{ 
      context: {type: opencv, index_or_path: 0, width: 640, height: 360, fps: 30}, 
      wrist: {type: opencv, index_or_path: 1, width: 640, height: 360, fps: 30}
    }"
  --display_data=true \
  --dataset.repo_id=$USER/eval_my_model \
  --dataset.single_task="My task description." \
  --dataset.push_to_hub=false \
  --policy.path=outputs/my_model/checkpoints/last/pretrained_model
Bimanual Teleoperation
lerobot-teleoperate \
    --robot.type=bi_dk1_follower \
    --robot.left_arm_port=/dev/tty.usbmodem8 \
    --robot.right_arm_port=/dev/tty.usbmodem00000000050C1 \
    --robot.joint_velocity_scaling=1.0 \
    --robot.cameras="{ 
        context: {type: opencv, index_or_path: 0, width: 640, height: 360, fps: 30}, 
        right_wrist: {type: opencv, index_or_path: 1, width: 640, height: 360, fps: 30},
        left_wrist: {type: opencv, index_or_path: 2, width: 640, height: 360, fps: 30},
      }" \
    --teleop.type=bi_dk1_leader \
    --teleop.left_arm_port=/dev/tty.usbmodem5A460819651 \
    --teleop.right_arm_port=/dev/tty.usbmodem5AB01811381 \
    --display_data=true \
    --display_url=100.88.6.81
Bimanual Teleoperation
lerobot-record \
    --robot.type=bi_dk1_follower \
    --robot.right_arm_port=/dev/ttyACM0 \
    --robot.left_arm_port=/dev/ttyACM1 \
    --robot.joint_velocity_scaling=1.0 \
    --robot.cameras="{ 
        context: {type: opencv, index_or_path: 2, width: 640, height: 360, fps: 30}, 
        right_wrist: {type: opencv, index_or_path: 4, width: 640, height: 360, fps: 30},
        left_wrist: {type: opencv, index_or_path: 0, width: 640, height: 360, fps: 30},
      }" \
    --teleop.type=bi_dk1_leader \
    --teleop.right_arm_port=/dev/ttyACM2 \
    --teleop.left_arm_port=/dev/ttyACM3 \
    --dataset.repo_id=$USER/disassemble_lego \
    --dataset.push_to_hub=false \
    --dataset.num_episodes=40 \
    --dataset.episode_time_s=180 \
    --dataset.reset_time_s=120 \
    --dataset.single_task="Disassemble the Lego and sort it." \
    --dataset.reset_time_s=120 \
    --resume=true

Acknowledgements

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages