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
验证方法:运行后检查输出:
- 控制台打印
数据集已生成: vla_dataset.json, 总样本数: 30,且类别分布为{'grasp': 10, 'place': 10, 'push': 10}。 - 打开
vla_dataset.json,确认每个样本包含全部6个字段,obs_0和obs_1为128个浮点数,action为6个浮点数。 - 随机抽取样本,人工核对
task_type与instruction语义一致(如grasp类型对应"抓取/拿起/夹取"类指令)。
通过标准:文件成功生成、字段完整、三类任务各10条且指令与任务类型匹配,即视为数据集构建合格。