• 正文
  • 相关推荐
申请入驻 产业图谱

具身智能 | 开源 VLA 数据集全景指南:从 LIBERO、RoboTwin 到智元 AgiBot World

13小时前
90
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

转载自公众号:敢敢AUTOHUB

0. 简介

开源 VLA(Vision-Language-Action)数据集 面向的是同一类机器人学习问题,却分成仿真评测、真机示范和跨本体聚合三条路线。LIBERO 强调 130 个语言条件任务上的迁移,RoboTwin 2.0 提供双臂仿真与强域随机化,智元 AgiBot World Beta 则扩展到 1,003,672 条真机轨迹。三者的体量、动作空间和文件格式并不兼容,不能只看“轨迹数”决定能否训练。下面从官方下载、解压结构、字段语义、许可边界和 LeRobot 转换五个层面,给出一套通用的数据准备路线。

很多数据集列表把轨迹数排成一列就结束了,但 VLA 训练真正关心的是:一条轨迹有没有语言指令,视觉是否覆盖头部和腕部视角,动作到底是关节位置、末端位姿还是相对位移,控制频率是否一致,训练集与评测环境能否闭环。数据集规模只是第一层指标,动作语义、时间同步和许可条件才决定它能否进入训练流水线。 本文因此把每个数据集都放回它原本解决的问题,而不是强行排出一个脱离任务目标的总榜。

1. 先把 VLA 数据集分成三类

1.1 Benchmark、训练语料与聚合库的职责不同

LIBERO、RoboTwin 和 CALVIN 首先是可复现实验环境与评测协议,下载示范数据只是为了训练策略并在同一套模拟器中回放;DROID、BridgeData V2、RoboSet、RH20T 和 AgiBot World 主要是真机轨迹语料,重点是场景、技能和传感器覆盖;Open X-Embodiment 则把多个来源包装成 RLDS,解决跨数据集读取问题。Benchmark 回答“模型能否完成任务”,训练语料回答“模型见过多少真实变化”,聚合库回答“异构数据如何被同一个输入管线消费”。 三类资源可以组合,但不能互相替代。

类别 代表数据集 主要用途 常见原始格式 是否自带闭环评测
仿真 benchmark LIBERO、RoboTwin 2.0、CALVIN 模仿学习、语言跟随、长程与泛化评测 HDF5、NPZ、图像或视频
真机训练语料 DROID、BridgeData V2、RoboSet、RH20T、AgiBot World 预训练、共训练、跨场景泛化 RLDS、HDF5、NPY、MP4、JPEG 通常否
跨本体聚合库 Open X-Embodiment 多来源统一读取、RT-X/Octo 类训练 RLDS/TFDS 各子集不同

1.2 一张图看清数据集版图

下面的概念图用于表达“资源职责”而非比较优劣:左侧三项是带环境的仿真 benchmark,中间五项是真机数据语料,右侧 Open X-Embodiment 是格式与数据来源的聚合层。直观理解是,同一套 VLA 工程往往需要左侧做可重复评测、中间做真实世界预训练,再通过右侧或 LeRobot 这样的统一格式降低 loader 复杂度。

直觉理解:把 VLA 数据工程想成驾校训练。仿真 benchmark 像标准化考试场地,保证每个人面对同样的路线;真机语料像驾驶里程,负责覆盖雨天、夜间和不同车辆;RLDS 或 LeRobot 像统一的档案表,让教练能按同一种方式读取记录。只积累里程而没有考试,无法稳定比较模型;只刷考场而没有真实变化,也很难部署。

2. 模型常常需要的目标格式

2.1 LeRobot 目录不是“有 data、meta、videos 就行”

常用的VLA基本都是使用 LeRobot wrapper 读取数据根目录。目标目录除了存在 data/meta/ 和 videos/,还必须让 meta/info.json 中的 features、fps、路径模板与磁盘文件一致;每个 episode 的 Parquet 行数、视频帧时间戳和 episodes.jsonl 也要互相对应。LeRobot 是一份可执行的数据契约,而不是三个同名文件夹。 当前 wrapper 的文档直接给出了下面这棵标准树,视频键还会成为中间一级目录名。

# LeRobot 官方:lerobot/src/lerobot/datasets/lerobot_dataset.py
dataset_root/
├── data/chunk-000/episode_000000.parquet
├── meta/
│   ├── episodes.jsonl
│   ├── info.json
│   ├── stats.json
│   └── tasks.jsonl
└── videos/chunk-000/
    ├── observation.images.cam_high/episode_000000.mp4
    ├── observation.images.cam_left_wrist/episode_000000.mp4
    └── observation.images.cam_right_wrist/episode_000000.mp4

进一步看,仓库把这些位置固化成常量,而不是在训练时猜目录。转换器应复用相同路径模板生成元数据和媒体文件;如果自行把视频放成 videos/episode_0/cam.mp4,哪怕内容正确,loader 也不会沿错误模板自动搜索。更稳妥的做法是从 info.json 读取 chunk 和 episode 模板,再据此写文件,并在转换结束后逐条验证元数据引用的相对路径确实存在,避免训练启动后才发现批量视频无法定位。

# lerobot/src/lerobot/datasets/utils.py
INFO_PATH = "meta/info.json"
EPISODES_PATH = "meta/episodes.jsonl"
STATS_PATH = "meta/stats.json"
TASKS_PATH = "meta/tasks.jsonl"

DEFAULT_VIDEO_PATH = (
    "videos/chunk-{episode_chunk:03d}/{video_key}/"
    "episode_{episode_index:06d}.mp4"
)
DEFAULT_PARQUET_PATH = (
    "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet"
)

2.2 default 是配置别名,不是 Parquet 字段后缀

很多训练框架的数据配置会把 state 和 action 的 key 写成 default。这里的关键是,wrapper 通常会把图像键拼成 observation.images.<key>,但会把 state 的 default 映射到裸键 observation.state,把 action 的 default 映射到裸键 action。因此目标 Parquet 应包含 observation.state 和 action,而不是 observation.state.default 与 action.default。这也是从其他数据集迁移到新框架时最容易出现的“目录都对但 KeyError”来源。

# 训练框架中的 LeRobot 数据集封装(示例)
for meta in self.state_meta:
    key = meta["key"]
    meta["lerobot_key"] = (
        f"observation.state.{key}"
        if key != "default" else "observation.state"
    )

for meta in self.action_meta:
    key = meta["key"]
    meta["lerobot_key"] = (
        f"action.{key}" if key != "default" else "action"
    )

典型的 RoboTwin 数据配置要求三个相机、14 维状态、14 维动作和文本任务。只有源数据本来就是 ALOHA 双臂 14 维关节向量时,才能保持这个 shape;LIBERO 的 7 维末端动作、DROID 的 Franka 动作或 AgiBot 的全身状态都需要重新定义 shape_meta 或经过明确的投影。不要用补零把不同本体伪装成 14 维同一种动作。 补零可以统一张量形状,却会抹掉关节、末端和底盘控制之间的语义差异。

# 数据配置示例:robotwin.yaml
shape_meta:
  images:
    - {key: cam_high, raw_shape: [3, 480, 640], shape: [3, 240, 320]}
    - {key: cam_left_wrist, raw_shape: [3, 480, 640], shape: [3, 240, 320]}
    - {key: cam_right_wrist, raw_shape: [3, 480, 640], shape: [3, 240, 320]}
  state:
    - {key: default, raw_shape: 14, shape: 14}
  action:
    - {key: default, raw_shape: 14, shape: 14}

2.3 dataset_stats.json 是训练归一化状态,不是数据集元数据的替代品

第一次训练可以把 pretrained_norm_stats 设为 null,训练集会计算统计量并写入当前 run 的 dataset_stats.json;验证集则复用训练统计量,不能在验证数据上重新估计。后续训练把该文件路径填回 train 与 val,可减少启动时间并保证动作尺度一致。换句话说,meta/stats.json 属于 LeRobot 数据目录的统计信息,而 run 目录中的 dataset_stats.json 是当前 processor 使用并留档的归一化状态,两者位置和消费者并不完全相同。

# 训练框架中的视频数据集封装
if not pretrained_norm_stats:
    dataset_stats = self.lerobot_dataset.get_dataset_stats(processor)
    save_dataset_stats_to_json(
        dataset_stats, os.path.join(work_dir, "dataset_stats.json")
    )
else:
    dataset_stats = load_dataset_stats_from_json(pretrained_norm_stats)

processor.set_normalizer_from_stats(dataset_stats)

3. LIBERO:适合先打通 VLA 训练闭环

3.1 官方数据与社区已转换版本

LIBERO 官方提供 130 个任务,分为 LIBERO-Spatial、LIBERO-Object、LIBERO-Goal 和 LIBERO-100;其中 LIBERO-100 又分 LIBERO-90 与 LIBERO-10,用来研究预训练后的持续学习。官方示范数据采用 CC BY 4.0,代码采用 MIT。原始环境通常使用 Franka 和 7 维末端笛卡尔动作,适合验证语言条件策略与长程迁移,但不适合不改配置就塞入 RoboTwin 的 14 维双臂接口。对刚搭好训练环境的用户来说,LIBERO 的价值是数据小、评测闭环完整、问题定位快。

社区常见的 LeRobot 转换结果中,libero_spatial_no_noops_lerobot 的 info.json 显示 434 个 episode、53,229 帧、20 fps、两路 512×512 视频、8 维 state 和 7 维 action。这些数字只代表某个预处理版本,不等于 LIBERO 官方全部原始示范规模。目录中的 meta/tasks.jsonl 保存 10 条语言任务,Parquet 与 AV1 编码 MP4 已按 episode 分片,可直接作为理解 LeRobot 结构的最小样板。

data/libero_mujoco3.3.2/
├── libero_10_no_noops_lerobot/
├── libero_goal_no_noops_lerobot/
├── libero_object_no_noops_lerobot/
└── libero_spatial_no_noops_lerobot/
    ├── data/chunk-000/episode_000000.parquet
    ├── meta/{info.json,tasks.jsonl,episodes.jsonl,episodes_stats.jsonl}
    └── videos/chunk-000/
        ├── observation.images.image/
        └── observation.images.wrist_image/

3.2 官方下载命令与使用建议

LIBERO 官方仓库已经把 Hugging Face 下载封装进脚本,优先使用 --use-huggingface,因为 README 明确提示原始链接可能过期。若只想先跑通一套任务,可下载 libero_spatial 或 libero_10 对应数据;如果目标是复现完整 lifelong 设置,再下载全部套件。这里值得注意,官方脚本得到的是 LIBERO 自己使用的数据格式,基于 LeRobot 的训练框架仍需要 LeRobot 版本或转换脚本,不能把下载目录直接填入 dataset_dirs 就期待 wrapper 自动识别。

git clone <https://github.com/Lifelong-Robot-Learning/LIBERO.git>
cd LIBERO
pip install -e .

# 下载全部官方示范
python benchmark_scripts/download_libero_datasets.py --use-huggingface

# 只下载一个套件
python benchmark_scripts/download_libero_datasets.py 
  --datasets libero_spatial 
  --use-huggingface

如果目标是快速上手训练,优先使用已经转好的 *_lerobot 目录,并从 meta/info.json 读取真实键名后单独建立 LIBERO 配置。官方 AgiBot World 仓库也提供了 evaluate/libero/convert_libero_data_to_lerobot.py,其输入是 OpenVLA 发布的 modified_libero_rlds,输出是 LeRobot;这条路线适合 GO-1 生态,但仍要检查生成版本是否与训练框架使用的 LeRobot 版本(如 v2.1)兼容。

4. RoboTwin 2.0:双臂仿真、数据生成与强域随机化

4.1 官方预采集数据与当前训练包不是同一个切面

RoboTwin 2.0 面向双臂操作,官方 README 展示 50 个任务,并在 Hugging Face 的 TianxingChen/RoboTwin2.0 仓库提供 超过 100,000 条预采集轨迹。官方同时建议用户按自己的本体、相机与域随机化设置重新采集,因为任务配置高度可变。社区常见的一个 LeRobot 预处理包则包含 27,500 个 episode、6,075,103 帧、82,500 个视频和 50 fps,三路相机分别是头部、左腕和右腕,state/action 都是 ALOHA 风格 14 维双臂关节向量。官方总数据规模与某个训练子集必须分开引用。

这类预处理包的 meta/info.json 有时会看到一个不寻常字段:total_tasks 为 921,032,而 episode 只有 27,500。结合 tasks.jsonl 中大量同义指令可以判断,这个预处理包把语言改写作为 task 索引扩展,而不是把 92 万理解成 92 万个物理任务。这里的关键是,训练时 task 是文本条件;评估时仍应按 RoboTwin 的物理任务、随机种子和域随机化设置划分,不能让语言改写数量污染任务泛化结论。

4.2 下载官方原始数据与社区预处理包

官方 Hugging Face 仓库以任务名作为 dataset/ 下一级目录。第一次不建议把整个仓库拉满,可以用 --include 只取一个任务,检查其 episode、HDF5 和视频结构后再扩展。试下载阶段还应随机打开一条轨迹,核对相机数量、控制频率、关节顺序、夹爪取值范围和语言任务名,这些信息会直接决定转换映射。下列命令使用 Hugging Face 官方 CLI 语法,仓库标识来自 RoboTwin README;具体 task 配置目录以下载当天的数据树为准。

pip install -U "huggingface_hub[cli]"
mkdir -p data/robotwin2_raw

# 先下载一个任务,避免直接拉取全量
huggingface-cli download TianxingChen/RoboTwin2.0 
  --repo-type dataset 
  --local-dir data/robotwin2_raw 
  --include "dataset/beat_block_hammer/**"

社区还提供一个预转换压缩包 yuanty/robotwin2.0-fastwam。它不是 RoboTwin 官方原始目录,而是针对特定训练框架键名整理的 LeRobot 包。下载后要确认真正的数据根是 data/robotwin2.0/robotwin2.0,不要把外层分片目录填进配置。判断根目录的标准是该层能同时看到 data/meta/ 和 videos/,并能直接读取 meta/info.json。若分片未下全,cat ... | tar 会在中途报错或解出不完整数据,因此解压后还要核对分片数量、归档退出码和元数据声明的 episode 总数。

mkdir -p data/robotwin2.0
huggingface-cli download yuanty/robotwin2.0-fastwam 
  --repo-type dataset 
  --local-dir data/robotwin2.0 
  --include "robotwin2.0.tar.gz.part-*"

cat data/robotwin2.0/robotwin2.0.tar.gz.part-* | 
  tar -xzf - -C data/robotwin2.0

4.3 从 RoboTwin 原始 HDF5 转成 LeRobot 时要保留什么

RoboTwin 采集代码先把每帧保存成 pkl,再合并为 episodeN.hdf5 与 episode 视频。帧内字典包含 observationpointcloudjoint_action 和 endpose;相机数据可含 RGB、深度、分割与标定,双臂关节向量放在 joint_action.vector。转换时至少要从连续帧提取三路 RGB、14 维状态与下一时刻动作,并把任务说明映射到 task_index。源 HDF5 中有更多模态时可以保留为附加 features,但不能让可选深度或点云破坏基础 RGB 训练路径。

# third_party/RoboTwin/envs/_base_task.py
pkl_dic = {
    "observation": {},
    "pointcloud": [],
    "joint_action": {},
    "endpose": {},
}

pkl_dic["joint_action"]["left_arm"] = left_jointstate[:-1]
pkl_dic["joint_action"]["left_gripper"] = left_jointstate[-1]
pkl_dic["joint_action"]["right_arm"] = right_jointstate[:-1]
pkl_dic["joint_action"]["right_gripper"] = right_jointstate[-1]
pkl_dic["joint_action"]["vector"] = np.array(
    left_jointstate + right_jointstate
)

5. 智元 AgiBot World:百万级真机数据要先解决访问与存储

5.1 Beta、Alpha 和 sample 的规模差异

AgiBot World 官方仓库列出的 Beta 版本包含 1,003,672 条轨迹,约 43.8 TB;Alpha 是精选子集,包含 92,214 条轨迹,仓库说明约 8.5 TB。技术报告给出的最新统计口径是 1,001,552 条轨迹、2,976.4 小时、217 个具体任务、87 类技能和 106 个场景,硬件包含双 7-DoF 手臂、移动底盘、可调腰部、夹爪或 6-DoF 灵巧手,图像和本体状态以 30 Hz 采集。不同页面的版本时间和压缩口径并不完全一致,下载预算应按数据卡当前文件列表计算,而不是只抄论文中的一个 TB 数字。

Hugging Face API 将 Alpha 标记为 gated 自动审批,用户要填写姓名、机构、研究方向并接受社区许可后才能取文件。数据与代码采用 CC BY-NC-SA 4.0,这意味着署名、非商业和相同方式共享三个约束都会传递到数据使用与衍生成果。准备企业产品或商用模型时,不能把“能下载”理解成“可商用”;应由项目负责人或法务结合官方协议确认训练模型的使用范围。

5.2 推荐先下 7 GB sample,再决定是否拉 Alpha

官方 Alpha 仓库根目录包含一个约 7.1 GB 的 sample_dataset.tar,这是最适合验证解析和转换脚本的入口。完成 Hugging Face 页面上的许可申请后,先登录 CLI,只下载 sample;确认本地字段、磁盘吞吐和转换时间都能接受,再按 task id 选择 observations/parameters/proprio_stats/ 与 task_info/。直接下载完整 Alpha 或 Beta 不只占用数 TB,还会产生大量解压、重编码和 Parquet 写入临时空间。

pip install -U "huggingface_hub[cli]"
huggingface-cli login

# 先下载官方 sample_dataset.tar
huggingface-cli download agibot-world/AgiBotWorld-Alpha 
  sample_dataset.tar 
  --repo-type dataset 
  --local-dir data/agibot_world_alpha_sample

mkdir -p data/agibot_world_alpha_sample/extracted
tar -xf data/agibot_world_alpha_sample/sample_dataset.tar 
  -C data/agibot_world_alpha_sample/extracted

官方 GitHub 还给出 OpenDataLab 入口,网络到 Hugging Face 较慢时可以用 openxlab CLI。两条下载路径对应同一项目,但账号授权、分片组织与断点续传行为不同;不要混用两个平台下载出的半套目录后直接转换。这里值得注意,官方 README 中的 huggingface-cli download --resume-download 仍可见,而新版 huggingface_hub 已默认支持断点续传,出现参数弃用提示时可以去掉该选项。

pip install openxlab
openxlab dataset get --dataset-repo OpenDriveLab/AgiBot-World

5.3 原始目录、转换脚本与 LeRobot 版本

Alpha 数据卡公开树显示原始仓库按模态拆成 observations/parameters/proprio_stats/ 和 task_info/observations/<task_id>/ 下面是按 episode id 范围切分的 tar,parameters/ 和 proprio_stats/ 也是大分片,任务说明以 task_info/task_<id>.json 保存;仓库还提供 gated 的 scripts/convert_to_lerobot.py。AgiBot World 主仓库说明其 GO-1 工程建立在 LeRobot dataset v2.1、commit 2b71789 上,多数基于 LeRobot 的训练框架方向一致,但转换后仍需核对 feature names、视频路径与 state/action 维度。

AgiBotWorld-Alpha/
├── observations/
│   └── 390/
│       ├── 648634-654682.tar
│       └── ...
├── parameters/
│   ├── 648533-663816.tar
│   └── ...
├── proprio_stats/648533-923022.tar
├── task_info/task_390.json
├── scripts/convert_to_lerobot.py
└── sample_dataset.tar

换句话说,AgiBot 原始数据不是开箱即用的 data/meta/videos。官方主仓库明确写着需要通过 any4lerobot 或数据卡脚本转换。典型的 RoboTwin 数据配置只接受三路 RGB 与 14 维双臂状态动作,而 AgiBot 还包含底盘、腰部、灵巧手、深度、标定和子任务注释;一个负责任的转换器应先选定本体和控制子空间,再写新的 shape_meta,不能为了兼容旧配置丢掉动作语义却不留 manifest。

6. CALVIN 与 Open X-Embodiment:长程评测和跨本体聚合

6.1 CALVIN 适合语言条件长程任务

CALVIN 是语言条件长程操作 benchmark,静态 RGB 为 200×200×3、夹爪 RGB 为 84×84×3,还可提供深度、触觉和本体状态;控制频率为 30 Hz,动作可选 7 维绝对末端位姿、7 维相对末端位移或 8 维关节加夹爪。官方脚本支持 D、ABC、ABCD 和 1.3 GB 的 debug 包。对 VLA 工程而言,D split 常用于标准评测,debug 包适合先验证依赖和数据读取;原始 NPZ 的 episode 索引和语言标注要在转换时展开成逐帧 Parquet。

git clone --recurse-submodules <https://github.com/mees/calvin.git>
cd calvin
export CALVIN_ROOT="$(pwd)"

cd "$CALVIN_ROOT/dataset"
sh download_data.sh debug   # 约 1.3 GB,用于管线检查
sh download_data.sh D       # 常用标准 split
task_D_D/
├── training/
│   ├── episode_0000000.npz
│   ├── ep_start_end_ids.npy
│   └── lang_annotations/auto_lang_ann.npy
└── validation/
    ├── episode_*.npz
    ├── ep_start_end_ids.npy
    └── lang_annotations/auto_lang_ann.npy

6.2 Open X-Embodiment 统一的是容器,不是动作空间

Open X-Embodiment 把多个机器人数据集封装成 RLDS episode format。每个 episode 包含一个 steps 数据集,step 内通常有 observationactionlanguage_instructionis_firstis_last 和 is_terminal 等字段;具体相机键、状态维度和动作语义仍由子数据集决定。RLDS 统一了读取方式,并没有把 Franka、WidowX、ALOHA 和移动双臂变成同一个控制向量。 训练 RT-X 或 Octo 时使用的标准化动作,需要额外的 dataset-specific transform。

官方 README 给出的本地下载方式是从 Google Cloud Storage 复制指定 dataset builder,再用 tfds.load 读取。{dataset_name} 必须替换为官方 spreadsheet 中的准确名称和版本,第一次建议先在 Colab 可视化少量 episode,确认键名后再复制到本地。各贡献数据集还要分别引用,其许可不能被聚合仓库的 Apache 2.0 代码许可覆盖。

# 安装 Google Cloud CLI 后,只复制需要的一个子数据集
gsutil -m cp -r 
  gs://gdm-robotics-open-x-embodiment/{dataset_name} 
  "$HOME/tensorflow_datasets/"
# Open X-Embodiment 官方 RLDS 读取方式
import tensorflow_datasets as tfds

ds = tfds.load("{dataset_name}", split="train")
for episode in ds.take(1):
    for step in episode["steps"].take(1):
        observation = step["observation"]
        action = step["action"]

7. DROID 与 BridgeData V2:真实场景和可迁移桌面技能

7.1 DROID 的优势是场景与相机位姿多样性

DROID 官方项目页给出 76,000 条示范、350 小时交互、564 个场景和 86 类任务,由 50 名采集者在 13 个机构使用统一 Franka Panda 平台完成。硬件包含两台可调 ZED 2 双目相机和一台腕部 ZED Mini,官方还发布了改进相机标定与三条自然语言标注。它适合研究真实场景鲁棒性和共训练,却仍是单臂 Franka 数据,不能直接映射成 RoboTwin 的双臂 14 维关节动作。

官方 quickstart 允许直接从 gs://gresearch/robotics 以 TFDS/RLDS 方式读取,不必先完整下载。样例字段明确包含 exterior_image_1_leftwrist_image_leftaction 和 language_instruction。这种远程流式方式适合抽样检查,不适合长时间多机训练;正式训练通常要把所需分片缓存到高速本地盘,并记录 TFDS builder 版本。DROID 官方主页抓取内容未给出一条覆盖所有发布附件的统一商用许可说明,部署前应以当前数据卡和发布协议为准。

import tensorflow_datasets as tfds

ds = tfds.load(
    "droid",
    data_dir="gs://gresearch/robotics",
    split="train",
)

for episode in ds.take(1):
    for step in episode["steps"].take(1):
        image = step["observation"]["exterior_image_1_left"]
        wrist = step["observation"]["wrist_image_left"]
        action = step["action"]
        instruction = step["language_instruction"]

7.2 BridgeData V2 的原始格式与 RLDS 版本并存

BridgeData V2 包含 60,096 条轨迹,其中 50,365 条是遥操作示范、9,731 条来自脚本策略,覆盖 24 个环境和 13 类技能。数据由 WidowX 250 六自由度机械臂采集,控制频率 5 Hz,平均轨迹 38 步;主相机为肩后 RGB-D,并逐步加入两路随机外部 RGB 和一路腕部 RGB。官方数据采用 CC BY 4.0,并同时发布原始 JPEG/PNG/pkl 压缩包与下采样到 256×256 的 TFDS/RLDS 版本。

官方数据目录中,demos*.zip 是遥操作示范,scripted*.zip 是脚本策略数据。由于具体分片名会随镜像更新,最稳妥的做法是先打开官方目录选择需要的分片,再用断点续传工具下载;训练仓库中的 data_processing 可把原始文件依次转成 NumPy 和 TFRecord。如果目标是 VLA 预训练,优先采用官方 RLDS 版本并配合 Octo loader;如果目标是保留原始分辨率或新增键,再从 raw 重建。

# 官方数据目录
# <https://rail.eecs.berkeley.edu/datasets/bridge_release/data/>

# 将网页中选定的 demos*.zip 或 scripted*.zip 链接替换到这里
wget -c "<official_bridge_zip_url>" -P data/bridge_v2_raw
unzip "data/bridge_v2_raw/<archive_name>.zip" 
  -d data/bridge_v2_raw/extracted

8. RoboSet 与 RH20T:小规模多技能和高模态接触数据

8.1 RoboSet 适合研究多视角与数据效率

RoboSet 官方页面展示的数据由 Franka-Emika 与 Robotiq gripper 采集,单帧最多有四个相机视角,任务以语言定义。主页口径显示 28,500 到 30,050 条遥操作与 kinesthetic 轨迹,RoboAgent 页面还提到包含 autonomous 数据的更大集合总计约 100,050 条;这反映了不同子集与发布阶段,引用时应明确是 MT-ACT、teleoperation、kinesthetic 还是 autonomous。用于 RoboAgent 的 MT-ACT 训练集只有 7,500 条轨迹,强调的是数据效率,而不是全量 RoboSet 的规模。

RoboSet 文件采用 HDF5,顶层 key 是 Trial0Trial1 等,每个 trial 下有 dataderived 与 config。官方下载不是单个统一压缩包,而是按 activity、task、scene 提供 tar.gz;下面以 Baking Prep 的开抽屉场景作为最小下载样例。官方网页未在抓取内容中展示统一许可证文本,因此研究和再发布前应单独确认条款,不要因为文件托管在 Meta 公共 CDN 就推断许可。

mkdir -p data/roboset
wget -c 
  <http://dl.fbaipublicfiles.com/RoboSet/TeleoperationSet/Activities/baking_prep/baking_prep_slide_open_drawer_scene_1.tar.gz> 
  -P data/roboset
tar -xzf data/roboset/baking_prep_slide_open_drawer_scene_1.tar.gz 
  -C data/roboset
import h5py

h5 = h5py.File("/path/to/dataset.h5", "r")
print(h5.keys())                  # Trial0, Trial1, ...
print(h5["Trial0"].keys())       # data, derived, config
sample = h5["Trial0"]["data"]

8.2 RH20T 的难点是同步、容量与混合许可

RH20T 包含超过 110,000 条接触丰富的真机操作序列,覆盖视觉、深度、双目红外、关节角、关节力矩、末端位姿、夹爪宽度、六维力/力矩、音频与可选触觉。原始数据约 40 TB,官方提供 640×360 压缩版和 320×180 版本;后者将 RGB 视频压缩,同时对深度做无损压缩,更适合保留 3D 精度。它不是一个“下载后直接训练”的轻量数据集,真正成本在多频率传感器时间对齐、相机标定和数 TB 解压缓存。

许可也必须按 episode 名分流:RH20T-C 中 scene_0001 到 scene_0005 采用 CC BY-SA 4.0;RH20T-NC 中 scene_0006 到 scene_0010 采用 CC BY-NC,不能商用。官方下载页按 cfg1 到 cfg7、RGB、Depth、LowDim 和 Calibration 分别提供 Google Drive 与百度网盘链接。第一次只下载一个配置的 Calibration、LowDim 和少量 RGB,先用官方 rh20t_api 验证时间戳和标定,再决定是否拉深度。

git clone <https://github.com/rh20t/rh20t_api.git>
cd rh20t_api
pip install -r requirements_api.txt

# 数据文件从 <https://rh20t.github.io/> 的 Download 区按 cfg/模态选择
# 下载并解压后,先运行官方可视化预处理
python visualize.py 
  --scene_folder /path/to/RH20T_cfg1/task_xxx_cfg_0001 
  --cache_folder /path/to/rh20t_cache 
  --preprocess

RH20T 的原始树把每个相机放在独立 cam_<serial>/ 下,颜色与深度使用 MP4,时间戳使用 NPY;末端、关节、夹爪和力数据放在 transformed/。这意味着转换到 LeRobot 时不能把视频第  帧和低维数组第  行直接配对,而要按真实 timestamp 插值或最近邻采样。官方 API 已提供 get_tcp_alignedget_joint_angles_aligned 和 get_ft_aligned,应优先复用这些同步逻辑。

RH20T_cfg1/
├── calib/
├── task_0001_user_0001_scene_0001_cfg_0001/
│   ├── metadata.json
│   ├── cam_<serial>/
│   │   ├── color.mp4
│   │   ├── depth.mp4
│   │   └── timestamps.npy
│   ├── transformed/
│   │   ├── tcp_base.npy
│   │   ├── joint.npy
│   │   ├── gripper.npy
│   │   ├── force_torque_base.npy
│   │   └── high_freq_data.npy
│   └── audio_mixed/
└── task_0001_user_0001_scene_0001_cfg_0001_human/

9. HDF5、RLDS 与 LeRobot 到底差在哪

9.1 三种格式解决的是不同问题

HDF5 适合把一个 episode 的多层数组放进单文件,RoboTwin 和 RoboSet 都能高效随机读取,但视频压在 HDF5 内会增加解码和迁移成本;RLDS 把 episode 定义成 steps 序列,TFDS 能统一流式读取 Open X-Embodiment、DROID 和 BridgeData V2,却依赖 TensorFlow 生态;LeRobot 把低维表格写入 Parquet、视觉写成 MP4、任务与 episode 写成 JSON/JSONL,便于按 episode 下载并被 PyTorch loader 消费。格式转换不是后缀替换,而是 episode、时间轴、媒体和元数据四份契约同时重建。

9.2 时间和动作语义是转换的两个硬约束

假设源数据控制频率为 ,目标数据频率为 ,目标第  帧对应的源时间应由 timestamp 决定,而不是由文件序号决定。对连续状态可以插值,对离散夹爪状态通常采用最近邻或保持策略;视频则应选择时间上最近且误差不超过容忍阈值的帧。LeRobot loader 自己用  生成查询偏移,所以 info.json 中的 fps 一旦写错,图像、状态和 action chunk 会系统性错位。

其中  是目标帧时间, 是源传感器时间, 是选中的源索引。工程上还要记录最大同步误差 ,并在超过阈值时丢弃或标记该帧,不能默默复制上一帧让 episode 看起来完整。建议把每路传感器的误差分位数、丢帧数和最终保留帧数写入转换 manifest,这样更换重采样频率或同步阈值后,能够比较两个版本是否改变了有效数据分布,而不是只比较输出文件大小。

动作统一更难。若源动作是末端增量 ,目标是关节位置 ,两者之间需要机器人运动学、控制周期与夹爪定义,不能用固定拼接矩阵完成。只有同一本体、同一控制模式下,才可以把原始动作通过尺度和排列映射  转到标准向量;跨本体训练更合理的方式是保留 embodiment id、动作 mask 和每维名称。

难点提示:动作空间像不同车辆的操纵接口。方向盘角度、左右履带速度和“向左移动 20 厘米”都能让机器转弯,但数值含义完全不同。把它们补成相同长度,只相当于把三个仪表盘裁成同样尺寸,并没有得到统一控制协议。真正统一需要本体标识、坐标系、控制模式、频率和有效维度 mask 一起进入模型或转换层。

10. 规模、存储和许可决定实际选型

10.1 下载前先估算磁盘放大

大数据集的标称容量通常只代表托管端压缩文件,不含下载分片、解压文件、重编码 MP4、Parquet、缓存和训练时索引。一个保守预算应同时计算源压缩包 、解压数据 、转换结果  与临时空间 。对 AgiBot World、RH20T 这类 TB 级数据,没有两倍以上可用空间和可恢复的分片流程,不应直接启动全量转换。

如果不能提前知道压缩率,可以先用一个 task 或 sample 实测放大系数 ,再估算全量。实际还要为 Hugging Face cache、文本 embedding cache 和视频 latent cache 留空间;训练完成后哪些中间产物可以删除,也应写进转换 manifest,而不是靠人工回忆。估算表最好按下载、解压、转码、统计和训练五个阶段分别记录峰值,因为这些阶段可能短暂同时占用源视频与目标 MP4;只看最终 LeRobot 目录容量,往往会低估转换过程真正需要的磁盘余量。

10.2 Lerobot 七步转换流水线

一个可复现转换器至少要完成七步:建立 episode 清单并固定 train/val split;读取源相机、状态、动作和语言;按 timestamp 对齐并处理丢帧;明确动作坐标系、单位与控制模式;把图像按固定 fps 编码成 MP4;把低维字段与索引写入 Parquet;最后生成 info.jsontasks.jsonlepisodes.jsonl 并做逐 episode 校验。转换完成的判据不是脚本退出码为零,而是 loader 能随机抽样、媒体同步、shape 正确且统计量有限。

10.3 转换后先做静态检查,再实例化 loader

静态检查先确认四个 metadata 文件、Parquet 与 MP4 是否存在,再用 jq 查看 fps、episode 数、features 和路径模板。随后抽取一个 Parquet schema,确认 observation.stateactiontask_indextimestampepisode_index 与 frame_index 类型正确;视频则用 ffprobe 检查分辨率、帧率和时长。只有这些检查通过,才进入训练框架的 loader 随机抽样,避免在训练多进程中把一个简单目录错误放大成难定位的 worker 崩溃。

DATASET_ROOT=/path/to/converted_lerobot

test -f "$DATASET_ROOT/meta/info.json"
test -f "$DATASET_ROOT/meta/tasks.jsonl"
test -f "$DATASET_ROOT/meta/episodes.jsonl"
find "$DATASET_ROOT/data" -name '*.parquet' -print -quit
find "$DATASET_ROOT/videos" -name '*.mp4' -print -quit

jq '{codebase_version,fps,total_episodes,total_frames,features}' 
  "$DATASET_ROOT/meta/info.json"

进一步看,数据统计也必须在 split 固定后计算。标准 z-score 使用训练集均值  和标准差 ,验证集只应用同一组参数;夹爪等离散维度若方差极小,需要 processor 的 exception mode 或显式裁剪策略,不能让除零产生 NaN。第一轮把 pretrained_norm_stats: null,等 run 输出 dataset_stats.json 后再在后续训练中复用,就是为了固定这套状态。

工程价值:这套校验顺序像工厂先做来料检验,再开整条产线。testjq、Parquet schema 和 ffprobe 只花几分钟,却能提前发现路径、类型、fps 和视频时长错误;直接启动多卡训练,相当于让几十个 worker 同时消费问题数据,最终日志只剩随机重试和解码异常,定位成本会高一个数量级。

10.4 官方来源索引

下列链接是本文下载命令、规模、格式与许可判断的主要依据。建议实际下载时从这些入口重新进入,不要依赖搜索结果中的深层临时链接;对 gated 数据先完成账号授权,对 Google Drive 或百度分片先核对校验值,对 Hugging Face 大文件先用 API 或网页文件树估算总容量。

    • LIBERO 官方仓库:https://github.com/Lifelong-Robot-Learning/LIBERO• LIBERO 官方数据页:https://huggingface.co/datasets/yifengzhu-hf/LIBERO-datasets• RoboTwin 2.0 官方仓库:https://github.com/RoboTwin-Platform/RoboTwin• RoboTwin 2.0 官方预采集数据:https://huggingface.co/datasets/TianxingChen/RoboTwin2.0• CALVIN 官方仓库:https://github.com/mees/calvin• Open X-Embodiment 官方仓库:https://github.com/google-deepmind/open_x_embodiment• Open X-Embodiment 项目页:https://robotics-transformer-x.github.io/• DROID 官方项目页:https://droid-dataset.github.io/• BridgeData V2 官方项目页:https://rail-berkeley.github.io/bridgedata/• BridgeData V2 官方训练仓库:https://github.com/rail-berkeley/bridge_data_v2• RoboSet 官方数据页:https://robopen.github.io/roboset/• RH20T 官方项目与下载页:https://rh20t.github.io/• RH20T 官方 API:https://github.com/rh20t/rh20t_api• AgiBot World 官方仓库:https://github.com/OpenDriveLab/AgiBot-World• AgiBot World Alpha 数据卡:https://huggingface.co/datasets/agibot-world/AgiBotWorld-Alpha• AgiBot World Beta 数据卡:https://huggingface.co/datasets/agibot-world/AgiBotWorld-Beta• AgiBot World 技术报告:https://arxiv.org/abs/2503.06669• LeRobot 官方仓库:https://github.com/huggingface/lerobot

11. 总结

先用 LIBERO 或已转换 RoboTwin 打通训练与评测,再按研究问题引入 DROID、BridgeData V2、RH20T 或 AgiBot World;每增加一个数据源,都把动作语义、时间同步、许可和存储当作新的工程合同重新审核。对任何基于 LeRobot 的训练框架来说,最终入口必须是可被 LeRobot wrapper 验证的 Parquet、MP4 与 metadata,而不是一个看起来像数据集的压缩包集合。


更多ROS、具身智能相关内容,请关注古月居


关注我们,发现更多有深度的自动驾驶/具身智能/GitHub 内容!

往期内容回顾

十分钟读论文 | SigLIP-HD:不加大图像,也能让视觉编码器看清细节
世界模型 | WAM-TTT:让机器人在部署现场“看视频现学”的测试时后训练
世界模型 | FlowWAM:把光流当成动作,让预训练视频模型直接开机器人

 

相关推荐