by The Robot Learning Company
TRLC-DK1 Follower CAD (Fusion)
|
TRLC-DK1 Leader CAD (Fusion)
|
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.)
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.pyThis 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=trueRecording
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=trueInference
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_modelBimanual 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.81Bimanual 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- GELLO by Philipp Wu et al.
- Low-Cost Robot Arm by Alexander Koch
- LeRobot by HuggingFace, Inc.
- SO-100 by TheRobotStudio
- OpenArm by Enactic, Inc.

