ml/gen: 确定性老师(碰撞次数计时 + resetSession)、pos 任务冻结 J6、--consensus 邻域共识过滤、Dr 类、README(高性能机器运行说明)
This commit is contained in:
+20
-9
@@ -1,14 +1,19 @@
|
||||
/* 老师(方案 §4.3):solveDyn 松手口径——有离线路网时内部走 PRM 路网 Lazy A* + 捷径平滑(种子由起点决定,确定性),
|
||||
* 路网失败再落到 RRT-Connect。返回展开后的折线与到达判据。 */
|
||||
/* 老师(方案 §4.3):solveDyn 松手口径——有离线路网时内部走 PRM 路网 Lazy A* + 捷径平滑,路网失败再落到 RRT-Connect。
|
||||
* 离线确定性(2026-10-17,M1 一致性门禁 78% 未过后加):
|
||||
* - 每次求解前 resetSession():清空路网增广/坏边/已验段等跨调用状态,结果与样本顺序无关;
|
||||
* - setDeterministic:毫秒预算改按碰撞判定次数计(msPerCheck 默认 0.5,即 300 ms 预算 ≈ 600 次判定),与机器负载无关;
|
||||
* - pos 任务冻结 J6:位置任务里 J6 不影响 TCP,路径上 J6 恒取起点值(认证不过才保留老师原路径,由 gen 决定)。 */
|
||||
'use strict';
|
||||
module.exports = function makeTeacher(S, ArmIK) {
|
||||
module.exports = function makeTeacher(S, ArmIK, opt) {
|
||||
opt = opt || {};
|
||||
const L = S.LIM, O = S.ORDER, w = S.wrap180;
|
||||
if (S.setDeterministic) S.setDeterministic(true, opt.msPerCheck || 0.5);
|
||||
return function teach(task) {
|
||||
const opt = { tool: 0, step: 0.5, ref: task.q0, from: task.q0.slice() };
|
||||
if (task.mode === 'pose') { opt.pose = { R: task.R }; opt.priority = 'pos'; }
|
||||
if (S.rtReset) S.rtReset();
|
||||
const o = { tool: 0, step: 0.5, ref: task.q0, from: task.q0.slice() };
|
||||
if (task.mode === 'pose') { o.pose = { R: task.R }; o.priority = 'pos'; }
|
||||
if (S.resetSession) S.resetSession(); else if (S.rtReset) S.rtReset();
|
||||
const t0 = performance.now();
|
||||
const r = S.solveDyn(task.T, opt);
|
||||
const r = S.solveDyn(task.T, o);
|
||||
const ms = performance.now() - t0;
|
||||
if (!r || !r.q) return { ok: false, ms, why: 'noq' };
|
||||
const pts = [task.q0.slice()].concat(r.via || [], [r.q]);
|
||||
@@ -17,7 +22,13 @@ module.exports = function makeTeacher(S, ArmIK) {
|
||||
const err = Math.hypot(tcp[0] - task.T[0], tcp[1] - task.T[1], tcp[2] - task.T[2]);
|
||||
const oerr = task.mode === 'pose' ? ArmIK.rotErrDeg(S.orient(qf), task.R) : 0;
|
||||
const reached = err < 1 && oerr < 0.5 && !r.blocked;
|
||||
let travel = 0; for (let i = 1; i < pts.length; i++) for (let k = 0; k < 6; k++) travel += Math.abs(pts[i][k] - pts[i - 1][k]);
|
||||
return { ok: true, pts, reached, err, oerr, travel, ms, blocked: !!r.blocked, poseRelaxed: !!r.poseRelaxed, unsafe: !!r.unsafe, detour: r.detour || null };
|
||||
const travelOf = P => { let t = 0; for (let i = 1; i < P.length; i++) for (let k = 0; k < 6; k++) t += Math.abs(P[i][k] - P[i - 1][k]); return t; };
|
||||
const out = { ok: true, pts, reached, err, oerr, travel: travelOf(pts), ms, blocked: !!r.blocked, poseRelaxed: !!r.poseRelaxed, unsafe: !!r.unsafe, detour: r.detour || null };
|
||||
if (task.mode === 'pos') {
|
||||
const j6 = task.q0[5];
|
||||
if (pts.some(p => Math.abs(p[5] - j6) > 1e-6)) out.ptsJ6Frozen = pts.map(p => { const c = p.slice(); c[5] = j6; return c; });
|
||||
}
|
||||
out.travelOf = travelOf;
|
||||
return out;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user