去年我把一台六轴机械臂接到一个纯视觉语言模型上时,实验室同事的第一反应基本是两种:要么觉得我在整活,要么认为我疯了。在他们眼里,机器人控制这件事要么走端到端强化学习,要么老老实实做感知、规划、控制那一套,怎么可能一个没有经过任何机器人数据训练的VLM拿过来就能开机械臂。但我真跑起来之后发现,这个方向不仅可行,而且暴露出一个很扎心的现实:当任务被定义成“看懂场景、拆解步骤、调用工具”的时候,一个VLM加一个Agent循环,确实能解决很多过去需要复杂策略网络才能解决的问题。这就是“Just a VLM Agent Can Play Robots”这句话想表达的真正意思。它不是说要干掉传统控制,而是给机器人圈提供了一个更轻量、更泛化的起点。

这篇文章我会分几条线来聊:VLM为什么具备操作机器人的基础能力,把VLM接进机器人系统时哪些架构设计是最大分水岭,一个最小可复现的系统怎么搭,以及我在实测中踩过的一堆坑。如果你是做具身智能、机器人应用开发或者Agent方向的学生和工程师,这篇文章应该能帮你省下至少两周的试错时间。

1. 一个反直觉的判断:纯VLM凭什么能碰机器人

1.1 VLM不是在“假装”会操作,而是在理解场景

先说清楚VLM到底带来了什么。视觉语言模型本质上是把图像和文本拉到一个语义空间里的大模型,它既看得到图,也读得懂字。过去我们做机器人抓取,要单独训练目标检测模型,单独写位姿估计模块,再单独写一个任务调度器,把“看见杯子”和“去抓杯子”串起来。VLM出现之后,这些环节被极大地压缩了:你给它一张工作台的图,它可以直接告诉你桌面上有什么、杯子和手的相对位置关系大概是什么样、哪块区域是空的可以放置物体。

这里的关键不是它当了一个更强的目标检测器,而是它把“场景理解”和“常识推理”合并了。比如你让它帮老人倒水,它知道自己要先找杯子和水壶,杯子在水壶左边,拿壶倒水的时候杯口要朝上,倒太满会溢出。这些知识不是从机器人数据里学来的,而是从互联网图文、操作教程、甚至是说明书里读到的。所以你会发现,VLM面对一个它没见过的新任务时,能靠语义理解推断出“应该怎么做”,这正好是传统机器人流水线最欠缺的部分。

我自己的体会是,VLM在操作任务里的角色更像一个有经验但手不碰设备的现场班长,它在旁边看着场景照片,告诉你下一步该往哪走,至于具体走多快、力用多大,那是底层控制系统的事。这种分工一开始听上去很虚,但真正接起来之后你会发现它的下限比你想象的高很多。

1.2 从RT-2到OpenVLA:视觉语言模型转动作的演进脉络

VLM做机器人操作不是凭空出现的,这个方向其实已经铺垫了好几年。Google的RT-2算是标志性工作之一,它把机器人的动作输出也当作一种“语言”来建模,在图文数据和少量机器人轨迹数据上一起训练,让模型能够输出动作token。OpenVLA则是把这条路开源化,用一个7B级别的视觉语言模型做基座,在开源的机器人数据集上微调,并且让模型先进行CoT推理,再输出动作。

这类视觉语言动作模型证明了一件事:VLM家族完全有潜力把视觉输入直接映射成操作指令。但我想说的是另一层逻辑——即使不单独微调,直接用现成的GPT-4V、Gemini、Qwen-VL这一类通用VLM,通过Agent框架来调度,也能完成不少真实机器人任务,因为它的图文联合训练数据里已经包含了海量的“操作场景”。它看过太多人怎么拿东西、怎么开门、怎么整理桌面,所以它知道不同物体的把持方式和使用顺序。只是它不知道你的机械臂的关节角是多少,也不知道电机脉宽怎么算,这些问题需要架构来解决,而不是靠模型本身。

1.3 “Just”的真实含义:接口简化带来的范式变化

我在调试这个系统时最惊讶的一点是,整个闭环的原型代码量比我预想中小得多。摄像头拍一张图,送进VLM,VLM返回一段文本,脚本解析后调用机器人SDK去执行。对比传统方案里动辄要标注数据集、设计奖励函数、训练几十万步流程,“Just a VLM”这个“Just”其实是站在工程接口的意义上说的:从感知到动作的路径真的被缩短了。

但“Just”也容易误导人。它不等于“随便拿个模型就能量产落地”。VLM只是把认知和规划层面的门槛降下来了,真要把系统做得稳,你依然要在模型接入方式、闭环验证、异常处理这些工程细节上花大力气。我见过很多人开始用VLM做机器人时特别乐观,结果第一次跑就发现问题一大堆,然后就下结论说“VLM不行”。其实不是VLM不行,是架构没做对。接下来的篇幅,我就重点讲讲架构这个分水岭。

2. 架构设计比模型更关键:别让VLM直接输出电机指令

2.1 直接输出关节角度的教训

有一种很常见的尝试,劝退效果也最好:直接把相机图像丢给VLM,让它返回六个关节角,比如“关节1旋转37度,关节2旋转82度”,然后发给电机。结果通常是动作要么完全不对,要么机械臂带着奇怪的轨迹乱甩。为什么?因为VLM在训练时根本没见过你的机器人运动学和动力学,它不知道当前各个关节的角度,也不知道末端从A点到B点中间要经过什么路径。让它直接从像素跳到连续控制量,等于逼一个只会看菜谱的人去精准控制刀工,切出来什么形状完全是玄学。

更麻烦的是连续控制还要求高频、平滑、有界。VLM一次推理需要几百毫秒甚至几秒,输出还带有随机性,直接输出关节角除了会让系统变得难以预测,还存在机械臂超限、碰撞的风险。我这么讲是想说,如果你打算用VLM做机器人的“大脑”,不要把控制层的脏活累活交给它。VLM的粒度适合决策,不适合伺服。

2.2 分层控制:VLM管意图,底层算法管轨迹

经过几次失败之后,我把系统改成了分层架构,效果一下子稳定了很多。上层VLM只负责输出高层动作原语,比如“移动到杯子位置”“关闭夹爪”“把杯子搬到左侧空位”,底层则由运动规划器、逆解模块和PID控制器去执行具体轨迹。这样VLM不需要知道机械臂的关节角,也不需要关心轨迹的数学表达,它只要给出语义级目标,剩下的交给确定性的算法。

简单来说,这个分层设计遵循一个原则:让模型做模型擅长的事,让算法做算法擅长的事。VLM擅长的是一帧图像里的常识判断和任务拆解,传统控制擅长的是精确复现轨迹和力矩控制。边界一划清楚,我发现对VLM本身的要求也降低了,不需要多强的空间量化能力,哪怕它指一个大概的区域,底层视觉定位模块可以做进一步精修。做一张对比表可能更直观:

架构策略 决策粒度 成功率 开发复杂度 可解释性
VLM直接输出关节角 连续动作级 低 低 差
VLM输出高层意图+底层规划 任务子目标级 高 中 好
纯传统感知+手动规则 固定流程级 中 高 好

我实际跑下来的结果也是第二行最稳。哪怕有时候VLM选错了目标物体,也只是在高层决策上错,一旦切到底层执行,轨迹本身不会有那种“抽搐感”。

2.3 视觉闭环:确认、重试与失败上报

分层之后,另一个容易被忽略的关键是闭环验证。一个只知道发指令不知道确认结果的Agent,在真实机器人场景里几乎没有使用价值。机械臂抓一个杯子,夹爪闭合了,但不代表杯子一定被抓住了,可能杯子滑了、重心偏了、甚至根本没碰到目标。所以我在系统里加了一个确认节点:每次执行完一个动作原语,就重新拍一张图,让VLM判断“这个子任务是否完成”,如果没完成,再让VLM重新输出下一个动作。

这一步的价值在于把VLM当成了一个免费的裁判。它不需要额外训练,就能给出“杯子是否被拿起”“物体是否已放到目标区域”这类语义判断。配合一个简单的重试和失败上报状态机,整体的鲁棒性能提高不少。我一般设置最大尝试次数为3次,超过就停下来请求人工介入,避免模型陷入同一个错误动作的无限循环。这个机制听起来很基础,但很多项目恰恰是少了它,最后在演示现场翻车。

3. 最小可复现系统:把VLM Agent接到机械臂上

3.1 硬件与仿真环境的选型心得

如果你想快速验证这套思路,我的建议是先仿真后真机。仿真方面Robosuite、SAPIEN、Habitat都能跑桌面抓取和操作任务,环境里有现成的机械臂模型和相机接口,省掉硬件折腾。真机方面我比较推荐有Python SDK的机械臂,比如UR系列、xArm或者一些开源驱动的六轴臂,至少别让自己在“如何发一个运动指令”这种最基础的问题上耗太久。

相机的位置很关键,我试过正上方视角和侧上方45度视角,对于VLM来说侧上方视野更好,因为能看到机械臂本体与物体的相对关系,有点像一个工作人员站在操作台旁边往下看。纯俯视图虽然方便计算坐标,但模型很难理解机械臂的高度变化和夹爪的开合状态。另外一定要把相机画面裁到合适范围,不要拍入太多无关背景,否则会明显分散模型的注意力,这一点后面我还会细说。

3.2 Prompt和输出约束的设计细节

Prompt设计对VLM Agent的稳定性影响极大。我踩过一轮自由对话的坑之后,最终稳定使用的模板大概是这样:

你是机械臂操作员。你会收到一张当前工作台的图像,你的任务是执行用户指令。
只能使用以下动作原语:move_to, pick, place, push, done。
输出必须是JSON:{"action": "动作原语", "target": "目标物体描述", "reason": "简短判断依据"}
如果目标物体在视野中不可见,输出{"action": "lookup", "target": "寻找的对象"}。
如果任务已经完成,输出{"action": "done"}。
当前指令:{task}

这里最关键的是两点:一是动作原语的集合要足够小、语义足够清晰,让模型在有限的选项里做选择,而不是自由发挥;二是用JSON约束输出格式,方便脚本直接解析。我建议你把动作原语数量控制在5个以内,太多的话模型会频繁选错。如果你用的VLM支持JSON模式,一定要打开,比正则解析自然语言输出稳定一个数量级。

另外不要把任务描述得过于抽象。“把杯子放过去”这种指令会引发歧义,最好是“把绿色杯子放到桌面右上角的托盘里”。因为VLM需要从图像里定位一个明确的物体,越精确的指代,越能减少误判。

3.3 一个可扩展的状态机与恢复策略

在实际代码层面,我会把整个Agent跑成一个循环:观察,决策,执行,再观察。如果不做一个显式的状态机,Agent很容易在同一个失败动作上反复打转。我的实现逻辑分四层:

  1. 初始化阶段:给VLM当前图像和完整任务指令,让它输出第一个动作。
  2. 执行阶段:解析动作原语,交给底层控制器;如果是move_to,还需要结合视觉定位模块计算出具体坐标。
  3. 验证阶段:重新拍照,让VLM或一个小分类模型判断子目标是否达成。
  4. 恢复阶段:如果验证失败,让VLM提出备选动作;连续失败3次则退出并请求人工协助。

状态机的好处是把“尝试次数限制”变成一个显式参数,不同的子任务可以给不同的阈值,比如抓取允许重试3次,而放置只允许重试2次。同时,每个阶段的日志都要记录下来,这样后期回看时你能清楚地发现是VLM决策错了,还是底层定位偏了,而不是靠猜。对于多步骤任务,我还会维护一个简短的行为日志字符串,比如“第2步:抓到杯子,第3步:移动到托盘上方”,每轮决策时作为文本历史发给VLM,让它在当前图像之外还能知道“自己已经干到哪了”。

4. 实测中的瓶颈与踩坑记录

4.1 延迟:决策和动作执行的速度差

真实操作中最大的感受就是慢,不是动作本身慢,而是VLM思考太慢。调用云端的通用模型接口一次可能需要1到3秒,一个任务如果拆成10个子步骤,每步都要决策和验证,累计耗时经常超过半分钟,演示时稍不留意就让人觉得机器人反应迟钝。后来我做了三个优化:首先是在非关键步骤之间不做视觉确认,只在抓取、放置这种决定性步骤才二次检查;其次是把小图或压缩帧送给模型,在保证语义可见的前提下降低传输和推理时延;最后是把一部分重复性判断交给轻量图像算法,比如目标是否脱离工作台直接用深度相机的阈值判断,不需要大模型出场。

我特别想提醒的是,不要盲目追求“全程由VLM驱动”。VLM是一个高成本组件,让它在每一个微小步骤上都发挥并不划算。把计算资源集中在容易出错或者需要抽象判断的节点,整体的节奏会舒服很多。

4.2 VLM的视觉盲区:为什么细节总被忽略

另一个我很头疼的问题是模型会漏掉细节。桌面上如果同时有螺丝、杯子、餐具和一块布,模型大概率只关注最大、最显眼的物体,对那些小目标或者颜色对比度低的目标经常视而不见。有一回我让它抓桌角的一颗螺丝,它连续三轮都回答“视野中没有螺丝”,但其实螺丝就在图像右下角,只是尺寸太小,模型的视觉编码器下采样后直接把它忽略了。

解决办法不是换一个更大的模型,而是在架构上做补偿。我会加一个独立的视觉定位模块,比如用Grounding DINO或者更轻量的目标检测器先找到物体的像素坐标,再把“物体在图像中的位置”作为额外信息拼进提示词里,告诉VLM“螺丝位于图像右下角约200像素处”。这样VLM的空间判断负担大幅下降,它只需要做语义决策,不需要从头在图里找目标了。这个组合方式成本很低,但效果立竿见影。

另外提醒一句,VLM对文本描述里的物理尺寸参考系也很弱。你让模型估计“杯子离夹爪多远”,它给出的回答往往不够精确。所以凡是需要精确空间数字的地方,一律不要让模型猜,老老实实用相机标定和深度信息来算。

4.3 上下文污染与编造成功:大模型的两个大坑

使用多轮对话时,上下文污染是很容易踩的坑。我把之前的历史图像都塞给模型之后,它的输出明显变混乱:有时候它看着当前画面却按旧状态行动,有时候又把已经挪走的物体当作还在原位。这其实是上下文中的多帧图像互相干扰导致的。我后来的做法是:每一轮视觉输入只放当前帧,历史操作过程全部抽象成一行文本日志,并且每隔几轮重置一次对话,只保留最新的系统提示和最终任务目标。

第二个坑是模型会“编造成功”。夹爪闭合后,让VLM判断是否抓稳,它可能看到夹爪已经合拢就认为物体已经被抓住了,哪怕物体实际上掉在了地上。这种语义误判在真实场景里非常危险。所以我给它的判定标准写得更严格:只有看到物体离开桌面并且高度稳定,才算抓取成功;只看到夹爪状态变化不算。实在不行,就自动读取力传感器或夹爪内部的距离数值作为硬判据,VLM的视觉判断作为辅助。在安全攸关的任务里,不要让大模型的“乐观”替你决策。

5. VLM Agent够不够用:边界、补强与多机协同

5.1 与传统策略的适用性对比

说到这一步,难免要面对一个更现实的问题:VLM Agent到底适合什么任务,不适合什么任务?我的判断是,它适合语义复杂度高、环境变化大、动作精度要求又不算极限的任务,典型场景是家庭服务、仓储拣选、桌面整理、巡查运维。反过来,高频振动控制、微米级装配、高速动态抓取这类任务,VLM暂时代替不了专用控制算法和强化学习策略。我做了一个对比表,方便大家按需求筛选:

维度 VLM Agent方案 传统感知+规划+控制方案
语义泛化能力 强,可零样本切换新任务 弱,每换场景要重标数据
空间精确度 低到中,依赖底层定位模块 高,可亚毫米级
开发效率 高,提示词和接口为主 低,数据与训练周期长
推理延迟 高,秒级 低,毫秒级
可解释性 较好,模型会输出Reason 中,状态机更机械
安全约束 需要外部硬安全层 天然嵌入控制环路

如果你的任务卡在“识别物体是谁、按什么顺序处理”这种环节,VLM Agent几乎是降维打击;如果你的任务卡在“轨迹误差不能超过1毫米”,那还是让给运动控制算法吧,别硬撑。

5.2 安全约束与专用小模型的协同

即便VLM能力很强,我也一向建议在它的外面套一层硬安全约束。毕竟大模型输出的随机性客观存在,你没法保证它在所有边界条件下都作出正确决策。我的做法是在VLM和底层执行之间插一个过滤层:动作原语必须在一个预先定义的安全集合里,坐标必须落在工作空间边界内,夹爪力度必须有上限,接近人体区域时直接禁止运动。过滤层只做“放行或拦截”,不做决策,结构简单,也可以用形式化方法验证。

同时不要排斥专用小模型。大模型负责语义调度,小模型负责枯燥但高频的感知确认,两者组合起来比只用一个庞然大物高效得多。比如用一个很小的分类模型判断物体是否存在,用一个细粒度分割模型定位边缘,这些补充组件不会占用太多算力,但能让VLM的上限真正释放出来。在我看来,这种“大小模型协同”在很长时间内都会是落地的主流形态。

5.3 从单机操作到多机协同Agent

最后聊一个我认为必然会出现的方向:多机协同。单台机械臂加VLM Agent已经能解决很多问题,但现实场景里往往需要两台甚至更多台机器人配合。比如一台负责把杯子递到传送带上,另一台负责接住并放上货架。这时每个机器人都可以拥有自己的VLM Agent来做局部操作,同时又需要一个共享的调度层来处理任务分配和时序冲突。好消息是,VLM天然擅长读状态日志和做协调判断,它可以把两台机器人的状态文本汇总到一起,决定谁先动、谁等待。

我在仿真里粗测过这类双机协同场景,用一个大VLM做调度、两个小VLM做单机控制的方案,完成率比纯规则调度要高出一截,尤其是在物体出现随机位置变化时,模型的适应能力非常明显。当然,多机之间的时序同步、死锁避免还需要传统分布式系统手段来兜底,VLM更像是一个能理解全局意图的指挥官,而不是一个实时操作系统。

我现在对“Just a VLM Agent Can Play Robots”这个标题有了不一样的理解。它不是在宣称VLM可以完全替代机器人技术栈,而是在提醒我们:当模型的认知能力足够强时,真正限制机器人落地的,往往只剩下接口设计的智慧和工程落地的细节。每次有朋友问我入局具身智能该从哪里切入,我都会建议他们先搭一套最小的VLM Agent闭环,别急着上强化学习,先亲手试试让模型在真实环境里连续做五步操作。你会发现,看数据、写Prompt、设计状态机的过程,本身就是对机器人系统最直观的一课。后续如果要继续深入,可以再去换更大的模型、加更丰富的动作原语、引入记忆机制,但那都是在这个最小闭环上长出来的东西了。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐