1. 构建多任务VLA基础数据集

任务目标

构建一个多任务VLA(视觉-语言-动作)基础数据集,覆盖抓取、放置、推动三类机器人操作任务。每个样本需包含:任务指令文本、初始与目标观测图像(以特征向量模拟)、动作标签(末端执行器位姿增量),并统一为JSON格式以便后续训练加载。

数据集结构与格式

统一数据格式定义如下,每个样本为一个JSON对象,所有样本组成JSON数组文件:

{
  "task_type": "grasp | place | push",
  "instruction": "自然语言任务描述",
  "obs_0": [浮点数...],   // 初始观测特征(128维)
  "obs_1": [浮点数...],   // 目标观测特征(128维)
  "action": [dx, dy, dz, droll, dpitch, dyaw]  // 6维动作增量
}

实现代码

以下Python脚本生成包含三类任务共30个样本的数据集,并保存为vla_dataset.json。使用固定随机种子保证可复现性。

import json
import numpy as np
import os

np.random.seed(42)

# 任务模板:指令模板 + 动作范围
TASK_TEMPLATES = {
    "grasp": {
        "instructions": [
            "抓取红色方块",
            "拿起桌上的杯子",
            "夹取螺丝钉"
        ],
        "action_range": [0.02, 0.02, 0.05, 0.1, 0.1, 0.1]
    },
    "place": {
        "instructions": [
            "将方块放入托盘",
            "把杯子放到架子上",
            "放置零件到指定位置"
        ],
        "action_range": [0.03, 0.03, 0.04, 0.1, 0.1, 0.1]
    },
    "push": {
        "instructions": [
            "向前推动滑块",
            "将木块推到左侧",
            "推开门板"
        ],
        "action_range": [0.05, 0.03, 0.01, 0.05, 0.05, 0.05]
    }
}

def generate_observation():
    """生成128维随机观测特征(模拟视觉编码)"""
    return np.random.rand(128).astype(np.float32).tolist()

def generate_action(task_type):
    """根据任务类型生成6维动作增量"""
    range_vals = TASK_TEMPLATES[task_type]["action_range"]
    # 动作增量在正负范围内随机
    action = np.random.uniform(
        low=[-r for r in range_vals],
        high=range_vals
    ).astype(np.float32).tolist()
    return action

def build_dataset(samples_per_task=10):
    dataset = []
    for task_type, template in TASK_TEMPLATES.items():
        for i in range(samples_per_task):
            # 循环使用指令模板,保证多样性
            instruction = template["instructions"][i % len(template["instructions"])]
            sample = {
                "task_type": task_type,
                "instruction": instruction,
                "obs_0": generate_observation(),
                "obs_1": generate_observation(),
                "action": generate_action(task_type)
            }
            dataset.append(sample)
    return dataset

if __name__ == "__main__":
    data = build_dataset(samples_per_task=10)
    output_path = "vla_dataset.json"
    with open(output_path, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f"数据集已生成: {output_path}, 总样本数: {len(data)}")
    # 打印各类别样本数量统计
    task_counts = {}
    for sample in data:
        task_counts[sample["task_type"]] = task_counts.get(sample["task_type"], 0) + 1
    print(f"类别分布: {task_counts}")

运行与验证

运行方式:在Python 3.8+环境中执行(需安装NumPy):

pip install numpy
python generate_vla_dataset.py

验证方法:运行后检查输出:

  1. 控制台打印数据集已生成: vla_dataset.json, 总样本数: 30,且类别分布为{'grasp': 10, 'place': 10, 'push': 10}。
  2. 打开vla_dataset.json,确认每个样本包含全部6个字段,obs_0和obs_1为128个浮点数,action为6个浮点数。
  3. 随机抽取样本,人工核对task_type与instruction语义一致(如grasp类型对应"抓取/拿起/夹取"类指令)。

通过标准:文件成功生成、字段完整、三类任务各10条且指令与任务类型匹配,即视为数据集构建合格。