从LLM到VLA:机器人基础模型链路搭建与避坑指南
机器人圈子这两年有个特别明显的感受:以前大家聊的是“这个机械臂重复定位精度多少”“这条产线节拍能不能压到几秒”,现在画风全变了,张口闭口都是“你们家模型泛化能力怎么样”“换条产线要不要重新采数据”。这个转变的底层推手,就是基础模型往机器人身上迁移这件事。我自己从传统运动控制一路摸到现在的具身智能方向,踩过的坑不算少,今天就把LLM、VFM、VLM、VLA这四个概念掰开揉碎讲清楚,顺带把从零搭一套可跑通的机器人基础模型链路的关键环节、参数取舍和排查经验都摊开来说。不管你是做算法、做集成,还是刚转行想搞清楚这些缩写到底啥意思,看完至少能明白每个模块在系统里站什么位置、什么时候该用哪个、以及最容易翻车的地方在哪。
1. 四个概念到底在解决什么问题
1.1 从“专用程序”到“通用底座”的范式迁移
传统工业机器人干活,本质是人在替机器人思考:轨迹是人示教的,抓取位姿是人标定的,异常处理是人写if-else兜底的。这套模式在固定产线、固定工件、固定节拍下极其高效,但一旦工件换个摆放角度、来料批次有细微差异,程序就得重调。问题的根子在于,机器人本身不具备对世界的“理解”,它只是在执行人翻译好的坐标指令。
基础模型带来的变化,是把“理解”这件事交给预训练好的大模型。LLM负责语言层面的任务拆解和逻辑推理,VFM负责从图像里提取通用视觉特征,VLM把视觉和语言对齐起来做场景理解,VLA则进一步把理解直接映射成动作。四者不是并列关系,更像一条逐级落地的链路:语言理解→视觉感知→跨模态对齐→动作生成。我习惯把它们比作一个施工队:LLM是项目经理,负责把“把桌上那杯水递给我”翻译成若干子任务;VFM是眼睛,负责看清杯子和手的位置关系;VLM是现场翻译,确保项目经理说的“杯子”和眼睛看到的“杯子”是同一个东西;VLA则是真正上手干活的那双手。
这个范式迁移最实际的价值在于数据复用。传统方案每换一个场景就要重新采数据、重新训练,而基础模型在海量通用数据上预训练后,下游任务只需要少量微调甚至零样本就能上手。我实测过一个抓取任务,用传统方法采了三千多条示教数据才勉强稳定,换成VLA微调路线,两百条左右就能达到可用的成功率,这个差距在工程上就是几个月和几周的差别。
1.2 LLM在机器人系统里的真实角色
很多人一听LLM进机器人,第一反应是“让机器人聊天”,这其实把它的价值看窄了。LLM在机器人系统里最核心的作用是任务规划与语义推理,而不是对话。举个具体例子,指令是“把厨房收拾一下”,这句话本身没法直接变成动作,LLM要做的是把它拆成“先把台面上的碗放进水槽”“再把垃圾扔进垃圾桶”“最后擦桌子”这样的子任务序列,并且判断这些子任务的先后依赖关系。
这里有个关键认知:LLM输出的是符号化的任务序列,不是动作。它不关心机械臂怎么动,只关心任务逻辑对不对。所以工程上通常会在LLM和底层控制之间加一层任务调度器,把LLM输出的自然语言子任务映射成预定义的动作原语(比如pick、place、move_to)。这层映射是必须的,因为LLM有幻觉,直接让它输出关节角度是灾难性的。
我踩过的一个坑是早期直接让LLM输出坐标,结果它经常编造出不存在的物体位置,而且格式还时对时错。后来改成让LLM只输出结构化的任务描述(JSON格式,包含动作类型和目标物体描述),再由调度器去查视觉系统给出的实际坐标,稳定性立刻上来了。这个思路说白了就是让LLM做它擅长的事(语言和逻辑),把数值计算交给专门的模块。
1.3 VFM与VLM的分工边界
VFM(视觉基础模型)和VLM(视觉语言模型)经常被混着说,但工程上必须分清。VFM是在大规模图像上自监督预训练出来的特征提取器,典型代表是各种基于Transformer的视觉骨干网络,它的输出是特征向量,本身不理解语言。VLM则是在VFM基础上进一步用图文对训练,让视觉特征和文本语义对齐,输出可以是描述、可以是问答、可以是检测框。
打个比方,VFM像一个视力极好但不识字的人,他能看清画面里每个细节,但你问他“这是不是杯子”他答不上来;VLM则是既看得清又认得字的人,你问什么他都能用语言回应。在机器人系统里,VFM通常用在需要高精度空间感知的环节,比如位姿估计、抓取点检测,因为它输出的特征保留了丰富的几何信息;VLM则用在需要语义理解的环节,比如“判断这个场景里有没有危险物品”“理解用户指令指的是哪个物体”。
实际选型时我的经验是:如果下游任务只需要几何信息(比如点云配准、6D位姿估计),用VFM就够了,上VLM反而增加延迟;如果任务需要语义判断(比如“把红色的那个拿过来”),那必须用VLM做指代消解。两者在系统里往往是串联的:VLM先做粗定位和语义筛选,VFM再做精细的几何计算。
1.4 VLA为什么是落地关键
VLA(视觉语言动作模型)是这四个里最贴近“机器人”本质的,因为它直接输出动作。它的输入是视觉观测加语言指令,输出是动作序列(可以是关节角度、末端位姿,也可以是离散的动作token)。VLA的价值在于端到端:把感知、理解、决策、控制压缩进一个模型,减少了模块间接口的信息损失和误差累积。
但端到端不等于无脑端到端。我见过不少团队一上来就想搞纯端到端,结果调试时完全黑盒,出了问题不知道是感知错了还是决策错了。我的建议是分阶段端到端:训练时用端到端目标,但部署时保留中间可观测的输出(比如让模型同时输出注意力热图或中间特征),方便排查。另外VLA对数据质量极其敏感,动作数据的时序对齐、坐标系一致性这些细节没处理好,训出来的模型表现会非常诡异——比如抓取时总是偏一个固定角度,这种系统性偏差八成是标定或坐标系转换的问题,而不是模型能力问题。
2. 系统架构设计与模块选型
2.1 分层架构的划分逻辑
把四个模型塞进一个系统,最忌讳的是糊成一团。我推荐的架构是三层划分:认知层(LLM)、感知层(VFM+VLM)、执行层(VLA+底层控制)。认知层负责把用户意图翻译成任务序列,感知层负责把场景翻译成结构化信息,执行层负责把结构化信息翻译成动作。
这个划分的依据是变化频率。认知层的逻辑相对稳定,一个任务规划prompt可以复用很久;感知层的模型更新频率中等,换场景可能要换VLM;执行层的VLA最不稳定,几乎每个新任务都要微调。分层之后,每层的迭代互不干扰,这是工程上能持续维护的前提。如果全揉在一起,改一个抓取策略可能把任务规划也带崩,调试成本会指数级上升。
层与层之间的接口设计也有讲究。我习惯用结构化中间表示做接口,比如认知层输出JSON格式的任务列表,感知层输出带语义标签的物体列表(包含类别、位姿、置信度),执行层接收“动作类型+目标物体ID”这样的指令。这种设计的好处是每层都可以独立测试:给认知层喂固定输入看输出对不对,给执行层喂固定目标看动作准不准,问题定位非常快。
2.2 模型选型的参数考量
选型不是越大越好,得看延迟预算和算力约束。我整理了一个实际项目中的选型对照,供参考:
| 模块 | 候选类型 | 典型参数量级 | 单次推理延迟(参考) | 适用场景 |
|---|---|---|---|---|
| LLM | 小尺寸指令微调模型 | 1B-7B | 50-300ms | 任务拆解、指令解析 |
| LLM | 中等尺寸通用模型 | 7B-13B | 200-800ms | 复杂多步规划 |
| VFM | 轻量视觉骨干 | 20M-100M | 10-40ms | 实时位姿估计 |
| VFM | 大型视觉骨干 | 300M-1B | 50-150ms | 精细几何感知 |
| VLM | 中小型图文模型 | 1B-4B | 100-400ms | 指代消解、场景问答 |
| VLA | 中小型动作模型 | 100M-1B | 30-100ms(单步) | 抓取、放置等原子动作 |
延迟数据是我在单张消费级显卡上实测的量级,实际会随batch、精度(fp16/int8)、输入分辨率浮动。选型的核心原则是让最慢的环节匹配控制频率。比如机械臂控制频率是10Hz,那整个感知-决策链路的总延迟必须压在100ms以内,这时候LLM就不能选太大的,或者得做异步——任务规划可以慢一点(人说话本来就有停顿),但动作生成必须快。
提示:延迟预算要按“最坏情况”算,不能按平均值。我见过平均值80ms但偶发300ms抖动的系统,在抓取瞬间卡顿导致失败,排查了半天才发现是某个模型在特定输入下触发了慢路径。
2.3 数据流与控制闭环设计
数据流设计上,我强烈建议感知与执行解耦但时间对齐。具体做法是:感知层以固定频率(比如15Hz)持续输出场景状态,执行层按自己的节奏消费最新状态。中间用一个带时间戳的共享缓冲区,执行层取状态时检查时间戳,太旧的就丢弃并触发重新感知。
这个设计的价值在于容错。如果感知偶尔卡一下,执行层不会拿着过期数据瞎动,而是会等待或降级处理。我早期做过一个紧耦合版本,感知和执行串行跑,结果感知一慢整个系统就僵住,机械臂停在半空等数据,非常危险。改成解耦加时间戳校验后,即使感知偶发延迟,执行层也能安全地保持当前位置或执行保守动作。
控制闭环上,VLA输出的动作通常不是直接下发到电机,中间要过一层动作平滑与安全限幅。VLA输出的动作序列可能有抖动或超出关节限位,直接下发会损伤硬件。我的做法是在VLA输出后加一个低通滤波加限幅模块,滤波系数根据动作频率调(一般截止频率设在动作主频的2-3倍),限幅则严格按机械臂的关节范围和速度上限来。这层看似简单,但能挡掉大量因模型输出异常导致的硬件风险。
3. 核心环节的实操落地
3.1 任务规划模块的prompt工程
LLM做任务规划,prompt设计是成败关键。我的经验是结构化约束+少样本示例的组合最稳。具体来说,system prompt里明确三件事:可用动作原语的列表、输出格式的严格定义、以及禁止事项(比如禁止输出坐标、禁止编造不存在的物体)。
一个实际可用的prompt骨架大概长这样:
你是一个机器人任务规划器。可用动作原语:[pick, place, move_to, open, close, wait]。 用户指令会被拆解为动作序列,每个动作包含:action(原语名)、target(物体描述)、destination(目标位置描述,可选)。 输出必须是JSON数组,不要输出任何解释性文字。 如果指令无法用现有原语完成,输出空数组并说明原因。 示例: 输入:把苹果放到盘子里 输出:[{"action":"pick","target":"苹果"},{"action":"place","target":"苹果","destination":"盘子"}]少样本示例的数量我一般放3-5个,覆盖典型场景和边界情况(比如多物体、需要先后顺序的)。示例太多会挤占上下文且增加延迟,太少则约束力不够。实测下来5个示例是个不错的平衡点。
还有个细节是输出解析的容错。LLM偶尔会输出带markdown代码块的JSON,或者多输出一段解释。解析器要做清洗:先尝试直接解析,失败则提取第一个[到最后一个]之间的内容再解析,再失败则触发重试(重试时在prompt里强调“只输出JSON”)。这套容错逻辑能挡掉大部分格式问题,比单纯依赖模型自觉靠谱得多。
3.2 视觉感知的标定与对齐
感知层最容易翻车的地方不是模型本身,而是标定。相机内参、手眼标定、坐标系转换,任何一环有偏差,VFM提取的特征再准也白搭。我见过一个案例,抓取总是偏2厘米,查了一周模型,最后发现是手眼标定的旋转矩阵有个小误差累积导致的。
手眼标定的实操要点:标定板要覆盖工作空间的主要区域,不能只在一个角落标;标定点数量至少15-20个,分布要均匀;标定后一定要做验证——拿几个已知位置的物体,让系统预测位姿,和实际位姿对比,误差超过阈值就重标。验证这步很多人省了,结果带着错误标定跑了几周才发现。
坐标系转换上,我习惯统一到机器人基座坐标系做所有计算,相机坐标系、末端坐标系的数据都先转过来再处理。这样做的原因是基座坐标系是全局稳定的,不会随机械臂运动变化,调试时看数据也直观。转换矩阵要写成配置文件而不是硬编码,换设备时改配置就行。
注意:标定数据的采集环境要和实际工作环境一致。我在实验室标定得好好的,搬到现场因为光照变化导致特征点检测偏移,标定直接失效。现场标定时最好在实际光照和背景下做,或者至少验证一遍。
3.3 VLA微调的数据准备与训练配置
VLA微调的数据准备是整个链路里最耗时的环节,也是最容易出问题的。核心要求是时序对齐和坐标系一致。每条数据包含:视觉观测序列、语言指令、动作序列,三者的时间戳必须严格对齐,动作要转换到统一的坐标系。
数据采集时我建议多模态同步记录:图像、关节角度、末端位姿、夹爪状态全部打上统一时间戳存下来。采集频率要高于控制频率(比如控制10Hz就采30Hz),方便后续做时间对齐和插值。数据量上,简单原子动作(抓取、放置)每个200-500条能出效果,复杂组合任务要上千条。
训练配置上,几个关键参数的经验值:学习率用1e-4到5e-5(微调不宜太大),batch size根据显存尽量大(32-64),训练轮数看loss曲线,一般10-30个epoch,早停patience设5。动作损失的权重通常要比视觉重建损失高,因为动作精度直接决定任务成败。我一般把动作损失权重设在1.0,辅助的视觉损失设在0.1-0.3。
数据增强要谨慎。图像层面的增强(亮度、对比度、轻微裁剪)可以用,但几何变换类的增强(旋转、缩放)要非常小心,因为动作和视觉是强耦合的,图像旋转了动作标签没对应旋转,模型就学歪了。我的做法是只做光度增强,几何增强要么不做,要么严格同步变换动作标签。
3.4 动作输出到执行的转换链路
VLA输出动作后到电机执行,中间这条链路每一步都要抠。典型链路是:VLA输出末端位姿增量→逆运动学求解关节角度→关节空间轨迹插值→下发驱动器。每一步都有坑。
逆运动学求解要注意多解选择和奇异点处理。同一个末端位姿可能有多个关节解,要选和当前关节角最接近的那个(避免大幅跳变),接近奇异点时要么降速要么绕行。我遇到过在奇异点附近逆解算出的关节速度突变,机械臂猛地一抖,虽然有限幅没出事,但吓出一身冷汗。后来加了奇异点检测(用雅可比矩阵的条件数判断),接近奇异就降低末端速度,稳多了。
轨迹插值上,VLA输出的动作序列通常是离散的关键点,直接连起来会有速度突变。我一般用五次多项式插值或者带加速度约束的样条插值,保证位置、速度、加速度连续。插值周期要和控制周期匹配,比如控制周期10ms就按10ms插值。
最后下发前还有一层安全检查:关节角度是否超限、关节速度是否超限、末端是否进入禁入区域(比如碰撞体)。这层检查要独立于模型,用硬编码的规则做,因为模型可能输出任何东西,安全兜底不能依赖模型。
4. 典型问题排查与避坑实录
4.1 模型输出异常的系统性排查
模型输出不对劲时,最忌讳直接改模型。我的排查顺序是从数据到接口到模型,逐层排除。先看输入数据对不对(图像有没有过曝、指令有没有歧义、标定有没有漂移),再看接口转换对不对(坐标系、单位、时间戳),最后才怀疑模型本身。
一个典型现象是“抓取总是偏一个固定方向”。这种系统性偏差几乎不可能是模型能力问题,八成是标定或坐标系转换的固定误差。排查方法:拿一个已知精确位置的标定物,让系统预测它的位姿,和真值对比,看偏差是不是固定值。如果是固定值,查标定和转换矩阵;如果是随机值,才可能是模型或数据的问题。
另一个现象是“换个光照就失效”。这是VFM/VLM的泛化问题,但根子往往在训练数据的光照多样性不够。解决办法不是换更大的模型,而是补充不同光照下的数据做微调,或者在预处理阶段做光照归一化。我一般会在图像进模型前加一步直方图均衡或自适应亮度调整,能显著提升跨光照的稳定性。
4.2 延迟与抖动的定位方法
系统卡顿或抖动,定位方法是分段打点。在数据流的每个环节(图像采集、VFM推理、VLM推理、LLM规划、VLA推理、动作下发)都打上时间戳,跑一段时间后统计每段的耗时分布(不只是平均值,要看P95、P99)。
我遇到过P50只有60ms但P99到400ms的情况,查下来是VLM在某些复杂场景下触发了变长输出,生成了一大段描述。解决办法是限制VLM的最大输出长度,或者改成只输出结构化的短标签。这个坑很隐蔽,因为大部分时候系统是流畅的,只有偶发卡顿,不统计分位数根本发现不了。
抖动的另一个常见来源是推理和控制的频率不匹配。比如控制10Hz但感知只有7Hz,执行层就会时而拿到新数据时而拿到旧数据,动作就不连贯。解决办法要么提升感知频率,要么在执行层做状态预测(用上一帧状态加运动模型外推),我倾向于前者,预测会引入额外误差。
4.3 常见问题速查表
| 现象 | 可能原因 | 排查方向 | 解决手段 |
|---|---|---|---|
| 抓取固定偏移 | 标定误差、坐标系转换错误 | 用标定物对比预测与真值 | 重做手眼标定,检查转换矩阵 |
| 换光照失效 | 训练数据光照单一 | 检查训练集光照分布 | 补数据微调,加光照归一化 |
| 偶发卡顿 | 某模块变长输出、慢路径 | 分段打点统计P95/P99 | 限制输出长度,优化慢路径 |
| 动作抖动 | 频率不匹配、插值不当 | 检查各环节频率 | 统一频率,改五次多项式插值 |
| 任务规划错乱 | prompt约束不足、示例不当 | 检查LLM输出格式和内容 | 强化prompt约束,增加边界示例 |
| 逆解跳变 | 奇异点附近多解 | 检查雅可比条件数 | 奇异点降速,选最近解 |
4.4 几条用血换来的经验
第一条,永远保留中间输出。端到端模型部署时一定要让它同时输出中间结果(注意力图、特征可视化、置信度),出问题时这些是唯一的线索。我吃过纯黑盒的亏,模型表现差但完全不知道差在哪,只能盲试。
第二条,安全兜底独立于模型。不管模型多强,关节限位、速度限幅、碰撞检测这些必须用硬规则实现,不能交给模型判断。模型会犯错,硬规则不会。
第三条,小步快跑,别憋大招。我见过团队想一次性把四个模型全上,结果联调时问题叠问题,根本分不清是谁的锅。正确做法是先跑通单模块(比如先用固定指令测VLA),再两两联调,最后全链路。每步都有可验证的输出,问题定位快得多。
第四条,数据质量比数据量重要。一千条对齐良好的数据胜过一万条时序错乱的数据。采集时多花时间做同步和校验,训练时能省大量返工。
5. 从原型到落地的扩展思路
5.1 小样本适配新任务的实操路径
新任务来了,别急着从头训。我的标准路径是:先用零样本跑一遍看基线(VLM做指代、VLA直接推理),记录失败案例;然后针对失败案例补50-100条示教数据做轻量微调(只调VLA的最后几层或加LoRA);微调后如果还不够,再考虑补感知层的数据。这个渐进路径能省大量标注成本,而且每一步的收益都可量化。
LoRA微调在VLA上效果不错,我实测下来秩设16-32、学习率1e-4、只调注意力层,200条数据训20个epoch就能看到明显提升。相比全量微调,显存占用降一个量级,训练时间也短很多,适合快速迭代。
5.2 多任务统一模型的取舍
多任务统一模型听起来很美,但工程上要权衡。统一模型的好处是共享表征、减少总参数量、任务间能正迁移;坏处是任务冲突时互相拖累,而且一个任务出问题可能影响其他任务。我的经验是:动作空间相似的任务可以统一(比如都是抓取类),动作空间差异大的(比如抓取和导航)最好分开,强行统一往往得不偿失。
判断是否统一的一个实用指标是看任务间的动作分布重叠度。重叠度高(比如都是末端位姿控制),统一模型容易受益;重叠度低(一个要精细力控一个要大范围移动),统一模型容易互相干扰。这个判断在数据准备阶段就能做,比训完再发现问题省事。
5.3 仿真到现实的迁移要点
仿真里训好的模型搬到真机,最大的鸿沟是感知差异和动力学差异。感知上,仿真图像太干净,真机有噪声、有反光、有运动模糊;动力学上,仿真的摩擦、间隙、柔性都没建模准。我的做法是仿真里做域随机化:随机化光照、纹理、相机位姿、物体质量摩擦,让模型见过足够多的变化。同时在真机上采少量数据做对齐微调,一般几十条就能把差距拉回来不少。
提示:域随机化的范围要合理,随机过头模型学不到有效特征。我一般按真机实测的波动范围来设随机化区间,比如光照亮度在真机波动±30%,仿真里就随机±40%留点余量。
这套链路我从头搭过几遍,每次都有新坑,但整体方向是清晰的:分层解耦、接口结构化、安全独立兜底、数据质量优先。基础模型给机器人带来的不是某个单点的提升,而是整个开发范式的变化——从“为每个场景写程序”变成“用通用能力加少量适配”。这个转变对工程能力的要求其实更高了,因为系统更复杂、黑盒更多,排查和验证的功夫得下得更足。我自己现在的习惯是每加一个模型模块,先想清楚它的失败模式是什么、怎么观测、怎么兜底,想不明白就先不加。这套笨办法救过我很多次。