- v1(2026-10-17 20:06,
40af3b4):模型一次生成整条 32 点路径,失败回落到原规划器("有老师部署")。- v1.1(20:25,
c51f8f9):加入后训练挖错循环。- v2(本稿):按用户决定改为 无老师部署 + 每个控制周期重算(闭环),删除全部"回落原规划器"设计; 加入具身智能领域主流做法的调研与对比(§1–§2),并据此调整模型输出、后训练方法和验收标准。
- v2.1(2026-10-17 20:58):训练机定为 RTX 3090 24 GB;near_column 验收改为 30/30,新增 §8.5「为什么会超时、无老师怎样做到 30/30」;新增 §8.6 控制周期业界调研与评估。
- v2.2(2026-10-17 21:10):调研 2024–2026 前沿生成式策略(流匹配/MeanFlow 一步生成、实时动作块 RTC、代价引导扩散规划、流策略强化学习微调、π0.5/FAST 等),逐项判断是否适用,新增 §2.4,并据此把动作头升级为一步流匹配头 + 碰撞代价引导 + 前缀条件(§6.1A)。
- v2.3(2026-10-17 21:30):逐项可行性核查。 4 路全文精读(约 40 篇论文)+ 沙箱 2D 双模态绕柱对照实验,对每一项方案给出证据等级、残余风险、门禁测试和回退;发现并修正 4 处硬伤(安全层离散检查漏检、
animTo时间律不可学、交叉淡入绕过安全层、训练/部署节奏不一致)和 24 处内部不一致。核查结论见新增 §0A,全部证据见docs/方案逐项核查报告.md。- 基于
main@3c7c814(贴立柱修复后的规划器)。本文只是方案,代码尚未编写。- 审查重点:§0 定位、§2 差异与优化、§5 输出表示、§7 后训练(APG)、§8 闭环部署与安全层、§9 验收。
| 项目 | 决定 |
|---|---|
| 部署形态 | 无老师:运行时只有「神经策略 + 碰撞安全层」,不加载
IK 大表、PRM 路网、A*/RRT,也不调用 solveDyn /
routeRT |
| 运行方式 | 闭环滚动重算(MPC 式):每个控制周期(默认 50 Hz,20 ms)读当前关节角和目标,重新推理一段短动作块,只执行最前面一小段,下一周期再算。某一周期算错,下一周期有机会纠正 |
| 碰撞安全层 | 保留。它不是老师:不做搜索,只对模型给出的下一小段做胶囊碰撞检查(已有
collideFree + 包围球预筛),不安全就换候选或刹停 |
| 老师的角色 | 只在离线训练时出现:生成预训练数据。后训练阶段用可微碰撞代价(§7),基本不再需要老师 |
| 不做的事 | 不学动力学(速度/加速度上限由插补器保证);不用相机/点云(环境固定:台架 + P01 立柱,几何已知) |
| 收益目标 | 冷启动(新目标到第一个动作)< 10 ms;每周期推理 + 安全检查 < 10 ms;拖拽重规划 P99(现状约 321 ms)不再存在 |
| 底线 | 实时拖拽碰撞帧 = 0(安全层保证);到达率、行程在 §9 的指标上不低于现有规划器 |
为什么安全层必须保留:调研里最好的神经运动策略在静态场景里仍有约 10% 的轨迹发生碰撞(§1 DRP 附录表 6、ELMP 表 I)。 我们的环境几何完全已知、检查只要几毫秒,保留它代价极小,却把"偶尔撞一下"变成"偶尔停一下"。
先说清楚一件事:没有任何方案能在实测前被"证明完全没有风险"。 论文证据只能说明"别人在相近条件下做成过";我们的条件(低维状态、单根固定立柱、5M 参数、浏览器推理、30/30)没有一篇论文完全一样。所以 v2.3 的做法是:每一项都给出①证据等级 ②残余风险 ③在本仓库可测的门禁(通不过就不进下一步)④通不过时的回退。唯一做成"硬保证"的是安全层(改为距离认证后,碰撞与否不依赖模型好坏)。
证据等级:A 有充分证据(直接先例 + 数字) · B 部分证据(相近先例,需本仓库验证) · C 仅推断 · ✗ 有反证(已修改)
| # | 原方案 | 反证 | v2.3 修正 |
|---|---|---|---|
| H1 | §8.3 安全层用 1°+半格离散采样"保证不撞" | 本臂杠杆实测:关节转 1°,TCP/胶囊最多移动 24.3 mm;0.5° 间距下两采样点之间可偏出约 6 mm,远大于 0.3 mm 余量。仓库自己的规划报告也记过 0.28 mm 残余侵入。Schwarzer 2005、LARC 均证明离散检查会漏检 | 臂×立柱/台架改为距离下界认证:d(q_a)+d(q_b) > Σ r_j· |
| H2 | §4.5 沿用 animTo(全局 smoothstep +
总时长夹取)做时间参数化 |
同一状态的标签速度取决于输入看不到的"整条路径长度/进度" → 非马尔可夫;起步段 Δq≈0 → 闭环可能起不了步。MπNets 为此把老师路径重定时为匀速;Diffusion Policy 报告单步策略会卡在停顿动作 | 改为局部可观测时间律:匀速巡航 + 只按"剩余路程"决定的梯形加减速,并把当前速度 q_t−q_{t−1} 加入输入 |
| H3 | §8.1 插补器对新旧动作块做时间集成/交叉淡入 | 实际执行的是两块的混合,没被安全层检查;左绕块与右绕块平均可能正好穿柱。π0 试过时间集成后放弃,BID 报告多模态下掉性能 | 删除交叉淡入,执行的就是被认证过的那一块;块间连续性靠前缀条件(§6.1A) |
| H4 | 部署每 20 ms 推理、只走 1 步;APG 每 3 步推理一次;"周期"三种定义 | BID(2408.17355)证明动作时域 = 1 会破坏块内一致性、导致来回摆动 | 统一为:50 Hz 执行,每 3 步(60 ms)推理一次、提交 3 步;APG 展开节奏与部署完全一致。"每步重推理"留作 A/B 对照 |
| § | 方案 | 等级 | 关键证据 | 残余风险 | 门禁(本仓库) | 回退 |
|---|---|---|---|---|---|---|
| §0 | 不用 VLA 大模型,3–5M 参数专用策略 | A | IMPACT 4.67M 参数、300 Hz;π0 3B 单次预填充 46 ms(4090) | — | — | — |
| §4.1–4.3 | 采样式老师离线造 5 万条任务 | B | MπNets、DRP、ELMP 均用规划器老师;MπNets:老师不一致时碰撞率 13.78%,一致老师 0.94% | 我们的老师是随机采样式,同类任务可能左右绕不一致 | 同任务 5 个种子:同伦类一致率 ≥ 90%,行程 CV < 10% | 固定种子 + "最短同伦类优先",或用 PRM 路网 A*(确定)作老师 |
| §4.3 D 类 | 不可达目标 → 停在最近安全位形 | B | DRP 有同类数据 | 停靠点随目标跳变 | 目标扫过立柱时相邻 20 ms 停靠点跳变 < 5 mm | 停靠标签加连续性约束 |
| §4.5 | 时间参数化 | ✗→改 | 见 H2 | — | 近邻标签方差 < 10% 步长;起步失败率 = 0 | 输入当前速度 |
| §4.5-④ | "路径后缀 = 免费 DAgger" | ✗→删 | DAgger 要求学生自己偏离后的状态;后缀仍是老师状态 | 协变量偏移 | 闭环到达率与单步准确率差距 | 关节噪声增广(σ 0.5–1°,DART +62%)+ 离线老师重标 + §7 |
| §5.1 | 输入:sin/cos、TCP、6D 姿态、胶囊距离 | B | 6D 旋转连续(Zhou 2019);ELMP、MπNets 同类输入 | 位姿目标多 IK 分支 → 额外多峰;缺子目标/前缀/速度字段(已补) | 去胶囊特征消融差 ≥ 3 pp 才保留 | 加目标分支标志 |
| §5.2 | 16 步 Δq 动作块 | A | DRP、Diffusion Policy(位置式优于速度式) | 补零样本过多 → 早停 | 补零占比 > 30% 则降权 | — |
| §6.1 | IMPACT 式编码器-解码器去点云 | A(结构)/C(够不够) | IMPACT 原文表 7 | 实算约 4.1M | 1000 样本过拟合 → 0;held-out ≥ 95%(APG 前) | 加宽 |
| §6.1A | 动作头:一步生成 | B | 沙箱实验见 0A.3;COT 有双峰实证;K-MF 表 1 原生 MeanFlow 会失败;OFP 自引导 λ=0.5 出现模态塌缩 | 小模型能否学出陡峭模态边界未知;训练不稳 | M5 A/B:一步头 vs WTA,看穿柱率、到达率、摇摆率 | WTA K=4(沙箱中同样全部通过) |
| §6.1A | 一步头选型 | B | 首选 MeanFlow(沙箱验证)或 Shortcut+COT 配对(无需 JVP);否决 Consistency Policy(原文承认偏向一侧)、OneDP(故意取单模态)、朴素 1 步 FM(数学上等于条件均值) | 组合未见论文 | 同上 | WTA |
| §6.1A | 生成时碰撞代价引导 | ✗→改 | 无论文在 1–2 步下测过;DiffusionSeeder 5 步引导仅 80.6%→81.1%;RTC 附录:引导权重过大发散 | — | — | 改为事后投影:对输出块做 1–2 步解析胶囊距离梯度,只在 d < 余量时启用;修不了"绕错侧",靠多候选 + 安全层 |
| §6.1A | 前缀条件(RTC) | B | RTC 原文只验证 n=5 步去噪、需反向传播;训练时前缀条件化(2512.05964)推理零开销,d≥2 时优于 RTC,天然适用 1 步生成器 | 我们 d≈0–1 时略差 | 块边界加速度跳变 vs 无前缀 | 无前缀 + 一致性打分 |
| §6.1A | B 样条输出 | C | 仅 FAST/频域表示的间接证据 | 可能损失贴柱精度 | near_column 与 16 步 Δq 对比 | 默认改回 16 步 Δq,B 样条降为可选 |
| §6.2 | 损失:WTA-L1/CE、FK 胶囊端点、平滑 | B | ELMP 式 FK 损失(§III-B 式 2) | 流头损失原缺(已补:流匹配损失 + FK 损失加在一步输出上) | FK 消融:C 类碰撞率降 ≥ 20% 才保留 | — |
| §6.3 | 训练配置与耗时 | C | DRP:4090 上 100 万步 3 天(含点云) | 原文"20 万步≈30 epoch"算错,实为约 68 epoch | 先跑 2000 步测吞吐再定步数 | 30 epoch ≈ 8.8 万步 |
| §6.4 | 胶囊距离 PyTorch/JS 对拍 | A(工程) | 仓库已有 0 差异对拍惯例 | 浮点不可能"0 误差" | 布尔判定 0 差异 + 距离误差 < 1e-4 mm + 梯度对有限差分 < 1e-3 | — |
| §7.1 | APG 可微微调(ELMP) | A | ELMP:碰撞率 31.3%→8.9%;1 万示范+APG 72.0% > 60 万纯 BC 57.9%;H=69 步仅用梯度裁剪 ≤1 | 铰链损失只能侧推,不能从"撞柱"换到另一侧;可能压缩多模态;ELMP 中路径长度 +23% | 每轮左右比例监控;行程门禁 | 保留 BC 锚定损失 |
| §7.2 | 无老师挖错 + 门禁 | B | DRP 迭代师生微调 +45%(5 轮 10 h) | 门禁集与验收集重叠 → 选择偏差(已拆分) | 遗忘门禁:A 类每轮降幅 ≤ 0.5 pp | 回滚 |
| §7.3 | 拒绝采样自蒸馏 | B | ReST | 选"最短" → 贴柱,余量变小、多样性塌缩 | C 类间隙中位数 ≥ 原 80% | 改为"间隙 ≥ 阈值中最短" |
| §7 可选 | ReinFlow/DPPO | B | ReinFlow +40%,1–4 步可调,比 DPPO 省 62.8% 墙钟;DPPO 16 步块稳定 | RL 会重塑模式分布(DPPO D3IL) | 按左右分组平衡奖励 | 不做 |
| §8.2 | 模式/噪声粘滞 | ✗→改 | BID:沿用上次噪声 7 个任务中 3 个变差;后向一致性打分 + N=16 相对 +32% | — | E5 摇摆 < 1% | 改为 BID 式一致性打分(与已提交块重叠步加权 L2) |
| §8.3 | 安全层 + 可刹停不变式 | 不变式 A;离散实现 ✗→改 | Thumm & Althoff 2022 failsafe 盾 | 刹停"最大减速度"原未定义(已补加速度上限) | 见 H1 | 训练余量提到 3–6 mm |
| §8.3 | 安全层耗时 < 5 ms | C | 仓库 collideFree 1.25 ms/次 | 贴柱时预筛失效;每步 4–13° | near_column 全程 P99 < 5 ms | 距离认证一次查询覆盖整段;提交步数降到 2 |
| §8.5 | 子目标头、价值头、短前瞻、卡死换向 | B / C | AWE(航点 +25%)、SHAC、BID | 卡死换向可能活锁 | 50 个对抗用例 3 s 内恢复 ≥ 95%,活锁 = 0 | 子目标改为离散绕行锚点分类 |
| §8.6 | 50 Hz 策略层 | B | π0 50 Hz、Diffusion Policy 10 Hz 预测 16 执行 8 最优 | rAF 60 Hz 与 20 ms 不整除;后台标签页节流 | P99 周期误差 < 2 ms | Worker + 自有时钟 |
| §8/§9 | 浏览器推理 2–5 ms | C(偏乐观) | WebGPU 每次 dispatch 33–67 μs、同步 2–3 ms(2604.02344 表 6) | 8 层 Transformer 约 150–300 次 dispatch → 调度开销 5–20 ms | M4 后立刻导出 ONNX 实测 batch=8 P99 | wasm-SIMD 多线程;每 3 步推理一次(预算 60 ms) |
| §9 | 验收 30/30 | ✗→改 | 30/30 时失败率 95% 上界仍约 9.5% | 30 例被反复用于挑模型 | 新造 ≥1000 例 near_column 一次性验收集(0 失败 ⇒ 上界约 0.3%);到达率分母只算可达任务 | — |
为验证"一步生成会不会把左右平均成穿柱",在沙箱做了一个最小实验:2D
点从柱左侧到右侧,示教一半从上绕一半从下绕,16 步动作块、每 3
步重推理,与本方案同构。代码 ml/toy/toy_bimodal.py,150
个"起终点都贴近中轴"的难例:
| 动作头 | 单样本、无安全层:到达 / 穿柱回合 | 8 候选 + 安全层:到达 / 穿柱 / 平均刹停 | 推理(CPU,8 候选) |
|---|---|---|---|
| MSE 回归 | 100% / 0% | 100% / 0% / 0 | 0.13 ms |
| WTA K=4 | 100% / 0% | 100% / 0% / 0 | 0.19 ms |
| 流匹配 10 步 | 100% / 4.0% | 99.3% / 0% / 3.7 | 2.13 ms |
| 朴素流匹配 1 步 | 87.3% / 23.3% | 81.3% / 0% / 14.0 | 0.25 ms |
| MeanFlow 1 步 | 100% / 2.7% | 100% / 0% / 0.3 | 0.25 ms |
结论与局限:
以下数据均来自论文原文(链接见 §13)。
| 工作 | 年份 / 会议 | 输入 | 输出 | 老师与数据量 | 关键做法 | 运行方式 |
|---|---|---|---|---|---|---|
| MπNets(NVIDIA) | 2022 CoRL | 点云 + 当前关节角 + 目标位姿 | 下一步关节位置 | 规划器生成 300 万+ 问题、50 万+ 环境;8×V100 训练一周 | 端到端行为克隆 | 闭环 9 Hz,每次执行约 70% 推出的路径,1 kHz PD 跟踪 |
| Neural MP(CMU) | 2024 / IROS 2025 | 点云 + 关节角 + 目标 | GMM(LSTM) | AIT* 等,100 万–300 万条 | 测试时优化(TTO):采样多条,选与场景穿透最少的 | 开环为主;冷启动约 2970 ms |
| MπFormer / Avoid Everything(NVIDIA) | 2024 CoRL WS | 点云 | 关节动作 | 规划器数据 | 师生微调 + 困难负样本挖掘 | 闭环 |
| DRP / IMPACT(CMU) | 2025 CoRL | 点云 + 当前关节角 + 目标关节角 | 动作块:10 步关节增量,MSE 回归 | cuRobo 生成 1000 万条;4090 训练 3 天 | ① 大规模预训练 ② 迭代师生微调(局部控制器 Geometric Fabrics 当老师,不用全局规划器,因为每步都规划太贵)③ 局部反应层 DCP-RMP 改写目标 ④ 加入"目标被挡→停在最近安全处"的数据 | 闭环;4.67 M 参数,300 Hz(4090),冷启动 3.48 ms |
| ELMP(ETH) | 2026 arXiv | 点云 + 关节角 + 目标位姿(12 维) | 关节增量 | AIT* 约 60 万条 | 行为克隆后做 APG 微调:可微运动学展开,碰撞/到达/平滑三项损失直接反传,不再需要老师数据 | MPC 式闭环 30 Hz;冷启动 7.8 ms |
| Diffusion Policy / ACT 一类 | 2023– | 视觉 + 本体 | 动作块(扩散 / CVAE) | 人类示教 | 动作块 + 滚动执行(receding horizon)+ 时间集成 | 闭环 |
几个关键数字:
行业共识:
| 条件 | 主流(DRP/ELMP 等) | 本项目 | 意味着 |
|---|---|---|---|
| 环境 | 未知、多变,靠点云感知 | 固定且精确已知(台架 + 立柱,1936 个胶囊) | 不需要点云编码器;模型可以小很多;碰撞检查是精确的 |
| 机器人 | Franka 7 轴 | 自研 6 轴,J1/J3/J6 连续转 | 需处理连续轴展开 |
| 碰撞模型 | SDF / 球近似,有感知噪声 | 胶囊解析距离,可微 | 可以直接做 APG;安全层可信 |
| 运行平台 | 台式 GPU | 浏览器(后续真机) | 模型要小,ONNX + WebGPU/wasm |
结论:我们的问题比主流窄得多也"干净"得多,主流用来对付感知噪声和环境泛化的大部分复杂度(点云、千万级数据、多环境)都可以省掉,资源应投在闭环稳定性、多解选择和安全层上。
| # | v1 做法 | 主流做法 | v2 调整 | 理由 |
|---|---|---|---|---|
| 1 | 一次生成整条 32 点路径,开环执行 | 闭环 + 短动作块滚动执行 | 改为动作块策略:每周期输出未来 16 步(320 ms),只执行前 2–4 步 | 用户要求每周期重算;可纠错、可应对拖拽目标变化 |
| 2 | 失败回落原规划器 | 无回落;靠后训练提升 + 局部反应/检查 | 删除回落,改为安全层:换候选 → 刹停保持 → 下周期重算 | 用户决定无老师部署 |
| 3 | 512 桶离散化 + 自回归 186 token | DRP 用 MSE 回归动作块;Neural MP 用 GMM | K 个模式的动作块头(K=4)+ 模式分类,非自回归一次前向 | 闭环下多峰主要出现在"刚出发选左绕还是右绕",K 模式足够;一次前向比 186 步自回归快一个数量级 |
| 4 | 以目标位姿为条件 | DRP 用目标关节角(IK 另算);ELMP 用目标位姿 | 用目标位姿(位置 + 6D 旋转 + 模式标志),末段可选局部牛顿精修 | 无老师就没有全量 IK;位姿条件让模型连 IK 一起学。局部牛顿精修只是梯度下降几步,不属于搜索 |
| 5 | 后训练:挖错 + 老师重标(每轮 1–2 小时老师计算) | DRP:便宜局部老师;ELMP:APG 无老师 | 主力换成 APG(可微胶囊碰撞),挖错循环保留但不再需要老师重标 | 我们的胶囊模型可微且精确,正好适合 APG;省掉绝大部分老师计算 |
| 6 | 拒判头(REJECT) | DRP:目标被挡时学会"停在最近安全处" | 改为"停靠"行为:目标不可达时,数据里老师路径停在离目标最近的安全位形 | 闭环下"停在最近处"比"拒绝"更有用(目标常在拖拽中短暂进入立柱区) |
| 7 | 20 万条老师数据 | 主流百万–千万条,但它们要泛化到任意环境 | 降到 5 万条(+ 切片增广),其余靠 APG | ELMP 显示 APG 下 1 万条已胜过 60 万条纯克隆;我们的环境固定,需求更小 |
| 8 | 无 | DRP 的 DCP-RMP 局部反应层 | 暂不做;安全层已覆盖静态环境。未来真机有人/动态障碍时再加 | 当前环境静态 |
segSegDist
的可微版本),训练和部署检查同一套几何,消除"训练用球、检查用网格"的口径差(ELMP
的做法有这个差)。用户问:"能不能用更先进的大模型算法?"先说结论:大模型本身(VLA,30 亿参数级)不适合这个任务,但它们背后的几项动作生成技术很适合,而且能直接解决我们 v2 的三个弱点:K=4 固定模式太粗、动作块拼接处有顿挫、贴柱难例要靠规则兜底。
| 技术(代表工作) | 核心做法 | 公开结果 | 用在我们这里? |
|---|---|---|---|
| 流匹配动作头(π0 / π0.5 action expert,2024–25) | 用流匹配从噪声生成连续动作块,天然多模态 | π0 以 50 Hz 输出 50 步动作块 | ✅ 采纳,替换 K=4 WTA 头:不再只有 4 个固定"模式",左绕/右绕/上绕及其细分都能表达 |
| 一步生成:MeanFlow(MP1,AAAI 2026)、OFP(2026)、条件 OT 耦合(CoRL 2025)、Consistency Policy / OneDP | 学"平均速度场"或自蒸馏,1 次前向就出动作,不需迭代去噪 | MP1 推理约 6.8 ms;OFP 一步超过 100 步扩散,并在 π0.5 上一步胜过原 10 步;OneDP 1.5 Hz → 62 Hz | ✅ 采纳 OFP/MeanFlow:OFP 从零自蒸馏,不需要预训练老师模型,与"无老师"原则一致;推理仍是 1–2 次前向 |
| 代价引导采样(MPD、EDMP、GPD,2023–25) | 采样过程中加入碰撞代价梯度,把轨迹推离障碍 | MPD/EDMP 引导显著提高成功率;GPD 约 0.8 s | ✅ 采纳,但只在 1–2 步内做:我们已有可微胶囊距离(APG 要用),在去噪最后一步加一次梯度修正,几乎零额外训练成本。不采纳整条轨迹扩散(MPD 约 1 s,太慢) |
| 扩散种子 + 优化(DiffusionSeeder + cuRobo,CoRL 2024) | 扩散给初值,GPU 轨迹优化几轮 | 真机规划 26 ms,比 cuRobo 成功率高 51% | ⚠️ 部分采纳:只保留"对已生成动作块做 2–3 次局部梯度修正",不引入全局轨迹优化器(那等于又加回一个老师) |
| 实时动作块执行 RTC(Black 等,NeurIPS 2025) | 生成新动作块时,把已提交但未执行的动作当作"已知前缀"补全,异步推理不卡顿 | 解决动作块拼接处的停顿与跳变 | ✅ 采纳:以"已提交的 3 步"为前缀条件生成新块,替代 v2 的时间集成;推理偶发超时也不会顿挫 |
| 流/扩散策略的强化学习微调(DPPO,ICLR 2025;ReinFlow,NeurIPS 2025) | 在仿真里用 PPO 类方法微调生成式策略 | ReinFlow 在操作任务上成功率平均提升 40%,可在 1–4 步去噪下微调,比 DPPO 省 60%+ 时间 | ✅ 采纳为第三阶段(可选):APG 擅长连续可微目标;"到达/卡死/安全层刹停次数"这类离散目标交给 ReinFlow。仿真就是我们的 GPU 批量 FK + 胶囊检测,3090 上可跑 |
| FAST 动作分词 / π0.5 知识隔离(2025) | DCT 压缩动作块成离散 token,供大语言模型骨干学习 | FAST 训练提速最多 5 倍 | ❌ 分词本身不采纳(为语言大模型服务,自回归推理慢);⚠️ 借鉴"频域/样条表示":动作块改用 B 样条控制点输出,平滑性由表示保证 |
| VLA 大模型(π0/π0.5、GR00T、OpenVLA) | 视觉语言骨干 + 动作专家 | 3B 模型单次预填充 46 ms(4090) | ❌ 不采纳:我们没有图像、没有语言指令,环境固定精确;30 亿参数只会更慢,不会更准 |
v2.3 核查修正(见 §0A):①碰撞代价引导改为输出后的事后投影(1–2 步生成下无引导证据);②RTC 改为训练时前缀条件化(2512.05964,推理零开销);③一步头首选 MeanFlow(沙箱验证)或 Shortcut+COT,否决 Consistency Policy/OneDP/朴素 1 步 FM;④B 样条降为可选;⑤OFP 未找到公开代码,不作首选。
结论:v2.2 采纳"一步流匹配头 + 碰撞代价引导 + 前缀条件 + B 样条表示 + 可选 ReinFlow"。 这正是 π0.5、MP1/OFP、MPD、RTC 这几条前沿线在"低维状态、精确几何、实时控制"场景下的组合,规模仍然是几百万参数。
| 阶段 | 在哪里跑 | 说明 |
|---|---|---|
| 预训练数据生成 | Hark 沙箱(2 vCPU / 7 GB,Node)或用户机器 | 纯 JS,无需 GPU |
| 预训练 + APG 微调 | 用户的 GPU 机器 | 沙箱无 GPU、无 PyTorch。已定:RTX 3090 24 GB(显存对 3–4 M 参数模型绰绰有余,可用 batch 1024–2048) |
| 部署推理 | 浏览器(onnxruntime-web,WebGPU 优先,wasm 兜底);后续真机控制器 | 与现有查看器同页 |
conda create -n armtf python=3.11 -y && conda activate armtf
pip install torch --index-url https://download.pytorch.org/whl/cu121 # 按本机 CUDA 版本选
pip install numpy pyarrow tqdm tensorboard onnx onnxruntime| 文件 | 作用 |
|---|---|
ml/gen/gen_dataset.cjs |
采样任务 → 调老师 → 校验 → 时间参数化 → 写分片 |
ml/gen/sampler.cjs |
起点/目标采样(4.3) |
ml/gen/run_parallel.sh |
多进程,不同种子 |
ml/data/shard_XXXX.jsonl |
原始样本(不入库) |
复用 tests/route_bench_setup.cjs
装配求解器(关节表、docs/travel.json、docs/collide.json)。
{
"id": "s0003_000127", "mode": "pos" | "pose",
"q0": [6], "T": [x,y,z], "R": [[3x3]] | null, "tool": 0,
"path": [[6], ...], // 老师折线 q0 → via... → q_end
"reached": true, // false = 目标不可达,q_end 为离目标最近的安全位形("停靠")
"travel_deg": 123.4, "plan_ms": 812.0,
"fp": "collide.json 指纹"
}关节限位(docs/travel.json):J1/J3/J6 连续 ±180°;J2
[−92, 9],J4 [−111, 16],J5 [−93, 34]。
| 类别 | 占比 | 采样方式 |
|---|---|---|
| A 均匀 | 45% | q0、目标位形 b 均匀采样且无干涉;目标 = fk(b)(pose
模式加 orient(b)) |
| B 直线被挡 | 30% | q0→b 关节直线 1° 细验有干涉(route_bench 口径) |
| C 贴立柱 | 15% | b 满足 nearColumn,q0 在立柱另一侧(near_column_bench
口径) |
| D 目标不可达 | 10% | 目标在立柱内/所有分支都撞/工作空间外;老师标签 = 停在离目标最近的安全位形 |
solveDyn(松手口径)。poseRelaxed 样本只当 pos 模式用。routeRT 1.5
倍的视为绕远(先统计,再定是否丢弃)。闭环策略学的是"在某个状态下,接下来 16 步怎么走",所以要把整条路径切成很多个"状态 → 动作块"样本:
animTo
的全局 smoothstep + 总时长夹取。改为局部可观测时间律:按轴速比
VREL = [0.6, 0.6, 0.9, 0.9, 1.2, 1.8]
匀速巡航,加减速为梯形,且只取决于"当前速度 +
剩余路程"(加速度上限另设),控制周期 dt = 20
ms;当前速度 q_t − q_{t−1} 作为输入。solveDyn 约 0.7 s/条:5 万条在沙箱 2 进程约 5
小时;用户 8 核机器约 1.5 小时。文件 ml/prep/build_dataset.py →
train/val/test.parquet、norm.json。
| 量 | 维度 | 编码 |
|---|---|---|
| 当前 q_t | 6 | 每轴 (sin, cos) → 12;限位轴另加归一化值 → +3 |
| 当前 TCP 位置与姿态 | 3 + 6 | fk(q_t)、orient(q_t) 的 6D
表示(给模型笛卡尔线索) |
| 目标位置 T | 3 | /600 mm |
| 目标姿态 R | 6 | 6D 表示;pos 模式填 0 |
| 目标 − 当前 TCP | 3 | 位置差,/600 mm |
| 模式 | 2 | one-hot [pos, pose] |
| 上一周期选的模式 k_prev | K+1 | one-hot(含"无"),用于模式粘滞 |
| 关键胶囊对最小距离 | 8 | 当前位形下臂各段到立柱的胶囊距离(cheap,现成函数),给模型"离柱子多近"的直接信号 |
J1/J3/J6 统一用 unwrapTo
口径展开后再做增量;预处理和部署共用一份实现,§6.4 对拍时一并验证。
条件特征(约 60 维)──MLP──▶ 8 个条件 token (d=192)
│
4 层 Transformer encoder
│ (memory)
K×16 个可学习动作 token ──▶ 4 层 Transformer decoder(非自回归,一次前向)
│
├─ 动作头:每 token 输出 6 维 Δq
├─ 模式分类头:K=4
├─ 价值头(剩余时间/代价):1 ← v2.1,§8.5
└─ 子目标头:2 个关节空间途经点 + 是否需要(仅冷启动用)← v2.1,§8.5
| 超参 | 值 |
|---|---|
| d_model / 头数 / FFN | 192 / 8 / 768 |
| encoder / decoder 层数 | 4 / 4 |
| 参数量 | 约 3–4 M(DRP 为 4.67 M,含点云编码) |
| 推理 | 一次前向得到 4 条候选动作块 |
| v2 WTA 头(保留为基线) | v2.2 一步流匹配头(默认) | |
|---|---|---|
| 多模态 | 固定 K=4 个模式 | 连续分布;每周期并行采 K=8 个噪声 → 8 条候选 |
| 训练 | WTA-L1 + 模式 CE | MeanFlow(沙箱已验证 1 步可用)或 Shortcut + COT 条件配对(无需 JVP);损失 = 流匹配损失 + FK 胶囊端点损失(加在一步输出上)。不采用 Consistency Policy / OneDP / 朴素 1 步 FM |
| 输出 | 16 步 Δq | 16 步 Δq(v2.3:B 样条 6 控制点降为可选,需 near_column 消融不掉点才启用) |
| 前缀条件 | 无 | 训练时前缀条件化(2512.05964):输入已提交且未执行的步,训练时随机遮盖前缀长度 0–3;推理零额外开销 |
| 碰撞修正 | 无 | 事后投影:对输出块做 1–2 步解析胶囊距离梯度,仅 d < 余量时启用(v2.3:生成中引导在 1–2 步下无证据) |
| 推理成本 | 1 次前向 | 1–2 次前向 + 1 次解析梯度(JS 实现,不走 ONNX) |
| APG 兼容 | ✅ | ✅(固定噪声后生成器是确定性可微映射) |
候选排序(v2.3 修正):不用"噪声粘滞"(BID 中 7 个任务有 3 个变差),改为 BID 式一致性打分:分数 = −‖候选与上一已提交块重叠步之差‖²(加权)− λ·价值头剩余代价。子目标头、价值头(§8.5)保持不变。
M4 同时实现两种头,M5 预训练后在 near_column + held-out 上 A/B;若一步流匹配不优于 WTA,回退 WTA(风险可控)。
L = WTA-L1(动作块, 最近模式) 权重 1.0
+ CE(模式分类) 权重 0.5
+ FK 损失:预测与标签位形下各连杆胶囊端点的位置差 权重 0.5 ← 借鉴 ELMP
+ 平滑:二阶差分 权重 0.05
+ L1(剩余时间) 权重 0.1
| 项 | 值 |
|---|---|
| 优化器 | AdamW,β=(0.9, 0.95),wd 0.01 |
| 学习率 | 1e-3,预热 1000 步,余弦退火(同 DRP 量级) |
| batch | 1024(3090 24 GB) |
| 精度 | bf16 混合精度 |
| 步数 | 先跑 2000 步测吞吐再定;参考:200 万样本 × 30 epoch ÷ bs 1024 ≈ 6 万步(v2.3 更正:原"20 万步≈30 epoch"实为约 68 epoch),验证集闭环成功率不再上升即停 |
| 预计耗时 | RTX 3090 约 1.5–3 小时(估算;DRP 4.67 M 参数在 4090 上预训练 100 万步用 3 天,我们的样本少、无点云编码,步数约其 1/5,跑完首轮再校正) |
ml/eval/collide_torch.py:胶囊距离的 PyTorch
批量版(可微,§7 要用),先与 JS
collideFree 对拍 10 万个位形,判定 0 误差。不再请老师标注,直接让模型在可微仿真里闭环展开,用代价反传:
for 每个 batch(随机采样 q0 和目标,82 ms 级别的便宜采样,不需要老师):
q = q0
for t in 0..H-1 (H = 60 个周期 ≈ 1.2 s,长任务分段展开):
chunk, logits = π(obs(q, 目标))
Δq = chunk[选中模式][0:3] # 执行前 3 步,与部署一致
q = clamp(q + Δq) # 限位
累计 L_col(q), L_smooth(Δq)
L = w_tgt·L_target(q_H) + w_col·ΣL_col + w_smooth·ΣL_smooth (+ w_len·行程)
反传(BPTT),梯度裁剪 ≤ 1.0
collide.json 的 margin_mm
基础上再加 5 mm 训练余量;包含臂×立柱、臂×台架、臂×臂(非相邻段)。每轮:
对每个任务采样多条闭环轨迹(不同模式、不同温度),只保留验算通过且最短的一条做行为克隆标签——模型自己当老师。适合 APG 收敛后进一步缩短行程。
每 60 ms 推理一次(v2.3,见 H4;执行仍是 50 Hz,每步 20 ms):
1. 读当前 q(真机读编码器;查看器读当前插补位形)和最新目标(拖拽时每周期都在变)
2. 推理一次:一步头 8 条候选(WTA 基线为 4 条)16 步动作块 延迟须 M4 实测
3. 按"模式概率 − 切换代价"排序(§8.2)
4. 安全层依次检查候选的前 n=3 步(60 ms 的运动)+ 刹停段(§8.3)
第一个通过的 → 把这 3 步"提交"给插补器;记下 k_prev
(实际上 20 ms 后只走完第 1 步,第 2、3 步是已验证的"缓冲":
下一周期的新结果会覆盖它们;若下一周期推理超时或全部不安全,就沿缓冲 + 刹停段安全停下)
5. 全部不通过 → 进入刹停:按已验证的刹停轨迹减速停下,保持;下一周期继续推理
6. 到达判据:TCP 误差 < 1 mm(pose 另需 < 0.5°)且速度≈0 → 结束;
接近目标(< 5 mm)时可选做 1–3 次局部牛顿精修(solveTo 单步,不是全量 IK)
v2.3:删除插补器交叉淡入/时间集成(见 H3)。执行的必须就是安全层认证过的那一块;块间连续性由前缀条件和一致性打分保证。"每 20 ms 重推理只执行 1 步"仅作 A/B 对照。
ik-glue.js
的"每帧碰撞守卫"保留,作为第二道保险。| 有 | 没有 |
|---|---|
traj_v2.onnx(fp16,约 7 MB)+
norm.json |
PRM 路网(collide.json.roadmap)、IK 候选大表 |
胶囊碰撞检查(现有
collideFree、包围球预筛、pair2d 表) |
solveDyn / routeRT / RRT / A* |
正运动学 fk / orient、局部牛顿精修
solveTo 单步 |
全量 IK 枚举 |
collide.json
指纹写进模型;不一致时前端拒绝运行并提示重训(不再回落旧规划器)。
超时不是算得慢。 模型每周期只要几毫秒,比原规划器快得多;"超时"指的是机械臂在规定时间内没走到目标,是决策错了,不是计算慢了。无老师闭环下有三种典型情形:
| 失效形态 | 现象 | 为什么更快的推理救不了 |
|---|---|---|
| 局部极小 / 活锁 | 目标在立柱背后,策略每周期都想"直着过去",安全层每周期都刹停,原地抖动 | 每周期都做同样的错误决定,算得再快也只是更快地重复 |
| 模式摇摆 | 这一周期选左绕、下一周期选右绕,来回切换,进度为零 | 同上 |
| 绕远 | 选了一条可行但很长的路,在时限内走不完 | 方向对了但路线差 |
原规划器不会这样,是因为它做全局搜索(PRM + A*)。去掉老师后,全局"想清楚往哪绕"这件事必须由模型自己承担。v2.1 用五个手段(全部在运行时不需要老师)把 near_column 要求提到 30/30:
验收相应改为(§9.2):near pos / near rt 都必须 30/30,且到达用时 ≤ 老师路径动画时长 × 1.3。
工业臂 / 研究臂的外部实时接口(伺服层)
| 产品 / 接口 | 周期 | 说明 |
|---|---|---|
| Franka FCI(libfranka) | 1 ms(1 kHz) | 关节位置/速度/力矩、笛卡尔位姿;每周期往返 + 计算必须 < 1 ms |
| Universal Robots e-Series RTDE | 2 ms(500 Hz) | servoj 默认 t = 0.002 |
| Universal Robots CB3 RTDE | 8 ms(125 Hz) | servoj 默认 t = 0.008 |
| ABB EGM | 4 ms(250 Hz),可设为 4 ms 的整数倍 | 控制滞后 10–20 ms(随机型) |
| KUKA RSI | 4 ms(Fast)或 12 ms(Normal) | |
| FANUC DPM | 约 8 ms | R-30iB 无 1–2 ms 通道 |
| MoveIt Servo(ROS 2) | 默认 10 ms(新版);旧版示例 34 ms | 常设为 ros2_control 更新频率的倒数(如 50 Hz → 20 ms) |
| 舵机(RC PWM) | 20 ms(50 Hz) 帧周期 | 数字舵机可到更高帧率 |
学习型策略的推理周期(策略层)
| 方法 | 策略频率 | 动作块 | 执行方式 |
|---|---|---|---|
| MπNets | 9 Hz | 单步 | 线性插值,1 kHz PD 跟踪 |
| Diffusion Policy | 10 Hz | 16 步 | 线性插值到 125 Hz 交给 UR5 |
| ELMP | 30 Hz(真机) | 单步 Δq | 每步 3 个航点线性插值给 Franka 位置控制器 |
| π0 | 50 Hz 动作,约每 0.5 s 推理一次 | 50 步(1 s) | 执行 25 步后重算 |
| ACT | 50 Hz | 100 步 | 时间集成 |
| DRP / IMPACT | 可跑 300 Hz(4090) | 10 步 | 闭环 |
结论:业界一律是"两层"结构——策略层 10–50 Hz(少数到 300 Hz)给出关节目标,伺服/插补层 125 Hz–1 kHz 负责平滑跟踪。没有人让神经网络直接跑 1 kHz 伺服环。
对本方案的评估:
requestAnimationFrame 是 60 Hz,50 Hz 也能稳定跑。dt(默认 20 ms)、提交步数
n(默认 3)、动作块长度 S(默认 16 = 320 ms)。训练数据按 dt = 20 ms
生成;若真机必须改到 10 ms(100 Hz),只需把动作块重采样,或用 dt = 10
ms 重造数据(约 5 小时)。| 集合 | 来源 |
|---|---|
| route_bench | tests/route_bench.cjs,60 例 |
| near_column_bench | tests/near_column_bench.cjs,30 例(pos / pose /
rt) |
| rt_drag_bench | tests/rt_drag_bench.cjs,12
例(改为模型在环逐周期运行) |
| held-out | §4.3 留出 2000 条 |
新增 tests/policy_bench.cjs:①现有规划器
②策略(关安全层)③策略 + 安全层(部署形态),输出对比表。
| 指标 | 要求 | 现状参考 |
|---|---|---|
| 实际执行的碰撞帧 | = 0(以距离认证或 0.01° 审计测量,不用离散 1° 检查) | rt_drag_bench 0 |
| 到达率 | route 60/60,near pos 30/30,near rt 30/30,另造 ≥1000 例 near_column 一次性验收集 0 失败;held-out(分母只算可达任务)≥ 98%,D 类另考停靠距离 ≤ 老师 + 5 mm | 60/60、30/30、30/30 |
| 到达用时 | ≤ 老师同任务路径动画时长 × 1.3 | — |
| 关节行程 | ≤ 现有规划器 × 1.10 | route 平均 467° |
| 冷启动(新目标→第一个动作) | < 10 ms | 首次全量 IK 最差约 2 s |
| 每周期耗时(推理+安全层)P99 | < 15 ms | 拖拽重规划 P99 约 321 ms |
| 刹停发生率 | < 2% 的周期 | — |
| 模式摇摆(≥3 次切换) | < 1% 的任务 | — |
| 策略单独(关安全层)碰撞率 | < 3%(参考:ELMP-APG 8.9%,DRP 10.16%) | — |
说明:v2 曾提议 near_column 允许 29/30,用户否决(2026-10-17)。为保证 30/30,部署侧加入子目标头、价值头、短前瞻和卡死换向(§8.5)。
ci27
姿态根枚举漏分支(姿态偏差约 97.5°)会进入预训练数据;APG
的姿态到达项可以部分纠正,必要时先修老师。ml/
gen/ gen_dataset.cjs sampler.cjs run_parallel.sh
data/ (不入库)shard_*.jsonl stats.json *.parquet norm.json
prep/ build_dataset.py
model/ policy_transformer.py
sim/ closed_loop.py # 闭环仿真(训练验证、挖错、APG 展开共用)
eval/ collide_torch.py # 可微胶囊距离,与 JS 对拍
apg/ apg_finetune.py
mining/ mine_round.py gate.py loop.sh
configs/ base.yaml apg.yaml
train.py export_onnx.py README.md
webapp/js/ik-policy.js # 闭环推理 + 模式粘滞 + 安全层 + 刹停
webapp/models/traj_v2.onnx traj_v2.norm.json
tests/policy_bench.cjs
| # | 内容 | 产出 | 在哪跑 |
|---|---|---|---|
| M1 | 数据生成器 + 时间参数化 + 1000 条试跑 | ml/gen/*、stats.json |
沙箱 |
| M2 | 可微胶囊距离(PyTorch)与 JS 对拍 | collide_torch.py,10 万位形 0 误差 |
沙箱(CPU 即可) |
| M3 | 5 万条老师数据 → 约 300 万闭环样本 | Parquet | 沙箱约 5 h 或用户机器 |
| M4 | 模型 + 训练工程 + 闭环仿真;小数据过拟合测试 | train.py、closed_loop.py |
沙箱 CPU 验证可跑 |
| M5 | 预训练(行为克隆) | checkpoint | 用户 GPU |
| M6 | APG 微调 + 挖错循环 3–6 轮 | 每轮 report.md | 用户 GPU |
| M6b | (可选)ReinFlow 强化学习微调:奖励 = 到达 − 刹停次数 − 卡死 − 用时 | 对比 M6 | 用户 GPU |
| M7 | 导出 ONNX + ik-policy.js 闭环部署 + 安全层实测 +
policy_bench |
对比表 | 沙箱 + 浏览器 |
| M8 | 移除查看器里对
solveDyn/routeRT/路网的运行时依赖(保留在
ml/gen 离线使用) |
部署包瘦身 | 沙箱 |