为什么标准格式很重要

机器人学习历来因每个实验室使用不同的数据格式而受到影响,导致无法共享数据集、组合来自不同机器人的数据或跨系统使用预先训练的策略。 LeRobot 数据集格式通过定义适用于所有支持的硬件的单一模式解决了这个问题。 SO-100 上记录的数据集可用于训练 OpenArm 的策略,无需任何转换 - 只要操作空间维度匹配。

在记录之前了解格式意味着您在训练期间不会发现数据中的结构问题。 它还使调试变得更加容易:当训练失败时,首先要查看的地方是数据集。

数据集结构:Parquet + MP4

每个 LeRobot 数据集都位于具有以下结构的目录中:

我的数据集/ ├── 元/ │ ├── 信息.json # dataset metadata (robot type, fps, modalities) │ ├── 任务.jsonl # task description per episode │ └── stats.safetensors # mean/std for normalization ├── 数据/ │ └── 块-000/ │ ├── Episode_000000.parquet # joint states + actions, one row per timestep │ ├── Episode_000001.parquet │ └── ... └── 影片/ └── 块-000/ ├── 观察.images.cam_high/ │ ├── Episode_000000.mp4 # camera feed, one file per episode │ └── ... └── 观察.images.cam_wrist/ └── ...

Parquet(用于数字时间序列)和 MP4(用于视频)之间的划分是经过深思熟虑的。 Parquet 有效地压缩联合状态和动作,并支持通过情节索引进行快速随机访问。 MP4 使用专为图像序列设计的视频编解码器,生成的文件比将原始图像存储为张量小 10-30 倍。

每集的关键领域

场地 形状 描述
观察状态[T,D]每个时间步的关节位置(以及可选的速度)。 D 是关节数量(例如,SO-100 为 7:6 个关节 + 1 个夹具)。
行动[T,D]每个时间步命令的目标关节位置。 与observation.state 具有相同的维度。
时间戳[T]自剧集开始以来的时间(以秒为单位),默认为 50Hz(每步 0.02 秒)。
剧集索引标量数据集中此剧集的整数索引。 由数据加载器用于将时间步分组为片段。
帧索引[T]剧集内的帧编号(0 到 T-1)。 匹配相应 MP4 中的帧编号。
下一步完成[T]布尔标志 - 在剧集的最后一个时间步为真。 用于在训练期间发出事件边界信号。
任务索引标量索引到tasks.jsonl。 启用多任务数据集,其中不同的情节对应于不同的指令。
相机领域: 相机图像存储为 MP4 文件,而不是 Parquet 中。 实木复合地板包含 observation.images.cam_high 作为路径参考(帧索引+剧集索引)而不是原始像素数据。 LeRobot 数据加载器透明地处理解码和同步。

加载并可视化现有数据集

加载 lerobot-raw/aloha_sim_insertion_scripted 来自 HuggingFace Hub 的数据集并可视化 3 个片段。 该数据集包含双手机器人插入钉子的脚本演示——这是一个结构良好的数据集的清晰示例。

源〜/lerobot-env/bin/activate # Visualize 3 episodes from a public dataset python -m lerobot.scripts.visualize_dataset \ --repo-id lerobot-raw/aloha_sim_insertion_scripted \ --剧集索引 0 1 2 \ --output-dir ~/数据集-viz/ # Open the generated HTML in your browser # File path printed to terminal, e.g. ~/dataset-viz/index.html

可视化工具生成一个 HTML 页面,其中包含每集的视频播放以及同步的联合状态图。 寻找:

  • 平滑的关节轨迹 — 尖锐的尖峰表示记录伪影或手臂碰撞
  • 剧集长度一致 — 长度差异很大的剧集(例如 50 帧与 400 帧)通常表明一些演示捕获了部分或中止的动作
  • 夹具状态变化 — 最后一个关节维度应显示用于操作任务的清晰的二元转换(打开 → 关闭 → 打开)
# Inspect the dataset programmatically 从 lerobot.common.datasets.lerobot_dataset 导入 LeRobotDataset 数据集 = LeRobotDataset("lerobot-raw/aloha_sim_insertion_scripted") print(f"剧集:{dataset.num_episodes}") print(f"总帧数:{len(数据集)}") print(f"FPS: {数据集.fps}") print(f"特征:{list(dataset.features.keys())}") # Inspect a single frame 框架=数据集[0] print(f"状态形状:{frame['observation.state'].shape}") print(f"动作形状:{frame['action'].shape}")
可选 - 参考数据集

探索 SVRC 数据集集合

SVRC 数据集库包含 LeRobot 格式的精选机器人学习数据集。 在录制您自己的任务和硬件之前,请浏览它们以了解不同的任务和硬件是什么样的。 浏览数据集 →

第 2 单元完成时...

您已成功可视化 3 集 lerobot-raw/aloha_sim_insertion_scripted HTML 输出将在您的浏览器中打开。 您可以识别使用Python加载的Parquet文件中的observation.state、action和timestamp字段。 您了解 Parquet 与 MP4 中存储的内容之间的区别。 您已准备好在第 3 单元中记录您自己的数据集。