11. 机器人数据集与任务设计
什么是 Episode、一帧数据里到底有什么、时间戳与数据同步、任务的起止条件、一致性与多样性、数据量与质量,以及一个完整的 A 到 B 抓放示例。
什么是 Episode?
从本章起,你每做一次操作都意味着角色转变 —— 你不再是"驾驶员",而是"老师"。 你的每个动作都会被记录下来,成为模型的教材。这本教材的基本单元就是 Episode。
一个 Episode 就是一次完整的任务演示。 从机械臂处于起始姿态、任务开始,到任务完成,系统连续记录的全部数据构成一个 Episode。
一帧数据里到底有什么?
回忆第 8 章 —— 这些内容应该很眼熟。没错,就是学过的:观测、状态、动作。
在 SO-ARM 上,录制的一帧包含:
- 观测:两个相机的图像(前 + 侧);
- 状态:从臂的 6 个关节读数(5 个关节 + 夹爪);
- 动作:来自主臂的 6 个目标关节值。
注意动作的来源:它记录的是(经主臂)给定的目标动作,而不是从臂之后实际到达的位置。这正好符合行为克隆的定义 —— 模型学习的是"在此观测与状态下,人当时想做什么"。
时间戳与数据同步
图像走 USB、关节数据走串行总线 —— 两路数据天然在不同时刻到达电脑。LeRobot 为每帧数据打时间戳,从而把"同一时刻"的图像、状态、动作对齐到同一行。

任务设计:起止条件
采数据之前,先把任务定义用文字写清楚。一个好的任务定义回答两个问题:从哪里开始?什么时候算完成?
起始条件:给模型一个"固定起点"
- 固定的初始臂姿:每个 Episode 都从同一个安全姿态出发(例如标定后的归位姿态)。如果起始姿态五花八门,模型的第一课就变成"从任意姿态进入任务",平添不必要的难度。
结束条件:给 Episode 画一条"终点线"
- 成功结束:任务目标达成(例如"物体已放到 B 点、夹爪松开、机械臂离开");
- 失败终止:出现不可挽回的情况(物体掉落、物体被碰出桌垫、机械臂进入危险姿态)—— 立即停止本条 Episode 的录制。
一致性 vs. 多样性
这是全章最关键的一节。高质量的示教数据必须同时满足两个看似矛盾的要求。
一致性:只教"一种做法"
- 操作风格一致:同一个任务,所有 Episode 采用同一策略(例如总是从物体上方接近、抓取、放到 B 点)。如果一半数据从左抓、一半从右抓,模型学到的是两种做法的"平均" —— 往往是一条什么也抓不到的怪异轨迹;
- 节奏一致:移动速度与停顿位置大体稳定 —— 定了 20–30 秒,就在 20–30 秒内完成。速度忽快忽慢的数据,会让模型的动作速度也不稳定;
- 流程一致:每次都完整走"接近 → 抓取 → 搬运 → 放置 → 收回",不跳步骤;
- 场景初始状态可控:物体放在指定区域内(区域可以大,但边界要清晰);工作区里拿走无关物品;
- 相机位置固定:采集期间相机不能动 —— 对模型而言,相机挪 5 厘米就意味着世界变了。
多样性:见过足够多的"变体"
- 目标位置多样:物体出现在工作空间的各个位置(网格化覆盖,而不是随机乱撒);
- 初始姿态多样:物体的朝向、与障碍物的相对位置要有变化。
成功与失败标准
"任务完成"必须是一个可客观判定的状态,而不是"看起来差不多"。合格的成功标准长这样:
| 不合格标准(含糊) | 合格标准(可测量) |
|---|---|
| "大概抓到了就行。" | "夹爪完全闭合,抓住物体中心。" |
| "物体放到 B 点附近就行。" | "物体落在 B 点标记区域内,而不是搭在边缘上。" |
| "把物体拿起来放下去就算。" | "整个动作流畅,每条录制的时长大体一致。" |
录制中出现失败片段的原则很简单:重录这一条。 不要抱着"模型也许能从失败里学到东西"的心态留下失败数据 —— 模型确实会学,包括学失败。
数据量 vs. 数据质量
经验参考(干净、一致场景下的单一桌面任务):
| 数据量 | 预期效果 |
|---|---|
| 20–30 条 Episode | 固定 A 到 B 任务的首个可用策略(入门级) |
| 50 条 Episode | 流程跑通;模型在数据覆盖区域内开始工作(泛化入门量) |
| 50–100 条 Episode | 成功率进入可用区间;大多数单任务实验的甜点区 |
| 100 条以上 | 收益递减,除非任务复杂或成功率要求很高 |
多任务场景按复杂度等比增加数据量。当然,训练之后也可以补数据 —— 发现模型表现不佳时再加就行。
但请把这几句放在数字前面:
- 50 条高质量 Episode 胜过 200 条粗糙的。
- 采集出问题不要犹豫 —— 立刻重录这一条。
- 想要强泛化,需要几百上千条 Episode。
实用的分批策略(第 22 章的无代码流程也这么做):每批录 10 条左右;录 2–3 批后,保留 20–30 条有效数据做第一次训练;再根据训练结果为更难的变体补数据。
单任务 vs. 多任务数据集
- 单任务数据集:一个数据集只含一个任务(例如"物体从 A 到 B")。模型目标单一,数据需求小,成功率容易做出来。你的第一个模型必须从单任务开始。
- 多任务数据集:一个数据集含多个任务(抓方块、开抽屉、放方块进抽屉);每条 Episode 以
task_index标注所属任务。数据利用率高,是通向通用策略的方向,但任务之间会竞争模型容量,每个任务需要更多数据才能学好。
数据迭代
分批采集、迭代验证:采 50 条 → 训练 → 真机评估 → 针对失败场景补数据 → 重训。如果模型大方向对但精度差,加数据有用;如果模型行为完全错误,那是任务或数据设计的问题,加再多数据也没用。
数据创作示例:从 A 到 B 抓放
本阶段后续章节使用的示例任务:抓起 A 点的物体,放到 B 点 —— 与第 22 章无代码平台的任务相同,方便你对照两条路径。
场景设计
- 在桌垫上标记两个固定位置:A 点放物体的起始位置,B 点是目的地。准备一个大小合适、易于抓取的物体,例如小方块;
- 确保 A 点、B 点、两条臂和物体在两个相机画面里都可见、不被遮挡。固定相机、保持光照不变、让主臂避开相机视野。

初学者采数据最头疼的问题是"物体怎么摆才能练得全" —— 随机摆放要么聚成一团(模型只认那一块,别的位置全失败),要么散乱无章(有的区域练爆了,有的从未碰过)。这里给出一个简单且规范的做法:
- 标点:在采集区域(桌垫)上用铅笔画 5 个点,摆成十字形 —— 中心 1 个,上下左右各 1 个;
- 定间距:相邻点间隔 5–10 cm,确保 5 个点都在机械臂工作空间内、且两个相机都看得清;
- 分配:每个点采 10 条 Episode;5 点 × 10 = 50 条,正好达标。注意不要在 1 号点连录 10 条再去 2 号点,而是每个点各录 1 条(5 点 = 1 轮),这样录 10 轮。
抓取与放置设计
- 初始位置:机械臂位于归位姿态;物体放在 A 点;
- 抓取物体:
- 移动到物体正上方(每次都以相同高度到达物体中心正上方);
- 在物体上方固定距离处张开夹爪(为什么固定距离?避免开爪时碰到物体、把物体碰歪);
- 每次以相同的力度与速度抓取;
- 放置物体:
- 移动到 B 点中心正上方;
- 匀速张开夹爪并抬臂 —— 应能看到物体平稳落在标记区域内;
- 机械臂回到归位姿态。
这样,一条完美的 Episode 就完成了。接下来只需重复 50 次。
设计思考题
为什么不能随意挪桌垫、相机、物体位置或改变光照?
- 破除误区:"什么都随便动"带来的不是多样性,而是噪声;
- 泛化预算理论:数据有限时,把变化花在哪个维度,模型就学会哪个维度 —— 花在目标位置上,它学会抓不同位置的物体;花在相机位置变化上,它得同时学会抓取与视角差异,需要多得多数据且效果更差;
- 真的需要变化怎么办:不是采集时"不固定",而是后续补数据时有意扩展边界 —— 这才是我们要的泛化。