真机数据准备#
概述#
很多真机采集的训练数据通过 HDF5 格式保存。本文档将说明如何将这些数据转换为 LeRobot 数据集 v2.1 格式用于 FluxVLA 训练。
数据转换脚本: 请从项目仓库获取,详见项目 README 中的说明。
数据格式要求#
输入数据格式(HDF5)#
HDF5 文件应命名为 episode_*.hdf5 格式,脚本会递归搜索指定目录下的所有匹配文件。
必需字段#
/observations/qpos - 机器人关节位置#
数据类型:
float32或float64形状:
[num_frames, 14]或[num_frames, 16](16 维会自动转换为 14 维)关节顺序:左臂(7 个关节)+ 右臂(7 个关节)
格式说明:
16 维格式:夹爪开合由两个夹爪的绝对位置(共 8 维)表示
14 维格式:夹爪开合由归一化到 [0, 0.1] 相对位置表示
转换公式:
gripper_value = (left_finger - right_finger) * (0.1 / 0.07)
/observations/images/<camera_name> - 相机图像#
支持的相机:
head_cam,left_cam,right_cam格式:
未压缩的 4 维 numpy 数组
[num_frames, height, width, channels](uint8)或 JPEG 压缩字节流
[num_frames](会自动解码为 RGB)
可选字段#
/action - 机器人期望关节位置#
数据类型:
float32或float64形状:
[num_frames, 14]或[num_frames, 16](16 维会自动转换为 14 维)
/observations/eepose - 机器人末端执行器位姿#
数据类型:
float32或float64形状:
[num_frames, 14]说明:包含左右两个末端执行器的位置(x, y, z)和四元数(qx, qy, qz, qw)
/observations/images_depth/<camera_name>_depth - 深度图像#
支持的相机:
head_cam,left_cam,right_cam数据类型:
uint16(值为 mm 值)形状:
[num_frames, height, width]说明:需要在
DatasetConfig中设置add_infos = ["depth"]才会处理
输出数据格式(LeRobot v2.1)#
转换后的数据集采用 LeRobot v2.1 格式,存储在 HuggingFace Datasets 兼容的目录结构中:
<output_dir>/<repo_id>/
├── data/
│ ├── train/
│ │ ├── episode_0.parquet
│ │ └── ...
│ └── video/
│ ├── episode_0/
│ │ ├── observation.images.head_cam.mp4
│ │ └── ...
│ └── ...
├── info.json
└── meta.json
数据字段说明#
每个 episode 的 parquet 文件包含以下字段:
observation.state#
类型:
float32形状:
(14,)说明:机器人关节状态,字段顺序与输入
qpos相同
observation.images.<camera_name>#
类型:
VideoFrame对象说明:相机图像引用,包含视频文件路径和帧时间戳
支持的相机:
head_cam,left_cam,right_cam视频规格:
帧率:30 FPS
图像尺寸:
(480, 640, 3)存储位置:
video/目录下的 MP4 文件
action(可选)#
类型:
float32形状:
(14,)说明:机器人动作,仅当输入包含
/action时生成
observation.eepose(可选)#
类型:
float32形状:
(14,)说明:末端执行器位姿,字段顺序与输入相同,仅当输入包含
/observations/eepose时生成
observation.depth.<camera_name>(可选)#
类型:
uint16形状:
(480, 640)说明:深度图像,仅当输入包含深度图像且
add_infos = ["depth"]时生成
task#
类型:
string默认值:
"pick up the yellow banana and put it on the pink plate"说明:任务标签,可通过
init_task参数自定义