机器人数据采集别急着上 VR:123 条演示,第一步放到 94%,两步只有 2%
采一条机器人操作演示,眼下最主流的办法还是遥操作。人握着 leader 臂,或者戴着动捕手套,机器人 follower 同步复现,一条几十秒的轨迹背后是一整套专用硬件、一位熟练操作员、一台被占用的真机。所以只要有人提出“用消费级 VR 头显录人的第一人称演示,再转成机器人能学的数据”,做具身数据的团队都会停下来听。
VREgo 就是这条路线上的一个具体实现。它用一台 PICO 4 Ultra 头显、EgoKit 录制、HumanEgo 的表示方法,把一条人类演示拆成“手部轨迹 + 物体关键点 + 抹掉手臂的图像”,在 MuJoCo 里驱动一台 Trossen WidowX AI 臂跑闭环。两个任务、每个任务 41 条演示、一个人录完,一共 123 条。
但有三件事得先摆在前面,否则很容易把它读成“VR 可以替代遥操作”。第一,全篇结果都在仿真里,没有真机实验,作者在讨论部分写得很清楚:成功率比较的是数据、设备与流水线,不是对真机的预测。第二,论文没有“VR 数据 vs 遥操作数据”的对照,它唯一的设备对照是 PICO 对 Project Aria 眼镜——所以“替代遥操作”这个说法在这篇论文里仍然是未验证的。第三,两步任务最后那个 93.8% 不是模型自己挣的,是模型加五条手写执行规则,而规则用了仿真器直接给出的物体位置。
这篇论文真正的价值不在“消费级能不能用”,而在它把一条 VR 采集流水线上每个会漏数据的地方都量了一遍:哪一步丢了视差、哪一步把物体放歪了几厘米、哪一步把抓取标签标反、哪一步让策略永远等不到松手。这些量化,比任何一句“节省成本”都更有用。
一分钟速览
- 采什么:每帧图像(左眼 640×480、焦距 407 像素)、头部位姿、双手 26 个
OpenXR关节、每个物体 20 个关键点、一个二值的抓取标签。 - 怎么映射:不重定向关节角。策略直接输出“手腕位姿 + 抓取状态”,机器人夹爪闭环跟随;夹爪和手之间只有三个按设备标定的对齐量。
- 采集效率:任务二 41 条演示分两次、每次约一小时录完,中位时长 23.7 秒;任务一 41 条合计 14.6 分钟素材。
- 存储:PICO 的 41 条占 1.3GB,Aria 的同样 41 条占 15GB,差 11.5 倍;Aria 每条都要上传云端跑 MPS。
- 预处理才是成本:一条 8.3 分钟(任务二 12.8 分钟),一张 GPU 同时跑 3 条。
- 结果一:任务一 40 条演示训出的策略,在 100 个没录过的布局上成功 67、74、60 次(三个种子),Aria 是 73、78、0。
- 结果二:任务二第一步 94/100,两步都成只有 2/100;加五条规则后 93.8/100。
- 天花板:没有触觉与力反馈、物体朝向被假设与桌边平行、手臂相对第一个物体固定所以 reach 没被测到、规则在同一批 100 个布局上设计并评测。
采什么:一台头显、两路眼、五件套

图 1|从左到右三段:头显两路透视相机拍下的原始帧、抹掉手臂并画出虚拟夹爪与物体关键点的训练图像、仿真里在没录过的布局上把方块叠上去的策略。
硬件:两路透视相机加头显端的手部跟踪
PICO 4 Ultra 的两路 see-through 相机各自 1280×960、相隔 64 毫米、已做立体校正、30fps、单眼 76°×61°。EgoKit 把两路图像并排录成 2560×960,同时记下头部位姿、双手 26 个 OpenXR 关节,以及两路相机的内参与外参。录制停止的那一刻,这条 take 就已经能进流水线了——不需要上传,也不需要等云端返回。
作为对照,HumanEgo 用的 Project Aria Gen 1 只有一路鱼眼 RGB(1408×1408),头部位姿和 21 个手部 landmark 都要把录像上传、由 Meta 的 Machine Perception Services(MPS)在云端算出来。两台设备的差别不是“贵不贵”,而是“视差从哪来”和“算力在哪”——后面两节会看到,这两个差别直接改写了录制协议。
一条演示被拆成五样东西
VREgo 沿用 HumanEgo 的表示,一条演示最终变成五类量。把这五类量认全,才能看懂后面所有的失败模式。
| 字段 | 来源 | 规模与规格 | 在训练里干什么 |
|---|---|---|---|
| 图像 | 左眼,缩到 640×480(焦距 407 像素) | 每帧一张 | 策略的视觉输入,人的手臂已被抹掉 |
| 头部位姿 | 头显 runtime 给出 | 每帧一个 6DoF | 与相机外参合成出相机位姿,仿真里复现视角 |
| 手部 | OpenXR 26 关节映射到 MPS 的 21 landmark | 每帧一组 | 训练目标(手腕位姿),也是虚拟夹爪的落点 |
| 物体关键点 | Grounding DINO 加 SAM 2 分割,CoTracker3 跟踪 | 每物体 20 个点 | 物体 token;同时决定“物体在哪” |
| 抓取标签 | 拇指与食指指尖的三维距离 | 每帧一个二值 | 携带物体、夹爪开合、松手时刻 |
为什么要把人的手臂从图像里擦掉
训练图像里不能出现人类手臂,否则策略会把人的小臂当成执行器的一部分。做法是:Grounding DINO 加 SAM 2 检出并分割每个物体和手臂,手臂用 inpainting 抹掉,然后在跟踪到的手位画一个虚拟夹爪,再把每个物体的关键点画在它身上。于是一条人类演示,看起来就像一台机器人自己在做。
这个处理有个副作用,作者自己点出来了:手臂的影子留在图像里,因为手臂掩码不含影子。他们没有去隔离影子的影响,只做了一个更粗的检查——把整张图遮黑,策略的预测只变 5 到 26 毫米,说明图像确实在被用,但也说明视觉信号在这套表示里并不强。
抓取标签:一个距离阈值,和它带来的麻烦
抓取是二值的:拇指尖和食指尖的距离小于阈值就算闭合。参考实现把阈值写死成 10.5 厘米,因为它自己的操作员张开手读数约 14 厘米。换一个人就不成立:本文操作员在 PICO 上张开手只有 7.6 到 9.6 厘米,握住东西是 2.1 到 6.5 厘米,任何固定阈值都会把某几条 take 标成“握着空气”。
所以 VREgo 对每条 take 单独定阈值:把这条 take 的指尖距离分布按 Otsu 法分成“握持”和“张开”两簇,阈值取两簇的中点,也就是下面这个式子。
ℓt=1[ ∥ptthumb−ptindex∥<τr ],τr=τropen+τrhold2 \ell_t = \mathbf{1}\left[\ \|p^{\mathrm{thumb}}_t - p^{\mathrm{index}}_t\| < \tau_r\ \right], \quad \tau_r = \frac{\tau^{\mathrm{open}}_r + \tau^{\mathrm{hold}}_r}{2} ℓt=1[ ∥ptthumb−ptindex∥<τr ],τr=2τropen+τrhold
其中 p_thumb(t) 与 p_index(t) 是第 t 帧两侧指尖的三维位置,τ_r 是第 r 条 take 自己的阈值,τ_open® 与 τ_hold® 是这条 take 上张开、握持两簇的中心。主数据集里这个阈值落在 5.9 到 8.4 厘米(PICO)和 8.3 到 9.0 厘米(Aria)。
还有一条更隐蔽的规则:手指没进画面之前,标签一律记为“张开”。因为头显能在相机看到手之前 2.4 秒就跟踪到手,而一只自然下垂的手,指尖读数恰好落在“闭合”那一侧。
怎么映射:从 26 个关节到一只夹爪

图 2|论文表 1:两台采集设备的逐项对照,从相机、帧率、头手跟踪方式,到物体怎么定位、41 条数据占多少存储。
这一节回答做具身数据的人最关心的三个问题:动作空间是什么、坐标系怎么对齐、有没有 retargeting。先说结论:VREgo 没有关节级重定向,它做的是“表示级对齐”——把人的手腕变成一个刚体位姿,把手指张合变成一个二值状态,中间用三个按设备标定出来的偏移量把虚拟夹爪摆正。
两台设备给的输入本来就不一样
PICO 路径给的是 26 个 OpenXR 关节,Aria 路径给的是 21 个 MPS landmark,而 MPS 还额外提供手腕与掌心的法向,OpenXR 不提供。导入阶段要做的第一件事就是把这 26 个关节映射到 21 个 landmark,再从指节重建掌心朝向。
作者做了一次挺硬的一致性检验:把 HumanEgo 发布的一条 Aria 录像改写成 EgoKit episode,走 VREgo 的 PICO 路径重新处理。结果相机位姿、作为训练目标的手部坐标系、抓取标签、运动相位、物体位姿全部对上,报的精度是 0.00 毫米与 0.00 度,全部 864 张训练图像逐像素相同。唯一有差异的是重建出来的掌心朝向,中位差 0.61 度,而它不参与任何训练目标。
动作空间是手腕位姿,不是关节角
策略输出的是手(也就是手腕)的位姿和抓取状态,预测未来 50 帧;机器人夹爪作为一个刚体,闭环跟随这个预测。换句话说,人体这一侧的“关节角”根本没有进入监督信号,手指姿态被压成了开与合一位。
这带来两个后果。好消息是它可以跨设备、跨操作员,因为中间层是任务空间的位姿;坏消息是所有灵巧操作的信息在表示阶段就被丢掉了,多指手、手指内旋、指尖微调这些信息,在后端拿不回来。
夹爪与手之间只有三个对齐量
虚拟夹爪怎么摆,靠三个量,全部按设备从该设备的录像里定,绝不用策略表现去调:
- 夹爪相对手部坐标系的俯仰角,PICO 是 15 度、Aria 是 0 度(Aria 的手部坐标系本身更向下倾)。
- 夹爪上哪一点去跟指尖的捏合点。
- 仿真里的掩码腐蚀多少。另外两片钳口始终保持水平。
这里有个很贵的坑值得记下来。第一次评测时,仿真器把“已经调平”的位姿回喂给策略,于是画进策略图像里的夹爪缺少了训练图像里那 20 到 35 度的横滚,结果没有任何一个策略抓到东西。所有正式结果都是把“指令位姿”回喂给策略之后跑的。这类“训练分布与推理分布差一个约定”的错误,比模型结构问题难查得多。
坐标系:y-up 转 z-up,物体靠三角化
头部位姿先和相机外参合成得到相机位姿,再从 OpenXR 的 y-up 坐标系转到流水线的 z-up。物体不靠 CAD 模型,靠图像里的关键点三角化:每个物体在轮廓上取 20 个点,用 CoTracker3 跟住,然后在一个“物体窗口”里三角化。
参考实现只有一路相机,所以它必须靠头部移动制造视差,Aria 上就是那段走近的 walk-up。VREgo 多一路眼,把同一时刻的第二视角直接塞给三角化器:先做极线校正,再沿同一行做归一化互相关匹配,在原分辨率上匹配,三角化器本身没改。在一段佩戴者站着不动的 60 帧窗口里,对 0.5 到 0.6 米外的静止背景点各三角化两次,只用第二只眼时两次结果差 1.1 到 4.3 毫米,只靠头部运动时差 9 到 925 毫米。
Z=f⋅Bd,d=uL−uR Z = \frac{f \cdot B}{d}, \quad d = u_L - u_R Z=df⋅B,d=uL−uR
这就是双目几何的账:f 是 407 像素的焦距,B 是 64 毫米的基线,d 是同一关键点在左右眼上的横坐标差,Z 是深度。基线固定之后,深度分辨率只取决于匹配精度;而头部运动那条路,基线取决于“人走了多远”,站着不动就直接退化。
结论:没有 retargeting,只有对齐
所以对“有没有 retargeting”这个问题,答案是没有。没有从人体骨骼到机器人关节的逆运动学,没有按机型做的运动重定向,也没有手指到多指手的映射。整个链条是三段:手腕位姿(任务空间)→ 刚体夹爪 → 闭环控制器跟踪。
这让方法很轻:换头显不用改策略,因为两条导入路径都被对齐到同一套表示;换机械臂时,理论上只要重做那三个对齐量——不过论文没做这个实验,这句是我的推断。它也让方法在需要灵巧手的场景里直接失效:因为“手指”这个东西在第一步就不存在了。
采集协议:删掉 walk-up 之后

图 3|三种录制协议各取一条演示:首帧、物体窗口参考帧(橙框)、首次抓取(蓝框),以及整条演示里头部的速度曲线。上为 Aria 走 2 秒近身,中为 PICO 走 1 秒,下为 PICO 站着开录的两步任务。
一个“走近桌子再开始”的动作,看起来只是操作习惯,其实是单目三角化的硬需求。VREgo 把这段删了,代价必须在别的地方补回来。
单目三角化为什么非要走一段
一条 take 的物体窗口里,Aria 的头部移动中位 36.5 厘米,正是那两秒的走近提供了基线;walk-up 本身中位 3.8 秒、约 1 米行程。PICO 任务一虽然也有 walk-up,但因为双目已经给了基线,物体窗口被压到最后一秒,头只移动 6.0 厘米。
这也解释了为什么参考实现的协议里那条“保持物体可见”的要求那么难满足:人一边走一边要盯着桌上的小方块,视线稍微飘一下,物体窗口就废了。作者试录的前 7 条里有 3 条,佩戴者低头看了地板,物体只在最后一秒才进画面。
站在桌边:物体窗口缩到 1 秒
任务二完全去掉了 walk-up:佩戴者站在地面标记上开录,把手垂下来约两秒、同时看着物体,然后开始任务。物体窗口就是这条 take 的第一秒,最后一帧作为参考帧;这些帧随后从操作帧里剔除,避免任何阶段看到两次。任务二 41 条 take 的物体窗口里,头部位姿的中位移动只有 0.8 厘米(0.3 到 1.9 厘米)。
这个协议的收获是双向的。好处是采数据的人不用再练“稳定地走近并保持物体在画面里”这门手艺;坏处是物体必须在整个接近阶段可见,而“看哪儿”这件事,恰恰是人的演示里最不受控的部分。
谁为省下的这段路付账
站着开录把“视差”完全转嫁给了硬件:有双目就没有最小位移要求,没有双目就必须走。这条经验对做采集系统的团队是可迁移的——如果你的采集端只有一路相机,你就必须在协议里写死一段位移,并且要为“操作员没走够”准备检查项;如果有两路,你省下的是协议复杂度,付出的是标定与同步精度。
顺带一个数字:同样的任务一,Aria 的物体窗口 2 秒、头动 36.5 厘米,PICO 的 1 秒、头动 6.0 厘米,两者的物体定位误差分别是 +0.08 厘米和 +0.25 厘米。双目并没有让定位更准,它让定位不再依赖人的动作。
数据规模与成本:一小时 20 条,1.3GB 还是 15GB

图 4|一条两步任务的演示过预处理的五个时刻:上排是流水线实际使用的左眼画面;中排是手臂(红)、托盘(青)、红块(绿)、绿块(品红)的分割掩码;下排是训练图像,手臂被抹掉、虚拟夹爪画在手上、每个物体按它自己的记录画关键点。
这一节把账算清楚:采一条要多久、存一条要多少、处理一条要多久。三个数字决定了“VR 采数据”到底便不便宜。
123 条演示的构成
两个任务、三组数据。任务一是把 5 厘米的绿色方块放到 26×18 厘米的白色托盘上(侧向 ±10 厘米、纵深 ±5.7 厘米),用 PICO 与 Aria 各录一遍同样的 41 个布局,共 82 条。任务二加了动作:先把 4.7×4.7×3.3 厘米的红色积木放到托盘上,再把绿块叠到红块四个凸点上(凸点间距 2.5 厘米),只用 PICO 录 41 条。全部由一个操作员在一间厨房台面上录完。
采集节拍:两次坐班,41 条
任务二的 41 条分两次坐班录完,每次约一小时。按中位 23.7 秒一条算,就是每小时约 20 条、约 8 分钟的可用素材。任务一在两种设备间交替、每五个布局换一次设备,41 条 PICO 素材合计 14.6 分钟,41 条 Aria 素材合计 14.1 分钟。
和参考实现比一下:HumanEgo 报的是每个任务约 30 分钟的人体视频,VREgo 用 14 到 16 分钟就训出了可比的结果。但“素材时长”不等于采集成本,录制、检查、重录才是。作者从原始流里挑出 3 条重录(两条 Aria 任务一,一条任务二的托盘坐标装反了),另外 6 条要修剪。
存储差 11.5 倍,准备时间差一个云端
同样是 41 条任务一,PICO 占 1.3GB(视频加位姿),Aria 占 15GB(VRS 加 MPS 输出),差 11.5 倍。更关键的是准备时间:PICO 录完即可处理,Aria 每条都要上传并等 MPS 跑完 SLAM 与手部跟踪。对一个要采几千条数据的团队,这个差别会直接决定流水线是“当天可用”还是“隔天可用”。
| 项目 | 任务一 Aria | 任务一 PICO | 任务二 PICO |
|---|---|---|---|
| 起始协议 | 走近 2 秒 | 走近 1 秒 | 站定,直立就位 |
| 演示中位时长 | 20.0 秒 | 21.5 秒 | 23.7 秒 |
| 每条训练帧(中位) | 363 | 377 | 616 |
| 41 条素材总时长 | 14.1 分钟 | 14.6 分钟 | 16.2 分钟 |
| 41 条存储 | 15GB | 1.3GB | 未单列 |
| 预处理(中位/条) | 9.0 分钟 | 8.3 分钟 | 12.8 分钟 |
| 通过全部质量门 | 39/41 | 33/41 | 37/41 |
| 40 条训练耗时 | 5.3 小时 | 5.2 小时 | 8.8 小时 |
预处理 8.3 分钟一条才是真成本
预处理的中位耗时是:任务一 PICO 8.3 分钟、Aria 9.0 分钟、任务二 12.8 分钟,一张 GPU 同时跑 3 条。41 条任务二大约是 8.7 个 GPU 小时,墙钟约 3 小时。训练 40 条要 5.2 到 5.3 小时(任务一)和 8.8 小时(任务二,因为每条帧更多)。
预处理里最贵的一步是分割。参考实现每帧、每个提示词都跑一遍 Grounding DINO 加 SAM 2,且不记忆上一帧,占掉处理时间的 60% 到 77%。VREgo 改成在关键帧上检测(每 15 帧一个关键帧,物体窗口里每帧都是关键帧),中间用 SAM 2 的视频预测器把掩码传下去,同样的活只用四分之一到三分之一的时间:一条任务二 take 从 455 秒降到 114 秒。
移植的时候还踩了一个反向的坑:第一版让 SAM 2 把物体窗口里的掩码也传下去,传出来的掩码略大一点,而双目匹配只匹配物体自己的像素,于是边缘关键点匹配到了别处,32 条 PICO take 里有 8 条的物体位置偏了 1.4 到 11 厘米。修正后物体窗口里一律逐帧检测。手臂则始终逐帧独立检测,防止一块白色台面被误判成手臂后一路传下去。
参考实现里藏着四个 bug
这部分对想复现 HumanEgo 的人最有用。作者在改任何东西之前先把流水线跑通,逐个记录:
- 批处理会把第一条之后的录像全部丢掉。
- 抓取输出被解码成了“张开”那个值。
- 推理模板在 NumPy 2.4 下直接崩。
- MPS 的手部位姿与图像错配 1 到 2 帧。
最后一条最伤:改成按时间戳配对后误差不超过 0.16 毫秒,但按原来的配法,41 条 Aria take 里有 40 条会受影响。抓取解码修好之后,与留出 take 标签的一致率从 80.5% 升到 94.2%。这类修复不产生任何“新方法”,却决定了这套流水线能不能复现别人的数字。
实验:flow matching 策略在两个任务上

图 5|100 个未录制布局上的放置成功数随训练演示条数(10、20、40)的变化:任务一两台设备都在 60 到 78 之间,任务二第一步从 28 涨到 94,而“两步都完成”那条虚线几乎贴在地板上。
实验的设置很朴素:不换模型、不换训练配方,只换数据来源和流水线,看策略在仿真里能做到什么程度。这也是它能回答“设备差多少”这个问题的原因——其他变量都锁住了。
策略不是 VLA,是 flow matching 的手位预测器
底座是 HumanEgo 发布的 flow matching 策略:输入图像,加上每只手一个 token(位姿与当前抓取状态)、每个物体一个 token,输出未来 50 帧的手部位姿与抓取状态,用参考实现的配方训 400 个 epoch。仿真侧是 MuJoCo 加 Menagerie 里的 Trossen WidowX AI 臂;相机渲染佩戴者视角,物体掩码直接取自场景,手臂则靠“渲染一个不含手臂的场景”来去除。
这一点必须说清楚:仿真器把物体掩码和去手臂这两件最难的事白送了。所以论文评的是“策略产生了什么动作”,不是“部署系统看到了什么”。
评测口径:什么算成功
每个策略在两类布局上跑:自己的 41 个录制布局(场景按 take 重建),和 100 个没有任何 take 录过的共享布局(同一批参数范围、另一个种子)。共享布局的相机放在该设备训练 take 相机位姿的中位数处。
成功的定义是“回合结束时物体停在目标上”:任务一最多 110 步,任务二最多 170 步且按每个 move 分别计分。判定发生在仿真器清理、张开夹爪之前,所以“夹爪还闭着但物体已经放好”算成功——这条规则让后面那个“一直夹着不放”的失败模式能被单独统计出来。
策略的每个 chunk 都从同一个噪声张量采样,张量在每次评测开始时按种子抽一次,所以一个种子等于一个确定性策略——后面“改输入看输出”的诊断能成立,靠的就是这一点。
任务一:两台设备打平
40 条演示、三个训练种子下,PICO 策略在 100 个没录过的布局上放下 67、74、60 次,Aria 是 73、78、0。那个 0 不是设备问题:Aria 的 seed 9 策略在第一步就宣布任务完成,从头到尾没动过。10 条演示时 Aria 领先(59 对 35);20 和 40 条时两者都在 60 到 78 之间。
| 训练条数 | 任务一 PICO | 任务一 Aria | 任务二 第一步 | 任务二 两步 |
|---|---|---|---|---|
| 10 | 35 | 59 | 28 | 0 |
| 20 | 70 | 66 | 71 | 3 |
| 40 | 67(种子 67/74/60) | 73(种子 73/78/0) | 94 | 2 |
配对比较更严谨:只在“恰好一方成功”的布局上计数,seed 7 是 PICO 独占 16 个、Aria 独占 22 个(p=0.42),seed 8 是 12 对 16(p=0.57)。作者自己说得很直白:训练种子太少,不足以对设备差异下结论。我的读法是:在这套表示和这个任务上,消费级头显没有明显劣势,但也谈不上优势。
任务二:第一步 94%,两步 2%
任务二的成绩单很难看但很有信息量:10、20、40 条演示下,两步都完成的是 0、3、2 个布局;而第一步(红块上托盘)从 28 涨到 94。也就是说,模型学会了“搬一个东西”,但学不会“搬完再搬下一个”。
把结局拆开看更清楚。40 条时,红块放上托盘后被一直夹着到回合结束的有 49 个布局;夹爪张开后再没闭合的 22 个;闭合了但没抓起来的 11 个;抓起来但没放上去的 10 个;真正两步完成的 2 个。94 个把红块放好的回合里,只有 45 个重新张开了夹爪。
开环误差:比“手不动”强多少
除了闭环成功率,作者还报了一个更朴素的开环指标:在留出的那条 take 上,用未来 50 帧的预测手位与真实手位的平均距离,和“手一直不动”这个基线比。
E=150∑k=150∥h^t+k−ht+k∥2 E = \frac{1}{50}\sum_{k=1}^{50}\left\|\hat{h}_{t+k} - h_{t+k}\right\|_2 E=501k=1∑50h^t+k−ht+k2
其中 ĥ(t+k) 是策略预测的手位、h(t+k) 是记录的真实手位,t 是留出 take 上的评测起点,50 是策略的预测视野。
任务一里 PICO 策略是 25 到 28 毫米,手不动是 47 毫米;Aria 是 30 到 34 对 37 毫米。任务二从 43 降到 39 毫米,手不动是 51 毫米。这些数字说明模型确实在预测运动,但也说明它离毫米级精确还很远——而任务二第二步的容差只有约 2 厘米。
两步任务为什么塌:延迟松手与抓取前碰撞

图 6|40 条数据训出的任务二策略在仿真里的两种结局:上排是两步都成的布局 92,绿块放在距中心 2.2 厘米处、回合结束时夹爪一松开就倒;下排是最常见的失败布局 2,红块放上托盘后一直被夹着到回合结束。
作者没有停在“成功率低”这个结论上,而是把 40 条策略在每一个调用点上都探了一遍:固定噪声张量,逐次改输入,看哪个输入决定哪个输出;同时把 41 条演示全部回放到仿真臂上,看轨迹本身能不能传过去。结论是两个彼此独立的机制。
重规划把松手一直推到下一次
第一个机制在闭环里。策略预测的抓取动作跟着“手部 token 当前的抓取状态”走:把这个状态翻一下,155 次调用里有 146 次第一个预测的抓取步就跟着翻;而在图像里重画夹爪、或者把整张图遮黑,什么都不会变。
更关键的是时序。夹爪处于闭合状态时,155 个 50 步的 chunk 里有 144 个确实包含松手,而且总是落在第 48 步。但执行循环每次只走 8 步就重新预测,而那 8 步里手是停着不动的,于是下一次观测与上一次一模一样,chunk 也一模一样,松手永远在第 48 步——永远到不了。
根子在演示数据里:真实的人放下物体后,手指是过了中位 28 帧(约 1 秒)才张开的,这段时间手是静止的。一个只看当前观测的策略没有办法“数”这段停顿。作者引了 Wen 等人关于“动作复制”的工作来解释这个现象:策略把观测历史里的停顿当成了动作的一部分,却看不见时间。
这个失败模式在任务一里不出现,因为任务一不要求松手:PICO 的 40 条策略在 67 个成功回合里只有 9 次自己张开夹爪,Aria 是 73 个里 24 次。一旦任务要求“放下再拿下一个”,它立刻变成致命问题。顺带一提,人的动作在别处也是突发式的:从红块释放到抓绿块之间,22.5% 的张开夹爪帧是静止 8 帧后突然移动 4 厘米以上。
张开的手指先撞到方块
第二个机制在几何上。把 41 条演示回放到仿真臂上,只有 8 条能把绿块叠到红块上,而真人每一条都成功了。检查发现:抓取闭合的那一刻,方块已经被推动了中位 1.5 厘米,22 次检查里有 16 次超过 1 厘米。
原因是夹爪的形状:两片钳口张开 9 厘米宽、整体下倾,最前最低处比捏合点还要低、还要靠前约 2.3 厘米。而人的手是从侧面低位伸进来的——夹爪老老实实跟着人手走,就会在闭合之前先撞到方块。只把抓取点对齐到物体中心,回放成功率从 8 变 7,等于没修。
还有一条线索:试录阶段 Aria 的每一条都没能把绿块叠上去,连回放都不行——抓取那一刻,MPS 沿相机视线给出的手位离绿块还有 1 到 7 厘米。这也是任务二干脆只用 PICO 录制的原因。
回放:训练前的一次数据体检
这两节用到的“回放”值得单独说,因为它是这套流水线里最便宜的质量检查:把每条 take 自己的手部轨迹和抓取标签放到按它重建的场景里,让仿真臂照着走一遍。策略读的是物体在哪、不是重复一条路径,所以回放能测出“记录下来的轨迹能不能被夹爪执行”。
正式训练前还有一道质量门,检查项包括:物体定位是否合理、是否留在画面里;手在“进入画面到松手”之间是否至少 95% 的帧被跟踪到;抓取标签是否每个 move 只闭合一次;画出的关键点是否至少 90% 的帧落在物体上;携带物体的记录终点是否在相机看到的 3 厘米内。
任务二 41 条里有 4 条挂门,全是同一个原因:绿块被定位到关键点散布 1.8 米。有意思的是,其余 37 条里手在所有帧都被跟踪到、标签恰好闭合两次、释放后记录终点离相机看到的位置中位只差 0.3 厘米(红块)和 0.2 厘米(绿块)。质量门不是万能的,但它把“数据坏了”和“策略不行”这两件事分开了。
五条规则把 2% 抬到 93.8%

图 7|40 条数据训出的任务二策略逐条加规则后的成绩:原始策略两步 2 个布局,改写训练记录后 18.0,加 commitment 24.8,加对齐抓取 33.0,加放置 71.0,加 reach 78.0,加自上方接近 93.8。
作者的修法分两半:先把训练记录改写成“夹爪能执行的样子”,再在执行侧加规则。模型、训练配方、控制器、仿真器全都没动——所以这一节的涨幅,全部来自数据表示与执行时序,而不是模型能力。
先把训练记录改成夹爪能执行的样子
改的是手部记录,不是图像。具体四条:
- 握持期间,把手水平移动到被持物体的中心。
- 抓取前 30 帧,先升到抓取点上方 6 厘米,再垂直下落。
- 释放之后垂直向上离开。
- 其余时间里,张开的手保持在 10 厘米内任何物体上方 6 厘米。
只做这一步,41 条演示回放时两步都完成的从 8 条涨到 20 条。随后把这段“抬高”在 14 厘米内淡出、每帧变化限制在 5 毫米,再做一次时间规整:只有手相对上一保留帧移动超过 1.5 毫米、或者接近抓取标签变化时才保留该帧,最后留下 74% 的帧。目的是不让任何一段训练目标“先停住再突然移动”。
用这些记录重训同一个配方,执行循环不变,两步完成从原始策略的 2 个布局涨到 18.0/100(四个噪声种子的均值);而且策略自己会松手了,抱着红块到回合结束的从 49 个降到 5.5 个。
五条执行规则
然后是在执行侧加的累积规则,全程用同一个重训后的策略:
- commitment:夹爪闭合、且某个
chunk计划了松手时,把这个 chunk 一直执行到松手,而不是只走 8 步。 - settled, snapped grasps:计划闭合夹爪的 chunk,如果最近物体在 5 厘米内,就把它横向平移到该物体的估计中心;并且让手臂在闭合点等到工具真正到位再闭,因为控制器的平滑会让工具落后下降目标约 1 厘米。
- placement:夹着绿块时,把 chunk 平移,让绿块在最后一次下降的底部正对红块上方,停在离凸点 3 毫米处,等工具到位再松手;闭合点高于物体中心 3 厘米以上的,压到 3 厘米。
- reach:闭合点离下一个要抓的物体还差 5 到 12 厘米时,把接近延伸到物体上。
- from above:所有对齐过的接近,都先在物体顶面上方 3.5 厘米处移动到正上方,再垂直下落,在同一次调用里闭合。
规则用到的信息分两类:placement 用的是仿真体上关键点算出的绿块与红块位置(也就是仿真器在释放后本来就会做的重定位),reach 用释放信息判断“下一个物体是谁”;其余规则用的是策略自己估计的物体位置。最后还有一条时序规则:如果上一次调用之后工具没动过,就执行 24 步而不是 8 步。
逐条加:18.0 → 93.8
| 累积规则 | 两步都成(4 种子均值) | 抱着红块不放 | 松手后不再闭 | 闭了没抓起 | 抓起没放上 |
|---|---|---|---|---|---|
| 原始策略 | 2 | 49 | 22 | 11 | 10 |
| 重写记录、循环不变 | 18.0 | 5.5 | 49.3 | 8.0 | 17.5 |
| 加 commitment | 24.8 | 0 | 12.5 | 44.5 | 17.0 |
| 加对齐抓取 | 33.0 | 0 | 9.0 | 14.8 | 42.3 |
| 加 placement | 71.0 | 0 | 9.0 | 9.5 | 9.5 |
| 加 reach | 78.0 | 0 | 6.5 | 6.5 | 8.0 |
| 加 from above | 93.8 | 0 | 2.5 | 2.3 | 1.0 |
每一步都在涨:18.0 → 24.8 → 33.0 → 71.0 → 78.0 → 93.8(标准差 1.9,四个种子分别是 91、95、95、94)。最大的一跳来自 placement(33.0 到 71.0)。在此之前,大量绿块被放在红块旁边而不是上面,原因有两个:携带与松手发生在同一个 chunk 里的那些回合,早期版本的放置规则取的是 chunk 起点,也就是绿块刚被抬起的位置;以及策略把松手计划在比凸点低 1.5 到 2.2 厘米处,绿块被压上去、歪掉,一松手就倒。
相对早期那个 64.5 的版本,118 个“布局×种子”回合从失败变成功,1 个从成功变失败。剩下的失败摊到每 100 个回合是:2.5 次手臂停在离绿块 16 到 23 厘米处(靠近臂座)、2.3 次绿块没抓起来、1.0 次绿块没留在红块上、0.5 次红块没放上托盘。
伪代码:带 commitment 的执行循环
仅示意:执行循环,不是原文代码
(按论文 5.3 与 5.4 的文字描述重写)
输入:pi、scene、N(任务二 170)
g <- open
loop k = 1..N:
obs <- scene.render(相机中位位姿)
chunk <- pi(obs, hand(pose, g))
# commitment:执行到松手为止
if g 闭合 and 含松手步 r:
chunk <- chunk[1..r]
# snapped:闭合点对齐物体中心
if chunk 计划闭合 and 近物<5cm:
chunk <- 平移到物体中心
# placement:绿块对准红块
if 夹着绿块:
chunk <- 绿块对红块 3mm
for st in chunk[1..8]:
scene.step(st); g <- st.grasp
if 回合结束: break
这段伪代码里三处不是模型的东西:commitment 改变了“执行多长”,snapped grasp 改变了“在哪闭合”,placement 改变了“在哪松手”。整段实验读下来就是这样:模型学会了搬,规则教会了它放。
93.8% 里有多少是模型挣的
作者自己给了三条限定,我认为这是全文最诚实的一段。第一,五条规则是在用来评分的同一批 100 个布局上、看着失败案例设计出来的,只用一个训练种子,所以 93.8 是乐观估计,要等新布局和其他任务来验。第二,几条规则依赖任务特定信息:reach 与 from above 作用在“释放之后下一个要抓的物体”上,placement 需要绿块和红块的高度。第三,placement 依赖理想的重定位,真机上得靠跟踪或重检测来提供。
换个角度看,图 7 里那条几乎贴在 100 的实线(红块上托盘)说明“第一步”早就不是瓶颈;虚线(两步都成)才是被规则抬起来的那条。所以更准确的表述是:这套 VR 数据足以学出“抓、搬、放”这个原子动作,但学不出“连续两个动作的编排”,后者目前是用规则兜住的。
VR 数据的天花板、局限与落地判断
这一节把论文里散落的失效点收拢,按“数据本身的物理限制”和“这套实现的选择”分开。前者换实现也躲不掉,后者是工程债。
手部遮挡:跟踪比相机早 2.4 秒看到手
头显的手部跟踪不依赖相机,所以它能在手进入画面之前 2.4 秒就给出关节位置,而一只悬垂放松的手,指尖读数是“闭合”。如果不加“进画面前一律记为张开”这条规则,几乎每条 take 的开头都会多出一次假抓取。
另一头是遮挡:等待轮次的物体(比如还躺在桌上的绿块),在手从它上方经过时会丢掉点跟踪,而且不会恢复。这就是为什么物体要“按记录绘制”而不是“每帧重新检测”——检测框一抖,关键点就跳。作者还遇到一例:提示词把旁边的红块也框进了绿块的掩码,两个游离的关键点把绿块挪了 4 厘米。
没有触觉、没有力反馈
整条链路里没有任何力或触觉通道。抓取是“两个指尖的距离”,放置是“位置到了就松手”,接触力完全不可见。所以夹爪会先撞到方块再闭合(前面那个 1.5 厘米),会发现不了“压得太用力”,也不知道物体有没有滑。
论文里“停在离凸点 3 毫米处再松手”这种规则,本质上就是在用几何余量替代力反馈。对做柔性物体、插装、拧螺丝的团队,这不是“再加点数据”能补的洞。
尺度与被假设的朝向
所有物体被要求与桌边平行摆放,因为流水线只定位位置,并给每个物体固定的直立轴。一旦物体可以任意朝向,抓取点与放置点都得重算,而论文没有做这件事。
尺度的边界更硬:训练与评测都在同一张厨房台面、同一组尺寸上,没有跨场景、跨尺度实验。共享布局的相机干脆放在训练 take 相机位姿的中位数处——真实部署里相机装在哪,是另一个问题。
仿真专属:评的是动作,不是感知
作者在讨论里明确列了三条:所有结果来自仿真;仿真器直接给物体掩码、并用“渲染不含手臂的场景”来去手臂,所以评测打的是动作质量,不是部署系统的感知;对齐夹爪的那套装置是作者自己搭的,按设备用规则设定,不是通用标定流程。
还有一条容易被忽略:机械臂在每个布局里都停在相对“第一个被抓物体”相同的位置,所以 reach 根本没被测到。这也解释了为什么后面的 reach 规则能一次涨 7 个点——它补的正是评测里没覆盖的那部分。
规则是对这 100 个布局过拟合的
五条规则在设计时就看着这 100 个布局的失败案例,评的也是这 100 个布局,只用一个训练种子。四个噪声种子重复的是同一批布局,作者自己说这些比较只能“描述性”地报告。
要判断这套规则能不能迁移,至少还需要三样东西:新布局、其他任务、别的头显;论文结论里也把这三样(加上更多训练种子与真机实验)列为后续工作。
什么团队值得试
- 工位固定、物体类别少、朝向基本规整的桌面操作,比如分拣、上料、简单装配的上游动作。
- 已经在用 HumanEgo 或 EgoMimic 那套“手轨迹加物体关键点”表示的团队,换成头显几乎零成本。
- 需要把演示量从几十条堆到几百条、并且能接受一条 8 到 13 分钟预处理的团队。
- 采集端有双目、愿意在协议里加“站定两秒看着物体”这类约束的团队。
- 想先验证“这个任务人类演示够不够”的团队:回放这一步比训练便宜得多,也更早暴露问题。
什么团队别碰
- 需要力控、柔性物体、插装、需要知道“有没有滑”的任务。
- 物体朝向任意、堆叠杂乱、需要跨尺度的场景。
- 期待“录完直接上真机”的团队:论文没有真机结果,作者明说成功率不是对真机的预测。
- 想要灵巧手、多指操作的团队:手指姿态在表示阶段就被压成了开与合。
- 只愿意投一次采集、不愿意投预处理与规则工程的团队:这条流水线的成本大头在后半段。
术语速查
| 术语 | 论文里的含义与我的理解 |
|---|---|
| 第一人称演示 | 用人头戴设备录下的操作过程,本文里同时含图像、头部位姿、手部关节与物体关键点 |
| take | 一条完整的演示录制,从开头到动作结束;本文两个任务各 41 条 |
| walk-up | 从房间另一侧走近桌子的那段动作,单目三角化靠它产生视差 |
| 物体窗口 | 用于三角化物体关键点的时间段,Aria 是 walk-up 最后 2 秒,PICO 是 1 秒,站立协议是首秒 |
| 抓取标签 | 拇指与食指指尖距离小于每条 take 自己的阈值时为闭合,用来携带物体与驱动夹爪 |
| 质量门 | 训练前的自动检查,覆盖物体定位、手部跟踪率、标签闭合次数、关键点落在物体上的比例 |
| 回放 | 让仿真臂照着某条 take 自己的手部轨迹走一遍,用来验证数据能否被夹爪执行 |
| chunk | 策略一次预测的 50 步手位姿与抓取状态;执行循环通常只取其中 8 步 |
| 开环误差 | 留出 take 上预测手位与真实手位的平均距离,对照基线是“手一直不动” |
| 时间规整 | 只保留手移动超过 1.5 毫米或接近标签变化的关键帧,避免训练目标里出现长停顿 |
| 噪声种子 | 策略采样用的固定噪声张量,一个种子等于一个确定性策略,便于逐调用诊断 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)