unbekannte Positionen

This commit is contained in:
chk
2026-06-10 16:07:04 +02:00
parent 0f3edbcb9c
commit b16a293272
2 changed files with 27 additions and 12 deletions

View File

@@ -73,6 +73,7 @@
<div class="legend"> <div class="legend">
<span><span class="dot" style="background:#22c55e"></span>Erkannt</span> <span><span class="dot" style="background:#22c55e"></span>Erkannt</span>
<span><span class="dot" style="background:#ef4444"></span>Nicht erkannt</span> <span><span class="dot" style="background:#ef4444"></span>Nicht erkannt</span>
<span><span class="dot circle" style="background:#3b82f6"></span>Erkannt, nur 2D</span>
<span><span class="dot circle" style="background:#fbbf24"></span>Gemessen (3b)</span> <span><span class="dot circle" style="background:#fbbf24"></span>Gemessen (3b)</span>
<span><span class="dot" style="background:#9b7bff"></span>Kamera</span> <span><span class="dot" style="background:#9b7bff"></span>Kamera</span>
</div> </div>
@@ -258,24 +259,23 @@ function buildScene(data) {
for (const m of a0markers) { for (const m of a0markers) {
nTriangulated++; nTriangulated++;
// Kein künstlicher Offset Kugelmittelpunkt exakt an triangulierter Position
const mpos = r2vArr(m.position_mm); const mpos = r2vArr(m.position_mm);
mpos.y += 0.004; // leicht über der Papier-Ebene measuredById[m.marker_id] = mpos.clone();
measuredById[m.marker_id] = mpos;
// Gelber Punkt an gemessener Position // Amber-Kugel an exakter gemessener Position
const dot = makeSphere(mpos, 0.0055, 0xfbbf24); const dot = makeSphere(mpos, 0.0055, 0xfbbf24);
gMeasured.add(dot); gMeasured.add(dot);
// Verbindungslinie zum Modell-Mittelpunkt // Verbindungslinie: exakte Modellposition → exakte Messposition
const modelMarker = boardMarkers.find(bm => bm.id === m.marker_id); const modelMarker = boardMarkers.find(bm => bm.id === m.marker_id);
if (modelMarker) { if (modelMarker) {
const modelPos = r2vArr(modelMarker.position); const modelPos = r2vArr(modelMarker.position);
modelPos.y += 0.002; gMeasured.add(makeLine(modelPos, mpos.clone(), 0x78716c, 0.5));
gMeasured.add(makeLine(modelPos, mpos, 0x78716c, 0.5));
} }
} }
// Kamera-Frusta aus 3b (falls vorhanden, aktualisiert) // Kamera-Frusta aus 3b
if (measuredMarkers.cameras?.length > 0) { if (measuredMarkers.cameras?.length > 0) {
for (const c of measuredMarkers.cameras) { for (const c of measuredMarkers.cameras) {
const cpos = r2vArr(c.position_mm); const cpos = r2vArr(c.position_mm);
@@ -288,6 +288,17 @@ function buildScene(data) {
} }
} }
// ── Blaue Kugeln: Board-Marker erkannt, aber nicht trianguliert ──
// (nur 1 Kamera sah den Marker, oder 3b lief nicht)
let nDetectedNotTriangulated = 0;
for (const m of boardMarkers) {
if (detectedIds.has(m.id) && !Object.hasOwn(measuredById, m.id)) {
nDetectedNotTriangulated++;
const pos = r2vArr(m.position);
gMeasured.add(makeSphere(pos, 0.0055, 0x3b82f6));
}
}
// Falls keine 3b-Daten: Kamera-Frusta aus camera_pose-Dateien // Falls keine 3b-Daten: Kamera-Frusta aus camera_pose-Dateien
if (!measuredMarkers?.cameras?.length) { if (!measuredMarkers?.cameras?.length) {
const boardCenter = r2v(490, 0, -27.3); const boardCenter = r2v(490, 0, -27.3);
@@ -309,12 +320,15 @@ function buildScene(data) {
return `${cp.cameraId}: ${rms}`; return `${cp.cameraId}: ${rms}`;
}).join(' │ '); }).join(' │ ');
const triInfo = nTriangulated > 0 const triInfo = measuredMarkers === null
? ` │ 3b: ${nTriangulated} trianguliert` ? ' │ 3b: '
: (measuredMarkers === null ? ' │ 3b: ' : ' │ 3b: <2 Kameras'); : ` │ 3b: ${nTriangulated}`;
const only2dInfo = nDetectedNotTriangulated > 0
? ` │ nur 2D: ${nDetectedNotTriangulated}`
: '';
document.getElementById('stats').textContent = document.getElementById('stats').textContent =
`Erkannt ${nDetected}/${boardMarkers.length}${triInfo}` + `Erkannt ${nDetected}/${boardMarkers.length}${triInfo}${only2dInfo}` +
(camInfo ? ` │ RMS: ${camInfo}` : ''); (camInfo ? ` │ RMS: ${camInfo}` : '');
} }

View File

@@ -101,7 +101,8 @@ body {
flex: 1; flex: 1;
background: var(--panel); background: var(--panel);
border: 1px solid #334155; border: 1px solid #334155;
border-radius: 0 8px 8px 8px; border-left: none; /* kein Rahmen zur Tab-Seite → kein optischer Unterbruch */
border-radius: 8px; /* alle vier Ecken rund */
overflow-y: auto; overflow-y: auto;
padding: 20px 24px; padding: 20px 24px;
} }