3. 数据采集基础

在 LeRobot 的模仿学习工程中,数据采集是决定策略上限的第一道关口。模型再先进,也无法从噪声大、标定错、动作空间混乱的数据中学到稳定可用的操作技能。本节围绕四个基础问题展开:用什么设备遥操作、相机如何标定、关节状态与动作如何定义、数据以什么格式落盘。理解这四点,才能保证后续训练与部署的一致性。

一、遥操作设备:把人的动作变成机器人可学的信号

遥操作设备的核心作用,是让操作者以自然方式产生示范轨迹,并同步记录机器人本体状态与视觉观测。常见方案包括主从臂(leader-follower)、空间鼠标/手柄、VR 控制器以及动捕手套。在 LeRobot 生态中,最典型的是 SO-100/SO-101 这类低成本主从臂:操作者手动拖动 leader 臂,follower 臂按关节映射跟随,同时采集 follower 的关节位置与相机画面。

选择设备时要关注三点:自由度匹配(主从关节数是否一致)、回传延迟(影响示教流畅度)、可重复性(同一动作多次示教是否一致)。延迟过高会让操作者过度修正,数据中充满抖动;自由度不匹配则需要做映射,容易引入额外误差。

建议在正式采集前先做 5~10 条“空跑”示教,检查关节读数是否平滑、相机是否丢帧、时间戳是否对齐,再开始正式任务。

二、相机标定:让像素坐标与机器人空间对齐

相机标定解决两个问题:内参(焦距、主点、畸变)和外参(相机相对机器人基座或末端的位置姿态)。内参决定像素到归一化平面的映射,外参决定视觉观测与动作空间的几何关系。若只做端到端策略,外参不显式使用,但相机安装位置必须固定且可复现,否则同一任务在不同安装下分布漂移。

标定流程通常为:打印棋盘格/ArUco 标定板 → 多角度拍摄 → 检测角点 → 求解内参 → 固定相机后求解外参 → 验证重投影误差。LeRobot 常用 OpenCV 完成内参标定,外参可用手眼标定或直接测量安装位姿。

# 内参标定示例(OpenCV)
python -m lerobot.calibrate_camera \
  --images ./calib_imgs \
  --pattern 9x6 \
  --square_size 0.025 \
  --output camera_intrinsics.json

标定完成后应保存为 JSON,并在数据集中记录相机名称、分辨率、帧率与内参文件路径,便于复现与跨设备迁移。

三、关节状态与动作空间:统一“看什么”和“做什么”

关节状态(state)是策略的输入之一,动作(action)是策略的输出。二者必须使用同一套关节顺序、单位与坐标系。常见定义包括:关节角度(弧度或度)、关节速度、末端位姿(位置+四元数)、夹爪开合度。LeRobot 通常以关节位置作为 state 和 action 的主要维度,夹爪单独一维。

动作空间有三种典型形式:关节空间(直接输出各关节目标角)、末端空间(输出末端位姿,需逆解)、增量动作(输出相对当前状态的 delta)。关节空间最稳定,适合低成本臂;末端空间更易跨本体迁移,但依赖运动学求解质量。

维度常见定义单位/范围注意事项
state6 关节角 + 夹爪rad / 0~1顺序固定,与 URDF 一致
action6 关节目标角 + 夹爪rad / 0~1需与 state 同序
图像RGB 观测H×W×3分辨率、帧率固定
时间戳采集时刻秒或纳秒用于对齐与回放
不要混用“度”和“弧度”,也不要在不同批次间改变关节顺序。这类错误在训练时不会报错,但会让策略学到错误的映射,表现为动作方向相反或抖动。

四、数据格式与存储结构:让数据可读、可训、可复现

LeRobot 数据集通常采用分 episode 存储的结构:每个 episode 是一段完整示教,包含若干帧的观测与动作。常见格式为 Parquet(表格数据)+ MP4(视频)或直接存为 HDF5。目录结构大致如下:

dataset/
  meta/
    info.json          # 数据集元信息:fps、features、相机名
    stats.json         # 各维度均值/方差/极值
    episodes.jsonl     # episode 索引与长度
  data/
    chunk-000/
      episode_000000.parquet
      episode_000001.parquet
  videos/
    observation.images.top/
      episode_000000.mp4

其中 info.json 定义 features 的 shape 与 dtype,stats.json 用于归一化。训练时按 episode 采样,避免跨 episode 拼接造成时序断裂。采集阶段还应记录任务描述、操作者、设备型号与标定文件,方便后续复盘与数据筛选。

LeRobot 数据采集链路与存储结构 遥操作设备 主从臂 / 手柄 / VR 产生示范轨迹 相机标定 内参 + 外参 固定安装位姿 状态与动作空间 关节角 + 夹爪 顺序 / 单位统一 采集同步 时间戳对齐 图像 + 状态 + 动作 按 episode 切分 数据集存储结构 meta/ info.json · stats.json · episodes.jsonl data/chunk-000/ episode_000000.parquet videos/ observation.images.top/*.mp4 calibration/ camera_intrinsics.json 按 episode 采样,避免时序断裂

五、常见误区与复盘清单

  • 标定一次用到底:相机被碰过、换镜头或重新安装后必须重标,否则视觉分布漂移。
  • state 与 action 不同序:训练不报错但策略学反,表现为动作镜像或抖动。
  • 忽略时间戳:图像与关节读数不同步,策略学到“看前一帧、做后一帧”的错位关系。
  • episode 切分过碎:每条太短会导致策略缺乏完整任务上下文,建议单条覆盖完整操作流程。
  • 不记录元信息:缺少 fps、相机名、标定文件,后续无法复现或做数据筛选。
采集阶段的目标不是“多”,而是“一致”:设备一致、标定一致、动作空间一致、存储结构一致。一致性越高,模仿学习越容易收敛,部署时的迁移成本也越低。