VLM/VLA:动作表示与控制接口

VLM/VLA:动作表示与控制接口

Charles Lv7

VLA 之所以难,不只是因为感知复杂,还因为“动作”本身不是一个天然统一的对象。
同样一句指令“把杯子放到左边”,在不同系统里可能被表示成末端位姿增量、关节角命令、离散动作 token、未来动作块、子目标状态,或技能标识 / 潜在代码。

所以动作表示与控制接口其实是 VLA 成败的底层结构之一。很多系统看起来都是“图像 + 语言 -> 动作”,但真正决定它能不能学、能不能迁移、能不能落地的,常常就是动作这一层怎么定义。

难点解释:动作不是一句话的翻译

VLA 的输出不是“把语言翻译成命令”这么简单。一个动作可能同时包含位置、旋转、夹爪、速度、力和模式切换。不同分量的尺度、频率和风险都不同,动作接口定义错了,模型再大也很难稳定执行。

有趣例子:遥控夹娃娃机

玩家说“抓左边那只熊”,但机器真正需要的是横向移动多少、前后移动多少、爪子降多深、什么时候合拢、失败后是否再试一次。VLA 也是这样:语言目标很短,动作接口却很细。

1. 统一问题定义

从策略视角看,模型学习的是:

πθ(atot,l),\pi_\theta(a_t \mid o_{\le t}, l),

其中:

  • oto_{\le t} 是当前及历史观测;
  • ll 是语言指令;
  • ata_t 是模型输出的动作表示。

ata_t 到底是什么,会直接决定学习难度、跨机器人迁移难度、控制平滑性、低层控制器接口、安全约束方式,以及数据采集和标注的统一性。

2. 动作并不是一个标量,而是一组子变量

很多机器人动作可被拆成

at=(pt,rt,gt,mt,ft),a_t = (p_t, r_t, g_t, m_t, f_t),

分别表示

  • ptp_t:位置或平移;
  • rtr_t:姿态或旋转;
  • gtg_t:夹爪开合;
  • mtm_t:模式切换,如抓取、导航、对齐;
  • ftf_t:力或阻抗相关量。

这件事很重要,因为现实任务里这些分量的统计性质完全不同:平移通常连续且范围较大,旋转存在角度表示问题,夹爪往往接近离散开关,力控制则更稀疏也更危险。

如果把它们粗暴地塞进同一种 token 范式里,模型常会在某一维学得很好、在另一维很差。

3. 绝对动作与相对动作

3.1 绝对动作

at=xt+1targeta_t = x_{t+1}^{\text{target}}

直接给出下一时刻目标位姿或目标状态。
优点是语义明确,更接近“把末端移到这里”这种高层意图;缺点是对坐标系极敏感,跨平台泛化差,误差累积后容易和真实状态脱节。

3.2 相对动作

at=Δxta_t = \Delta x_t

让模型预测增量而不是绝对目标。
优点是更易泛化,更适合闭环修正,也更能适应不同起始状态。

很多真实机器人数据更适合这种表示,因为人类示范和控制器本来就是在不断做局部修正。

一个直观例子

若任务是“把杯子移到托盘中央”,绝对动作像是直接说“杯子最后应该在世界坐标 (x,y,z)(x,y,z) 这里”;
相对动作则像是不断说“向左 2 厘米、再向前 1 厘米、再下降一点”。
对真实闭环系统来说,后者常更稳。

4. 坐标系选择会决定迁移上限

动作表示还依赖参考系。常见选择包括:

4.1 世界坐标系

适合固定工位,但对标定和场景重建要求高。

4.2 机器人基座坐标系

硬件接口友好,但换平台或移动底座后需要重新适配。

4.3 相机坐标系

更贴近视觉输入,适合视觉伺服,但会受相机外参漂移影响。

4.4 目标物体局部坐标系

更利于抓取和操作泛化,但前提是物体姿态估计足够准。

4.5 末端工具坐标系

适合局部精细接触任务,例如擦拭、插入、贴合。

如果目标是做跨平台或高层策略,很多系统更偏向先学更稳健的相对表示,再通过中间适配层映射到具体机器人控制接口。

5. 笛卡尔空间与关节空间

5.1 笛卡尔空间动作

动作是末端执行器位置和姿态变化。
更贴近任务语义,例如“向前推一点”“向下放一点”。

优点是和语言更容易对齐,更适合跨机械臂迁移,也更容易插入碰撞检查和路径平滑;缺点是需要逆运动学或底层控制器支持,奇异位形、关节限位等问题会被推迟到接口层处理。

5.2 关节空间动作

动作是各个关节角、角速度或力矩命令。
更贴近硬件接口,但学习难度通常更高。

优点是执行直接,对专用平台可做到高频闭环;缺点是语义弱、跨平台迁移差,非专业数据下很难学稳。

6. 连续动作与离散 token

6.1 连续动作

最自然,也更接近真实控制。
常见训练方式是回归

Lact=ata^t1orata^t22.\mathcal{L}_{\text{act}} = \|a_t - \hat{a}_t\|_1 \quad \text{or} \quad \|a_t - \hat{a}_t\|_2^2.

优点是精细、无量化误差,对接触和插入类任务更友好;缺点是对尺度和归一化很敏感,序列建模时也不如离散 token 方便。

6.2 离散动作 token

把连续动作量化成若干 token:

at(ut1,ut2,,utm).a_t \rightarrow (u_t^1, u_t^2,\dots,u_t^m).

优点是容易接入 Transformer 序列建模,更接近语言模型训练范式,也能与动作字典、技能字典结合;缺点是会引入量化误差,在精细接触任务中容易不够平滑,离散边界附近还可能出现控制抖动。

RT-1-X and RT-2-X action token interface

图源:Open X-Embodiment: Robotic Learning Datasets and RT-X Models,Figure 2。原论文图意:RT-1-X 与 RT-2-X 都以图像和文本指令为输入并输出离散 end-effector actions;RT-2-X 把动作表示成另一种语言 token,与视觉语言数据一起训练。

图解:离散动作 token 的优势和代价

这张图把“动作也可以 token 化”画得很直观:输入仍是图像和指令,输出不再是自然语言,而是 gripper、位置增量、旋转等离散动作 token。优势是可以复用 Transformer/LLM 的序列建模和多任务训练框架;代价是连续控制被量化,精细接触时可能出现不够平滑或边界抖动。因此离散动作更适合通用策略和跨任务统一接口,低层执行仍需要控制器和安全滤波兜底。

6.3 何时离散更合适

若任务偏高层技能选择、长时序规划或动作模板重用,离散化常有帮助;但若任务偏插孔、螺丝装配、贴边放置或柔顺接触,连续动作通常更稳。

7. 动作 chunk 为什么常常比单步更有效

真实机器人控制里,很多系统不会每次只预测一步,而是预测未来一个动作块:

A^t:t+H1=πθ(ot,l).\hat{A}_{t:t+H-1} = \pi_\theta(o_{\le t}, l).

优点是减少抖动、学出更完整的技能片段,降低感知噪声对每步决策的影响,并让模型在时间上看得更远。

一个直观例子:开抽屉

如果每 40ms 只决定一个极小动作,模型很容易在把手附近来回犹豫。
如果一次预测“接近 -> 闭合夹爪 -> 后拉”的小段动作,轨迹会稳定得多。

7.1 但 chunk 也有代价

动作块过长时,系统会变得不够灵活。
环境一旦变化,整段动作都可能过时。
所以常见设计是预测较短 chunk,只执行前半段或前几步,然后重新观察与重规划。

这本质上是滚动时域控制思想在 VLA 里的体现。

ACT architecture 原论文图

图源:Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware,Figure 2。原论文图意:Action Chunking with Transformers (ACT) 用 CVAE 编码动作序列和关节观测,测试时根据多视角图像、关节状态和 latent 生成一段 action sequence,并用 temporal ensembling 平滑执行。

图解:action chunk 是为了解决时间结构

ACT 图说明了为什么很多机器人策略不只输出下一步动作:一段短动作能保留技能内部结构,减少逐帧抖动。π0.5 也采用高层子任务加连续 action chunk 的路线:先预测“现在该做什么”,再生成约 1 秒的连续动作。对世界模型高效训练来说,chunk size 不是小细节,它直接改变动作 token 数、rollout horizon、恢复频率和安全回退难度。

8. 动作归一化、单位与频率不能乱

很多 VLA 系统离线 loss 很好,实机却抖动严重,问题并不总在模型,而在动作统计没有统一好。

常见要素包括

8.1 范围归一化

不同维度的量级差异很大,例如平移以厘米计,旋转以弧度计,夹爪可能是 0/1 或毫米开度。

如果不做归一化,模型会偏向先优化大尺度维度。

8.2 频率对齐

示范数据可能是 10Hz,真实控制器却跑在 50Hz100Hz
这时动作语义会发生变化:同样的位移增量对应完全不同的速度。

8.3 延迟补偿

相机、推理和控制执行之间的延迟会让“正确动作”在真正执行时已经偏晚。
因此很多系统需要显式考虑观测时间戳、推理延迟、控制器刷新频率和动作外推。

动作接口成本账

同一个任务,动作表示不同,训练和推理成本会完全不同:

设计 序列成本 控制收益 主要风险
20Hz 单步动作 1 分钟任务约 1200 个动作 step 反馈频繁,恢复快 序列长、模型易抖、训练吞吐差
1 秒 action chunk 1 分钟任务约 60 个决策点 动作更连贯,训练序列短 环境变化时整段动作可能过时
高层 skill token 1 分钟任务可能只有十几个决策 适合规划和长任务 技能边界难标注,失败原因不透明
连续 action expert 保留控制精度 精细接触更稳 训练目标、归一化和实时推理更复杂

所以动作接口不是“越抽象越好”或“越细越好”。如果目标是训练动作条件世界模型,最重要的是动作能稳定解释未来差异:同一状态下换动作,未来应该发生可理解的分叉。

9. 控制接口为什么必须显式设计

很多 VLA 演示看起来像“模型直接控机器人”,但真实部署里通常有至少两层:

VLA high-level actioncontroller interfacerobot execution.\text{VLA high-level action} \rightarrow \text{controller interface} \rightarrow \text{robot execution}.

中间接口负责坐标变换、逆运动学、速度 / 加速度限制、平滑滤波、安全投影、碰撞检查和超界裁剪。

如果这层接口设计不好,哪怕模型输出“语义上正确”,机器人也可能执行得很糟。

10. 三类典型接口设计

10.1 高层目标接口

例如目标位姿或目标抓取点。
更适合把 VLA 当策略规划层。

10.2 中层动作块接口

例如未来若干步末端位姿增量。
兼顾可学性和可执行性,是很多系统最实用的折中。

10.3 低层力矩/关节接口

更直接,但通常不适合大模型端到端学习,除非系统对硬件非常专用且数据极多。

11. 跨平台迁移为什么难

同样动作表示换到不同机器人上,问题会立刻出现:工作空间大小、夹爪形态、机械臂自由度、控制频率、相机布局和安全边界都可能不同。

因此动作表示要么尽量抽象得更稳健,要么显式引入平台适配层。

11.1 常见适配方式

常见做法包括统一末端语义空间再映射到底层控制,对每个平台学习单独 adapter,把动作改写成对象中心或任务中心表示,或用技能层代替原始动作层。

12. 常见失败模式

失败 1:离线学得好,实机抖动严重

往往说明动作表示与控制接口没有对齐。

失败 2:同任务跨平台直接失效

说明动作编码强绑定了某个平台坐标和控制习惯。

失败 3:量化或离散动作后接触任务精度骤降

说明动作表示过粗,无法覆盖细粒度控制需求。

失败 4:动作 chunk 很稳,但恢复能力很差

说明时间结构有了,闭环重规划却不够快。

失败 5:动作语义对了,安全约束没兜住

例如目标位姿落在障碍物内部,控制接口没有做约束投影。

真实排查案例:chunk 很稳,但失败恢复变慢

环节 观察
输入症状 把单步动作改成 1 秒 action chunk 后,正常轨迹更平滑,但物体滑动、抽屉卡住或人手干预时,机器人继续执行旧动作
指标 平均成功率略升,抖动下降;near-miss、人工接管率和失败后恢复时间上升
Trace / 回放观察 policy 在 chunk 开始时判断正确,但执行中真实状态已变化;controller 只做限幅,没有把风险反馈打断到高层
判断 chunk 解决了局部平滑,却让系统更偏开环;动作接口缺少中途验证和可中断语义
修复 只执行 chunk 前半段再重规划;给 chunk 加 abort condition;用世界模型或 risk head 预测“继续执行是否会进入不可恢复状态”
反例 如果任务是稳定传送带分拣或离线轨迹回放,长 chunk 可能很划算。问题出在高扰动闭环任务中把平滑性收益外推成恢复能力

13. 工程建议

如果你在设计 VLA 系统,建议优先问:模型到底输出高层目标还是低层控制,动作坐标系是否稳定且可迁移,是否需要 action chunk,控制频率和示范频率是否对齐,是否有独立低层控制器兜底平滑与安全,以及跨平台迁移是不是目标之一。

这几个问题通常比“换一个 backbone”更决定系统能否落地。

14. 小结

动作表示与控制接口是 VLA 的底层语法。它决定模型到底是在学高层意图、中层技能,还是低层控制信号。

如果这一层没设计清楚,后面的训练规模、模型大小和数据量都会很快碰到上限。真正成熟的 VLA 系统,通常不是让一个模型生硬输出所有控制量,而是把动作表示、时间结构、控制接口和安全投影一起设计成一条连续的执行链。

快速代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch

def chunk_actions(action_seq, chunk_size=8):
# [T, act_dim] -> [num_chunks, chunk_size, act_dim]
T, dim = action_seq.shape
pad = (chunk_size - T % chunk_size) % chunk_size
if pad:
action_seq = torch.cat([action_seq, action_seq[-1:].repeat(pad, 1)], dim=0)
return action_seq.view(-1, chunk_size, dim)

def safe_project(action, low, high):
# 控制接口安全投影
return torch.clamp(action, low, high)

这段代码把动作接口里最常见的两步拆开:chunk_actions 负责把长序列动作重排成固定块,便于策略按块预测;safe_project 负责把动作约束在执行器允许范围内,降低越界风险。

工程收束

动作接口的核心问题不是“离散还是连续”这么简单,而是模型输出能否被执行器稳定消费。上线前要确认动作单位、坐标系、chunk 边界、频率、约束投影和安全停止都写成明确契约;否则模型能力会被接口抖动、坐标错配或越界动作吞掉。

  • Title: VLM/VLA:动作表示与控制接口
  • Author: Charles
  • Created at : 2026-03-29 09:00:00
  • Updated at : 2026-03-29 09:00:00
  • Link: https://charles2530.github.io/2026/03/29/ai-files-vla-action-representation-and-interfaces/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments