Hugging Face · agibot-world · 数据卡解读

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 申请访问。

00 — 一句话

为什么这个仓库值得单独读一遍

机器人学习的数据集大致有三条路:拼盘(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 万条」。先看它的排除项:只有一种本体、场景是搭出来的、许可是非商用、力/力矩字段是空的。这四个排除项决定了你拿它能做什么、不能做什么。规格表在第四章,陷阱清单在第七章——如果你只读两处,读那两处。

01 — 定位

它是什么:一个数据集,还是一个基础设施

1.1三个身份,别混为一谈

它是数据集
Hugging Face 上的 agibot-world/AgiBotWorld-Alpha、-Beta、AgiBotWorld2026 三个仓库,共 50 TB 量级的视频、深度、本体状态与动作。
它是平台
论文标题里的词是 platform:硬件(G1/G2)+ 场地(五个域复刻)+ 采集流程 + 标注体系 + 转换工具 + 仿真孪生。缺任何一块,数据都产不出来。
它是赛道底座
AGIBOT WORLD CHALLENGE(IROS 2025 → ICRA 2026)的两个赛道、EWMBench 世界模型评测,都长在这份数据上。

它不是 benchmark——虽然派生出 benchmark;也不是模型——GO-1 是它的伴生模型,不是它本身。把它当「一个下载链接」会用错;把它当「一套产数据的制度」才用得对。

1.2三代版本:从十万条到五期主题

三代不是简单的「加量」,而是三次目标切换:Alpha 证明能产,Beta 证明能量产,2026 证明能按研究方向定制。

2024-12 Alpha 36 任务 · 10 万条 595 h · 8.5 TB 2025-03 Beta 217 任务 · 100 万条 2,976 h · 48.1 TB 03 · GO-1 ViLLA 05 · EWMBench + EVAC 2026-06 AGIBOT WORLD 2026 G2 · LeRobot v2.1 五期主题制 ① 模仿 ② 交互 ③ 强化 ④ 推理 ⑤ 未发布 三代的目标切换:能产 → 能量产 → 能按研究方向定制 2026 版四期分别于 6 月、6 月、9 月、10 月发布
时间线只标主线。Alpha 的时长从 474.12 h 更新到 595.31 h(补入交互物体、剔除丢帧、修正外参),这类修订在数据集中很常见,引用数字时要标版本。
02 — 问题

它针对的是什么问题

论文明说了一句很关键的话:现有基准「受限于受控环境中的短程任务,且缺乏感知能力」。这句话可以拆成五个具体的缺口,每一个都对应一个设计决定。

2.1五个缺口与它的回应

表 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,但这是「两台机器人配合完成一个任务」,不是「机器人在有人走动的环境里工作」。
  • 语言的多样性。指令来自模板化标注,不是众包的自然语言。同义表述、模糊指代、口语化请求,这份数据教不了。
03 — 原理

设计原理:六个决定,六组代价

把数据集的设计拆开看,真正有信息量的不是「我们采了很多」,而是「我们在这里做了选择,并接受了它的代价」。以下六条,每条都能在 README、论文或数据卡的细节里找到对应证据。

3.1决定一:把硬件做成标准件

G1 的配置是:双 7-DoF 臂(合计 14 自由度)+ 2-DoF 腰(pitch + lift)+ 2-DoF 头(pitch + yaw)+ 全向移动底盘 + 6-DoF 灵巧手(左右各 6)+ 视触觉传感器 + 8 路相机。所有 100 台机器人是同一型号、同一相机布局、同一标定流程。

为什么
数据的可比性来自硬件的一致性。OXE 的问题不是数据少,是每份数据的「尺子」都不一样——同样的动作张量,在两种本体上含义不同,模型只能学到最粗糙的共同部分。
换来什么
所有 episode 的 state 与 action 张量形状完全一致(14 关节 + 2 腰 + 2 头 + 2 末端 + 2/12 夹爪),可以直接拼 batch,不需要任何重定向层。
代价
形态多样性归零。你在它上面训出的策略,换一台机器人就失效;而「跨本体」恰恰是具身智能最想要的能力。这个代价它用另一种方式补:2026 版把 1:1 数字孪生场景一起开源,让虚实迁移有地方验证。

3.2决定二:把场景复刻成片场

五个域——家居、零售、工业、餐饮、办公——共 106 个场景、3,000 多个物体、总面积超过 4,000 平方米。注意这些数字的关系:106 个场景摊在 5 个域里,平均每域 21 个;3,000 个物体摊在 217 个任务里,平均每任务约 14 个可交互物体。

这个比例是刻意的。太少,模型记不住物体外观的多样性;太多,同一任务内的方差会盖过任务本身的信号。一个任务配十几个物体,刚好够让模型学到「抓杯子」而不是「抓这个杯子」。

这条设计最容易被误读的地方

「真实场景」指的是物理真实(真的杯子、真的水、真的布料),不是分布真实(这个杯子出现在谁家厨房、以什么频率出现)。片场里的真实,是把真实世界的高频模式浓缩进一个可控空间。所以拿它做「家庭服务机器人的能力上限」推断,会系统性高估。

3.3决定三:三段式流水线,人在三个位置

官方给的流程图里,人是三个角色:采集前的场景验证者、采集中的遥操作员、采集后的质检与标注者。这不是「人工参与」,而是把质量责任分配到三个不同环节。

场景配置 物体 / 初始位姿 光照 / 干扰 遥操采集 专家操作员 8 路相机 + 本体 云端标注 技能段 / 关键帧 失败恢复 / 物体框 质检 逐条人工审核 丢帧 / 外参 / 隐私 打包发布 HDF5 / LeRobot 脱敏 + 压缩 人介入点:场景验证 · 遥操作 · 标注 · 质检 —— 四个环节都有「人判断对不对」,这既是质量来源,也是成本来源 不合格轨迹回流重采(含失败恢复的补采) 近端(现场) 云端
图 3-1 论文里的采集流程(Edge:遥操训练 → 采集 → 有效性验证 → 上传;Cloud:标注 → 失败恢复判定 → 入库)。红色虚线是真正决定数据质量的回路:不合格的轨迹要回到采集端重采,而不是在训练时筛掉。

这条流水线解释了一件常被问的事:为什么这份数据 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 的标注结构是四层的,这是整套设计里工程量最大、也最容易被使用者忽略的部分。

L1 · EPISODE task_name / init_scene_text:任务名 + 初始场景的一句话描述("The robot is in front of the fruit shelf...") L2 · SEGMENT action_config[]:技能段列表,每段带 start_frame / end_frame / skill / action_text Pick 0–435 Place 435–619 Recover Place L3 · KEY FRAME 关键帧区间 + 说明(如 "Failure recovery") 用于定位「哪一段值得特殊处理」 L4 · OBJECT 2026 版新增:2D bounding box + 属性 类别 / 左右臂 / 归一化坐标 / 相机名 四层对应四种训练目标:任务条件(L1)· 技能切分与层次策略(L2)· 失败检测与恢复(L3)· 物体条件与抓取选择(L4) 注意:L2 的键在 README 里写作 lable_info(拼写如此),照 label_info 取会得到 None
图 3-2 一个 episode 内部的三层时间结构,加上 2026 版新增的物体层。四层不是冗余,是四个不同的监督信号。

为什么非要做这么细?因为「一句话指令 → 一整条轨迹」这个映射里,模型的梯度会被平均掉:一条 40 秒的轨迹里,抓取只占 5 秒,放置占 3 秒,剩下的都是移动。如果只给任务级标签,模型学不到「什么时候该合爪」这种原子决策。技能段切分让每个原子技能有独立的监督,这才是 action_config 存在的真正理由。

3.6决定六:2026 年改成「五期主题制」

这是最重要的一次转向。2026 版不再是「一个大包」,而是围绕五个具身研究主题分期发布,每期有自己的采集方法、标注体系、甚至自己的研究目标。

每一期解决一类「模型缺什么」,而不是「数据少什么」 ① 2026-06 模仿学习 · Imitation Learning 商业与服务场景为主,数百小时真机;任务级描述 + 动作序列 + 原子技能标签 + 物体框;保留 error-recovery 轨迹 ② 2026-06-03 多样交互 · Rich Interaction 面向世界模型 / 神经仿真器:主动保留抓取失败、滑落、碰撞、液体飞溅、布料形变;刚体 / 柔体 / 流体 / 铰接件 ③ 2026-09-01 真机强化学习 · Reinforcement Learning 11,430 条轨迹 / 14 类任务;成功 rollout 1,024 + 失败 rollout 1,369 + 人工接管 10,684 段 98,159 段子任务区间标注,每段带完成状态 ④ 2026-10-22 物理推理 · Physical Reasoning 任务设计从「操作难度」转向「决策复杂度」:同一目标在多状态 / 多约束下的分支,10+ 类推理场景,9 项推理能力,Easy/Medium/Hard ⑤ — 第五期:官方称共五期,截至 2026-11-01 尚未发布 按前三期的节奏推断,可能指向仿真 / 虚实迁移或跨本体方向,但官方未确认
图 3-3 五期主题。注意第二期和第三期的差别:第二期保留的是「物理过程的不理想」(失败、形变、飞溅),第三期保留的是「模型自己的不理想」(rollout 失败、人类接管)。一个是世界的不确定性,一个是策略的不确定性。

这个转向的意义,比它发布的任何数字都大。它意味着数据集的设计单位从「小时」变成了「研究问题」:

  • 要训模仿学习策略 → 用第一期,标注是任务级 + 技能级。
  • 要训世界模型 → 用第二期,需要的是「动作导致什么」,失败和形变恰恰是最有信息量的样本。
  • 要做真机 RL → 用第三期,需要的是过程奖励信号,不是成功示范。
  • 要做长时序决策 → 用第四期,需要的是「同一目标的不同路径」,不是「同一路径的不同执行」。
代价同样明显

五期数据不能直接混训。本体从 G1 换到 G2、格式从自定义 HDF5 换到 LeRobot v2.1、标注 schema 每期都不一样、动作空间定义也可能变。想跨期使用,你得自己写一层归一化——而这一层目前没有官方实现。这是「按主题发布」这种策略的固有成本:灵活性换掉了统一性。

04 — 规格

数据集规格:三套格式,三种口径

这一章是「可以拿去写代码」的部分。三代的格式完全不同,混用是最常见的错误来源,所以先给对照表,再逐层展开。

4.1三代对照

表 4-1 Alpha / Beta / 2026 三个仓库的规格对照
维度AgiBotWorld-AlphaAgiBotWorld-BetaAgiBotWorld2026
首发2024-12-302025-03-012026-06 起,分期
定位可运行的最小完整版百万级主发布按研究主题分期的系列
机器人G1(双 7-DoF 臂 + 腰 + 底盘)G1,100 台G2(WBC + 力控 + 灵巧手)
轨迹数10 万+(更新后)1,001,552分五期,各期独立统计
时长474.12 h → 595.31 h2,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,gatedCC BY-NC-SA 4.0,gatedCC BY-NC-SA 4.0,gated
配套工具convert_to_lerobot.py同 Alphasplit_episode.py
样本包≈7 GB sample_dataset.tar≈7 GB≈7 GB(单任务 tar.gz)
文档里的一个真实 bug,会坑到很多人

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(下发给硬件的指令),两者结构对称但语义不同。官方特别强调了一句:下发的指令与实际执行的状态之间存在差异。这句话决定了你做模仿学习时该取哪一路。

表 4-2 state 分支:字段、形状、单位
字段形状含义与单位
/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" }
      ]
    }
  }
]
task_name
任务级短标签,通常是模板句。适合做任务分类,不适合做指令跟随。
init_scene_text
初始场景的一句话描述。这是这份数据里唯一提供「世界状态先验」的文本,做场景条件策略时有用。
action_config
技能段列表,每段带起止帧、原子技能名(87 类之一)、段级指令。这是层次策略训练的关键字段。
key_frame
关键帧区间与说明。目前最常见的值就是 "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 的自定义目录更规范:

表 4-3 2026 版相机通道键(LeRobot 命名)
键名视角用途
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统计口径:三个数字不能直接比较

关于这份数据集,网上流传的数字有多个版本,差异来自口径而非错误。引用前请确认你用的是哪一个:

表 4-4 常见数字的三种口径
数字出现在哪里口径说明
1,001,552论文 / 数据卡Beta 的轨迹条数
1,003,672第三方索引站同期统计的另一个快照值,差异约 0.2%,属版本漂移
737k rowsHugging 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 TBHF 仓库体积Beta / Alpha;2026 版随分期增长,无单一总数
「1M+」是营销口径下的安全写法;写论文请用 1,001,552 并标注版本与访问日期。

还有一处需要提醒:「100 万条」和「2,976 小时」放在一起,意味着平均每条只有 10.7 秒。但论文又说平均单条 30—60 秒。这两个数字矛盾,原因大概率是大量短任务(抓取、放置、开关)拉低了平均,而「30—60 秒」指的是长时序任务子集。看到「平均时长」这类指标时,先确认它是全集中位数、均值,还是某个子集的均值。

05 — 上手

怎么用:从下载到第一次训练

先说一句不客气的话:这份数据集的下限很低,上限很高。下限低是因为下载就要几十 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训练前必须做的五件事

表 5-1 数据接入的五个决策点
决策为什么必须显式决定建议默认值
用 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 曲线上完全看不出来,只能靠回放视频发现。

06 — 生态

它撑起了什么:从数据到赛道的闭环

单独看,它是一个数据集;放进智元的整体布局看,它是这个闭环的起点。这也是判断「一个数据集会不会持续维护」的最好指标——如果它只被用来发一篇论文,两年后就没人管了;如果它是一整套设施的地基,就会被持续修。

AgiBot World 真机数据 · 标注体系 · 格式 GO-1 / GO-1-Air ViLLA:VLM + 隐式规划 + 动作专家 3B · 30 Hz · 30 步动作块 EVAC 动作条件世界模型 数据增广 +29% 成功率 EWMBench 场景 / 动作 / 语义 三维 300+ 样本 · 30% 挑战场景 WORLD CHALLENGE IROS 2025 → ICRA 2026 双赛道 · 27 国 · 526 队 训练 学物理 评测 打榜 回流:赛事的提交与失败案例又成为下一期数据的选题依据
图 6-1 四件套互相咬合。判断一个数据集是否「活着」,看它有没有这种东西:有下游模型、有独立评测、有外部参赛者,三者缺一,维护动力就会消失。
表 6-1 建在 AgiBot World 上的五个产出物
名称类型与数据集的关系关键数字 / 注意
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 开源的一个必须说清的事实

官方宣传是「全面开源」,但第三方对发布权重的检查显示:开源的是 GO-1-Air,走的是「VLM → 扩散动作专家」两段式,隐式规划器没有激活,训练好的 planner 权重也没放出来。也就是说,ViLLA 架构里最关键的那一层,开源版是缺的。这不影响你用它做微调,但影响你复现论文里「加隐式规划器 +0.12」那个结论。读模型卡时要看 config 里的 latent_planning 字段,不要只看宣传语。

07 — 边界

缺陷与陷阱:十一条,按踩到的概率排序

这一节是全文最该被收藏的部分。前五条是「一看就知道」,后六条是「踩了也不知道」。

表 7-1 使用 AgiBot World 的十一处风险
#问题具体表现怎么绕
1非商用许可CC BY-NC-SA 4.0:不能商用,衍生数据集必须同许可,且需在 HF 申请访问。用它的权重训出的产品,法律状态并不清晰商用前单独谈授权;学术使用保留许可与引用
2体量与 IO48 TB、上百万小文件;机械盘基本不可用,LFS 拉取以天计稀疏检出单任务;只用样本包做开发;训练前转 LeRobot 并缓存到本地 SSD
3action 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 存在的理由:把「谁来定义评测」这件事,从使用者手里拿走。

08 — 趋势

发展趋势:六条正在发生的转向

把 2024 年 12 月的 Alpha 和 2026 年 10 月的第四期放在一起看,两年里发生了六次方向调整。这些调整不是智元一家的,而是整个具身数据领域的共同转向。

表 8-1 六条转向:从什么,到什么
维度过去(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 条干净的成功示范。这个转向如果成立,「百万条」这个卖点会迅速贬值。

09 — 结论

三个判断

一、它是目前「同质性 × 规模」这条轴上唯一的选择,但只在 G1/G2 上有意义。如果你的目标是训一个能在自家机器人上跑的策略,它的价值主要体现在「预训练权重 + 格式参考」,而不是「直接拿来训」。跨本体重定向的工作量,往往大于自己采 500 条数据的成本。

二、真正值得学的是它的标注体系,不是它的数据量。四层结构、技能段切分、失败恢复标注、过程状态标注——这些设计可以直接搬到你自己那几百条数据上,成本很低,收益很大。很多团队采了几千条数据却训不出东西,问题常常不在数据量,在「只有一句任务指令,没有段级切分」。

三、把它当评测集会踩坑,因为它没有官方划分。要用它做评测,你得自己定义测试集与成功判据,而这样的分数别人复现不了。想报可比的数,走 EWMBench 或 CHALLENGE 的口径;想报自己的数,把划分和协议一起开源。