Working notes from the robot build, written so they can be read on a phone. Every number here was measured, not estimated — and where something has not been measured yet, it says so instead of guessing.
★ 当前第一优先:把模型送去云端重训 ★ 本机那个 checkpoint 只过了
2.1 遍数据(batch=2),而且 eval_split=0.2 把整个「右近」点位
(ep40-49,10 集)全部排除在训练之外。数据集本身是均衡的(10/12/9/9/10),
不用补录。下面第 ① 项是照做即可的完整指南。
★ 机器人的实际地址不在这个公开页面里 ★ 地址和面板密码都在
xlerobot-ops ——
那是一个 private Space,只有登录本账号(或被加为协作者)才看得到。
下面这些按钮都指向那里。
访问还需要连上机器人的 Tailscale 网络。
密码在 xlerobot-ops
—— 那是一个 private Space,只有登录本账号看得到。
ROBOTIC-WORKING-HANDBOOK.md,本页由脚本生成,定期更新。
2bc5:0800 = Orbbec Gemini 335。
chunk_rate 一个),跑 7 次。chunk_k 步,k=4 时队列 12.5 拍见底、冻 1.4 秒等推理,
占试验时长 46%(左臂 k=1 是 26%),每次解冻后新计划往回走。
不是安全层(削了 0.0%),也不是策略慢(命令 3.00°/周期,示范应走 2.86°)。train_config.json 逐字段比,150 个字段只差 5 个,其中 4 个是名字路径,
第 5 个是从没被用到的 eval.batch_size。所以唯一实质变量就是数据 —— 而同一套配方,
左臂 15/20(共 28 次),右臂 0/14。std==0,
而它只在常数恰好为 0 时才成立——lerobot 在 float32 上用 E[x²]−E[x]² 算方差,
常数不为零时两个大数相减会算出假 std。头部两维在数据里是精确常数(73/73 集 min==max),
却因此报出 std=0.0093/0.1243,一直没被钉住、放大约 107 倍;
左臂那六维的常数恰好是 0.0,所以一直是对的。判据改成 min==max(比较而非算术,与量级无关),
钉住的维 6→8。已验:训练集 32,216 帧改动 0 帧,头掉到别处会被钉回训练值。REPO_ID/TAG。:8790 upload service, which is plain HTTP and which Chrome refuses to
download from.not teleop, not replay), the position chart showing where all 28 grasps closed,
a contact sheet of every start frame, and the three concrete ways to show a juror this is
autonomy rather than replay.
orbbec_depth_camera.py → v4l2_depth.DepthCamera 裸 V4L2 读 Z16,
所以新相机必须是标准 UVC 设备。GOAL-head.md 记「相机型号未决」并推断「不是 Gemini 335」——
机器上 USB 描述符 2bc5:0800 证明就是 Gemini 335,该推断作废。Present_Load 的符号指示受力方向(抬升 24/24 为负,下压 15/16 为正)。
shoulder_lift 差 3–5° 停下,而其余关节全部落在 0.6° 内——
舵机报告已到 Min_Position_Limit,却离目标还有 4.39°。行程 span 2426 是对的,整个窗口偏移了。Linear(32→960),且图像/语言不回看它),所以让模型「看不见关节」不用碰视觉那一路、不改结构、不动 optimizer。prepare_state —— 训练(:296)和推理(:209)唯一共用的那个函数,所以第一句就查 self.training;漏了它就是让真机闭着眼开车,不报任何错。state_proj(0)=bias —— 所有被遮的样本共享同一个模型自己学出来的常量 token,等于白捡一个 state-unknown 标记。state↔action 相关 0.99,完全放开几千步就把捷径学回来,而 loss 曲线全程漂亮)、猴补丁怎么注入而不改 lerobot、梯度累积和步数读不到这两个坑,以及三步确认补丁真的挂上了 —— 因为没挂上的表现和挂上了一模一样。
state6 实机 0/2,拆开量出两件互相独立的事。std=0,而 lerobot 除的是 std+1e-8 且没有任何保护 —— 真机上左臂是连着的,读数被放大 1e8 倍。同图同右臂状态下,左臂偏 0.1° 右臂输出变 64° ,且 0.1°/5°/几十度结果几乎一样(token 饱和)。修完同 checkpoint 重跑:夹爪抖动两次都对半砍(10→5、18→10),CLIPPED 10→3,闭爪时机从 6 秒推到 19 秒 —— 但仍 0/2。state6 的截断技巧:模型仍在读右臂 state,state 摆动比图像大 1.8 倍且与杯位不相关。--sweep 扫完整条曲线,凉透后七档全零失败,峰值负载 291 反而高于对照的 223/220。三个点和七个点给出的是相反的结论,不是置信度不同。--temp-stop 读不到温度时会拒绝运动 —— 此前一个写错的电机名让这道保护整场没生效,写了但没生效的保护比没写更危险。
shoulder_lift 是反的(杯口 lift=+22.9 / 举起 lift=−34.1),而且对高度不单调,折返点 z≈0.11。teleop 的 home 在折返点上方 —— 那一侧 K(收回)和 O(降低)都让大臂抬起,U(升高)让大臂放下。而 home 的 z 被"爪尖离桌 100mm"开机自检锁死,换配置躲不掉,是结构性的。示范 3434 帧的腕高全在折返线以下,人从没在这段操作过。lift -0.1°,力臂最长的姿势之一)。我的第一版修法会带回一个 08-16 修掉的老 bug:开机自检要求 home 处爪尖离桌 ≥100 mm,我那个姿势只有 29 mm —— 那正是当年每次启动都把杯子扫倒的原因。能动的只有前伸量。20000 × 16 ÷ 16487 = 19.4 遍,跟已有的 right-pick-b16-3cam-u20k 的 E = 19.4 完全相同 —— 两次训练除 state 外逐字一致,斜率变了就只能是 state 造成的;batch 8 会把 E 变成 9.7,对照作废。--policy.input_features=null,smolvla_base 自带的 state[6] 就会盖住数据集的 17 维,而截断保留的前 6 维是左臂 —— 右臂任务里左臂全程不动,捷径就断了。面板生成的命令会自动带上这一行,所以这次不能用面板。state ↔ action 相关性 0.99,把当前关节角照抄成下一个动作误差只有 0.9° —— 能这样蒙混过去的模型永远不需要学会看图。state 被截成 6 维当成「白训了」、要求验到 [17] 才 OK。interface.js:352),普通浏览器经 Tailscale 就能控双臂,不需要头显、不需要 VPN、不需要 Meta 账号;而且离散增量指令天然就是 move-and-wait,VR 的连续跟踪反而会过冲。头显是租借的,侧载 Tailscale 要开发者模式 → 走 cloudflared 隧道,VPN 放路由器不放头显(Android 只允许一个 VpnService)。五个串联失败点,给 2 小时时限。液体:09-13 不上;真要上先做抓取套环 (外径 70 mm、带下沿凸缘,把摩擦抓变成形状抓)和盖子,万向环和重力供液放到 Demo Day 之后,永远不做泵。
shoulder_pan 推到实测 35.1° 覆盖之外,交棒那一刻的状态正好落在它要泛化的那一维上。操作者据此判定:「深度定位 + SmolVLA 收尾」买不到位置泛化——交棒之后跑的还是 SmolVLA。B1 现在真正的用途改成完全不用 SmolVLA 的纯几何抓取,当兜底 demo:位置泛化免费,但精度全压在标定上。检测那一关按数据集拆开重算过:OWLv2 @0.30 精度 100%,常被引用的「41.7% 检出率」是三个数据集混算的,在现役模型自己的数据集上是 12/12 ,拉低它的是换夹爪之前那份本就不该混进来的旧数据;1623 ms 对 B1 也不碍事,因为开跑前只检一次。B0 那边则已经定了用 FT-DINOSAUR(52.4 ms、7 个固定 slot、质量过了人工看图)。后半补上 B0 文档里缺的那块:原文只有 T1/T2/T3,没有判据也没有对照设计 。三条硬约束(只能测换外观、实机要 90 次才看得出 20 个点、基线必须重训)之后是三道门:零成本负对照 → 离线换外观逐帧比 → 实机 ABBA 配对 + 四级序数打分,每道门的判据事先写死。B2 按要求存档在页尾。
with the left arm,而现役模型训练数据里只有 with the right arm 一句;speed 用了 0.3,轨迹实测把策略要求的下降动作削掉了 11–20% ,削的正是够杯子那个关节。两处改回来重跑 10 次,昨天的 0/3 可能不用重训就解释掉。第 2 项在更宽的杯位补录示范——现有 202 集右臂横向只覆盖 35°。手眼排最后、不阻塞任何事,并更正了昨天给错的指示:棋盘要夹在爪子上,不是放桌上。
tasks.parquet:只有 5 种任务串,能训练的只有「把杯子拿起来」;倾倒 / 展示 / 递出 / 放下 一个都没录过(旧的 place-it-down 还跨在 0826 换夹爪那条线的另一侧)。写明三条路线各自要不要重录:Turn 1 和物体 token 都不用,深度路线只在那个五分钟测试失败时才要。录制前检查是全篇最重要的一节——因为 09-02 录了 102 集、88 集静默丢了深度:总线颗数、两个同型号腕部相机怎么区分、深度体检、磁盘余量,每项都给命令和合格标准。数据侧验收给了七个可机器计算的指标和阈值。专门一节讲去远端 GPU 训练的差异:必须在 tmux 里(否则 Pod 照样计费而你的进程死了)、只能传一个合并好的 repo_id、绝对不要传 rename_map(否则新 checkpoint 的输入名和机器人喂的对不上)、checkpoint 存持久盘。最后是跑测时看哪几个数、四种结果各自该得出什么结论。
vla_utils.py 证明:物体 token 放最后开新块,图像和语言的表征逐比特不变;写错位置就改写预训练特征。附带更正 B0 文档两处,并说明Gemini 不是我们的约束。
state_proj 写一个 object_proj ,embed_prefix 里约 15 行,外加 pad/att mask 三处)。走加法不走 Oat-VLA 的替换:实测推理 1329 ms、视觉只占 13%,替换图的那点速度收益已被否掉,只剩下丢掉预训练视觉对齐的风险。页面把两种泛化拆开:换杯子不需要新数据、正是 B0 对口;换位置受实测 35.1° 横向覆盖限制,架构变不出数据里没有的东西。T1 是决定项且仍未测——检测器要塞进每个动作剩下的 337 ms,必须用 train310(lerobot 那个 torch 是 CPU-only,用错会量出假的「跑不动」)。附带讲清楚现场重跑后那两张对照表各自证伪什么。
GOAL-DEPTH-INTEGRATION §1 引用的全部工作,按在我们计划里的作用分四组,每条附上文档原有的「对我们的含义」。Point Cloud Matters 直接推翻了「把深度伪彩成第四路相机」那条路线;Depth Helps 是最贴合我们处境的一篇(冻结 RGB 主干、每任务约 20 条轨迹,我们有 30 集);Grounded SAM 补上了缺的那一环——框提示 SAM 出掩码、掩码加深度得到物体点云,而这一步所需的内参今天刚标定完成;Oat-VLA 带着我们对它的两处更正:速度理由在我们板子上不成立,它的 59% vs 41% 重算后不显著。
trial 位,手持板子拍 15–20 张:中心 + 四角、近 + 远、一定要有明显倾斜。明日清单第 4 项的前置材料。
factory.py:128 直接 raise),必须先合并。昨天那批是左臂数据(action 0–5 维动、6–11 全 0,实测),现役模型是右臂;任务串不同,SmolVLA 靠语言分。两个合并集已做好:sameview(0826+sep3,100 集,视角与部署一致)和 all(202 集,含 9-2 那批抬头 6° 的视角)。脚本 train_smolvla_lr.sh 配方逐项抄自现役模型,只换数据、不传 rename_map(否则输入名和机器人喂的对不上)。推理端加了守卫:多任务数据集必须显式 --task。租 4090 一次约 1.3 h / $1。未测:脚本没在 4090 上真跑过;语言能否真分左右臂正是这次要答的问题。
TOMORROW),是跨天不变的职责说明。
核心前提:其他人全是远程的,你不量的东西以后没人能量。
含五次值得不再重演的事故,和五个只有站在机器人跟前才能回答的问题。
8.4 fps · detect 107.7 ms)。
这份告诉他仓库里已经有什么(免得重造)、实测的算力预算
(SmolVLA 一次推理 1329 ms 规划 50 步,占 1667 ms 预算的 80%,余 337 ms),
以及三个问题。最要紧那个是「录屏跑在哪台机器上」——
而更好的做法是给他 Tailscale,直接在真板子上量。
CascadeClassifier,Haar 那套现在跑不起来 ,留 YuNet。
安全层那处数字错误独立复核后只改了注释,钳位行为一个字没动。
D 做完,--dry 已验。
lerobot 环境的 torch 在这台机器上是 CPU-only,用它量耗时会得到假的「跑不动」。
trial 头部预置位——1 分钟,但后面全部依赖它(相机在会动的头上,外参只对一个姿态有效);
②跑测模型 ,今天信息量最大的一件事:4 个 checkpoint 一次都没上过硬件,
而记录里 0/4 的那个不是失败的模型,是没测过的模型——它的 95% 上界是 60.2%;
③内参、④手眼、⑤深度-RGB 时间对齐、⑥小批原生格式重录、
⑦录展示示范之前先量一次关节速度——步长上限是静默钳位,录完才发现被削平就得重录。
face_follow.py 的设计目标
(只跟一张主脸、死区、每帧硬上限、跟丢缓慢回中、绝不共享串口)逐条对着这个需求;
②冲突:它和策略试跑抢同一条总线,而安全层每帧覆盖头部;
③ 仲裁已定,而且是被数据逼出来的——50 集 19453 帧里头部两个自由度 σ 都是 0.0000,
策略从没见过头在动,所以操作阶段头必须不动,控制权留在策略进程内、按阶段换目标来源;
④落地前有个前置 :安全层注释断言该数据集 head_motor_2 = 99.649,
实测是 49.846 ;用它自己的公式重算,头是在标定范围内而非超出 564 counts——
而那正是「头部跳过绝对钳位」这个决定的依据。
depth/,训练和推理都不读它。含实测:GPU 146 ms/帧(6.9 Hz) vs CPU 2397 ms、
一次推理规划 50 步 = 1.67 秒(按 30 Hz 训练节拍,所以要 --chunk-rate)、语言指令是真的模型输入必须逐字一致。
然后对比三种接法:深度在策略外面(3D 杯位当开跑前的门 / 每次试验记录 / 失败诊断,不重训不重采,cup_locate_demo.py 已走通一半)、
深度当额外输入(不建议:SigLIP 和 ImageNet ResNet18 都是 RGB 预训练;state 17→20 维 = 换 embodiment,现有 checkpoint 全废)、
换点云策略。最后写清推荐路线的两个门槛:相机内参标定 + 手眼外参。
DepthCamera → DepthRecorder → 两个调用方),每处标了文件:行号。
开篇先认错:整套旁路是白写的 —— lerobot 从 2026-06-27(PR #3644)就原生支持深度,本地 checkout 早就带着它,
而写进代码的理由「深度会被视频编码压毁」本身是错的(lerobot 存 16-bit TIFF,不走视频)。
记录 9-03 查出的三个缺陷:Start 按两次会孤儿掉录制线程(跑了 13.7 小时、22 万帧、27 GB,把根分区写满)、
open 半途失败的 fd 泄漏(34 个泄漏句柄)、USB 层假死(相机开着但一帧不给,右臂四个数据集全空),三者叠加静默地让一晚 102 集里的 88 集丢了深度。
然后对比三条接入路线 —— 程序化感知(深度→3D 坐标,不训练,cup_locate_demo.py 已走通一半)、
深度当第四路相机(不建议,SigLIP/ResNet 都是 RGB 预训练)、原生 depth 特征(录得进、策略侧没人消费)——
并明确分开了实测与推断。
ping 冒烟测试、
用 SSH 密钥代替密码的做法,以及排错表(超时=Tailscale 没开/机器不在线、拒绝连接=ufw 按网卡放行、权限拒绝=登录信息错)。
真实地址和密码不放这个公开页 —— 在私有的 xlerobot-ops Space。
…0826-0042。
三路含 head、batch 16、学习率曲线对齐(治 A100 那次曲线没走完的病)、torchcodec 解 AV1。
附两个必须避开的坑(GPT 文档误丢 head、默认开 affine 平移会糊掉杯位)、相机怎么选、增强怎么开。
⚠ 至今没有任何 checkpoint 实机抓起过杯子,没有「已验证配方」,batch/增强都还是待实验变量。
train_smolvla_v2.sh (SmolVLA 正式版,带防坑守卫,防止悄悄浪费数据/学习率曲线跑不完)、
train_act.sh(ACT,针对 Jetson Orin Nano 8GB 统一内存调过参)、
以及旧版 SmolVLA 脚本、Colab 版、完整训练配方文档。
全部指向同一个数据集 Suyang99/xlerobot-cup-grasp-20260820-0230。
CB_REAR_Y 被直接抄了过来)、拼缝垫撞后横梁、
以及一条从来没生效过的 assert。
还有四等分爆炸图、逐点旋转模拟(−50° 间隙 6.19mm;加了承力链后抬头方向从 30.13 降到 21.42)、
8 个 STL 可下载。