今天在四个 checkpoint 上跑了 16 次实机抓取,0 成功。最后八次样本量够大,把「这个模型在当前设置下抓不到」变成有统计支撑的结论(95%CI 0–36.9%)。这一页记录:操作者观察到的四个现象里哪些是真的、量出来的两个真实缺陷、以及被证伪的那些路 —— 后者同样重要,能省下再走一遍的时间。
现场观察:①左右转不够 ②张开太晚撞到杯子 ③往杯子伸出不够 ④闭爪有点早。把每一条对着示范集量出来:
| 观察 | 示范中位 | 实机中位 | 实机/示范 | 判定 |
|---|---|---|---|---|
| ① 左右转的幅度 | 23.5° | 26.2° | 1.12× | 转得更多,不成立 |
| ② 张开时已伸出多少 | 35.9% | 36.1% | 1.01× | 几乎一模一样,不成立 |
| ③ 最远伸出多少 | 58.5° | 77.8° | 1.33× | 伸得更远,不成立 |
| ④ 闭爪时已伸出多少 | 99.8% | 52.1% | 0.52× | 真的 |
另外三条是这一条造成的错觉。操作者是在闭爪那一刻观察的,而闭爪发生在整条轨迹的一半 —— 那时手臂当然还没转到位、也没伸到位。它后来都走到了。
「张开太晚」也是同一件事:张开的时刻其实很准(36.1% vs 35.9%),但闭合从 100% 提前到 52%,张开→闭合的窗口从 64% 行程压缩到 16% —— 爪子刚张开就合上,看起来像来不及张开。
最后八次每次记录了杯位档号,回归「杯位 → 闭爪时的 pan」:
闭爪时的 pan 斜率 +6.72 度/档 r=+0.857 增益 0.59
轨迹最终的 pan 斜率 +7.15 度/档 r=+0.686 增益 0.63
(示范里相邻档位杯位相差约 11.4 度,「跟得住」应该是 1.0)
而离线测量显示模型有这个能力:从够取过程中段起手、看整条 50 步计划,斜率是 1.02(r=0.98)。但从 home 位起手时是 −0.03 —— 完全不瞄。真机每次都从 home 开始,走不到会瞄的那一段。
| 起手位置 | 计划终点与杯位的斜率 | r |
|---|---|---|
| phase 0.00(home) | −0.03 | −0.10 |
| phase 0.35(中段) | +0.90 | +0.89 |
| phase 0.70(接近) | +1.02 | +0.98 |
| 猜测 | 怎么排除的 |
|---|---|
| 安全层把动作削掉了 | 六条 trace 逐帧比对 raw 与 safe,pan 维被钳帧数 0/95、0/241、0/254… 全是 0。策略自己只发到那儿。 |
| 爪面朝向(wrist_roll)没转 | 示范里 wrist_roll 与杯位完全无关(r=+0.032,斜率 0.006,40 集只在 ±5° 内晃)。爪面朝向本来就跟着整条臂转,模型输出常数是学对了。 |
| 相机角度偏了 | head_1 −3.69° / head_2 +49.83°,与训练集(−3.692 / +49.846)吻合到 0.02 度。三个数据集的头部角度也彼此一致。 |
| 加「手臂稳了才许夹」的闸 | 实机闭爪前 0.5s 的 pan 角速度 0.04~3.34 度/秒,六次全部低于示范 p95(6.16)。这个闸一帧都拦不到。 |
| 加「多少秒内不许夹」的时间闸 | 做了并上机跑过。闸在 7.4 秒放行、只拦下 9 帧,而真正的闭爪发生在 27.7 秒 —— 判据选错了维度。(它还有个 bug:对象没按次重置,第 2 次起就失效,已修。) |
缩短执行视野 --exec-horizon | 「执行 1–5 步优于 20 步」的前提是模型有视觉增益、只是被开环时长浪费。这里增益本身就不在起手段,每 0.3 秒重看一次也只修正需要量的 4%。开关已加好,但不是主线。 |
| 给一个固定的横向补偿(观察到偏右约 2 cm) | 偏置随阶段变:中段 +3.12°(≈1.3 cm 偏右),接近段 −0.98°(≈0)。固定补偿会在接近段把它推过头。 |
mean=0, std=0;而 lerobot 的归一化是 (x−mean)/(std+1e-8),对 std==0 没有任何保护。真机上左臂是连着的、报真实角度。install_state_guard() 从 checkpoint 自己的统计量推出所有 std==0 的维度,喂给策略前钉回训练均值。不硬编码哪条臂;只改喂给策略的那一份,安全层继续看真实 17 维。两个缺陷都不能在推理端打补丁:闭爪时机要知道「总行程」,而那是跑完才知道的;横向增益是模型本身的性质。都要靠数据和重训。
| pan 斜率(今天一直在用) | 闭爪@行程(建议改用) | |
|---|---|---|
| 参考值方差 | ±0.05 噪声底 | 98.2~100%,近乎为零 |
| 区分度 | 八个模型全落在噪声里 | 现役 52%,差距近 2 倍 |
| 重跑稳定性 | 同模型三次给 +0.086 / +0.041 / −0.006 | — |
| 物理含义 | 间接 | 直接对应「夹的时候到没到位」 |
trace_timing.py 每次跑测自动输出这一列。torch.manual_seed 就是配对比较 —— 实际没控制住流匹配的采样,同一模型同一喂法三次给三个数。±0.05 是噪声底,小于它的差异不能读。predict_action 只返回第一步。这条是操作者指出来的,也是最要害的一条。trials-20260908-172208.json(0/8,95%CI 0–36.9%)trace_timing.py(闭爪时机与行程)· chunk_sweep.py(整块 + 分阶段视觉斜率)· state_regime_sweep.py(四种 state 喂法)· camera_ablation.py(逐路相机遮盖)