
机器人操纵的外壳化不改 VLM改它看见什么、手怎么落做机器人抓取和操纵的人这两年应该都有一种感觉VLM视觉语言模型的出现把理解任务这件事的门槛拉低了一大截。你可以让机械臂听懂把红色杯子放到蓝色托盘里这种自然语言指令模型也确实能输出一个大致靠谱的动作意图。但真到了要落地的时候绝大多数人都会撞上同一堵墙——VLM 的空间精度太差了差到连杯子中心点在哪这种问题都回答不精确。一开始我也跟大多数人一样拿到 VLM 操纵项目的第一反应就是微调找数据集、做 LoRA、调学习率、设计奖励整个流程又臭又长跑完一轮下来发现效果提升有限还赔上了不少算力。后来我换了个思路不动模型权重在外面套壳。壳的作用就两件事——第一改它看见什么第二改它的手怎么落。这个思路跑通之后VLM 的操纵成功率在一个月内从 42% 提升到了 86%成本只有微调路线的十分之一不到。这篇东西就把这条外壳化路线完整拆开讲清楚适合那些手里已经有一个 VLM、正发愁怎么把它变成能干活机械臂的团队和个人开发者。1. 为什么我放弃微调VLM转而做外壳化1.1 微调的硬成本数据、算力、遗忘先说微调的账。以目前常用的 7B 参数级别 VLM 为例一次完整的 LoRA 微调显存占用轻松突破 30GB训练时间按千条数据计算也要跑几十个小时。这还没算数据准备的功夫——机器人操纵的数据不是随便找的每条数据都得包含真实或仿真的机械臂状态、相机图像、语言指令和对应的动作序列。拿公开数据集凑合吧场景和你的产线对不上自己采集吧几千条有效数据够你忙活一个月。就算你说服了老板批算力和时间微调完还有新的麻烦灾难性遗忘。VLM 原本擅长的事情——开放词汇理解、场景常识推理——经过针对性微调之后会出现不同程度的退化。我见过一个项目微调后的模型在专用任务上确实变强了但让它辨认一个训练集里没出现过的物体类别时表现远不如原版模型。这就是典型的过拟合到任务分布了。相比之下外壳化完全绕开了这些成本。模型权重保持原样你在模型的输入端和输出端各自搭建一个处理模块说白了就是眼镜助理的组合眼镜负责把清晰的画面送到 VLM 眼前助理负责把 VLM 输出的模糊意图翻译成机械臂能精确执行的指令。1.2 VLM的真正短板不在语义而在空间精度我做过一个很无聊但很有说服力的测试给 VLM 一张桌面俯视图图里只有两个物体一个红色杯子、一个蓝色托盘然后问它杯子的中心像素坐标是多少。答案出来之后肉眼就能看出来误差在几十个像素级别。要知道这种规模的 VLM 在数百亿参数级别上训练见过的图片多了去了但它的训练目标里根本没有像素级定位这个任务。视觉 Transformer 的 patch 化处理天然把空间信息揉碎了再重建得到的是语义级别的理解不是度量级别的坐标。这个现象的本质是VLM 是一个语义系统不是一个度量系统。让它理解杯子和托盘的空间关系没问题让它输出机械臂末端该走到的三维坐标点就强人所难了。端到端的视觉运动策略比如 RT-2 的思路之所以能做成是因为训练数据里包含了海量的机器人执行轨迹模型从动作序列里隐式学到了看到某种布局就该往某个方向运动的映射。但这不是普通团队能复现的——你上哪找几万台机械臂跑几个月的数据去。所以外壳化的第一个核心逻辑就是语义归 VLM度量归专用模块。模型负责回答做什么、按什么顺序做专用视觉模型和规划模块负责回答在哪个坐标、用什么姿态做。1.3 外壳化的核心逻辑扬长避短把外壳化这个思路再压缩一下就是三个字扬长避短。VLM 的长处是什么语义理解、任务分解、开放式指令跟随。它的短处是什么精确坐标估计、高频动作生成、物理约束下的轨迹规划。我合作的几个项目里最成功的一个配置是这样VLM 做任务规划输出的是一个结构化的操纵原语序列——比如先抓取红色杯子再把它移动到蓝色托盘上方然后释放。每一个原语对应一个具体的控制器。感知部分用一个小型的开放词汇检测模型来做目标定位动作部分用流匹配动作头或者传统的规划和伺服模块来实现。VLM 在整个回路里扮演的是指挥官而非士兵。这套架构最舒服的地方在于每一层都能独立迭代。今天检测模型换了个更强的操纵成功率立刻上去明天动作头换成最新的扩散策略又涨一截VLM 自始至终不用动它只负责输出语义而语义这个事现有的开源 VLM 已经做得足够好了。2. 视觉入口改造先想清楚让它看见什么外壳化的第一半是改视觉输入。这一半的工程细节最多也最容易出效果。核心原则一句话VLM 的像素分辨率是稀缺资源别浪费在无关背景上。2.1 不是所有像素都值得喂给VLMROI裁剪与背景剥离VLM 处理图像是有限度的。以常见的 336x336 或 448x448 输入分辨率为例一张 1080p 的相机画面缩小到这个尺寸后桌面上的一个 5cm 小物体可能只占 20 个像素。这种情况下VLM 能认出那里好像有东西就不错了你还能指望它看清物体之间的细微关系实战里我通常这么处理先用轻量级的检测模型YOLO 系列或者 Grounding DINO 这类开放词汇检测器跑一遍原图拿到所有感兴趣物体的边界框然后按边界框裁剪出区域再把这些区域重新缩放后输入给 VLM。这个操作的收益极其明显——物体在 VLM 输入画面里的像素占比可以提升一个数量级。背景剥离比 ROI 裁剪更激进一点。如果场景相对固定比如固定工作台可以提前采集一张无物体的空背景图用背景差分把桌面以外的干扰信息全部 Mask 掉只保留物体部分。这一步可以显著降低 VLM 的困惑度它不用再花注意力在桌面的纹理是不是某种障碍物这种无关问题上。实测效果同样的 VLM同一组 20 条抓取指令全图输入的成功率约 40%ROI 裁剪背景剥离之后能到 70% 左右。提升几乎全来自 VLM 不再看错目标了。2.2 把检测结果画进图里视觉提示注入这里要分享一个我踩过坑之后才悟出来的技巧与其用提示词告诉 VLM注意红色杯子和蓝色托盘不如直接把检测框画到图像里给它看。为什么会这样VLM 的训练数据里有大量带有可视化标注的图文对——目标检测框、分割掩膜、关键点标记这些视觉提示出现在它的训练语料里。你直接在输入图上绘制出目标的边界框和编号标签相当于主动触碰了它的视觉提示能力区域。告诉它框 1 是红色杯子框 2 是蓝色托盘比信息熵更高的图片中左侧稍远的那个物体是红色杯子要可靠得多。具体做法不复杂检测模型输出边界框后用 OpenCV 把矩形框和编号文字画在副本图像上再将这张画好框的图作为 VLM 的输入。实测下来VLM 在这种输入下很少再犯把物体 A 当作物体 B的语义混淆错误任务分解的成功率明显提升。2.3 与专用视觉模型联动用空间锚定弥补VLM的坐标模糊即使 VLM 看清了那是一个杯子它依然给不出杯子中心在相机坐标系下的精确位置——这需要把感知拆成两步语义确认交给 VLM空间定位交给专用模型。以抓取场景为例检测模型先输出目标物体的边界框掩膜分割模型比如 SAM 系列再根据边界框提示生成物体的像素级掩膜最后通过相机内参和点云深度图把像素坐标反投影到相机坐标系下的三维坐标。整个链路里VLM 根本不需要知道任何坐标——它只需要说抓那个红色杯子然后空间锚定模块负责把那个红色杯子这个指代对应到检测框 ID 上再算出具体的三维抓取点。这么做的好处是误差可控。三维坐标的计算误差由标定和深度传感器精度决定而不是由 VLM 的猜坐标能力决定。前者可以做到毫米级后者动辄偏出几厘米。2.4 多视角输入的组织方式分窗、拼接与深度提示单目相机天生缺少深度信息VLM 也只能看图猜空间关系。虽然现在许多 VLM 具备一定的单目深度估计能力但精度完全达不到机械臂操纵的要求。所以实际系统中我通常让多个相机同时工作一个固定俯视相机负责全局场景理解一个安装在机械臂腕部的近景相机负责抓取前的精确观察。这里有一个输入组织的细节把两种视角的画面水平拼接成一张图再喂给 VLM比交替传两张图更好。拼接后 VLM 能同时看到全局和近景指代消解更容易——这个杯子在全局图里可能只是一个小点但近景图里能看到它的完整轮廓和纹理特征。不过要注意如果拼接后的分辨率超过 VLM 的输入限制可以采用全局图保留 近景图裁剪后嵌入的方式或者干脆用两轮推理第一轮看全局图做任务规划第二轮把检测到目标区域的近景图放大再推理。后一种方式更灵活代价是推理时延翻倍适合任务序列较长的场景。3. 动作出口改造把语义变成手怎么落视觉进去了VLM 也输出了语义接下来就是外壳化的另外一半动作出口。这一半要是做得粗糙前面省下的时间全得在调试里赔回去。3.1 从语言指令到操纵原语语义映射层VLM 直接输出的通常是一段自然语言比如把杯子移动到托盘上方并放下。这句话不能直接驱动机械臂需要先翻译成机器可执行的操纵原语序列。我在系统里做的语义映射层本质上是一套基于规则的意图解析器输入是 VLM 的文本输出输出是结构化的动作描述块动作类型Pick、Place、Push、Pour、Insert、Release目标物体编号与视觉检测模块的边界框 ID 对应接受容器/目标区域编号也是检测框 ID执行约束速度档位、姿态偏好、接近方向这套解析器不需要多智能用正则表达式匹配加几个关键实体识别就够了。因为 VLM 已经帮你完成了复杂语义转换你要做的只是把它的输出格式化成标准动作描述。如果 VLM 的输出格式不稳定比如有时说红色物体而不是物体 1就在提示词里强制要求它按 JSON 格式返回实测可以把解析成功率拉到 95% 以上。3.2 精确落点由谁负责末端规划与外部位姿求解有了操纵原语之后手怎么落就有了两个层次粗定位和精定位。粗定位负责把机械臂末端移到目标物体附近精定位负责在最后几厘米里微调确保手爪的中心对准抓取点。粗定位阶段我直接用前面提到的空间锚定模块输出的三维坐标作为路点用 MoveIt 或类似规划器生成一条避障轨迹。这个阶段的精度要求不高厘米级就够了因为后面还有精定位兜底。精定位阶段有两种主流做法。第一种是基于视觉伺服的闭环控制把腕部相机实时画面与目标位姿的期望图像特征做误差计算驱动机械臂持续调整直到误差收敛。第二种是通过 PnP 求解的位姿估计用物体关键点和相机投影模型算出目标物体在机械臂基坐标系下的精确六自由度位姿然后直接规划抓取姿态。我个人的经验是如果目标物体是规则形状圆柱、立方体用 PnP 位姿估计更快更稳如果是不规则物体或者容易反光的表面视觉伺服的鲁棒性更好。两种方案在很多项目里可以混合使用——先 PnP 快速到达附近再视觉伺服收敛到可抓取状态。3.3 与流匹配动作头结合的实践VLM当任务级大脑小网络当运动小脑最近圈子里讨论热度很高的VLM 流匹配动作头本质上就是一种动作出口外壳。这个思路值得展开讲——它解决的是高频动作生成问题。VLM 的推理时延通常在几百毫秒到几秒不等完全达不到机械臂控制所需的控制频率10Hz 到 1kHz。但我们可以让 VLM 工作在低频任务级它每隔一段时间比如每个操纵原语开始时输出一次语义指令而高频动作由一个小型的动作生成网络承担。流匹配Flow Matching动作头就是这个小网络的实现方式之一。它的输入包括当前观测图像通常是腕部相机的近景、被夹取的物体特征VLM 给出的语义向量、目标状态描述输出是一段连续的动作轨迹——末端位置、姿态、夹爪开度的时序序列。由于流匹配轨迹生成的能力很强生成 4-8 秒的动作轨迹只需要几十毫秒完全能跟上执行频率。这套组合的配置我跑下来效果不错VLM 只在任务切换时介入动作头在任务执行期间全权接管。VLM 的时延不再影响控制的连续性和稳定性动作头的高频输出又保证了操纵的平滑和精确。3.4 动作门控不让VLM的幻觉直接进入执行器这是很多人容易忽略的一层但恰恰是最重要的安全防线。VLM 在任务理解上不可靠的场景很多——物体被遮挡时它会瞎猜、背景复杂时会幻觉出不存在的东西、极端光照下会把它看到的东西认错。这些错误如果直接转化为机械臂动作轻则抓空重则撞坏东西。我在动作出口加了一个门控模块它在操纵原语真正发往执行器之前做一轮校验。校验规则很朴素目标物体编号是否存在于当前感知模块输出列表里抓取点坐标是否在工作空间边界内轨迹上是否有未规划的碰撞风险夹爪的目标开度是否与物体的估计尺寸匹配任何一项校验不过系统就暂停执行并向 VLM 返回一条反馈消息比如物体 2 当前被遮挡让 VLM 重新规划或者请求人工介入。这一层加上之后系统在异常场景下的安全失败率大幅提升——哪怕抓取失败也不会造成破坏性后果。4. 外壳各模块怎么拼成一套可用系统前面几节把外壳拆成了零件但零件拼起来才能干活。这里给一套我实际部署过的组装方案包括数据流、接口约定和常见的坑。4.1 一套典型运行时的数据流全景完整的系统运行起来大概是这个流程任务指令以自然语言进入直接文本输入或通过语音识别转文本VLM 结合全局观测图像已做 ROI 裁剪和视觉提示注入输出结构化的任务计划语义映射层把任务计划解析成操纵原语序列对每个原语感知模块定位目标物体输出边界框 ID、掩膜和三维坐标动作规划模块生成轨迹动作门控做安全校验执行器开始运动同时高频动作头在运行过程中持续根据最新观测做轨迹微调一个原语完成后系统回到第 2 步把 VLM 拉进来做下一步决策。这套流程里 VLM 不是持续工作的它只在任务切换点被调用。这样的好处除了降低时延还能减少 VLM 推理的累计错误——每一次调用它都在处理一个新的决策点而不是在旧决策上错误叠加。4.2 与OpenVLA/RT-2这类端到端方案的取舍对比有不少人在纠结要不要直接用 OpenVLA 或者 RT-2 这类端到端视觉运动模型。我的看法是这取决于你有多少数据。端到端模型的卖点是一个模型从感知到动作全包了听起来很美好但它的训练数据需求是普通团队承受不了的——OpenVLA 练在几十万条机器人轨迹上RT-2 更是基于海量网络数据和机器人数据联合训练。你想迁移到自己的场景不微调几乎没法用微调又回到了第一节说的成本困境。外壳化方案相对端到端模型表面上不够优雅——系统里有好几个模型协作调试接口也多。但它有一个不可替代的优势每个环节都可以单独调试和替换。VLM 今天效果不好换一个更强的开源模型就行动作头不受影响检测模型误报高单独调检测的置信度阈值就行其他模块不用动。端到端模型出了错你只能靠调提示词或者重新收集数据碰运气调试起来非常痛苦。4.3 模块对接时的接口约定与通信延迟控制拼系统的时候最容易出问题的不是单个模块而是模块之间的接口。我在多个项目里踩过的坑主要是这几类第一坐标系不统一。检测模块输出的是像素坐标和相机坐标系下的三维坐标规划模块需要的是机械臂基坐标系下的坐标。中间缺了手眼标定矩阵的转换所有坐标都白算。这个问题在眼在手上相机装在机械臂末端的配置里尤其隐蔽因为相机坐标系随机械臂运动实时变化转换矩阵必须更新到最新位姿。第二消息频率不匹配。感知模块可能只以 5Hz 的频率输出目标位置但动作头要求 30Hz 的观测更新。这时候不能直接把旧的感知结果反复用而要对动态目标做运动预测比如线性外推或者降低动作头的频率要求。这个小细节直接决定了抓移动物体时的成功率。第三通信中间层要轻量。我推荐用 ROS 2 的 action 机制做原语级通信用话题传输高频观测数据。VLM 推理节点的输出走 action goal感知节点的输出走 topic两者互不阻塞。如果直接用同步请求-响应模式调 VLM整个系统都会被最慢的 VLM 推理拖住实时性直接崩掉。5. 实测数据与踩坑记录讲了这么多原理和架构最后用一组实测数据和我掉进去过的坑收尾。5.1 微调路线与外壳化路线的一组对比同一套设备一个六轴协作机械臂、一个俯视相机、一个腕部相机、一套标准抓取任务集两条路线对比如下项目微调VLM路线外壳化路线开发周期约6周约3周训练算力需求单卡A100级别数十小时无需训练仅推理抓取成功率标准场景74%86%抓取成功率干扰物场景51%79%新增目标物体适配成本重新采集数据微调更换检测模型的类别词即可外壳化路线的优势到干扰物场景尤其明显——检测模型天然对背景干扰免疫有专门训练VLM 在干净 ROI 下的语义理解也更稳定。而微调路线在训练分布外的表现明显掉队。5.2 踩坑记录一提示词写得再细不如画一个框我最初做视觉提示注入时有个错误的执念既然 VLM 是语言模型那就在提示词里把每个物体描述到位比如桌子左侧偏前方有一个红色的小杯子杯口朝上位于蓝色托盘的右前方大约 15 厘米。结果模型经常犯左右不分的错或者把描述映射到错误的物体上。后来我改成在图像上直接画边界框和编号提示词里只保留框 1 是红色杯子框 2 是蓝色托盘这种极简表达空间指代的准确性立刻提上来了。这件事让我明白一个道理VLM 天生是视觉动物你给它视觉提示比给它冗长的语言描述高效得多。从那以后凡是能在图像层解决的问题我绝不给模型增加语言负担。5.3 踩坑记录二手眼标定误差会吃掉外壳的全部收益外壳化系统的感知精度上限很大程度取决于手眼标定的精度。我曾经对一个项目反复优化了 VLM 的输入、动作头的参数成功率始终卡在 70% 上下不去。最后排查到机械臂抓取点三维坐标的误差来源才发现是手眼标定矩阵误差了 2-3 厘米。也就是说感知模块算出的抓取点本来很准但转换到机械臂坐标系时偏了机械臂每次都在往偏的位置伸手。这个坑的教训是感知侧做了多少精细化都弥补不了标定侧的粗心。建议在系统搭建初期就花一天时间做高精度手眼标定并且在每次改动相机位置后重新标定。标定精度做到毫米级再开始调试上游模块。5.4 踩坑记录三VLM推理时延与执行频率的匹配问题还有一个很实际的坑VLM 推理一次动辄一两秒实际执行时如果不做异步处理整个操纵任务会被拉得极慢。我一开始是同步调用的每执行一个原语就等 VLM 输出等完再规划执行一个简单抓取-放置任务要花 20 多秒。后来改成动作头模式第一个原语执行期间后台就并行做下一轮 VLM 推理。等当前动作完成下一轮的操纵原语已经准备好了。这样流程时间从 20 多秒压缩到 10 秒以内。关键点是不要让 VLM 推理成为串行瓶颈把它的时延藏到机械臂运动时间里。写在最后折腾了半年多的各种 VLM 操纵项目我最深的体会是大模型时代做机器人最大的误区就是觉得模型越强越要微调。事实上对于绝大多数垂直场景通用模型的语义能力已经溢出真正的瓶颈全在空间精度和动作执行度上。这些瓶颈恰恰是外壳化方案最擅长解决的。如果你手里正好有一个 VLM 项目卡在成功率上我的建议很直接先别急着上微调。花两三天把视觉入口ROI 裁剪、视觉提示注入和动作出口语义映射、精确落点的壳搭起来大概率会有惊喜。最后再分享一个小技巧调试时让系统把所有中间结果VLM 输入图、解析出的操纵原语、感知坐标、实际执行轨迹都可视化出来哪个环节出错一目了然。这套可观测性投入是整个外壳化系统能持续迭代的隐形基石。