DK1 Setup Guide
From unboxing to bimanual data collection. Estimated time: ~2 hours.
Unboxing & Assembly
~30 minCarefully unbox both arms and verify all components are present before powering anything on.
What's in the box
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
Software Setup / LeRobot Install
~30 minThe DK1 integrates with LeRobot as a first-class hardware plugin. Install it alongside your existing LeRobot environment.
Prerequisites
- Python 3.10+ with
uvpackage 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')"
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
Port Detection & Calibration
~20 minUse 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
First Teleoperation Session
~30 minStart 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
Once single-arm teleoperation is working correctly, repeat the test with the second arm pair before proceeding to bimanual mode.
Bimanual Data Recording
OngoingUse 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.tasknames 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.