AgiBot World 一个百万级真机操作数据集的设计原理、规格、它针对的问题,以及正在发生的转向
它最有价值的地方不是「一百万条」这个数字——Open X-Embodiment 早就有 140 万条。它稀缺的地方在于:这一百万条是用同一把尺子量出来的。同一型号机器人、同一套相机布局、同一种采集流程、同一条人工校验标准。
- 轨迹(Beta)
- 1,001,552
- 总时长
- 2,976.4h
- 任务 / 技能
- 217 / 87
- 场景
- 106
- 物体
- 3,000+
- 采集机器人
- 100台 G1
- 相机 / 帧率
- 8 / 30Hz
- 体量(Beta)
- 48.1TB
数字口径:Beta 版论文与数据卡。Alpha 版为 36 任务 / 10 万+ 条 / 595.31 小时 / 约 8.5 TB;2026 版为另一套格式与统计,见 4.1。许可 CC BY-NC-SA 4.0,需在 Hugging Face 申请访问。
为什么这个仓库值得单独读一遍
机器人学习的数据集大致有三条路:拼盘(Open X-Embodiment 把 60 个实验室的数据凑成 140 万条,22 种本体)、单点深耕(DROID 用同一种 Franka 在 564 个场景采了 7.6 万条)、自建工厂(AgiBot World 造了一个 4,000 平方米的片场,100 台同型号机器人,采了 100 万条)。
第三条路最贵,也最不灵活,但它换来了前两条路都给不了的东西:分布可控。你知道第 327 号任务里有多少条失败恢复轨迹,因为那是按流程采的;你知道每一帧的相机内外参,因为那是校准过的;你知道这条数据被人工看过一遍,因为流水线里有这道工序。
这决定了两件事:它能训出可用的策略(GO-1),也能被当成评测基准(EWMBench、AGIBOT WORLD CHALLENGE)。而大多数数据集只能做前者,或者只能挂在别人后面做后者。
不要先看「100 万条」。先看它的排除项:只有一种本体、场景是搭出来的、许可是非商用、力/力矩字段是空的。这四个排除项决定了你拿它能做什么、不能做什么。规格表在第四章,陷阱清单在第七章——如果你只读两处,读那两处。
它是什么:一个数据集,还是一个基础设施
1.1三个身份,别混为一谈
agibot-world/AgiBotWorld-Alpha、-Beta、AgiBotWorld2026 三个仓库,共 50 TB 量级的视频、深度、本体状态与动作。它不是 benchmark——虽然派生出 benchmark;也不是模型——GO-1 是它的伴生模型,不是它本身。把它当「一个下载链接」会用错;把它当「一套产数据的制度」才用得对。
1.2三代版本:从十万条到五期主题
三代不是简单的「加量」,而是三次目标切换:Alpha 证明能产,Beta 证明能量产,2026 证明能按研究方向定制。
它针对的是什么问题
论文明说了一句很关键的话:现有基准「受限于受控环境中的短程任务,且缺乏感知能力」。这句话可以拆成五个具体的缺口,每一个都对应一个设计决定。
2.1五个缺口与它的回应
| 缺口 | 此前的问题 | AgiBot World 的做法 | 换来的代价 |
|---|---|---|---|
| 规模与同质性 | OXE 有 140 万条,但来自 22 种本体、60 个数据集,视角、动作空间、标注口径全不一致;DROID 只有 7.6 万条 | 100 台同型号 G1,按统一流程采到 100 万条 | 形态多样性降到 1。迁移到 Franka、UR5 都要重定向 |
| 质量不可验证 | OXE 没有人工校验环节,坏轨迹只能靠训练时筛 | 每条轨迹过三段质检,含失败与恢复段的显式标注 | 人力密集,单条成本高,这也是非商用许可的现实原因之一 |
| 场景不真实 | 多数数据来自实验室桌面,摆件是纸盒和积木 | 4,000+ ㎡ 片场复刻家居、零售、工业、餐饮、办公五个域,106 个场景,3,000+ 物体 | 场景是搭出来的、固定的,采完就过时,长尾覆盖不到 |
| 任务太短 | pick-and-place 占主流,单条几秒到十几秒,学不到长时序 | 平均单条 30—60 秒,含补货、倒水、折衣、多机协作 | 采集效率低;一条长时序的标注成本是短任务数倍 |
| 感知维度缺失 | OXE 与 DROID 基本只有 RGB + 本体状态,没有触觉,也没有灵巧手 | 视触觉传感器 + 6-DoF 灵巧手 + 8 路相机 + 深度 | 触觉数据的一致性与可用性远不如视觉;灵巧手动作空间更难对齐 |
| 标注只有一句话 | 多数数据集给一个任务级指令,甚至没有子任务切分 | episode → 技能段 → 关键帧 → 物体框 四层 | 标注体系重,解析门槛高,字段命名不统一 |
这六行其实是一句话:它用「同质化」换「可比性」,用「人力」换「可验证」,用「固定布景」换「真实分布」。三个交换都是有意识的,也在论文里被承认为限制。
为什么是「造片场」而不是「去真实场所采」?因为要控制变量。真实超市的货架每天都不一样,你无法回答「这条数据是在什么初始条件下采的」。片场把场景变成可枚举的配置,代价是丢掉真实世界的那种不可预测性——这个代价在 2026 版里被部分补回来了(自由采集、保留意外与失败)。
2.2它没有解决的问题
读数据卡时,比「它有什么」更重要的是「它明确没有什么」。以下五项在官方文档里都能找到依据:
- 跨本体。只有 G1(Alpha/Beta)和 G2(2026)。没有 Franka、没有 UR、没有四足、没有移动底盘以外的形态。想在 Franka 上用它,必须自己做重定向,而重定向目前没有公认的评测。
- 力的真值。
/state/end/wrench、/state/joint/effort、/state/effector/force这三个字段在文档里都存在,但都标了「Not available for now」。也就是说:这份数据有触觉图像,没有关节力矩真值。想做阻抗控制或力控策略,它不够。 - 全局定位。
/state/robot/position的 z 恒为 0,/state/robot/orientation只保留 yaw。里程计坐标系以开机点为原点。这意味着它不能直接用于 SLAM 或导航研究。 - 多机协作的真实社会场景。论文提到 multi-robot collaboration,但这是「两台机器人配合完成一个任务」,不是「机器人在有人走动的环境里工作」。
- 语言的多样性。指令来自模板化标注,不是众包的自然语言。同义表述、模糊指代、口语化请求,这份数据教不了。
设计原理:六个决定,六组代价
把数据集的设计拆开看,真正有信息量的不是「我们采了很多」,而是「我们在这里做了选择,并接受了它的代价」。以下六条,每条都能在 README、论文或数据卡的细节里找到对应证据。
3.1决定一:把硬件做成标准件
G1 的配置是:双 7-DoF 臂(合计 14 自由度)+ 2-DoF 腰(pitch + lift)+ 2-DoF 头(pitch + yaw)+ 全向移动底盘 + 6-DoF 灵巧手(左右各 6)+ 视触觉传感器 + 8 路相机。所有 100 台机器人是同一型号、同一相机布局、同一标定流程。
state 与 action 张量形状完全一致(14 关节 + 2 腰 + 2 头 + 2 末端 + 2/12 夹爪),可以直接拼 batch,不需要任何重定向层。3.2决定二:把场景复刻成片场
五个域——家居、零售、工业、餐饮、办公——共 106 个场景、3,000 多个物体、总面积超过 4,000 平方米。注意这些数字的关系:106 个场景摊在 5 个域里,平均每域 21 个;3,000 个物体摊在 217 个任务里,平均每任务约 14 个可交互物体。
这个比例是刻意的。太少,模型记不住物体外观的多样性;太多,同一任务内的方差会盖过任务本身的信号。一个任务配十几个物体,刚好够让模型学到「抓杯子」而不是「抓这个杯子」。
「真实场景」指的是物理真实(真的杯子、真的水、真的布料),不是分布真实(这个杯子出现在谁家厨房、以什么频率出现)。片场里的真实,是把真实世界的高频模式浓缩进一个可控空间。所以拿它做「家庭服务机器人的能力上限」推断,会系统性高估。
3.3决定三:三段式流水线,人在三个位置
官方给的流程图里,人是三个角色:采集前的场景验证者、采集中的遥操作员、采集后的质检与标注者。这不是「人工参与」,而是把质量责任分配到三个不同环节。
这条流水线解释了一件常被问的事:为什么这份数据 48 TB,却只有 2,976 小时?因为原始采集量远大于入库量。质检环节剔除的轨迹、重新采集的轨迹、标注不合格被退回的轨迹,都不进入最终发布。你在 HF 上看到的是一个已经过滤过的分布,它比真实采集分布更「干净」,也更不真实。
3.4决定四:保留失败,并给它标注
这是它与 OXE、DROID 最实质的差别之一。在 task_[id].json 的 key_frame 字段里,comment 可以是 "Failure recovery"——意思是一段「失败了然后恢复」的连续帧。这不是把失败轨迹混进来充数,而是在标注层面把它标出来,让训练时可以选择用它、绕开它,或者专门拿它做恢复策略。
模仿学习最根本的缺陷是「只会成功」。纯成功示范训出的策略,一旦偏离示范分布就再也回不来——因为它从没见过「偏了之后怎么办」。要学恢复,必须有「偏了 → 发现 → 纠回」的完整片段,而这恰恰是过去数据集系统性缺失的部分。DROID 靠众包场景多样性补,AgiBot 靠标注补。
但要清楚它补到了什么程度:Alpha/Beta 里的失败数据是少量、被标注的片段,不是系统性的失败分布。真正的系统性经验数据是 2026 第三期(强化学习)才发布的,那一期给出了 1,024 条成功 rollout、1,369 条失败 rollout,以及 10,684 段人工接管。数量级差两个数量级——前者是「顺便留了一点」,后者是「专门采的」。
3.5决定五:把「一句话任务」拆成四层
单个 episode 的标注结构是四层的,这是整套设计里工程量最大、也最容易被使用者忽略的部分。
为什么非要做这么细?因为「一句话指令 → 一整条轨迹」这个映射里,模型的梯度会被平均掉:一条 40 秒的轨迹里,抓取只占 5 秒,放置占 3 秒,剩下的都是移动。如果只给任务级标签,模型学不到「什么时候该合爪」这种原子决策。技能段切分让每个原子技能有独立的监督,这才是 action_config 存在的真正理由。
3.6决定六:2026 年改成「五期主题制」
这是最重要的一次转向。2026 版不再是「一个大包」,而是围绕五个具身研究主题分期发布,每期有自己的采集方法、标注体系、甚至自己的研究目标。
这个转向的意义,比它发布的任何数字都大。它意味着数据集的设计单位从「小时」变成了「研究问题」:
- 要训模仿学习策略 → 用第一期,标注是任务级 + 技能级。
- 要训世界模型 → 用第二期,需要的是「动作导致什么」,失败和形变恰恰是最有信息量的样本。
- 要做真机 RL → 用第三期,需要的是过程奖励信号,不是成功示范。
- 要做长时序决策 → 用第四期,需要的是「同一目标的不同路径」,不是「同一路径的不同执行」。
五期数据不能直接混训。本体从 G1 换到 G2、格式从自定义 HDF5 换到 LeRobot v2.1、标注 schema 每期都不一样、动作空间定义也可能变。想跨期使用,你得自己写一层归一化——而这一层目前没有官方实现。这是「按主题发布」这种策略的固有成本:灵活性换掉了统一性。
数据集规格:三套格式,三种口径
这一章是「可以拿去写代码」的部分。三代的格式完全不同,混用是最常见的错误来源,所以先给对照表,再逐层展开。
4.1三代对照
| 维度 | AgiBotWorld-Alpha | AgiBotWorld-Beta | AgiBotWorld2026 |
|---|---|---|---|
| 首发 | 2024-12-30 | 2025-03-01 | 2026-06 起,分期 |
| 定位 | 可运行的最小完整版 | 百万级主发布 | 按研究主题分期的系列 |
| 机器人 | G1(双 7-DoF 臂 + 腰 + 底盘) | G1,100 台 | G2(WBC + 力控 + 灵巧手) |
| 轨迹数 | 10 万+(更新后) | 1,001,552 | 分五期,各期独立统计 |
| 时长 | 474.12 h → 595.31 h | 2,976.4 h | 未统一公布(见 4.7) |
| 任务 / 技能 | 36 任务 | 217 任务 / 87 技能 | 每期 10—14 类任务起 |
| 场景 | 五域,100+ 场景 | 106 场景 / 3,000+ 物体 | 商业、家居、工业、酒店餐饮等 |
| 格式 | 自定义目录 + HDF5 + MP4/PNG | 同 Alpha(同一套 README) | LeRobot v2.1 |
| 标注 | 任务级 + 技能段 + 关键帧 | 同上 | 三层(Task Frame / 2D Box / Instruction Segment) |
| 体量 | ≈8.5 TB | ≈48.1 TB | 随分期增长 |
| 许可 | CC BY-NC-SA 4.0,gated | CC BY-NC-SA 4.0,gated | CC BY-NC-SA 4.0,gated |
| 配套工具 | convert_to_lerobot.py | 同 Alpha | split_episode.py |
| 样本包 | ≈7 GB sample_dataset.tar | ≈7 GB | ≈7 GB(单任务 tar.gz) |
Beta 仓库的 README 与 Alpha 基本是复制的,下载命令里写的仍然是 git clone .../AgiBotWorld-Alpha。照着 Beta 页面复制命令,下到的是 8.5 TB 的 Alpha,而不是 48 TB 的 Beta。正确的仓库名是 agibot-world/AgiBotWorld-Beta。这种「文档漂移」在快速迭代的数据集里极其常见——永远以仓库 URL 为准,不要以代码块为准。
4.2目录结构(Alpha / Beta)
以 task 为中心组织,不是一个大的 LeRobot 数据集。这个选择的后果是:你可以只下一个任务,但也意味着你得自己写跨任务的索引。
data
├── task_info
│ ├── task_327.json # 该任务所有 episode 的元信息 + 语言标注
│ ├── task_352.json
│ └── ...
├── observations
│ ├── 327 # task_id
│ │ ├── 648642 # episode_id
│ │ │ ├── depth # 逐帧深度,PNG
│ │ │ └── videos # 各相机视角的 MP4
│ │ ├── 648649
│ │ └── ...
│ └── 352
│ └── ...
├── parameters
│ ├── 327/648642/camera # 该 episode 全部相机的内参与外参
│ └── ...
├── proprio_stats
│ ├── 327/648642/proprio_stats.h5 # 本体状态 + 动作,逐帧
│ └── ...
└── scripts
└── convert_to_lerobot.py # 官方转换脚本
四个顶层目录对应四类信息:说了什么(task_info)、看到什么(observations)、相机在哪(parameters)、机器人做了什么(proprio_stats)。把「参数」和「观测」分开是个好设计——同一次采集的相机内外参只需存一份,且可以单独修正(Alpha 更新时就修正了部分外参)。
4.3HDF5 字段:完整规格
proprio_stats.h5 是这份数据里最需要小心读的文件。它分成 state(传感器测到的)与 action(下发给硬件的指令),两者结构对称但语义不同。官方特别强调了一句:下发的指令与实际执行的状态之间存在差异。这句话决定了你做模仿学习时该取哪一路。
| 字段 | 形状 | 含义与单位 |
|---|---|---|
| /timestamp | [N] | 纳秒时间戳,逐帧 |
| /state/effector/position (夹爪) | [N, 2] | 左 [:,0]、右 [:,1];单位毫米,表示夹爪开口 |
| /state/effector/position (灵巧手) | [N, 12] | 左 [:,:6]、右 [:,6:];关节角,弧度 |
| /state/end/position | [N, 2, 3] | 法兰中心 xyz,米;左 [:,0,:]、右 [:,1,:] |
| /state/end/orientation | [N, 2, 4] | 法兰四元数,xyzw 顺序(不是 wxyz) |
| /state/joint/position | [N, 14] | 双 7-DoF 臂关节角,弧度;左 [:,:7]、右 [:,7:] |
| /state/joint/current_value | [N, 14] | 关节电流 |
| /state/head/position | [N, 2] | yaw [:,0]、pitch [:,1],弧度(仅 2 自由度) |
| /state/waist/position | [N, 2] | pitch(弧度)[:,0]、lift(米)[:,1] |
| /state/robot/position | [N, 3] | 里程计坐标下的 xyz;z 恒为 0 |
| /state/robot/orientation | [N, 4] | 四元数 xyzw,仅 yaw 有效 |
| /state/end/wrench | — | 文档标注 Not available:六维力/力矩真值缺失 |
| /state/joint/effort | — | 同上,电机力矩缺失 |
N = 帧数。所有字段以帧为第一维,但不同字段的 N 可能不等(action 分支的 index 数组更短)——见 7.3。 | ||
action 分支与 state 分支结构对称(/action/end/position、/action/joint/position 等形状完全一致),但有两处关键差异:
- 夹爪的语义是反的。state 里是毫米开口量;action 里是归一化的
0 = 全开、1 = 全闭。直接把 action 当 state 用,或者反过来,模型会学到「夹爪永远在 0 到 1 之间抖动」这种毫无意义的行为,而且训练 loss 看起来完全正常。 - action 有额外的
index数组。/action/effector/index、/action/end/index、/action/joint/index等,记录的是「控制源真正发出信号的帧」。它们比 N 短,因为遥操作系统在部分帧不发送指令。
4.4语言与标注
task_[id].json 是一个 episode 数组,每个元素包含任务描述与两层时间标注:
[
{
"episode_id": 649078,
"task_id": 327,
"task_name": "Picking items in Supermarket",
"init_scene_text": "The robot is in front of the fruit shelf in the supermarket.",
"lable_info": { # 注意:拼写是 lable,不是 label
"action_config": [
{ "start_frame": 0, "end_frame": 435,
"action_text": "Pick up onion from the shelf.",
"skill": "Pick" },
{ "start_frame": 435, "end_frame": 619,
"action_text": "Place onion into the plastic bag in the shopping cart.",
"skill": "Place" }
],
"key_frame": [
{ "start": 0, "end": 435, "comment": "Failure recovery" }
]
}
}
]
"Failure recovery",也用 Error Frame / Success Frame / Intervention Frame 等(2026 版)。Alpha 刚发布时 action_text 与 description 是空的,文档里明确写着「not available now, to be released by mid-January」。这是数据集发布的一个常态:视频数据先到,语言标注后到。如果你在论文里引用早期版本,要注意标注覆盖率。
4.5相机与内外参
G1 上有 8 路相机,覆盖头部前视、左右鱼眼、后视、双目,以及左右腕部。2026 版(G2)的相机键名可以直接从 info.json 的 features 里读到,比 Alpha/Beta 的自定义目录更规范:
| 键名 | 视角 | 用途 |
|---|---|---|
| observation.images.top_head | 头部前视彩色 | 主视角,策略最常用 |
| observation.images.head_depth | 头部深度 | 几何与遮挡判断 |
| observation.images.head_left_fisheye | 左鱼眼 | 大视场,补盲区 |
| observation.images.head_right_fisheye | 右鱼眼 | 大视场,补盲区 |
| observation.images.head_back_fisheye_color | 后视鱼眼 | 身后环境 |
| observation.images.head_stereo_left_color | 双目左 | 立体匹配 |
| observation.images.head_stereo_right_color | 双目右 | 立体匹配 |
| observation.images.hand_left | 左腕 | 精细操作,遮挡少 |
| observation.images.hand_right | 右腕 | 精细操作,遮挡少 |
Alpha/Beta 版不做命名规范,视频按 observations/<task>/<ep>/videos/ 存放;内外参在 parameters/<task>/<ep>/camera/,每个 episode 一份。 | ||
头部视角里,手常常被自己的手臂挡住,抓取瞬间的关键帧恰好被遮。腕部相机贴在夹爪上,永远看得见「手与物的接触」。所以几乎所有开源策略(ACT、π0、GR00T)在双臂任务上都会用至少一路腕部相机。做消融实验时,去掉腕部视角的性能下降通常比去掉鱼眼更大——这也是这份数据为什么给两路腕部而不是两路后视的原因。
4.62026 版:换成 LeRobot v2.1
这是三代里最容易被忽略但影响最大的一次改动:从自定义目录换成了社区标准格式。好处是「下载完就能喂给 lerobot 的 train.py」,代价是丢掉了 Alpha/Beta 那种按 task 分目录的便利。
dataset_root/
├── meta/
│ ├── info.json # features / 路径模板 / fps / 自定义标注层
│ ├── episodes.jsonl # 每 episode:索引、任务、帧数
│ ├── episodes_stats.jsonl # 每 episode 的数值统计
│ ├── tasks.jsonl # 任务描述
│ └── annotations.json # 可选:原始信息、标签、审核数据
├── data/
│ └── chunk-000/
│ ├── episode_000000.parquet # 一个文件 = 一个 episode
│ └── ...
└── videos/
└── chunk-000/
└── observation.images.top_head/
├── episode_000000.mp4 # 一个文件 = 一路相机 × 一个 episode
└── ...
关键差别在于标注被塞进了 info.json 的自定义字段:instruction_segments、key_frame、high_level_instruction、take_over、h5_path、camera_parameters。这让「长时序 episode + 多段指令」和「标准 LeRobot 单指令 episode」之间产生了矛盾——LeRobot 的一条 episode 只对应一个 task。
官方给的解法是 split_episode.py:按 Task Frame 把长 episode 切成若干条单指令 episode,同步切 Parquet、用 FFmpeg 抽对应视频段、重写四个 meta 文件。
# 前置:Python 3.8+ / PATH 里有 ffmpeg / pip install pyarrow numpy
python split_episode.py <input_dataset_path> \
--output_path <out> \
--num_workers 4
# 官方示例:原始 2 个 episode(分别含 1 段和 4 段)→ 拆分后 5 个 episode
「原始格式保留长时序与多层标注,拆分格式兼容标准训练脚本」——这是把研究需求和工程兼容解耦的标准做法。你不必在两者之间选,而是保留母版、按需派生。代价是同一份数据在磁盘上会出现两份(拆分会复制视频段),48 TB 量级下这个代价不小。
4.7统计口径:三个数字不能直接比较
关于这份数据集,网上流传的数字有多个版本,差异来自口径而非错误。引用前请确认你用的是哪一个:
| 数字 | 出现在哪里 | 口径说明 |
|---|---|---|
| 1,001,552 | 论文 / 数据卡 | Beta 的轨迹条数 |
| 1,003,672 | 第三方索引站 | 同期统计的另一个快照值,差异约 0.2%,属版本漂移 |
| 737k rows | Hugging Face 数据集查看器 | 查看器解析出的样本行数,不等于 episode 数。LeRobot 格式下真实 episode 数应读 meta/info.json 的 total_episodes |
| 2,976.4 h | 论文 | Beta 总时长;Alpha 更新后为 595.31 h(原 474.12 h) |
| 48.1 TB / 8.5 TB | HF 仓库体积 | Beta / Alpha;2026 版随分期增长,无单一总数 |
「1M+」是营销口径下的安全写法;写论文请用 1,001,552 并标注版本与访问日期。 | ||
还有一处需要提醒:「100 万条」和「2,976 小时」放在一起,意味着平均每条只有 10.7 秒。但论文又说平均单条 30—60 秒。这两个数字矛盾,原因大概率是大量短任务(抓取、放置、开关)拉低了平均,而「30—60 秒」指的是长时序任务子集。看到「平均时长」这类指标时,先确认它是全集中位数、均值,还是某个子集的均值。
怎么用:从下载到第一次训练
先说一句不客气的话:这份数据集的下限很低,上限很高。下限低是因为下载就要几十 TB,一不小心就把磁盘塞满;上限高是因为它的标注结构足够你做层次策略、技能发现、恢复学习三种不同研究。
5.1三种下载方式
按「我要干什么」选,不要按「哪个方便」选。
# 方式 A:先看结构(7 GB 样本包,强烈建议从这里开始)
# 在仓库根目录找 sample_dataset.tar,解压后结构与全量完全一致
# 方式 B:只下一个任务(推荐;48 TB 全量对绝大多数人没有意义)
git lfs install
git init AgiBotWorld-Beta && cd AgiBotWorld-Beta
git remote add origin https://huggingface.co/datasets/agibot-world/AgiBotWorld-Beta
git sparse-checkout init
git sparse-checkout set observations/327 task_info/task_327.json \
proprio_stats/327 parameters/327 scripts
git pull origin main
# 方式 C:全量(先确认磁盘,Beta 约 48.1 TB)
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/datasets/agibot-world/AgiBotWorld-Beta
# 先只拉指针,再按需 smudge —— 否则 git 会在没有任何提示的情况下跑到磁盘满
① 仓库是 gated 的,未在页面申请访问前,git clone 会要账号密码然后 403;② 文件数极多(每 episode 四个目录),git lfs 的 inode 与元数据开销比文件本身还烦,建议直接用 huggingface-cli download --repo-type dataset 配 --include 过滤;③ 解压/解码是 IO 瓶颈,48 TB 在机械盘上光 git lfs pull 就要按天算。
5.2转成 LeRobot(Alpha / Beta 必须做)
pip install -e ".[aloha]" # 或用官方推荐的 lerobot 安装方式;转换脚本依赖 lerobot 数据集 v2.0
python scripts/convert_to_lerobot.py \
--src_path /data/agibotworld/beta \
--task_id 352 \
--tgt_path /data/lerobot/agibot_task352
注意 --task_id 是必填的:转换脚本一次只处理一个任务。想转全量就得循环 217 次,每次都会重新读一遍 lerobot 的写入器,耗时以天计。2026 版不需要转换——它本身就是 LeRobot v2.1,只需要按需跑 split_episode.py。
5.3训练前必须做的五件事
| 决策 | 为什么必须显式决定 | 建议默认值 |
|---|---|---|
| 用 state 还是 action 作为监督 | state 是「实际发生的」,action 是「下发的」。两者有时间差,且 action 更接近部署时的输入形式 | 训练策略用 action;做世界模型用 state;两者都用时留一个 delta 特征 |
| 夹爪怎么归一化 | state 是毫米、action 是 0—1。混用不会报错,只会让策略学不到夹爪动作 | 统一到 0—1 后逐维 z-score;夹爪单独用 min-max |
| 动作空间选末端还是关节 | 末端位姿(14 维含四元数)跨任务更稳;关节角(14 维)保真但依赖本体 | 双臂操作用末端 + 夹爪;灵巧手任务用关节 |
| 多相机怎么用 | 8 路全喂进去显存撑不住,且绝大多数帧的后视/鱼眼没有信息量 | 头部前视 + 双腕三路,共 3 路;其余作为蒸馏或多视角一致性目标 |
| 失败与恢复段留不留 | 留着会拉低平均回报,丢了会失去唯一的恢复监督 | 按 key_frame.comment == "Failure recovery" 打标,训练时按 1:4 采样,别直接丢 |
5.4一段体检脚本
拿到任何一条 episode,先跑这个,确认形状、单位、帧数对齐。这几行能挡掉后面 80% 的「训练不收敛」。
import h5py, json, numpy as np
ep = "proprio_stats/327/648642/proprio_stats.h5"
with h5py.File(ep, "r") as f:
n = f["/state/joint/position"].shape[0]
print("frames", n)
for k in ["/state/joint/position", "/state/end/position",
"/state/end/orientation", "/action/joint/position"]:
print(k, f[k].shape, f[k].dtype)
# 1) action 的 index 数组比帧数短 → 别按行号硬对齐
idx = f["/action/joint/index"][:]
print("action idx", idx.shape, idx[:3], idx[-1])
# 2) 夹爪语义:state 是毫米,action 是 0—1
g_s = f["/state/effector/position"][:, 0]
g_a = f["/action/effector/position"][:, 0]
print("state gripper mm", g_s.min(), g_s.max())
print("action gripper 0-1", g_a.min(), g_a.max())
# 3) 四元数是不是 xyzw;norm 应接近 1
q = f["/state/end/orientation"][:10, 0, :]
print("quat norm", np.linalg.norm(q, axis=1).round(3))
# 4) 语言标注:键名是 lable_info
meta = json.load(open("task_info/task_327.json", encoding="utf-8"))
e0 = meta[0]
print(e0.keys(), len(e0.get("lable_info", {}).get("action_config", [])))
如果你把 /action/*/index 当成 range(N) 直接用,训练通常不会报错,但会系统性地错位几十到几百帧——表现为「策略在动作发生前一秒就开始动」。这个 bug 在 loss 曲线上完全看不出来,只能靠回放视频发现。
它撑起了什么:从数据到赛道的闭环
单独看,它是一个数据集;放进智元的整体布局看,它是这个闭环的起点。这也是判断「一个数据集会不会持续维护」的最好指标——如果它只被用来发一篇论文,两年后就没人管了;如果它是一整套设施的地基,就会被持续修。
| 名称 | 类型 | 与数据集的关系 | 关键数字 / 注意 |
|---|---|---|---|
| GO-1 | 策略模型 | 在 AgiBot World 上训动作专家;隐式规划器先在含人类视频的异构数据上学,再用本数据集落地 | 3B / 30 Hz 动作块 / 比 OXE 预训练 +30%;权重 CC BY-NC-SA |
| GO-1-Air | 轻量开源版 | 同一系列的精简发布 | 独立检查发现 latent_planning: false,隐式规划器权重未随开源发布 |
| EWMBench | 世界模型基准 | 测试样本直接从 AgiBot World 里挑:家居/工业/医疗 10 类任务、300+ 样本、30% 低光照与遮挡 | 三维:场景一致性(DINOv2 余弦)、动作合理性(HSD/nDTW/Dynamics)、语义对齐(MLLM+CLIP) |
| EVAC | 世界模型 | 用含失败轨迹的 AgiBot 数据训练,抑制幻觉;生成数据反哺策略 | 加 30% 合成数据,成功率 0.28 → 0.36 |
| CHALLENGE | 赛事 | 两个赛道:Reasoning to Action(仿真+真机)、World Model(3 万+ 轨迹训视频模型) | ICRA 2026:27 国 526 队,冠军 0.829 / 0.885;奖池 53 万美元 |
官方宣传是「全面开源」,但第三方对发布权重的检查显示:开源的是 GO-1-Air,走的是「VLM → 扩散动作专家」两段式,隐式规划器没有激活,训练好的 planner 权重也没放出来。也就是说,ViLLA 架构里最关键的那一层,开源版是缺的。这不影响你用它做微调,但影响你复现论文里「加隐式规划器 +0.12」那个结论。读模型卡时要看 config 里的 latent_planning 字段,不要只看宣传语。
缺陷与陷阱:十一条,按踩到的概率排序
这一节是全文最该被收藏的部分。前五条是「一看就知道」,后六条是「踩了也不知道」。
| # | 问题 | 具体表现 | 怎么绕 |
|---|---|---|---|
| 1 | 非商用许可 | CC BY-NC-SA 4.0:不能商用,衍生数据集必须同许可,且需在 HF 申请访问。用它的权重训出的产品,法律状态并不清晰 | 商用前单独谈授权;学术使用保留许可与引用 |
| 2 | 体量与 IO | 48 TB、上百万小文件;机械盘基本不可用,LFS 拉取以天计 | 稀疏检出单任务;只用样本包做开发;训练前转 LeRobot 并缓存到本地 SSD |
| 3 | action index 错位 | /action/*/index 比帧数短,按行号硬对齐会整体错位 | 用 index 做重采样索引,别用 range(N) |
| 4 | 夹爪单位不对称 | state 是毫米开口,action 是 0—1(0 开 1 闭)。混用不报错,策略学不到夹爪 | 统一到 0—1;夹爪维度单独归一化 |
| 5 | 力/力矩字段为空 | effector/force、joint/effort、end/wrench 存在但标 Not available | 当它不存在;要做力控,另找 RH20T 一类带力真值的数据 |
| 6 | 位姿维度被裁剪 | robot position 的 z 恒为 0,orientation 只有 yaw;head 只有 2 自由度 | 不要用它做 SLAM / 6DoF 定位研究 |
| 7 | 深度要逐帧对齐 | 深度是逐帧 PNG,视频是 MP4;帧率一致但编码丢帧会导致错位 | 用 timestamp 对齐,别用帧号;alpha 更新版剔除过丢帧 episode,有清单 |
| 8 | 标注键名拼写 | JSON 里是 lable_info,不是 label_info | 读之前先 print(keys()) |
| 9 | 语言标注滞后 | Alpha 早期版本 action_text / description 为空,后补 | 检查标注覆盖率;引用时标版本日期 |
| 10 | 文档漂移 | Beta 页面里的 clone 命令仍指向 Alpha 仓库 | 以仓库 URL 为准;比对本页表 4-1 |
| 11 | 统计口径不一致 | 1,001,552 / 1,003,672 / 737k rows 三个数;平均时长 10.7 s 与「30—60 s」并存 | 引用时写清「哪个仓库、哪天、哪份文件」 |
还有一条不在表里,但影响最大:它评估不了自己。这份数据没有官方划分的训练/测试集,也没有统一的任务成功率协议。你想报「在我的模型上,AgiBot World 的成功率是多少」,得自己定义测试集、自己定成功判据、自己跑 100 次——而你划分的测试集,别人无法复现。这正是 EWMBench 和 CHALLENGE 存在的理由:把「谁来定义评测」这件事,从使用者手里拿走。
发展趋势:六条正在发生的转向
把 2024 年 12 月的 Alpha 和 2026 年 10 月的第四期放在一起看,两年里发生了六次方向调整。这些调整不是智元一家的,而是整个具身数据领域的共同转向。
| 维度 | 过去(2024—2025) | 现在(2026) | 为什么 |
|---|---|---|---|
| 数据内容 | 只收成功示范 | 主动保留失败、形变、飞溅、滑落 | 世界模型需要「动作导致什么」的因果样本,失败样本的信息量高于成功样本 |
| 数据来源 | 专家遥操作 | 专家示教 + 模型 rollout + 人类接管纠正 | 真机 RL 需要「策略自己的错误」,而专家不会犯这些错 |
| 任务设计 | 按操作难度分级 | 按决策复杂度分级:同一目标、多状态分支 | 抓取已经能做了,卡住的是「先判断再动手」 |
| 标注粒度 | 一句任务指令 | 任务 / 技能段 / 关键帧 / 物体框 + 过程状态 | 层次策略、过程奖励、物体条件策略各自需要不同信号 |
| 虚实关系 | 真机采、仿真补 | 1:1 数字孪生同步开源,同一场景双份数据 | 仿真便宜但不真,真机真但贵;配对起来才能量化 sim2real gap |
| 发布单位 | 一个巨大的数据包 | 按研究主题分期,各期独立 schema | 一套数据服务不了四个方向;宁可牺牲统一性 |
三条更宏观的趋势判断
第一,数据集正在从「训练素材」变成「评测基础设施」。DROID 只有 7.6 万条,却比 300 万条的 ARIO 更常被当作零样本评测集——因为它固定了本体,分数才可比。AgiBot World 走的是同一条路,只是用「赛事 + 基准」把这件事做得更彻底。这意味着未来评价一个数据集,指标会从「多少小时」变成「多少人拿它做过评测」。
第二,标注体系正在成为真正的护城河。数据可以再采,模型权重会过时,但「技能段怎么切、过程状态怎么标、失败怎么定义」这套东西一旦成为社区共识,后来者只能兼容它。第三期那 98,159 段子任务区间、26,493 段干扰片段、5,795 段错误状态、10,684 段人工接管,比「11,430 条轨迹」重要得多——轨迹可以复制,这套标注口径不能。
第三,许可是这个生态最大的未解矛盾。所有版本都是 CC BY-NC-SA 4.0。学术上没问题,产业上等于「只能用来看」。而具身智能的落地恰恰在产业侧。2026 年的一个明显信号是:数据在往「全状态、全场景、可复现」走,但许可一步没松。这条张力迟早要解——要么出商用授权版本,要么出「商用可用但规模较小」的平行数据集。
2026 版的四期数据,规模都比 Beta 小得多(第三期只有 11,430 条),但标注密度高一个数量级。这说明领域正在从规模竞赛转向信号密度竞赛:一条带 8 段子任务标注、3 段接管记录的轨迹,对 RL 研究的价值可能超过 100 条干净的成功示范。这个转向如果成立,「百万条」这个卖点会迅速贬值。
三个判断
一、它是目前「同质性 × 规模」这条轴上唯一的选择,但只在 G1/G2 上有意义。如果你的目标是训一个能在自家机器人上跑的策略,它的价值主要体现在「预训练权重 + 格式参考」,而不是「直接拿来训」。跨本体重定向的工作量,往往大于自己采 500 条数据的成本。
二、真正值得学的是它的标注体系,不是它的数据量。四层结构、技能段切分、失败恢复标注、过程状态标注——这些设计可以直接搬到你自己那几百条数据上,成本很低,收益很大。很多团队采了几千条数据却训不出东西,问题常常不在数据量,在「只有一句任务指令,没有段级切分」。
三、把它当评测集会踩坑,因为它没有官方划分。要用它做评测,你得自己定义测试集与成功判据,而这样的分数别人复现不了。想报可比的数,走 EWMBench 或 CHALLENGE 的口径;想报自己的数,把划分和协议一起开源。