1772 lines
68 KiB
HTML
1772 lines
68 KiB
HTML
<!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,训练可用 19–20 GB(桌面常驻 4–5 GB,进程硬帽
|
||
0.78)。部署:浏览器(后续真机)。</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>冷启动(新目标到第一个动作)< 10 ms;每次推理 + 安全认证 < 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 <
|
||
余量时)</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 & 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 <
|
||
余量时触发</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>(认证最小间隙 < 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>末端精度到 < 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(可用 19–20 GB)</td>
|
||
<td>预训练 batch 1024(峰值 2.76 GiB);APG batch 48 × 8000 步(峰值
|
||
13.08 GiB)</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">&&</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">"id"</span><span class="fu">:</span> <span class="st">"s0003_000127"</span><span class="fu">,</span> <span class="dt">"mode"</span><span class="fu">:</span> <span class="st">"pos"</span> <span class="er">|</span> <span class="st">"pose"</span><span class="fu">,</span></span>
|
||
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">"q0"</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">"T"</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">"R"</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">"tool"</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">"path"</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">"reached"</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">"travel_deg"</span><span class="fu">:</span> <span class="fl">123.4</span><span class="fu">,</span> <span class="dt">"plan_ms"</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">"fp"</span><span class="fu">:</span> <span class="st">"collide.json 指纹"</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>行程 > 同任务 <code>routeRT</code> 1.5
|
||
倍的先统计,再定是否丢弃;按类别统计丢弃率(C 类 > 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°;噪声态须无干涉且间隙
|
||
> 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>子目标触发:新目标或目标跳变 > 50 mm 时输出;到达当前子目标 <
|
||
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 < 余量时(JS
|
||
实现,不走 ONNX)</td>
|
||
</tr>
|
||
<tr class="odd">
|
||
<td>APG 兼容</td>
|
||
<td>固定噪声后为确定性可微映射</td>
|
||
</tr>
|
||
<tr class="even">
|
||
<td>预定回退</td>
|
||
<td>M5 门禁不过(near_column 穿柱率 > 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
|
||
差异,距离误差 < 1e-4 mm,梯度与有限差分相对误差 < 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 绕远(> 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 轮提升 < 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 < 余量时)
|
||
4. 排序(§8.2)
|
||
5. 安全层依次认证候选前 3 步 + 刹停段(§8.3),第一个通过的提交给执行器
|
||
6. 全部不通过 → 沿上一次已认证的刹停段停下,下次继续推理
|
||
7. 到达:TCP 误差 < 1 mm(pose 另需 < 0.5°)且速度≈0;
|
||
接近目标(< 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) > Σ_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
|
||
次);按排序逐个认证,第一个通过即停;包围球预筛先行。目标每次 < 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>< 10 ms</td>
|
||
<td>首次全量 IK 最差约 2 s</td>
|
||
</tr>
|
||
<tr class="even">
|
||
<td>每次推理 + 安全认证 P99</td>
|
||
<td>< 20 ms</td>
|
||
<td>拖拽重规划 P99 约 321 ms</td>
|
||
</tr>
|
||
<tr class="odd">
|
||
<td>刹停发生率</td>
|
||
<td>< 2% 的推理周期</td>
|
||
<td>—</td>
|
||
</tr>
|
||
<tr class="even">
|
||
<td>模式摇摆(≥3 次切换)</td>
|
||
<td>< 1% 的任务</td>
|
||
<td>—</td>
|
||
</tr>
|
||
<tr class="odd">
|
||
<td>策略单独(关安全层)碰撞率</td>
|
||
<td>< 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>近邻样本标签方差 < 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 < 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>整周期超标(推理 + 前瞻 + 安全层 > 60 ms
|
||
周期,执行时钟饥饿丢步)</td>
|
||
<td>训练好的模型在<strong>真查看器</strong>里跑与 bench 同一批 30
|
||
道贴柱题:稳态规划 P99 < 45 ms、运动中饥饿节拍 < 1%、认证超时占比
|
||
< 5%(<code>r4_probe --viewer</code> →
|
||
<code>r9_browser.json</code>;冷启动 P99、刹停率、tickGapMax
|
||
只报);同题安全层浏览器 / 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 & 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>
|