http://100.107.145.111:8792/05-training/onsite/。| 有多少时间 | 做到第几项 | 做完能得到什么 |
|---|---|---|
| 15 分钟 | 1 + 2 | 头部预置位 + 空桌参照图 —— 两件都是别的工作的地基,加起来不到 15 分钟 |
| 1 小时 | 1–3 | 再加上:一批算数的试跑数据(模型第一次被认真测过) |
| 半天 | 1–5 | 再加上:深度状态确认 + 相机内参素材 |
| 更多 | 6–8 | 手眼标定、重录深度、展示动作测速 |
第 3 项(跑测模型)是今天信息量最大的一件,但它依赖第 1 项。 第 2 项是今天新增的,两分钟,价值被低估了 —— 理由见那一节。
| 变化 | 你会看到 |
|---|---|
| 面板多了「预注册」输入框 | 实机试跑卡里,速度/时长那一排下面。默认判据已经替你填好了 —— 看一眼觉得没问题就直接开跑 |
成功率显示成 k/n + 95% 区间 | 不再只有百分比。0/4 和 0/23 现在一眼能分出来 |
| 每批标「已预注册」或「探索性」 | 没填判据的批次 = 探索性,不参与结论 |
| 失败模式分布 + 子目标漏斗 | 有数据才画。老批次没有,正常 |
| 试验记录写成 schema v2 | 多了 trace 文件名、failure_mode、preregistered 等字段。老文件一个字节没动 |
8770 面板已重启,改动已生效。 安全层一行没改。
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,以操作者为准。
做完的样子:头相机画面和昨天录制时一样。
<span>现场 · 2 分钟 · 今天性价比最高的一件</span>
为什么突然多了这一项:今天远程那边把杯子检测跑通了 —— OWLv2 + 背景差 在 36 帧里出 15 个框、15 个全是目标杯,零错误, 这是整轮调查里第一个没有错误的配置。
但那个「背景」是凑出来的:他们没有空桌照片,只能拿同一数据集跨集取逐像素中位数当替代品, 而中位数里混着机械臂的运动残影。也就是说,现在那个 100% 是在被污染的参照上拿到的 —— 是下界,不是上界。
你拍一张真的,这一层的效果只会更好。
http://100.107.145.111:8792/ (口令和面板同一个)。图会自动存到 05-training/onsite/,不用记路径做完的样子:两张头相机图 —— 一张纯空桌、一张只有目标杯,头在 trial 位。 告诉远程文件名就行。
<span>现场 · 每个模型约 25 分钟 · 这是今天最有信息量的一件事</span>
换夹爪之后录的数据是 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 | ❌ | 从没跑过 |
除第一行外全部归档,今天一个都不要跑。 它们是给旧夹爪训的, 在现在这副爪子上跑出来的数任何方向都不能用 —— 好看不能信,难看也不算数。
原计划两个模型各 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 次 —— 另一个模型的数据是废的。
trial 预置位(第 1 项)。不移,这批数据和以后的不可比。杯子被提起离桌面 >3cm 并保持 >1s杯子在 120–175mm 中段,每次换一个杯位,顺序固定成功 / 失败 / 不计。 摆放错误、人为干预、硬件故障 → 判「不计」,别判失败。05-training/trials/trials-*.json,面板上直接能看到 k/n 和区间。做完的样子:面板上这批显示「已预注册」绿色标签,成功率带 95% 区间, 而不是一个孤零零的百分比。
<span>现场摆姿势(约 20 分钟)+ 远程解算</span>
现状:FX=FY=320 是猜的。深度 Z 值大致可信,X/Y 只是近似。 不标定,一切 3D 推理(杯子在哪、离人多远)都建在猜的数上。
前置:第 1 项的 trial 预置位必须先存好,并且标定全程头不许动。
| 规格 | |
|---|---|
| 棋盘格(推荐) | 10×7 格 / 内角点 9×6,方格边长 25 mm,A4 一张 |
| 或 ChArUco | 5×7,方格 30 mm,marker 22 mm —— 允许部分遮挡,但要环境里有 cv2.aruco |
640×480 是它的居中横向裁切(水平视场 69.7°),
424×240 是 2× binning(85.4°),1280×720 与 424×240 同视场(2026-09-06 实测尺度 s=0.3330,等视场理论值 0.3312)。424×240,所以标定要标在同视场的模式上,标完按宽度比例缩过去才成立。怎么拍:头在 trial 位不动,手持标定板在相机前变换姿态拍 15–20 张 —— 覆盖画面的中心和四个角、近和远、正对和明显倾斜。 倾斜是关键,只拍正对解不出畸变。
做完的样子:一个文件夹 15–20 张图,板子完整可见不模糊,外加一句「实测方格边长 = XX.X mm」。
<span>现场(约 30 分钟)+ 远程解算 · 前置:第 4 项(内参)</span>
要做,但不是明天的瓶颈 —— 前三项做完还有时间再做就行。
理由是今天结果变了:目前最好的检测方案是 OWLv2 + 背景差, 它全程在 2D 图像上工作,不需要任何标定。深度的角色从「过滤掉平的东西」 变成了「提供 3D 位置」,那才是需要手眼的地方(开跑前的门、记录杯位、最终抓取定位)。
顺序:第 1、2、3 项 → 内参 → 手眼。今天只做到第 3 项完全可以接受。
要回答的问题:相机看到的一个点,在手臂坐标系里是哪儿。 没有它,「杯子在相机里的位置」没法变成「手臂该去哪」。
怎么做:把标定板固定在夹爪上(或固定在桌上、让手臂动), 记录若干组「手臂关节角 + 对应的相机图像」。至少 15 组,姿态要有足够变化。
trial 姿态时」的外参。做完的样子:一个文件夹,每组包含图像 + 当时的 17 维关节读数。
一条命令,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)或相机假死,别开始录
这条报错就是「配置不对」的明确信号,别忽略它直接开录。 按顺序查:
lsusb -t | grep -B2 -A2 Video —— Orbbec 那几行应显示 5000M。显示 480M 就是插在 USB2 口上了,换蓝色 / SS 口。lsusb | grep 2bc5 应看到 2bc5:0800 ... Orbbec Gemini 335。valid ≥ 75% + median 在桌面距离上 + lsusb -t 是 5000M。<span>现场 2 分钟 + 远程比对 · 从来没验证过</span>
怎么做:在头部相机前快速挥手 10 秒,同时录一小段带深度的数据。 远程会比对深度帧和 RGB 帧的时间戳,看有没有系统性延迟。
为什么要做:如果深度比 RGB 晚半拍,那么「杯子在这个像素、深度是这么多」就是错的配对, 而且这种错在静止画面上完全看不出来。
<span>现场 · 前置:8781 重启</span>
orbbec_depth_camera.py 已打通(lerobot 认 is_depth_map),但 8781 还没重启,新格式没生效。 9-02 / 9-03 录的 30 集是旧的旁路格式,用不了。
先录 3–5 集就够,目的是验证格式对不对,不是收集训练数据。 远程确认格式没问题之后,再决定要不要大批重录。
meta/upload.json —— 数据集只在录制结束当场上传一次,事后不会自动补传。<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 项那张图 |
| B | token 缩减路线的净收益 | 毙掉。三路视觉只占推理耗时 13% |
| C | HRI 代码盘点 | 留 YuNet(18.9 ms/帧)。face_follow.py 里那套 Haar 是坏的 |
| D | 关键帧采集 | ✅ 已实现并通过 --dry。你今天跑试验会自动存三张关键帧 |
trace_teleop.py,录制以 Port is in use! 死掉,掉了一集,双臂砸在桌上。 面板启动的作业之间有保护,手敲的命令绕过这道保护。z_floor(pitch) / y_floor(pitch) 是 09-03 刚接好的, 拒帧率 96.6% → 0.49%。这周不要碰它。trials-*.json 数一遍。十五分钟就能干完最要紧的两件:存 trial 预置位,拍一张空桌参照图。 一个是所有几何工作的地基,一个能让刚跑通的检测方案从「下界」变成真实性能。
然后只跑 b16-3cam-u20k 这一个模型,跑 20 次。 它是唯一用换爪后数据训的,其余全部归档 —— 而这也意味着 当前这副夹爪上,我们至今一次正经试验都没做过,今天这批是第一批。
标定排在后面:产出要等远程解算,而试跑的产出当场就能看到; 而且目前最好的检测方案是 2D 的,暂时不依赖标定。