← reports index
现场清单 · 2026-09-04

明天要干什么 —— 2026-09-04 交接

写给明天到现场的组员。按依赖排序,从上往下做。
每一条都写了:谁做 · 多久 · 做完长什么样。
三份 GOAL 是背景,这一份是动作清单,只读这份就能开工。

★ 今天起有一个专门的现场控制台 ★ —— http://100.107.145.111:8792/
(口令和 8770 面板同一个)。下面第 1–7 步每一步都有对应的按钮,
手机上就能点,不用去翻那个有二十张卡的完整面板。
拍的照片自动落在 05-training/onsite/。
底部有一个常驻的软件急停按钮。
文字说明留在这里是为了让你知道为什么要做每一步;操作走控制台。

★ 时间不够就按这个顺序做 ★

有多少时间做到第几项做完能得到什么
15 分钟1 + 2头部预置位 + 空桌参照图 —— 两件都是别的工作的地基,加起来不到 15 分钟
1 小时1–3再加上:一批算数的试跑数据(模型第一次被认真测过)
半天1–5再加上:深度状态确认 + 相机内参素材
更多6–8手眼标定、重录深度、展示动作测速

第 3 项(跑测模型)是今天信息量最大的一件,但它依赖第 1 项。 第 2 项是今天新增的,两分钟,价值被低估了 —— 理由见那一节。


0. 昨夜(09-03 → 09-04)新增了什么,会影响你怎么操作

变化你会看到
面板多了「预注册」输入框实机试跑卡里,速度/时长那一排下面。默认判据已经替你填好了 —— 看一眼觉得没问题就直接开跑
成功率显示成 k/n + 95% 区间不再只有百分比。0/4 和 0/23 现在一眼能分出来
每批标「已预注册」或「探索性」没填判据的批次 = 探索性,不参与结论
失败模式分布 + 子目标漏斗有数据才画。老批次没有,正常
试验记录写成 schema v2多了 trace 文件名、failure_mode、preregistered 等字段。老文件一个字节没动

8770 面板已重启,改动已生效。 安全层一行没改。


1. ★ 先做这个:把头送到 trial 姿态 ★

<span>现场 · 20 秒 · 一个按钮 · 不要手动瞄</span>

标准视角 = cup-grasp-v0(操作者定的),已经复制成预置位 trial(pan 2003 / tilt 2619)。

怎么做:现场控制台(8792)步骤① → Go to trial pose → 卡片变绿。完事。

别用 9-2 那批的姿态:头是抬着的(tilt 2261),画面里看到桌子对面的椅子,和部署视角不一致。

留个记录:数据集里记的头部 state(0826、9-3)读出来是 tilt≈2332,离这个姿态 287 tick;在现场的操作者说真实角度是 cup-grasp-v0,以操作者为准。

只有在杯子完全看不见的时候才允许微调(折叠在步骤①里),而且动了要告诉远程。
顺手的一件事:按一次 ↑ 看头是不是真的抬起来 —— 我们从画面推断 tilt 变大 = 低头,请确认一次。

做完的样子:头相机画面和昨天录制时一样。


2. ★ 新增:拍一张「空桌参照图」★

<span>现场 · 2 分钟 · 今天性价比最高的一件</span>

为什么突然多了这一项:今天远程那边把杯子检测跑通了 —— OWLv2 + 背景差 在 36 帧里出 15 个框、15 个全是目标杯,零错误, 这是整轮调查里第一个没有错误的配置。

但那个「背景」是凑出来的:他们没有空桌照片,只能拿同一数据集跨集取逐像素中位数当替代品, 而中位数里混着机械臂的运动残影。也就是说,现在那个 100% 是在被污染的参照上拿到的 —— 是下界,不是上界。

你拍一张真的,这一层的效果只会更好。

怎么拍

  1. 先按「Go to trial pose」把头送到标准视角(第 1 项),拍完不要再动头
  2. 桌上什么都不要放 —— 没有杯子、没有瓶子、没有 VR 手柄
  3. 手臂移开画面,或者至少移到平时不会去的地方
  4. 在现场控制台点「① 拍空桌」 —— http://100.107.145.111:8792/ (口令和面板同一个)。图会自动存到 05-training/onsite/,不用记路径
  5. 顺便再拍一张有目标杯、其它什么都没有的,做对照

一个会让它静默失效的前提

⚠ 背景差要求参照图和运行时的相机位姿一致。
试跑期间头是锁死的,所以一场之内没问题;
但换了头部预置位就必须重拍参照图,否则这一层会安静地失效,不报错。
这条要写进操作流程。

做完的样子:两张头相机图 —— 一张纯空桌、一张只有目标杯,头在 trial 位。 告诉远程文件名就行。


3. ★ 跑测已训练好的模型 ★

<span>现场 · 每个模型约 25 分钟 · 这是今天最有信息量的一件事</span>

3.1 ★ 只有一个模型该跑 ★

换夹爪之后录的数据是 xlerobot-right-pick-cup-20260826-0042。 查了每个 checkpoint 的 train_config.json,用它训过的只有一个:

checkpoint训练数据换爪后?已跑测
xlerobot-smolvla-right-pick-b16-3cam-u20k/020000…right-pick-cup-20260826-0042✅★ 一次都没跑过 ★
xlerobot-smolvla-cup-grasp-right-b8-u20k/020000…cup-grasp-20260820-0230❌0/4
smolvla_20260820-1502/016000(= last)…cup-grasp-20260820-0230❌6/50
smolvla_20260820-1502/018000…cup-grasp-20260820-0230❌从没跑过
a100-6000/006000…cup-grasp-20260820-0230❌0/23
act_20260820-0429/*…cup-grasp-20260820-0230❌从没跑过

除第一行外全部归档,今天一个都不要跑。 它们是给旧夹爪训的, 在现在这副爪子上跑出来的数任何方向都不能用 —— 好看不能信,难看也不算数。

顺带一个值得知道的事实:我们全部 114 次试验、8/83 的成绩,
跑的都是换爪前的模型。也就是说,当前这副夹爪上,我们其实一次正经试验都还没做过。
今天这一批是第一批。

3.2 只跑一个模型,所以可以跑得更多

原计划两个模型各 10 次。现在只剩一个,同样的时间应该全给它 —— 建议 20 次。

结果跑 10 次跑 20 次
全失败0/10(95%CI 0–30.8%)0/20(95%CI 0–16.8%)
两成2/10(95%CI 2.5–55.6%)4/20(95%CI 5.7–43.7%)
一半5/10(95%CI 18.7–81.3%)10/20(95%CI 27.2–72.8%)

同样的成功比例,20 次的区间窄一半左右。 而且如果结果是全失败, 0/10 只能说「真实成功率可能高达 31%」,0/20 能压到 17% —— 这才说得出话。

预注册里的「计划次数」记得跟着改成 20(面板里那个数就是你选的 trials)。

时间不够就跑 10 次,但不要为了凑两个模型而各跑 10 次 —— 另一个模型的数据是废的。

3.3 ★ 跑之前必须做的四件事 ★

  1. 先移到 trial 预置位(第 1 项)。不移,这批数据和以后的不可比。
  2. 确认面板里的「预注册」。默认值已经填好了:
  3. 成功判据:杯子被提起离桌面 >3cm 并保持 >1s
  4. 初始条件:杯子在 120–175mm 中段,每次换一个杯位,顺序固定
  5. 看一眼觉得合适就直接开跑;要改就改,只需再填一下「写判据的人」。
  6. 判据一旦定了,这一批中途不许改。 要改,下一批再改。
  7. 一次只变一个变量:同一杯位、同一句指令、同一速度档、同一副爪。 要比模型,就只让模型变。
  8. Preview 必须先过:面板会拦,没过 Preview 的模型不许上硬件。

3.4 跑的时候

做完的样子:面板上这批显示「已预注册」绿色标签,成功率带 95% 区间, 而不是一个孤零零的百分比。


4. 相机内参标定

<span>现场摆姿势(约 20 分钟)+ 远程解算</span>

现状:FX=FY=320 是猜的。深度 Z 值大致可信,X/Y 只是近似。 不标定,一切 3D 推理(杯子在哪、离人多远)都建在猜的数上。

前置:第 1 项的 trial 预置位必须先存好,并且标定全程头不许动。

要打印的东西(提前印好,别到现场才想起来)

规格
棋盘格(推荐)10×7 格 / 内角点 9×6,方格边长 25 mm,A4 一张
或 ChArUco5×7,方格 30 mm,marker 22 mm —— 允许部分遮挡,但要环境里有 cv2.aruco
⚠ 三条会毁掉整次标定的细节:<br>
① 打印必须 100% 比例,不要勾「适应页面 / fit to page」;<br>
② 印完拿尺子量一个真实方格的边长告诉远程 —— 打印机很少完全准,差 1 mm 就是 4% 的尺度误差;<br>
③ 贴在硬板上压平。卷边或起皱会让标定悄悄跑偏,而且事后看不出来。
⚠ 分辨率必须写死 1280×720,全部照片同一个分辨率(2026-09-06 补):
这台相机的三个模式视场并不相同——原生读出 848×480,640×480 是它的居中横向裁切(水平视场 69.7°), 424×240 是 2× binning(85.4°),1280×720 与 424×240 同视场(2026-09-06 实测尺度 s=0.3330,等视场理论值 0.3312)。
生产里头相机跑的是 424×240,所以标定要标在同视场的模式上,标完按宽度比例缩过去才成立。
2026-09-04 那次标在 640×480 上——三个模式里唯一被裁边的那个——于是那组内参不能缩到生产分辨率,误差 32%。
混分辨率 = 整套作废,而且不会报错。

怎么拍:头在 trial 位不动,手持标定板在相机前变换姿态拍 15–20 张 —— 覆盖画面的中心和四个角、近和远、正对和明显倾斜。 倾斜是关键,只拍正对解不出畸变。

做完的样子:一个文件夹 15–20 张图,板子完整可见不模糊,外加一句「实测方格边长 = XX.X mm」。


5. 手眼外参标定

<span>现场(约 30 分钟)+ 远程解算 · 前置:第 4 项(内参)</span>

先回答「明天到底要不要做」

要做,但不是明天的瓶颈 —— 前三项做完还有时间再做就行。

理由是今天结果变了:目前最好的检测方案是 OWLv2 + 背景差, 它全程在 2D 图像上工作,不需要任何标定。深度的角色从「过滤掉平的东西」 变成了「提供 3D 位置」,那才是需要手眼的地方(开跑前的门、记录杯位、最终抓取定位)。

顺序:第 1、2、3 项 → 内参 → 手眼。今天只做到第 3 项完全可以接受。

要回答的问题:相机看到的一个点,在手臂坐标系里是哪儿。 没有它,「杯子在相机里的位置」没法变成「手臂该去哪」。

怎么做:把标定板固定在夹爪上(或固定在桌上、让手臂动), 记录若干组「手臂关节角 + 对应的相机图像」。至少 15 组,姿态要有足够变化。

⚠ 全程头不许动。 外参是「头在 trial 姿态时」的外参。

做完的样子:一个文件夹,每组包含图像 + 当时的 17 维关节读数。


6. 深度相机:先确认它是好的,再谈对齐

6.1 ★ 「配置对了」的信号是什么 ★

一条命令,30 秒,看两个数:

~/miniconda3/envs/lerobot/bin/python 03-software/scripts/orbbec_depth_camera.py

正常长这样(2026-09-04 在这台机器上实测的基准):

read() -> shape=(480, 640, 1) dtype=uint16 valid=84% median=522 mm
async_read() -> shape=(480, 640, 1) dtype=uint16
看什么正常不正常说明什么
valid≥ 75%低于这个说明大片读不到深度
median对着桌子 400–600 mm明显偏离=对错了地方,或量程被改过
shape(480, 640, 1) uint16变了说明分辨率配置被动过

如果它直接报错:

深度相机 ... 预热 15 帧仍全是空读数 —— 多半是 USB 带宽不够(该走 USB3)或相机假死,别开始录

这条报错就是「配置不对」的明确信号,别忽略它直接开录。 按顺序查:

  1. USB 速率必须 5000M:lsusb -t | grep -B2 -A2 Video —— Orbbec 那几行应显示 5000M。显示 480M 就是插在 USB2 口上了,换蓝色 / SS 口。
  2. 设备在不在:lsusb | grep 2bc5 应看到 2bc5:0800 ... Orbbec Gemini 335。
  3. 别的程序占着:录制或试跑在跑时相机被占用,先停掉再自检。
一句话判据:valid ≥ 75% + median 在桌面距离上 + lsusb -t 是 5000M。
三条齐了就是好的;任何一条不满足,先解决再录 —— 录出来的深度是废的。

6.2 深度 ↔ RGB 时间对齐验证

<span>现场 2 分钟 + 远程比对 · 从来没验证过</span>

怎么做:在头部相机前快速挥手 10 秒,同时录一小段带深度的数据。 远程会比对深度帧和 RGB 帧的时间戳,看有没有系统性延迟。

为什么要做:如果深度比 RGB 晚半拍,那么「杯子在这个像素、深度是这么多」就是错的配对, 而且这种错在静止画面上完全看不出来。


7. 用原生格式重录一小批带深度的数据

<span>现场 · 前置:8781 重启</span>

orbbec_depth_camera.py 已打通(lerobot 认 is_depth_map),但 8781 还没重启,新格式没生效。 9-02 / 9-03 录的 30 集是旧的旁路格式,用不了。

先录 3–5 集就够,目的是验证格式对不对,不是收集训练数据。 远程确认格式没问题之后,再决定要不要大批重录。

⚠ Start 只按一次。 按两次会孤儿掉录制器(09-03 已修,但别去试)。
录完检查 meta/upload.json —— 数据集只在录制结束当场上传一次,事后不会自动补传。

8. 在录「展示 / 倾倒」示范之前,先量一次关节速度

<span>现场 5 分钟 · 别跳过这一步</span>

为什么:policy_safety.py 的 MEASURED_STEP_CAP_DEG 是从抓取数据量出来的 (注释写明来源是 xlerobot-cup-grasp-20260820-0230),wrist_roll 上限是 10.4°/帧。

而它是静默钳位不是拒绝(policy_safety.py:55:a too-large step just gets slowed)—— 也就是说,如果旋转杯身的动作超过这个上限,动作会被悄悄放慢,而没有任何提示。 录完一整批才发现被削平了,就得重录。

怎么做:用遥操作做一遍你设想的旋转展示动作,录 10 秒, 远程会算这段里每个关节的单帧最大变化,和现有上限比。


远程这边同时在做的(不占你的时间)

这四项 2026-09-04 已经全部做完,结果直接影响你今天的第 2 项:

内容结果
A开放词表检测离线跑 + 人工逐框看图OWLv2 + 背景差:36 帧出 15 框,15 个全是目标杯,零错误。 但背景是凑出来的 —— 所以才需要你拍第 2 项那张图
Btoken 缩减路线的净收益毙掉。三路视觉只占推理耗时 13%
CHRI 代码盘点留 YuNet(18.9 ms/帧)。face_follow.py 里那套 Haar 是坏的
D关键帧采集✅ 已实现并通过 --dry。你今天跑试验会自动存三张关键帧

四条纪律(都是踩出来的)

  1. 一条串口总线只能有一个程序。 2026-08-17 23:16,录制进行中有人手敲了 trace_teleop.py,录制以 Port is in use! 死掉,掉了一集,双臂砸在桌上。 面板启动的作业之间有保护,手敲的命令绕过这道保护。
  2. 别动安全层。 z_floor(pitch) / y_floor(pitch) 是 09-03 刚接好的, 拒帧率 96.6% → 0.49%。这周不要碰它。
  3. 结论要标证据等级:实测 / 未测 / 跑了但被挡住。 说「从没成功过」「唯一可行」之前,先去 trials-*.json 数一遍。
  4. 数字好看 ≠ 做对了。 检测方案必须过「人工看图核对」—— 检出率 97.6%、抖动 6.4mm 的那个方案,看图才发现锁的是机械臂自己。三次都这样。

一句话

十五分钟就能干完最要紧的两件:存 trial 预置位,拍一张空桌参照图。 一个是所有几何工作的地基,一个能让刚跑通的检测方案从「下界」变成真实性能。

然后只跑 b16-3cam-u20k 这一个模型,跑 20 次。 它是唯一用换爪后数据训的,其余全部归档 —— 而这也意味着 当前这副夹爪上,我们至今一次正经试验都没做过,今天这批是第一批。

标定排在后面:产出要等远程解算,而试跑的产出当场就能看到; 而且目前最好的检测方案是 2D 的,暂时不依赖标定。