:OpenVLA、π0 和 π0.5 有什么区别?)
本文从模型输出、动作生成、基础模型、训练方式和适用场景等角度对 OpenVLA、π0 和 π0.5 进行入门级对比。摘要OpenVLA、π0 和 π0.5 是 VLA 领域中经常被讨论的代表性模型。它们都接收视觉、语言和机器人状态并输出机器人动作但三者的动作生成方式和整体设计思路存在明显差异。可以先用一句话概括OpenVLA将机器人动作作为 Token 生成 π0通过 Flow Matching 生成连续 Action Chunk π0.5在 π0 路线基础上进一步加强开放世界任务理解与执行关键词OpenVLA、π0、π0.5、VLA、Action Token、Flow Matching目录[TOC]一、为什么要对比这三个模型初学 VLA 时经常会看到以下模型名称RT-1RT-2OpenVLAOctoπ0π0.5SmolVLA。其中 OpenVLA 和 π0 系列代表了两类较典型的动作生成路线离散 Action Token与连续动作生成理解这两条路线可以帮助我们看懂大量后续工作。二、OpenVLA 的核心思路OpenVLA 可以理解为在视觉语言模型基础上通过机器人动作数据进行微调使模型能够生成动作 Token。其整体流程可以简化为图像 语言指令 机器人状态 ↓ 视觉语言模型 ↓ 动作 Token ↓ 连续机器人动作OpenVLA 采用了和语言模型比较相似的自回归生成方式。例如连续动作[0.12, -0.03, 0.08, ...]可以先被量化为离散 TokenAction_152 Action_084 Action_201模型像生成文本一样逐个生成动作 Token。随后将 Token 解码回连续动作值。三、OpenVLA 为什么使用 Action Token大语言模型本身擅长预测离散 Token。文本生成过程为前面的 Token ↓ 预测下一个 Token如果把机器人动作也转换成 Token就可以复用语言模型原有的输出结构。例如视觉 Token 语言 Token 机器人状态 Token 历史动作 Token ↓ 下一个动作 Token优点可以复用大语言模型的自回归结构视觉、语言和动作统一为 Token训练目标通常是交叉熵容易利用已有视觉语言模型。缺点连续动作需要量化量化可能带来精度损失动作维度较高时Token 序列较长自回归生成需要逐个 Token 预测。四、π0 的核心思路π0 采用了不同路线。它不主要依赖离散 Action Token而是直接生成连续动作块。整体可以简化为图像和语言 ↓ 视觉语言主干网络 ↓ 多模态条件特征 ↓ Action Expert ↓ Flow Matching ↓ 连续 Action Chunk这里有两个重要概念Action ExpertFlow Matching。五、什么是 Action Expert在 π0 类模型中视觉语言主干负责理解看到了什么 用户要求什么 场景中的目标在哪里而动作模块需要负责机器人下一步应该如何运动动作生成对连续性、实时性和精度的要求与文本生成明显不同。因此可以引入专门处理动作的模块也就是 Action Expert。可以理解为VLM 负责理解任务 Action Expert 负责生成动作二者通过注意力或共享特征进行协作。六、π0 如何生成动作π0 使用 Flow Matching 相关方法生成连续动作。推理时先初始化一个随机动作块actions random_noise()模型根据视觉、语言、状态和当前动作样本预测速度velocity model( actions, time, condition, )再通过数值积分更新actions actions dt * velocity最终得到连续动作序列[aₜ, aₜ₊₁, ..., aₜ₊H]整个 Action Chunk 是一起生成的不需要先将每个动作维度量化成离散 Token。七、OpenVLA 与 π0 的核心区别可以先从动作生成方式理解。OpenVLA连续动作 ↓ 量化 动作 Token ↓ 自回归生成 动作 Token 序列 ↓ 解码 连续动作π0随机连续动作噪声 ↓ Flow Matching ↓ 连续 Action Chunk两种方法分别代表离散生成路线和连续生成路线八、π0.5 是什么π0.5 可以看作 π0 系列的进一步发展。从入门角度可以将它理解为在连续动作生成基础上进一步加强模型在开放环境中的语言理解、任务分解和操作能力。传统机器人任务通常具有较固定的环境和指令。例如拿起桌上的红色杯子但开放世界任务可能要求机器人处理更复杂的自然语言新物体新场景长时间任务多阶段操作环境变化。π0.5 更关注如何让机器人在开放环境中根据高级语言任务执行操作。需要注意π0.5 并不是简单把 π0 的参数变大更重要的是任务建模、数据组织和训练流程的变化。九、三者的输入有什么区别从整体形式看三者都可能接收摄像头图像 语言指令 机器人状态但内部处理方式不同。OpenVLA视觉和语言通常被处理为多模态 Token并由视觉语言主干进行统一建模。机器人状态也可以经过编码后作为条件输入。π0视觉和语言主干提取高层条件动作模块在连续动作空间中生成 Action Chunk。π0.5在相似基础上进一步强调高层任务语义、开放环境理解和复杂任务执行。十、三者的输出有什么区别OpenVLA 输出模型内部直接预测的是Action Token随后需要解码为连续动作。π0 输出模型内部预测的是连续动作的速度场经过积分后得到连续 Action Chunk。π0.5 输出最终同样需要形成机器人可以执行的连续动作但更加强调高级语言任务与底层操作之间的连接。十一、是否都使用 Action ChunkOpenVLA 类模型可以输出动作序列但通常需要通过 Token 序列表示动作。π0 系列则天然适合将整个动作块作为连续张量生成action_chunk.shape [ batch_size, horizon, action_dim, ]例如50 个未来动作 每个动作 7 维机器人只执行其中一部分然后重新观察。十二、动作精度有什么区别Action Token 方法需要将连续值量化。假设动作范围是[-1, 1]如果只划分有限数量的离散区间每个真实动作都会被映射到最近的桶。这可能产生量化误差。连续生成方法则直接在连续空间中建模0.1317不需要先转换为Token 167因此从表示能力上看连续生成方式更适合高精度控制。但实际成功率并不只由动作表示决定。它还受到以下因素影响数据规模数据质量视觉模型机器人平台训练策略推理延迟动作归一化控制器。十三、训练目标有什么区别OpenVLA通常可以将动作预测视为 Token 分类问题L CrossEntropy( predicted_action_token, target_action_token )π0Flow Matching 路线通常训练模型预测速度L ||v_pred - v_target||²因此OpenVLA 学习正确动作 Token 的概率 π0 学习动作样本应该如何从噪声流向真实动作十四、推理过程有什么区别OpenVLA 推理输入图像和语言 ↓ 预测第一个动作 Token ↓ 预测第二个动作 Token ↓ 继续自回归生成 ↓ 解码为连续动作π0 推理输入图像和语言 ↓ 初始化随机动作噪声 ↓ 多次预测速度 ↓ ODE 数值积分 ↓ 得到连续 Action Chunk两种方式都可能需要多次模型计算。OpenVLA 的多次计算来自自回归 Token 生成。π0 的多次计算来自 Flow Matching 积分。十五、模型对比表对比项OpenVLAπ0π0.5核心路线Action Token连续动作生成连续动作生成与开放任务动作表示离散 Token连续动作连续动作生成方式自回归Flow MatchingFlow Matching 路线是否需要动作量化通常需要不需要不需要是否适合 Action Chunk支持适合适合主要关注点开源 VLA 与动作 Token通用机器人连续控制开放环境和复杂任务入门难度相对直观需要理解 Flow Matching需要理解更完整任务流程十六、初学者应该先学习哪个想理解 VLM 如何输出机器人动作建议先看 OpenVLA。因为其思路与语言模型比较接近输入 Token → 输出 Action Token想理解连续动作生成建议学习Diffusion Policy → Flow Matching → π0想研究复杂任务和开放环境在理解 π0 后再学习 π0.5 会更加顺畅。十七、常见误区误区一OpenVLA 输出的是动作文本Action Token 虽然使用 Token 表示但最终会被解码为连续机器人动作而不是自然语言描述。误区二π0 不需要视觉语言模型π0 仍然需要视觉和语言理解能力。Flow Matching 主要负责动作生成不负责独立完成全部场景理解。误区三π0.5 只是 π0 加强化学习π0.5 的变化不能简单概括为增加某一种训练方法。它涉及任务理解、数据和训练流程等多个层面。误区四连续动作一定优于 Action Token连续动作避免量化误差但模型性能还取决于大量其他因素。十八、总结OpenVLA、π0 和 π0.5 都属于 VLA 路线但它们的动作生成方式不同。OpenVLA 的核心是把动作离散化为 Token 像语言一样自回归生成π0 的核心是使用视觉语言模型理解任务 使用 Action Expert 生成动作 通过 Flow Matching 得到连续 Action Chunkπ0.5 则进一步关注开放环境 复杂语言指令 多阶段任务 更通用的机器人操作对于初学者可以按照以下顺序学习OpenVLA ↓ Diffusion Policy ↓ Flow Matching ↓ π0 ↓ π0.5VLA 入门五如何看懂一个 VLA 数据集本文介绍 Episode、Trajectory、Observation、Action、视频、Parquet 和 LeRobot 等概念帮助初学者真正看懂 VLA 数据目录和样本内容。摘要VLA 的训练数据并不是普通的图像分类数据。一条 VLA 数据通常由连续图像、机器人状态、动作、语言指令和时间信息组成。当我们下载 LIBERO、RoboTwin、RoboCasa 或 LeRobot 格式的数据时经常会看到episodes videos parquet metadata task state action timestamp本文将解释这些内容分别是什么以及如何检查一个 VLA 数据集能否直接用于训练。关键词VLA 数据集、LeRobot、Episode、Trajectory、Observation、Action目录[TOC]一、VLA 数据与图像分类数据有什么区别普通图像分类数据通常是一张图像 一个类别标签例如cat.jpg → cat dog.jpg → dogVLA 数据则是一段连续交互过程图像序列 机器人状态序列 动作序列 任务语言 时间信息例如任务把红色杯子放入盒子 第 0 帧 图像₀、状态₀、动作₀ 第 1 帧 图像₁、状态₁、动作₁ 第 2 帧 图像₂、状态₂、动作₂因此VLA 数据本质上是时序数据。二、什么是 EpisodeEpisode 可以翻译为回合一个 Episode 通常表示机器人从任务开始到任务结束的一次完整执行过程。例如Episode 0 打开抽屉成功 Episode 1 打开抽屉失败 Episode 2 把杯子放进盒子成功一个 Episode 中包含多个时间步Episode ├── Step 0 ├── Step 1 ├── Step 2 ├── ... └── Step T每个时间步通常包含当前图像当前状态当前动作时间戳任务信息。三、什么是 TrajectoryTrajectory 通常翻译为轨迹在很多机器人项目中Trajectory 和 Episode 的含义接近。都可以表示机器人完成一次任务时的完整序列τ { o₀, a₀, o₁, a₁, ... oₜ, aₜ }其中oₜ是时间t的观测aₜ是时间t的动作。有些项目会区分Episode完整环境回合 Trajectory其中的一段轨迹但也有项目直接混用两个术语。所以需要结合具体代码理解。四、什么是 ObservationObservation 表示机器人在当前时间步能够获得的信息。一个典型 Observation 可能包含observation { image: rgb_image, wrist_image: wrist_image, state: robot_state, }Observation 不一定等于环境的全部真实状态。例如仿真环境可能知道杯子的精确三维坐标但 VLA 策略实际只接收摄像头图像和机器人状态。这是因为真实机器人通常无法直接获得所有物体的精确状态。五、视觉 Observation机器人视觉输入可能来自多个相机。例如observation { camera_front: image_front, camera_wrist: image_wrist, }常见视角包括第三人称相机头部相机左腕相机右腕相机顶视相机。图像数据可能直接保存在数组中也可能单独保存为视频文件。六、机器人状态 Observation机器人状态通常包括关节角度 关节速度 末端位置 末端旋转 夹爪状态例如state [ joint_1, joint_2, joint_3, joint_4, joint_5, joint_6, gripper, ]也可能包含末端位姿state [ x, y, z, qx, qy, qz, qw, gripper, ]需要注意state_dim 不一定等于 action_dim机器人状态可能是 14 维但动作只有 7 维。七、什么是 ActionAction 表示机器人在当前时间步执行的控制信号。例如action [ delta_x, delta_y, delta_z, delta_roll, delta_pitch, delta_yaw, gripper, ]也可能是关节空间动作action [ joint_1_target, joint_2_target, joint_3_target, joint_4_target, joint_5_target, joint_6_target, ]查看数据集时必须确认动作是绝对值还是变化量动作单位是什么旋转如何表示夹爪值如何定义动作是否已经归一化。八、Observation 和 Action 如何对齐一个常见数据组织方式是oₜ → aₜ即看到时间t的观测后执行动作aₜ。动作执行后环境转移到下一个状态oₜ aₜ → oₜ₊₁但是不同数据集可能存在一帧偏移。例如第 t 行图像对应执行动作前或者第 t 行图像对应动作执行后如果对齐错误模型会学习错误映射。因此训练前最好可视化若干帧图像ₜ 状态ₜ 动作ₜ 图像ₜ₊₁确认动作与画面变化一致。九、语言指令如何存储任务语言可能存储为task pick up the red cup也可能使用任务 IDtask_index 17再通过元数据映射17 → pick up the red cup多任务数据集中一条 Episode 通常对应一个任务指令。但也有长序列数据一个 Episode 中可能包含多个阶段指令。十、时间戳和帧索引机器人数据通常包含timestamp frame_index episode_index例如{ episode_index: 12, frame_index: 37, timestamp: 1.85, }如果控制频率为 20 Hz那么相邻帧时间间隔约为0.05 秒时间信息可以帮助检查是否存在丢帧视频和动作是否同步控制频率是否稳定Episode 是否被正确切分。十一、为什么图像经常保存为视频如果每一帧都保存为单独图片会产生大量小文件。例如1000 个 Episode 每个 Episode 500 帧 2 个相机总共需要1000 × 500 × 2 1,000,000 张图片大量小文件会降低读取和文件系统效率。因此LeRobot 等格式通常把图像保存为视频videos/ ├── observation.images.front/ └── observation.images.wrist/表格数据中只保存Episode帧索引时间戳视频位置。训练时再从视频中读取指定帧。十二、Parquet 文件是什么Parquet 是一种列式存储格式。它适合保存结构化数据例如episode_index frame_index timestamp state action task_index与 CSV 相比Parquet 具有存储效率高支持数组类型读取部分列更方便适合大规模数据。一个简化的数据表可能是episode_indexframe_indexstateactiontask00[ ... ][ ... ]pick cup01[ ... ][ ... ]pick cup02[ ... ][ ... ]pick cup10[ ... ][ ... ]open drawer十三、LeRobot 数据格式的基本结构一个 LeRobot 风格的数据目录通常包含dataset/ ├── data/ ├── videos/ └── meta/data保存 Parquet 表格状态 动作 时间戳 Episode 编号 帧编号videos保存各个相机的视频front camera wrist camera left camera right camerameta保存数据集元信息例如特征维度 任务列表 Episode 数量 统计量 数据版本 帧率不同版本的具体文件名可能不同但核心思想相似数值信息放表格 图像信息放视频 数据定义放元信息十四、Action Chunk 样本是如何构造的原始数据通常每一行只有一个动作aₜ但模型可能需要预测未来 50 步[aₜ, aₜ₊₁, ..., aₜ₊₄₉]数据加载器会从当前时间步向后切片action_chunk actions[ t:t action_horizon ]如果 Episode 即将结束不足 50 步常见处理方式包括重复最后一个动作使用 Padding生成有效位 Mask丢弃该样本。例如action_mask [ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, ]其中0表示填充位置不参与损失。十五、图像历史和状态历史模型输入不一定只包含当前帧。有些模型会使用过去多帧[oₜ₋₂, oₜ₋₁, oₜ]这可以帮助模型理解运动趋势。例如仅看一张图像可能无法判断夹爪正在接近杯子还是夹爪正在远离杯子多帧历史可以提供时间信息。数据加载器可能构造image_history images[ t - history 1:t 1 ]十六、动作统计量有什么作用VLA 训练通常需要计算mean std min max quantile例如action_mean [...] action_std [...]训练时a_norm (a - mean) / std推理时a a_norm × std mean不同机器人或任务的动作分布可能不同。因此使用错误的统计量会导致动作幅度过大机械臂几乎不动夹爪控制异常旋转量爆炸。十七、训练集和评测环境有什么区别机器人训练数据通常由专家示范组成。评测时并不是重新播放这些数据而是启动一个新的仿真或真实环境 ↓ 模型根据当前观测输出动作 ↓ 环境执行动作 ↓ 统计任务是否成功因此训练数据用于学习 评测环境用于交互虽然训练任务和评测任务名称可能相同但评测时初始位置不同物体布局不同随机种子不同光照或纹理不同模型需要闭环控制。十八、如何快速检查一个 VLA 数据集第一步查看目录结构确认是否包含数据表 视频 元信息 任务定义第二步查看样本字段打印一条数据sample dataset[0] for key, value in sample.items(): print(key, type(value))第三步查看形状print(sample[image].shape) print(sample[state].shape) print(sample[action].shape)第四步查看数值范围print(action.min()) print(action.max()) print(action.mean())第五步播放一条 Episode将图像、动作和状态同步可视化。第六步确认动作定义查看环境中的env.step(action)到底如何解释动作。十九、一个简化的数据读取示例import pandas as pd df pd.read_parquet( data/chunk-000/file-000.parquet ) print(df.columns) print(df.head()) episode df[ df[episode_index] 0 ] states episode[observation.state] actions episode[action] timestamps episode[timestamp] print(Episode 长度, len(episode)) print(第一步动作, actions.iloc[0])如果图像单独存为视频还需要根据episode_index frame_index timestamp读取对应视频帧。二十、常见误区误区一数据集中的图像就是评测图像训练图像是专家示范轨迹中的观测。评测时图像由环境实时生成。误区二一个任务只有一条轨迹同一任务通常需要多条不同初始状态的示范。误区三动作维度相同就可以直接混合数据即使都是 7 维不同数据集的含义也可能不同。例如一个使用欧拉角 一个使用 Axis-Angle误区四Parquet 包含完整图像很多数据集的 Parquet 只保存索引和数值图像实际存储在视频文件中。二十一、总结一个典型 VLA 数据集由以下内容组成Episode Trajectory Observation Action Language Timestamp Metadata其中Episode 表示一次完整任务执行Observation 表示机器人当前看到和感知到的信息Action 表示机器人执行的控制信号视频保存视觉信息Parquet 保存状态、动作和索引元信息描述数据字段和统计量。看懂数据集的关键不是只看文件名而是确认每个字段代表什么 不同模态如何同步 动作如何定义 训练样本如何切片 动作如何归一化