双手数据采集

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

会前安全检查

清理双臂之间的共享工作空间 (1.5 m × 1 m)。 验证双臂到达共享工作空间而不会发生碰撞。 录制前测试急停按钮。 看 安全页面.

2

连接并验证双臂

# 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
3

验证摄像头信息

在启动 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()
"
4

将手臂移至起始位置

手动将引导臂移至起始遥操作位置。 从动臂将镜像它。 在预热期开始之前,稳定引导臂 2-3 秒以确认同步。

5

设置任务场景

将物体放置在双臂一致的起始位置。 拍摄起始配置。 对于双手任务,用胶带标记准确的位置 - 场景一致性更加重要,因为两条手臂的轨迹必须兼容。

6

开始乐机器人双手录音

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 对于双手任务 - 重置两只手臂和场景比单臂设置需要更多时间。

7

回顾并重播剧集

每批 10 集后,重播并回顾后再继续。 注意手臂的协调性——左右臂之间的滞后会在跟随者的动作中表现为抖动。

python -m lerobot.scripts.visualize_dataset \
  --repo_id=your-username/dk1-bimanual-pick-place-v1 \
  --episode_index=0
8

推送至 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/
            └── ...

剧集数据模式(双手)

每集 Parquet 文件中的字段 — DK1 双手册 (bi_dk1_follower)
观察状态 浮点数32[16] 从动臂关节位置:7 DOF + 夹具 × 2 个臂 = 16 个值
观察.state_left 浮点数32[8] 左从动臂:7个关节位+1个夹具(rad)
观察.state_right 浮点数32[8] 右从动臂:7个关节位+1个夹具(rad)
行动 浮点数32[16] 两个从动臂的目标位置(来自引导臂 teleop)
左动作 浮点数32[8] 领导者左臂的目标位置
行动权 浮点数32[8] 领导者右臂的目标位置
观察.images.wrist_cam 视频路径 从动臂末端执行器上安装腕式摄像头
观察.images.overhead_cam 视频路径 固定顶置摄像头显示完整的双手工作空间
时间戳 浮动64 主机 PC Unix 时间戳。 两条臂均在此时间戳进行采样。
手臂同步增量毫秒 浮动32 DK1 特定:左右臂状态读取之间的时间增量。 标记超过 10 毫秒的剧集。
下一步完成 布尔值 剧集最后一帧为真
品质保证

双手演示的质量检查表

双手数据集比单臂数据有更严格的质量要求。 兵种之间协调不力是DK1政策训练失败的主要原因。

  • 1
    Arm 同步增量低于 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_leftaction_right 统计数据对于您的任务几何形状来说是合理的。 如果一只手臂显示零方差,则该手臂没有移动 - 检查端口分配。
  • 8
    Teleop演示风格一致 所有演示应使用相同的进场路径、掌握策略和切换技术。 混合策略产生多模式动作分布,使 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

更深入: 阅读全文 数据收集管道概述 在机器人库中,对情节结构、数据集版本控制、同步策略和多任务双手数据集组合进行彻底处理。

数据集准备好了吗? 开始训练。

将您的双手数据集推送到 HuggingFace 并开始训练 ACT。