Claude: über nacht arbeiten. Pipeline verbessern
This commit is contained in:
@@ -796,6 +796,7 @@ function rebuild() {
|
||||
}
|
||||
|
||||
const errors = [];
|
||||
const normalErrors = [];
|
||||
for (const [midStr, {pos: opos, nor: oNor}] of Object.entries(obs)) {
|
||||
const mid = parseInt(midStr);
|
||||
const mpos = modelPositions[mid];
|
||||
@@ -811,11 +812,20 @@ function rebuild() {
|
||||
|
||||
gObserved.add(makeSphere(op, 0.006, col));
|
||||
|
||||
// observed normal arrow — orange if available
|
||||
// observed normal arrow — coloured by angular deviation from the model normal
|
||||
if (oNor) {
|
||||
try {
|
||||
const obsArrow = makeNormalArrow(op, oNor, 0.018, 0xffaa00);
|
||||
gObsNormals.add(obsArrow);
|
||||
let normCol = 0xffaa00; // no model to compare -> orange
|
||||
const mn = modelNormals[mid];
|
||||
if (mn) {
|
||||
const dot = (oNor[0]*mn[0] + oNor[1]*mn[1] + oNor[2]*mn[2]) /
|
||||
((Math.hypot(oNor[0],oNor[1],oNor[2]) * Math.hypot(mn[0],mn[1],mn[2])) || 1);
|
||||
let a = Math.acos(Math.max(-1, Math.min(1, dot))) * 180 / Math.PI;
|
||||
a = Math.min(a, 180 - a); // flip-invariant
|
||||
normalErrors.push(a);
|
||||
normCol = a < 2 ? 0x3ecf6b : a < 5 ? 0xf59e0b : 0xff4f4f;
|
||||
}
|
||||
gObsNormals.add(makeNormalArrow(op, oNor, 0.018, normCol));
|
||||
} catch (e) {
|
||||
console.warn('Invalid normal for marker', mid, oNor, e);
|
||||
}
|
||||
@@ -833,12 +843,13 @@ function rebuild() {
|
||||
}
|
||||
|
||||
// ── stats ──
|
||||
updateStats(errors, Object.keys(obs).length, Object.keys(modelPositions).length);
|
||||
updateStats(errors, normalErrors, Object.keys(obs).length, Object.keys(modelPositions).length);
|
||||
}
|
||||
|
||||
// ─── statistics panel ──────────────────────────────────────────
|
||||
function updateStats(errArr, nObs, nModel) {
|
||||
function updateStats(errArr, normArr, nObs, nModel) {
|
||||
const el = document.getElementById('stats-content');
|
||||
normArr = normArr || [];
|
||||
if (errArr.length === 0) {
|
||||
el.innerHTML = `<div class="stat-line"><span>Observed:</span><span class="stat-val">${nObs}</span></div>
|
||||
<div class="stat-line"><span>Model:</span><span class="stat-val">${nModel}</span></div>
|
||||
@@ -854,6 +865,15 @@ function updateStats(errArr, nObs, nModel) {
|
||||
|
||||
const cls = v => v < 2 ? 'stat-ok' : v < 5 ? 'stat-warn' : 'stat-err';
|
||||
|
||||
let normHtml = '';
|
||||
if (normArr.length) {
|
||||
const nmean = normArr.reduce((s,v)=>s+v,0) / normArr.length;
|
||||
const nmax = Math.max(...normArr);
|
||||
const ncls = v => v < 2 ? 'stat-ok' : v < 5 ? 'stat-warn' : 'stat-err';
|
||||
normHtml = `<div class="stat-line" style="margin-top:4px"><span>Normal mean:</span><span class="${ncls(nmean)}">${nmean.toFixed(1)}°</span></div>
|
||||
<div class="stat-line"><span>Normal max:</span><span class="${ncls(nmax)}">${nmax.toFixed(1)}°</span></div>`;
|
||||
}
|
||||
|
||||
el.innerHTML = `
|
||||
<div class="stat-line"><span>Observed:</span><span class="stat-val">${nObs}</span></div>
|
||||
<div class="stat-line"><span>Matched:</span><span class="stat-val">${errArr.length}</span></div>
|
||||
@@ -862,8 +882,9 @@ function updateStats(errArr, nObs, nModel) {
|
||||
<div class="stat-line"><span>Median:</span><span class="${cls(p50)}">${p50.toFixed(1)} mm</span></div>
|
||||
<div class="stat-line"><span>p90:</span><span class="${cls(p90)}">${p90.toFixed(1)} mm</span></div>
|
||||
<div class="stat-line"><span>Max:</span><span class="${cls(max)}">${max.toFixed(1)} mm</span></div>
|
||||
${normHtml}
|
||||
<div style="margin-top:6px;font-size:10px;color:var(--muted)">
|
||||
🟢 <2mm 🟡 2–5mm 🔴 >5mm</div>`;
|
||||
🟢 <2mm/° 🟡 2–5 🔴 >5</div>`;
|
||||
}
|
||||
|
||||
function setStatus(msg) {
|
||||
|
||||
@@ -91,10 +91,17 @@ python3 "..\pipeline\3_multiview_bundle_adjustment_v4.py" ^
|
||||
|
||||
|
||||
echo.
|
||||
echo [STEP 4] Robotics Pose calculation of angles and joint positions
|
||||
echo [STEP 3b] Corner-based marker poses (position + measured normal)
|
||||
|
||||
python3 "..\pipeline\3b_corner_marker_poses.py" ^
|
||||
--evalDir "%OUT_DIR%" ^
|
||||
--robot "%ROBOT_JSON%"
|
||||
|
||||
|
||||
python3 "..\pipeline\4_robotState_estimation_v6.py" ^
|
||||
"%OUT_DIR%\aruco_positions_initial.json" ^
|
||||
echo.
|
||||
echo [STEP 4] Robot pose estimation (joint angles) from marker poses
|
||||
|
||||
python3 "..\pipeline\pose_estimation.py" ^
|
||||
"%OUT_DIR%\aruco_marker_poses.json" ^
|
||||
-robot "%ROBOT_JSON%" ^
|
||||
-out "%OUT_DIR%\robot_state.json"
|
||||
|
||||
Reference in New Issue
Block a user