跳转至

第 3 章 动作

一个网络看得再准、想得再清楚,最后都要变成几十个数字打到电机上。动作输出层是端到端这条线最容易被低估的地方,也是 2024-2025 年这一波 VLA 真正分胜负的战场。


2024 年中流出过这么一段双臂折 T 恤的内部视频。视频开头很顺,机械臂抓住领口,抖了一下展平,开始往中间叠。叠到一半的时候动作突然变得诡异:手臂不是平滑地往内收,而是一抽一抽地,像帕金森晚期,每隔大概 200 毫秒走一小步。T 恤被它折成了一团皱巴巴的东西。

机械本体没问题,1kHz 力控(按力的目标值闭环)测试是过的。问题在网络这一头。

那一版 VLA 输出的是 7-DoF(七个关节自由度)动作的离散 token,每个关节 256 个 bin,模型 5Hz 出一个动作 chunk(一次推理出一段连续动作),下游一个简单的 zero-order hold(保持上一帧值不变)把它撑到电机的控制频率。离散 5Hz 的动作命令撞上 1kHz 的伺服回路,结果就是看起来在抽搐。 token 之间相邻 bin 的实际关节角差了 1.4 度,那一小步在 200 毫秒内被电机硬拉过去,然后 hold 住,然后下一个 token 来了再硬拉一次。

这不是个别现象。RT-1 那一支线下来,凡是把动作离散成 token 喂给 transformer 的工作,在精细操作上都会撞这堵墙。不是网络不聪明,是动作输出层的频率和粒度,决定了机器人物理上能做哪类任务。这件事在 2023 年很少人讨论,到 2024 年下半年 π0 出来之后才变成主流话题。


先把动作空间的几种选择摆开。

关节角(joint position)。直接输出每个关节的目标角度。优点:跟低层控制器接口最干净,直接送 PD 控制器(按位置误差比例-微分反馈)就行。缺点:网络得理解机器人的运动学,"我要把手伸到杯子前"这件事它要算成 7 个关节各转多少度。这种映射不直观,数据效率低。

末端位姿(end-effector pose,机械臂最末端工具的位置加朝向)。输出 6-DoF(三个平移加三个旋转)末端的位置和姿态,下游 IK 求解器把它变成关节角。优点:跟视觉空间对齐,"杯子在那里"和"末端到那里"是同一套坐标。缺点:IK 有奇异点、有多解、机械臂构型受限。

Delta(增量)。输出当前末端位姿到下一帧的小增量。优点:网络只需要学局部修正,数据分布更窄,泛化更好。RT-1 / RT-2 / OpenVLA 主流都用 delta。缺点:误差累积。30 秒动作累 600 帧 delta,每帧 1mm 误差累起来就是 60cm。

关节速度 / 力矩。直接输出 dq/dt 或 tau。这个口子在端到端这一线几乎没人走,原因是 teleop 数据天然是位置数据,转成速度/力矩既不准也不稳定。Diffusion Policy 那一支偶尔在 sim 里这么做,真机几乎不见。

实际部署里最常见的选择是末端 delta + 夹爪开合度,6 + 1 维。π0、OpenVLA、Octo 默认都是这套。原因不是它最优,是它跟主流 teleop 设备(Vive tracker、SpaceMouse、双手控制器)的输出最匹配。这是一个被工具链锁死的默认值,不是被实验证明的最优值。


回到 RT-1 vs π0 那条最具体的分歧上。

RT-1(Brohan 等,Google,2022 年底)选了离散 token:每一维动作切成 256 个 bin,整条 action 变成 7 个 token,跟语言 token 一样喂进 transformer。这个设计的吸引力很直接:动作和语言用同一种表示,可以共用同一个 transformer,可以共用同一套预训练。RT-2 把这个思路推到极致,直接复用了 PaLM-E 的词表,把动作 token 加进去 fine-tune。

代价是连续控制被强行量化。256 个 bin 在大幅度运动里够用,在 1mm 级精细操作上不够。更糟的是 token 之间没有平滑约束,相邻预测之间可能跳一大步。你只能靠 chunk + interpolation 在下游兜,但兜的同时就放弃了动作本身的速度信息。

π0(Physical Intelligence,2024 年 10 月)选了完全相反的路:连续动作,flow matching(学一条把噪声"流"成动作的连续路径)输出。每一步推理出来的不是 token,是一段连续的 action chunk(通常 50 步动作,对应 1 秒),在连续空间里直接采样。flow matching 比 diffusion(这里指用扩散模型生成动作轨迹)收敛快,比直接回归更能建模多模态分布。这套打法在双臂折衣服上做出了第一段让大众觉得"这真不像 demo"的视频。

π0-FAST(PI,2025 年初)回头给离散 token 找补:用频域离散化(DCT,离散余弦变换之上做 BPE-like 压缩,即类似语言里子词合并的方式)把同样长度的动作 chunk 压成更少的 token,配合 inference dynamic programming(IDP,用动态规划在推理时并行展开多步)做并行解码,让推理频率从 π0 的 ~10Hz 拉到 30Hz+。本质是承认纯连续 flow matching 推理慢这件事,但又不愿意完全回到 RT-2 那种粗糙离散。

到 2026 年初这场分歧的现状是:纯离散 token 已经不再是主流选择,要么连续 flow / diffusion(π0、Diffusion Policy 系),要么频域离散+并行解码(π0-FAST 系)。RT-2 那种最朴素的 256-bin token 路线,在精细操作上基本被边缘化。


频率这一栏单独拎出来。

5Hz。RT-1 / RT-2 默认。能干什么:抓刚性物体、按按钮、开抽屉、打开微波炉门。这种任务接触瞬间很短,主要时间花在大幅度位移上,5Hz 的命令加上下游平滑足够。干不了什么:任何持续接触、任何形变物体、任何力敏感操作。

30Hz。OpenVLA、π0-FAST、Octo 主流频率。能干什么:折毛巾、折衣服、把东西塞进盒子、双臂协同。30Hz 大概是 2026 年的工程甜点。一方面 7B-级模型在 H100 / Orin 上推理稳定能跑到这个数,另一方面绝大多数家庭和实验室任务在 30Hz 下都看不出"抽搐"。

50-100Hz。Diffusion Policy 在 sim 里常用。开始能做轻接触装配、力控插销。

200Hz。接触多的精细操作的下限。打鸡蛋、剥香蕉、撕一片胶带:手指和物体之间力的变化是毫秒级的,5Hz 或 30Hz 抓不住这个时间尺度。这一档目前几乎没有 VLA 能稳定跑,主要靠底层 30Hz VLA 出 setpoint,上面叠一层 200Hz 的 impedance / admittance 控制器(让机械臂像弹簧一样按力顺应环境)

1kHz。传统力控、阻抗控制、抑振。VLA 现在不直接输出这一层。这一层是经典控制器的地盘。你的 VLA 通过更上层的 setpoint 间接影响它,但永远不该想着把网络的 forward pass 跑到 1kHz。

这几档对应的判断很简单:你的任务里"接触发生瞬间到反应"的时间尺度是多少。开抽屉是秒级,折毛巾是百毫秒级,打鸡蛋是十毫秒级。任务的接触特征决定了控制频率的下限,控制频率决定了动作输出层的设计。这个推理链在 demo video 里看不出来,所以一堆做家庭机器人的初创公司在选型时低估了它。


VLA 这条线 2022 到 2026 的家谱,按时间和分支排一下。

RT-1(Google,Brohan 等,2022 年底):130k teleop,离散 token,5Hz。把"端到端 VLA"这个范式立起来。

RT-2(Google,2023 年中):在 PaLM-E 55B 上 fine-tune,把互联网图文常识带进 action prediction。第一次能对没见过的物体做合理动作。

Octo(Berkeley,2024 年初):transformer 主干 + diffusion action head,95M 参数。开源、易 fine-tune,在学术界跑得很广。

OpenVLA(Stanford,2024 年中):7B 参数,基于 Llama-2 + DINOv2 + SigLIP,Open X-Embodiment 数据集训练。第一个像样的开源 VLA,2024 下半年到 2025 上半年是大多数学术 fine-tune 的起点。

π0(Physical Intelligence,2024 年 10 月):连续动作,flow matching,3B 参数。双臂折衣服、收拾餐桌的视频是这一波 demo 里第一段公认"不像剪辑"的。

π0-FAST(PI,2025 年初):频域离散 + IDP,把推理频率拉上来。

RDT-1B(清华,2024 年中):1B 参数双臂 diffusion 策略,国内最早一批严肃开源 VLA。在双手协同任务上做得不错,是国内做仿生抓取那一拨的常用底座。

GR00T N1(NVIDIA,2025 年):humanoid 通用基础模型路线。野心是"任何人形机器人下载就能跑的预训练权重"。系统设计上明显是 system 1 + system 2 双层。

Helix(Figure,2024-2025):宣称"第一个能给 humanoid 上半身做端到端控制的 VLA"。paper 写得偏宣传,但里面 system 1 / system 2 的拆分其实暴露了它不是纯端到端。

Diffusion Policy(Cheng Chi 等,Toyota Research,2023):严格说不算 VLA,没有 language。但它是动作输出层最重要的一支:用扩散模型生成 action chunk,第一次让大家意识到动作分布是多模态的,回归到一个均值是错的。这个 insight 后来被 π0 吸收成 flow matching 主干。

flowchart LR
  RT1["2022 末<br/>RT-1<br/>Google<br/>130k 演示<br/>5Hz 离散 token"] --> RT2["2023 中<br/>RT-2<br/>PaLM-E 55B<br/>互联网常识迁移"]
  RT2 --> OCT["2024 上<br/>Octo (Berkeley)<br/>OpenVLA 7B (Stanford)"]
  OCT --> P0["2024 末<br/>π0 (PI)<br/>flow matching<br/>RDT-1B (清华)"]
  P0 --> NEW["2025+<br/>π0-FAST (PI)<br/>GR00T N1 (NVIDIA)<br/>Helix (Figure)"]
  DP["Diffusion Policy<br/>(Cheng Chi, TRI 2023)"] -.->|多模态动作分布| P0

为什么扩散和 flow matching 在动作上对,跟语言模型那条线分支了?

语言模型用 cross-entropy loss 回归下一个 token,本质是在离散分布上做 MLE。这套在语言上对,因为语言 token 之间确实是离散的、词表是有限的。

动作不一样。同一个状态下"对的动作"通常不止一个。要把杯子从左边拿到右边,可以走一条直线、可以绕一个弧、可以先抬高再放下。这三条轨迹都是对的。如果你用 MSE 回归一个动作均值,模型会输出三条轨迹的平均:一条不平滑也不实用的折中轨迹。这是 behavior cloning 老问题,不是 VLA 才有的。

扩散和 flow matching 天然能建模多模态分布。给一个状态,它输出一整个分布,你从里面采样一条具体轨迹。哪一条不重要,重要的是采出来的每一条都是合理的,而不是几条合理动作的平均。

这就是 Diffusion Policy 那篇 paper 真正的贡献。它不是引入了一个新模型,是指出动作回归的损失函数错了。这件事后来 π0 接过去做成了 VLA 主干,整个 2024 年下半年的工作都在这条线上。


两个工程把戏顺手提一下,因为后面几章会反复用到。

动作 chunking。一次推理输出多步动作,不是一步。RT-1 一次 1 步,π0 一次 50 步(对应 1 秒)。这件事 ALOHA / ACT 那篇 paper(Stanford / Tony Zhao,2023)做出来。chunking 的真正价值不是省推理,是绕过 behavior cloning 的复合误差。一次决策 50 步,模型只需要在 chunk 起点做一次"我要往哪走"的决策,中间 49 步沿着 chunk 走,不会因为每步都要重新决策而漂走。

Receding horizon control(滚动时域控制,预测一段、只走一段、再重预测)。chunking 配套的执行策略:每次预测 50 步,但只执行前 K 步(通常 8-16),然后重新预测。这样既保留了 chunk 的稳定性,又能根据新观测修正后续动作。这个名字是从 MPC 借来的,思路也是 MPC 那一脉。

这两个把戏现在是 VLA 的标配。任何一篇严肃 VLA paper 不写这两件事都说明实现没做到位。


"动作之上加层"是 2024 年另一条值得提的小分支。

RT-Trajectory(Google,2024):发现端到端 VLA 学不会复杂轨迹(比如沿着圆弧画一个图案),于是改成"先用一个轻量模型生成 2D 轨迹草图,再让 VLA 沿着草图执行"。本质是把"动作生成"拆成"轨迹生成 + 轨迹跟踪"两层。这件事在 2010 年代是经典栈的标配,RT-Trajectory 是端到端这一线第一次承认这层有用。

RT-H(Google,2024):在动作之上加一层"语言 hierarchy"。具体动作之上有一个"运动概要"层(move arm forward, close gripper),用语言描述。这层既能让人解释模型在干什么,又能在 fine-tune 时用文本数据补强。

这两个工作合起来传递一个信号:端到端到了某个复杂度之后,必须重新引入中间表示,而中间表示长什么样还没收敛。RT-Trajectory 用的是几何中间层,RT-H 用的是语言中间层,π0 那一线用的是隐式的 chunk 中间层。三条路都还在跑。


把这一章和第 1 章接上。

第 1 章那张端到端 vs 分层判断表,最重要的两行是持续时间和失败代价。这一章其实是在更细的尺度上重复同一个判断:动作输出层选什么,本质也是分层粒度的选择。

纯离散 token + 5Hz:相当于在动作输出层完全不分层,把所有控制责任压给一个网络。这种选择只在大幅度、低接触、容错高的任务上 work。

flow matching + 30Hz + chunking:在动作内部已经有了隐式分层 - chunk 起点是高层决策,chunk 内 50 步是底层展开。这是当前 SOTA。

VLA 出 30Hz setpoint + 底层 200Hz/1kHz 经典控制器:显式分层,VLA 不碰力控。这是工业部署的事实标准。

VLA 出语言级动作描述 + 下层小策略执行(RT-H 路数):在动作语义上分层。还在实验阶段。

没有一种动作输出方案是普适的。同一家公司,家庭场景用第三种,仓库场景用第二种,研究 demo 用第一种。这件事跟"端到端 vs 分层"在大尺度上要做的判断一样:先看任务,再选层数,再选每层的实现。

回到本章开头那个抽搐的折 T 恤 demo。他们后来怎么救的?把动作头从 RT-1 风格的离散 token 换成 Diffusion Policy 的 chunk 输出,频率从 5Hz 提到 30Hz,下游接 100Hz 的 admittance 控制器吃接触力。同一组数据,同一台机器人,第二个版本的视频里看不出任何抽搐。

这不是一个网络问题,是一个动作输出层的工程问题。2026 年还在被反复犯。


练习

找一段你看过的 VLA demo 视频,盯着机械臂运动的速度曲线看 30 秒。在哪一段动作明显不连续?是夹爪闭合的瞬间,还是某个中间点?这个不连续点对应的是动作头的 chunk 边界,还是某个具体的 token 跳变?

找 RT-1 和 π0 各一篇 paper,只读 action representation 那一节。RT-1 用 256-bin tokenization,π0 用 flow matching。把两者在折毛巾这种任务上的优劣写下来,三条以内。如果你写不出来三条,是你对任务的接触特征理解还不够。

把 Diffusion Policy 那篇 paper 找出来,只看 figure 1 那张 multimodal action 的图。再找一篇 behavior cloning 的老 paper(任意 2018 年之前的),看它怎么处理多模态。两种处理方式的差距用一句话总结。

在你自己的项目里(如果在做 VLA 或者打算做),列出你的动作空间、频率、chunk 长度、下游控制器频率这四个数。这四个数之间能对得上吗?典型的失败是 VLA 30Hz chunk 长度 1 秒,下游接 5Hz 的 IK 求解器。这种组合 chunk 内 96% 的信息会被丢掉。

下一章:第 4 章 抓取