阅读时间大约9分钟(3465字)
出品:机器人技术笔记
把杯子放进水槽这件事,人做的时候几乎不会想太多。
看到杯子,伸手,调整角度,碰到杯沿时稍微让一下,最后松开。整个动作像是一口气完成的,所以当 VLA(视觉-语言-动作模型)也能根据图像和指令给出动作时,很自然会觉得:那机器人是不是可以直接照着动了?
问题就卡在“照着动”这三个字上。
在一些 VLA 系统里,模型给机械臂的可能只是七个数:前六个数描述末端下一步往哪里移动、转多少角度,最后一个数控制夹爪开合。对模型来说,这已经是一条动作;对真机来说,它更像一个还没落地的目标。
这个目标属于哪个坐标系?机械臂能不能到达?途中会不会碰到桌沿?杯子偏了几毫米以后,夹爪应该继续合拢,还是停下来重新对准?如果下一次模型推理迟到了,电机又该听谁的?
这些问题不会因为模型已经输出动作而自动消失。
真正决定机器人能不能稳定执行的,是模型输出之后那段经常被省略的接口:动作如何与本体对齐,如何受约束,如何被底层控制器持续跟踪,又如何在失败时停下或恢复。

这张图不是所有 VLA 机器人的统一架构。有的系统保留逆运动学、轨迹规划和碰撞检测,有的系统让学习策略直接输出关节目标,把传统中间模块压缩掉。
方框可以合并,责任不能凭空消失。
VLA 说的动作,可能根本不是同一种东西
讨论 VLA 能不能直接控制机器人,先要问一个很朴素的问题:它输出的动作究竟是什么?
RT-2 把机器人动作表示成离散 token。一次输出中包含终止标记、末端位置和旋转的变化量,以及夹爪动作,再把这些 token 解码回连续控制量。[1]
OpenVLA 采用相似思路。它公开的模型输出是归一化的 7 维末端增量:三维位置、三维旋转,再加一个夹爪维度。[2] 在两套 Franka 任务上,论文项目页给出的部署频率分别是 5 Hz 和 15 Hz。[3]
这两类输出表达的是末端下一步该怎么变。它们没有直接告诉七个关节各自转到哪里,更没有告诉每台电机应该通多大电流。
π0.5 的接口更靠下。它用 action chunking 一次生成一小段连续动作,在公开的移动操作系统中,以 50 Hz 给双臂、夹爪和升降机构发送目标位姿,同时给底盘发送目标速度。这些目标仍由 PD 控制器跟踪。[4]
把三个系统放在一起看,会发现 VLA 的动作至少可能处在三个不同层次:
• 末端位姿或位姿增量;• 关节位置、关节速度等本体动作;• 一段未来动作,也就是 action chunk。
它们都可以叫动作,下面需要补的控制工作却完全不同。
所以我不太建议只凭端到端三个字判断系统结构。更有用的判断方式是继续追问:模型的输出落在哪一层?单位、坐标系和控制频率是什么?输出下面还有谁在工作?
第一段接口:让模型动作与这台机器人对上
假设 OpenVLA 给出一个末端向前移动 2 厘米的目标。
机器人要执行它,至少要先弄清楚这个向前属于相机坐标系、基座坐标系还是末端坐标系。相机外参一旦变化,同一组数字可能指向完全不同的方向。
接下来还要把末端运动映射到关节运动。这一步看起来只是逆运动学,实际会同时碰到关节限位、多解和奇异位形。末端移动很小,不代表每个关节都只需轻微转动;在某些姿态附近,末端速度要求甚至会被放大成剧烈的关节运动。
更换本体后,问题会再来一遍。
单臂数据里的 7 维动作不能原样控制双臂和移动底盘。不同机器人还可能采用不同的关节正方向、夹爪量程和控制模式。即使动作维度相同,归一化范围不一致,也可能让一个看似温和的输出变成突然的大幅运动。
MoveIt Servo 接收末端位姿、末端速度或关节速度命令后,仍会处理运动学映射,并检查奇异位形、碰撞以及关节位置和速度限制。[5] VLA 项目不一定要用 MoveIt,但这些检查提示了一个真实的工程责任:模型输出必须先翻译成当前本体真正听得懂的命令。
这层翻译也可以学进模型。代价是,本体接口从显式程序转移到了训练数据和策略内部。换一台机器人时,动作定义、数据分布和控制接口依然需要重新对齐。
接口并没有消失,只是变得不那么容易看见。
第二段接口:让可达动作变成可执行动作
逆运动学找到一组关节角,只能说明目标在几何上可能到达。
机器人真正运动时,还要守住关节位置、速度和加速度限制,避开自身、桌面和旁边的人;目标也不能在相邻周期里突然跳变,让电机去追一个物理上来不及完成的动作。
这里常见两种路线。
一种是保留显式约束层。运动规划器寻找无碰路径,时间参数化给轨迹补上速度和加速度,实时安全模块负责限幅、减速或停止。MoveIt 的轨迹处理和 Servo 安全检查、ros2_control 的命令限幅,都属于这类思路。[5][6][7]
另一种是让策略和数据承担更多运动生成责任。π0.5 的公开系统没有额外的轨迹规划和碰撞检测,模型直接给出目标,再由 PD 控制器跟踪。[4]
这条路线很有价值,因为它说明学习策略确实可以向下覆盖传统控制栈的一部分。但它不能被简化成碰撞和约束已经不存在。更准确的说法是:这些问题被交给了策略、训练数据和系统测试。
责任转移以后,验证要求反而更值得追问。
训练数据有没有覆盖桌面高度变化?人突然伸手时,系统怎样处理?从实验环境换到工具高速运动、人员混行或有安全认证要求的场景,原来的策略边界是否还成立?
一次成功演示可以证明系统完成过任务,不能单独证明所有失效情况都已被覆盖。
第三段接口:模型给目标,控制器负责让身体跟上
空中接近杯子时,几毫米误差可能只是抓取姿态不够漂亮。夹爪真正接触杯子后,同样的误差会变成力。
杯子偏了一点,夹爪可能先碰到一侧;桌面高度估计不准,末端可能继续向下压;杯子开始滑动时,半秒前生成的抓取动作已经过时。
这就是为什么提高 VLA 的动作频率很重要,却仍不能替代底层闭环。
VLA 擅长结合图像、语言和机器人状态,判断接下来做什么、动作往哪里修正。关节伺服和电机控制则要在更短的时间尺度里跟踪目标、抑制扰动,并处理编码器、电流、力矩或触觉反馈。
两者不是简单的高低级之分,而是面对不同的时间压力。
模型一次推理慢了几十毫秒,底层控制器不能跟着停摆。它需要继续执行已有目标,或者按照事先约定保持、减速、停止。否则,网络抖动和推理延迟就会直接变成机械冲击。
接触任务还会提出更具体的问题:系统到底控制位置、力,还是位置与力之间的动态关系?插接、打磨、拧紧和人与机器人接触,对传感器、执行器和控制方法的要求都不一样。
VLA 可以决定我要把插头插进去,却仍需要底层系统回答:接触以后允许多大的力,偏了以后怎样让开,什么时候必须停止。
这也是本系列后面要继续拆的主题:机器人碰到环境以后,到底应该硬一点还是软一点?
Action chunk 缓解机器人犹豫不决
单步预测每次只给一个很短的动作。模型推理稍有波动,机器人就可能停顿;连续几次预测方向不一致,动作也容易犹豫。
Action chunk 一次生成未来一小段动作,下层可以在等待下一次推理时继续执行,擦桌子、叠衣服这类连续任务也更容易保持节奏。
但动作段不是越长越好。
它越长,系统对高频重算的依赖越小;环境突然变化时,后半段动作也越容易过时。把整段执行完再观察,反应可能太慢;只执行前几步就重新预测,又要处理新旧动作怎样平滑接续。
因此,我更愿意把 action chunk 看成 VLA 对未来一小段运动的临时承诺。控制器负责把它连续执行,新的观测到来后,策略再决定保留、修正还是丢弃剩余动作。
它主要缓解动作连续性和推理节奏问题。碰撞检查、接触稳定性、超时保护和失败判定,仍要在完整系统里找到负责人。
第四段接口:失败以后,谁来接管?
夹爪闭合,只代表闭合命令被发出,不代表杯子已经抓稳。
系统还要根据视觉、夹爪位置、电流或触觉判断:杯子有没有离开桌面,是否正在滑落,夹爪是不是抓空了。
如果失败,下一步也不是统一的再试一次。
杯子没抓稳,可以让策略重新观察、调整抓取点;控制器跟踪误差持续增大,可能要停止当前动作;通信超时、关节超速或有人进入危险区域,则应该交给更确定、离硬件更近的保护机制。
这里要分清任务恢复和安全保护。
前者追求把事情做完,可以利用 VLA 的视觉理解和策略能力;后者先保证机器人进入可接受状态,不能把希望押在下一次模型推理上。
VLA 可以学会从部分失败中恢复,但不应该兼任急停装置。
真机接入前,先确定好接口
如果你正在把 VLA 接到机器人上,我会把模型选型往后放一步,先把下面五件事写清楚。
输出是什么。 是末端位姿增量、关节位置、关节速度,还是一段 action chunk?它的单位、坐标系、归一化范围和更新频率分别是什么?
谁负责翻译。 坐标变换、逆运动学和本体适配放在哪里?换相机、换夹爪或换机器人以后,哪些参数和数据必须重做?
谁负责约束。 关节限位、速度限制、碰撞、奇异位形和动作平滑,由显式模块处理,还是由策略承担?如果交给策略,用什么测试证明覆盖范围?
谁负责持续跟踪。 两次 VLA 输出之间,哪个控制器继续运行?推理超时、通信中断和目标跳变时,机器人保持、减速还是停止?
谁负责失败与接管。 抓空、滑落、控制器报错和安全停机分别由谁发现?哪些情况允许模型重试,哪些情况必须交给确定性保护或人工处理?
这五项写清楚,才算建立了 VLA 与真实机器人之间的接口合同。
从VLA到一次可靠动作,中间没有魔法
回到开头 VLA 输出的七个数。
它们可以让机械臂末端向杯子靠近,却不能单独保证坐标正确、路径安全、接触稳定,也不能决定失败以后该怎样收场。
VLA 正在向控制栈更深处延伸。RT-2、OpenVLA 和 π0.5 展示了从动作 token、末端增量到连续 action chunk 的不同接口,也说明传统模块的边界会继续变化。
但端到端描述的是系统怎样学习、模块怎样连接,不是机器人获得了绕开物理约束的能力。
下次看到 VLA 直接控制机器人,可以多问三句:它直接输出到哪一层?目标下面还有什么控制器?出错以后谁负责停下和恢复?
这三句问完,模型输出的动作,才开始接近一条能够交给真机的命令。
如果还没看上一篇,可以先读《一张图理清人形机器人控制系统:从 VLA 到电流环,到底分几层?》,补齐整条控制链路。
