TRLC-DK1 Bimanual Dev Kit — LeRobot Setup, Teleop & Data Recording
Complete guide to assembling, connecting, and collecting bimanual demonstration data with the TRLC-DK1 open-source robot arm kit using the LeRobot plugin.
1. Overview
The TRLC-DK1 (The Robot Learning Company Dev Kit 1) is an open-source bimanual robot arm kit designed for AI-native robotics research and imitation learning data collection. It ships as a first-class LeRobot plugin — install once and every LeRobot CLI command (lerobot-teleoperate, lerobot-record, lerobot-find-port) works out of the box with DK1 hardware.
The kit consists of two arm types that work together: a leader arm (the teleoperation controller) and a follower arm (the robot that executes motion). Both arms communicate via USB serial. In a bimanual setup, you use two leader arms and two follower arms connected to four serial ports simultaneously.
Key differentiators: open-source hardware and software, STEP CAD files, LeRobot plugin conventions (no manual registration), community-contributed URDF, and support for multi-camera bimanual recording with wrist and head cameras in a single lerobot-record command.
2. Hardware Specs
| Property | Leader Arm | Follower Arm |
|---|---|---|
| DOF | 7 + gripper | 7 + gripper |
| Actuators | Dynamixel XL330 servo chain | DM4340 (base joints) + DM4310 (wrist + gripper) |
| Communication | USB serial (Dynamixel protocol) | USB serial CAN bridge |
| Device type (single) | dk1_leader | dk1_follower |
| Device type (bimanual) | bi_dk1_leader | bi_dk1_follower |
| CAD version | v0.2.0 Leader | v0.3.0 Follower |
| URDF | Community URDF by Andreas Köpf (github.com/andreaskoepf/trlc-dk1-follower-urdf) | |
| Camera support | OpenCV — wrist (×2 for bimanual), head, context views | |
| License | Copyright 2025–2026 The Robot Learning Company UG | |
| Source | github.com/robot-learning-co/trlc-dk1 | |
hardware/TRLC-DK1-Follower_v0.3.0.step inside the repo. The leader CAD (v0.2.0) is hosted at a360.co/481PSQH. A full tabletop assembly STEP is also available as TRLC-DK1-X-Tabletop.step.
3. Quick Start
From unboxing to first motion in four steps:
-
Clone the repo and install.
git clone https://github.com/robot-learning-co/trlc-dk1.git cd trlc-dk1 uv venv uv pip install -e .
This registers thedk1_follower,dk1_leader,bi_dk1_follower, andbi_dk1_leaderdevice types with your LeRobot installation automatically. -
Connect the arm via USB and find the port.
# Use the LeRobot port finder (recommended) uv run lerobot-find-port # Or list manually ls /dev/ttyACM* # Linux ls /dev/tty.usbmodem* # macOS
Note the port for the follower (e.g.,/dev/ttyACM0) and leader (e.g.,/dev/ttyACM1). -
Run the follower motion demo (no leader required).
uv run python examples/follower_demo_move.py --port /dev/ttyACM0 # macOS — use your actual port: uv run python examples/follower_demo_move.py --port /dev/tty.usbmodem5A460819651 # Optional flags: # --duration 20 run for 20 seconds # --scale 0.1 reduce motion amplitude (safer for first run)
PressCtrl+Cto stop at any time. -
Verify follower communication (read-only, no motion).
uv run python examples/follower_read_position.py
Editport="/dev/ttyACM1"in the script to match your follower port. Continuous joint position output confirms the connection is healthy.
4. SDK Integration
The TRLC-DK1 follows LeRobot's plugin conventions. After uv pip install -e ., the DK1 device classes are importable directly from Python:
from lerobot_robot_trlc_dk1.follower import DK1Follower from lerobot_robot_trlc_dk1.leader import DK1Leader # Create a follower robot instance robot = DK1Follower(port="/dev/ttyACM0", joint_velocity_scaling=0.2) robot.connect() # Read joint positions state = robot.get_state() print(state) # dict of joint names → angles robot.disconnect()
For bimanual use, the bi_dk1_follower type handles both arms under a single LeRobot robot object:
# Bimanual follower via CLI (no Python needed)
uv run lerobot-teleoperate \
--robot.type=bi_dk1_follower \
--robot.right_arm_port=/dev/ttyACM0 \
--robot.left_arm_port=/dev/ttyACM1 \
--teleop.type=bi_dk1_leader \
--teleop.right_arm_port=/dev/ttyACM2 \
--teleop.left_arm_port=/dev/ttyACM3
You can also install via the RoboticsCenter SDK which wraps DK1 under the unified platform session model:
pip install roboticscenter rc connect --device dk1_follower --port /dev/ttyACM0
5. Single-Arm Teleoperation
Single-arm teleop connects one leader arm to one follower arm. The follower tracks the leader in real time:
# Option A: LeRobot CLI with cameras
uv run lerobot-teleoperate \
--robot.type=dk1_follower \
--robot.port=/dev/ttyACM0 \
--robot.joint_velocity_scaling=0.2 \
--teleop.type=dk1_leader \
--teleop.port=/dev/ttyACM1 \
--robot.cameras="{
context: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 60, fourcc: MJPG},
wrist: {type: opencv, index_or_path: 1, width: 1280, height: 720, fps: 60, rotation: 180, fourcc: MJPG}
}" \
--display_data=true
# Option B: Minimal Python script (edit ports in examples/teleop.py first)
uv run python examples/teleop.py
examples/teleop.py, the first port argument is the leader and the second is the follower. Swapping them will send leader position commands to the leader hardware — verify before enabling motion.
6. Bimanual Recording
The full bimanual recording command connects two leader arms to two follower arms and records synchronized episodes with up to three 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."
Each episode is saved as a LeRobot-format HDF5 file containing:
- Joint angles for both arms (right + left, 7 DOF + gripper each)
- Gripper state (open/close)
- Synchronized camera frames from all configured cameras
- Episode metadata: task description, timestamps, and arm port assignments
To discover camera indices before recording:
uv run lerobot-find-cameras
7. ROS2 Integration
A community-contributed URDF for the DK1 follower arm is maintained at andreaskoepf/trlc-dk1-follower-urdf. It provides complete kinematic and visual meshes suitable for:
- MoveIt2 motion planning with the follower arm
- RViz visualization during teleop sessions
- Simulation in Isaac Sim or MuJoCo
- State publishing via
joint_state_publisher
# Clone the community URDF git clone https://github.com/andreaskoepf/trlc-dk1-follower-urdf.git # Build in your ROS2 workspace cp -r trlc-dk1-follower-urdf <ros2_ws>/src/ cd <ros2_ws> colcon build --packages-select trlc_dk1_follower_urdf source install/setup.bash # Launch RViz with the follower model ros2 launch trlc_dk1_follower_urdf display.launch.py
DK1Follower.get_state() call in a ROS2 node and publish to /joint_states. The URDF joint names align with the LeRobot state dict keys.
8. Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Permission denied | User not in dialout group |
Run sudo usermod -aG dialout $USER and log out/in. Or temporarily: sudo chmod 666 /dev/ttyACM0. |
| Unable to read from joint_* | Motor not powered or CAN bus wiring fault | Check power supply to the follower arm. Reseat the serial CAN bridge cable between the arm and the USB adapter. |
| Follower does not track leader | Leader and follower ports swapped | Use lerobot-find-port to re-identify which physical port corresponds to which arm. Edit the --teleop.port and --robot.port arguments accordingly. |
| Device not found on macOS | USB-to-serial driver not installed | Install the CH340 or CP210x driver for macOS. After installing, the device appears under /dev/tty.usbmodem* or /dev/tty.usbserial*. |
| Cameras not detected | Wrong video index | Run uv run lerobot-find-cameras to enumerate all available camera indices before setting them in the recording command. |
discord.gg/PTZ3CN5WkJ or contact SVRC support. Include the output of uv run lerobot-find-port and your OS + USB adapter model.