- M1 数据生成器:采样/老师/距离下界认证/时间律/统计/一致性门禁;确定性老师(碰撞次数计时 + resetSession)、pos 任务冻结 J6、--consensus 邻域共识过滤、Dr 类。 - 全流程代码与运行手册:数据打包/可微运动学与对拍/MeanFlow+WTA 模型/闭环仿真/APG/挖错循环/ONNX 导出;webapp 策略运行时 ik-policy.js、?policy=1 接入、tests/policy_bench.cjs;ik-solver 增 pairList/clusterExport/criticalPairs/pairGap/leverTable。
17 lines
1.3 KiB
JavaScript
17 lines
1.3 KiB
JavaScript
/* 路径偏差(同伦类判定用):两条展开折线按巡航时间 τ 各重采样 n 点,逐轴取最大差(°)。
|
|
* 判定口径:pos 任务忽略 J6(位置任务里 J6 是冗余自由度),max < 30° 视为同一绕行类。 */
|
|
'use strict';
|
|
const { VMAX } = require('./timelaw.cjs');
|
|
function resample(P, n) {
|
|
const seg = []; for (let i = 1; i < P.length; i++) { let m = 0; for (let j = 0; j < 6; j++) m = Math.max(m, Math.abs(P[i][j] - P[i - 1][j]) / VMAX[j]); seg.push(m); }
|
|
if (!seg.length) return Array.from({ length: n }, () => P[0].slice());
|
|
const tot = seg.reduce((a, b) => a + b, 0) || 1; const out = [];
|
|
for (let k = 0; k < n; k++) { let tau = tot * k / (n - 1), i = 0; while (i < seg.length - 1 && tau > seg[i]) { tau -= seg[i]; i++; }
|
|
const u = seg[i] > 0 ? Math.min(1, tau / seg[i]) : 1; out.push(P[i].map((v, j) => v + (P[i + 1][j] - v) * u)); }
|
|
return out;
|
|
}
|
|
function devAx(A, B, n) { n = n || 32; const a = resample(A, n), b = resample(B, n); const m = [0, 0, 0, 0, 0, 0]; for (let k = 0; k < n; k++) for (let j = 0; j < 6; j++) m[j] = Math.max(m[j], Math.abs(a[k][j] - b[k][j])); return m; }
|
|
const SAME_DEG = 30;
|
|
function sameClass(A, B, mode) { const d = devAx(A, B); return Math.max.apply(null, mode === 'pos' ? d.slice(0, 5) : d) < SAME_DEG; }
|
|
module.exports = { resample, devAx, sameClass, SAME_DEG };
|