From b16a293272406e7f762334732fcbfbe926c63142 Mon Sep 17 00:00:00 2001
From: chk <79915315+ChKendel@users.noreply.github.com>
Date: Wed, 10 Jun 2026 16:07:04 +0200
Subject: [PATCH] unbekannte Positionen
---
public/boardViewer.html | 36 +++++++++++++++++++++++++-----------
public/calibration.css | 3 ++-
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/public/boardViewer.html b/public/boardViewer.html
index 844d1a5..c8c9fd4 100644
--- a/public/boardViewer.html
+++ b/public/boardViewer.html
@@ -73,6 +73,7 @@
Erkannt
Nicht erkannt
+ Erkannt, nur 2D
Gemessen (3b)
Kamera
@@ -258,24 +259,23 @@ function buildScene(data) {
for (const m of a0markers) {
nTriangulated++;
+ // Kein künstlicher Offset – Kugelmittelpunkt exakt an triangulierter Position
const mpos = r2vArr(m.position_mm);
- mpos.y += 0.004; // leicht über der Papier-Ebene
- measuredById[m.marker_id] = mpos;
+ measuredById[m.marker_id] = mpos.clone();
- // Gelber Punkt an gemessener Position
+ // Amber-Kugel an exakter gemessener Position
const dot = makeSphere(mpos, 0.0055, 0xfbbf24);
gMeasured.add(dot);
- // Verbindungslinie zum Modell-Mittelpunkt
+ // Verbindungslinie: exakte Modellposition → exakte Messposition
const modelMarker = boardMarkers.find(bm => bm.id === m.marker_id);
if (modelMarker) {
const modelPos = r2vArr(modelMarker.position);
- modelPos.y += 0.002;
- gMeasured.add(makeLine(modelPos, mpos, 0x78716c, 0.5));
+ gMeasured.add(makeLine(modelPos, mpos.clone(), 0x78716c, 0.5));
}
}
- // Kamera-Frusta aus 3b (falls vorhanden, aktualisiert)
+ // Kamera-Frusta aus 3b
if (measuredMarkers.cameras?.length > 0) {
for (const c of measuredMarkers.cameras) {
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
if (!measuredMarkers?.cameras?.length) {
const boardCenter = r2v(490, 0, -27.3);
@@ -309,12 +320,15 @@ function buildScene(data) {
return `${cp.cameraId}: ${rms}`;
}).join(' │ ');
- const triInfo = nTriangulated > 0
- ? ` │ 3b: ${nTriangulated} trianguliert`
- : (measuredMarkers === null ? ' │ 3b: –' : ' │ 3b: <2 Kameras');
+ const triInfo = measuredMarkers === null
+ ? ' │ 3b: –'
+ : ` │ 3b: ${nTriangulated}`;
+ const only2dInfo = nDetectedNotTriangulated > 0
+ ? ` │ nur 2D: ${nDetectedNotTriangulated}`
+ : '';
document.getElementById('stats').textContent =
- `Erkannt ${nDetected}/${boardMarkers.length}${triInfo}` +
+ `Erkannt ${nDetected}/${boardMarkers.length}${triInfo}${only2dInfo}` +
(camInfo ? ` │ RMS: ${camInfo}` : '');
}
diff --git a/public/calibration.css b/public/calibration.css
index af28daa..aa3f005 100644
--- a/public/calibration.css
+++ b/public/calibration.css
@@ -101,7 +101,8 @@ body {
flex: 1;
background: var(--panel);
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;
padding: 20px 24px;
}