这张接触表本来只是上机前的例行体检:把 54 集里「闭爪前一瞬」的画面拼在一起,看构图散不散。表本身是干净的。但把每集第 0 帧的颜色量出来之后,发现这份被当作一份数据的集子,其实是两批不同光照下录的,28 / 26 对半劈,而且分界是一个台阶不是渐变。更麻烦的是:09-06 实测的现场光照,两批都不像。
xlerobot-left-pick-cup-sep3-clean-20260905 的 54 集在视觉上不是一个分布。
ep0–ep27 绿红比中位 1.28,ep28–ep53 中位 0.98,中间没有过渡。
之前报告里记的「这份集是 1.21」是双峰分布的平均数 —— 两半都不长这样。
grasp_sight_check.py --dataset xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905,48 秒。先说这张表可信的依据,不是「看着挺好」:
第二条是这次真正的防呆。同一段代码在修好之前写死用右臂夹爪那一维(dim 11),拿这份左臂集跑的结果是:54 集全部落在第 0 帧,而且不报错 —— 拼出来是一张「手臂还在起点」的表,看上去像张正常的表。左臂夹爪是 dim 5。
把每集第 0 帧头相机整幅画面的平均 R、G、B 算出来,取绿红比 G/R。1.0 = 绿红相等(中性),所以基线画在 1.0,柱子往上=偏绿。
每集第 0 帧头相机全幅均值,PyAV 顺序解码,2026-09-07 实测。悬停看单集数值。
| 批 | 集号 | 集数 | G/R 范围 | 中位 | 亮度中位 |
|---|---|---|---|---|---|
| 偏绿 | ep0–ep27 | 28 | 1.179 – 1.363 | 1.28 | 102.3 |
| 中性 | ep28–ep53 | 26 | 0.970 – 0.983 | 0.98 | 108.9 |
分界是台阶,不是渐变:ep27 = 1.271,ep28 = 0.978。相邻两集之间掉了 0.29,而各批内部的全部波动加起来也没这么大。这不是灯慢慢变了,是中间换过一次光(或者开了灯 / 天亮了 / 换了房间)。
| 集 | G/R | 亮度 | 批 |
|---|---|---|---|
| ep0 | 1.239 | 100.5 | 偏绿 |
| ep1 | 1.213 | 102.4 | 偏绿 |
| ep2 | 1.196 | 102.3 | 偏绿 |
| ep3 | 1.227 | 104.2 | 偏绿 |
| ep4 | 1.220 | 102.3 | 偏绿 |
| ep5 | 1.179 | 103.0 | 偏绿 |
| ep6 | 1.363 | 102.7 | 偏绿 |
| ep7 | 1.260 | 103.2 | 偏绿 |
| ep8 | 1.202 | 101.6 | 偏绿 |
| ep9 | 1.205 | 98.8 | 偏绿 |
| ep10 | 1.277 | 105.8 | 偏绿 |
| ep11 | 1.311 | 106.0 | 偏绿 |
| ep12 | 1.320 | 99.9 | 偏绿 |
| ep13 | 1.298 | 99.9 | 偏绿 |
| ep14 | 1.314 | 100.4 | 偏绿 |
| ep15 | 1.291 | 102.0 | 偏绿 |
| ep16 | 1.264 | 100.9 | 偏绿 |
| ep17 | 1.296 | 101.7 | 偏绿 |
| ep18 | 1.306 | 102.5 | 偏绿 |
| ep19 | 1.324 | 98.3 | 偏绿 |
| ep20 | 1.328 | 101.7 | 偏绿 |
| ep21 | 1.337 | 104.1 | 偏绿 |
| ep22 | 1.322 | 104.3 | 偏绿 |
| ep23 | 1.311 | 100.1 | 偏绿 |
| ep24 | 1.278 | 105.6 | 偏绿 |
| ep25 | 1.282 | 101.1 | 偏绿 |
| ep26 | 1.259 | 106.0 | 偏绿 |
| ep27 | 1.271 | 102.7 | 偏绿 |
| ep28 | 0.978 | 109.3 | 中性 |
| ep29 | 0.975 | 109.5 | 中性 |
| ep30 | 0.975 | 107.4 | 中性 |
| ep31 | 0.972 | 107.4 | 中性 |
| ep32 | 0.975 | 108.0 | 中性 |
| ep33 | 0.977 | 107.1 | 中性 |
| ep34 | 0.978 | 109.6 | 中性 |
| ep35 | 0.976 | 109.1 | 中性 |
| ep36 | 0.976 | 108.6 | 中性 |
| ep37 | 0.977 | 106.4 | 中性 |
| ep38 | 0.973 | 106.6 | 中性 |
| ep39 | 0.978 | 105.4 | 中性 |
| ep40 | 0.976 | 108.7 | 中性 |
| ep41 | 0.970 | 107.8 | 中性 |
| ep42 | 0.983 | 106.6 | 中性 |
| ep43 | 0.983 | 106.9 | 中性 |
| ep44 | 0.982 | 106.9 | 中性 |
| ep45 | 0.982 | 108.3 | 中性 |
| ep46 | 0.978 | 108.2 | 中性 |
| ep47 | 0.979 | 107.5 | 中性 |
| ep48 | 0.978 | 108.8 | 中性 |
| ep49 | 0.976 | 103.2 | 中性 |
| ep50 | 0.979 | 107.8 | 中性 |
| ep51 | 0.978 | 108.9 | 中性 |
| ep52 | 0.974 | 107.7 | 中性 |
| ep53 | 0.974 | 108.4 | 中性 |
train-left-2026-09-06.html 里记过两个数,现在要一起重读:
CURRENT-STATUS.md 的开放风险。state_regime_sweep.py 测出的 pan 斜率 +0.006、elbow 斜率 −0.004。
那个测法有缺陷:它只取动作块的第一步,而且只在起手位测 ——
手臂停在 home 位时第一步本来就只挪一点点,杯子在哪都差不多,于是任何模型测出来都接近 0。
同样的缺陷当天已经在右臂上被发现并修正,我却把带着它的数字先发布到了这一页。工具改成 chunk_sweep.py:reset 一次连抽 50 步拿到整条计划,用计划终点对杯位回归;
并在够取过程的 phase 0.35 / 0.70 各测一次(起手位斜率天然 ≈ 0,没有分辨力)。
同时把 sep3-clean 的两批光照分开各测一次(ep0–27 / ep28–53,分界见第三节):
| 批次 | phase | 杯位跨度 | pan 斜率 | pan r | elbow 斜率 |
|---|---|---|---|---|---|
| A:ep0–27 | 0.35 | 43.8° | +0.538 | +0.618 | −0.057 |
| A:ep0–27 | 0.70 | 43.8° | +0.990 | +0.998 | +0.364 |
| B:ep28–53 | 0.35 | 58.7° | +0.955 | +0.995 | −0.370 |
| B:ep28–53 | 0.70 | 58.7° | +0.949 | +0.995 | +0.220 |
核对 train_config.json 时发现,这一轮左臂训练的图像增强是关着的
(image_transforms.enable = False),而同期右臂那一轮是开着的
(ColorJitter 亮度/对比度/饱和度/色相 + 仿射)。
这一条此前没人记录,而它正好落在光照这个话题上:一份本来就有两种光照的数据,训练时不做任何颜色扰动。
下一轮左臂训练应当 AUG=1,理由不是"修数据",而是光照本来就是要泛化的东西 ——
机器人会被搬到会场,现场光照和这两批都不同。按这个角度看,双峰不是要消除的杂质,
是仅有的一点光照多样性;去"清洗"成单一光照反而会让泛化更差。
同一次横扫顺带查出来的,和光照无关,但影响所有左臂模型的实机表现:
sep3-left/020000 的恒定维(训练集里 std == 0)共 9 个:
right_arm_shoulder_pan / shoulder_lift / elbow_flex / wrist_flex / wrist_roll / gripper
x.vel / y.vel / theta.vel
录左臂数据时右臂不动、底盘不动,所以这九维在 13,693 帧里是常数,训练统计量的标准差恰好是 0。
而 lerobot 的归一化是 processor/normalize_processor.py:359:
denom = std + self.eps # eps = 1e-8,std==0 没有任何保护
return (tensor - mean) / denom
推理端已修(run_policy_trials.py 的 install_state_guard(),2026-09-08):从 checkpoint 自己的统计量推出所有 std==0 的维度,喂给策略前钉回训练均值。不硬编码哪条臂,左右通用。
跑左臂模型之前确认日志里有这一行:
== state 恒定维保护【已启用】: 9 维在训练集里恒定(std==0),喂给策略前钉回训练均值
看不到这一行就是没生效,那一批数据不作数。下次录左臂数据时不该再留这个雷 —— 要么让不动的那条臂真的报数,要么明确不把它放进 state。
09-08 从右臂数据里量出来的四条要求,对左臂一模一样成立,见 Recording guide(英文,可直接发给队友):
xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905(54 集 / 13,693 帧)03-software/scripts/grasp_sight_check.py(左右臂判定来自 dataset_dims.py,取自提交 522cf2a)