← 全部报告
诊断症状 → 原因 2026-08-23

看到什么现象 → 可能是什么原因

跑完一批实机试验,按实际看到的现象找那一条。 每条原因都写了可能性、机理、怎么验、怎么修、在哪做。 已经用数据排除的会明说是哪个数字排除的 —— 不留模糊。

为什么「系统性」三个字很重要。随机误差不会一直偏同一边。 一旦你看到的是方向一致的偏移(总是偏右、总是偏上), 那基本可以排除「模型学得不够准」这种笼统解释 —— 它指向一个确定的、可以定位的原因:视角、标定、或者某个位置的数据缺口。

抓夹系统性偏右 / 偏左 —— 左爪片没落在杯子左边

高 头部相机视角变了(pan 方向)🤖 机器旁

策略是拿【像素位置】学的:训练时「杯子在画面偏左 → 手往左移这么多」。相机一转,整个场景在像素上平移,策略照旧按像素反应,于是手臂系统性偏一边。★ 这是最能解释【系统性、方向一致】偏移的原因 ★ 随机误差不会一直偏同一边。

怎么验:面板「头部相机对准」→ 勾「叠上训练时的画面」→ ◀▶ 翻五张不同杯位,每张构图都要对得上

怎么修:重新对准头部,直到五张参考帧都能叠合

高 覆盖失衡:右侧杯位几乎没进训练☁️ AutoDL

实测:右侧 pan +22.9° 那个杯位只有 4 集,而 eval_split=0.2 又切走 2 集 —— 模型实际只见过 2 集,失衡 11 倍。没学过的位置,输出会退化到训练分布的均值,也就是往数据最多的那一侧(pan −30.5°,22 集)偏。

怎么验:面板「数据可用性」→「覆盖体检」

怎么修:EVAL_SPLIT=0 重训 + 补录右侧杯位

中 舵机零点漂移 / 机械松动🤖 机器旁

关节零点一变,同样的关节角对应的笛卡尔位置就整体平移。这是纯机械问题,跟策略无关,所以【重放录制动作也会同样偏】。

怎么验:★ 重放对照实验 ★ --replay-episode 0 --send(不加载模型,直接重放录制动作)

怎么修:重放也偏 = 硬件动过,重新标定;重放不偏 = 排除这条

中 换了抓夹但没重新标定🤖 机器旁

爪长变了,学到的「关节角 → 接触点」映射整体平移。

怎么验:对比当前爪与录数据时的爪长

怎么修:measure_table.py --pivot 重新标定

抓夹整体偏上 —— 没有下探到杯沿高度就横过去了

高 覆盖失衡(★ 有直接测量证据 ★)☁️ AutoDL

实测 集数 vs 抓取深度 r = −0.89:
pan −30.5°(22 集)闭爪 z=0.028 ← 抓得最深
pan +22.9°( 4 集)闭爪 z=0.038 ← 抓得最浅(就是「偏上」)
数据越少的位置抓得越浅越散。模型的弱点就是数据的弱点。

怎么验:面板「数据可用性」→「覆盖体检」,看各杯位的闭爪 z

怎么修:补录数据少的杯位;EVAL_SPLIT=0 用全部数据重训

高 头部相机视角变了(pitch 方向)🤖 机器旁

同上一条的机理,只是方向变成上下:相机往下俯一点,画面里桌面显得更近,策略就以为已经够低了。

怎么验:叠图对比,看地平线和桌沿在画面里的高度

怎么修:重新对准头部

中 桌面标定过时 / GRIPPER_LEN 不对🤖 机器旁

安全层的 z_min 约束的是腕部不是爪尖:z_min = 桌面高度 + 爪长。当前 GRIPPER_LEN=0.159、右臂 z_min=+0.02。爪长一变或桌面没重标,手就停在错误高度。

怎么验:z_min − 0.159 是否等于实测桌面高度(当前反推 −0.139)

怎么修:measure_table.py --pivot,然后更新 teleop_safety.yaml

已排除 安全层把手拦住了🖥️ 面板

最近几批拒帧率 0.0~0.52% —— 安全层几乎没拦过东西。这条已经用数据排除。

怎么验:看「实机试验」卡上的拒帧率

怎么修:不用动

中 欠训☁️ AutoDL

batch=2 × 20000 步 = 只过了约 2 遍数据(官方配方是 66 遍)。欠训的模型输出趋于保守,幅度偏小。

怎么验:面板「训练交接自检」看 batch

怎么修:租卡,BATCH=32

抓到了但滑掉 / 拿起来又掉

高 摩擦力不足🤖 机器旁

98A 实测就是「柔度够但摩擦力不足」。这是材料问题不是几何问题。

怎么验:手动测:抓起装水的杯子横向拨一下

怎么修:装 82A 尖端弹性夹

高 抓得太浅(同「偏上」)☁️ AutoDL

闭爪 z 越大越浅,浅了只夹住杯口一点点。

怎么验:覆盖体检看闭爪 z

怎么修:同上

几乎不动 / 动作幅度极小

已排除 速度档把动作截断了🖥️ 面板

--speed 乘在步长上限上:0.3 档时钳位率 47.7%,1.0 档只有 2.7%。但 1.0 档已经跑过 0/10,所以这条不是主因。

怎么验:看钳位率

怎么修:speed 1.0

中 动作块播放太慢🖥️ 面板

训练是 30 Hz 录的,本机推理约 8 Hz。chunk-rate=1 时 50 步的计划要播 6 秒,看上去就像手臂在慢慢挪。auto 档按真实时间播放。

怎么验:试跑卡的「动作块」选 auto

怎么修:chunk-rate=auto

只在某一个杯位失败,别的位置正常

极高 覆盖失衡(几乎必然是这个)🤖 机器旁

这个症状的形状本身就指向数据:模型在哪个位置数据少,就在哪个位置失败。实测右侧只有 2 集进训练。

怎么验:覆盖体检,看失败那个位置有几集

怎么修:补录那个位置到和最多的一组相当

两条互相印证的证据

杯位 pan集数闭爪 z(越大越浅)组内 σ
−30.5°220.028 ← 最深0.0063
−10.2°70.0350.0101
+8.8°170.0340.0118
+22.9°40.038 ← 最浅(就是「偏上」)0.0141

集数 vs 抓取深度 r = −0.89;集数 vs 组内散布 r = −0.75。
数据越少的位置,抓得越浅、越散。模型的弱点就是数据的弱点 —— 这不是需要更好的训练技巧,是需要更均衡的数据。

而且 --dataset.eval_split=0.2 按集号顺序切最后 20%, 集号又恰好按杯位从左到右排 —— 所以右侧那 4 集里又被切走 2 集, 模型实际只见过 2 集,失衡从 5.5× 恶化到 11×。

诊断顺序(从便宜到贵)

做什么能排除什么成本
1看拒帧率(面板上现成的)安全层拦截、策略输出越界0
2叠图对比头部视角,五张不同杯位相机视角变了(能同时解释偏右和偏上)2 分钟
3覆盖体检覆盖失衡1 分钟
4★ 重放对照实验 ★
--replay-episode 0 --send
最干净的一刀:不加载模型,直接重放录制动作。
重放也偏 = 硬件几何变了;重放不偏 = 策略学得不对
5 分钟
5换 checkpoint 对比该不该继续训20 分钟
6重训—租卡 1~2 小时
XLeRobot build reports · 2026-08-23 · 配套:行动清单 · 模仿学习入门 · 微调指南