今晚把失败原因查清楚了,也发现了一个此前没人识别的因素(夹爪摩擦力)。 这一页把「今天发现了什么 → 每一条怎么解决 → 这一批做什么 → 下一批做什么 → 时间怎么排 → 要准备什么」全部写死,照着做就行。
一句话:现在不要再碰这个模型了。 先把夹爪换掉、把标定重做、 把新一批数据按今晚学到的纪律录出来。旧模型的问题已经诊断完毕, 但它的病根在数据里,而那批数据在换爪之后本来就要作废。
| # | 发现 | 性质 | 怎么解决 | 状态 |
|---|---|---|---|---|
| 1 | 面板启动策略作业用了没有 CUDA 的 Python,2.4 s/帧 | Bug | 改用 train310 解释器 | 已修 |
| 2 | ACM0/ACM1 上电顺序会反,连错总线 | Bug | 按舵机数认总线(8=左/头,9=右/轮) | 已修 |
| 3 | 面板轮询抢串口、预览抢相机,打死试跑 | Bug | 试跑脚本进 BUS_OWNERS/CAMERA_JOBS,认进程不认时间窗 | 已修 |
| 4 | 动作块被拉长到 6 秒盲飞(训练 30 Hz,推理 8 Hz) | 设计缺陷 | 「--chunk-rate auto 按实测频率消费,重看间隔回到 1.7 s」 | 已修 |
| 5 | 一次串口丢包让整场作废 | 健壮性 | 连接失败自动整体重试一次 | 已修 |
| 6 | 「head_motor_2 = 99.649 超标定 50°」的悖论 | 文档错误 | 实为 49.846,在标定内。三处文档已更正 | 已修 |
| 7 | 试验只留三个计数,事后无法回答「降到多低」 | 可观测性 | 「--trace 默认记录逐帧轨迹 + trace_vs_demo.py」 | 已修 |
| 8 | 杯位覆盖不均:22/7/17/4,集数 vs 抓取深度 r = −0.88 | 根因 | 换爪后整批重录,杯位均衡(本页第三节) | 待你做 |
| 9 | 夹爪摩擦力不足 —— 重放(完美动作)也把杯子推滑 | 根因 | 换上已打印的高摩擦长爪(本页第二节) | 待你做 |
| 10 | 录制时撞「桌面地板」98 次,包络忽略手腕俯仰 | 次要 | 换爪后重标 measure_table.py;FK 桥纳入 wrist_flex(可选) | 待做 |
1–7 是我修的,你不用管。8、9、10 是接下来这一批的全部工作。 注意 8 和 9 都指向同一个动作:换爪 + 重录。这就是为什么下面只有一条主线。
12VDC·RN-01 圆头插头理到伸手可及处,最好接带开关的插排这一步不能跳。 仓库里挂着一条从未验证的风险:夹套让每片爪多占 9.34 mm, 双爪张口减少 18.68 mm,90 mm 的杯子还塞不塞得进去 —— 没人验过。 新爪更长更厚,风险更大。
PY=~/miniconda3/envs/train310/bin/python
$PY 03-software/scripts/gripper_range.py --arm right
gripper_open_deg / closed_deg(现为 +65 / −60)gripper_range.py,得到新的开合行程03-software/configs/teleop_safety.yaml
新爪更长 → 爪尖会在更高的手腕位置就触桌 → z_min 必须上调。
(这跟直觉相反,因为那个数约束的是手腕不是爪尖:爪尖挂在手腕下方约 0.159 m,
所以「手腕 z = 0.020」的含义就是「爪尖贴地」。)
$PY 03-software/scripts/measure_table.py
wrist_flex = −6.5° ± 10.3°,
倾斜姿态下爪子的垂直投影更短,用垂直姿态标出来的 z_min 会偏保守 5–16 mm。table_calibrations.json,面板可查历史teleop_safety.yaml 的 z[0] 更新为新值面板「头部相机对准」→ 勾选叠上训练时的画面 → 用 ◀▶▲▼ 调到与参考图一致
→ 存成新预设(建议命名 cup-grasp-v2)。
cup-grasp-v0
的角度是对的(实测差 <1°),照它调即可。操作者反馈:teleop 里手腕能沉到很低,录制时却怎么都放不平。查下来两条路的
包络是一样的(录制也读同一份 teleop_safety.yaml),差别在控制律:
teleop(vr_teleop.py) | 录制(xlerobot_vr.py) | |
|---|---|---|
| 控制方式 | 绝对位置 + 锚点 | 增量累加 |
| 死区 | 无 | threshold = 0.001 |
| 增益 | --scale 0.6 | 80 × 0.015 = 1.2 |
delta_y = 手的位移 × 80 × 0.015 = 手的位移 × 1.2
死区: |delta_y| < 0.001 -> 归零
反推: 手每帧移动 < 0.83 mm 全部丢弃
30 fps 下 = 手速慢于约 2.5 cm/秒 的动作,手臂纹丝不动
「把手腕慢慢放平、稳稳沉下去」恰好就是一个慢动作 —— 正好落在死区里被吃掉。 teleop 没有死区,所以那边能沉。
这不只是手感问题,它污染了训练数据。50 集示范闭爪高度 z = 0.032,
我们一直以为那是操作者能做到的极限;现在看,下沉这个动作在录制时被死区系统性削弱了。
今晚「模型没学会下沉」的诊断,根子可能在这里。
改动很小,但它是录制路线的核心控制律,必须验过再用:
# lerobot310/lerobot/teleoperators/xlerobot_vr/xlerobot_vr.py 第 344 行附近
threshold = 0.001 → 0.0002 # 手速门槛 2.5 cm/s → 0.5 cm/s
trace_dry(走录制路线、手臂不动、11 步映射测试),记下现在的手感trace_dry 对比grasp_sight_check.py 看构图、
demo_coverage.py 看 z@closez@close 应明显低于旧批的 0.032,组内 σ 也应更小0.0002 是按「手速 0.5 cm/s」反推的 —— 这是选的值,不是量的值。
更严谨的做法:用 trace_dry 量一下静止时的手抖幅度,取它的 2 倍当死区。不要一上来就录 60 集。先录 3 集,跑准星检查,确认新爪下的构图和手感对了再开工。
$PY 03-software/scripts/grasp_sight_check.py --episodes 0 1 2 --out /tmp/probe.jpg
杯位必须均衡。上一批是 22/7/17/4,最右那个只有 4 集 ——
而模型恰恰在那里表现最差(r = −0.88)。这一批每个位置录满 15 集。
| 杯位 | 大致 pan | 上一批 | 这一批 |
|---|---|---|---|
| 最左 | −30° | 22 | 15 |
| 中左 | −10° | 7 | 15 |
| 中右 | +9° | 17 | 15 |
| 最右 | +23° | 4 | 15 |
录制时手上默念的三句话:
① 轴线向左偏,让左爪贴住杯子左缘(爪夹向右开合,对准杯心是错的)
② 腕部沉到杯沿以下再往前推进张爪,目标比上一批再深一点
③ 偏移做夸张、每集都做 —— 幅度刚够用的修正会被损失函数当噪声抹掉
quality_gate.py --watch 会自动跟着录制跑)$PY 03-software/scripts/grasp_sight_check.py # 准星接触表:60 格构图是否一致
$PY 03-software/scripts/demo_coverage.py # 杯位覆盖 + 两个相关系数
$PY 03-software/scripts/quality_gate.py # 分窗 clamp 趋势
验收线(这一批的合格标准):
| 指标 | 合格 | 上一批实测 |
|---|---|---|
| 每个杯位集数 | ≥ 15,四组相差 ≤ 3 | 22 / 7 / 17 / 4 |
| 组内闭爪高度 σ | < 0.010 m | 0.0063 ~ 0.0141 |
| 集数 vs 深度相关性 | |r| < 0.4(说明覆盖已均衡) | −0.88 |
| 准星构图跑偏的集 | 0(跑偏就删掉重录) | — |
| clamp 率 | < 10%,且趋势下降 | 15% → 10% |
只改三项,其余与 v1 完全一致(GOAL-NEXT.md 既定方案):
eval_split = 0.2,且按杯位分层(每位固定抽 3 集,保证每位都有验证覆盖)训练 loss 一定会比 v1 高(增强的必然结果)。不要误判为退步 —— 看 validation loss 和真机成功率,不看训练 loss。
面板 → 速度 1.0 · 每次 40s · 动作块 auto → ▶ 实跑 10 次
$PY 03-software/scripts/trace_vs_demo.py 拿量化结论GOAL-NEXT.md验收标准:10 次成功 8 次。
第一段 · 硬件与标定 约 1 小时
准备 15 min → 验张口 + 装爪 20 min → 重标桌面 10 min → 头部对齐 10 min
→ 修死区 + trace_dry 验证 30 min → 练手 3 集 20 min
第二段 · 录制 2–3 小时(可分两次,中间休息)
4 个杯位 × 15 集;每录 10 集看一次质量回报
第三段 · 体检 5 分钟 → 不达标就回第二段补录
第四段 · 训练 3 小时以上 挂在夜里跑,人去睡觉
第五段 · 验收 40 分钟 真机 10 次
建议的切分:今天做完第一段 + 第二段的一半(30 集),明天补完剩下 30 集 → 体检 → 晚上挂训练 → 后天验收。不要熬夜连着录 60 集 —— 录制质量随疲劳下降,而这一批的核心价值就是「一致性」。
| 类别 | 清单 |
|---|---|
| 硬件 | 新夹爪(已打印)· 螺丝与热熔螺母 · 卡尺(量张口)· 带开关的插排(把 12V 插头接上去,比拔插头快) |
| 耗材 | 杯子(和上一批同一个)· 桌面标记(4 个杯位贴胶带,保证每次摆回同一点) |
| 环境 | 关掉 Jetson 上的浏览器和 VS Code · 光照条件与上一批一致(尽量同一时段)· 工作区无玻璃无液体 |
| 软件 | 面板已就绪(<机器人地址>:8770)·
密码在 private 的 xlerobot-ops Space · 手机添加到主屏幕 |
| 心理 | 把三句话背下来:轴线左偏 · 腕部下沉 · 偏移夸张 |
trace_vs_demo.py 给出的量化偏差决定方向 ——
深度不够就再加深示范;位置偏就检查覆盖;两者都对却抓不住,回头再看夹爪
配套页: 0/14 失败分析 ·
论文里一般怎么做 ·
仓库文档 03-software/TUNING-PLAYBOOK.md、GRIPPER-SWAP-CHECKLIST.md。