跳转至

第 84 章:VLA 驱动的移动操作——openpi / LeRobot 精读

元信息
难度 ⭐⭐⭐(VLA 架构、动作接口、数据闭环与部署边界)
预计时间 1.5 周(30-35 小时)
前置依赖 复合/50_操作技能接口,复合/120_底盘臂联合规划,复合/130_OCS2_mobile_manipulator
核心主线 VLA 不是直接控电机,而是语义、视觉、动作接口和低层控制之间的分层闭环

前置自测

在开始本章前,请独立回答以下问题。 如果有两个以上答不出,建议先回顾对应章节。

# 问题 回顾入口
1 Nav2 + MoveIt2 的移动操作流水线如何把“到达目标区域”和“末端抓取”连接起来? 复合/120 与复合/130
2 OCS2 mobile_manipulator 中状态、输入和 SE(3) 末端误差分别如何定义? 复合/130
3 Diffusion Policy 为什么使用动作片段而不是单步动作? 复合/30 的 73.9 与模仿学习章节
4 低层 WBC/MPC 的更新频率为什么通常高于视觉策略? 复合/20 与复合/30
5 如果视觉策略输出越过关节限位的目标,应该由哪一层处理? 复合/30 多模态 MPC

本章目标

  1. 理解 VLA 在移动操作中的真实位置:高层语义和动作生成,而不是裸电机控制。
  2. 能画出 openpi/π0、LeRobot、ACT、Diffusion Policy 与安全过滤层之间的数据流。
  3. 能区分关节动作、末端动作、delta 动作、token 动作和 flow 动作的接口差异。
  4. 能为一个移动操作任务设计 record、train、eval、deploy 的闭环流程。
  5. 能判断 VLA 适合的任务边界,并说明何时必须保留 MPC、WBC、碰撞检测和限位保护。

前置依赖与下游连接

  • 复合/120_底盘臂联合规划:提供传统 Nav2 + MoveIt2 + OCS2 的基线。
  • 复合/130_OCS2_mobile_manipulator:提供 SE(3) 末端误差、约束和安全过滤的控制基础。
  • 复合/150_Mobile_ALOHA与UMI:下一章会从数据采集角度解释 VLA 为什么依赖高质量示教。

下游章节会继续使用本章的概念。 - 复合/260_VLA_Foundation_Model 会把本章接口推广到跨本体基础模型。


84.0 知识地图:VLA 移动操作闭环

本章不是把多个论文名称排成清单,而是建立一棵可以复用的知识树。 根节点是任务闭环:人类给出目标,系统理解场景,策略给出动作接口,低层控制保证真实机器人安全执行。 每一个模型、数据集和开源项目都挂在这棵树上的某个位置。

VLA 移动操作闭环
├── 任务语义
│   ├── 语言指令
│   ├── 对象与目标
│   └── 子任务分解
├── 视觉表征
│   ├── RGB/RGB-D
│   ├── 多相机时间同步
│   └── 场景 token 与可操作区域
├── 动作接口
│   ├── 关节片段
│   ├── 末端位姿片段
│   ├── delta 动作
│   ├── 离散动作 token
│   └── flow 速度场
├── 数据闭环
│   ├── record
│   ├── normalize
│   ├── train
│   ├── eval
│   ├── replay
│   └── deploy
├── 低层控制
│   ├── 插值控制
│   ├── 限位保护
│   ├── 碰撞检查
│   ├── MPC safety filter
│   └── WBC/PD 执行

本质洞察:VLA 的价值不是跳过机器人学, 而是把开放世界语义、视觉表征和任务条件转换成可被控制系统消费的动作接口。 低层控制仍然负责频率、力、稳定性和安全边界。

层级 输入 输出 典型频率 主要风险
任务语义层 语言、目标、场景记忆 子任务、技能选择、目标对象 0.2-2 Hz 语义错解、目标歧义
视觉表征层 RGB/RGB-D/本体状态 物体、可操作区域、场景 token 5-30 Hz 遮挡、反光、视角偏移
动作接口层 表征 + 指令 EE 目标、关节片段、夹爪命令 5-50 Hz 动作越界、时序漂移
控制执行层 参考轨迹、当前状态 力矩、速度、位置命令 100-1000 Hz 碰撞、失稳、饱和

84.1 VLA 革命的正确读法 ⭐⭐

动机:为什么“端到端”容易被误解?

端到端的意思是训练目标从观测映射到动作接口,不等于让语言模型直接给电机电流。 真实机器人有频率、限位、碰撞、通信和力控约束,这些约束不会因为模型变大而消失。 把 VLA 看成高层策略会更准确:它决定做什么、朝哪里做、用什么动作片段做。

反例与递进理解

  • 反例:把“端到端”理解成语言模型直接写电机命令,离线演示可能看起来连贯,实机却会绕过限位和急停语义。
  • 机制:VLA 应先输出任务条件下的动作参考,再由 adapter、过滤层和控制器把参考变成可执行命令。
  • 工程接口:本节要求显式定义 observation schema、action schema、控制频率和拒绝条件。
  • 失败模式:一旦接口含糊,调试时很难判断错误来自语义理解、动作解码还是底层执行。

来龙去脉

RT-1 把视觉和语言条件接到离散动作 token,RT-2 把网页知识迁移到动作输出。 以论文和官方发布为准,OpenVLA 可作为开源 VLM 与离散动作接口结合的代表性路线理解,π0 可作为视觉语言条件下连续 flow matching 动作头的代表性路线理解。 这些路线共同改变的是策略表示,不是低层控制物理规律。

核心机制

  • VLA 输入通常包含图像、语言和本体状态。
  • VLA 输出通常是动作片段,而不是单个力矩。
  • 动作片段必须经过反归一化、限幅、插值和安全检查。
  • 执行层仍由机器人驱动、控制器和实时系统完成。

数学接口

$\(o_t = (I_t, l, q_t, \dot q_t), \quad a_{t:t+H}=\pi_\theta(o_t)\)$ 其中 \(a_{t:t+H}\) 是动作接口序列,而不是电机层最终信号。

工程接口

  • 定义 observation schema,明确每个相机、关节和语言字段。
  • 定义 action schema,明确维度、单位、坐标系和执行频率。
  • 在部署前加入 action validator,拒绝不可执行片段。

⚠️ 常见陷阱

  • 概念误区:把“端到端”理解成“跳过控制”。正确理解是学习策略给出参考,控制层执行参考。
  • 工程陷阱:训练集动作单位是弧度,部署端按角度解释,结果会瞬间越界。
  • 思维陷阱:只看成功视频,不看失败分布,会高估模型对异常状态的恢复能力。

练习

  • 画出一个从语言到关节命令的完整闭环,并标注每一层频率。
  • 列出一个 VLA 输出必须被拒绝的动作片段,并说明拒绝条件。
  • 比较传统 TAMP 与 VLA 在“整理桌面”任务中的分工差异。

跨章桥接

回顾复合/30:MPC 的价值在于显式约束和预测控制。 本章把 VLA 放在 MPC 上游,让它产生任务参考,而不是替代约束求解。

84.2 观测接口:图像、语言与本体状态 ⭐⭐⭐

动机:为什么只给一张 RGB 图像通常不够?

移动操作的观测不是静态图片,而是带时间戳的多源状态。 机器人需要知道自己在哪里、手在哪里、目标在哪里,以及动作执行到哪一步。 视觉只提供外部世界,本体状态提供动作闭环的相位。

反例与递进理解

  • 反例:只给模型一张前视 RGB 图,机器人在移动后仍按旧视角判断目标,腕部相机看到的接触状态也无法进入决策。
  • 机制:观测接口必须把图像、语言、本体状态和上一动作放到同一时间轴上。
  • 工程接口:每一路相机都要有名称、坐标系、分辨率、时间戳和预处理版本。
  • 失败模式:观测缺字段时,策略往往不是立即崩溃,而是在遮挡、反光或底盘转向时稳定犯错。

来龙去脉

早期视觉伺服使用图像特征闭环,RT 系列、OpenVLA 与 π0 等公开路线可作为从视觉 token 到多模态骨干演进的代表性例子。 多相机和本体状态的加入,是从桌面操作走向移动操作的关键。

核心机制

  • 相机外参决定图像 token 与机器人坐标系如何对应。
  • 关节状态决定同一视觉目标是否可达。
  • 语言指令决定模型应该关注哪个对象和哪个任务阶段。
  • 历史观测可以缓解遮挡和动作迟滞。

前视相机 vs 腕部相机的功能分工

相机 提供什么 不提供什么 最关键的任务阶段
前视 场景全局布局、导航目标、物体位置 接触细节、末端精确位置 导航、目标选择
腕部 末端精确位置、接触面细节、抓取姿态 全局布局、远处物体 对准、抓取、插入

在移动操作中,两种相机在不同阶段切换主导地位。导航阶段前视相机主导——腕部相机此时可能只看到天花板或地面。接触阶段腕部相机主导——前视相机此时被机械臂遮挡或距离过远。

反事实推理:如果只使用前视相机会怎样?在接触阶段,前视相机看到的是手臂的背面遮挡了目标物体。模型只能根据前几帧的记忆判断物体位置,但物体可能在接近过程中被推动了。缺少腕部视角的实时闭环,抓取精度会显著下降。这就是为什么 Mobile ALOHA 和大多数双臂系统都使用腕部相机。

数学接口

$\(o_t = \{I_t^{front}, I_t^{wrist}, q_t, a_{t-1}, l\}\)$ \(a_{t-1}\) 常被加入观测中,用于让策略知道上一片段执行状态。

工程接口

  • 相机帧统一命名:front、wrist_left、wrist_right、overhead。
  • 所有观测使用同一单调时钟,并保留采集时间戳。
  • 图像预处理必须与训练一致,包括裁剪、缩放、颜色空间和归一化。

⚠️ 常见陷阱

  • 编程陷阱:训练时图像是 RGB,部署时 OpenCV 默认 BGR,颜色错位会导致策略关注错误区域。
  • 概念误区:以为腕部相机越多越好;相机越多,同步和遮挡管理越难。
  • 工程陷阱:本体状态延迟 40ms,图像延迟 120ms,直接拼接会把不同时间的世界混在一起。

练习

  • 设计一个三相机观测 schema,写出每个字段的单位、频率和时间戳来源。
  • 把一个 30Hz 相机与 100Hz 关节状态对齐,说明插值策略。
  • 分析为什么移动底盘上的相机外参漂移会破坏 VLA 泛化。

84.3 任务语义层:语言不是轨迹 ⭐⭐

动机:语言指令如何变成可执行目标?

“把杯子放进水槽”不是轨迹,而是一个带对象、位置、约束和结束条件的任务。 VLA 可以把语言和视觉绑定到动作,但系统仍需要明确任务成功判据。 在移动操作中,语言还隐含导航目标、操作姿态和失败恢复策略。

反例与递进理解

  • 反例:语言指令只写“把杯子放好”,系统没有对象实例、目标区域和终止条件,执行层无法判断何时停止。
  • 机制:语义层要把自然语言转换成目标对象、空间关系、约束和可检测完成条件。
  • 工程接口:target message 中应保留对象 id、目标 frame、允许动作集合和阶段退出条件。
  • 失败模式:目标歧义会表现为反复切换抓取对象,而不是单纯的视觉识别失败。

来龙去脉

SayCan 用语言可行性与技能可执行性相乘,VoxPoser 把语言转成 3D 值图。 现代 VLA 更倾向直接生成动作片段,但语义 grounding 的问题仍然存在。

核心机制

  • 语言层输出可以是技能名称、目标对象、目标位姿或动作条件。
  • 语义层应该避免输出低层力矩,因为它没有实时反馈和物理约束。
  • 任务成功判据必须可观测:物体进入容器、夹爪闭合、目标位姿误差低于阈值。

语义 grounding 的三个层次

层次 从语言到 示例 困难度
对象级 目标对象实例 "红色杯子" → 场景中某个特定杯子 开放词汇检测 + 实例追踪
关系级 空间关系 "放进水槽" → 水槽的可放置区域 3D 语义理解
动作级 可执行操作 "轻轻放下" → 低速接近 + 缓慢释放 语言到动作参数映射

跨领域类比:语义 grounding 类似于编译器中的"符号解析"——代码中写 print(x),编译器需要确定 print 指的是哪个函数、x 指的是哪个变量。在语言到机器人的映射中,"杯子"需要绑定到场景中的一个物理对象实例,"放"需要绑定到一个可执行的动作原语。未解析的符号会导致编译失败,未 grounding 的语义会导致执行失败。

数学接口

$\(\text{goal}=(\text{object}, \text{relation}, \text{region}, \text{terminal condition})\)$ 例如 goal = (cup, inside, sink, cup stable for 2s)。

工程接口

  • 把语言解析结果写入 target message,而不是直接拼接自然语言到控制器。
  • 对可执行对象列表做开放词汇检测,但对动作命令使用有限集合。
  • 给每个子任务定义进入条件和退出条件。

⚠️ 常见陷阱

  • 概念误区:语言模型“理解了任务”不等于机器人能执行任务。可执行性来自感知、运动学和控制约束。
  • 工程陷阱:目标对象同名但实例不同,模型可能抓错杯子。需要对象实例跟踪。
  • 思维陷阱:把长任务一次性交给策略,忽略中间失败检测。

练习

  • 把“整理餐桌”拆成 5 个可观测子任务。
  • 为“打开抽屉”定义语言层输出和控制层输入。
  • 设计一个目标歧义检测规则:当两个杯子都符合描述时系统应如何处理?

84.4 动作接口:关节、末端、delta 与 token ⭐⭐⭐

动机:VLA 到底输出什么?

动作接口是 VLA 部署成败的核心。 同一个模型可以输出关节位置、末端位姿、夹爪开合、delta 轨迹或动作 token。 接口选择决定了数据采集方式、跨平台迁移难度和低层控制责任。

反例与递进理解

  • 反例:同一个策略在训练时输出归一化关节 delta,部署端却把它解释成末端位姿增量,动作方向会完全错位。
  • 机制:动作接口必须说明空间、单位、维度、horizon、执行频率和反归一化统计量。
  • 工程接口:action validator 先检查范围、速度、frame 和可达性,再允许低层执行。
  • 失败模式:动作空间错配通常先表现为抖动、漂移或夹爪时序错位,随后才出现碰撞风险。

来龙去脉

ACT 使用 action chunking 直接预测未来关节序列。 Diffusion Policy 生成连续动作序列。 以公开论文和官方发布为准,OpenVLA 可作为离散动作 token 路线理解,π0 可作为连续 flow matching 动作头路线理解,FAST 可作为用 DCT 与 BPE 压缩动作片段的代表性思路。

核心机制

  • 关节动作最接近硬件,但跨本体迁移困难。
  • 末端动作更适合跨平台,但需要 IK、碰撞和可达性检查。
  • delta 动作更平滑,但误差会积分累积。
  • 动作 token 适合自回归语言模型,但需要精心设计量化。

数学接口

\[a_t^{joint}=q_{t+1}^{ref}$$ $$a_t^{ee}=T_{ee,t}^{-1}T_{ee,t+1}^{ref}$$ $$a_t^{token}=\text{Quantize}(\Delta q_{t:t+H})\]

工程接口

  • 为每个动作字段写清单位:rad、m、m/s、归一化区间或 token id。
  • 动作执行前做 clipping、rate limit、collision check 和 IK feasibility check。
  • 把策略频率与控制频率解耦:策略 10-50Hz,插值控制 100-1000Hz。

⚠️ 常见陷阱

  • 编程陷阱:把 normalized action 直接发给机器人,导致关节参考落在 [-1,1] rad 的错误区间。
  • 概念误区:末端动作一定比关节动作高级;在双臂绕障时,IK 多解反而可能引入跳变。
  • 工程陷阱:token 解码后没有低通滤波,夹爪和腕关节出现高频抖动。

练习

  • 为同一抓取任务分别设计关节动作和末端动作接口,比较优缺点。
  • 写出 delta EE 动作到机器人 base frame 的坐标变换。
  • 说明为什么 50Hz 的逐步 token 自回归很难实时。

84.5 openpi 与 π0:Flow Matching 动作专家 ⭐⭐⭐

动机:为什么 π0 不用普通分类头输出动作?

机器人动作是连续、高维、时间相关的序列。 把每一维每一步离散成分类 token 会产生长序列和量化误差。 π0 的公开路线可概括为使用 flow matching,让模型学习从噪声动作片段流向真实动作片段的速度场。

反例与递进理解

  • 反例:把连续动作硬离散成很长 token 序列,模型生成速度跟不上闭环周期,机器人只能执行过期片段。
  • 机制:flow matching 通过连续速度场生成动作片段,适合表达多模态、连续的接触动作。
  • 工程接口:策略服务要公开采样步数、最大推理时间、动作 horizon 和超时后的保持策略。
  • 失败模式:生成式策略最常见的问题不是 loss 高,而是延迟抖动和动作片段执行窗口不一致。

来龙去脉

Diffusion Policy 证明生成式策略适合多模态动作。 π0 可作为把这种思想扩展到视觉语言条件机器人控制的代表性路线。 openpi 提供训练、推理和服务化入口,使策略可以通过网络服务接入机器人端。

核心机制

  • VLM 骨干处理图像和语言。
  • 动作专家接收视觉语言表征、本体状态和噪声动作片段。
  • 推理时通过 ODE 积分逐步得到动作序列。
  • 动作序列再交给机器人端的 action adapter。

Flow Matching 理论:从最优传输到条件流匹配

理解 flow matching 需要先建立"连续归一化流"的直觉。

连续归一化流(CNF)的核心思想。给定一个简单初始分布 \(p_0\)(例如标准正态噪声)和一个目标分布 \(p_1\)(例如示教动作片段的经验分布),我们寻找一个时间相关的速度场 \(v(x,t)\),使得分布在 \(t \in [0,1]\) 上沿着该速度场流动,从 \(p_0\) 连续变形为 \(p_1\)。数学上,分布的演化由连续性方程描述:

\[\frac{\partial p_t}{\partial t} + \nabla \cdot (p_t v_t) = 0\]

这个方程说的是:分布 \(p_t\) 的局部变化速率等于概率密度沿速度场的散度。如果速度场选得好,样本从 \(p_0\) 出发,沿 \(\frac{dx}{dt} = v_t(x)\) 运动,在 \(t=1\) 时恰好落在 \(p_1\) 中。

本质洞察:flow matching 的"flow"不是液体流动的比喻——它是概率分布在状态空间中的精确连续变形。每个噪声样本沿着一条确定的轨迹"流向"一个真实数据点。这比扩散模型的随机去噪过程更简洁。

为什么不直接用 CNF? 直接训练 CNF 需要计算速度场散度 \(\nabla \cdot v_t\),而散度的计算在高维空间中代价很大(需要对每个维度求偏导并求和)。早期 CNF 方法使用 Hutchinson trace estimator 近似散度,训练不稳定且速度慢。

最优传输的启发。最优传输理论告诉我们:在 \(p_0\)\(p_1\) 之间存在一条"代价最小"的搬运方案。当代价函数是欧几里得距离平方时,最优传输对应的速度场具有特殊结构——它是凸函数的梯度场。直觉上,最优传输找到从噪声到数据的最短路径。

Flow Matching(Lipman et al., 2023)的核心突破是:不需要知道全局最优传输方案,只需要对每个数据点 \(x_1\) 构造一条简单的条件路径,然后通过在数据集上取期望来恢复全局速度场。

条件流匹配(Conditional Flow Matching)的推导。给定一个数据点 \(x_1 \sim p_1\),定义条件概率路径:

\[p_t(x|x_1) = \mathcal{N}(x; \mu_t(x_1), \sigma_t^2 I)\]

最简单的选择是线性插值路径(也称为 optimal transport path):

\[\mu_t(x_1) = t x_1, \quad \sigma_t = 1 - (1-\sigma_{min})t\]

对应的条件速度场为:

\[u_t(x|x_1) = \frac{x_1 - (1-\sigma_{min})x}{1 - (1-\sigma_{min})t}\]

\(\sigma_{min} \to 0\) 时,条件路径简化为从标准正态到数据点的直线插值:

\[x_t = (1-t) x_0 + t x_1, \quad x_0 \sim \mathcal{N}(0,I)\]

此时条件速度恰好是常数:

\[u_t(x|x_1) = x_1 - x_0\]

CFM 损失推导。全局速度场可以通过对条件速度在数据分布上取期望得到:

\[v_t(x) = \mathbb{E}_{x_1 \sim p_1}[u_t(x|x_1) \cdot p_t(x|x_1)] / p_t(x)\]

直接计算这个期望不可行。但 Lipman et al. 证明了一个关键定理:最小化条件流匹配损失等价于最小化边际流匹配损失。即:

\[\mathcal{L}_{CFM} = \mathbb{E}_{t, x_1, x_0} \|v_\theta(x_t, t) - u_t(x_t | x_1)\|^2\]

其中 \(t \sim \mathcal{U}[0,1]\)\(x_1 \sim p_{data}\)\(x_0 \sim \mathcal{N}(0,I)\)\(x_t = (1-t)x_0 + t x_1\)

对于线性路径,目标速度 \(u_t(x_t|x_1) = x_1 - x_0\),因此损失变成:

\[\mathcal{L}_{CFM} = \mathbb{E}_{t, x_1, x_0} \|v_\theta((1-t)x_0 + t x_1, t) - (x_1 - x_0)\|^2\]

反事实推理:如果不用条件路径而直接训练 CNF 会怎样?需要在每个训练步求解 ODE 并计算散度,计算量是 \(O(D \cdot T_{ode})\),其中 \(D\) 是动作维度、\(T_{ode}\) 是 ODE 求解步数。对于 7 维 50 步的动作片段(\(D=350\)),这个代价使训练极慢。CFM 把训练变成简单的回归问题,只需要前向网络一次调用,训练效率提高了几个数量级。

π0 中的 CFM 应用。在 π0 的架构中,"数据点" \(x_1 = A_1\) 是示教动作片段(例如 50 步 7 维关节轨迹),\(x_0 = A_0\) 是对应形状的标准正态噪声。条件是观测 \(o\)(图像、语言和本体状态)。训练损失为:

\[\mathcal{L} = \mathbb{E}_{t, A_1, A_0} \|v_\theta(A_t, t, o) - (A_1 - A_0)\|^2\]

推理时,从 \(A_0 \sim \mathcal{N}(0,I)\) 出发,用 Euler 积分沿学到的速度场前进:

\[A_{t+\Delta t} = A_t + \Delta t \cdot v_\theta(A_t, t, o)\]

经过若干步(通常 5-20 步)到达 \(t=1\),得到生成的动作片段 \(\hat{A}_1\)

与扩散模型的关键区别。扩散模型(DDPM)在前向过程中逐步加噪声,反向过程中逐步去噪声。CFM 在前向过程中沿直线从噪声走到数据。直线路径更短,因此 CFM 通常需要更少的推理步数。在机器人闭环控制中,更少步数意味着更低延迟,这是 CFM 被选择的工程原因。

数学接口

$\(A_\tau=(1-\tau)A_0+\tau A_1\)$ $\(\mathcal L=\mathbb E\|v_\theta(A_\tau,\tau,o)-(A_1-A_0)\|^2\)$ 这里 \(A_0\) 是噪声动作,\(A_1\) 是示教动作片段。

工程接口

  • 精读 openpi/models/pi0.py 时重点看视觉语言骨干、动作专家和掩码结构。
  • 精读 openpi/policies 时重点看归一化、动作采样和输出适配。
  • 服务化部署时把策略进程与机器人进程隔离,网络延迟必须进入执行预算。

⚠️ 常见陷阱

  • 概念误区:flow matching 不是规划器,它只按训练分布生成动作片段。
  • 工程陷阱:服务端动作采样耗时波动,客户端仍按固定周期执行旧动作。需要超时保护。
  • 思维陷阱:只微调最后一层,希望模型学会全新硬件几何。跨本体通常需要动作接口和数据都对齐。

Flow Matching 推理的工程考量

推理时的 ODE 积分步数是延迟和质量之间的关键权衡参数。

Euler 积分的误差分析。使用 \(N\) 步 Euler 积分从 \(t=0\) 积分到 \(t=1\),每步步长 \(\Delta t = 1/N\)

\[A_{k+1} = A_k + \frac{1}{N} v_\theta(A_k, t_k, o)\]

Euler 方法的局部截断误差为 \(O(\Delta t^2) = O(1/N^2)\),全局误差为 \(O(\Delta t) = O(1/N)\)。这意味着:

  • 5 步 Euler:全局误差约 \(O(0.2)\)——对粗操作可能足够
  • 10 步 Euler:全局误差约 \(O(0.1)\)——大多数操作任务的实用选择
  • 20 步 Euler:全局误差约 \(O(0.05)\)——精细接触任务的推荐配置

更高阶的积分器(如 RK4)可以用更少步数达到相同精度,但每步需要 4 次网络调用,总计算量可能更大。工程实践中 Euler 配合足够步数通常是最简单可靠的选择。

确定性 vs 随机性推理。纯 ODE 积分是确定性的——同一观测和同一初始噪声 \(A_0\) 总是产生同一动作。这对调试和可复现性有利,但失去了多样性。可以通过以下方式引入受控随机性:

  • 每次推理采样不同的 \(A_0\):最简单,但不同 \(A_0\) 可能产生截然不同的动作模式
  • 在 ODE 路径中加入微小噪声(SDE 版本):保留多样性但可控
  • 多次采样取最佳:增加计算但质量更稳定

对实机部署,推荐使用固定种子的确定性推理进行评测,随机推理进行探索和数据收集。

练习

  • 手推 CFM 损失中目标速度为什么是 \(A_1-A_0\)
  • 画出 openpi 推理端从观测到动作的函数调用图。
  • 设计一个策略服务超时后的安全降级流程。
  • 比较 5 步、10 步和 20 步 Euler 积分的动作质量和延迟。

84.6 LeRobot:统一数据到统一策略 ⭐⭐⭐

动机:为什么机器人学习框架首先要统一数据格式?

策略模型可以更换,但数据格式如果混乱,训练、评估和复现实验都会失效。 LeRobot 的价值在于把机器人、遥操作器、数据集、策略和脚本放进同一套接口。 移动操作尤其需要统一视频、关节、本体状态和动作片段。

反例与递进理解

  • 反例:每个实验脚本都用自己的字段名保存数据,训练时只能靠临时转换,部署问题无法追溯到原始 episode。
  • 机制:统一数据格式把 robot、teleoperator、dataset、policy 和 evaluation 串成可复现流水线。
  • 工程接口:record、train、eval、replay 应共享同一份字段定义和统计量版本。
  • 失败模式:格式漂移会让模型“能训练但不可复现”,尤其在多相机和多机器人数据混合时最明显。

来龙去脉

ACT、Diffusion Policy、TD-MPC2、VQ-BeT 等策略最初来自不同代码库。 LeRobot 将它们放入统一训练入口,降低跨硬件复现实验成本。

核心机制

  • Dataset 需要记录 episode 边界、帧时间戳、图像路径、动作向量和状态向量。
  • Robot 接口需要 connect、get_observation、send_action。
  • Policy 接口需要 select_action、reset 和 device 管理。

数学接口

$\(D=\{(o_t,a_t,episode\_id,timestamp)\}_{t=1}^{N}\)$ 训练时通常对状态和动作做均值方差归一化,部署时必须使用同一统计量。

工程接口

  • record 阶段先验证相机和关节字段完整。
  • train 阶段固定 dataset revision,避免训练集悄悄变化。
  • eval 阶段记录成功率、失败类别和动作延迟。

⚠️ 常见陷阱

  • 编程陷阱:重新计算 normalization stats 后没有同步到部署端,动作幅值整体偏大或偏小。
  • 概念误区:数据量越多越好;坏数据会把策略拉向错误分布。
  • 工程陷阱:episode 结束帧未标记,模型学到撞桌后的动作。

练习

  • 设计一个 LeRobot 风格的数据字段表。
  • 写出 record 到 train 到 eval 的最小命令流程。
  • 分析为什么需要 replay episode,而不是只看训练 loss。

84.7 ACT:Action Chunking 的训练与偏差 ⭐⭐

动机:为什么一次预测多步动作能缓解模仿学习中的漂移?

行为克隆逐步执行时,单步误差会把机器人带到训练集没见过的状态。 ACT 预测一个动作片段,并通过 temporal aggregation 平滑多个片段。 这让策略在短时窗口内有更稳定的意图。

反例与递进理解

  • 反例:ACT 预测长动作片段后整段执行到底,桌面轻微移动时策略失去重新对准机会。
  • 机制:action chunking 降低单步噪声,但部署时仍应采用滚动窗口,只执行片段前部。
  • 工程接口:需要同时配置 chunk 长度、执行步数、重规划周期和动作平滑方式。
  • 失败模式:chunk 过长会让策略看似平滑,却在接触任务中积累不可恢复的相位误差。

来龙去脉

ALOHA 用低成本双臂硬件证明 ACT 能完成精细双臂任务。 Mobile ALOHA 可理解为把动作空间扩展到底盘和双臂的代表性平台,也因此更清楚地暴露移动操作的时序问题。

核心机制与 CVAE 架构详解

ACT 不是简单的行为克隆(BC)回归器,它使用条件变分自编码器(CVAE)架构。理解"为什么用 VAE 而不是纯 BC"是掌握 ACT 的关键。

纯 BC 的多模态崩溃问题。考虑一个双臂摆放任务,同一初始状态下操作者有时从左绕、有时从右绕。如果用 MSE 回归:

\[\mathcal{L}_{BC} = \|a_{pred} - a_{demo}\|^2\]

模型会预测两种动作的均值——一条穿过障碍物中间的不可执行轨迹。这就是多模态崩溃。扩散策略和 flow matching 通过生成过程解决这个问题,ACT 通过 VAE 的潜变量 \(z\) 来解决。

ACT 的 CVAE 训练过程。训练时使用两个网络:

  1. CVAE Encoder(只在训练时存在):输入未来动作序列 \(a_{t:t+k}\) 和当前观测 \(o_t\),输出潜变量的后验分布参数 \(\mu_\phi, \sigma_\phi\)
\[q_\phi(z|a_{t:t+k}, o_t) = \mathcal{N}(\mu_\phi, \sigma_\phi^2 I)\]

Encoder 通过看到"未来会发生什么"来推断当前意图。如果操作者选择了左绕路线,encoder 会把这个信息编码到 \(z\) 中。

  1. CVAE Decoder(训练和推理都存在):输入观测 \(o_t\) 和采样的潜变量 \(z \sim q_\phi\),输出预测动作片段 \(\hat{a}_{t:t+k}\)
\[p_\theta(a_{t:t+k}|o_t, z)\]

Decoder 不需要看未来动作——它只看当前观测和意图编码 \(z\),就能生成对应路线的完整动作片段。

**训练损失**由两部分组成:

\[\mathcal{L} = \underbrace{\mathbb{E}_{z \sim q_\phi}\|a_{t:t+k} - \hat{a}_{t:t+k}\|^2}_{\text{重构损失}} + \beta \underbrace{D_{KL}(q_\phi(z|a,o) \| p(z))}_{\text{KL 正则}}\]

重构损失确保 decoder 能生成准确动作。KL 正则迫使后验分布 \(q_\phi\) 接近先验 \(p(z) = \mathcal{N}(0, I)\),防止 encoder 记忆每个训练样本而不学习结构化表示。

推理过程。部署时 encoder 被丢弃,decoder 直接从先验 \(p(z) = \mathcal{N}(0,I)\) 采样 \(z\)(或使用均值 \(z=0\)):

\[\hat{a}_{t:t+k} = f_\theta(o_t, z=0)\]

使用 \(z=0\) 相当于选择最常见的意图模式。如果需要多样性,可以从先验采样不同 \(z\)

跨领域类比:ACT 的 CVAE 结构类似于自然语言处理中的条件文本生成。Encoder 看到"答案"推断"问题的意图",decoder 只根据"问题和意图"生成"答案"。在 ACT 中,"答案"是未来动作,"问题"是当前观测,"意图"是潜变量 \(z\)

为什么 VAE 而不是纯 BC? 核心区别在于 \(z\) 把多模态决策显式分离出来。纯 BC 的确定性网络必须用一个输出覆盖所有模式,VAE 把"选择哪个模式"交给 \(z\),"在该模式下怎么做"交给 decoder。这样每个 \(z\) 对应的输出都是可执行的单一路线。

action chunk 长度越长,长时一致性越好,但纠错越慢。ACT 原论文使用 chunk 长度 100(在 50Hz 下对应 2 秒),Mobile ALOHA 也使用类似设置。

数学接口

$\(p(a_{t:t+k}|o_t)=\int p_\theta(a_{t:t+k}|o_t,z)p(z)dz\)$ 训练目标包含重构损失和 KL 正则。

工程接口

  • 根据控制频率选择 chunk 长度,例如 50Hz 下 50 步约 1 秒。
  • 部署时使用 overlapping chunks,避免每次重采样产生跳变。
  • 底盘动作和手臂动作可以使用不同平滑系数。

⚠️ 常见陷阱

  • 概念误区:chunk 越长越好。长片段会让策略对新障碍反应变慢。
  • 工程陷阱:temporal aggregation 忘记按时间对齐,导致平均了不同相位的动作。
  • 数据陷阱:示教者频繁纠错,模型会学到犹豫式动作。

练习

  • 推导 ACT 中 KL 项为什么能限制潜变量分布。
  • 比较 chunk 长度 10、50、100 对移动底盘避障的影响。
  • 阅读 ACT 策略实现,标出训练时存在而推理时移除的模块。

84.8 Diffusion Policy 与 Flow Matching 对比 ⭐⭐⭐

动机:生成式动作策略为什么适合接触丰富任务?

接触任务常有多种可行做法:从左抓、从右抓、先推再抓都可能成功。 普通均方误差会把多种动作平均成不可执行的中间动作。 扩散和 flow 方法能表示多模态动作分布。

反例与递进理解

  • 反例:在多种示教模式下只预测均值动作,结果末端总是走到两种可行路径之间的不可行区域。
  • 机制:diffusion 与 flow 都把动作片段视为条件分布样本,而不是单一确定回归值。
  • 工程接口:部署时需要记录随机种子、采样步数、动作过滤量和任务阶段。
  • 失败模式:多样性不受控会带来偶发危险动作,因此生成式动作必须接安全过滤。

来龙去脉

Diffusion Policy 使用条件去噪生成动作片段。 Flow Matching 学习连续速度场,通常可以用更少步数采样。 两者都把闭环部署做成 receding horizon:只执行前几步,再重新观测。

核心机制

  • Diffusion 适合表达复杂分布,但去噪步数较多。
  • Flow 采样快,但对速度场学习质量敏感。
  • ACT 推理最快,但多模态表示能力弱于生成式模型。

三种动作生成范式的系统对比

维度 ACT (CVAE) Diffusion Policy Flow Matching
多模态表示 通过潜变量 \(z\) 隐式编码 通过去噪过程显式生成 通过速度场显式生成
推理延迟 单次前向(最快) 10-100 步去噪(最慢) 5-20 步积分(中间)
训练稳定性 标准 VAE 训练(稳定) 需要噪声调度和权重设计 纯回归损失(最稳定)
闭环方式 chunk + temporal aggregation receding horizon(滚动执行) receding horizon
动作平滑度 较高(但 chunk 边界可能跳变) 较高(去噪过程天然平滑) 中等(取决于积分步数)
适合场景 高质量单模态示教 多模态接触任务 需要低延迟的多模态任务

为什么"多模态"对移动操作特别重要? 桌面操作往往可以标准化——杯子在固定位置、相机固定角度、操作者用固定手法。但移动操作中,底盘位姿、物体位置、障碍物布局每次不同。同一"拿杯子"任务,操作者可能从左绕、从右绕、先推开障碍物再拿——这些都是合理的多模态行为。如果策略只能表示单一模式,它在新布局下会犹豫或冻结。

反事实推理:如果在多模态示教数据上训练 ACT 会怎样?ACT 的 VAE 潜变量 \(z\) 理论上能编码不同模式。但 VAE 的 KL 正则会压缩潜空间,实践中 \(z\) 常常崩塌成接近零的点,退化为单模态。这就是为什么 Mobile ALOHA 的原论文更强调高质量一致示教而非数据多样性——ACT 在单模态下表现最好。如果示教确实多模态,Diffusion 或 Flow 路线更合适。

数学接口

\[A_{k-1}=\text{Denoise}_\theta(A_k,o,k)$$ $$A_{t+\Delta t}=A_t+\Delta t\,v_\theta(A_t,t,o)\]

工程接口

  • 统一评估时控制 action horizon、observation horizon 和执行步数。
  • 生成式策略输出后仍需要动作限幅。
  • 执行端只使用前 \(T_a\) 步,剩余动作作为短时计划。

⚠️ 常见陷阱

  • 概念误区:扩散策略不是离线规划器;它每个控制窗口都要重新闭环。
  • 工程陷阱:去噪步数调得太少,动作噪声大;调得太多,推理延迟超预算。
  • 思维陷阱:只比较成功率,不比较失败恢复时间和动作平滑度。

练习

  • 用表格比较 ACT、Diffusion Policy、Flow Matching 的推理延迟。
  • 实现一个动作片段的 receding horizon 执行伪代码。
  • 讨论多模态示教数据为什么会让 MSE 策略失败。

84.9 VLA + MPC Safety Filter ⭐⭐⭐

动机:学习策略输出不安全动作时谁来兜底?

移动操作不能把安全交给训练分布。 安全过滤层把策略动作投影到满足限位、速度、碰撞和稳定约束的集合。 这就是 VLA 与传统控制的融合点。

反例与递进理解

  • 反例:VLA 给出靠近桌沿的末端目标,离线数据中很少出现碰撞,但实机夹爪边缘会扫到物体。
  • 机制:安全过滤把策略动作投影到满足限位、速度、碰撞距离和稳定性约束的集合。
  • 工程接口:过滤层要返回原始动作、安全动作、激活约束和拒绝原因。
  • 失败模式:只做 clipping 会掩盖策略分布外问题,长期看会把机器人推到约束边界附近运行。

来龙去脉

在控制理论中,CBF、MPC 和 WBC 都可以作为 runtime shielding。 在复合机器人中,常见做法是 VLA 输出 EE 或关节参考,MPC/WBC 检查动力学可行性。

核心机制

  • 过滤层输入是参考动作和当前状态。
  • 过滤层输出是最近的安全动作。
  • 当无法修正时,系统应进入停机、保持或回退策略。

安全过滤的三个层次。安全不是一个布尔值(安全/不安全),而是一个由多个约束构成的层次体系:

层次 约束类型 检查内容 违反后果 处理方式
L1:硬约束 关节限位、速度极限 动作是否在物理可行范围内 电机损坏、驱动器截断 直接裁剪(clipping)
L2:安全约束 碰撞距离、ZMP 裕度 动作是否会导致碰撞或失稳 硬件损伤、人员安全风险 QP 投影到安全集
L3:任务约束 可达性、接触可行性 动作是否能被 IK 解出 任务失败 返回不可行标志

L1 总是以 clipping 形式存在,计算开销极低。L2 需要实时碰撞检测或简化的安全函数,计算开销中等。L3 可以是离线检查或低频在线检查。三者不是互斥的,而是串联执行。

数学接口

$\(a^*=\arg\min_a \|a-a_{vla}\|^2 \quad s.t.\quad h_i(x,a)\ge 0\)$ 约束 \(h_i\) 可以表示关节限位、碰撞距离、ZMP 裕度或速度上界。

工程接口

  • 把安全检查写成独立模块,避免策略代码直接访问硬件驱动。
  • 每次动作下发前记录原始动作、过滤动作和约束激活项。
  • 对无法过滤的动作返回明确错误码。

⚠️ 常见陷阱

  • 概念误区:安全过滤会让 VLA 变得保守,但保守是实机部署的基本代价。
  • 工程陷阱:只检查关节位置不检查速度,动作仍可能产生冲击。
  • 思维陷阱:把过滤失败当成策略失败;过滤失败也可能是目标不可达。

练习

  • 设计一个关节速度限幅过滤器。
  • 把 EE 目标投影到可达工作空间,并说明如何处理 IK 无解。
  • 讨论 CBF 每步投影会如何改变生成式动作分布。

84.10 评测:成功率之外还要看什么 ⭐⭐

动机:为什么 VLA 评测不能只报一个成功率?

移动操作任务包含导航、接近、对准、抓取、搬运和放置。 总成功率无法说明失败发生在哪一层。 教学和研究都需要分解指标。

反例与递进理解

  • 反例:只报告总成功率,两个策略同为失败,却一个卡在导航,另一个卡在抓取,改进方向完全不同。
  • 机制:评测要按阶段、失败类型、动作裁剪次数和恢复能力拆开观察。
  • 工程接口:episode evaluator 应记录阶段标签、终止原因、关键帧和安全过滤统计。
  • 失败模式:粗粒度指标会鼓励模型记住容易任务,却无法暴露长任务中的瓶颈阶段。

来龙去脉

传统控制评测常看轨迹误差和约束违反。 模仿学习评测常看任务成功率。 VLA 评测必须把两类指标合并。

核心机制

  • 任务成功率衡量最终结果。
  • 阶段成功率定位瓶颈。
  • 动作平滑度和约束激活次数衡量部署安全。
  • 恢复能力衡量系统是否能从偏差状态回到任务。

评测指标的层次体系

层次 指标 数据来源 用途
任务层 总成功率 人工判定或自动检测 对外报告
阶段层 导航/对准/抓取/放置成功率 阶段标签 + 状态检测 定位瓶颈
动作层 平滑度、裁剪次数、安全过滤激活率 控制日志 策略质量诊断
系统层 端到端延迟、推理延迟、网络延迟 时间戳日志 部署可靠性
安全层 碰撞距离最小值、约束违反次数、急停次数 安全过滤日志 部署安全性

本质洞察:评测不是训练完成后的"验收"步骤,而是持续闭环的一部分。阶段化评测把"策略在哪里失败"转化为"下一轮采集应该补什么数据"——这正是第 85 章中数据闭环改进的入口。

数学接口

$\(\text{success}=\prod_i \text{stage}_i\)$ 阶段成功率低的子任务会主导总失败率。

工程接口

  • 记录每个 episode 的阶段标签。
  • 保存失败前 5 秒观测和动作。
  • 统计策略延迟、动作裁剪次数和碰撞距离最小值。

⚠️ 常见陷阱

  • 概念误区:离线 loss 下降不等于实机成功率上升。
  • 工程陷阱:只保存成功视频,导致后续无法诊断失败。
  • 思维陷阱:把人类示教中的成功标准和自动评测标准混用。

练习

  • 为“拿杯子放进水槽”定义 6 个阶段指标。
  • 设计一个失败标签集合,并说明每个标签如何自动判定。
  • 比较 LIBERO、RoboCasa 和真实厨房任务的评测差异。

84.11 部署边界:延迟、算力与远程推理 ⭐⭐⭐

动机:为什么 VLA 部署常常不是把模型放进机器人就结束?

大模型推理耗时可能超过控制周期。 机器人端需要确定性控制,而策略端可以是非实时进程。 两者之间必须有缓存、超时和降级机制。

反例与递进理解

  • 反例:远程推理服务偶发延迟,机器人仍按固定周期请求新动作,收到晚到动作后产生顿挫。
  • 机制:部署系统需要把策略频率、网络延迟、动作缓存和低层插值分开预算。
  • 工程接口:客户端要有 timeout、hold、retreat 和 stop 四类明确状态。
  • 失败模式:算力不足通常表现为相位漂移,而不是简单地“模型变慢”。

来龙去脉

RT-1 风格模型可以较快推理。 7B 级 VLA 通常需要量化、LoRA 或远程推理。 π0 类路线在工程上可通过策略服务输出动作片段,机器人端再按片段和安全约束执行。

核心机制

  • 端侧部署优点是低延迟和离线可用。
  • 远程部署优点是算力充足和模型更新方便。
  • 混合部署常让高层语义远程运行,低层动作在本地执行。

数学接口

$\(T_{loop}=T_{capture}+T_{encode}+T_{infer}+T_{network}+T_{filter}+T_{execute}\)$ 必须保证 \(T_{loop}\) 小于策略闭环预算。

工程接口

  • 本地保留最近一次安全动作片段。
  • 推理超时时进入保持或缓慢回退。
  • 把策略频率、控制频率和硬件频率写入部署文档。

⚠️ 常见陷阱

  • 工程陷阱:远程推理网络抖动导致同一动作片段被重复执行。
  • 概念误区:量化只影响速度,不影响行为;实际量化会改变动作分布。
  • 安全陷阱:策略进程崩溃后驱动继续执行最后一个速度命令。

练习

  • 计算一个 30Hz 策略闭环的最大允许推理延迟。
  • 设计远程推理断连后的三段式降级策略。
  • 比较 INT4、INT8、LoRA 微调在部署中的作用。

84.12 开放问题:从示教策略到长期自主 ⭐⭐⭐

动机:为什么短任务成功不等于长期移动操作成功?

家庭和仓储环境中的任务不是一个抓取动作,而是几十个子任务串联。 VLA 可以提高泛化,但失败恢复、持续学习和安全包络仍未完全解决。 博士级问题在于把学习策略、符号任务、状态估计和控制安全统一起来。

反例与递进理解

  • 反例:策略能完成单次抓放,但长时间整理任务中遇到新障碍后没有任务记忆和恢复入口。
  • 机制:长期自主需要把示教策略、任务状态机、异常检测和恢复技能组合起来。
  • 工程接口:每个子任务都应有进入条件、退出条件、失败标签和可回退动作。
  • 失败模式:开放世界错误常由多个小误差累积,必须用阶段化记录才能归因。

来龙去脉

TidyBot、OK-Robot 和 π0.5 等公开工作可分别作为个性化偏好、模块化开放知识和开放世界移动操作泛化的代表性案例来理解,具体结论应以论文和官方发布为准。 这些路线分别强调语义、系统整合和动作学习,融合仍是前沿。

核心机制

  • 长期任务需要任务记忆。
  • 失败恢复需要异常检测和重新规划。
  • 持续学习需要避免灾难性遗忘。
  • 跨平台迁移需要统一动作接口和数据协议。

数学接口

$\(\pi(a|o,g,m)\)$ 其中 \(m\) 表示任务记忆或历史状态摘要。

工程接口

  • 把长任务拆成可评测子技能。
  • 保留失败数据进入再训练缓冲区。
  • 在部署前定义不可学习绕过的硬安全边界。

⚠️ 常见陷阱

  • 思维陷阱:把更多数据当成唯一解。长期自主还需要状态估计、任务记忆和恢复机制。
  • 概念误区:跨本体只靠更大模型。动作接口和物理约束不对齐时,模型规模无法弥补。
  • 工程陷阱:在线学习直接覆盖原模型,导致旧技能退化。

练习

  • 提出一个 VLA + PDDLStream + MPC filter 的长期整理房间架构。
  • 设计一个失败恢复数据集的字段。
  • 讨论 VLA 如何与 SLAM 地图中的可操作物体关联。

84.13 openpi / LeRobot 最小实战流程

这一节把前面的概念压成一条可执行的工程路线。 代码块是流程骨架,真实项目中需要按具体硬件替换设备名称和数据路径。

从理论到实战的关键检查清单。在开始实战之前,确认以下前提条件已满足:

检查项 具体内容 不满足的后果
动作契约已定义 action_dim、unit、frame、rate 全部明确 训练成功但部署方向错误
观测接口已统一 相机名、分辨率、预处理、本体状态字段 训练和部署观测不匹配
安全边界已定义 关节限位、速度上界、碰撞距离 实机危险
归一化统计已冻结 训练和部署使用同一份 stats 文件 动作幅值系统偏移
超时策略已设计 hold、retreat、stop 状态机 推理延迟导致持续执行旧动作

这些检查项对应本章前面讨论的每一层接口。跳过任何一项,实战都会在对应位置失败。

from dataclasses import dataclass
import time

@dataclass
class Observation:
    images: dict
    joint_position: list[float]
    joint_velocity: list[float]
    language: str
    timestamp: float

def validate_action(action, limits):
    """动作下发前的最小安全检查。"""
    if len(action) != len(limits):
        raise ValueError("动作维度与硬件不一致")
    clipped = []
    for value, (lo, hi) in zip(action, limits):
        clipped.append(max(lo, min(hi, value)))
    return clipped

def policy_loop(robot, policy, limits, period=0.05):
    """策略低频运行,机器人端仍保留更高频控制。"""
    while robot.enabled():
        obs = robot.get_observation()
        action_chunk = policy.select_action(obs)
        for action in action_chunk:
            safe_action = validate_action(action, limits)
            robot.send_action(safe_action)
            time.sleep(period)

流程解释: - Observation 明确了图像、本体状态、语言和时间戳。 - validate_action 只演示关节限位,真实系统还应加入速度、碰撞和可达性检查。 - policy_loopperiod 是策略动作执行周期,不是电机内环周期。 - 机器人端应在更高频率下插值、滤波并执行安全动作。

84 章节总结

知识点 本章结论 能做什么
VLA 定位 VLA 是语义和动作接口层,不是裸电机控制层 能画出分层闭环
openpi/π0 flow matching 生成连续动作片段 能解释 CFM 损失和部署流程
LeRobot 统一数据、机器人、策略和训练脚本 能设计 record-train-eval 流水线
ACT/Diffusion/Flow 三类动作生成范式各有延迟和多模态权衡 能按任务选择策略
安全过滤 MPC/CBF/WBC 仍负责约束 能设计动作拒绝与投影规则

84 累积项目:本章新增模块

  • 新增 VLAActionAdapter:把策略动作从归一化空间转换为机器人动作接口。
  • 新增 ObservationSync:对齐图像、关节和语言指令时间戳。
  • 新增 SafetyFilter:检查限位、速度、碰撞距离和可达性。
  • 新增 EpisodeEvaluator:记录阶段成功率、失败类别和动作裁剪次数。

84 延伸阅读

材料 难度 阅读重点
RT-1 / RT-2 / OpenVLA ⭐⭐ 离散动作 token 与视觉语言模型的结合
π0 / π0-FAST / π0.5 ⭐⭐⭐ flow matching、FAST tokenization 与开放世界泛化
Diffusion Policy ⭐⭐⭐ receding horizon 动作生成和多模态示教
LeRobot 文档与源码 ⭐⭐ 数据格式、机器人接口、训练脚本和策略类
OCS2 mobile_manipulator ⭐⭐⭐ VLA 输出接入安全控制层的接口

84 故障排查手册

教学不能只讲系统如何搭起来,还要讲系统坏了怎么定位。 下表按症状组织排查路径,适合在仿真、采集和实机部署中直接使用。

症状 可能原因 排查步骤 修正方式
策略在仿真可用,实机动作幅度异常 归一化统计量或单位不一致 打印动作反归一化前后范围;检查 rad/deg;检查关节顺序 固定数据统计版本,部署端加载同一份 stats
动作平滑但抓不到物体 相机外参或腕部相机延迟错误 重放 episode;可视化目标在相机和机器人坐标系的位置 重新标定外参,并对图像与关节做时间对齐
策略偶发输出危险动作 训练分布外状态或目标不可达 记录原始动作、过滤动作和约束激活项 加入安全过滤和异常状态回退
远程推理时机器人顿挫 网络延迟超过策略周期 测量端到端延迟分布和 99th percentile 本地缓存动作片段,超时进入保持或回退
离线 loss 下降但任务成功率不升 数据质量或评测目标不一致 按失败阶段统计;重放坏 episode;检查标签和结束帧 清洗数据并使用阶段化评测

84 专题学习路径:从 VLA 接口到安全部署

本节保留卡片形式,但去掉循环重复的模板堆叠。 卡片按接口、生成、部署、评测和研究五条线组织,目的是让读者形成可执行检查链。

84.A 使用方法

这些卡片不是零散速记,而是把本章主线压缩成可执行判断。 阅读时建议按顺序回答三件事:当前系统的关键接口是什么,最可能出现的反例是什么,工程上如何观测这个反例。 每张卡片都对应一个设计检查点,适合在方案评审、实验准备和实机排查前使用。

卡片 001:先写动作契约

  • 关键判断:模型名称不能替代动作契约
  • 反例:先选 OpenVLA 或 π0,再发现机器人只能执行另一种动作空间
  • 机制:动作契约把输出维度、单位、frame 和频率固定下来
  • 工程接口:为每个动作字段写 schema、范围和反归一化统计
  • 失败模式:实机方向错、幅值错或夹爪时序错
  • 练习:把同一抓取任务写成关节动作和末端动作两版契约

卡片 002:观测不是图片

  • 关键判断:策略看到的是带时间戳的多源状态
  • 反例:只保存前视图,腕部相机和关节状态都缺失
  • 机制:移动操作需要外部视觉、本体状态和历史动作共同决定相位
  • 工程接口:记录相机名、frame、timestamp、预处理和状态向量
  • 失败模式:遮挡时策略持续输出过期动作
  • 练习:为三相机移动操作写 observation schema

卡片 003:语言需要终止条件

  • 关键判断:自然语言目标必须转成可检测条件
  • 反例:“整理好桌面”没有结束定义,机器人反复调整同一物体
  • 机制:语义层给目标,评测层判断阶段完成
  • 工程接口:为每个子任务写进入条件、退出条件和失败标签
  • 失败模式:长任务中目标跳变或无法停止
  • 练习:为“把餐具放回抽屉”写阶段表

卡片 004:token 不是动作本身

  • 关键判断:离散 token 只是动作表示的一种编码
  • 反例:token 解码后没有恢复单位,输出幅值缩小
  • 机制:tokenization 改变序列长度、量化误差和实时性
  • 工程接口:解码后必须反归一化、滤波并过安全检查
  • 失败模式:动作平滑但永远够不到目标
  • 练习:计算一个 7 维 40 步片段的 token 数

卡片 005:flow 需要执行窗口

  • 关键判断:连续生成动作也要滚动执行
  • 反例:一次生成整段动作并执行到底,目标移动后仍按旧轨迹走
  • 机制:flow 输出的是片段,闭环来自重复观测和重新采样
  • 工程接口:配置 horizon、execute_steps、timeout 和缓存
  • 失败模式:接触任务中相位漂移
  • 练习:比较 execute_steps=1 与 execute_steps=8 的延迟权衡

卡片 006:LeRobot 重在接口

  • 关键判断:框架价值在于数据和策略接口统一
  • 反例:record 用一套字段,train 用另一套字段
  • 机制:统一接口让 replay、train、eval 和 deploy 可追溯
  • 工程接口:固定 dataset schema 和 stats 版本
  • 失败模式:离线可训练但无法复现实机问题
  • 练习:画出 record 到 deploy 的字段流

卡片 007:ACT 要防过长片段

  • 关键判断:action chunking 降噪但会降低纠错频率
  • 反例:长 chunk 让机器人错过重新对准机会
  • 机制:片段预测与滚动执行共同决定闭环稳定性
  • 工程接口:记录 chunk_size、执行步数和重规划周期
  • 失败模式:动作平滑但越走越偏
  • 练习:为擦桌任务选择 chunk 长度

卡片 008:diffusion 要可控

  • 关键判断:多模态生成必须被执行约束收口
  • 反例:随机采样偶尔给出绕远路动作
  • 机制:生成式策略表达分布,控制层约束可执行集合
  • 工程接口:记录采样步数、随机种子和过滤量
  • 失败模式:偶发危险动作难复现
  • 练习:设计随机性关闭后的评测协议

卡片 009:安全过滤要独立

  • 关键判断:安全层不能埋在策略代码里
  • 反例:策略函数内部直接访问硬件驱动并做简单 clipping
  • 机制:过滤层是策略和硬件之间的显式接口
  • 工程接口:输入原始动作和状态,输出安全动作与原因
  • 失败模式:问题发生后无法知道动作被怎样改写
  • 练习:定义 SafetyFilter 的输入输出字段

卡片 010:评测要分阶段

  • 关键判断:总成功率不足以指导改进
  • 反例:抓取失败和导航失败被算成同一类失败
  • 机制:阶段化评测把任务链拆成可诊断节点
  • 工程接口:记录阶段、失败原因、关键帧和安全统计
  • 失败模式:优化方向反复摇摆
  • 练习:为收纳任务设计阶段指标

卡片 011:远程推理要降级

  • 关键判断:网络服务不是实时控制内环
  • 反例:策略服务卡顿后机器人继续执行旧动作
  • 机制:本地控制层必须能在上层超时时保持安全
  • 工程接口:实现 hold、retreat、stop 和日志记录
  • 失败模式:偶发顿挫导致接触失败
  • 练习:写出超时状态机

卡片 012:跨平台先看 frame

  • 关键判断:视觉语言可复用不等于动作可复用
  • 反例:源平台输出 base frame,目标平台按 ee frame 执行
  • 机制:frame 决定动作语义和控制责任
  • 工程接口:每个平台声明 base、ee、object、task frame
  • 失败模式:迁移后动作方向稳定偏移
  • 练习:把同一 delta 动作转换到两个 frame

卡片 013:数据统计要冻结

  • 关键判断:归一化统计是部署契约的一部分
  • 反例:训练和部署加载不同 stats 文件
  • 机制:模型输出依赖训练分布尺度
  • 工程接口:stats 文件带版本号并进入模型配置
  • 失败模式:动作幅值突然放大或缩小
  • 练习:列出 stats 应包含的字段

卡片 014:多相机要对齐

  • 关键判断:多视角只有同步后才有价值
  • 反例:前视相机与腕相机相差多个策略周期
  • 机制:不同相机共同描述同一物理时刻
  • 工程接口:用统一时钟和插值生成策略时刻观测
  • 失败模式:模型看到拼接的假世界
  • 练习:估计两路相机最大容许时间差

卡片 015:低层频率要高

  • 关键判断:策略频率不能替代控制频率
  • 反例:VLA 以 10Hz 直接发关节位置到电机
  • 机制:控制层需要高频插值、限幅和反馈
  • 工程接口:策略输出参考,控制器执行参考
  • 失败模式:接触时抖动和超调
  • 练习:写出策略层到电机层的频率表

卡片 016:失败日志要保留

  • 关键判断:失败是模型改进的定位信号
  • 反例:只保存成功 episode,失败视频被丢弃
  • 机制:失败前窗口包含分布外状态和错误动作
  • 工程接口:记录失败原因、原始动作和过滤动作
  • 失败模式:无法训练恢复,也无法定位边界
  • 练习:为失败 episode 写最小字段表

卡片 017:对象实例要跟踪

  • 关键判断:开放词汇检测仍需实例绑定
  • 反例:两个相同杯子出现后策略抓错目标
  • 机制:语言 grounding 要落到可追踪对象 id
  • 工程接口:目标消息包含 instance_id 和置信度
  • 失败模式:目标切换导致任务中断
  • 练习:设计目标歧义处理规则

卡片 018:夹爪是事件

  • 关键判断:夹爪开合不是普通连续维度
  • 反例:闭合命令晚于接触发生,模型学到错误因果
  • 机制:接触事件改变物体状态和后续动作
  • 工程接口:单独记录夹爪时间、开度、力和接触标签
  • 失败模式:抓取成败对延迟极敏感
  • 练习:测量夹爪延迟并写入对齐流程

卡片 019:回放先于训练

  • 关键判断:replay 能发现大多数字段错位
  • 反例:训练前不看数据,只等 loss 下降
  • 机制:可视化回放直接暴露观测、动作和时间问题
  • 工程接口:每批数据抽样 replay 并保存检查结果
  • 失败模式:loss 正常但实机异常
  • 练习:制定十条 replay 检查项

卡片 020:任务记忆要显式

  • 关键判断:长任务不能只靠单帧观测
  • 反例:机器人忘记已经打开抽屉,又尝试重复拉动
  • 机制:任务阶段是低频状态,应与视觉动作分离
  • 工程接口:记录阶段 id、已完成子任务和当前目标
  • 失败模式:循环执行同一动作
  • 练习:为整理桌面设计记忆字段

卡片 021:异常状态要拒绝

  • 关键判断:策略不应对所有输入强行输出动作
  • 反例:相机丢帧后模型仍给出动作片段
  • 机制:输入质量也是动作可执行性的前置条件
  • 工程接口:validator 同时检查观测和动作
  • 失败模式:传感器异常被放大成动作异常
  • 练习:写出三类 observation reject 条件

卡片 022:仿真和实机要分开记

  • 关键判断:仿真数据不能假装真实数据
  • 反例:混合数据没有 source 字段
  • 机制:不同来源的噪声、延迟和动力学不同
  • 工程接口:source、domain、hardware_id 进入 metadata
  • 失败模式:模型学到仿真特有外观
  • 练习:比较三类数据源的风险

卡片 023:任务帧利于迁移

  • 关键判断:相对目标的动作比绝对路径更稳
  • 反例:换桌子位置后世界系轨迹失效
  • 机制:任务 frame 把动作绑定到物体和关系
  • 工程接口:adapter 负责 world/base/task frame 转换
  • 失败模式:方向大致正确但落点偏移
  • 练习:把放杯动作写成任务帧轨迹

卡片 024:算力预算要量化

  • 关键判断:模型延迟必须进入控制设计
  • 反例:GPU 负载高时动作更新周期随机变长
  • 机制:策略运行时间影响动作缓存和闭环相位
  • 工程接口:记录平均、尾部延迟和超时次数
  • 失败模式:偶发失败难复现
  • 练习:为 20Hz 策略写延迟预算

卡片 025:服务边界要清楚

  • 关键判断:策略服务与机器人进程职责不同
  • 反例:服务端异常返回空动作,机器人端没有处理
  • 机制:接口必须定义正常、超时、拒绝和异常返回
  • 工程接口:使用明确错误码和本地回退
  • 失败模式:软件异常变成硬件风险
  • 练习:设计策略服务返回协议

卡片 026:课程实验要可复现

  • 关键判断:每次实验都要能回到同一数据和配置
  • 反例:成功视频没有对应模型、stats 和数据版本
  • 机制:可复现依赖版本化配置
  • 工程接口:保存 commit、dataset_id、model_id 和 calibration_id
  • 失败模式:结果无法比较
  • 练习:写出实验记录模板

卡片 027:开源项目要按层读

  • 关键判断:读源码先看接口再看模型细节
  • 反例:直接深入网络结构,忽略 dataset 和 policy wrapper
  • 机制:部署问题通常出在 adapter、stats 和时序
  • 工程接口:按 dataset、policy、robot、eval 顺序阅读
  • 失败模式:改模型后仍接不上机器人
  • 练习:制定 LeRobot/openpi 精读路径

卡片 028:研究问题要收敛

  • 关键判断:一个实验只改变少量关键变量
  • 反例:同时换模型、数据和控制器后无法归因
  • 机制:复合系统需要变量隔离
  • 工程接口:固定硬件和数据,再比较动作头
  • 失败模式:改进不可解释
  • 练习:为 VLA 安全过滤设计对照实验

84.B 案例推演

场景 1:厨房取杯任务

第一步不是选择模型,而是写出任务边界:目标是杯子,成功条件是杯子稳定进入指定区域,失败条件包括抓错对象、夹爪未闭合、碰撞和超时。 第二步写观测接口:前视相机负责对象和区域,腕部相机负责接触细节,关节状态和上一动作负责执行相位。 第三步写动作接口:如果目标平台固定,可以用关节片段;如果考虑跨平台,则优先用末端增量和夹爪事件。 第四步写安全接口:任何动作片段都要经过限位、速度、碰撞和可达性检查。 最后再选择策略类型:ACT、Diffusion、flow 或 token 路线都只是这个接口上的实现选择。

场景 2:远程策略服务

远程推理适合快速实验,但它不能承担实时安全职责。机器人端应保留本地缓存和回退状态。 当服务端返回动作晚于预算时,客户端不应执行迟到动作,而应进入保持或缓退。 日志中要同时保存请求时刻、响应时刻、动作时间戳和执行时刻。没有这些字段,就无法判断失败来自网络、模型还是控制。 练习时可以人为注入延迟,观察不同超时策略对抓取稳定性的影响。

场景 3:跨平台迁移

迁移前先检查动作空间,而不是只比较视觉输入。关节动作几乎总是绑定具体机器人,末端或任务帧动作更容易迁移。 迁移中要把源平台的 workspace、夹爪语义和相机视角写成显式假设。 迁移后第一轮评测不要追求总成功率,而要看 action adapter 的误差、IK 可行率和安全过滤激活次数。 如果过滤层频繁改写动作,说明模型输出和目标平台约束存在系统性冲突。

场景 4:动作生成路线选择

分类 token 适合接入自回归语言模型,但高维高频动作会带来长序列。 ACT 适合高质量示教和相对稳定的短程任务,但 chunk 长度需要和闭环纠错权衡。 Diffusion 与 flow 能表达多模态动作,但推理延迟和随机性必须被工程接口约束。 选择动作头时先写任务的频率、精度、接触敏感性和部署算力,再决定模型。

场景 5:评测闭环

一次评测至少要回答:机器人是否理解目标,是否到达可操作区域,是否对准,是否形成接触,是否完成放置。 每个阶段都应有可观测证据,而不是只靠肉眼判断。 阶段失败要回流到数据采集计划:导航失败补移动视角数据,抓取失败补接触近景数据,放置失败补终止条件数据。 这样形成的数据闭环比单纯扩大模型更可控。

场景 6:安全过滤诊断

过滤层不是只在危险时出现,它应持续输出诊断信号。 如果某一关节的限位约束经常激活,说明动作接口或训练数据分布可能有偏。 如果碰撞约束经常激活,说明视觉 grounding 或任务 frame 可能有误。 安全过滤统计可以成为下一轮数据清洗和策略微调的入口。

84.C0 2025-2026 年 VLA 前沿动态

VLA 领域仍在快速演进。以下梳理截至 2026 年初的主要公开趋势,具体结论以论文和官方发布为准。

动作 tokenization 效率。FAST(Fine-grained Action tokenization for Speed and performance Tuning)路线使用 DCT(离散余弦变换)压缩动作片段后再做 BPE tokenization,大幅缩短自回归序列长度。这让 token 路线的推理延迟接近连续动作头,同时保留自回归语言模型的预训练优势。部署时需要注意 DCT 逆变换的数值精度和动作片段边界处理。

开放世界泛化。以论文和官方发布为准,一些公开路线(如描述为训练时使用大规模异构数据、部署时面向新场景零样本执行的方向)可作为 VLA 从固定任务走向开放世界的代表性趋势。这类系统通常把互联网规模语言视觉知识和少量机器人交互数据相结合,但对动作接口、安全过滤和硬件适配的要求并未降低。

多模态世界模型与 VLA 融合。2025 年以来,"世界模型 + VLA"的组合路线开始出现。思路是先用视频预测模型生成未来若干帧观测,再让 VLA 在"想象"的未来中评估动作后果。这种做法可以缓解 VLA 缺乏物理因果推理的问题,但推理延迟和显存占用会显著增加。

跨本体基础模型。多个公开方向尝试训练跨机器人本体的基础模型,核心思路是统一动作接口(通常选择末端或任务帧表示)和归一化方式。跨本体迁移的瓶颈仍然是工作空间差异、夹爪语义差异和低层控制器差异。不能指望仅靠更大模型解决物理层面的不匹配。

本质洞察:VLA 前沿的每一次模型进步,都需要在动作接口、安全过滤和部署工程上做对应适配。模型越大、生成越强,安全检查和工程接口的重要性反而越高。

84.C1 主流 VLA 架构详细对比

以下对比基于公开论文和官方发布,具体能力和数字以各项目最新版本为准。

维度 RT-2 OpenVLA π0
骨干类型 PaLM-E / PaLI-X(视觉语言模型) Prismatic VLM(SigLIP + DinoV2 + Llama 2 7B) 预训练 VLM + 独立动作专家
动作表示 离散 token(每维量化为 256 bin) 离散 token(每维量化为 256 bin) 连续 flow matching(速度场生成动作片段)
动作输出维度 7(EE delta + gripper) 7(EE delta + gripper) 可变(关节或 EE,取决于适配)
动作 horizon 逐步自回归(每步 1 个动作) 逐步自回归(每步 1 个动作) 动作片段(chunk,一次生成多步)
推理频率 约 1-3 Hz(模型较大) 约 5-10 Hz(7B 量化后) 约 5-50 Hz(视采样步数和模型大小)
训练数据 Google 内部多机器人数据 + 网页 Open X-Embodiment 等公开数据 多机器人遥操作数据 + 网页
多模态能力 强语义泛化(网页知识迁移) 中等语义泛化(开源 VLM) 强动作生成 + 中等语义
开源状态 不开源 完全开源(模型 + 训练) openpi 开源推理和微调
闭环方式 观测-推理-执行循环 观测-推理-执行循环 片段滚动执行 + 重观测
跨本体 通过数据混合 通过 action tokenizer 适配 通过动作适配器和微调
接触精度 有限(离散化损失) 有限(离散化损失) 较高(连续空间、多步采样)
部署复杂度 高(大模型 + 内部系统) 中(需 GPU 量化部署) 中(策略服务 + 机器人客户端)

架构路线的本质差异

RT-2 和 OpenVLA 走的是**统一 token 路线**——把动作视为语言模型输出的一种特殊 token,利用语言模型预训练中的世界知识来增强任务理解。代价是每个动作维度的量化误差(256 bin 在 \([-1,1]\) 上的分辨率约 \(0.008\))和逐 token 自回归的延迟。

π0 走的是**分离专家路线**——VLM 骨干只负责视觉语言理解,动作生成交给专门的 flow matching 模块。这让动作表示保持连续、可以一次生成整个片段,但也意味着模型需要学习两种完全不同的信息形式之间的对齐。

反事实推理:如果 π0 也使用离散 token 会怎样?7 维 50 步动作片段需要 350 个 token。以每 token 约 20ms 的自回归延迟计算,一次推理需要约 7 秒——远超 50Hz 闭环周期的 20ms 预算。FAST 通过 DCT 压缩降低 token 数量,但仍无法完全消除量化误差。这正是 π0 选择连续 flow 路线的工程动机。

选择建议 推荐路线 理由
开放语义理解优先 RT-2 思路(或 OpenVLA) 网页知识迁移、零样本语言理解
接触精度和多模态动作优先 π0 思路(flow matching) 连续动作空间、多模态生成
可复现研究优先 OpenVLA 完全开源、社区活跃
快速原型和微调优先 openpi / LeRobot 统一框架、服务化部署

84.C 收束与综合练习

本章的主线可以压缩成一句话:VLA 负责把语义和视觉上下文变成动作参考,机器人学接口负责把参考变成安全执行。 真正的工程问题通常出现在两者之间:字段不清、时间不齐、frame 不明、频率不匹配和异常状态没有拒绝。 综合练习 1:为“移动到餐桌并拿起红色杯子”写完整 observation schema、action schema 和 safety filter 输出字段。 综合练习 2:选择 ACT、Diffusion Policy、flow matching 三种动作头之一,并说明选择依据、延迟预算和失败模式。 综合练习 3:设计一次实机评测,要求同时记录阶段成功率、动作裁剪次数、延迟分布和失败前窗口。 综合练习 4:把一个关节动作策略迁移到另一种机械臂,列出必须改写的 adapter、stats、frame 和评测项。 完成这些练习后,应能把任何 VLA 移动操作论文放到“观测接口、动作接口、数据闭环、安全执行”四个位置上分析。

84.D 递进串讲:从动机到练习

下面的串讲把本章关键概念重新组织为“动机 -> 反例 -> 机制 -> 工程接口 -> 失败模式 -> 练习”的链条。 它不是新增术语,而是帮助读者把前文内容转化为现场排查和研究设计能力。

串讲 1:端到端定位

  • 动机:把开放世界语义接入动作接口,而不是跳过机器人控制。
  • 反例:语言模型直接给电机命令,无法表达限位和稳定性。
  • 机制:VLA 输出参考,adapter 和控制层负责执行。
  • 工程接口:observation schema、action schema、safety filter 三者同时定义。
  • 失败模式:动作看似合理但实机越界。
  • 练习:画出语义、视觉、动作、控制四层边界。

串讲 2:观测同步

  • 动机:让策略看到同一物理时刻的世界。
  • 反例:前视图、腕视图和关节状态来自不同时间。
  • 机制:统一时钟和重采样把多源数据对齐。
  • 工程接口:每帧保留原始时间戳和策略时间戳。
  • 失败模式:模型学习到假相位。
  • 练习:估计 80ms 图像延迟造成的末端误差。

串讲 3:语言 grounding

  • 动机:把自然语言落到对象和任务阶段。
  • 反例:“拿那个杯子”没有实例 id。
  • 机制:目标对象、空间关系和完成判据共同定义任务。
  • 工程接口:target message 使用 instance_id、frame 和终止条件。
  • 失败模式:抓错对象或重复执行。
  • 练习:为两个同名杯子设计消歧流程。

串讲 4:动作空间选择

  • 动机:用机器人能执行的动作训练模型。
  • 反例:训练输出末端 delta,部署解释为关节目标。
  • 机制:动作空间决定归一化、可达性和控制责任。
  • 工程接口:action contract 写清维度、单位和 frame。
  • 失败模式:方向、幅值或夹爪事件错位。
  • 练习:比较关节动作和任务帧动作。

串讲 5:生成式动作

  • 动机:表达多模态示教而不失去闭环。
  • 反例:一次采样整段轨迹后不再观察。
  • 机制:滚动执行把生成片段变成闭环策略。
  • 工程接口:配置 horizon、execute_steps 和超时回退。
  • 失败模式:相位漂移和接触失败。
  • 练习:设计短 horizon 与长 horizon 对照。

串讲 6:框架接口

  • 动机:让数据、策略和机器人接口可复现。
  • 反例:不同脚本各自命名字段。
  • 机制:统一字段让 record、train、eval、deploy 串起来。
  • 工程接口:stats、dataset_id 和 robot config 版本化。
  • 失败模式:离线结果无法复现。
  • 练习:列出一次实验的配置文件。

串讲 7:安全过滤

  • 动机:把学习动作限制在可执行集合内。
  • 反例:策略动作直接进入硬件驱动。
  • 机制:投影、拒绝和回退共同形成安全边界。
  • 工程接口:记录原始动作、安全动作和激活约束。
  • 失败模式:危险动作偶发且难定位。
  • 练习:写出过滤失败后的状态机。

串讲 8:评测拆解

  • 动机:让指标指向具体改进方向。
  • 反例:总成功率相同但失败阶段不同。
  • 机制:阶段化评测把长任务拆成可诊断节点。
  • 工程接口:记录导航、对准、抓取、放置和恢复。
  • 失败模式:补数据方向错误。
  • 练习:为整理桌面任务定义阶段指标。

串讲 9:远程推理

  • 动机:让非实时服务安全接入机器人。
  • 反例:服务端超时后客户端执行晚到动作。
  • 机制:本地缓存和超时策略保护控制层。
  • 工程接口:定义 timeout、hold、retreat、stop。
  • 失败模式:网络抖动变成机械顿挫。
  • 练习:注入延迟并比较回退策略。

串讲 10:跨平台迁移

  • 动机:保留语义,重写动作落地方式。
  • 反例:源平台关节轨迹直接给目标平台。
  • 机制:任务帧动作和 adapter 缓解本体差异。
  • 工程接口:为每个平台实现 action adapter。
  • 失败模式:IK 跳变或工作空间越界。
  • 练习:把同一任务迁移到两种臂。

串讲 11:失败回流

  • 动机:把失败样本转成下一轮数据计划。
  • 反例:失败视频只保存在演示目录。
  • 机制:失败前窗口揭示分布外状态。
  • 工程接口:failure_reason 与关键帧进入数据集。
  • 失败模式:同类失败反复出现。
  • 练习:为三类失败写补采计划。

串讲 12:研究归因

  • 动机:把复杂系统拆成可检验变量。
  • 反例:同时更换模型、数据和安全层。
  • 机制:固定接口后才能比较模型路线。
  • 工程接口:实验表列出固定项和变化项。
  • 失败模式:结果无法解释。
  • 练习:设计动作头对照实验。

84.D+ VLA 在移动操作中的部署挑战

本章讨论了 VLA 在移动操作中的方法论,但从方法到实机部署之间仍存在若干系统性挑战,这里集中讨论最关键的三个。

推理延迟与实时性约束。当前主流 VLA 模型(7B-13B 参数)在边缘设备上的推理延迟通常在 100-500 ms 范围内,这意味着动作生成频率仅为 2-10 Hz。对于机械臂操作,这个频率在多数场景下可接受(抓取、放置等任务的动力学时间尺度为秒级)。但对于移动操作中的全身协调——底盘需要在行走的同时保持操作精度——10 Hz 的语义层指令远远不够。底盘的平衡控制需要 200-500 Hz,臂的力控至少需要 100 Hz。这就要求 VLA 的输出必须经过低层控制器的插值和平滑,而不能直接送入执行器。工程上的解决方案是分频架构:VLA 以 5-10 Hz 生成目标轨迹(末端位姿或关键点),MPC/WBC 以 200+ Hz 跟踪该轨迹并保证动力学可行性。这种分频设计引入了一个新问题——VLA 生成的目标如果在物理上不可行(例如要求同时快速移动底盘和精确操作),低层控制器会产生大的跟踪误差,而 VLA 层无法感知这个误差。

安全约束的集成。VLA 模型本质上是一个开环策略——它基于当前观测预测一段未来动作,不包含显式的安全保证。在移动操作场景中,安全约束至少包含三个层面:(1)自碰撞避免——臂与腿、臂与底盘之间的碰撞检测;(2)外部碰撞避免——机器人与环境障碍物的距离约束;(3)动力学可行性——生成的动作是否在力矩、速度和加速度限制之内。这三个层面的安全约束目前都需要在 VLA 输出之后、执行之前插入一个安全过滤层。Control Barrier Function (CBF) 是一种常用的理论框架,它通过在线修正不安全的动作使系统保持在安全集内。实践中,CBF 的最大挑战在于准确定义安全集——对于移动操作中的复杂几何环境,这通常需要实时的距离场计算。

Sim-to-Real 的移动操作特殊性。与纯操作任务(固定基座机械臂)相比,移动操作的 Sim-to-Real gap 有两个额外来源:(1)底盘运动引起的相机振动和视角变化——仿真中的相机模型很难完全捕捉这种动态效应;(2)底盘与地面的接触力学——不同地面材质、坡度对底盘运动的影响在仿真中通常被简化。这两个 gap 意味着即使在仿真中训练出的 VLA 策略表现良好,部署到实机时仍需要额外的域适应步骤。

工程经验法则:在移动操作的 VLA 部署中,60% 的调试时间花在低层控制器的集成和安全过滤上,只有 20% 花在模型本身,剩余 20% 花在传感器标定和数据管线。不要低估"把模型输出变成安全可执行的力矩"这一步的工程复杂度。


84.E 口试式综合题

这些题目适合在读完本章后闭卷回答。每题都要求先说接口,再说风险,最后说验证方法。

  1. 选择一个真实移动操作任务,说明观测字段、动作字段和安全过滤字段。
  2. 给出一个模型离线指标提升但实机失败的例子,并按数据、模型、控制三层定位。
  3. 设计一次最小实机实验,要求能够区分同步错误、标定错误和策略错误。
  4. 写出一个失败 episode 的最小诊断记录,包括关键帧、动作、状态和失败原因。
  5. 说明本章方法与前置移动操作规划、MPC/WBC 和模仿学习章节的连接方式。
  6. 说明哪些结论可以通过离线 replay 验证,哪些必须通过实机接触验证。
  7. 把一个前沿模型名称转化为输入接口、动作接口、频率接口和安全接口四个问题。
  8. 给出一个你会拒绝部署的动作片段,并说明拒绝条件来自哪一层。
  9. 设计一个小规模数据闭环,让下一轮采集只补最关键的失败阶段。
  10. 用一段话总结本章最重要的工程原则,并说明它如何降低实机风险。

84.F 学习达标口径

  • 是否能不用模型名称,独立描述观测、动作、安全和评测四个接口?
  • 是否能说明一个动作片段从策略输出到电机执行之间经过哪些变换?
  • 是否能区分“模型没有理解任务”和“动作接口无法执行任务”?
  • 是否能在失败日志中找到时间戳、frame、动作范围和过滤原因?
  • 是否能解释为什么 VLA 适合开放语义,却仍需要 MPC、CBF 或 WBC 约束?
  • 是否能把同一任务分别写成关节动作、末端动作和任务帧动作?
  • 是否能为远程推理设计超时后的保持、缓退和停机策略?
  • 是否能把一次失败转化为下一轮数据采集和接口检查计划?

本章核心设计原则回顾

本章内容覆盖面广,以下提炼最核心的工程原则,供日常开发时快速参考。

原则 1:分频而非端到端。VLA 模型以 5-10 Hz 输出语义级目标,底层控制器以 200+ Hz 执行。试图用单一网络覆盖从语义理解到力矩输出的全频段,在当前技术条件下既不可靠也不安全。

原则 2:接口先于模型。在选择或设计 VLA 模型之前,先定义清楚观测接口(图像分辨率、关节状态维度、采样频率)、动作接口(末端位姿 vs 关节角、坐标系、归一化范围)和安全接口(力矩限幅、速度限幅、碰撞距离阈值)。接口定义清楚后,模型只是一个可替换的"黑盒"。

原则 3:失败数据比成功数据更有价值。移动操作中的失败模式(碰撞、滑脱、超时)提供了分布边界的信息。每次失败都应被记录、分类,并转化为下一轮数据采集的优先级。

原则 4:先排查接口再怀疑模型。实机部署失败时,按照"时间同步 -> 坐标系标定 -> 数据格式 -> 归一化统计 -> 模型能力"的顺序排查。绝大多数早期失败来自前四项,而非模型本身。

原则 5:安全过滤是非可选项。VLA 输出必须经过安全过滤层(CBF、力矩限幅、工作空间裁剪)后才能送入执行器。这不是锦上添花,而是避免硬件损坏和人员受伤的底线。

学习建议:这五条原则的优先级高于任何特定的模型架构知识。当你面对一篇新的 VLA 论文时,先用这五条原则"审问"它——它的接口假设是什么?安全保证在哪里?失败模式如何处理?——这比记忆模型细节更有长期价值。


本章与前后章节的衔接

本章是 VLA 移动操作的方法论章节,向前衔接复合/130(移动操作规划基础),向后衔接复合/150(Mobile ALOHA 与 UMI 的数据采集)和复合/260(VLA 基础模型的架构设计)。学习者应当在掌握本章的接口设计和部署原则后,再进入 260 章的模型架构细节——先理解"系统需要什么样的模型",再理解"模型内部如何工作"。

核心收获回顾:移动操作中的 VLA 部署不是一个纯模型问题,而是一个系统工程问题。延迟、安全、Sim2Real gap 和数据闭环是决定部署成败的关键因素,它们的重要性不亚于模型架构本身。

牢记:接口定义清楚了,模型是可替换的;接口定义不清楚,再好的模型也无法落地。


—— 本章终 ——