灵巧手数据贵?先扔Simulation搞——SPD这篇paper的骚活

如果最近在看灵巧手、双臂操作、VLA 或者 Robot Foundation Model,大概率已经发现一个很尴尬的问题:大家天天在喊 Scale Data。
问题是:拿什么 Scale?
就没人吐槽一下,外包采的数据在“能用”这个范畴上真的很有抽象天赋么。
语言模型有互联网,视觉模型有全网图片和视频,机器人模型呢?机器人模型有实验室里那台被所有人轮流折腾、线缆已经开始有点可疑、每次摔一个零件大家都要集体沉默三秒的机械臂。
如果是普通夹爪还好,大概就是:开 → 关 → 抓 → 掉了 → 再抓。但一旦换成灵巧手,事情立刻开始不对劲。
普通夹爪的世界大概是:“我能不能把东西夹起来?”
灵巧手的世界是:“我的食指现在该压这里还是那里,中指是不是已经打滑了,拇指要不要补一点力,无名指是不是纯粹在摸鱼,以及这个杯子为什么突然开始转。”
一个双手灵巧操作系统,随随便便就是几十个自由度。SPD 这篇论文里的机器人,两条 arm 加两只 Sharpa Wave hand,一共:
56 个自由度。这已经不是“控制机器人”了,这属于:给控制系统开董事会。
于是灵巧操作领域长期有一个非常朴素的问题:真机数据太贵了。
你让人遥操作真机,当然数据最真实。但真实也是真的真实:物体掉地上要捡,杯子摔了要换,机器人撞桌子要检查,手指出问题要维修。实验室采一小时数据,可能对应三小时人类精神损耗。
外包闪亮登场:别管数据脏不脏,你就说多不多吧。
所以很多人自然会想到:那我用 Human Video 呗。互联网不是一堆人类手部操作视频吗?
理论上很好,问题是:
这句话看起来像废话,但在灵巧操作里非常致命。人的拇指结构、手指长度、关节范围、接触方式,跟机器人的 dexterous hand 根本不是一套东西。你最后还得做 Pose Estimation、Hand Tracking、Retargeting,然后再祈祷遮挡的时候模型没把食指认成中指。
而灵巧操作最重要的阶段,往往恰恰就是:手指正在把摄像头挡得严严实实的时候。
非常贴心。
所以 SPD 这篇论文想了一个特别朴素的方案,朴素到第一次看到的时候甚至会觉得:“这事以前怎么没人狠狠干一遍?”
它的思路是:既然真机器人贵,人手又跟机器人对不上,那我直接让人去操作一个虚拟机器人不就完了?
于是就有了 SPD:Simulation Pre-training for Dexterity。
名字听起来很论文,翻成人话就是:先让人在仿真里疯狂练机器人,练够了以后,再拿一点真机数据把它从虚拟世界拽回现实。
这篇 Paper 最大的点,其实不是“仿真能不能迁移到真机?”这个问题早就被问烂了。SPD 比较聪明的地方是,它压根没打算证明:
它没这么勇。它走的是:
也就是说:仿真不是来取代现实的,仿真是来当数据工厂的。
这个定位一下就合理很多。因为如果你非得要求 Simulation 直接 Zero-shot 到 Real,那 Simulator 就得尽量把现实世界复刻得像真的:摩擦系数不能乱,质量不能乱,接触不能乱,相机不能乱,延迟最好也不能乱。最后基本属于:“为了少做现实实验,我们决定先在电脑里重新造一个现实。”
然后你会发现:造现实也挺贵。
电机维修和摔坏的花瓶走什么报销?
SPD 换了个思路。没关系,Simulation 不需要百分之百真实,它先负责教机器人一些“基本功”:怎么靠近物体、什么时候换手、双手怎么配合、手指什么时候收紧、东西滑了以后怎么补救,做 handover 的时候别像两个部门交接项目一样互相甩锅。
至于真实世界里这个杯子摩擦力稍微不一样、马达速度有一点偏差、摄像头颜色跟 MuJoCo 不完全一致,这些东西最后再拿少量真机数据修。我觉得这是这篇论文最实际的地方。
作者搞了一个叫 spd-vr 的系统。操作者戴 Meta Quest 3,然后直接在 VR 里面操作 MuJoCo 里的双臂灵巧机器人。头显负责追踪 wrist 和 fingertips,再通过 inverse kinematics 控制虚拟机器人。MuJoCo 的 Physics 跑在 480 Hz,控制、Streaming 和 Recording 则是 60 Hz。
整个流程最大的优势可以总结成一句话:失败以后按一下 Reset。
没人需要弯腰捡杯子,没有博士生要趴桌子底下找 Jenga block,也没有人要停下来问:“等一下,这个 gripper 刚才是不是撞到了?”
这就是 Simulation 最伟大的地方之一。它当然不是没有问题,但是:它特别会保护研究生腰椎。
但是站久了,腿是不是也会有问题。
最后作者找了 5 个 operator,花了一周,采了大概 75 小时数据,总共 1,930 条 episode,包括 Jenga、字母积木、mug、dish、cup、bottle,里面有搭塔、handover、挂杯子、rack dishes、杯子堆叠、把瓶子扔进箱子等操作。
这里有一个地方挺重要。很多任务只告诉 operator:最后要做到什么。 但不强制规定:你必须怎么做。
于是同一个任务,不同人可能有不同操作方式,甚至同一个人今天和明天,操作顺序都可能不一样。在数据层面,这其实是件好事,因为 Dexterous Manipulation 本来就是一个很 Multimodal 的东西。
比如拿一个 mug,你可以抓杯身,也可以抓 handle;handover 的时候,可以左手先接,也可以右手先让,理论上都能做成。
所以如果你硬让一个普通 Regression Policy 去学:
很容易发生一件特别经典的事情:训练数据里方案 A 合理,方案 B 也合理,模型一平均,得到方案 C。
方案 C:谁都不会这么干。
对某些普通回归问题来说,平均一下可能问题不大;对灵巧手来说,就会变成:“恭喜,你的五根手指达成了某种 民主妥协 不可抗力,然后东西掉了。”
所以 SPD 用的是一个 Diffusion Transformer Policy,总计大约 222M 参数,输入包括视觉信息、Proprioception 和历史动作,输出的是 Future Action Chunk。
可以粗略写成:
其中 (w) 表示 Policy 看多长的历史,(c) 表示一次预测多长的 Future Action。
这里还得特意说一句:SPD 没有上 Language。 因为他们这批 Simulation Data 并没有完整的语言标注,所以现在别把它理解成“给一句自然语言,双手什么都能给你干”的通用 VLA。
它目前更准确的定位是:Dexterous Visuomotor Pre-training。 先把“怎么看”和“怎么动”练好,以后再讨论怎么把语言也接进来。
然后就到了这篇 Paper 一个非常关键的词:On-Embodiment。
这个东西基本就是 SPD 的数据哲学核心。Human Video 的问题是:
SPD 想做到的则是:
因为 Simulation 里面那双手,本来就是按照目标机器人搭的,相机布局也尽量对齐,都是一个 Top Camera 加两个 Wrist Camera。所以 operator 从一开始就在操作机器人的身体,而不是操作人类的手 → 做 Pose Estimation → 做 Retargeting → 强行翻译成机器人动作。
这个区别其实特别大。
可以把 Human Video 想成:“我看别人怎么游泳,然后再把他动作翻译给螃蟹。”
SPD 是:“我先操作一只虚拟螃蟹在泳池模拟器里练,再把经验给真实螃蟹。”
所以显卡最后还是回归到游戏了么。
当然,Sim-to-Real Gap 还是存在,只是现在 Gap 从:
变成了:
SPD 赌的是:后面这个 Gap 比前面那个更容易补。
这个赌注我觉得还算务实。Human Video 的最大优势是量大,百万小时、千万小时都不是完全无法想象,但是 Action Supervision 很弱。SPD 刚好反过来:规模没有互联网视频那么夸张,但是 Action Label 很干净。
所以如果把机器人数据来源画成一条线,大概就是:
越往左,便宜、数据多,但 Embodiment Gap 大;越往右,真实、直接,但钱包先死。
SPD 就站在中间说:“各位,要不别走极端。”
站中间,串两边。
模型结构本身其实没那么需要神化。三个 Camera Image 先过 Frozen DINOv3 ViT-B/16,然后每个 Camera 使用 4 个 Learnable Query 去 Cross-Attention Patch Features。简单说就是:把一大坨视觉 Token 压缩成少量、后面真正方便用的 Visual Representation。
主干是 8-block Transformer,Hidden Size 768,12 个 Attention Head。这部分属于:“正常,合理,现代。”
真正比较值得记的是它后面的 Temporal Design。
SPD 每条训练 Sequence 长度是 256 个 timestep,数据是 30 Hz,所以相当于一次 sequence 覆盖:
左右的时间。
但是 Attention 不会每层都硬看完整 256 step,而是用了 32-step Sliding Window。视觉也不是每个 timestep 都重新塞一次,每 8 个 timestep 才送一次新的 Visual Feature。
这个挺合理,因为连续视频帧之间的信息量,有时候真的低得令人悲伤。
比如给你 30 张图,内容是:“手在靠近杯子。”“手还在靠近杯子。”“手依然在靠近杯子。”“手还他妈在靠近杯子。”
GPU:“收到,非常有信息量。”
Flow Matching 这块也可以很快过。假设真实的 Action Chunk 是:
随机噪声是:
随机采一个 Flow Time:
然后在 Noise 和真实 Action 之间做线性插值:
目标 Velocity 是:
模型根据当前 noisy action、Flow Time 以及前面的 sensorimotor context (\mathbf h),去预测:
对应的 Flow Matching Loss 可以写成:
这部分说白了就是:让模型学会怎么从随机动作噪声,一路往“合理动作”那个方向走。
没必要在这里表演数学体操。
真正有意思的是:History 长度 (w) 和 Action Chunk 长度 (c),到底应该怎么选。
这个是我觉得整篇 Paper 最实用的实验之一。
大家都知道 Action Chunk 长有好处。比如一次直接预测:
step。
30 Hz 下,大概就是:
差不多一秒。一秒钟内不重新规划,动作会比较连续,机器人不会动一下、想一下、动一下、想一下,像第一次学科目二的人。
问题是:灵巧操作里,一秒真的很长。
特别是在接触阶段。手指可能 0.2 秒就滑了,杯子 0.3 秒就转了,Jenga 0.5 秒就已经开始表达它对你控制算法的不满。
结果你的机器人还在执行:“我一秒前觉得这个计划挺好的。”
这就很有项目管理的味道。
所以作者把 Chunk 缩短:
30 Hz 下就是:
这样大概每 0.27 秒就能重新 Observe、重新 Plan,反应速度快多了。
但是一个新问题马上出现。如果你只看当前帧:
同时每 0.27 秒就重新换一次计划:
机器人会开始抖。
原因也很好理解:它每次重新规划,都像刚失忆。
它不知道自己上一秒刚干了什么。上一刻:“我要从左边绕过去。”下一刻:“诶,这里好像也能抓。”再下一刻:“不对,我觉得右边更合理。”
最终效果:机器人拥有高度民主的内部意见分歧。
作者的解决办法也非常直接:给它 History。
最后效果最好的是:
也就是看大约一秒左右的历史,但每 0.27 秒重新出一个新的 Action Chunk。
这个设计我还挺喜欢,因为它把本来纠缠在一起的两个问题拆开了:Temporal Coherence 怎么来?靠 History。Reactive Control 怎么来?靠 Short Action Chunk。
可以直接记成:
和:
这比单纯把 Action Chunk 无限拉长要合理很多。
更有意思的是:Simulation Pre-training 到底有没有用,居然非常依赖这个 Temporal Structure。
作者测试了:
不同组合。
最强的正是:
这个设置下,SPD 平均 Task Progress 是:
同一个 Architecture,但是不做 Simulation Pre-training,直接在真机数据上从头做 Behavior Cloning:
差了 17.8 个百分点。
这件事其实很有意思,因为它说明:Pre-training 不是你训好了以后,随便插到任何 Architecture 上都自动 +20%。
不是充话费送流量。
下游 Policy 得有能力把预训练阶段学到的 Skill 调出来。比如 Simulation 里学到的是:“刚才手指碰到了物体,所以现在应该补一下。”结果你的 downstream policy 只看当前帧,那你让它学这个有什么用?它根本没有“刚才”。
这和前面 MEMOBench 那篇甚至有点奇妙的呼应。MEMOBench 在说:机器人如果几分钟任务里一直忘记过去,会出大问题。SPD 在说:兄弟,别说几分钟了,一秒钟灵巧操作,你把过去忘了都可能开始抽搐。
所以 SPD 这里所谓的 Visual Dexterity,严格来说其实不只是:
而更接近:
这个我觉得是一个挺好的 takeaway。
然后来到大家最喜欢的部分:真机。
作者测试了五个双臂灵巧操作任务:Plate Racking、Mug Hanging、Jenga、Cup Stacking、Bottles in Bin。都不是那种“拿起方块,放进盒子”,否则 56 DoF 就显得有点浪费。
比如 Mug Hanging,不是只把杯子拿起来,而是先拿,然后 Handover,最后挂到架子上。Jenga 更离谱一点:先把 Block 推出来,然后从另一边拉出来,塔还不能塌,最后还要把它放到顶上。
属于机器人界经典:你但凡有一个步骤没做好,前面全白忙。
而且作者每个任务真正使用的 Real-world Fine-tuning Data 并不算特别多,大概:
一个任务。
Mug 大概 44 分钟,Jenga 48 分钟,Plate 70 分钟,Bottle 72 分钟,Cup 比较难,用了 121 分钟。
所以它真正比较的是:
和:
到底谁更强。
结果确实是 Simulation Pre-training 全面赢,尤其 Jenga、Cup、Bottle 这种更吃 Dexterity 的任务,提升非常明显。
不过这里有一个坑一定要说。
论文里的:
不是“76.7% 的任务完整成功”。
它报告的是:Normalized Task Progress。
也就是说,每个任务被拆成几个阶段。比如 Jenga:推出去一分;拉出来,而且塔没倒,再一分;最后放到顶上,再一分。
所以 (76.7%) 更接近:“平均完成了大约四分之三的任务阶段。”
它不是 Binary Success Rate。
这个一定要讲清楚,否则特别容易变成:“SPD 真机灵巧操作成功率 76.7%!”
然后论文作者隔空血压升高。
其实对于 Dexterous Manipulation 来说,Progress Metric 本身挺合理的。一个 Policy 如果每次都能走到最后一步再失败,和一个第一步就趴窝的 Policy,显然不是一个水平。
只是:别把 Progress 当 Success。
那这篇 Paper 最大的意义到底是什么?
我觉得不是“MuJoCo 很牛”,也不是“VR 可以采数据”,这些东西都不新。
真正重要的是:它重新给 Simulation 找了一个位置。
以前大家提 Simulation,大概有两种经典用法。第一种:
目标是把 Simulator 搞得足够好,最后现实世界直接跑。
第二种就是:“我这个算法先在仿真 Benchmark 测一下。”也就是 Simulation 作为考试场。
SPD 说:不,还有第三种。
重点不是“最终 Policy 是不是完全在 Simulation 里训练出来的”,而是:仿真能不能先廉价制造一大堆高质量 Robot-native Data。
这件事我觉得很值得关心,特别是灵巧手、双足、Humanoid 这种高自由度系统。
真机数据每一小时都贵。你想 Scale 到 100 小时、1000 小时、10000 小时,最后可能不是 GPU 先不够,是硬件、操作员、维护人员、实验室管理员先集体辞职。
SPD 至少给了一条还算现实的中间路线:让 Human Operator 继续提供人最擅长的东西——策略、直觉、灵巧行为;然后 Simulation 提供低成本 Reset、并行、安全、干净状态和 Robot-native Action Label。
这么一看,其实很合理。
当然,这篇 Paper 离“以后不用采真机数据了”还差十万八千里。
问题也不少。
首先,75 小时其实还是不算特别大,而且主要集中在六类 Scene Family,距离真正的 General-purpose Dexterity 还很远。
其次,Downstream Real Task 和 Simulation Pre-training 不是完全无关。虽然对象不是完全同一批,但 Object Category 和 Manipulation Pattern 还是比较接近。
所以现在它真正证明的是:Simulation Pre-training 可以迁移一部分 Dexterous Skill Prior。
不是:机器人突然获得了 Open-world Dexterity。
这俩差得挺远。
然后是 Simulation Quality。
别觉得既然不追求 Zero-shot Sim-to-Real,就可以随便乱填 friction。不行。
假如仿真里的杯子摩擦力大得像贴了双面胶,Operator 在里面学会“两根手指随便夹”,到了现实:啪,杯子没了。
这时候你的 75 小时 Pre-training 就不是 Prior,是:Bad Habit Pre-training。
所以我觉得未来这个方向真正值得研究的问题,可能不是“Simulator 看起来有多逼真”,而是:Simulator 里面采出来的 Behavior Distribution,到底像不像现实世界里有用的行为?
这个问题可能比单纯追 Photorealistic Rendering 更重要。
最后一个问题:SPD 还是需要人。5 个 Operator,一周,75 小时。虽然比真机采舒服太多,但是 Human Time 并没有消失。
所以一个很自然的下一步就是:RL。
Human Teleop 的 Scaling 大概是:
而 Simulation RL 理论上可以尝试把它变成:
如果先让人类在 Simulation 里给 Policy 一套比较靠谱的灵巧操作 Prior,然后再让 RL 在里面自己刷题,这条路线其实挺顺的。
而且如果把 SPD 跟前面聊过的 ZimaBlue 放在一起看,就更有意思。
ZimaBlue 是:
SPD 是:
两个方向其实刚好互补。
ZimaBlue 数据多、世界丰富,但是 Action Label 弱;SPD 数据没那么大、世界没那么丰富,但是 Action Label 贼干净。
所以我甚至觉得,未来比较合理的数据配方可能不是二选一,而是:
Human Video 负责让模型见世面;Simulation Teleop 负责人类把操作技巧传进去;Simulation RL 负责让机器人自己刷题;Real Robot 负责最后告诉它:“孩子,现实世界没你想得这么理想。”
这个组合听起来反而比“我们再采十万小时真机”现实一点。
所以如果你问:这篇 SPD 到底有没有必要看?
如果你做的是 Dexterous Manipulation、Bimanual Manipulation、Humanoid Hand、Sim-to-Real、Robot Data 或 Robot Foundation Model,那我觉得:值得看。
而且不用一上来从头啃到尾。重点看三件事就够了:第一,他们到底怎么采 Simulation Teleoperation Data,也就是 VR + MuJoCo 那套 Pipeline;第二,为什么
这么重要,这部分甚至对不做灵巧手的人都有参考价值,它背后的本质就是:短 Chunk 保证 Reactive,History 保证 Continuity。
第三就是真机实验,尤其要看清:76.7% 是 Progress,不是 Success。 然后再看 Pre-trained 和 From-scratch 到底在哪些任务上差得最明显。
如果你只是做普通单臂夹爪 Pick-and-place,那这篇 Paper 对你的直接方法价值可能没那么高。但如果你关心的是:高自由度机器人的数据以后到底要怎么 Scale。
那 SPD 挺值得知道。
因为这篇 Paper 真正想表达的:
各位,别老把 Simulation 当考试场。它完全可以直接当数据工厂。
先在虚拟世界里面让机器人把抓东西、换手、捏住、别掉、别抖这些基本功练个几千几万遍,然后最后拿一点现实数据告诉它:“对,基本就这么干。但是现实世界里的杯子更滑,电机没你仿真里面那么听话,摄像头也没那么干净。以及——你这次真掉了,我是真的要去捡。”
如果一定要一句话总结 SPD:
它没有证明仿真能够替代现实,而是证明了一件更实用的事:真机数据贵得离谱的时候,完全可以先让机器人在虚拟世界里把基本功卷起来,最后再花一点现实成本把它拉回来。
我觉得这反而比天天喊 Zero-shot Sim-to-Real 靠谱得多。
