DK1 Setup Guide

From unboxing to bimanual data collection. Estimated time: ~2 hours.

1

Unboxing & Assembly

~30 min

Carefully unbox both arms and verify all components are present before powering anything on.

What's in the box

Leader arm unit
Follower arm unit
USB cables (2× for bimanual)
Tabletop mounting hardware
Power adapter
Quick-start card

Assembly checklist

  • Mount both arms securely to the tabletop using the provided hardware
  • Inspect all servo connections on the leader (Dynamixel XL330) chain
  • Inspect all servo connections on the follower (DM4340 base, DM4310 wrist/gripper)
  • Route USB cables cleanly away from joint travel paths
  • Verify gripper mechanisms open and close freely by hand (power off)
  • Read the safety page before applying power
Before powering on Ensure both arms are mounted securely and no cables cross the joint travel paths. Test single-arm operation before attempting bimanual mode.
2

Software Setup / LeRobot Install

~30 min

The DK1 integrates with LeRobot as a first-class hardware plugin. Install it alongside your existing LeRobot environment.

Prerequisites

  • Python 3.10+ with uv package manager
  • LeRobot installed in your Python environment
  • Linux (Ubuntu 22.04 recommended) or macOS

Install the DK1 plugin

# Clone the repo
git clone https://github.com/robot-learning-co/trlc-dk1.git
cd trlc-dk1

# Create a virtual environment
uv venv

# Install as LeRobot plugin (GIT_LFS_SKIP_SMUDGE=1 avoids downloading
# large LeRobot dependency assets during install)
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .

# Verify device types registered
python -c "from lerobot.common.robot_devices.robots.factory import make_robot; print('DK1 ready')"
How plugin detection works: After uv pip install -e ., the device types dk1_follower, dk1_leader, bi_dk1_follower, and bi_dk1_leader are automatically available to any LeRobot CLI in the same Python environment. No manual registration needed. The GIT_LFS_SKIP_SMUDGE=1 flag is required because LeRobot is pulled as a dependency and stores large assets via Git LFS — skipping smudge avoids downloading them during install.

Linux serial port permissions

On Linux, serial ports under /dev/ttyACM* require the user to be in the dialout group. Run this once and then log out and back in:

sudo usermod -aG dialout $USER
# Then log out and back in, or run:
newgrp dialout
3

Port Detection & Calibration

~20 min

Use the built-in port finder to identify which USB serial port each arm is connected to, then run calibration for each arm.

Find ports automatically

# Plug in one USB cable at a time to identify each arm's port
uv run lerobot-find-port

Typical port assignments for a bimanual setup:

# Leader right arm:   /dev/ttyACM0
# Leader left arm:   /dev/ttyACM1
# Follower right:    /dev/ttyACM2
# Follower left:     /dev/ttyACM3

# On macOS these appear as /dev/tty.usbmodem* instead

Calibrate each arm

Run calibration for each arm individually. Move the arm through its full range when prompted:

# Calibrate follower right arm
uv run lerobot-calibrate \
  --robot.type=dk1_follower \
  --robot.port=/dev/ttyACM0

# Calibrate follower left arm
uv run lerobot-calibrate \
  --robot.type=dk1_follower \
  --robot.port=/dev/ttyACM1

# Calibrate leader right arm
uv run lerobot-calibrate \
  --robot.type=dk1_leader \
  --robot.port=/dev/ttyACM2

# Calibrate leader left arm
uv run lerobot-calibrate \
  --robot.type=dk1_leader \
  --robot.port=/dev/ttyACM3
Re-calibrate after collisions: Run calibration again after any unexpected stop or collision to ensure accurate joint zero positions.
4

First Teleoperation Session

~30 min

Start with a single-arm teleoperation session to verify leader-follower tracking before moving to bimanual mode.

Single-arm teleoperation

uv run lerobot-teleoperate \
  --robot.type=dk1_follower \
  --robot.port=/dev/ttyACM0 \
  --teleop.type=dk1_leader \
  --teleop.port=/dev/ttyACM2

What to verify

  • Follower arm tracks leader arm movements smoothly
  • No servo errors or stalls in any joint
  • Gripper opens and closes in response to leader gripper
  • No cable snagging through the full range of motion
Emergency stop Disconnect the USB cable to immediately cut communication to the arm. Keep hands clear of the workspace during powered operation.

Once single-arm teleoperation is working correctly, repeat the test with the second arm pair before proceeding to bimanual mode.

5

Bimanual Data Recording

Ongoing

Use lerobot-record with the bi_dk1_follower and bi_dk1_leader device types to collect synchronized bimanual demonstrations.

Full bimanual recording command

The command below connects two leader arms to two follower arms and records synchronized episodes with head and wrist camera streams:

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 \
  --teleop.type=bi_dk1_leader \
  --teleop.right_arm_port=/dev/ttyACM2 \
  --teleop.left_arm_port=/dev/ttyACM3 \
  --robot.cameras="{
      head:        {type: opencv, index_or_path: /dev/video0, width: 960, height: 540, fps: 60, fourcc: MJPG},
      right_wrist: {type: opencv, index_or_path: /dev/video2, width: 960, height: 540, fps: 60, rotation: 180, fourcc: MJPG},
      left_wrist:  {type: opencv, index_or_path: /dev/video4, width: 960, height: 540, fps: 60, rotation: 180, fourcc: MJPG}
  }" \
  --dataset.repo_id=$USER/my_bimanual_dataset \
  --dataset.push_to_hub=false \
  --dataset.num_episodes=10 \
  --dataset.episode_time_s=30 \
  --dataset.reset_time_s=20 \
  --dataset.single_task="Bimanual pick and place task."

To discover camera indices before recording:

uv run lerobot-find-cameras

Recording best practices

  • Record at least 50 demonstrations per task before training
  • Vary object positions and orientations across episodes
  • Keep camera exposure consistent between sessions
  • Verify the dataset uploads to Hugging Face Hub after each session
  • Use descriptive --dataset.task names for later filtering

Next steps

Once you have data collected, train an ACT or Diffusion Policy model using LeRobot's training scripts. See the DK1 wiki for platform integration options.

Setup Complete?

Join the community to share results and get help with advanced configurations.