一个人走到吧台前,机器人打招呼、听单、确认,然后用左臂 SmolVLA 模型把杯子拿起来递过去。下面三张图分别是:哪些进程在跑、状态怎么流转、真正动手臂的那一段每一步在干什么,以及 09-10 是在哪几步上出的问题。
来源:brain/PIPELINE.md · RUNBOOK.md · components.py · state_machine.py · robot_effectors.py · live_brain.py · sources.py · scripts/run_policy_trials.py · 05-training/trials/*.json 与 trace/录像
三个 Python 环境、四个进程。虚线是读,实线是命令。橙色那一条是唯一会让手臂动的路。
「腕高 −0.030 低于地板 −0.016,是不是标定错了」。地板是按爪子俯仰角算的。−0.016 这个值只有在模型认为右爪朝下约 36°时才成立,此时它算出爪尖在桌面下 1.4 cm。可 15:09 的头相机照片里右臂是正常收着的,指头朝上。安全层自检里还记着训练集里右臂停着的一帧同样算出「俯仰 +52°、腕高 −0.029」并被拦下(policy_safety.py:702)。右臂停着不动的读数一直被 FK 算成穿桌,这不可能是物理事实。所以这个怀疑成立:右臂的关节标定、或者 FK 对右臂的俯仰约定,至少有一个和左臂不一致。要在真机上验:把左右臂摆到镜像的同一姿势,读关节角比一比。09-10 右臂自己跑策略没被拦,是因为它抓杯时算出的俯仰接近 0,地板退到 −0.105,够宽。
「以前跑的时候是左臂 home、右臂伸直」—— 为什么这次没先把右臂伸直。以前(09-09 那批 75%)没有任何一步去动右臂:模型对右臂 6 维输出恒为 0,这个 0 直接发到电机,右臂在开头几秒被拖成水平伸直(FK 上 z = +0.118,合法),也就是你记得的那个姿势。这是 components.py 里记作 IDLE_ARM_SWING 的「不请自动 29°」问题。09-10 Ville 加了 idle_lock 把右臂钉在当前位置以消掉这个甩动,代价就是右臂在哪它就在哪:这次刚好停在一个 FK 认为越界的位置。两个版本都没有「先把右臂放到一个已知合法的姿势」这一步。2026-09-11 已改:robot_effectors.arm_home 改成 --arm both,右臂先回 0826 数据集的示范起点(FK 算出 z +0.005 m、俯仰 −1.6°,在包络内),再由 idle_lock 钉住。check.py 全部通过,真机没跑过,第一次 --send 要有人盯着。
| 环节 | 实现 | 状态 | 依据 |
|---|---|---|---|
| 抓杯策略 | left-sd-p0.2-b16-u20000 @ 020000 | 真机 | 09-09 四场 9 成 / 3 败 / 3 void → 75%;全天 28 次起动是 17 / 5 / 6 |
| 退出保持力矩 | --keep-torque | 真机 | verify_keep_torque.py 在左爪上测过,位置 2803→2803 |
| 头部预设 | head_aim.py --preset cup-grasp-v0 | 真机 | 09-10 两个预设都发过并读回 |
| 左臂归位 | arm_home.py --arm left | 真机 | 按墙钟插值,负载下也能到 |
| 右臂处理 | idle_lock(未提交) | 已改未验 | 钉住越界姿态导致 5 次中止;不钉则右臂会甩约 29°。09-11 起 pick 前两臂都归位,待真机验 |
| 抓到没有 | grip_gate MEASURED_PARTIAL | 半校准 | 只测了空爪 0.58;「拿着杯子」的档 MEASURED_CUP 写了但 live_brain 没接 |
| 模型常驻 | WarmPolicy · --trials 99 | 真机 | 省掉每次 23 s 加载;09-10 的 4 次 pick 走的就是它 |
| 看脸 / 听单 / 说话 | sources.py · Whisper · Piper | 真机 | 15:00 有三段 brain_say 音频落盘 |
| 递杯 | present() | 空 | 只写日志;face_reach 只能指向脸,够不到人 |
| 放回桌上 | place_down() | 空 | place_pose.json 有左臂姿态,函数没接 |
| 桌上有没有杯子 | cup presence | 恒真 | 决定性地 stub 掉;EfficientDet 0 框 |
| 语音识别挂掉时 | — | 无 | 能打招呼道歉,接不了单,没有按钮兜底 |
PY=~/miniconda3/envs/lerobot/bin/python
cd ~/Robotic_challenge/03-software/brain
$PY check.py # 13 个模块自检 + components --verify
$PY run_brain.py --simulate # 假机器人走完整段
$PY ../scripts/teach_grasp.py --check # 舵机 / 杯子 / USB
$PY run_brain.py --send # 真机(Ville 实际用 live_brain.py --send)
改 components.py 第 80–81 行的 path;robot_effectors.py 第 422 行自检写死了 left-sd-p0.2,要一起改。起始位和头部预设按数据集来。
不是换路径是换臂:任务句子在 drinks.py / live_brain.py / live_cycle.py 三处写死「left arm」,arm_home 写死 left,place_pose 只有左臂,右臂 FK 地板还有上面那个疑点。
| 结论 | 等级 | 出处 |
|---|---|---|
| 进程、端口、子进程命令行 | 读代码 | live_brain.py:371 · robot_effectors.py:318 · sources.py:42 |
| 5 次中止的原因 | 跑测过 | trials-live.jsonl 的 aborted 字段 · run_policy_trials.py 未提交 diff 的注释 |
| 4 次 pick 都在闭爪时把杯子打飞 | 跑测过 | vid-20260910-{075224,080307,172712,173032}-t1.webm 逐帧 · trace FK |
| 打飞的原因 | 没定 | 需要同杯位、60 s、手跑 run_policy_trials 对照 |
| 右臂 FK / 标定不一致 | 推断 | 15:09 照片 + policy_safety.py:702 自检记录;要真机比关节角 |
| 09-09 关键帧颜色反了 | 已核 | trial_keyframes.py:151 于 09-10 加了 RGB→BGR;录像颜色正常,硬件没换 |
本页数字实测于 2026-09-10 本机 Jetson;页面写于 2026-09-11。artifact 版本:claude.ai。