Claude: über nacht arbeiten. Pipeline verbessern

This commit is contained in:
chk
2026-06-02 06:04:41 +02:00
parent e5b41e9110
commit 30e97eb4bd
252 changed files with 125356 additions and 52694 deletions

View File

@@ -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)}&deg;</span></div>
<div class="stat-line"><span>Normal max:</span><span class="${ncls(nmax)}">${nmax.toFixed(1)}&deg;</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)">
🟢 &lt;2mm &nbsp; 🟡 25mm &nbsp; 🔴 &gt;5mm</div>`;
🟢 &lt;2mm &nbsp; 🟡 25 &nbsp; 🔴 &gt;5</div>`;
}
function setStatus(msg) {

View File

@@ -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"