3分钟看懂VLA工作流:以26创学营插花为例

总结出来的核心经验
核心记住这六句:
- VLA 不是写程序,是让机器人看着你做几十遍,然后自己学。
- 所以这活儿九成的功夫在"你演得标不标准",不在模型。
- 模型只会模仿,不会评判。 你手抖,它学会手抖;你偷懒,它学会偷懒。
- 最大的坑不是精度不够,是视野被挡——花朵会挡住花自己要插入的那个洞。
- 我们的解法:让那只没在干活的手举起来,专门当摄像机用。
- 验收标准:同一种情况重复十次,成八次才算过。
剩下的详细内容,是这六句话是怎么被我们小组用两天时间换来的。
一、一件三岁小孩都会做的事
任务:把一支假花,插入一个花瓶里。
我妈做这件事需要三秒,而且她一边做一边能跟我聊天。我们小组围着两条机械臂,只做了两天,就把成功率磨到了 80%。
这篇文章就是想说清楚:为什么这么简单的事,对机器人来说这么难;以及我们是用什么办法,一点一点把它变简单的。
二、先说清楚,VLA 到底是什么
传统的机械臂编程,是人把每一步坐标写死。
程序员坐下来,敲进去一串数字:手先移动到 (30, 12, 45),张开夹爪,下降 8 厘米,闭合,抬起,移动到 (55, 20, 60),松开。跑起来非常精确,非常稳,非常……脆。
有多脆?花往旁边挪 5 厘米,整套程序就废了。 因为它根本不知道花在哪儿,它只知道 (30, 12, 45) 这个坐标。
VLA 是另一条路:不写坐标,改成演示。
你给它两样东西——摄像头拍到的画面,和一句人话指令("把花插入瓶子里")——它直接输出下一步手该怎么动。中间没有坐标,没有 if-else,没有人写的规则。
它是怎么会的?因为你先做了几十遍给它看。
这就像教小孩系鞋带。你不会跟他报坐标,你会手把手带着他做,做上几十遍,直到他自己会。
代价也在这儿:它学到的东西,完全取决于你演得怎么样。
后面所有的坑,根子都在这一句话上。

传统编程是把答案写死,VLA 是把过程演给它看——所以演得好不好,就是全部。
三、它的眼睛只有三只,而且都挺笨
外行最容易有的一个误会,是觉得机器人是全知的——它有传感器嘛,桌上有什么它当然都知道。
并不。 我们这套系统上就三个摄像头:
一个架在头顶,俯拍整张桌子,看全局。我们叫它主视角。
两个装在左右夹爪旁边,跟着手一起动,看细节。我们叫腕部相机。
就这三只眼睛。三个视野一拼,桌上还是有拍不到的死角。
而真正致命的是下面这条:
它看不见的时候,不会举手说"老师我看不见"。
它会非常自信地,瞎猜。
请把这句话记住,第九节我们会回来找它算账。

三个相机拼出来的视野是有限的,而盲区里发生的事,它只能靠猜。
四、模型只会模仿,不会评判
再来一个外行的直觉误会:AI 很聪明,我数据里有点小毛病,它应该能自己过滤掉吧?
过滤不掉。一点都过滤不掉。
你在示教的时候,手在半空中抖了一下——它学会了在那个位置抖一下。
你为了赶进度,夹爪还没夹稳就把手臂拖走了——它学会了"夹爪没夹稳就可以走"。
它不知道那是失误。在它眼里,那就是标准答案。
这就是我们说的脏数据:不是数据格式错了,是里面混进了错误的示范。而错误的示范和正确的示范,在训练时的地位是完全一样的。
所以我们队后来有一条不成文的规矩:采砸了的那一条,当场删掉重来,不要留着凑数。 少一条数据只是慢一点,多一条脏数据是要还的。

模型只会模仿,不会评判。
五、别急着采:先做 smoke test
拿到任务的第一反应,通常是"那就开始采吧"。
先别。 先做 smoke test——小规模跑一遍,只看会不会当场冒烟,不看效果好不好。
smoke test 真正的目的,是逼你把任务拆开来看。拆的时候盯住三件事:
1. 每一步都必须可重复。
这是最关键的判据。人做事靠临场发挥,机器人靠肌肉记忆。凡是你自己做十遍、有三遍不太一样的动作,都别指望它能学会。
2. 避开精细操作。
任何需要"手感"的环节,都是灾难的开始。能换成粗放动作的就换掉。
3. 复杂动作要拆开,分组,再重新拼起来。
不要指望一个连贯的大动作被整体学会。把它切成几个动作组,每组内部尽量简单,然后再考虑组与组之间怎么衔接。
拆完之后,还要做几件事先说清楚:
左手干什么,右手干什么,必须提前定死。 两只手怎么同步、谁先谁后,不能到现场再商量。
把每一步手动推演一遍,写下来,动作标准量化。 "抓稳一点"不是标准,"夹在花朵下方一个指节的位置"才是标准。
如果这个任务只需要单臂,那在设计数据的时候就要按左右手分开处理,不能混着采。
4. 主动往数据里掺进"会出问题的情况"。
这条很反直觉,我们放到第十二节单独讲。
5. 最后一条,也是最重要的一条:从特殊过渡到通用,别想着一步到位。
刚开始一定要限定死场景。等它在窄场景下做稳了,再一点点往外扩。
具体的节奏我们是这样的:每加 30 条数据,就停下来训一版、上真机跑一次,把问题总结出来,再决定下一批 30 条该往哪个方向补。
不要闷头采 300 条再训。那 300 条大概率会有 200 条是白采的。
六、开局有几种摆法?把它们全画出来
评测的时候,裁判会随便把花和瓶子往桌上一放。所以我们得先问自己:"随便放"到底有多少种?
我们把它叫做开局摆放图,画出来是这样穷举的:
第一层,正手还是反手。 花朵朝向顺着机械臂的方向,叫正手——这时候手腕不用翻,也不会撞到关节转到头的位置。反过来叫反手,很容易转到头。
第二层,花和瓶子在不在同一边。
都在两条机械臂中间
分别在两条机械臂的两侧
第三层,各自在桌面的上方还是下方。 以"花和瓶同侧"为例,细分下去有四种:
- 花和瓶都在桌面靠下的位置
- 花在上、瓶在下
- 花在下、瓶在上
- 花和瓶都在桌面靠上的位置
花和瓶在两侧的情况,同样这么排列组合一遍。
于是我们得到了一张树状的归属图:正手 ➡️ 花与瓶同侧 ➡️ 花与瓶都在桌面上方,一路走到叶子。每个叶子稍微挪挪位置采 5 次,这个数据量就足够撑起第一版训练了。
听起来非常笨,但是这是我们试过的方法中,可靠性最好的一个。

把"随便摆"拆成有限的几种,是可执行度非常高的办法。当然请心疼你们的数采员😊
七、采数据的四条红线
开始录之前,先立规矩。这四条是我们用报废的数据换来的。
红线一:动作要走直线,别甩
移动机械臂的时候尽量线性、平滑。任何幅度过大的甩动,都会在数据里留下一段脏东西,而模型会老老实实把它学下来。
红线二:夹爪闭合以后,停一下再走
这条要解释一下原理,不然听起来像迷信。
模型不是一步一步想的,它是一次预测未来十几步,然后一口气执行完——这个机制叫 action chunk。
问题就出在这儿:如果你在采集的时候,"夹爪闭合"和"手臂移动"这两件事在时间上有重叠,模型会认为它们本来就是同时发生的。
于是到了真机上,它就真的同时下达这两条指令——夹爪还在合,手臂已经走了,花掉在桌上。
我们当时管这个叫"机器人学会了偷懒"。后来想想,是我们自己先偷的懒。
正确做法:夹爪完全夹住、确认夹实了,再开始移动。 采集的时候多等那一秒,真机上少调一天。
红线三:注意关节的行程,别撞到头
每个关节能转的角度有物理上限,转到头就转不动了,这个叫触发限位。
关键在于:你硬掰的时候,记录下来的角度是贴在上限的假值。 画面里手明明在动,数据里的角度纹丝不动。
这一段数据比没有更糟。 哪怕这个姿势你人能做出来,只要过程中撞了限位,这条就废了。
红线四:开场先把两条手臂张开,停 2 到 3 秒
动作一开始,先把两条机械臂抬起来(或者放下去),把视野让出来,确保头顶相机能看到完整的桌面,别被自己的胳膊挡住。
为什么要停满 2-3 秒? 因为要让模型意识到这个动作是有意义的、是个独立的步骤,而不是随手挥了一下。
顺带说个相关的现象:数据量不够的时候,真机上机械臂会抖。 调 chunk 的长度、在动作之间加滤波都能改善一些,但在我们这个 case 里,最后定位到的主因还是数据量不足。
另外一个有用的小技巧:把用来当参考的动作放慢一点。 慢动作给了模型更多的试错和纠正空间,它没那么容易一头撞死。

第二行那个重叠,就是"机器人偷懒"的真实成因。
八、抓花:花柄是分叉的
现在开始真正的第一步:把花抓起来。
难在哪
假花的花柄不是一根,是分束的。
夹爪伸过去,很容易只夹到其中一小撮。一提起来,整支花就歪了——理想状态下花应该是垂直于桌面的,这一歪,跟桌面之间就有了个夹角,下一步插入瓶口会非常难受。
怎么算抓成功
我们定了两条硬标准:
位置:夹在花朵下方一个指节左右的地方(我们那束花大概是 20–25 毫米)。这个位置的重心是平衡的,提起来不容易翻。
姿态:夹爪跟桌面平行的时候,整支花要尽量垂直于桌面,允许有 15–20 度的小倾斜,超了就不算。
采集的时候,监控侧必须有人实时盯着相机画面,确认一件事:腕部相机里,花柄要落在夹爪正中间。
不达标怎么办
删掉,重采。
不是"下次注意",是这一条现在就不要了。第四节说过的话,在这里第一次真正生效。

不达标不是"下次注意",是这一条现在就删掉。
九、真正的坑:花把自己的路挡住了
这是我们队第一次撞上的、真正意义上的坑。
花抓起来了,很稳,很垂直,一切完美。然后要往瓶子里插了。
头顶那个相机往下一拍——看到的是一朵花。
对,花朵的面积比花柄大得多,被举起来之后,它正好挡在相机和瓶口之间。花柄的末端在哪?瓶口在哪?画面里全没有。
请回到第三节那句话:它看不见的时候,不会说自己看不见。它会自信地瞎猜。
于是它就带着一支花,朝着一个它其实没看见的位置,一头扎下去。
我们的解法:让另一只手当摄像机
假设是右臂在抓花,那么左臂现在是闲着的。别让它闲着。
把左臂尽量抬高,然后斜向下摆,让左臂的腕部相机变成一个临时架起来的摄像机,专门去拍两样东西:瓶口的俯视面,和花柄的末端。
同时还有第二个手段:让夹爪把花稍微倾斜一点,把花柄末端从花朵的阴影里露出来,让头顶相机也能看见。
两个办法可以一起用。监控侧的技术员这时候只负责确认一件事:
花柄末端和瓶口俯视面,必须同时出现在画面里。
不同框,这条数据就不要了。

另一只手最大的价值,往往不是多抓一个东西。同时也不要一直站在一个人类的视角去推演机器的运行模式。
十、第二只手,不是用来抓的
上一节那个解法,是这篇文章里我最想让你带走的一句话。
在双臂机器人上,另一只手最大的价值,往往不是多抓一个东西,而是给正在干活的那只手提供一个视角。
这个思路在我们后面的任务里反复被用到。一旦接受了"手也可以是摄像机",很多看起来无解的遮挡问题,都变成了摆位问题。
十一、插不进去,不一定是它笨,可能是它没地方动
视野问题解决之后,我们又遇到了第二个反直觉的现象。
有些时候,模型明明已经对准了,就是插不进去。一开始我们以为是判断和决策出了问题,查了半天——
不是。是机械臂末端离瓶口太近了,近到它已经没有空间再调整位置了。
它想微调,但是动不了。就像你把笔尖已经戳在纸上了,再想平移几毫米,手腕根本使不上劲。
解法:抓到花之后,尽可能抬高。
这一下解决两个问题:
- 视野更好——离得远,看得全。
- 调整空间更大——高处的可活动锥体大得多,模型有充足的余量去对齐花柄末端和瓶口。

高处的可调整锥体大得多,这是给模型留的余量。能够在初期就搞定的问题,就不要再靠硬挤算法~~~毕竟不是所有人都有那么强的数学天赋。
十二、往数据里掺"后悔药"
回到第五节留的那个坑:主动往数据里加入实际会遇到的问题,以及对应的修正方案。 我们管这个叫数据融合。
为什么要这么干?
因为如果你的数据全是完美的一次成功,模型就从来没见过失败长什么样,自然也不知道失败之后该干嘛。
它会带着一支歪掉的花,义无反顾地冲向瓶口。因为在它见过的世界里,花从来没有歪过。
所以我们后期补了这样一类数据:夹起来发现不合格 → 松开夹爪 → 重新抓一次 → 这次抓对了。
掺入的比例大概是:每 5 条标准数据,插 1 条修复数据。
这是给模型的后悔药。它得先知道自己可以后悔。

模型得先知道自己可以后悔。人都会犯错,也给Robot修正的机会嘛~~~
十三、上真机怎么测才算数
训完了,放到真机上跑。这时候测法很重要,不能只挑好摆的位置试两下。
我们把测试情况分成三档:
- 标准情况——和数据集里出现过的一样
- 轻微偏移——大体一样,但位置歪了一点
- 完全没见过的情况——数据集里压根没有这种摆法
每一档重复 10 次,记录成功率,并且记录失败时的现象。
失败现象比成功率更值钱。"10 次成 6 次"只告诉你不行,"4 次失败里有 3 次是插的时候撞到瓶口边缘"才告诉你下一步该改什么。
然后是收敛的条件:
拿这轮的结论去更新开局摆放图,重新采,重新训,重新测。
直到重复实验的成功率 ≥ 80%,这一侧才算过。
过了之后,才开始补另一侧的数据。
另外,测试的时候要故意为难它:把花的角度调歪一些,别完全正着放,看它还行不行。这就是在测泛化——毕竟到了评测现场,没人会照着你的数据集摆。

失败现象比成功率值钱——它告诉你下一批 30 条该往哪儿补。
十四、完整流程长这样
把前面所有东西串起来,就是我们这套端到端的工作流:
- 明确具体的任务需求
- 对任务做分析——难点在哪、哪些环节不可重复
- 设计出基础版的开局摆放图,以及执行动作的步骤和流程
- 按单侧(左或右)采集数据,采到 30–50 条先训一版。如果同时还有别的任务,重复第 1–3 步做设计,穿插着采
- 单侧上真机,按"标准 / 轻微偏移 / 没见过"三档分别测,每档重复 10 次,记成功率和现象,基于这些做迭代
- 用更新后的开局摆放图重新采集,重复整个过程,直到成功率 ≥ 80%
- 补另一侧的数据,再训练
注意这是个闭环,不是流水线。第 6 步的箭头是指回第 3 步的。
整套流程里唯一的出口条件,就是那个 80%。

这是个闭环,不是流水线。唯一的出口是 80%。
十五、最后,说说这套方法不管用的地方
免得你拿去用了发现对不上:
这是桌面级、准静态的任务。动态抓取、移动中作业,完全是另一套东西。
这是单任务专用模型。它会插花,不代表它会叠衣服。
这套流程假设你能拿到足够干净的示教数据。如果采集端本身不可控,前面所有的规范都是空谈。
那些具体数字(20–25 毫米、15–20 度、5:1、30 条一迭代)是我们那束花、那个瓶子、那套设备上试出来的,你换一套硬件,数值大概率要重新标定。方法可以抄,数字请自己试。
致谢
感谢逐际动力为此次活动提供的场地与资源支持,也感谢我南搏万队友们的鼎力相助!

精辟简洁的总结
神了
这个写的太棒了,VLA快速入门
伏神nb