资讯动态

机器人操纵免微调:冻结VLM加外壳适配的完整方案

发布时间:2026/10/14 7:22:14 来源:尧图企业网站定制
机器人操纵这几年最卷的方向大家一窝蜂去微调 VLM把视觉语言模型当成可塑的大脑去训。但真做落地的人会发现微调这件事的隐性成本极高你需要重新组训练集、折腾分布式训练、处理灾难性遗忘还得面对一个现实问题——今天你调的版本明天换了相机、换了夹爪、换了工位布局是不是又要调一遍所以最近我在自己的项目里换了个思路圈子里开始称之为“外壳化”完全不动 VLM 的权重只改造它看见什么视觉输入侧以及手怎么落动作输出侧用一层薄薄的外壳把预训练模型的语义能力嫁接到机械臂的物理执行上。这篇文章就把这套思路的完整框架、实操方案和踩过的坑写出来给同样在做机器人操纵、又想绕过微调这条重路的朋友一个可复用的参考。先说清楚这篇文章里的“外壳化”不是某个框架的官方名词它更像一种设计哲学——VLM 还是那个 VLM但你把它当成一个只读的语义引擎外面包上可学习的感知适配器和动作映射器。这么做的好处很直接模型可替换、任务可切换、算力开销小而且对没有大规模集群的小团队非常友好。下面从为什么要这么做开始拆到具体怎么实现。1. 为什么值得“外壳化”微调 VLM 在操纵任务里的三个硬伤1.1 数据、算力与灾难性遗忘的三角困局先算一笔账。想微调一个 7B 参数的 VLM哪怕用 LoRA 这类参数高效微调方案单张 A100 也得跑几十个小时而且你需要精心准备的操纵数据——不是图片描述那种静态数据而是(观测, 语言指令, 动作标签)的三元组。真实机械臂采数据有多贵做过的人都知道一次抓取实验可能因为夹爪开合角度差两毫米就失败需要重采一个工位换背景板之前采的数据分布又不准了。更隐蔽的问题在灾难性遗忘。VLM 本身在大规模图文对上预训练它知道“红色马克杯放在键盘左边”这种复杂语义关系。你为了某个特定抓取任务去微调它可能确实让它在你的场景里更准了但它原本强大的开放词汇理解能力会被稀释。我在一个项目里试过微调一个模型结果它在目标任务上表现上升了 12%但在原始视觉问答基准上掉了快 20%。外壳化的思路从根本上绕开这个矛盾权重冻结能力不出让。1.2 任务快速切换的现实需求工厂和实验室里的操纵任务其实是高度碎片化的。今天抓杯子、明天摆方块、后天分拣螺丝如果每种任务都走一遍“采集数据-微调-验证流程迭代周期直接拉长到按周计算。外壳化换的只是外面那层适配器——数据采集量少一两个数量级训练时间从小时级降到分钟级切换任务时几乎不用动核心模型。1.3 外壳化到底“化”的是什么一句话概括外壳化 视觉侧重写 运动侧映射。视觉侧重写是让 VLM“看见什么”——包括改变输入图像的分辨率、裁剪区域、叠加提示信息、对齐相机坐标系运动侧映射是让 VLM 的输出变成机器人能执行的“手怎么落”——把一个 token 序列或者注意力图翻译成位姿、轨迹、力控参数。两层都是可插拔的拆开装回去都很方便。注意外壳化不等于 prompt engineering。Prompt 只是在文本层面引导外壳化还包含了视觉输入的几何变换和动作输出的闭式映射/可微优化是在模态边界上动手脚。2. 视觉侧外壳精确控制 VLM“看见什么”2.1 从“整图输入”到“任务相关视野”VLM 不是眼睛更像“大脑加视网膜”但它的视网膜分辨率是固定。直接把 800x600 的工位相机图喂给 VLM很多细节——尤其是小目标或者交错摆放的物体——会被模型忽略。视觉外壳第一步就是解决视野问题用目标检测器或者分割模型找到兴趣区把它们裁剪成 VLM 适合的输入尺寸再拼成一张图或者按顺序输入。我实际用的方案是双流输入原始下采样图提供全局空间关系裁剪的特写图提供细节纹理。具体来说先用 YOLOv8 之类的小模型跑出候选框把每个候选框按比例扩大 1.3 倍后裁剪然后 resize 到 VLM 的标准分辨率比如 336x336同时把全局图也 resize 进去。这样 VLM 同时看到“哪几个物体、大概在哪”和“每个物体长什么样”。2.2 坐标系对齐让 VLM 的“左右”和机器人的“左右”一致这是最容易翻车的一环。VLM 预训练时学的是自然图像里的人类视角——它说“左边的杯子”指的是画面里的左边不一定等于机械臂基座坐标系里的左边。如果你的相机是斜装在工位上方那画面坐标和设备坐标之间的旋转偏差会让“左边”变成“前方偏右”。视觉外壳必须做一次刚性变换。我通常是建立一个 calibration 流程在机器人工作平面放一个校准板记录几个关键点在图像坐标和机器人坐标下的对应值求解一个 2D 的仿射变换矩阵 H然后在把图像输入给 VLM 之前先对图像做透视校正。这样 VLM 输出里的“左边”经过外壳中记录的空间映射刚好能对应到机器人运动学中的左方向。硬件上换个相机角度只需要重新标定一次外壳VLM 完全不用管。2.3 用视觉提示增强 VLM 的注意力除了裁剪和对齐视觉侧外壳还能做另一件便宜的事画提示。比如在图上叠加目标候选框、把用户指令对应的物体高亮出来甚至用半透明色块遮住不该抓的东西。这属于用空间线索引导模型注意力。有实验表明仅仅把目标物体画一个红色边框VLM 在“找出目标物体”这类任务上的准确率能提升 15% 以上。这和人眼一样——你指着一个东西说“抓那个”比只说“抓那个”要容易得多。具体到操纵任务我还会做一步“历史帧叠加”把上一帧的目标物体位置用一个淡色圆形标记在当前帧上告诉 VLM “目标可能在这里附近”。对动态场景或者遮挡场景尤其有用。3. 运动侧外壳设计“手怎么落”的输出映射3.1 VLM 输出的三种形态以及怎么解码成动作VLM 不是运动规划器它的输出天然是语义化的。总结下来常见三种空间描述比如“杯子在键盘的左上角”“蓝色的方块在红色方块上面”——这是相对空间关系。物体框选VLM 内部注意力或者显式输出的物体位置 token例如 Pix2Seq 风格的目标检测 token。语言动作序列比如“先拿起螺丝刀再拧紧螺丝”——这是高层任务规划。运动侧外壳要做的就是把这些语义解码成机械臂能执行的 6D 位姿、路径点以及末端执行器开合状态。以抓取为例VLM 说“抓杯子”但没说抓杯子的哪个位置、手腕怎么转、靠近时用多大力。外壳就需要通过另一套视觉几何过程比如点云处理来补全这些信息。3.2 从语义选择到位姿生成的闭环我在项目里用了一条“语义定物体几何定姿态”的流水线VLM 输出目标物体的类别或位置描述语义外壳去噪后得到目标 ID。视觉侧外壳同时把深度图或者点云投影到机器人坐标系得到目标物体的点云簇。运动侧外壳计算抓取姿态先求点云主轴PCA确定抓取方向再用夹爪模型做碰撞检测最后通过一个可微的抓取质量网络比如 GraspNet 的轻量版挑选候选位姿中得分最高的。这样 VLM 负责“哪个物体”外壳负责“怎么落”分工明确。VLM 完全不知道夹爪的宽度、长度这些物理参数也不需要知道。3.3 用运动原语约束输出范围直接让外壳输出连续位姿容易不稳定更稳妥的做法是定义一个运动原语库Skill Library里面是经过验证的抓取模板顶部抓取、侧向抓取、拖拽、按压、放置。外壳只输出“选哪个原语 原语里的一组参数”。比如原语是“顶部抓取”参数就是目标点坐标、接近角度、下压深度。这样把连续动作空间约束成了离散选择加少量连续参数稳定性大幅提升。我吃过一次亏一开始直接让网络回归 7 维抓取位姿位置 3 四元数 4结果模型很容易输出一个看起来合理但夹爪会碰撞桌面的位姿。后来改成原语库方案训练数据需求降低了一个数量级成功率反而升了 20%。运动侧外壳本质上是在“VLM 的高层语义”和“机器人的底层执行”之间加了一层语法约束就像编译器把高级语言翻译成机器码之前先做语法检查一样。4. 实战拆解桌面杂乱场景的“外壳化”抓取系统4.1 系统组成与消息流为了让上面的内容变成可运行的东西我搭了一个最小实现。硬件是一台六自由度机械臂加吸盘夹爪一个 RGB-D 相机斜装在 45 度角软件侧 VLM 用的是开源的 7B 视觉语言模型通过 API 方式调用权重冻结。整个系统分四层感知层RGB 图像 深度图YOLO 目标检测输出候选框和分割掩码。视觉外壳对候选框做透视校正、裁剪、叠加提示框把校正后的图和 prompt 文本组装成 VLM 输入。VLM 核心根据指令“把红色的杯子放到托盘里”输出目标物体的自然语言描述或 token。运动外壳目标掩码 点云 - 计算抓取位姿 - 选出最短无碰撞轨迹 - 控制机械臂运动。这个流程里最关键的是VLM 不感知机械臂的存在它只是“看”和“说”外壳决定它看到的图像怎么来以及它说的话怎么变成机械臂的运动。4.2 关键代码逻辑伪代码级# 视觉侧外壳改写输入 def visual_wrapper(rgb_image, depth_map, instruction): # 1. 透视校正使得图像坐标机器人平面坐标深度 rectified perspective_fix(rgb_image, calibration_matrix) # 2. 用轻量检测器找到候选物体框 boxes yolo_detect(rectified) # 3. 每个框扩大并裁剪resize到VLM输入尺寸 crops [crop_and_resize(rectified, expand(b)) for b in boxes] # 4. 拼接全局图裁剪特写图画上提示框 visual_input compose_grid(rectified_downsampled, crops) visual_input draw_boxes(visual_input, boxes) # 5. 调用VLM冻结 return vlm_inference(visual_input, instruction) # 运动侧外壳改写输出 def motion_wrapper(vlm_output_text, depth_map, robot_state): # 1. 解析VLM输出的目标物体标识目标ID/坐标token target_obj parse_target_object(vlm_output_text) # 2. 从深度图分割出目标点云变换到机器人坐标系 target_cloud depth_to_robot_cloud(depth_map, target_obj.mask) # 3. 计算候选抓取位姿用运动原语顶部抓取/侧向抓取 candidates generate_grasp_candidates(cloudtarget_cloud, gripperrobot_state.gripper, primitives[top, side]) # 4. 筛选无碰撞、得分最高的位姿 best pick_safe_highest_score(candidates, collision_meshrobot_state.env) return best4.3 一次完整实验的实测数据在标准桌面场景5 个不同物体随机摆放下跑了 100 次抓取测试指令包含“抓到指定物体”和“抓取 A 放到 B 旁边”两类。结果冻结的 VLM 外壳方案单次抓取成功率 86%单次任务周期约 4 秒不含机械臂运动时间只算感知决策。同样条件下如果纯提示工程不裁剪、不对齐成功率只有 51%。差异主要来自两部分裁剪使 VLM 对目标的识别准确率提升了 23%运动原语约束使无效位姿比例降低了 32%。这个实验足够说明问题。5. 实操中的避坑清单六个最容易翻车的细节5.1 相机标定不准确外壳再怎么改都是白搭视觉外壳里的透视校正矩阵必须建立在准确标定上。如果你只是随手用棋盘格拍了一张没有做畸变校正那么 VLM 看到的“左上角”和机器人的“左上角”偏移会随着距离增加而放大。我的建议是至少采 15 对对应点用 RANSAC 求单应矩阵并且每换一次相机位置就重新标定。别依赖出厂参数。5.2 裁剪框太紧导致 VLM “看不见”上下文裁剪能提升细节识别但裁剪过度反而丢失了空间关系。比如你要求“抓桌子左上角的杯子”裁剪框如果在杯子边缘VLM 就分不清它是在桌角还是桌中央。保留目标框周围 30% 的上下文是个好的经验预设。可以通过一个小实验快速验证把上下文比例从 1.0 调到 1.5观察 VLM 输出描述的空间关系准确率变化。5.3 VLM 输出的坐标 token 并不等价于像素坐标有的 VLM 输出的是离散化 token像 Pix2Seq 那样把坐标离散成 1000 个 bin。这个 bin 到实际像素坐标的映射外壳必须做平滑解码——直接反解 token 会导致明显量化噪声。我给的建议是输出多个带 softmax 概率的候选 bin然后做加权平均噪声能降一半。这是纯工程细节但很影响最终抓取位置精度。5.4 别忽略延迟问题VLM 推断一次可能要 300-800ms叠加检测和抓取计算整体决策延迟在 1 秒以上。对静态场景没问题但如果有物体移动或者机械臂带动摄像头视角变化这个延迟就会导致目标偏移。我的处理办法是加一个轻量目标跟踪器比如 ByteTrack在 VLM 决策期间用跟踪器预测目标当前的位置最后把外壳计算出的位姿乘上时间补偿。5.5 目标置信度与安全阈值VLM 偶尔会幻觉出不存在的物体。外壳需要做一层置信度过滤要求目标检测器的置信度 0.5且 VLM 输出文本在语义上与候选目标 embedding 的相似度 0.7否则直接不执行并触发主动询问“没有找到可信的目标”。这一层就像系统里的安全员宁可停下来也不能盲目抓。5.6 机械臂坐标系与视觉外壳的耦合有些团队的视觉外壳在图像空间里工作但机械臂运动学需要的基座坐标如果外壳里没有把相机的安装偏移都折算进去前端调得好好的后端机械臂直接差十厘米。最稳妥的方式是让视觉外壳输出的所有几何量都严格转换到机械臂基坐标系这一步最好放在边界处集中处理不要在多个模块里分别做变换否则会层层累积误差。6. 外壳化思路的进阶玩法与横向对比6.1 用外壳做“上下文学习”的工程化冻结的 VLM 天然支持 in-context learning上下文学习外壳可以把几个参考示例图像和文本打进输入引导模型输出期望的结构。比如在视觉端口拼上两三个“抓取 A 物体”的示例再让它执行当前任务输出稳定性会更高。这和只改文字的 few-shot prompt 不同外壳额外提供了视觉示范对操纵任务帮助明显。6.2 与 LoRA、全参数微调的优势互补外壳化和微调不是非此即彼。可以把外壳视为“前端”把 LoRA 视为“后端轻量化适应”。如果场景固定、数据量足够可以在冻结 VLM 上加一个只有少量参数的 LoRA 分支此时 LoRA 是外壳的一部分——依然不改原 VLM 权重但比纯规则映射更强。我通常的做法是先跑外壳版本验证链路如果精度不够再在外壳里加 LoRA 做增量适配。这样每一步都有基线不会被一步到位的微调冲昏头脑。拿一个对比表总结维度冻结 VLM 外壳提示工程LoRA 微调全参数微调数据量需求少量几十到几百极少几乎为零数百到数千数千以上训练算力仅外壳轻量模块无单卡数小时多卡数天任务切换速度分钟级重新标定采集少量数据秒级小时级天级VLM 原能力保持完全保持完全保持基本保持有遗忘风险动作精度上限依赖外壳几何模块可达亚厘米级最低中等最高如果数据极佳部署灵活性高可替换不同 VLM高但能力弱中低6.3 走向长期任务外壳中的“记忆”模块单步抓取跑通后可以做长期操纵任务。此时外壳需要多设计两个模块一个是任务状态机记录当前进度“已抓取杯子”“已放到托盘”另一个是错误恢复策略比如如果检测到夹爪张开却没抓到物体外壳会重新调用 VLM 确认目标是否移动并重新规划。这些逻辑介于感知和运动之间非常适合放进外壳层——不需要 VLM 理解状态机也不需要微调它的常识。6.4 落地时的工程架构建议最后说一下工程架构。外壳模块建议都做成独立的 class 或 service和 VLM 的通信走标准 HTTP/gRPC这样可以把重推理放在 GPU 服务上轻量检测和运动控制放在 CPU 服务上。前端机器人控制循环频率比如 20Hz和 VLM 决策频率约 1Hz完全解耦。这也是外壳化的一大收益各个模块可以独立开发、独立验证出问题时可以直接替换外壳层而不触碰核心模型。我在实际项目里体会最深的一点很多人迷恋端到端微调带来的“上限幻觉”总觉得不微调就不够高级。但工程落地的第一原则是可控性——VLM 权重冻结意味着它永远不会突然变笨外壳负责所有与物理世界相关的细节意味着它可以用传统算法和轻量学习模型精确控制。这种“大脑固定、感官和肌肉外包”的组合在一线需求快速变化的环境里往往比反复折腾权重路径更快、更稳。如果你也被数据采集和训练成本卡住不妨把注意力从“改 VLM”移到“改它看见什么、手怎么落”说不定你的项目突破就在这一层。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑