准备数据
数据集与格式 + 数据引擎(采集 → 转换 → 特征映射 → 归一化)的完整链路。
数据格式:LeRobot v3.0
LingBot-VLA 后训练使用 LeRobot v3.0 数据格式。若已有 v2.1 数据,可用官方脚本升级:
# LeRobot v2.1 → v3.0
# 见 https://github.com/huggingface/lerobot/blob/v0.4.2/src/lerobot/datasets/v30/convert_dataset_v21_to_v30.py
预训练数据规模
LingBot-VLA 预训练使用 20,000 小时真机交互数据,覆盖 9 种主流双臂机器人配置。
GM-100 基准数据集
官方公开的真机评测数据集,覆盖 3 个机器人平台(Agibot G1 / AgileX / Galaxea R1Pro)。
- HuggingFace:https://huggingface.co/datasets/robbyant/gm100
流水线概览
真机/仿真采集 ──→ LeRobot v3.0 转换 ──→ Robot Config 特征映射 ──→ 归一化统计 ──→ 可训练数据
后训练数据三步准备
| 步骤 | 说明 | 产物 |
|---|---|---|
| 1. 准备 LeRobot 数据集 | 将示范数据转为 LeRobot v3.0 格式 | LeRobot 数据集目录 |
| 2. 准备 Robot Config | 定义原始 key → 统一特征空间(states / actions / images)的映射 | configs/robot_configs/<data_name>.yaml |
| 3. 计算归一化统计量 | 在数据集上计算归一化统计 | assets/norm_stats/<name>.json |
Robot Config 特征映射
configs/robot_configs/<data_name>.yaml(文件名须等于训练配置里的 data.data_name)把本体原始数据键映射到统一特征空间,含 states / actions / images 三段。每个条目用 origin_keys + start/end 切片,多个切片按序拼接。
以 robotwin.yaml(双臂,12 维臂 + 2 维夹爪)为例:
states:
- observation.state.arm.position:
origin_keys:
- observation.state: { start: 0, end: 6 } # 左臂关节 [0:6)
- observation.state: { start: 7, end: 13 } # 右臂关节 [7:13)
- observation.state.effector.position:
origin_keys:
- observation.state: { start: 6, end: 7 } # 左夹爪
- observation.state: { start: 13, end: 14 } # 右夹爪
actions:
- action.arm.position:
origin_keys:
- action: { start: 0, end: 6 }
- action: { start: 7, end: 13 }
subtract_state: False # True=学习增量动作(真机臂推荐 True,夹爪 False)
- action.effector.position:
origin_keys:
- action: { start: 6, end: 7 }
- action: { start: 13, end: 14 }
subtract_state: False
images:
- observation.images.camera_top:
origin_keys: observation.images.cam_high # 原始键不同→需 origin_keys
- observation.images.camera_wrist_left:
origin_keys: observation.images.cam_left_wrist
- observation.images.camera_wrist_right:
origin_keys: observation.images.cam_right_wrist
一致性要求:states/actions 用的 <joint_type> 必须在训练配置 data.joints 中声明;images 的相机名必须在 data.cameras 中列出;否则运行时 ValueError。data.joints 的维度须 ≥ 拼接切片总长(如 arm.position 12 → 配 14 留 padding 余量)。新增 EEF 维度时推荐学绝对动作(subtract_state: False,暂不支持相对旋转)。
训练配置侧对应声明(RoboTwin 2.0):
data:
data_name: robotwin
joints:
- arm.position: 14
- effector.position: 2
cameras:
- camera_top
- camera_wrist_left
- camera_wrist_right
norm_type: bounds_99
norm_stats_file: assets/norm_stats/robotwin_50.json
归一化统计
CUDA_VISIBLE_DEVICES=0 bash train.sh scripts/compute_norm.py ./configs/vla/real_load20000h.yaml \
--data.data_name robotwin \
--data.train_path path_to_lerobotv3 \
--data.norm_stats_file norm_path.json
- 产物
norm_path.json;data_name与norm_stats_file须与训练配置一致。 - 真机推荐
meanstd;RoboTwin 推荐bounds_99。
| 类型 | 适用 |
|---|---|
meanstd | 真机数据推荐 |
bounds_99 | RoboTwin 仿真数据推荐 |
minmax / identity | 备选 |
RoboTwin 2.0 原始数据 → LeRobot 完整转换流程
- Clone 官方 RoboTwin:
git clone git@github.com:RoboTwin-Platform/RoboTwin.git - 建目录:
cd policy/pi0 && mkdir processed_data training_data - 原始数据转 HDF5:下载 RoboTwin2.0 数据集解压到
data/,再bash process_data_pi0.sh ${task_name} ${task_config} ${expert_data_num}# clean: bash process_data_pi0.sh adjust_bottle aloha-agilex_clean_50 50# randomized: bash process_data_pi0.sh adjust_bottle aloha-agilex_randomized_500 50 - 准备训练数据:
cp -r processed_data/${task}-${config}-${num} training_data/${model_name}/ - 确保磁盘空间:LeRobot 数据集存于
$XDG_CACHE_HOME/huggingface/lerobot/${repo_id}(默认~/.cache,空间不足时export XDG_CACHE_HOME=/path/to/cache)。 - 生成 LeRobot v2.1:
bash generate.sh ${hdf5_path} ${repo_id} - 合并多任务(可选):在 v2.1 阶段合并更高效,且必须同一本体(如 5 个任务同属
aloha-agilex):python scripts/merge_lerobot_v21.py --sources path1,path2,... --output path_to_merged_data - 转 LeRobot v3.0:用官方
convert_dataset_v21_to_v30.py。
RoboTwin 2.0 数据示例(5 任务)
任务:open_microwave、click_bell、stack_blocks_three、place_shoe、put_object_cabinet。预计算统计量见 assets/norm_stats/robotwin_50.json。
完成数据准备后,前往后训练配置并启动训练。