双手数据采集
DK1 专为双手遥控数据收集而设计。 本指南涵盖了手臂和摄像机的连接、运行领导者/跟随者记录程序、了解双手数据集架构以及为 ACT 训练准备数据。
双手录音的硬件连接
双手录音比单臂设置需要更多的连接。 在启动 LeRobot 之前验证每个连接 - 会话中丢失连接会破坏剧集。
引导臂 (Dynamixel XL330)
从引导臂到主机 PC 的 USB-C。 该臂由操作员的手移动。 使用短电缆 (1 m) 以避免在远程操作期间意外断开连接。 核实: ls /dev/ttyACM0
从动臂(DM4340+电源)
从从动臂到主机 PC 的 USB-C 加上直流电源。 从动臂需要外部电源——切勿仅使用 USB 电源运行。 核实: ls /dev/ttyACM1
腕式相机(从动臂)
将 USB 网络摄像头安装到从动臂的末端执行器。 这是主要的操控相机。 通过 USB 3.0 连接。 核实: ls /dev/video0
俯视/工作区摄像机
将相机固定在双手工作空间上方约 70 厘米的高度,向下倾斜 30°。 同时捕获双臂。 第二个 USB 3.0 端口。 核实: ls /dev/video2
关键:双手同步。 DK1 有两个手臂和两个摄像头,同步是最重要的数据质量因素。 LeRobot 为来自主机 PC 时钟的所有流添加时间戳。 为了最大限度地减少时间戳偏差:(1) 对相机和手臂使用单独的 USB 总线控制器,(2) 使用具有稳定时钟的 USB 3.0 集线器,(3) 将 CPU 调速器设置为性能模式。 目标:所有四个流之间的偏差 <5 毫秒。 左右臂状态之间 10 毫秒的不同步可能会导致 ACT 训练在接触丰富的任务上失败。
领导者/跟随者遥操作记录程序
对于每个 DK1 录制会话,请遵循以下步骤。 与单臂采集相比,双手采集过程有一些额外的步骤。
会前安全检查
清理双臂之间的共享工作空间 (1.5 m × 1 m)。 验证双臂到达共享工作空间而不会发生碰撞。 录制前测试急停按钮。 看 安全页面.
连接并验证双臂
# Verify serial ports are available
ls /dev/ttyACM*
# Expected: /dev/ttyACM0 (leader) and /dev/ttyACM1 (follower)
# Quick connection test
python -m lerobot.scripts.control_robot \
--robot.type=bi_dk1_follower \
--robot.config=~/.lerobot/robots/dk1_bimanual.yaml \
--control.type=none
验证摄像头信息
在启动 LeRobot 之前,两个摄像头都必须进行流传输。 丢失的摄像机将默默地生成具有空图像帧的剧集。
python3 -c "
import cv2
for i in [0, 2]:
cap = cv2.VideoCapture(i)
if cap.isOpened():
ret, frame = cap.read()
print(f'Camera {i}: OK ({frame.shape[1]}x{frame.shape[0]})')
else:
print(f'Camera {i}: FAILED')
cap.release()
"
将手臂移至起始位置
手动将引导臂移至起始遥操作位置。 从动臂将镜像它。 在预热期开始之前,稳定引导臂 2-3 秒以确认同步。
设置任务场景
将物体放置在双臂一致的起始位置。 拍摄起始配置。 对于双手任务,用胶带标记准确的位置 - 场景一致性更加重要,因为两条手臂的轨迹必须兼容。
开始乐机器人双手录音
source ~/.venvs/dk1/bin/activate
python -m lerobot.scripts.control_robot \
--robot.type=bi_dk1_follower \
--robot.config=~/.lerobot/robots/dk1_bimanual.yaml \
--control.type=record \
--control.fps=30 \
--control.repo_id=your-username/dk1-bimanual-pick-place-v1 \
--control.num_episodes=50 \
--control.single_task="Pick up block with left arm, place in bin with right arm" \
--control.warmup_time_s=5 \
--control.reset_time_s=15
使用更长的 reset_time_s 对于双手任务 - 重置两只手臂和场景比单臂设置需要更多时间。
回顾并重播剧集
每批 10 集后,重播并回顾后再继续。 注意手臂的协调性——左右臂之间的滞后会在跟随者的动作中表现为抖动。
python -m lerobot.scripts.visualize_dataset \
--repo_id=your-username/dk1-bimanual-pick-place-v1 \
--episode_index=0
推送至 HuggingFace Hub
huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
--repo_id=your-username/dk1-bimanual-pick-place-v1
乐机器人双手数据集格式(DK1)
与单臂记录相比,DK1 双手数据集模式使关节状态字段增加了一倍。 每集包含来自领导者和跟随者手臂以及所有摄像机的同步观察。
目录结构
your-username/dk1-bimanual-pick-place-v1/
├── meta/
│ ├── info.json # Dataset metadata, fps, shapes, robot_type
│ ├── episodes.jsonl # Per-episode metadata (task, length, outcome)
│ └── stats.json # Min/max/mean/std for all fields
├── data/
│ └── chunk-000/
│ ├── episode_000000.parquet
│ └── ...
└── videos/
└── chunk-000/
├── observation.images.wrist_cam/
│ ├── episode_000000.mp4
│ └── ...
└── observation.images.overhead_cam/
└── ...
剧集数据模式(双手)
双手演示的质量检查表
双手数据集比单臂数据有更严格的质量要求。 兵种之间协调不力是DK1政策训练失败的主要原因。
-
1Arm 同步增量低于 10 ms 检查
arm_sync_delta_ms每集的场。 峰值超过 10 毫秒表示 USB 总线争用或串行数据包丢失。 删除增量持续较高的剧集。 -
2接触时从动臂无摆动 检查接触点处的从动臂轨迹(抓取、切换、放置)。 振荡表现为高频噪声
observation.state。 减少 PD 增益(如果存在)。 看 软件故障排除. -
3双臂在同一集中完成任务 对于双手任务,只有双臂完成指定的子任务时,一个情节才有效。 如果左臂成功但右臂掉落了物体,则将该事件标记为失败并删除或注释它。
-
4没有丢失相机帧 两个摄像机流必须具有预期的帧数。 任一相机丢失的帧都会破坏视觉运动策略的输入。 检查与
lerobot.scripts.visualize_dataset. -
5各集之间的任务场景重置相同 每集都必须重置双臂的工作空间。 物体位置、手臂起始配置和摄像机角度必须全部匹配。 使用拍摄的起始配置作为参考。
-
6剧集长度一致 所有成功的发作应在中位长度的 ±25% 范围内。 双手任务通常比单臂任务具有更高的方差,但极端异常值(3×中值)应该被丢弃。
-
7双臂的数据集统计数据是对称的 在
meta/stats.json,检查一下action_left和action_right统计数据对于您的任务几何形状来说是合理的。 如果一只手臂显示零方差,则该手臂没有移动 - 检查端口分配。 -
8Teleop演示风格一致 所有演示应使用相同的进场路径、掌握策略和切换技术。 混合策略产生多模式动作分布,使 ACT 训练变得混乱。 每个任务版本使用一个操作员。
在您的双手数据集上训练 ACT
一旦您的数据集通过质量检查表,就可以直接与 LeRobot 一起训练 ACT 或扩散策略。 建议将 ACT 用于 DK1 双手任务——其分块动作预测比单步策略更好地处理手臂之间的协调。
训练 ACT(推荐双手操作)
python -m lerobot.scripts.train \
--policy.type=act \
--dataset.repo_id=your-username/dk1-bimanual-pick-place-v1 \
--policy.chunk_size=100 \
--policy.n_action_steps=100 \
--training.num_epochs=5000 \
--training.batch_size=8 \
--output_dir=outputs/dk1-act-bimanual
训练扩散策略(针对接触丰富的任务)
python -m lerobot.scripts.train \
--policy.type=diffusion \
--dataset.repo_id=your-username/dk1-bimanual-pick-place-v1 \
--training.num_epochs=8000 \
--output_dir=outputs/dk1-diffusion-bimanual
更深入: 阅读全文 数据收集管道概述 在机器人库中,对情节结构、数据集版本控制、同步策略和多任务双手数据集组合进行彻底处理。