接入 LeRobot

将 ROS 2 rosbag2 采集的机器人数据转换为 LeRobot V3 数据集,用于模仿学习、策略训练和数据分析。

rosbag_to_lerobot 工具

rosbag_to_lerobot 用于将机器人采集的 ROS 2 rosbag2 数据转换为 LeRobot V3 数据集。工具根据不同机型的 YAML 配置解析机器人状态、动作和相机 Topic,并完成时间对齐、重采样和数据集生成。

功能特性

  • 输入格式: 支持 rosbag2 目录、metadata.yaml、与其同目录的 .mcap / .db3 数据文件,以及包含一份 rosbag2 数据的 .tar / .tar.gz / .tgz 归档。

  • 机型支持: 当前提供 Quanta X1、Quanta X2 和 Desktop 的转换配置。

  • Topic 配置: 不同机型通过 YAML 配置定义状态、动作和相机数据来源,不建议在转换代码中直接写死 Topic。

  • 时间同步: 转换时计算各有效数据流的共同时间区间,并按照目标 FPS 对状态、动作和图像进行时间对齐和重采样。

  • Episode: 支持单个 rosbag 转换,也支持批量数据和平台任务数据组织为多个 episode。

  • 输出格式: 低维状态和动作数据保存为 Parquet,相机数据保存为 MP4,并生成 LeRobot V3 所需的 metadata。

当前交付状态

tools/rosbag_to_lerobot/ 当前已经在 SDK 内部代码中实现并完成基础功能核验,但 SDK v1.1.2 的公开导出包尚未包含该工具。

因此,以下目录和命令用于说明当前转换工具的接口和工作流程。只有在获得包含 rosbag_to_lerobot 的 SDK 版本或正式发布的工具包后,才能直接执行。

工具目录

tools/rosbag_to_lerobot/
├── scripts/
│   ├── convert_rosbag_to_lerobot.py
│   ├── convert_rosbag_to_lerobot_v3_batch.py
│   └── convert_platform_task_to_lerobot_v3.py
├── config/
│   ├── quanta_x1/
│   ├── quanta_x2/
│   └── desktop/
├── requirements.txt
├── README.md
└── README_CN.md

依赖安装

当前工具依赖中固定使用 LeRobot 0.4.2。工具正式交付后,建议优先按照随工具发布的 requirements.txt 安装依赖。下载 v0.4.2 版本的 lerobot 安装包,安装方法

python -m pip install ./lerobot-0.4.2-py3-none-any.whl
python -m pip install -r tools/rosbag_to_lerobot/requirements.txt

输入数据

标准 rosbag2 目录通常包含:

my_rosbag/
├── metadata.yaml
└── xxx.mcap

或者:

my_rosbag/
├── metadata.yaml
└── xxx.db3

metadata.yaml 用于描述 rosbag2 数据集,.mcap / .db3 保存实际 ROS 2 消息数据。

工具同时支持内部包含一份完整 rosbag2 数据的 .tar.tar.gz.tgz 归档。

快速开始

获得包含该工具的 SDK 后,在 tools/rosbag_to_lerobot 目录下执行:

python scripts/convert_rosbag_to_lerobot.py     --bag-path /path/to/rosbag2     --output-dir /path/to/lerobot_data     --repo-id "my_org/my_dataset"     --config config/quanta_x1/lerobot_v3_16d.yaml

参数说明

参数是否必填默认值说明
--bag-path输入数据路径。支持 rosbag2 目录、metadata.yaml、与其同目录的 .mcap / .db3,以及包含一份 rosbag2 数据的 .tar / .tar.gz / .tgz 归档。对于 .mcap.zstd,应传入包含它和 metadata.yaml 的 rosbag2 目录或归档。
--output-dir输出 LeRobot V3 数据集目录。正式转换时,该目录必须不存在或为空;使用 --dry-run 时不会写入该目录。
--repo-id数据集标识,格式必须包含 /,例如 my_org/my_dataset。该参数不表示必须立即上传到远端仓库。
--config内置合肥项目映射Topic、state 和 action 的 YAML 配置文件。EX001 通用转换建议显式指定 config/quanta_x1/lerobot_v3_16d.yaml。
--robot-type读取配置文件;内置配置默认为 quanta_x1指定或覆盖机器人类型,例如 quanta_x1、quanta_x2、desktop。应与所选 YAML 配置匹配。
--fps30输出数据集的目标帧率。工具按照该帧率对状态、动作和图像进行时间对齐与重采样。
--resize-width640输出图像宽度,单位为像素。
--resize-height480输出图像高度,单位为像素。
--task自动推断写入 LeRobot 数据集的任务描述。指定后优先使用该值;未指定时,工具尝试从 step、task_meta.json 或输入目录名称推断。
--task-meta自动查找 task_meta.json显式指定任务元数据 JSON。当文件不在 rosbag2 目录中时使用。
--step-index自动查找 st ep_index.json显式指定步骤索引 JSON,可用于按步骤时间范围拆分 episode。
--episode-policystepEpisode 拆分策略。可选 step 或 file。
--use-videos关闭启用 LeRobot 视频输出。开启后,相机数据写入 videos/;未开启时,相机帧作为 image feature 存储在 Parquet 中。
--video-backendLeRobot 默认值视频处理后端,可选 pyav 或 opencv。仅在启用 --use-videos 时有意义。
--video-codeclibsvtav1视频编码格式,可选 libsvtav1、h264 或 hevc。需要兼容常见播放器时建议选择 h264。
--max-frames不限制限制最大输出帧数,主要用于快速验证;正式转换通常不设置。
--dry-run关闭只扫描和解析输入数据,不生成 LeRobot 数据集。
-h、--help显示当前脚本支持的参数和说明。

其他可选参数以当前工具执行 --help 的输出为准。

机型配置

当前工具已经提供以下机型配置:

  • Quanta X1: 左右机械臂末端位姿、左右夹爪、头部状态及三路相机等数据。

  • Quanta X2: 根据不同夹爪类型配置对应的腕部位姿、夹爪状态和相机数据。

  • Desktop: 左右机械臂、夹爪和相机数据。

具体 Topic 名称、数据类型以及字段映射以对应机型 YAML 为准。

Quanta X1 数据结构

当前 Quanta X1 的 LeRobot V3 配置使用 16 维状态 / 动作表示,主要包括:

  • 左臂末端位置和姿态;

  • 左夹爪状态;

  • 右臂末端位置和姿态;

  • 右夹爪状态;

  • 头部 pitch 和 yaw。

字段名称、顺序和单位应以对应 YAML 配置和转换后数据集的 metadata 为准。

时间同步与 Action 构造

不同机器人数据源的采样频率可能不同。转换工具会先计算有效数据流的共同时间区间,再按照目标 FPS 对各数据源进行重采样,使同一个 LeRobot frame 中的图像、state、action 和 timestamp 对齐到统一时间轴。

默认配置可以使用下一时刻的 state 构造当前 action:

action[t] = state[t + 1]

也可以根据机型配置从独立动作数据源构造 action。实际使用方式以对应 YAML 中的 action 配置为准。

输出目录结构

转换后的 LeRobot V3 数据集通常包含:

lerobot_data/
├── meta/
│   ├── info.json
│   ├── stats.json
│   ├── tasks.parquet
│   └── episodes/
│       └── chunk-000/
│           └── file-000.parquet
├── data/
│   └── chunk-000/
│       └── file-000.parquet
└── videos/
    └── observation.images.<camera_name>/
        └── chunk-000/
            └── file-000.mp4
  • data/:状态、动作、时间戳等低维时序数据。

  • videos/:相机视频。

  • meta/info.json:数据集 feature、FPS 和数据版本等信息。

  • meta/stats.json:数据统计信息。

  • meta/tasks.parquet:任务信息。

  • meta/episodes/:episode 元数据。

批量转换

需要批量处理多份 rosbag 数据时,可以使用:

scripts/convert_rosbag_to_lerobot_v3_batch.py

批量转换适合将多次采集结果组织为多个 episode。

转换后检查

完成转换后,建议至少检查:

  1. 输出目录中的 metadatavideos 是否完整;

  2. episode 数量和帧数是否符合预期;

  3. 相机视频能否正常播放;

  4. state 和 action 的 shape、顺序和单位是否与机型配置一致;

  5. 图像、state、action 和时间戳是否正确对齐;

  6. 是否存在明显缺帧、时间戳异常或数据长度不一致;

  7. task 信息是否与实际 episode 对应。

与 SDK DataCollector JSON 转换的区别

SDK 中同时正式支持 DataCollector → collected_data JSON → tools/convert_to_lerobot.py 转换流程。

该流程与本节介绍的 rosbag2 → rosbag_to_lerobot → LeRobot V3 是两套不同的数据链路。

数据来源转换工具输入格式
ROS 2 rosbag2rosbag_to_lerobotmetadata.yaml + .mcap / .db3
SDK DataCollectortools/convert_to_lerobot.pydataset_metadata.json + episode_*/episode.json

两种流程的输入目录、转换脚本、配置方式和命令行参数不能混用。SDK DataCollector JSON 数据的转换方法请参考“数据采集示例”中的对应说明。

本页内容