
VLA 落地先签动作合同:从视觉语言输入到可执行控制指令
摘要
VLA 能输出动作,不代表它已经能接到真实机器人。输入必须带时间和版本,动作必须声明坐标、单位、范围、频率、归一化与有效期,执行层还要核对安全责任。本文比较五类动作表示和四类动作生成路线,给出跨本体适配与项目启动清单。
关键词
VLA、Action Contract、Cross Embodiment、Action Chunk、Robot Interface
目录
- 一、先定义 VLA 的系统边界
- 二、输入不是四个张量,而是四组带时序语义的证据
- 三、动作合同表:任何输出头最终都要落到这些字段
- 四、五种动作表示各自改变了什么
- 五、动作表示、生成头和控制频率必须分三层记录
- 六、跨本体适配:哪些字段应冻结,哪些必须转换,哪些通常要再训练
- 七、三种跨模块接口样例
- 八、评价 VLA:离线动作误差只能回答很小一部分问题
- 九、VLA 项目启动检查清单
- 结论
一个 VLA 在离线验证里能根据图像和指令输出动作,并不意味着它已经可以接到真实机器人。以下数值是用于说明问题的合成场景,不是公开事故或作者实测:相机帧比关节状态晚了 120 毫秒;模型输出的是工具坐标系中的增量,执行器却按基座坐标系解释;训练动作以 20 Hz 记录,部署控制器以 100 Hz 重复同一值;"张开夹爪"的归一化方向在新机器人上恰好相反。真正的风险通常不在模型参数里,而在这些接口缝隙里。
VLA落地首先不是选"回归、Token、Diffusion还是 Flow",而是签一份动作接口合同。合同要规定 Observation、Language Goal、Proprioception和 History如何对齐,动作的语义、坐标、单位、范围与有效期是什么,策略多快刷新,低层控制器承担什么,以及超限或过期时谁有权拒绝执行。没有这份合同,模型输出只能算张量,不能算可执行动作。
一、先定义 VLA 的系统边界
本文把 VLA限定为条件策略:
a_{t:t+H-1} \\sim \\pi_\\theta(\\cdot\\mid O_{\\le t},L,Q_{\\le t},A_{\ 其中,(O)是视觉等外部观测,(L)是语言目标,(Q)是本体状态,(A)是已执行动作历史,输出可以是单步动作或长度为 (H)的动作块。这个定义只说明模型根据多模态条件生成动作,不说明它已经包含任务规划、状态估计、碰撞检查、实时伺服或硬件安全。 RT-1把视觉历史与语言指令映射为离散化动作变量;OpenVLA以视觉---语言骨架自回归生成离散动作 Token;Octo使用可适配的输入 Tokenizer和 Diffusion动作头;π0在 VLM旁加入 Action Expert,以条件 Flow Matching生成连续动作块;FAST则是动作序列的离散 Tokenizer,不是独立控制器。G1-S01G1-S03G1-S04G1-S05G1-S06 这些路线只有接入明确的动作合同,才可被放在同一机器人系统中比较。 视觉输入至少应携带:传感器标识、采集时间戳、时钟域、帧序号、曝光或滚动快门信息、内外参版本、坐标系名称、图像有效区、是否丢帧。多相机不能只按数组顺序约定"第一个是头部相机",应给稳定的 策略收到的是某一时刻的观测证据,不是当前世界本身。若图像在网络、编码和队列中滞留,动作生成时它可能已经过期。合同应给 语言目标需要 本体状态不应只是一维浮点数组。至少要定义关节名与顺序、位置/速度/力矩单位、夹爪语义、末端位姿、控制模式、状态时间戳和质量标记。ROS REP 103之类的规范能提供 SI单位和右手坐标约定,但具体系统仍要声明基座、工具中心点、相机和世界坐标变换。G1-S10G1-S11 动作历史应区分 这张表不是某个模型的训练配置,而是 VLA、动作适配器、运动控制器与安全层之间的共享协议。 合同还必须可版本化。模型权重、动作 Tokenizer、归一化统计、机器人 Schema、坐标树和安全配置应分别有稳定 ID,并在每条命令中记录兼容组合。升级模型但继续使用旧的反归一化统计,或更换夹爪却沿用旧动作维度,都可能生成数值合法、物理语义错误的命令。部署端应采用显式兼容矩阵:字段缺失、版本未知、时间戳过期或坐标变换不可用时直接拒绝,而不是猜测默认值。 责任链也要独立记录。VLA负责提出候选动作,Adapter负责解释和变换,安全层负责硬限制,控制器负责跟踪,执行器负责产生物理效果;每一层都应返回自己的接受、裁剪、失败和完成状态。只有将原始输出与最终执行结果同时写入历史,下一轮策略才不会把被拒绝的命令误认为已经完成。 接口测试还应覆盖降级路径:观测过期时停止、变换缺失时拒绝、模型超时时保持安全姿态,而不是继续消费旧动作。 输出每个关节的位置、增量、速度或力矩。优点是接口直接、能表达本体细节;缺点是强依赖自由度、关节顺序、限位和控制模式。跨机器人迁移时,七轴机械臂的关节增量不能直接复制到六轴机械臂。 输出工具中心点的平移、旋转和夹爪变化,通常比关节空间更接近任务语义。但必须说明 Delta相对于哪个坐标系、旋转使用欧拉角、轴角还是四元数、增量是在当前姿态左乘还是右乘,以及逆运动学失败时如何处理。OpenVLA官方模型说明给出的典型输出是归一化的 7-DoF末端增量,并要求按机器人/数据集统计反归一化,这本身就是动作合同的一部分。G1-S03 RT-1把各动作维度量化为离散 Bin,自回归策略预测动作 Token;OpenVLA也采用动作 Token输出。G1-S01G1-S03 Token化便于复用语言模型训练接口,但 Token ID没有天然物理意义。部署必须携带 Tokenizer版本、分箱范围、维度顺序、越界规则和反量化方法。离散化误差、序列长度和自回归延迟都要独立测量。 ACT、Diffusion Policy、Octo和 π0等路线一次生成多步连续动作。G1-S04G1-S05G1-S08G1-S09 Chunk能平滑动作并摊薄大模型推理延迟,但引入新合同:Chunk覆盖多长时间,执行端每次使用全部、首段还是滚动窗口;新观测到达时是否截断旧 Chunk;重叠 Chunk如何融合;模型延迟超过剩余缓冲时怎样降级。 模型输出 动作表示回答"输出变量是什么";动作生成头回答"如何建模这个分布";频率回答"何时生成和何时执行"。三者不能互相代替。 FAST说明了"动作 Tokenizer"和"动作头"为什么要分开:它先对归一化动作 Chunk做 DCT、量化和 BPE,再让自回归模型预测压缩后的 Token。G1-S06 换 Tokenizer会改变序列长度与重建误差,但不自动改变视觉编码器或低层控制器。 频率至少有三种:传感器更新频率、VLA策略刷新频率、低层伺服频率。π0论文中的动作 Chunk长度和最高控制频率是特定系统配置,不是所有 Flow VLA的固定属性。G1-S05 以一组示意时序为例,大模型可以每 200 毫秒生成一次 1 秒动作块,执行器以 50 Hz 消费动作,伺服回路则可能在 1 kHz 运行;这些数字不代表某个公开模型或作者项目的实测配置。任何"模型支持 50 Hz"的说法都必须说明指的是动作样本率、策略调用率还是电机控制率。 Open X-Embodiment通过标准化数据格式聚合多种机器人经验,Octo强调可通过适配器和微调接入新的传感器与动作空间,OpenVLA与 openpi都要求正确处理每个机器人/数据集的动作统计。G1-S03G1-S04G1-S07G1-S12 "跨本体"不是把所有动作硬塞进同一数组,而是把公共语义与平台特定几何、数值和动力学边界分离。 以下均为合成接口示例,不代表任何公开模型的真实输出格式或真实数值。 适配器必须验证时间戳、坐标变换、数组长度、范围和安全配置,再转成控制器可接受的轨迹。模型进程不直接发送电机命令。 Detokenizer先验证版本,再恢复连续动作 Chunk。若归一化统计、自由度或 Chunk首状态不匹配,应拒绝解码,而不是返回"近似可用"的数组。 技能执行器负责运动规划、碰撞检查和闭环控制,并返回 同一状态常有多条可行轨迹,因此 MSE或 Token准确率不能代表任务成功。项目验收至少覆盖五类指标: 离线重放可以筛选模型,仿真可以扩大覆盖,但真实接触、通信延迟和控制器交互必须在真实系统验收。任何"通用 VLA"结论都应保留机器人、任务、数据、控制频率和安全配置范围。 VLA不是"视觉加语言再输出几个数",而是一条跨越感知、语义、状态、动作生成和控制执行的接口链。关节动作、末端 Delta、离散 Token、连续 Chunk和技能调用只是不同动作表示;回归、自回归、Diffusion和 Flow只是不同生成头;策略频率、动作频率和低层控制频率又是另一组系统参数。真正决定模型能否落地的,是时间戳、坐标、单位、归一化、有效期、执行责任和安全边界是否被写成可验证合同。先签动作合同,再谈模型路线,才能把 VLA从演示张量变成机器人系统中的可执行模块。 不能。Token 需要 Detokenizer、归一化统计、机器人 Schema、坐标与单位映射后才有物理意义。 不一定;它可能指动作样本率或执行频率,必须与策略调用率和伺服频率分开。 不能。公共语义可以统一,但关节、坐标、动力学、传感器和安全范围仍是本体特定合同。
二、输入不是四个张量,而是四组带时序语义的证据
Observation:记录"看到什么"以及"什么时候看到"
sensor_id和 frame_id。observation_age_ms、允许的最大时差和同步策略:严格同步、近似同步,还是由状态估计器外推到统一参考时刻。Language Goal:语言不是无版本字符串
goal_id、创建时间、版本、优先级、约束、终止条件和取消语义。用户说"把杯子放到盘子旁边",后续又补充"不要碰玻璃瓶",系统必须知道这是修订同一目标还是新任务。对指代表达,还要记录目标对象的 Grounding结果和有效期,不能让旧的"这个"在场景变化后继续绑定原对象。Proprioception:顺序、单位和坐标必须显式化
History:记录实际发生的事,而不是模型想做的事
commanded、accepted、clamped、executed和 aborted。如果安全层把模型输出从 0.20 m位移裁剪到 0.03 m,而下一轮策略仍把原始命令当作已执行历史,内部状态会快速偏离真实机器人。历史还应包含执行结果、接触事件、失败码、目标版本变化和人工接管。三、动作合同表:任何输出头最终都要落到这些字段
合同字段
必须明确的内容
典型失败
action_typeJoint target/delta、EE pose/delta、velocity、torque、token、skill call
同一数组被不同模块解释成位置或速度
reference_framebase、world、tool、camera等,及变换版本Delta Pose方向反转或旋转轴错位
unitsm、rad、m/s、rad/s、N、Nm或无量纲归一化
角度与弧度、毫米与米混用
dimension_schema维度名称、顺序、可选掩码、机器人型号
关节顺序错位,夹爪维度被当手腕轴
absolute_or_delta绝对目标、相对当前值、相对 Chunk首状态
反复累积 Delta导致漂移
horizon与dtChunk长度、每个动作的时间间隔、起始时刻
模型输出 1秒轨迹,执行端以错误频率播放
valid_from/to动作有效窗口和过期策略
延迟动作在新状态下继续执行
range与normalization物理边界、训练归一化统计、反归一化版本
新本体按旧机器人分位数解码
control_mode位置、速度、力矩、阻抗、技能执行
上层动作与低层控制模式不匹配
execution_policy全 Chunk开环、滚动重规划、重叠融合、首步执行
延迟和抖动导致动作块断裂
safety_envelope速度、加速度、力、区域、碰撞、权限限制
模型输出直接越过安全层
ack/status接受、裁剪、执行、完成、失败与原因
下一轮策略无法知道真实结果

四、五种动作表示各自改变了什么
1. 关节动作
2. 末端 Delta Pose

3. 离散动作 Token
4. 连续 Action Chunk
5. 技能调用
pick(object_id)、navigate(target)之类高层调用,把精细轨迹交给技能控制器。它降低动作带宽并增强可审计性,但需要严格定义技能版本、前置条件、参数模式、超时、可取消性、成功判据和失败码。技能调用不是"更高级的动作 Token",而是跨进程 API合同。
五、动作表示、生成头和控制频率必须分三层记录

六、跨本体适配:哪些字段应冻结,哪些必须转换,哪些通常要再训练
类别
字段
处理原则
语义合同
任务 ID、成功条件、对象角色、约束优先级
尽量冻结语义,防止同一指令在不同机器人上含义漂移
时间合同
时钟域、时间戳含义、动作
dt、有效期、历史状态机冻结字段语义,数值可按平台配置
几何合同
坐标系名称、外参、TCP定义、旋转表示
必须显式转换并版本化,不能隐式猜测
动作维度
关节顺序、自由度、夹爪、底盘、掩码
建立机器人专用 Schema与 Adapter
数值合同
单位、范围、分位数/均值方差、裁剪
按数据集和本体重新计算或严格复用匹配统计
动力学合同
负载、速度/加速度、控制模式、延迟
需要控制器适配,通常还需本体数据微调
感知合同
相机数量、视角、分辨率、内外参、同步
通过 Tokenizer/Adapter兼容;重大变化通常需微调
安全合同
工作区、力限、碰撞、权限、急停
平台本地冻结为强约束,不交给模型自行学习

七、三种跨模块接口样例
样例 A:VLA → 末端轨迹适配器
schema: synthetic.vla.ee_delta_chunk.v1
command_id: cmd-1842
generated_at_ns: 1785230012345000000
valid_until_ns: 1785230012545000000
reference_frame: base_link
tool_frame: tool0
action_type: ee_delta_pose
rotation_repr: axis_angle
units: {translation: m, rotation: rad, gripper: normalized}
dt_s: 0.02
horizon: 10
values: [[0.002, -0.001, 0.000, 0.0, 0.0, 0.01, -0.02], ...]
execution_policy: receding_horizon_first_4
safety_profile: manipulation_slow_v3样例 B:自回归 VLA → 动作 Detokenizer
{
"schema": "synthetic.action_tokens.v1",
"tokenizer_id": "robot_family_x-fastlike-2026-07",
"norm_stats_id": "dataset_r17_quantile_v2",
"robot_schema": "arm7_gripper1",
"chunk_start_state_id": "state-9017",
"tokens": [114, 87, 902, 41, 6, 6, 275],
"max_decode_age_ms": 80
}样例 C:VLA/任务策略 → 技能执行器
schema: synthetic.skill_call.v1
skill: place_object
skill_version: 3
arguments:
object_track_id: obj-27
target_region_id: tray-left
constraints:
avoid_region_ids: [glass-zone]
max_contact_force_n: 12
precondition_snapshot: state-5521
deadline_ms: 5000
cancel_on_goal_revision: trueaccepted/running/succeeded/failed/cancelled及原因。语言目标被修订时,旧技能可按合同取消。八、评价 VLA:离线动作误差只能回答很小一部分问题
九、VLA 项目启动检查清单

结论
FAQ
动作 Token 能直接发给控制器吗?
支持 50 Hz 是否代表模型每 20 毫秒推理一次?
统一动作空间能否消除跨本体适配?