一份如实的工作记录。每条结论后面都标了证据等级 —— 实测(跑过,有输出)/未测(没跑过)/被挡住(想跑但没跑成)。 这条规矩是 2026-09-03 白天操作者提出批评后定下的,这份记录是它的第一次全面应用, 包括用它去检验别人论文里的数字。
问题:05-training/trials/ 下 37 个文件、114 次试验,
其中 75 次失败是个黑箱 —— 记录里只有 outcome: "failure",没有原因。
而且三个读取端(robot_server.read_trials /
gen_status.collect_trials / 面板 html)各写了一份「字段缺了怎么兜底」的逻辑,
兜底规则还不一样,同一个文件在两个地方能显示成两个数。
| 文件 | 动作 | 规模 |
|---|---|---|
trials_io.py | 新建 —— 试验记录的唯一读写口径 | 334 行 |
robot_server.py | 只改 read_trials() 一个函数 | 3 个文件 +247 / −77 |
gen_status.py | 只改 collect_trials() + STATUS 表格 | |
run_policy_trials.py | 结果写成 v2;新增预注册 CLI 参数 |
评测规程要求报绝对数和区间,不报点估计(arXiv 2409.09491)。
但这台机器上三个 python 环境的 scipy 状态各不相同 —— 系统 python 的 scipy 是装着但坏的
(numpy 1.21.5 太老,import 时抛 TypeError 而不是 ImportError)。
所以正则化不完全贝塔函数是手写的,零依赖。
改之前 累计计入 83 · 成功 8 ← 一个裸计数
改之后 累计: 8/83(9.6%,95%CI 4.3–18.1%)
预注册的运行: 0/37 · 其余只能算探索性,不参与结论
每一行也带上了区间:
0/23 → 95%CI 0–14.8% 这两行在「成功」那一列
0/4 → 95%CI 0–60.2% 长得一模一样,但后者什么都没证明
normalize_run() 只做读时归一化,不写回磁盘,37 个老文件一个字节没动。success / counted / void /
counts / held_pct / aborts / trials / model_label…)全部保留,
v2 只往上加 ci95 / rate / failure_modes /
subgoal_funnel / preregistered。subgoals 是 None,
意思是「没记」而不是「否」。子目标漏斗的分母必须只算记了的次数 ——
当成 False 的话,老记录会让漏斗看起来全是 0,而那是个假象。
回环测试专门验了这一条:4 次试验里只有 2 次记了子目标,漏斗分母正确地是 2 不是 4。| 检查 | 结果 |
|---|---|
三个环境跑 trials_io.py 自检 | ✅ 实测通过 |
| 37 个真实文件全量归一化 | ✅ 8/83,95%CI 4.3–18.1% |
| v1/v2 混放读取 | ✅ 不崩 |
run_policy_trials.py --dry(GOAL 边界条件 2) | ✅ 推理成功,动作 (17,),安全层 OK |
8770 重启后 /api/trials | ✅ 新字段已下发,老字段全在 |
| 三个面板 HTML 自检(标签 + 整块 JS 解析 + 作用域泄漏) | ✅ 全绿 |
esprima 没装 —— 也就是整块 JS 语法检查根本没执行,只过了标签配平,
但结论那一行仍然显示得像是查过了。装上依赖后重跑才是真的全绿。
检查跳过了却看起来像跑过了,正是白天那类页面 bug 能溜过去的机制。B0 是「不自己算 3D 坐标,把物体 token 当结构先验喂给策略」这条路。 原来撑着它的是 VIOLA(CoRL 2022,+45.8%), 但 VIOLA 用的是它自己的 transformer 策略,不是 VLA。
新找到 Oat-VLA —— 同一个思路做在真正的 VLA(OpenVLA)上:
| 论文原文(已核对全文,非摘要) | |
|---|---|
| 物体 token 从哪来 | FT-Dinosaur,无监督物体中心模型,现成的不用标注 |
| token 数 | 256 → 16(7 个物体 + 9 个夹爪 3×3),少 93.75% |
| 收敛 | LIBERO 上「至少快一倍」 |
| 真机 pick-and-place | Oat-VLA 29/49,OpenVLA 20/49 |
为什么它对我们仍然重要:token 少 93.75%。SmolVLA 在这台 Jetson 上是 146 ms/帧(6.9 Hz),视觉 token 是大头 —— 这条路有可能顺带把推理变快, 而不是像大多数「加感知」的方案那样再吃一口算力。
| 项 | 实测值 | 怎么测的 |
|---|---|---|
| 机型 | Jetson Orin Nano Super | /proc/device-tree/model |
| 总内存 | 7.4 GiB(当前可用 2.6 GiB) | free -h / /proc/meminfo |
| swap | 16G swapfile + 6×634M zram | swapon --show |
| SmolVLA 权重 | 865 MB | model.safetensors |
| OpenVLA 7B fp16 | 约 14 GB(7B × 2 字节) | 算的,未测 |
| 原说法 | 实际 | 怎么发现的 |
|---|---|---|
| 「B0 比 B2 改动小」 | 没依据,已删 | VIOLA 用的是自家 transformer 策略,往 SmolVLA 接要改哪几层没人量过 |
| 「Oat-VLA 视觉主干全程冻结」 | 论文没这么说 | 核对全文,无 "frozen" 字样 |
| 「Oat-VLA 真机 59% vs 41%,有效」 | 数字对,但不显著 | 用本页 §1 写的 Clopper-Pearson 自己算,p = 0.106 |
lerobot 环境的 torch 是 CPU-only。
torch 2.11.0+cu130,但驱动是 CUDA 12.6 —— torch.cuda.is_available() 返回
False。跑策略的是 train310(torch 2.8.0,CUDA 可用),
由 robot_server.py:67 的 PY_POLICY 指定。<head> 注入一段 102 字节的脚本,这个过程会把正文里
一个多字节 UTF-8 字符的前两字节替换成 U+FFFD,显示成「」。/raw/main/ 取回来和本地字节完全一致),
是它服务层的问题。改排版躲不掉 —— 试过之后坏字符只是从「得」挪到了同段的「,」。
要给人看准确版本,用下面那条 Tailscale 链接。操作者特别问了这一条。用文件修改时间实证 —— 本会话的改动全部在 23:33 之后:
| 文件 | 最后修改 | 是谁改的 |
|---|---|---|
leader_follower_server.py(录制) | 22:56 | 本会话之前,不是我 |
orbbec_depth_camera.py(深度) | 22:54 | 本会话之前,不是我 |
v4l2_depth.py(深度) | 22:54 | 本会话之前,不是我 |
robot_server_dashboard.html | 22:27 | 本会话之前,不是我 |
robot_server_data.html | 22:27 | 本会话之前,不是我 |
bartender_tasks.py(数据集上传) | 19:38 | 本会话之前,不是我 |
trials_io.py | 23:33 | 本会话新建 |
robot_server.py | 23:34 | 本会话,只有 read_trials() |
安全层没动(GOAL 边界条件 3):z_floor(pitch) / y_floor(pitch)
是白天刚接好的,拒帧率 96.6% → 0.49%,这次一行没碰。
input() 是失败模式追问,
双重门控 —— not a.panel 且显式传了 --ask-failure-mode。
面板模式走的是轮询控制文件,在那条路上插 input() 正好会把面板挂死,所以明确挡住了。| 事项 | 谁 | 前置 | |
|---|---|---|---|
| ① | 关键帧采集(GOAL-TRIAL-DATA 第 2 步) | 远程 | 无 |
| ② | 面板显示 k/n + 区间 + 失败模式分布 + 子目标漏斗(第 3 步) | 远程 | 服务端已备好数据 |
| ③ | 预注册入口(第 4 步) | 远程 | CLI 参数已加,缺面板表单 |
| ④ | B0 摸底:量 FT-Dinosaur 在 Jetson 的耗时(用 train310) | 远程 | 要下模型,注意磁盘 |
| ⑤ | 阶段 A:30 集 RGB 上离线跑开放词表检测 + 人工看图核对 | 远程 | 同上 |
| ⑥ | 头部预置位 trial、相机内参、手眼标定 |
现场 | B1 的硬门槛 |