☰
启元机器人论文解读:π0 —— 流匹配动作专家如何让 VLM 输出高频连续动作
2026/11/3 19:17:57 网站建设 项目流程

引言

大家好,我是桃花键神。

2024 年 10 月,Physical Intelligence 发布了 π0(pi-zero),论文题目是《π0: A Vision-Language-Action Flow Model for General Robot Control》(arXiv:2410.24164,后来收录进 RSS 2025)。2025 年 2 月,团队用 Apache 2.0 协议开源了权重和代码(openpi 仓库)。

π0 要解决的问题特别具体:预训练 VLM 擅长理解图像和语言,但它的输出方式是离散 token 自回归,而机器人要的是高频、连续、平滑的动作。怎么把一个只会"吐 token"的模型,改造成能"吐动作"的控制器?

打个比方。VLM 像个只会写书面报告的参谋,一板一眼往外蹦词儿。可机器人要的是个能连续做动作的老师傅,手上不能停。这俩怎么捏到一块儿?

本文就顺着这条主线拆:动作专家(action expert)架构、流匹配(flow matching)生成方式、训练策略,然后是实验结论,最后聊它对启元机器人开发实践的启发。文中参数都标了论文或官方仓库出处,对得上号。

1. 研究背景:离散 token 化动作的天花板

1.1 自回归离散动作的局限

RT-2、OpenVLA 这些早期 VLA 模型的做法是:把每个动作维度离散化成 token,用 next-token prediction 一个一个往外蹦。这条路工程上能跑,但有两个硬约束:

  • 频率不够。动态灵巧任务要大约 50 Hz 的控制频率,逐 token 生成的吞吐撑不住。
  • 精度损失。连续动作被强行量化成离散 token,高频动作的细微变化直接被抹平了。

一个直观的例子。模型能正确"认出这是一件衬衫",但未必能把它叠好。叠衣服要的是精细、高速的动作,用低频离散 token 表示,等于把细节全丢了。

这就像用马赛克画质去描工笔画,轮廓能对上,笔锋全没了。

1.2 数据依然稀缺

跟同期工作一样,π0 面对的还是真机数据贵、跨本体数据难统一的老问题。π0 的解法很直接:不做从零训练的小模型,而是继承互联网规模的语义知识,再用跨本体机器人数据训出"物理动作"能力。

说白了,语义这块白捡现成的,动作这块自己补。

2. 核心方法:VLM 骨干 + 动作专家 + 流匹配

2.1 VLM 骨干:PaliGemma 3B

π0 基于 Google 的 PaliGemma(3B 参数)视觉-语言模型构建,用它处理摄像头图像观测和自然语言任务指令,继承互联网规模的语义知识。

这里有个点容易被忽略,骨干并不是冻结的。论文从 PaliGemma 初始化后,在机器人数据混合上继续训练。唯一的训练损失是作用于动作输出的流匹配损失,没有文本损失,骨干只通过从动作 token 回传的梯度被更新。

有意思吧?没有文本损失,等于告诉骨干:"你不用再学说话了,把手上的活儿干好就行。"

2.2 动作专家:一组独立权重

图注:π0 动作专家:18 层 Transformer、宽度 1024、MLP 4096,10 步流匹配去噪后一次输出 50 步动作块

π0 采用"动作专家"(action expert)设计,可以理解为一种混合专家(mixture-of-experts)风格的结构:

  • VLM 专家:由预训练 PaliGemma 权重初始化,管视觉与文本 token。
  • 动作专家:随机初始化、从零训练,专门处理本体感知状态(如关节角)与动作 token。

论文给的规模是:动作专家约 300M 参数(18 层,宽度 1024,MLP 4096,约 311M 参数),叠加 PaliGemma 后模型总量约 3.3B 参数。

那问题来了,动作专家凭什么比骨干小这么多?

答案在计算量。一次决策里,骨干只跑 1 次,动作专家要随去噪迭代跑大约 10 次。论文给的开销对比是:一次欧拉步约 2.7 ms,而一次观测前向传播约 32 ms。

这么一算就明白了。骨干跑一次 32 ms,动作专家跑十次才 27 ms。把动作专家做小,不是偷工减料,是实时性的必要权衡。

2.3 流匹配:从噪声中"积分"出动作

π0 不在动作上做离散 token 化,而是用流匹配(flow matching)生成连续动作块:

  • 学一个向量场,把噪声逐步"推"向目标动作分布;
  • 推理时用欧拉积分(Euler integration)迭代约 10 步去噪;
  • 一次输出H=50 步的 action chunk,对应 50 Hz 下 1 秒的运动。

这个思路打个比方。离散 token 像走楼梯,一步一个台阶,台阶之间没法停;流匹配像滑滑梯,从顶上(噪声)一路滑到底(目标动作),中间每一寸位置都是连续的。

一次性输出一段动作而不是单步动作,好处有两个:摊薄了推理延迟,轨迹也更平滑连贯。

2.4 信息流动:分块因果注意力掩码

两个专家之间的信息流,由分块因果注意力掩码(block-wise causal attention mask)控制:

  • VLM 块只关注自身;
  • 本体感知块关注自身与 VLM;
  • 动作块关注所有其他块。

架构与数据流示意:

配图说明:上图为 π0 的双专家数据流。VLM 骨干负责语义理解且每次决策只前向一次;动作专家接收骨干输出,通过 10 步流匹配去噪,一次性产出 50 步连续动作块,在 50 Hz 控制下对应 1 秒运动。

π0 与离散 token 类 VLA 的关键差异:

维度

RT-2 / OpenVLA(离散 token)

π0(流匹配)

动作表示

离散 token,逐 token 预测

连续值,整块生成

单次输出

单步动作

50 步动作块

生成方式

next-token prediction

流匹配 + Euler 积分

适用频率

较低

最高约 50 Hz

3. 训练策略:先广后精的两阶段

π0 用的是类似大语言模型的训练配方:先大规模跨本体预训练,再针对具体任务做后训练(微调)。

这路子大家应该熟。就像先读万卷书打底子,再针对一个岗位集中练技能。

3.1 预训练数据

图注:π0 预训练覆盖:7 种机器人配置、68 个任务、10,000+ 小时真机数据,统一映射到同一个动作空间

论文披露的训练数据规模:

  • 约10,000 小时灵巧操作数据,约903M 时间步;
  • 覆盖7 种不同机器人配置(含单臂 UR5e / Franka、双臂 Bimanual UR5e / Trossen / Arx、移动操作 Mobile Trossen / Fibocom 等),共68 个任务;
  • 混合开源数据:Open X-Embodiment(Bridge v2、DROID 等),约占训练时间步的9.1%;
  • 任务从简单物体搬移,到叠衣服、清理餐桌、组装纸箱、装袋、准备咖啡这类多步长程任务。

10,000 小时是什么概念?一个人不吃不喝干一整年,也就八千多小时。这个量级,靠个人开发者自己采基本没戏,所以复用开源权重才是正解。

3.2 后训练(微调)

好家伙,这才是重点。论文及团队披露:微调到一个新任务,通常1 至 20 小时的演示数据就能拿到可用效果。

这个量级对个人开发者和小团队来说,是真的有现实意义。它意味着定制一个专属 Skill,不必从零采集上万小时数据。从 10,000 小时到 1–20 小时,差了三个数量级,这就是预训练的价值。

4. 实验设计与关键结论

4.1 主要结论

图注:读“成功率”的四个步骤:任务定义 → N 次试验 → 统计口径 → 同口径对比基线

  • 基准对比:在论文设定的 5 项基准任务上,π0 优于此前的通用机器人模型(包括 OpenVLA、Octo)。
  • 零样本与微调双能力:既能不经微调直接按提示执行任务,也能在复杂长程任务上通过微调达到强性能。
  • 长程任务:可完成持续数十分钟的任务,如清理摆有陌生物体的桌面。
  • 推理开销:完整 π0(3B)约需 1 张 H100;单个动作块(50 步)推理延迟约 50–200 ms。

4.2 π0-FAST 与 π0.5

  • π0-FAST:自回归变体,用 FAST(Frequency-space Action Sequence Tokenization)把连续动作序列经离散余弦变换(DCT)压缩成离散 token 后自回归预测。训练速度约快 5 倍,在叠衣服、清理桌面、装袋等任务上与 π0 性能相当,代价是推理时的自回归解码更慢。
  • π0.5(arXiv:2504.16054,2025.04):面向开放世界泛化,目标是在与训练环境差异较大的场景(如未见过的房间)中仍然有效。

4.3 客观看待局限

这块不能光说好话,几条边界得摆出来:

  • 论文中的对比结论来自作者自评,评测环境与任务集由作者设定,跨论文横向比较要谨慎。
  • 完整模型推理需约 1 张 H100 级 GPU,对个人开发者的硬件门槛不低。
  • 10,000 小时级别的数据规模,是团队自建采集体系的结果,普通开发者难以复现预训练阶段,但可以复用其开源权重做微调。

所以,把 π0 看成**"VLM + 连续动作头"这一架构范式的工程验证**,比把它看成一份性能榜单要准确得多。榜单会过期,范式不会。

5. 对启元机器人开发实践的启发

5.1 动作块(action chunk)与控制接口的衔接方式

π0 一次输出 50 步动作块而不是单步动作,这个设计对二开的直接影响是:策略层与执行层应当解耦。

在基于「PrimeBot SDK」(Q1 SDK v0.1.2.7,ROS2 Humble + FastDDS)开发时,可以参考这个分层:策略节点以较低频率发布一段轨迹(action chunk),由底层控制节点按控制周期插值执行。

这样做的好处有两个:能容忍策略推理的抖动与延迟,也避免了把大模型推理直接放进实时控制回路。

启元「PrimeConsole」提供的"在虚拟环境中模拟全身关节运动、提前验证轨迹与控制逻辑"的能力,正好可以用来做这类轨迹的先期验证。先仿真跑通,再上真机,省下的是真机摔跤的成本。

5.2 微调数据量级:Skill 定制的现实参考

π0 披露的"1–20 小时演示数据可微调一个新任务",对启元 Skill 开发者是个很有价值的量级参考。

启元在 AtomGit 上开源的 Skill 示例(如carry-clothes家务搬运技能,基于 PrimeBot SDK / ROS2 Humble;weather_forecast、didi_taxi_agent等语音交互技能),展示了单技能的实现结构。

要在此基础上做场景定制,可以参考 π0 的思路:先复用预训练的动作先验,再用有限的目标场景演示数据做校准,而不是为每种新场景重新采集完整数据集。

其实这就是个投入产出比的问题。你是为了换一个场景,重采一万小时数据,还是采二十小时做微调?答案不言自明。

5.3 开源协议与数据格式的可借鉴之处

openpi 以 Apache 2.0 开源,包含 π0 与 π0-FAST 权重、微调配置示例、推理代码,以及面向 ALOHA、DROID 等平台的 checkpoint。

它的价值不只在权重,更在于提供了一套可参考的机器人数据组织规范(观测、动作、状态怎么封装)。

对启元生态的开发者来说,在设计自己的数据采集与 Skill 数据结构时,参考这类已经形成共识的组织方式,后续复用社区工具链和预训练成果会顺畅很多。再结合启元已开源的 URDF 描述包(q1-urdfQ1 V3.0、t1-urdfT1 V3.0),就能比较完整地对齐"结构描述—数据采集—策略训练"这条链路。


附:流匹配去噪的最小可运行示例

下面的片段用 NumPy 演示流匹配推理的核心逻辑——从噪声出发,按学习到的向量场做若干步欧拉积分,得到目标动作块。可独立运行,用来理解 π0 动作生成的基本原理(非官方实现,仅为原理示意)。

# flow_matching_demo.py # 环境:Python 3.9+ / NumPy >= 1.23 # 说明:演示 flow matching 的欧拉积分解码过程(原理示意,非 π0 官方实现) import numpy as np def euler_sample(vector_field_fn, shape, steps=10, seed=0): """ 从标准正态噪声出发,用欧拉积分沿向量场去噪,返回生成结果。 vector_field_fn(x, t) -> 速度场,t ∈ [0, 1] """ rng = np.random.default_rng(seed) x = rng.standard_normal(shape).astype(np.float32) # t=0: 纯噪声 dt = 1.0 / steps for i in range(steps): t = i * dt v = vector_field_fn(x, t) x = x + v * dt # 欧拉步 return x if __name__ == "__main__": # 构造一个指向固定目标动作块的简单向量场(真实场景由网络预测) target = np.zeros((50, 14), dtype=np.float32) # 50 步 × 14 维动作 target[:, 0] = np.linspace(0.0, 1.0, 50) # 一段平滑轨迹 vf = lambda x, t: (target - x) / max(1e-3, 1.0 - t) # 直线路径的速度场 action_chunk = euler_sample(vf, shape=(50, 14), steps=10) print("action chunk shape:", action_chunk.shape) # (50, 14) print("首步动作:", np.round(action_chunk[0, :3], 4)) print("末步动作:", np.round(action_chunk[-1, :3], 4))

代码说明:steps=10对应 π0 推理时的欧拉积分步数;输出(50, 14)对应 H=50 步的动作块。真实部署中vector_field_fn由动作专家网络预测,此处用解析向量场替代以便独立运行验证。

跑一遍就能看到:从一堆随机噪声出发,十步之后收敛到一段平滑轨迹。流匹配的原理,就是这样。

6. 小结

π0 的核心贡献可以概括为三项:

  1. 架构上,用"VLM 骨干 + 独立动作专家"的双专家结构,在不破坏预训练语义能力的前提下加入连续动作生成能力;
  2. 生成方式上,用流匹配替代离散 token 自回归,支持 50 Hz 级别的连续动作块输出;
  3. 训练配方上,用"大规模跨本体预训练 + 小规模高质量微调"的两阶段策略,把定制一个新技能的数据门槛压到 1–20 小时量级。

跟 GR00T N1 的显式双系统(10 Hz VLM + 120 Hz DiT)相比,π0 更像是"单骨干 + 专用动作头"的紧耦合方案。两者共同验证了一件事:机器人基础模型的关键不在参数规模,而在如何让语义理解与连续控制各自以合适的频率、合适的表示方式协同工作。


最后哔哔。我读下来最大的感受是:π0 最聪明的不是模型多大,而是它把"语义"和"动作"这两件频率完全不同的事,干净地拆给了两个专家去干。

一句话结论:别再纠结 VLA 模型该多大,先想清楚语义和动作该以什么频率、什么表示方式各干各的。

相关资源(指路)

  • 论文:π0: A Vision-Language-Action Flow Model for General Robot Control(arXiv:2410.24164,Physical Intelligence,2024.10 / RSS 2025)
  • 后续工作:π0-FAST(FAST tokenization);π0.5(arXiv:2504.16054,2025.04)
  • 代码与权重:openpi(GitHub,Apache 2.0,2025.02 开源)
  • 启元机器人开发者社区:启元机器人开发者社区 · 一站式具身智能研发平台
  • 启元开源项目:PRIMEBOT - 开源代码托管,代码协作 - AtomGit

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询