Files
Robot_Arm/docs/Transformer轨迹拟合训练方案.html
T

1769 lines
68 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Transformer 轨迹拟合训练方案</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style>
:root{--fg:#1d2733;--mut:#5b6b7c;--acc:#1f5fa8;--bd:#d9e1ea;--bg2:#f5f8fb}
body{max-width:1080px;margin:0 auto;padding:32px 28px 80px;font:15px/1.75 -apple-system,"PingFang SC","Microsoft YaHei","Noto Sans CJK SC",sans-serif;color:var(--fg)}
h1{font-size:26px;border-bottom:3px solid var(--acc);padding-bottom:10px}
h2{font-size:21px;margin-top:44px;padding-left:10px;border-left:5px solid var(--acc)}
h3{font-size:17px;margin-top:28px;color:#16324f}
table{border-collapse:collapse;width:100%;margin:14px 0;font-size:13.5px;display:block;overflow-x:auto}
th,td{border:1px solid var(--bd);padding:6px 9px;vertical-align:top}
th{background:#e9f0f7;text-align:left;white-space:nowrap}
tr:nth-child(even) td{background:var(--bg2)}
code{background:#eef2f6;padding:1px 5px;border-radius:4px;font-size:90%}
pre{background:#0f1b2a;color:#e3ecf5;padding:14px 16px;border-radius:8px;overflow-x:auto;line-height:1.5}
pre code{background:none;color:inherit;padding:0}
blockquote{margin:16px 0;padding:10px 16px;background:#fff8e6;border-left:4px solid #e0a800;color:#4a3b00}
#TOC{background:var(--bg2);border:1px solid var(--bd);border-radius:8px;padding:12px 20px;margin:20px 0;font-size:14px}
#TOC ul{margin:4px 0;padding-left:20px}
a{color:var(--acc)}
</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Transformer 轨迹拟合训练方案</h1>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#transformer-避障运动策略最终方案"
id="toc-transformer-避障运动策略最终方案">Transformer
避障运动策略:最终方案</a>
<ul>
<li><a href="#0-定位与边界" id="toc-0-定位与边界">0. 定位与边界</a></li>
<li><a href="#1-方案总览" id="toc-1-方案总览">1. 方案总览</a>
<ul>
<li><a href="#11-取舍决定每项只有一个答案"
id="toc-11-取舍决定每项只有一个答案">1.1
取舍决定(每项只有一个答案)</a></li>
</ul></li>
<li><a href="#2-依据" id="toc-2-依据">2. 依据</a>
<ul>
<li><a href="#21-业界神经运动规划" id="toc-21-业界神经运动规划">2.1
业界神经运动规划</a></li>
<li><a href="#22-本项目的条件" id="toc-22-本项目的条件">2.2
本项目的条件</a></li>
<li><a href="#23-前沿生成式技术取舍" id="toc-23-前沿生成式技术取舍">2.3
前沿生成式技术取舍</a></li>
<li><a href="#24-沙箱双模态对照实验" id="toc-24-沙箱双模态对照实验">2.4
沙箱双模态对照实验</a></li>
</ul></li>
<li><a href="#3-训练环境" id="toc-3-训练环境">3. 训练环境</a></li>
<li><a href="#4-离线数据老师只在这里出现"
id="toc-4-离线数据老师只在这里出现">4. 离线数据(老师只在这里出现)</a>
<ul>
<li><a href="#41-文件" id="toc-41-文件">4.1 文件</a></li>
<li><a href="#42-原始样本" id="toc-42-原始样本">4.2 原始样本</a></li>
<li><a href="#43-采样分布5-万条任务" id="toc-43-采样分布5-万条任务">4.3
采样分布(5 万条任务)</a></li>
<li><a href="#44-过滤" id="toc-44-过滤">4.4 过滤</a></li>
<li><a href="#45-时间参数化--闭环训练样本"
id="toc-45-时间参数化--闭环训练样本">4.5 时间参数化 →
闭环训练样本</a></li>
<li><a href="#46-耗时与存储" id="toc-46-耗时与存储">4.6
耗时与存储</a></li>
<li><a href="#47-检查点" id="toc-47-检查点">4.7 检查点</a></li>
</ul></li>
<li><a href="#5-表示与预处理" id="toc-5-表示与预处理">5.
表示与预处理</a>
<ul>
<li><a href="#51-输入" id="toc-51-输入">5.1 输入</a></li>
<li><a href="#52-输出" id="toc-52-输出">5.2 输出</a></li>
<li><a href="#53-连续轴" id="toc-53-连续轴">5.3 连续轴</a></li>
</ul></li>
<li><a href="#6-模型与预训练" id="toc-6-模型与预训练">6.
模型与预训练</a>
<ul>
<li><a href="#61-结构" id="toc-61-结构">6.1 结构</a></li>
<li><a href="#62-动作头meanflow-一步生成"
id="toc-62-动作头meanflow-一步生成">6.2 动作头:MeanFlow
一步生成</a></li>
<li><a href="#63-损失" id="toc-63-损失">6.3 损失</a></li>
<li><a href="#64-训练配置" id="toc-64-训练配置">6.4 训练配置</a></li>
<li><a href="#65-对拍与验证" id="toc-65-对拍与验证">6.5
对拍与验证</a></li>
</ul></li>
<li><a href="#7-后训练" id="toc-7-后训练">7. 后训练</a>
<ul>
<li><a href="#71-主力apg-可微微调" id="toc-71-主力apg-可微微调">7.1
主力:APG 可微微调</a></li>
<li><a href="#72-辅助无老师挖错循环" id="toc-72-辅助无老师挖错循环">7.2
辅助:无老师挖错循环</a></li>
</ul></li>
<li><a href="#8-部署" id="toc-8-部署">8. 部署</a>
<ul>
<li><a href="#81-执行循环" id="toc-81-执行循环">8.1 执行循环</a></li>
<li><a href="#82-候选排序防左右摇摆" id="toc-82-候选排序防左右摇摆">8.2
候选排序(防左右摇摆)</a></li>
<li><a href="#83-安全层唯一的硬保证" id="toc-83-安全层唯一的硬保证">8.3
安全层(唯一的硬保证)</a></li>
<li><a href="#84-部署包" id="toc-84-部署包">8.4 部署包</a></li>
<li><a href="#85-near_column-3030-的保障手段"
id="toc-85-near_column-3030-的保障手段">8.5 near_column 30/30
的保障手段</a></li>
<li><a href="#86-控制周期" id="toc-86-控制周期">8.6 控制周期</a></li>
</ul></li>
<li><a href="#9-评估与验收" id="toc-9-评估与验收">9. 评估与验收</a>
<ul>
<li><a href="#91-测试集合" id="toc-91-测试集合">9.1 测试集合</a></li>
<li><a href="#92-验收标准部署形态--策略--安全层"
id="toc-92-验收标准部署形态--策略--安全层">9.2 验收标准(部署形态 = 策略
+ 安全层)</a></li>
</ul></li>
<li><a href="#10-当前存在的问题与风险"
id="toc-10-当前存在的问题与风险">10. 当前存在的问题与风险</a>
<ul>
<li><a href="#101-只能靠实测消除的风险按里程碑顺序"
id="toc-101-只能靠实测消除的风险按里程碑顺序">10.1
只能靠实测消除的风险(按里程碑顺序)</a></li>
<li><a href="#102-已知缺陷" id="toc-102-已知缺陷">10.2 已知缺陷</a></li>
<li><a href="#103-需要用户确认" id="toc-103-需要用户确认">10.3
需要用户确认</a></li>
</ul></li>
<li><a href="#11-目录规划" id="toc-11-目录规划">11. 目录规划</a></li>
<li><a href="#12-里程碑" id="toc-12-里程碑">12. 里程碑</a></li>
<li><a href="#13-参考文献" id="toc-13-参考文献">13. 参考文献</a></li>
</ul></li>
</ul>
</nav>
<h1 id="transformer-避障运动策略最终方案">Transformer
避障运动策略:最终方案</h1>
<blockquote>
<p>基于
<code>main@3c7c814</code>(贴立柱修复后的规划器)。本文是方案,代码尚未编写。
训练机:RTX 3090 24 GB。部署:浏览器(后续真机)。</p>
</blockquote>
<hr />
<h2 id="0-定位与边界">0. 定位与边界</h2>
<table>
<thead>
<tr class="header">
<th>项目</th>
<th>决定</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>部署形态</td>
<td><strong>无运行时老师</strong>:运行时只有「神经策略 +
碰撞安全层」,不加载 IK 大表、PRM 路网、A*/RRT,也不调用
<code>solveDyn</code> / <code>routeRT</code></td>
</tr>
<tr class="even">
<td>运行方式</td>
<td><strong>闭环滚动执行</strong>:执行频率 50 Hz(每步 20 ms);每 60
ms 读一次当前关节角和目标,推理一段 16 步动作块,安全层认证后提交前 3
步</td>
</tr>
<tr class="odd">
<td>碰撞安全层</td>
<td>不做搜索,只对模型给出的候选做<strong>距离下界认证</strong>(§8.3),不安全就换候选或沿已认证刹停段停下</td>
</tr>
<tr class="even">
<td>老师的角色</td>
<td>只在<strong>离线</strong>出现:生成预训练数据;后训练以可微碰撞代价为主(§7)</td>
</tr>
<tr class="odd">
<td>不做的事</td>
<td>不学动力学(速度/加速度上限由时间律与插补器保证);不用相机/点云(环境固定:台架
+ P01 立柱,几何已知)</td>
</tr>
<tr class="even">
<td>收益目标</td>
<td>冷启动(新目标到第一个动作)&lt; 10 ms;每次推理 + 安全认证 &lt; 20
ms;消除现有拖拽重规划 P99 约 321 ms 的长尾</td>
</tr>
<tr class="odd">
<td>底线</td>
<td>实时拖拽<strong>碰撞帧 =
0</strong>(由安全层距离认证保证);到达率、行程在 §9
指标上不低于现有规划器</td>
</tr>
</tbody>
</table>
<p><strong>关于"风险":</strong>
论文证据只能说明"别人在相近条件下做成过",没有一篇论文的条件(低维状态、单根固定立柱、约
4M
参数、浏览器推理、30/30)与本项目完全一致。因此本方案中只有安全层是<strong>硬保证</strong>;每个设计点都已定为唯一选择(§1.1),只有
MeanFlow
头带一个预先写定触发条件的回退(碰撞与否不依赖模型好坏);其余每一项都配有证据等级、本仓库可测的<strong>门禁</strong>(不过不进下一步)和<strong>回退</strong>(§10)。</p>
<hr />
<h2 id="1-方案总览">1. 方案总览</h2>
<table>
<thead>
<tr class="header">
<th>模块</th>
<th>最终选择</th>
<th>证据等级</th>
<th>关键依据</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>模型规模</td>
<td>约 4.9M 参数编码器-解码器 Transformer,不用 VLA 大模型</td>
<td>A</td>
<td>IMPACT 4.67M、300 Hz;π0 3B 单次预填充 46 ms(4090)</td>
</tr>
<tr class="even">
<td>数据</td>
<td>规划器离线造 5 万条任务 → 约 200 万"状态→动作块"样本</td>
<td>B</td>
<td>MπNets、DRP、ELMP 均用规划器老师</td>
</tr>
<tr class="odd">
<td>时间律</td>
<td>匀速巡航 + 梯形加减速,只依赖"当前速度 +
剩余路程";当前速度作输入</td>
<td>B</td>
<td>MπNets 将老师路径重定时为匀速</td>
</tr>
<tr class="even">
<td>动作表示</td>
<td>16 步 × 6 轴关节增量 Δq</td>
<td>A</td>
<td>DRP;Diffusion Policy(位置式优于速度式)</td>
</tr>
<tr class="odd">
<td>动作头</td>
<td><strong>MeanFlow 一步生成头</strong>,每次并行采 8 个噪声 → 8
条候选</td>
<td>B</td>
<td>沙箱双模态实验(§2.4);MP1 约 6.8 ms</td>
</tr>
<tr class="even">
<td>块间连续</td>
<td>训练时前缀条件化:输入已提交未执行的步</td>
<td>B</td>
<td>2512.05964:推理零开销,d≥2 时优于推理时 RTC</td>
</tr>
<tr class="odd">
<td>碰撞修正</td>
<td>输出后 1 步解析胶囊距离梯度投影(每轴 ≤ 0.5°,仅 d &lt;
余量时)</td>
<td>B</td>
<td>DiffusionSeeder:少步生成下在环引导收益很小;投影在已知环境下够用</td>
</tr>
<tr class="even">
<td>候选排序</td>
<td>与已提交块重叠步的一致性打分 + 价值头</td>
<td>B</td>
<td>BID:一致性打分 + 多样本相对提升 32%</td>
</tr>
<tr class="odd">
<td>预训练</td>
<td>行为克隆 + FK 胶囊端点损失</td>
<td>B</td>
<td>ELMP 式 FK 损失</td>
</tr>
<tr class="even">
<td>后训练(主)</td>
<td>APG:可微运动学展开 + 胶囊距离代价反传</td>
<td>A</td>
<td>ELMP:碰撞率 31.3%→8.9%;1 万示范 + APG 胜 60 万纯 BC</td>
</tr>
<tr class="odd">
<td>后训练(辅)</td>
<td>无老师挖错循环 + 门禁</td>
<td>B</td>
<td>DRP 迭代微调 +45%</td>
</tr>
<tr class="even">
<td>安全层</td>
<td>距离下界认证 + 可刹停不变式</td>
<td>A</td>
<td>Schwarzer 2005 连续认证;Thumm &amp; Althoff 2022 failsafe</td>
</tr>
<tr class="odd">
<td>30/30 手段</td>
<td>子目标头、价值头、冷启动/卡死时短前瞻、卡死换向</td>
<td>B / C</td>
<td>AWE、SHAC、BID</td>
</tr>
<tr class="even">
<td>老师</td>
<td>PRM 路网 A* + 捷径平滑(确定性);A* 失败才用
<code>solveDyn</code></td>
<td>B</td>
<td>MπNets:老师不一致碰撞率 13.78%,一致老师 0.94%</td>
</tr>
<tr class="odd">
<td>推理后端</td>
<td>onnxruntime-web wasm-SIMD 多线程,推理放代理
Worker(不占主线程),线程数 min(16, ⌊0.6×逻辑核⌋);R4 探针同测
WebGPU,wasm 不达标而 WebGPU 达标则部署用 WebGPU</td>
<td>C</td>
<td>小模型下 WebGPU 调度开销通常占主导,以 R4 实测为准</td>
</tr>
</tbody>
</table>
<h3 id="11-取舍决定每项只有一个答案">1.1
取舍决定(每项只有一个答案)</h3>
<table>
<thead>
<tr class="header">
<th>选项</th>
<th>利</th>
<th>弊</th>
<th>决定</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>动作头:MeanFlow 一步头 vs WTA K=4</td>
<td>MeanFlow:连续多模态,能同时表达左/右绕行与位姿目标的多个 IK
分支;沙箱 1 步达到 10 步流匹配质量。WTA:训练稳、实现简单</td>
<td>MeanFlow:训练需 JVP(训练慢约 1.5–2
倍)、原生版本在部分任务失败(K-MF 表 1)。WTA:只有 4 个固定模式,左右
× 肘/腕分支可能超过 4 个;沙箱分不出两者高下</td>
<td><strong>上 MeanFlow</strong>。WTA 不实现;只有 M5
门禁不过(near_column 穿柱率高于 2% 或训练发散)才换成 WTA
K=8,二者共用骨干,切换约 1 天</td>
</tr>
<tr class="even">
<td>Shortcut + 条件 OT 配对</td>
<td>无需 JVP</td>
<td>本项目无任何实测,组合无论文先例</td>
<td><strong>不上</strong></td>
</tr>
<tr class="odd">
<td>B 样条动作表示</td>
<td>平滑由表示保证;输出维度小</td>
<td>贴柱时拐角被抹圆、局部精度下降;只有间接证据;平滑已由梯形时间律 +
平滑损失保证</td>
<td><strong>不上</strong>,固定 16 步 Δq</td>
</tr>
<tr class="even">
<td>输出后梯度投影</td>
<td>修掉 1–2 mm 的轻微侵入,成本约 0.1 ms,减少刹停</td>
<td>推离数据分布、改变块间一致性;修不了"绕错侧"</td>
<td><strong>上</strong>,限 1 步、每轴修正量 ≤ 0.5°,仅 d &lt;
余量时触发</td>
</tr>
<tr class="odd">
<td>短前瞻(多推一块打分)</td>
<td>避开"走两步就撞墙"的分支</td>
<td>推理次数翻倍,加剧最大不确定项(浏览器延迟)</td>
<td><strong>只在冷启动和卡死换向时上</strong>,平时不做</td>
</tr>
<tr class="even">
<td>拒绝采样自蒸馏</td>
<td>进一步缩短行程</td>
<td>偏向贴柱、余量变小、多样性塌缩;APG 行程项已覆盖同一目标</td>
<td><strong>不上</strong></td>
</tr>
<tr class="odd">
<td>ReinFlow 强化学习微调</td>
<td>能直接优化到达/卡死/刹停等离散目标</td>
<td>RL
会重塑左右模式比例;奖励调参与训练多出数天;这些离散目标已由卡死换向规则
+ APG 覆盖</td>
<td><strong>不上</strong></td>
</tr>
<tr class="even">
<td>挖错循环中 E2 错题请老师补路径</td>
<td>解决可微代价绕不出的局部极小</td>
<td>量小、离线</td>
<td><strong>上</strong></td>
</tr>
<tr class="odd">
<td>老师:PRM 路网 A* vs <code>solveDyn</code></td>
<td>A*:确定性,同类任务左右选择一致,且是路网上的最短;<code>solveDyn</code>
覆盖更全</td>
<td>A*:受路网分辨率限制,个别任务失败</td>
<td><em><em>A</em> 为主老师</em>*,失败的任务用
<code>solveDyn</code>(固定种子)补</td>
</tr>
<tr class="even">
<td>推理后端:WebGPU vs wasm</td>
<td>WebGPU 大模型快</td>
<td>本模型约 4M 参数,WebGPU 每次调度 33–67 μs × 150–300
次,调度开销反而大</td>
<td><strong>wasm-SIMD 多线程</strong>;M4 实测若 WebGPU P99
更低再换</td>
</tr>
<tr class="odd">
<td>训练余量</td>
<td>越大越不易被认证拒绝</td>
<td>越大行程越长、贴柱越难;高于老师轨迹自身间隙(实测最小间隙 p50 4.4 /
p90 5.9 mm)会与 BC 标签对抗</td>
<td>数据过滤与 APG 碰撞项 <strong>3 mm</strong>(认证最小间隙 &lt; 3 mm
的老师轨迹不进训练集);运行时投影护栏独立保持 <strong>5
mm</strong>,护栏不迁就数据分布</td>
</tr>
<tr class="even">
<td>关节噪声增广 σ</td>
<td>覆盖偏离状态</td>
<td>过大产生无意义状态</td>
<td><strong>1°</strong></td>
</tr>
<tr class="odd">
<td>局部牛顿精修</td>
<td>末端精度到 &lt; 1 mm</td>
<td>无</td>
<td><strong>上</strong>,同样过安全层</td>
</tr>
</tbody>
</table>
<p>证据等级:<strong>A</strong> 有直接先例与数字 · <strong>B</strong>
有相近先例,需本仓库验证 · <strong>C</strong> 仅推断。</p>
<hr />
<h2 id="2-依据">2. 依据</h2>
<h3 id="21-业界神经运动规划">2.1 业界神经运动规划</h3>
<table>
<thead>
<tr class="header">
<th>工作</th>
<th>年份 / 会议</th>
<th>输入</th>
<th>输出</th>
<th>老师与数据量</th>
<th>关键做法</th>
<th>运行方式</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>MπNets</strong>(NVIDIA)</td>
<td>2022 CoRL</td>
<td>点云 + 关节角 + 目标位姿</td>
<td>下一步关节位置</td>
<td>规划器 300 万+ 问题</td>
<td>端到端行为克隆;老师路径重定时为匀速</td>
<td>闭环 9 Hz,1 kHz PD 跟踪</td>
</tr>
<tr class="even">
<td><strong>Neural MP</strong>(CMU)</td>
<td>2024 / IROS 2025</td>
<td>点云 + 关节角 + 目标</td>
<td>GMM(LSTM)</td>
<td>100 万–300 万条</td>
<td>测试时采样多条,选穿透最少的(去掉后成功率 81%→31%)</td>
<td>开环为主</td>
</tr>
<tr class="odd">
<td><strong>DRP / IMPACT</strong>(CMU)</td>
<td>2025 CoRL</td>
<td>点云 + 关节角 + 目标关节角</td>
<td>10 步关节增量</td>
<td>cuRobo 1000 万条</td>
<td>大规模预训练 + 迭代师生微调 + "目标被挡停在最近安全处"</td>
<td>闭环;4.67M 参数,300 Hz</td>
</tr>
<tr class="even">
<td><strong>ELMP</strong>(ETH)</td>
<td>2026 arXiv</td>
<td>点云 + 关节角 + 目标位姿</td>
<td>关节增量</td>
<td>AIT* 约 60 万条</td>
<td>行为克隆后 <strong>APG
微调</strong>,碰撞/到达/平滑损失直接反传</td>
<td>闭环 30 Hz</td>
</tr>
</tbody>
</table>
<ul>
<li>ELMP:1 万条老师轨迹 + APG(成功率 72.0%)超过 60
万条纯行为克隆(57.9%);APG 把碰撞率降到 1/3 以下。</li>
<li>最好的方法在静态场景仍有约 9–10% 碰撞(ELMP-APG 8.9%,DRP
10.16%),实际部署都配检查或反应层。</li>
<li>共识:闭环、短动作块滚动执行、老师只离线用、必须后训练。</li>
</ul>
<h3 id="22-本项目的条件">2.2 本项目的条件</h3>
<table>
<thead>
<tr class="header">
<th>条件</th>
<th>主流</th>
<th>本项目</th>
<th>意味着</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>环境</td>
<td>未知、多变,靠点云</td>
<td>固定且精确已知(台架 + 立柱,1936 个胶囊)</td>
<td>不需要点云编码器;模型可以小;碰撞检查精确</td>
</tr>
<tr class="even">
<td>机器人</td>
<td>Franka 7 轴</td>
<td>自研 6 轴,J1/J3/J6 连续转</td>
<td>需处理连续轴展开</td>
</tr>
<tr class="odd">
<td>碰撞模型</td>
<td>SDF / 球近似</td>
<td>胶囊解析距离,可微</td>
<td>直接做 APG;安全层可认证</td>
</tr>
<tr class="even">
<td>平台</td>
<td>台式 GPU</td>
<td>浏览器(后续真机)</td>
<td>模型小,ONNX + WebGPU/wasm</td>
</tr>
</tbody>
</table>
<p>资源应投在<strong>闭环稳定性、左右绕行选择和安全层</strong>上,而不是感知和泛化。</p>
<h3 id="23-前沿生成式技术取舍">2.3 前沿生成式技术取舍</h3>
<table>
<thead>
<tr class="header">
<th>技术</th>
<th>结论</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>VLA 大模型(π0/π0.5、GR00T、OpenVLA)</td>
<td>不采用</td>
<td>无图像、无语言指令;3B 参数更慢不更准</td>
</tr>
<tr class="even">
<td>一步生成:MeanFlow(MP1)</td>
<td><strong>采用</strong></td>
<td>1 次前向;沙箱双模态实验通过</td>
</tr>
<tr class="odd">
<td>Consistency Policy、OneDP、朴素 1 步流匹配</td>
<td>不采用</td>
<td>CP 原文承认偏向一侧;OneDP 有意取单模态;朴素 1 步 FM
等于条件均值,会穿柱</td>
</tr>
<tr class="even">
<td>Shortcut / 条件 OT 配对</td>
<td>不采用</td>
<td>见 §1.1</td>
</tr>
<tr class="odd">
<td>OFP 自蒸馏</td>
<td>不采用</td>
<td>未找到公开代码;自引导 λ=0.5 时出现模态塌缩</td>
</tr>
<tr class="even">
<td>生成过程中代价引导(MPD/EDMP/GPD)</td>
<td>不采用</td>
<td>无论文在 1–2 步下验证;改用输出后投影</td>
</tr>
<tr class="odd">
<td>推理时 RTC</td>
<td>不采用</td>
<td>原文只验证 5 步去噪且需反向传播;改用训练时前缀条件化</td>
</tr>
<tr class="even">
<td>时间集成 / 交叉淡入</td>
<td>不采用</td>
<td>执行的是未认证的混合块;左右两块平均可能穿柱;π0 弃用</td>
</tr>
<tr class="odd">
<td>FAST 动作分词</td>
<td>不采用</td>
<td>服务于语言骨干,自回归推理慢</td>
</tr>
<tr class="even">
<td>B 样条动作表示</td>
<td>不采用</td>
<td>见 §1.1</td>
</tr>
<tr class="odd">
<td>ReinFlow / DPPO</td>
<td>不采用</td>
<td>见 §1.1</td>
</tr>
</tbody>
</table>
<h3 id="24-沙箱双模态对照实验">2.4 沙箱双模态对照实验</h3>
<p>2D 点从柱左侧到右侧,示教一半从上绕一半从下绕,16 步动作块、每 3
步重推理,与本方案同构。代码 <code>ml/toy/toy_bimodal.py</code>,150
个"起终点都贴近中轴"的难例:</p>
<table>
<thead>
<tr class="header">
<th>动作头</th>
<th>单样本、无安全层:到达 / 穿柱回合</th>
<th>8 候选 + 安全层:到达 / 穿柱 / 平均刹停</th>
<th>推理(CPU,8 候选)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>MSE 回归</td>
<td>100% / 0%</td>
<td>100% / 0% / 0</td>
<td>0.13 ms</td>
</tr>
<tr class="even">
<td>WTA K=4</td>
<td>100% / 0%</td>
<td>100% / 0% / 0</td>
<td>0.19 ms</td>
</tr>
<tr class="odd">
<td>流匹配 10 步</td>
<td>100% / 4.0%</td>
<td>99.3% / 0% / 3.7</td>
<td>2.13 ms</td>
</tr>
<tr class="even">
<td>朴素流匹配 1 步</td>
<td>87.3% / <strong>23.3%</strong></td>
<td>81.3% / 0% / 14.0</td>
<td>0.25 ms</td>
</tr>
<tr class="odd">
<td><strong>MeanFlow 1 步</strong></td>
<td>100% / 2.7%</td>
<td>100% / 0% / 0.3</td>
<td>0.25 ms</td>
</tr>
</tbody>
</table>
<ul>
<li>朴素 1 步流匹配会把模态平均进柱子;MeanFlow 1 步达到 10
步流匹配的质量,推理快约 8 倍。</li>
<li>安全层在所有方法上把穿柱降为 0,代价是刹停。</li>
<li>该任务过于简单(闭环中状态一偏离中轴即打破对称),<strong>分不出一步头与
WTA 谁更好</strong>;因此 WTA 只作为 M5
门禁不过时的预定回退(§1.1)。</li>
<li>训练仅 300 步的 MSE 在同一难例上 100% 穿柱、加安全层后 0%
到达,说明欠拟合时平均模态的风险真实存在。</li>
</ul>
<hr />
<h2 id="3-训练环境">3. 训练环境</h2>
<table>
<thead>
<tr class="header">
<th>阶段</th>
<th>在哪里跑</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>数据生成</td>
<td>Hark 沙箱(2 vCPU / 7 GB,Node)或用户机器</td>
<td>纯 JS,无需 GPU</td>
</tr>
<tr class="even">
<td>预训练 + 后训练</td>
<td>用户 RTX 3090 24 GB</td>
<td>batch 1024–2048</td>
</tr>
<tr class="odd">
<td>部署推理</td>
<td>浏览器 onnxruntime-web wasm-SIMD 多线程(代理 Worker);ONNX 接口
feat[1,83]、z[K,16,6]:观测编码一次、K=8
条候选共享编码再解码;后续真机控制器</td>
<td>与现有查看器同页</td>
</tr>
</tbody>
</table>
<div class="sourceCode" id="cb1"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="ex">conda</span> create <span class="at">-n</span> armtf python=3.11 <span class="at">-y</span> <span class="kw">&amp;&amp;</span> <span class="ex">conda</span> activate armtf</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="ex">pip</span> install torch <span class="at">--index-url</span> https://download.pytorch.org/whl/cu121 <span class="co"># 按本机 CUDA 版本选</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="ex">pip</span> install numpy pyarrow tqdm tensorboard onnx onnxruntime</span></code></pre></div>
<hr />
<h2 id="4-离线数据老师只在这里出现">4. 离线数据(老师只在这里出现)</h2>
<h3 id="41-文件">4.1 文件</h3>
<table>
<thead>
<tr class="header">
<th>文件</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>ml/gen/gen_dataset.cjs</code></td>
<td>采样任务 → 调老师 → 校验 → 时间参数化 → 写分片</td>
</tr>
<tr class="even">
<td><code>ml/gen/sampler.cjs</code></td>
<td>起点/目标采样</td>
</tr>
<tr class="odd">
<td><code>ml/gen/run_parallel.sh</code></td>
<td>多进程,不同种子</td>
</tr>
<tr class="even">
<td><code>ml/data/shard_XXXX.jsonl</code></td>
<td>原始样本(不入库)</td>
</tr>
</tbody>
</table>
<p>复用 <code>tests/route_bench_setup.cjs</code>
装配求解器(关节表、<code>docs/travel.json</code>、<code>docs/collide.json</code>)。</p>
<h3 id="42-原始样本">4.2 原始样本</h3>
<div class="sourceCode" id="cb2"><pre
class="sourceCode json"><code class="sourceCode json"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;id&quot;</span><span class="fu">:</span> <span class="st">&quot;s0003_000127&quot;</span><span class="fu">,</span> <span class="dt">&quot;mode&quot;</span><span class="fu">:</span> <span class="st">&quot;pos&quot;</span> <span class="er">|</span> <span class="st">&quot;pose&quot;</span><span class="fu">,</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;q0&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="dv">6</span><span class="ot">]</span><span class="fu">,</span> <span class="dt">&quot;T&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="er">x</span><span class="ot">,</span><span class="er">y</span><span class="ot">,</span><span class="er">z</span><span class="ot">]</span><span class="fu">,</span> <span class="dt">&quot;R&quot;</span><span class="fu">:</span> <span class="ot">[[</span><span class="dv">3</span><span class="er">x3</span><span class="ot">]]</span> <span class="er">|</span> <span class="kw">null</span><span class="fu">,</span> <span class="dt">&quot;tool&quot;</span><span class="fu">:</span> <span class="dv">0</span><span class="fu">,</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;path&quot;</span><span class="fu">:</span> <span class="ot">[[</span><span class="dv">6</span><span class="ot">],</span> <span class="er">...</span><span class="ot">]</span><span class="fu">,</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;reached&quot;</span><span class="fu">:</span> <span class="kw">true</span><span class="fu">,</span></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;travel_deg&quot;</span><span class="fu">:</span> <span class="fl">123.4</span><span class="fu">,</span> <span class="dt">&quot;plan_ms&quot;</span><span class="fu">:</span> <span class="fl">812.0</span><span class="fu">,</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;fp&quot;</span><span class="fu">:</span> <span class="st">&quot;collide.json 指纹&quot;</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<p><code>reached=false</code>
表示目标不可达,路径终点为离目标最近的安全位形("停靠")。</p>
<h3 id="43-采样分布5-万条任务">4.3 采样分布(5 万条任务)</h3>
<p>关节限位:J1/J3/J6 连续 ±180°;J2 [−92, 9],J4 [−111, 16],J5 [−93,
34]。</p>
<table>
<thead>
<tr class="header">
<th>类别</th>
<th style="text-align: right;">占比</th>
<th>采样方式</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>A 均匀</td>
<td style="text-align: right;">45%</td>
<td>q0、目标位形 b 均匀采样且无干涉;目标 = <code>fk(b)</code>(pose
模式加 <code>orient(b)</code>)</td>
</tr>
<tr class="even">
<td>B 直线被挡</td>
<td style="text-align: right;">30%</td>
<td>q0→b 关节直线有干涉</td>
</tr>
<tr class="odd">
<td>C 贴立柱</td>
<td style="text-align: right;">15%</td>
<td>b 满足 <code>nearColumn</code>,q0 在立柱另一侧</td>
</tr>
<tr class="even">
<td>D 目标不可达</td>
<td style="text-align: right;">10%</td>
<td>目标在立柱内/所有分支都撞/工作空间外;标签为停靠</td>
</tr>
</tbody>
</table>
<ul>
<li>pos / pose 各半;老师为 PRM 路网 A* + 捷径平滑(确定性;复用
<code>routeRT</code> 的路网图搜索,放宽时间预算);A* 失败的任务用
<code>solveDyn</code>(固定种子)补。</li>
<li>另造三个互不重叠的集合:<strong>门禁集</strong> 2000
条(挖错循环每轮用)、<strong>held-out 验收集</strong> 2000
条、<strong>near_column 扩展验收集</strong> ≥1000
条;两个验收集只在最终验收时用一次。现有三个基准不进训练集。</li>
</ul>
<h3 id="44-过滤">4.4 过滤</h3>
<ol type="1">
<li>整条路径用距离下界认证(与 §8.3 同口径)复核,任一段不过即丢弃。仓库
<code>tests/route_bench.cjs</code> 上现有规划器有 1/40
例路径细验不过,这类样本必须丢掉。</li>
<li><code>poseRelaxed</code> 样本只当 pos 模式用。</li>
<li>行程 &gt; 同任务 <code>routeRT</code> 1.5
倍的先统计,再定是否丢弃;按类别统计丢弃率(C 类 &gt; 20%
说明老师在贴柱场景不可靠)。</li>
</ol>
<h3 id="45-时间参数化--闭环训练样本">4.5 时间参数化 → 闭环训练样本</h3>
<ol type="1">
<li>时间律:按轴速比 <code>VREL = [0.6, 0.6, 0.9, 0.9, 1.2, 1.8]</code>
匀速巡航,梯形加减速,速度只取决于"当前速度 + 剩余路程"(每轴加速度上限
a_max 为待定参数,真机型号确定后设定),dt = 20 ms。</li>
<li>得到状态序列 q_0 … q_N,每隔 3 步取一个样本:
<ul>
<li>输入:§5.1 全部字段(含当前速度、已提交前缀)</li>
<li>标签:未来 16 步 Δq_{t+k} = q_{t+k} − q_t(到终点后补零)</li>
</ul></li>
<li>每条路径约 40–50 个样本 → 约 200 万样本(以 <code>stats.json</code>
为准)。</li>
<li>协变量偏移对策:关节噪声增广(30% 样本,σ = 1°;噪声态须无干涉且间隙
&gt; 1 mm,标签为 8 步内线性收回老师轨迹的增量);偏离状态的进一步覆盖靠
§7。</li>
</ol>
<h3 id="46-耗时与存储">4.6 耗时与存储</h3>
<ul>
<li>路网 A* 每条数十毫秒,耗时主要在过滤认证;按 <code>solveDyn</code>
0.7 s/条上限估算,沙箱 2 进程不超过 5 小时。</li>
<li>200 万样本以 float32 <code>.npy</code> 存放约 1.5
GB(训练时整体载入内存)。</li>
</ul>
<h3 id="47-检查点">4.7 检查点</h3>
<ul class="task-list">
<li><label><input
type="checkbox" /><code>ml/data/stats.json</code>:类别、到达率、行程、样本数、补零样本占比</label></li>
<li><label><input type="checkbox" />老师一致性:起终点扰动 ±5 mm
的邻居任务同伦类一致率 ≥ 90%</label></li>
<li><label><input type="checkbox" />抽 20 条在查看器回放(新增
<code>?replay=</code> 参数)</label></li>
<li><label><input type="checkbox" />各集合与训练集无重叠</label></li>
</ul>
<hr />
<h2 id="5-表示与预处理">5. 表示与预处理</h2>
<p>文件
<code>ml/prep/build_dataset.cjs</code>(Node,特征直接调用部署运行时
<code>webapp/js/ik-policy.js</code> 的同一份实现)→
<code>ml/data/samples/*.{X,Y,V,SG,TID}.npy</code> +
<code>*.tasks.jsonl</code>;按任务 5% 划为验证集。PyTorch 侧特征
<code>ml/common/features.py</code> 与 JS 逐项对拍(闭环仿真与 APG
使用)。</p>
<h3 id="51-输入">5.1 输入</h3>
<table>
<thead>
<tr class="header">
<th>量</th>
<th style="text-align: right;">维度</th>
<th>编码</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>当前 q_t</td>
<td style="text-align: right;">6</td>
<td>每轴 (sin, cos) → 12;限位轴另加归一化值 → +3</td>
</tr>
<tr class="even">
<td>当前关节速度 q_t − q_{t−1}</td>
<td style="text-align: right;">6</td>
<td>按每轴速度上限归一化</td>
</tr>
<tr class="odd">
<td>当前 TCP 位置与姿态</td>
<td style="text-align: right;">3 + 6</td>
<td><code>fk(q_t)</code>、<code>orient(q_t)</code> 的 6D 表示</td>
</tr>
<tr class="even">
<td>目标位置 T</td>
<td style="text-align: right;">3</td>
<td>/600 mm</td>
</tr>
<tr class="odd">
<td>目标姿态 R</td>
<td style="text-align: right;">6</td>
<td>6D 表示;pos 模式填 0</td>
</tr>
<tr class="even">
<td>目标 − 当前 TCP</td>
<td style="text-align: right;">3</td>
<td>/600 mm</td>
</tr>
<tr class="odd">
<td>模式</td>
<td style="text-align: right;">2</td>
<td>one-hot [pos, pose]</td>
</tr>
<tr class="even">
<td>已提交未执行前缀</td>
<td style="text-align: right;">3×6 + 3</td>
<td>前缀 Δq + 有效长度掩码;训练时随机遮盖 0–3 步</td>
</tr>
<tr class="odd">
<td>当前子目标</td>
<td style="text-align: right;">6</td>
<td>子目标头输出的关节途经点(归一化);无子目标时填当前 q</td>
</tr>
<tr class="even">
<td>关键胶囊对最小距离</td>
<td style="text-align: right;">8</td>
<td>臂各段到立柱的胶囊距离</td>
</tr>
</tbody>
</table>
<h3 id="52-输出">5.2 输出</h3>
<ul>
<li>MeanFlow 一步头:每条候选 16 步 × 6 轴
Δq(按每轴最大步长归一化)。</li>
<li>附加头:价值头(剩余时间/代价)、子目标头(2 个关节途经点 +
是否需要)。</li>
</ul>
<h3 id="53-连续轴">5.3 连续轴</h3>
<p>J1/J3/J6 统一用 <code>unwrapTo</code>
展开后再做增量;预处理与部署共用一份实现,对拍时一并验证。</p>
<hr />
<h2 id="6-模型与预训练">6. 模型与预训练</h2>
<h3 id="61-结构">6.1 结构</h3>
<pre><code>条件特征(约 90 维)──MLP──▶ 8 个条件 token (d=192)
│
4 层 Transformer encoder
│ (memory)
16 个动作 token(注入噪声 z + 时间嵌入 (r, t))
▼
4 层 Transformer decoder(非自回归,一次前向)
├─ 动作输出:每 token 6 维 Δq
├─ 价值头:1
└─ 子目标头:2 个关节途经点 + 是否需要</code></pre>
<table>
<thead>
<tr class="header">
<th>超参</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>d_model / 头数 / FFN</td>
<td>192 / 8 / 768</td>
</tr>
<tr class="even">
<td>encoder / decoder 层数</td>
<td>4 / 4</td>
</tr>
<tr class="odd">
<td>参数量</td>
<td>约 4.9M</td>
</tr>
</tbody>
</table>
<p>子目标触发:新目标或目标跳变 &gt; 50 mm 时输出;到达当前子目标 &lt;
5° 后切下一个。</p>
<h3 id="62-动作头meanflow-一步生成">6.2 动作头:MeanFlow 一步生成</h3>
<table>
<thead>
<tr class="header">
<th>项</th>
<th>做法</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>多模态</td>
<td>连续分布;每次推理并行采 8 个噪声 → 8 条候选</td>
</tr>
<tr class="even">
<td>训练</td>
<td>MeanFlow 平均速度场损失(MP1 配方:25% 样本
r≠t,自适应损失加权),JVP 用 <code>torch.func.jvp</code></td>
</tr>
<tr class="odd">
<td>推理</td>
<td>1 次批量前向(r=0, t=1)</td>
</tr>
<tr class="even">
<td>后处理</td>
<td>1 步解析胶囊距离梯度投影,每轴修正 ≤ 0.5°,仅 d &lt; 余量时(JS
实现,不走 ONNX)</td>
</tr>
<tr class="odd">
<td>APG 兼容</td>
<td>固定噪声后为确定性可微映射</td>
</tr>
<tr class="even">
<td>预定回退</td>
<td>M5 门禁不过(near_column 穿柱率 &gt; 2% 或训练发散)→ 同骨干换 WTA
K=8 头(WTA-L1 + 模式 CE),约 1 天</td>
</tr>
</tbody>
</table>
<h3 id="63-损失">6.3 损失</h3>
<pre><code>L = MeanFlow 损失 1.0
+ FK 损失:一步输出(固定噪声)的各连杆胶囊端点位置差 0.5
+ 平滑:二阶差分 0.05
+ 价值头 L1 + 子目标头 L1 0.1 / 0.1</code></pre>
<h3 id="64-训练配置">6.4 训练配置</h3>
<table>
<thead>
<tr class="header">
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>优化器</td>
<td>AdamW,β=(0.9, 0.95),wd 0.01</td>
</tr>
<tr class="even">
<td>学习率</td>
<td>1e-3,预热 1000 步,余弦退火</td>
</tr>
<tr class="odd">
<td>batch</td>
<td>1024</td>
</tr>
<tr class="even">
<td>精度</td>
<td>bf16 混合精度</td>
</tr>
<tr class="odd">
<td>步数</td>
<td>先跑 2000 步测吞吐再定;参考 200 万样本 × 30 epoch ÷ 1024 ≈ 6
万步;验证集闭环到达率不再上升即停</td>
</tr>
<tr class="even">
<td>预计耗时</td>
<td>RTX 3090 约 1.5–5.6 小时(按 2000 步吞吐实测重算)</td>
</tr>
</tbody>
</table>
<h3 id="65-对拍与验证">6.5 对拍与验证</h3>
<ul>
<li><code>ml/eval/collide_torch.py</code>:可微胶囊距离 PyTorch
批量版,与 JS <code>collideFree</code> 对拍 10 万位形:布尔判定 0
差异,距离误差 &lt; 1e-4 mm,梯度与有限差分相对误差 &lt; 1e-3。</li>
<li>每 epoch 闭环验证:从 1000 个验证任务出发,按部署节奏(每 60 ms
推理、提交 3 步)运行到到达或超时(老师路径时长 × 2,最少 3
s),统计到达率、用时 ≤ 老师 × 1.3
的达标率、碰撞步数(关安全层)、行程比、左/右/穿柱三类比例。</li>
</ul>
<hr />
<h2 id="7-后训练">7. 后训练</h2>
<h3 id="71-主力apg-可微微调">7.1 主力:APG 可微微调</h3>
<pre><code>for 每个 batch(随机采样 q0 和目标,不需要老师):
q = q0
for t in 0..H-1 (H = 本批老师时长 p90 × 1.2,60–150 次推理 × 3 步 ≈ 3.6–9 s;无老师题按 6 s;每 10 次推理截断反传):
chunk = π(obs(q, 目标, 前缀), z) # 每条展开固定一个噪声 z
Δq = chunk[0:3] # 与部署一致
q = clamp(q + Δq)
累计 L_col(q), L_smooth(Δq)
L = w_tgt·Σ_段末 L_target(q) + w_col·ΣL_col + w_smooth·ΣL_smooth (+ w_len·行程) + w_bc·L_BC
反传,梯度裁剪 ≤ 1.0,lr 1e-4</code></pre>
<ul>
<li>碰撞项 L_col = Σ ReLU(margin − 胶囊距离),margin = 训练余量 3
mm(间隙已扣除
<code>margin_mm</code>);每步端点与中点,两处取均值(与只查端点同量纲);含臂×立柱、臂×台架、臂×臂(非相邻段)。</li>
<li>到达项:每个截断段末的位置误差² + λ_rot·‖R −
R*‖_F²;不做到达即停,段末项在整条展开上持续给出接近梯度。</li>
<li>平滑项:速度² + 加速度²。</li>
<li>BC 锚定项:保留预训练损失,防止多模态被压缩;每轮监控左右比例。</li>
<li>采样分布同 §4.3,B/C/D 类提到 60%,其中贴柱类 40%。</li>
</ul>
<h3 id="72-辅助无老师挖错循环">7.2 辅助:无老师挖错循环</h3>
<p>每轮:</p>
<ol type="1">
<li>出题:新种子 5 万任务 + 2000 段模型在环拖拽仿真。</li>
<li>闭环作答:完全按部署方式运行,<strong>关闭安全层</strong>以暴露真实错误。</li>
<li>验算:GPU 批量胶囊检查。</li>
<li>错题分类:E1 撞 / E2 没到(卡在局部极小)/ E3 绕远(&gt; 1.2×
参考)/ E4 末端精度差 / E5 摇摆(≥ 3 次切换)/ E6 拖拽失稳。</li>
<li>错题及其 ±5 mm / ±3° 的 10 个邻居加入 APG 采样池(E1、E6 ×2);仅 E2
可离线请老师补少量路径。</li>
<li>门禁(用门禁集,不用验收集):到达率上升、A 类每轮降幅 ≤ 0.5
个百分点、上一轮修好的错题 95% 仍对;否则回滚。</li>
<li>停止:连续 2 轮提升 &lt; 0.5 个百分点,或满 6 轮。</li>
</ol>
<hr />
<h2 id="8-部署">8. 部署</h2>
<h3 id="81-执行循环">8.1 执行循环</h3>
<pre><code>执行:50 Hz,每步 20 ms,按已提交步走
每 60 ms:
1. 读当前 q、当前速度、已提交未执行前缀、最新目标
2. 推理:8 个噪声 → 8 条 16 步动作块(冷启动或卡死换向时,再各推一块做短前瞻)
3. 每条候选做 1 步胶囊距离梯度投影(每轴 ≤ 0.5°,仅 d &lt; 余量时)
4. 排序(§8.2)
5. 安全层依次认证候选前 3 步 + 刹停段(§8.3),第一个通过的提交给执行器
6. 全部不通过 → 沿上一次已认证的刹停段停下,下次继续推理
7. 到达:TCP 误差 &lt; 1 mm(pose 另需 &lt; 0.5°)且速度≈0;
接近目标(&lt; 5 mm)时做 1–3 次局部牛顿精修(solveTo 单步),精修段同样过安全层认证</code></pre>
<p>执行的始终是安全层认证过的那一块,不做新旧块混合。执行时钟放在 Web
Worker、按实际 dt 推进,避免 <code>requestAnimationFrame</code>(60
Hz)与 20 ms 不整除及后台节流造成的抖动。</p>
<h3 id="82-候选排序防左右摇摆">8.2 候选排序(防左右摇摆)</h3>
<p>分数 = −Σ w_k‖候选第 k 步 − 已提交块第 k 步‖²(重叠步加权)−
λ·价值头剩余代价。冷启动时无已提交块,只用价值头 + 短前瞻打分。</p>
<h3 id="83-安全层唯一的硬保证">8.3 安全层(唯一的硬保证)</h3>
<ul>
<li><strong>距离下界认证</strong>:对一段运动 q_a →
q_b,若两端到障碍的最小距离之和 d(q_a) + d(q_b) &gt; Σ_j
r_j·|Δθ_j|,则整段安全;否则二分,直到全部子段通过或判不安全。按组对分别判定:组对
(g_A, g_B) 的间隙只受关节 g_A…g_B−1 带动组 g_B 影响,右端取
Σ_{k=g_A}^{g_B−1} T[k][g_B]·|Δθ_k|,T 为分组杠杆表(组 g_B 胶囊端点到轴
k 的最大距离,随机 4000 位形采样再放大 5%;末端组对 J1…J6 分别为 9.56 /
7.37 / 4.47 / 4.48 / 2.47 / 0.69 mm/°)。间隙取全部 |Δg| ≥ 2 胶囊对的
距离 − (r_i + r_j + margin)。外加关节限位。先用离散
<code>collideFree</code> 剔除明显干涉的候选;运行时每条候选最多 40
次距离查询;墙钟截止下沉到认证内部:第 1 条候选截止 45
ms,其余候选共享到 30
ms,到点即判不过、沿已认证刹停段停。安全层耗时在几何查询而不在模型(沙箱
Node 每次 gapMatrix 3.6–5.5 ms、collideFree 1.5 ms,推理 1.5 ms)。</li>
<li>离散采样检查(现有 <code>pathFine</code>,1.5° +
半格)只作快速预筛,不作保证依据。</li>
<li><strong>可刹停不变式</strong>:只有当"候选前 3 步 + 从第 3
步末按每轴 a_max
减速到停"整段都通过认证时才提交。任何时候系统都持有一条已认证的停车路线,下一次推理即使完全失效也只会停下。</li>
<li>耗时:每段一次距离查询覆盖整段,不通过才二分(通常 2–6
次);按排序逐个认证,第一个通过即停;包围球预筛先行。目标每次 &lt; 5
ms,否则放 Web Worker 与推理流水线并行。</li>
<li><code>ik-glue.js</code> 的每帧碰撞守卫保留为第二道保险。</li>
</ul>
<h3 id="84-部署包">8.4 部署包</h3>
<table>
<thead>
<tr class="header">
<th>有</th>
<th>没有</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>traj_policy.onnx</code>(fp32,约 20 MB;wasm / CPU 后端上
fp16 不保证更快)+ <code>traj_policy.meta.json</code>(指纹 / 特征版本 /
TCP)</td>
<td>PRM 路网、IK 候选大表</td>
</tr>
<tr class="even">
<td>胶囊距离与认证(<code>collideFree</code>、包围球预筛、<code>pair2d</code>)</td>
<td><code>solveDyn</code> / <code>routeRT</code> / RRT / A*</td>
</tr>
<tr class="odd">
<td><code>fk</code> / <code>orient</code>、局部牛顿精修
<code>solveTo</code> 单步</td>
<td>全量 IK 枚举</td>
</tr>
</tbody>
</table>
<p><code>collide.json</code>
指纹写进模型;不一致时前端拒绝运行并提示重训。</p>
<h3 id="85-near_column-3030-的保障手段">8.5 near_column 30/30
的保障手段</h3>
<p>"超时"指机械臂在规定时间内没走到目标,是决策问题而非计算速度问题。典型失效:局部极小/活锁(每次都想直穿、每次被安全层挡住)、左右摇摆、绕远。对策(运行时均不需要老师):</p>
<ol type="1">
<li><strong>子目标头</strong>:给出 1–2
个关节途经点作为绕柱方向锚点,标签取老师路径拐点(离线)。</li>
<li><strong>价值头</strong>:预测剩余时间/代价,用于候选打分与进展判断;APG
中用 TD 自举监督。</li>
<li><strong>短前瞻</strong>(仅冷启动和卡死换向时):对每条候选再推一块,用胶囊认证
+ 价值头给 32 步后终态打分。</li>
<li><strong>卡死检测 + 强制换向</strong>:0.3 s 内价值不降或连续 2
次刹停 → 切到另一绕行方向并锁定 1 s。</li>
<li><strong>训练侧加强</strong>:贴柱类占 APG 采样
40%;展开覆盖整段绕行。</li>
</ol>
<h3 id="86-控制周期">8.6 控制周期</h3>
<p>伺服层(参考):Franka FCI 1 ms;UR e-Series 2 ms、CB3 8 ms;ABB EGM
4 ms(滞后 10–20 ms);KUKA RSI 4/12 ms;FANUC DPM 约 8 ms;MoveIt Servo
默认 10 ms;RC 舵机 20 ms。</p>
<p>策略层(参考):MπNets 9 Hz;Diffusion Policy 10 Hz、预测 16 执行
8;ELMP 30 Hz;π0 50 Hz、约每 0.5 s 推理一次;DRP 300
Hz。业界均为"策略层 10–50 Hz + 伺服层 125 Hz–1 kHz"两层结构。</p>
<p>本方案:执行 50 Hz、每 60 ms 推理一次、提交 3 步。真机上提交步数 n ≥
⌈(通信滞后 + 一次推理最坏耗时) / 20 ms⌉ + 1,刹停段另行认证;策略输出 50
Hz
关节目标,由插补器升采样到电机控制器频率。<code>dt</code>、n、动作块长度均可配置。</p>
<hr />
<h2 id="9-评估与验收">9. 评估与验收</h2>
<h3 id="91-测试集合">9.1 测试集合</h3>
<table>
<thead>
<tr class="header">
<th>集合</th>
<th>来源</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>route_bench</td>
<td><code>tests/route_bench.cjs</code>(40 例)+ 60 例随机基准</td>
<td>验收</td>
</tr>
<tr class="even">
<td>near_column_bench</td>
<td><code>tests/near_column_bench.cjs</code>,30 例(pos / pose /
rt)</td>
<td>验收</td>
</tr>
<tr class="odd">
<td>near_column 扩展</td>
<td>§4.3 新造 ≥1000 例</td>
<td>一次性验收</td>
</tr>
<tr class="even">
<td>rt_drag_bench</td>
<td><code>tests/rt_drag_bench.cjs</code>,12 例(模型在环)</td>
<td>验收</td>
</tr>
<tr class="odd">
<td>held-out</td>
<td>§4.3 2000 条</td>
<td>一次性验收</td>
</tr>
<tr class="even">
<td>门禁集</td>
<td>§4.3 2000 条</td>
<td>训练中门禁,不参与验收</td>
</tr>
</tbody>
</table>
<p>新增 <code>tests/policy_bench.cjs</code>:①现有规划器
②策略(关安全层)③策略 + 安全层,输出对比表。</p>
<h3 id="92-验收标准部署形态--策略--安全层">9.2 验收标准(部署形态 = 策略
+ 安全层)</h3>
<table>
<thead>
<tr class="header">
<th>指标</th>
<th>要求</th>
<th>现有规划器</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>实际执行的碰撞</td>
<td><strong>= 0</strong>(距离认证或 0.01° 审计测量)</td>
<td>rt_drag_bench 0</td>
</tr>
<tr class="even">
<td>到达率</td>
<td>route 全部可达例到达;near pos <strong>30/30</strong>、near rt
<strong>30/30</strong>;near_column 扩展集 <strong>0
失败</strong>;held-out 可达任务 ≥ 98%,D 类停靠距离 ≤ 老师 + 5 mm</td>
<td><code>route_bench</code> 40 例:到达 40/40、细验有效 39/40;60
例随机基准有效 60/60;near 30/30、30/30</td>
</tr>
<tr class="odd">
<td>到达用时</td>
<td>≤ 老师路径时长 × 1.3</td>
<td>—</td>
</tr>
<tr class="even">
<td>关节行程</td>
<td>≤ 现有规划器 × 1.10(按类别分别报告)</td>
<td>60 例平均 467°</td>
</tr>
<tr class="odd">
<td>冷启动</td>
<td>&lt; 10 ms</td>
<td>首次全量 IK 最差约 2 s</td>
</tr>
<tr class="even">
<td>每次推理 + 安全认证 P99</td>
<td>&lt; 20 ms</td>
<td>拖拽重规划 P99 约 321 ms</td>
</tr>
<tr class="odd">
<td>刹停发生率</td>
<td>&lt; 2% 的推理周期</td>
<td>—</td>
</tr>
<tr class="even">
<td>模式摇摆(≥3 次切换)</td>
<td>&lt; 1% 的任务</td>
<td>—</td>
</tr>
<tr class="odd">
<td>策略单独(关安全层)碰撞率</td>
<td>&lt; 3%</td>
<td>—</td>
</tr>
</tbody>
</table>
<p>说明:30 例全对时,失败率的 95% 置信上界约 9.5%;扩展集 1000 例 0
失败时约 0.3%,因此以扩展集作为 30/30 的统计支撑。</p>
<p>口径:本表全部按部署形态(<code>tests/policy_bench.cjs</code>,与浏览器同一份运行时)或
held-out 闭环仿真(开仿真安全层)测量,由
<code>ml/eval/acceptance.py</code> 汇总;M5
门禁与挖错用的是关安全层的纯策略口径,二者互不替代。挖错题与门禁集没有老师参考,到达按定长
6 s 判,「到达用时」「关节行程」两项只在有老师参考的任务上统计。</p>
<hr />
<h2 id="10-当前存在的问题与风险">10. 当前存在的问题与风险</h2>
<h3 id="101-只能靠实测消除的风险按里程碑顺序">10.1
只能靠实测消除的风险(按里程碑顺序)</h3>
<table>
<thead>
<tr class="header">
<th>#</th>
<th>风险</th>
<th>门禁(不过不进下一步)</th>
<th>回退</th>
<th>何时测</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>R1</td>
<td>老师在相邻任务上左右绕行跳变,标签自相矛盾</td>
<td>起终点扰动 ±5 mm 的邻居任务同伦类一致率 ≥ 90%</td>
<td>对 A* 边代价加左右偏好项,强制同区域选同侧</td>
<td>M1</td>
</tr>
<tr class="even">
<td>R2</td>
<td>时间律仍有不可观测成分,闭环起不了步</td>
<td>近邻样本标签方差 &lt; 10%
步长(<code>ml/eval/check_r2.py</code>);起步失败率 = 0(闭环
<code>start_fail</code>)</td>
<td>进一步把剩余路程估计加入输入</td>
<td>M1 / M5</td>
</tr>
<tr class="odd">
<td>R3</td>
<td>距离认证过于保守,贴柱处拒绝率高,影响 30/30</td>
<td>near_column 上认证拒绝率统计;离线 10⁵ 段 0.01° 审计漏检 = 0</td>
<td>训练余量提高到 4–6 mm,接受行程变长;收紧杠杆界(按位形分区)</td>
<td>M2 / M7</td>
</tr>
<tr class="even">
<td>R4</td>
<td>浏览器纯推理延迟</td>
<td>训练前用随机初始化模型导出
ONNX(延迟与权重无关),<code>pipeline.sh r4</code> 自动测部署口径 K=8
P99 &lt; 15 ms。2026-10-18 本机:编码一次 + 16 线程 + 代理 Worker 后 P99
10.2–11.3 ms,<strong>已通过</strong>(改前 37.0 ms)</td>
<td>WebGPU 达标即用 WebGPU,否则
d=128(<code>configs/small.json</code>)。K=8 不降</td>
<td><strong>M1 前(已结)</strong></td>
</tr>
<tr class="odd">
<td>R5</td>
<td>MeanFlow 头在 6 轴、位姿目标下穿柱或训练不稳</td>
<td>near_column 穿柱率(关安全层)≤ 2%;损失不发散</td>
<td>同骨干换 WTA K=8 头</td>
<td>M5</td>
</tr>
<tr class="even">
<td>R6</td>
<td>位姿目标的多 IK 分支带来额外多峰</td>
<td>不同肘/腕分支子集到达率 ≥ 主集 − 2 个百分点</td>
<td>加目标分支标志</td>
<td>M5</td>
</tr>
<tr class="odd">
<td>R7</td>
<td>APG 压缩多模态或拉长路径(ELMP 中路径 +23%)</td>
<td>每轮门禁:B/C 类左右绕行比例变化 ≤ 5 个百分点、行程中位数比 ≤
1.05(<code>ml/mining/gate.py</code>)</td>
<td>加大 BC 锚定权重;行程项</td>
<td>M6</td>
</tr>
<tr class="even">
<td>R8</td>
<td>卡死换向活锁</td>
<td>50 个"两侧都要绕远"对抗用例(J1 起终差 ≥
140°、终点贴立柱,部署运行时)首次换向锁后 3 s 内到达 ≥ 95%,活锁 =
0(<code>tests/policy_bench.cjs</code> r8)</td>
<td>子目标改为离散绕行锚点分类</td>
<td>M6 / M7</td>
</tr>
<tr class="odd">
<td>R9</td>
<td>整周期超标(推理 + 前瞻 + 安全层 &gt; 60 ms
周期,执行时钟饥饿丢步)</td>
<td>训练好的模型在<strong>真查看器</strong>里跑与 bench 同一批 30
道贴柱题:整次规划 P99 &lt; 45 ms、饥饿节拍 &lt;
1%(<code>r4_probe --viewer</code> →
<code>r9_browser.json</code>);同题安全层浏览器 / Node 差 ≤ 3×</td>
<td>几何查询(features、投影、认证)移到
Worker,主线程只执行;前瞻只在冷启动时做</td>
<td>M7</td>
</tr>
<tr class="even">
<td>R10</td>
<td>训练耗时估计偏差</td>
<td>60000 步 ≤ 3.5 h,即 2000 步测速 ≥ 5000 样本/s(3090 实测 6.2 k/s ≈
2.8 h)</td>
<td>FK 损失胶囊数 96 → 48;仍不够则步数降到 40000(MeanFlow JVP
受算力限制,增大 batch 无效)</td>
<td>M5</td>
</tr>
</tbody>
</table>
<h3 id="102-已知缺陷">10.2 已知缺陷</h3>
<ol type="1">
<li>现有规划器(老师)在 <code>tests/route_bench.cjs</code> 上有 1/40
例到达但路径细验不过;§4.4 的认证过滤会丢弃这类样本。</li>
<li><code>ci27</code> 姿态根枚举漏分支(姿态偏差约 97.5°)会影响 pose
数据;APG 姿态项可部分纠正,必要时先修老师。</li>
<li>胶囊模型或立柱变动即需重训:数据(用户机器 16 核约 2 h)+ 预训练
1.5–6 h + 后训练数小时。</li>
<li>老师一致性沙箱首测 78%(100 任务、373 对邻居,门禁
90%):不一致主要来自 J6
冗余与时间预算造成的非确定性。已改为确定性老师(预算按碰撞判定次数计、每条前清空跨调用缓存)并在
pos 任务冻结 J6,待在用户机器复测;仍不达标则生成时启用 4
邻居共识过滤。</li>
<li>安全层耗时:未训练模型(候选为噪声)在 Node
单线程实测每次推理安全层约 20–60 ms,高于 5 ms
目标;训练后候选平滑会下降,以 <code>policy_bench</code> 与浏览器
<code>__POLICY.latency()</code> 实测为准,超标则把安全层移入 Web Worker
与推理流水线并行。</li>
</ol>
<h3 id="103-需要用户确认">10.3 需要用户确认</h3>
<ol type="1">
<li><strong>真机电机/驱动型号与通信方式</strong>:决定每轴加速度上限
a_max、插补频率与提交步数。</li>
<li><strong>运行时多候选打分是否算"运行时老师"</strong>:本方案的理解是不算(只对模型自己的候选做距离认证和打分,不做搜索)。</li>
</ol>
<hr />
<h2 id="11-目录规划">11. 目录规划</h2>
<p>运行步骤、命令与耗时见
<code>ml/README.md</code>。所有长步骤都能断点续跑,意外中断最多损失几分钟:生成按条续写(每条任务的随机数只由种子和序号决定),打包按
shard 跳过,预训练与 APG 每 10 分钟原子存一次
<code>last.pt</code>,停止时先存档再退出。</p>
<pre><code>ml/
pipeline.sh 阶段脚本:setup / kin / gate1 / gen / prep / train / m5 / apg / mine / export / bench
gen/ sampler / teacher(确定性 PRM A*)/ timelaw / gen_dataset / consistency / stats / run_parallel.sh
prep/ export_kin.cjs → assets/kin.json;build_dataset.cjs → data/samples/*.npy;run_prep.sh
data/ (不入库)shard_*.jsonl stats.json consistency.json samples/
common/ kin_torch.py(可微运动学 + 胶囊间隙) features.py(83 维特征) ckpt.py(原子存档、定时存档、体面停止)
model/ policy.py(MeanFlow 头;WTA K=8 回退头) meanflow.py
data.py train.py 样本加载、预训练
sim/closed_loop.py 闭环仿真(验证、挖错、门禁共用)
apg/apg_finetune.py APG 可微微调
mining/ tasks.py mine_round.py gate.py loop.sh
eval/ dump_parity.cjs check_parity.py(JS ↔ PyTorch 对拍)
configs/ base.json wta.json small.json apg.json
export_onnx.py serve.py README.md
webapp/js/ik-policy.js 运行时:特征、距离下界认证、刹停、投影、精修、Runner(浏览器与 Node 共用)
webapp/js/ik-policy-glue.js 查看器接入(?policy=1)
webapp/models/ traj_policy.onnx traj_policy.meta.json
tests/policy_bench.cjs 部署形态评测</code></pre>
<h2 id="12-里程碑">12. 里程碑</h2>
<table>
<thead>
<tr class="header">
<th>#</th>
<th>内容</th>
<th>产出</th>
<th>在哪跑</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>M1</td>
<td>数据生成器 + 时间律 + 1000 条试跑;老师一致性门禁</td>
<td><code>ml/gen/*</code>、stats.json</td>
<td>沙箱</td>
</tr>
<tr class="even">
<td>M2</td>
<td>可微胶囊距离(PyTorch)与 JS 对拍;距离认证实现与 10⁵ 段审计</td>
<td><code>collide_torch.py</code>、认证模块</td>
<td>沙箱</td>
</tr>
<tr class="odd">
<td>M3</td>
<td>5 万条老师数据 → 约 180 万样本</td>
<td><code>samples/*.npy</code></td>
<td>用户机器</td>
</tr>
<tr class="even">
<td>M4</td>
<td>模型 + 训练工程 + 闭环仿真;小数据过拟合;<strong>导出 ONNX
测浏览器延迟</strong></td>
<td><code>train.py</code>、<code>closed_loop.py</code>、延迟报告</td>
<td>沙箱 + 浏览器</td>
</tr>
<tr class="odd">
<td>M5</td>
<td>预训练 + MeanFlow 头门禁</td>
<td>checkpoint、门禁报告</td>
<td>用户 GPU</td>
</tr>
<tr class="even">
<td>M6</td>
<td>APG 微调 + 挖错循环 3–6 轮</td>
<td>每轮 report.md</td>
<td>用户 GPU</td>
</tr>
<tr class="odd">
<td>M7</td>
<td><code>ik-policy.js</code> 闭环部署 + 安全层实测 +
<code>policy_bench</code> + 一次性验收</td>
<td>对比表</td>
<td>沙箱 + 浏览器</td>
</tr>
<tr class="even">
<td>M8</td>
<td>移除查看器对
<code>solveDyn</code>/<code>routeRT</code>/路网的运行时依赖(保留在
<code>ml/gen</code> 离线使用)</td>
<td>部署包瘦身</td>
<td>沙箱</td>
</tr>
</tbody>
</table>
<h2 id="13-参考文献">13. 参考文献</h2>
<ul>
<li>MπNets:<a
href="https://arxiv.org/abs/2210.12209">https://arxiv.org/abs/2210.12209</a></li>
<li>Neural MP:<a
href="https://arxiv.org/abs/2409.05864">https://arxiv.org/abs/2409.05864</a></li>
<li>Deep Reactive Policy / IMPACT:<a
href="https://arxiv.org/abs/2509.06953">https://arxiv.org/abs/2509.06953</a></li>
<li>ELMP:<a
href="https://arxiv.org/abs/2607.00215">https://arxiv.org/abs/2607.00215</a></li>
<li>Diffusion Policy:<a
href="https://arxiv.org/abs/2303.04137">https://arxiv.org/abs/2303.04137</a></li>
<li>π0:<a
href="https://arxiv.org/abs/2410.24164">https://arxiv.org/abs/2410.24164</a>
;π0.5:<a
href="https://arxiv.org/abs/2504.16054">https://arxiv.org/abs/2504.16054</a></li>
<li>FAST:<a
href="https://arxiv.org/abs/2501.09747">https://arxiv.org/abs/2501.09747</a></li>
<li>MP1 / MeanFlow:<a
href="https://arxiv.org/abs/2507.10543">https://arxiv.org/abs/2507.10543</a></li>
<li>One-Step Flow Policy:<a
href="https://arxiv.org/abs/2603.12480">https://arxiv.org/abs/2603.12480</a></li>
<li>条件 OT 流策略:<a
href="https://proceedings.mlr.press/v305/sochopoulos25a.html">https://proceedings.mlr.press/v305/sochopoulos25a.html</a></li>
<li>Kinematic MeanFlow:<a
href="https://arxiv.org/abs/2610.00864">https://arxiv.org/abs/2610.00864</a></li>
<li>Consistency Policy:<a
href="https://arxiv.org/abs/2405.07503">https://arxiv.org/abs/2405.07503</a>
;OneDP:<a
href="https://arxiv.org/abs/2410.21257">https://arxiv.org/abs/2410.21257</a></li>
<li>MPD:<a
href="https://arxiv.org/abs/2308.01557">https://arxiv.org/abs/2308.01557</a>
;EDMP:<a
href="https://arxiv.org/abs/2309.11414">https://arxiv.org/abs/2309.11414</a>
;GPD:<a
href="https://arxiv.org/abs/2501.18229">https://arxiv.org/abs/2501.18229</a>
;DiffusionSeeder:<a
href="https://arxiv.org/abs/2410.16727">https://arxiv.org/abs/2410.16727</a></li>
<li>Real-Time Chunking:<a
href="https://arxiv.org/abs/2506.07339">https://arxiv.org/abs/2506.07339</a>
;训练时动作条件化:<a
href="https://arxiv.org/abs/2512.05964">https://arxiv.org/abs/2512.05964</a></li>
<li>Bidirectional Decoding(BID):<a
href="https://arxiv.org/abs/2408.17355">https://arxiv.org/abs/2408.17355</a></li>
<li>DPPO:<a
href="https://arxiv.org/abs/2409.00588">https://arxiv.org/abs/2409.00588</a>
;ReinFlow:<a
href="https://arxiv.org/abs/2505.22094">https://arxiv.org/abs/2505.22094</a></li>
<li>Schwarzer, Saha, Latombe, <em>Adaptive Dynamic Collision Checking
for Single and Multiple Articulated Robots in Complex Environments</em>,
IEEE T-RO 2005</li>
<li>Thumm &amp; Althoff, <em>Provably Safe Deep Reinforcement Learning
for Robotic Manipulation in Human Environments</em>, ICRA 2022</li>
<li>Zhou et al., <em>On the Continuity of Rotation Representations in
Neural Networks</em>, CVPR 2019</li>
<li>AWE(航点提取):<a
href="https://arxiv.org/abs/2307.14326">https://arxiv.org/abs/2307.14326</a>
;SHAC:<a
href="https://arxiv.org/abs/2204.07137">https://arxiv.org/abs/2204.07137</a></li>
<li>控制周期:Franka FCI <a
href="https://frankarobotics.github.io/docs/overview.html">https://frankarobotics.github.io/docs/overview.html</a>
;UR RTDE <a
href="https://www.universal-robots.com/articles/ur/interface-communication/remote-control-via-tcpip">https://www.universal-robots.com/articles/ur/interface-communication/remote-control-via-tcpip</a>
;ABB EGM 应用手册 3HAC073318;KUKA RSI <a
href="https://docs.quanser.com/quarc/documentation/kuka_rsi_block.html">https://docs.quanser.com/quarc/documentation/kuka_rsi_block.html</a></li>
</ul>
</body>
</html>