最近几年,“具身智能”从一个学术黑话变成了招聘网站上频繁出现的岗位名称。但真正开始动手看代码的人会发现,这个领域最麻烦的不是没有资料,而是资料更新得太快。好不容易读完一篇 RT-1 的解读,下一周又冒出 RDT、ForceVLA 一长串新名词。
我不打算再写一篇“论文逐行解读”,而是想聊聊更实际的东西:当一套涵盖 RT-1、RoboFlamingo、MDT、RDT、LAPA 的 20 集 VLA 教程摆在你面前时,应该怎么学才能不只是在收藏夹里吃灰;以及当你真的把模型跑起来之后,哪些地方会毫无预兆地卡住你。
一个比较反直觉的判断先放在这里:VLA 的核心难点,从来不是“看懂画面”和“听懂指令”。视觉语言模型发展到今天,理解场景已经不是瓶颈。真正的瓶颈是动作——用什么形式表示动作,用什么模型结构生成动作,以及生成的动作能不能让真实机械臂平滑、稳定、安全地执行。能想明白这一层,后面看所有论文都会顺很多。
1. 先理解 VLA 解决的不是“看见”,而是“看见之后怎么动”
1.1 传统机器人栈的断层不在感知,在行动
传统机器人项目怎么做?通常是一条流水线:先用目标检测模型找到物体,再算姿态,然后交给运动规划库做路径规划,最后底层控制器驱动电机。听起来很合理,但每换一个场景,这条链路就要重新调一遍。感知模型在一个光照下好用,换个角度就不灵;规划模块只认固定尺寸的物体;控制器参数调好了,物体稍微挪两厘米就抓空。
而 VLA 的思路完全不同。它不再把“感知-规划-控制”切成三段,而是让模型直接吃多视角图像和语言指令,输出一条动作序列。这个转变带来的好处不是“少了两个模块”,而是整个系统变成了一体化的可学习系统。过去的问题在于模块之间的错误会一级一级放大,现在的问题则变成了:模型能不能从数据里自己学会动作和场景之间的关系。
1.2 动作表示方式,才是 VLA 真正的分水岭
刚开始看 VLA 论文,很多人会把注意力放在网络结构上:这里用了 ViT,那里用了 diffusion。真正值得先看的是动作表示。不同模型对“动作”有完全不同的假设,这决定了它们的上限和落地方式。
常见动作表示有这么几类:
- 末端位姿加夹爪开合:直接输出机械臂末端在相机坐标系下的 6D 位姿和夹爪指令,直观,但依赖标定精度。
- 关节角:输出每个关节的目标角度,物理上一定可达,但在不同机械臂之间迁移困难。
- 增量动作:每次只输出一个小幅修正,适合精细任务,但长期执行会有累积漂移。
- 动作块:一次预测未来 N 步动作,可以降低“一步错步步错”的复合误差,是很多扩散策略采用的做法。
这里的核心矛盾是:动作表示越接近电机层,物理可行性越高,但跨平台迁移越难;动作表示越接近语义层,跨平台迁移越容易,但离精确控制越远。你看模型时会发现,不同算法的很多设计差异,其实都是为了在这个矛盾里找平衡。
2. 教程里那串算法名,应该按这条线索去消化
2.1 RT-1:把机械臂动作当成一组词元
RT-1 可以看作是 VLA 走向大众视野的起点。它启发自 Transformer 语言模型的生成方式,把机械臂动作离散成一串词元,然后用类似 next-token 的方式逐维预测。输入的图像经过视觉编码器,指令经过文本编码器,共同作为条件,输出动作词元序列。
具体怎么做其实是次要的,关键是你应该从 RT-1 里理解两件事。
第一,语言指令在这里不是最终输出,而是“条件”。模型不是一个会说话的大模型,而是一个根据语言条件生成动作的模型。
第二,离散化是有代价的。把连续动作切成 256 个桶,看起来够细,但在某些精密任务里,桶的颗粒度就可能不够。RT-1 的价值不是告诉你“离散化最优”,而是展示了一条可行的、可扩展的技术路线——动作可以像语言一样被生成。
2.2 RoboFlamingo:给现成视觉语言模型补一个动作出口
RT-1 这类方案需要大批机器人数据从头训练。对绝大多数团队来说,这条路成本太高。RoboFlamingo 代表的思路是:拿起一个现成的视觉语言基础模型,冻结大部分参数,在合适的位置插入可训练接口,再在末端接一个小动作头,这样就能用相对较少的机器人数据训练出一个能输出动作的模型。
这个思路的现实意义非常直接。如果你不是大厂,没有几十万条遥操作数据,“从头训 VLA”基本不现实。更可行的是在开源视觉语言模型的基础上做适配。当然,RoboFlamingo 这类方案也有边界:基础模型的知识擅长“理解场景”,并不天然擅长“生成动作”,动作头的设计和训练数据的质量会直接影响上限。
2.3 RDT 与 MDT:用扩散模型重构动作轨迹
RT-1 是把动作当词元,RoboFlamingo 是调接口,而 RDT、MDT 这一组模型共同指向另一个方向:用扩散模型生成整段动作轨迹。
为什么要扩散?因为机器人示教数据天然是多峰的。同一个任务,十个人演示可能就是十种不同轨迹。如果用回归模型训练动作输出,模型会把多条轨迹“平均”出一条,结果经常是抖动、停顿。扩散模型不是直接预测一个最优动作,而是从一个随机噪声轨迹开始,逐步去噪成一条符合数据分布的轨迹,天然适合这种多峰输出场景。
RDT 这种 Robotics Diffusion Transformer 的做法,是把多模态观察信息和噪声动作一起丢进 Transformer 结构做去噪。MDT 在这个框架里可以理解成同一思路的另一种骨干或变体。学习时不必纠结谁更强,要抓住的共同点是:扩散加 Transformer 正在成为机器人动作生成的主流范式之一,它的厉害之处不是单步预测更准,而是整段动作更平滑、更多样。
2.4 LAPA:语言模型负责“拆任务”,底层策略负责“干活”
LAPA 代表的则是一条更工程化的路线:先让语言模型把“把杯子放到桌上”拆解成几个步骤,然后由一个底层的动作策略逐步执行。它不要求一个大模型从头到尾输出所有电机指令,而是让规划与执行分层协作。
不同教程里 LAPA 的展开名未必一样,这里真正值得理解的是“语言模型和动作模型如何分工”这个设计问题。选择一:一个端到端大模型吃全部信息、吐全部动作,简单直接但对数据和算力要求极高。选择二:上层大模型负责任务规划和纠错,下层小策略负责具体动作,工程上更容易控制风险。看到 LAPA 时,先问它在哪一个选择里,再往细看,思路会清楚很多。
这一批算法建议按下面的顺序去学,避免一上来就被名词淹没:
| 学习顺序 | 模型/类别 | 核心贡献 | 学完之后你应该能说清 |
|---|---|---|---|
| 1 | RT-1 | 把动作当成词元序列生成 | 为什么离散化动作可行,代价是什么 |
| 2 | RoboFlamingo | 把预训练视觉语言模型迁移到动作任务 | 冻结骨干和训练动作头之间的边界在哪 |
| 3 | RDT / MDT | 用扩散模型生成连续动作轨迹 | 为什么扩散更适合多峰动作分布 |
| 4 | LAPA | 把语言规划和底层执行分开 | 规划与执行如何分工才更可控 |
3. 从零基础到能训练一个 VLA,不跳过这些垫脚石
3.1 课程标题里的“30k”要理性看
标题里的“30k”,通常指的是月薪预期。这里需要先泼一点冷水:看完任何教程都不可能直接得到 30k 的 offer,真正值钱的是你在学习过程中建立的能力组合。具身智能岗位现在给得高的原因不是“会念模型名”,而是“能在真实机器人上稳定复现效果并解决工程问题”。所以下面的学习路径,每一步都刻意把“动手”放进去,而不是让你只看视频。
3.2 六块垫脚石,按顺序踩
按常见实践,建议把下面的基础排好序,前面的没有踩稳,后面的学习效率会很低。
- Python 与 PyTorch:不是会写脚本,而是能熟练处理数据加载、分布式训练、断点续训。
- Transformer 与视觉语言模型基础:了解 ViT、CLIP、tokenizer、cross-attention 这些概念,不知道细节没关系,但要能看懂模型输入的张量形状。
- 机器人学基础:坐标变换、正逆运动学、相机内参和手眼标定、控制频率。这部分最容易被人忽略,但动作模型部署时绕不开。
- 数据格式:理解一条 episode 里有什么,图像、指令、动作怎么对齐,坐标系定义在哪,动作频率是多少。
- 仿真环境:MuJoCo 或 Isaac Lab 之类,先在仿真里把推理和评测链路跑通,成本比真机低一个数量级。
- 训练调参基本功:学习率、batch size、随机种子、权重初始化、loss 波动,这些基本功决定了你能不能复现论文结果。
还有一个很容易被忽略的点:不要上来就打算从头训一个大 VLA。单卡训练一个基础 VLA 的显存需求和服务器数量,不是个人开发者能轻松承担的。更现实的路径是在开源预训练权重上做微调,或者直接用较小的观测编码器。学会“站在已有模型上做增量”,在算力受限时是必须的能力。
3.3 一段更稳妥的三步走路径
第一步,把教程里的模型都跑通推理,先不改任何训练逻辑,用官方权重在示例数据上看看输入输出长什么样。
第二步,选一个任务场景,准备一小批自己采集的数据,几十条 episode 就够,做一次微调,把“数据-训练-评估”的最小闭环跑通。
第三步,把这个闭环搬到仿真或真机上,开始记录失败案例,再回到数据和参数上去改。
这段路径的核心是:每走一步都要留下一个可以重复运行的最小脚本。等积累到第三十次实验时,你会发现自己手里不再是一堆模型文件,而是一整套可以迭代的工程资产。
4. 真正动手时会暴露的五个工程坑
4.1 数据对齐:时间戳、坐标系、频率都可能是坑
第一个容易翻车的地方在数据。很多人拿到公开数据集,不检查相机时间戳、指令语言、动作日志之间的对齐关系就开始训练。结果训练时 loss 很漂亮,到真机上完全不动。常见的问题包括:图像是 30Hz,动作日志是 10Hz,回放的时候没人做插值;末端位姿用的坐标系和模型定义的不一致;夹爪指令被当成连续量,实际只有开合两个值。建议拿到任何数据先写一段检查脚本:
# 伪代码:查看一条 episode 的字段和采样频率 episode = load_episode("record_0001.hdf5") for key in episode.keys(): print(key, episode[key].shape, episode[key].framerate) # 通常你会看到 images, joint_positions, eef_pose, gripper, instruction # 先确认它们的时间戳是否对齐,再谈训练如果原始数据说明文档不完整,落地前要先确认数据集的版本和字段定义。公开数据集版本更新很频繁,字段命名甚至坐标系定义都可能变。
4.2 动作空间:直接输出关节角不一定更好
第二个坑是动作空间选择。从直觉上看,关节角是最“底层”的控制量,输出关节角不就不需要解逆运动学了?但实际上,关节角在不同机械臂上的语义完全不同,一个在 Franka 上训练好的模型,换到另一台六轴臂上基本不可用。而末端位姿虽然依赖标定,但在同类机械臂之间迁移时更符合人的直觉。
如果你做的是抓取、摆放这类桌面任务,我一般建议优先考虑末端位姿加夹爪,配合动作块输出。如果做插孔、装配这类对力比较敏感的任务,则要考虑加力反馈,或者用 delta 动作做局部修正。
4.3 仿真跑通不等于真机可用
仿真环境最大的陷阱是“看起来成功了”:目标永远不挪位置,光照永远不变,相机视角永远是同一个角度。模型在仿真里学到的是“记住画面里的一个固定位置”,而不是“理解抓取这个行为”。这会导致真机失败一塌糊涂。
减少仿真到真机差距的常见手段包括:增加光照扰动、物体位置随机化、相机内外参随机化、延迟模拟,以及最笨但最有效的——定期把模型放到真机上做小样本测试,用真机失败案例反哺仿真数据。先跑通,再优化,这个节奏一定要守住。
4.4 只看 loss 评测不了 VLA
VLA 训练日志里的 loss 下降,只能说明模型在拟合训练数据,不能说明它会干活。评测一个 VLA,至少要看三个维度:任务成功率、在不同初始条件下的鲁棒性、失败之后能否恢复。最简单的做法是设计一个测试矩阵:固定几类任务,每类任务在多个物体位置、多个光照角度下测试,统计首次尝试成功率。
如果出现“训练 loss 很低、任务成功率也很低”,优先检查的不是模型,而是标签动作是不是有噪声,或者评测时相机位置和训练数据差太多。这里给一张简易排查表:
| 现象 | 优先排查方向 |
|---|---|
| 训练 loss 下降但真机乱动 | 动作表示、坐标系、数据频率不一致 |
| 仿真成功、真机失败 | 相机标定、延迟、视觉域差距 |
| 抓取总差一点 | 夹爪中心标定、末端基准、离散化粒度 |
| 输出抖动 | 扩散步数、动作块长度、滤波 |
4.5 推理速度和算力是隐藏门槛
最后一块短板通常是推理速度。在论文 demo 里,模型处理一帧画面可能要几十毫秒,看起来很“实时”,但叠加上图像采集、预处理、后处理、通信延迟,实际控制频率可能不到 5Hz。对抓取任务勉强够用,对动态避障或高速装配远远不够。
工程上的处理方式包括:把图像预处理放到 GPU 上、固定 batch 避免动态 shape 的额外开销、用 TensorRT 或 ONNX 加速、把模型输出限幅并加低通滤波。还有一点很容易踩:真机通信协议本身会带来不稳定延迟,建议在真机调试前先测量整条链路的端到端延迟,而不是只看模型单步推理时间。
5. 从“跑通教程”到“放进产品”,还差最后几块拼图
5.1 构建你自己的数据采集闭环
在实验室里,可以用一个现成数据集做完整个实验。但一旦要解决自己的任务,就得有自己的数据。遥操作是当前最主流的方式:通过 VR 手柄、3D 鼠标或直接拖着机械臂做示教,收集图像、动作和指令。数据管理同样不能省,每条 episode 要有任务描述、目标物体、场景编号、采集时间,否则后面做数据筛选和模型迭代会非常痛苦。
一个可以反复使用的框架是:固定任务,先人工采集 50 条左右的 episode,用预训练 VLA 微调,再放到固定测试矩阵里评测,然后根据失败样本补采数据,再重复。这个循环跑得越顺,你积累的“数据-模型-评测”资产就越值钱。
5.2 给模型的输出加一层安全护栏
在大模型输出的动作和目标之间,必须隔一道安全校验。“模型生成动作,安全模块把关”是工程常态。不管模型多聪明,你都要在它输出之后加一个校验层:关节限位、速度限幅、工作空间边界、力和力矩阈值、急停逻辑。
# 动作安全校验(示意) filtered = clip_to_joint_limits(raw_action, lower, upper) if joint_velocity_norm(filtered) > v_max: filtered = scale_to_velocity_limit(filtered, v_max) if outside_workspace(filtered): action = emergency_stop()这段代码不是解决 VLA 本身,但它决定了 VLA 能不能被放心地用。很多 demo 翻车,问题不在模型,而在缺少这一层。
5.3 长期维护的不是模型,是评测基线
模型训练结束并不意味着项目结束。真正长期维护的是评测基线:每个版本模型都要在同一套测试任务上跑分,记录成功率、平均完成时间、失败原因分布。有了这份基线,你才能判断新模型是真的变强了,还是只是因为随机种子变了。
我见过不少团队在 VLA 上反复折腾,最后发现提升最大的一次不是换了模型结构,而是把评测基线从“主观感觉”改成“固定测试集”。这个经验放到任何具身智能项目里都适用:数据、评测、模型三者里,评测往往是最容易被低估的。
6. 下一步该关注哪些方向
6.1 ForceVLA 提示了一条新路:把外力信息变成一等模态
从近期的研究热词看,ForceVLA 这类方向被频繁提及,核心思路是把机械臂末端的六维外力(力矩)当成与画面、语言同样级别的输入模态。为什么要这样做?因为很多任务根本无法只用视觉完成。旋拧螺丝、插拔接头、打磨表面,这些任务的关键判断依据是“手上感觉到多大阻力”,而不是“画面里看到什么”。纯视觉 VLA 在这些任务上很容易到达瓶颈,把力觉信息接入模型,正在成为下一阶段的突破口。
6.2 导航 VLA、标准体系与鲁棒性会变成新热点
另一个明显的变化是 VLA 正在从桌面机械臂走向移动机器人,“导航 VLA”这类的热度上升很快。其本质是把“感知-决策-执行”的闭环从 6 自由度扩展到更大的移动空间,这对模型的长程规划能力、记忆能力和实时性都提出了更高要求。
同时,行业标准和人形机器人相关规范也在密集推进。过去这一领域几乎没有统一接口和评测标准,各家数据格式、动作表示都不一样,这是制约工程协作的重要原因。标准体系要解决的正是这个问题。另外,随着 VLA 进入真实环境,输入鲁棒性和对抗攻击防御也开始被认真讨论。视觉输入的一小点扰动就可能让动作输出完全偏掉,所以在开放环境部署前,输入校验和鲁棒性测试会越来越不可少。
6.3 我的建议:别只追大模型,去攒一个完整闭环
最后回到最初的问题。学 VLA 的正确姿势,不是把 RT-1、RoboFlamingo、MDT、RDT、LAPA 的名字全部背熟,而是亲手把一条“数据-训练-评测-真机”的最小闭环跑通。跑通一次,你对动作表示、数据对齐、评测设计和真实机器人之间关系的理解,会超过闷头读二十篇论文。
如果你现在还在犹豫从哪里开始,我建议先做三件事:找一台能动的开源机器人平台,下载一个现成的 VLA 预训练权重,准备五条自己采集的演示数据。然后跑一次微调,写一个评测脚本,记录第一次真机失败的原因。这个流程走完,你就有了一张属于自己的 VLA 地图,后续再看到新模型,都只是在这张地图上添加新的路线。