跳到主要内容

准备数据

数据集与格式 + 数据引擎(采集 → 转换 → 特征映射 → 归一化)的完整链路。

数据格式: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)。

流水线概览​

真机/仿真采集 ──→ 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_99RoboTwin 仿真数据推荐
minmax / identity备选

RoboTwin 2.0 原始数据 → LeRobot 完整转换流程​

  1. Clone 官方 RoboTwin:git clone git@github.com:RoboTwin-Platform/RoboTwin.git
  2. 建目录:cd policy/pi0 && mkdir processed_data training_data
  3. 原始数据转 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
  4. 准备训练数据:cp -r processed_data/${task}-${config}-${num} training_data/${model_name}/
  5. 确保磁盘空间:LeRobot 数据集存于 $XDG_CACHE_HOME/huggingface/lerobot/${repo_id}(默认 ~/.cache,空间不足时 export XDG_CACHE_HOME=/path/to/cache)。
  6. 生成 LeRobot v2.1:bash generate.sh ${hdf5_path} ${repo_id}
  7. 合并多任务(可选):在 v2.1 阶段合并更高效,且必须同一本体(如 5 个任务同属 aloha-agilex):
    python scripts/merge_lerobot_v21.py --sources path1,path2,... --output path_to_merged_data
  8. 转 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。

完成数据准备后,前往后训练配置并启动训练。