diff --git a/public/boardViewer.html b/public/boardViewer.html index c32d710..70102bf 100644 --- a/public/boardViewer.html +++ b/public/boardViewer.html @@ -736,6 +736,10 @@ function buildCompareLines() { // ── Y-Achsen-Berechnung aus drei Positionen ─────────────────────────────────── +/** Marker, die sich weniger als diesen Wert bewegen, werden ignoriert. + * Entspricht dem min_movement_mm-Parameter im Python-Skript. */ +const Y_AXIS_MIN_MOVEMENT_MM = 10.0; + function computeAndShowYAxis() { clearGroup(gYAxis); @@ -755,6 +759,8 @@ function computeAndShowYAxis() { const circumcenters = []; // [{id, C:[x,y,z]}] in mm const normals = []; // [[nx,ny,nz]] – Achsenrichtung je Marker + const markerData = []; // [{markerId, posA, posB, posC, circumcenter, normal}] für Speicherung + const skipped = []; // [{id, reason, maxMoveMm}] for (const [id, ma] of mapA) { const mb = mapB.get(id); @@ -765,6 +771,22 @@ function computeAndShowYAxis() { const P2 = mb.position_mm.map(Number); const P3 = mc.position_mm.map(Number); + // ── Mindest-Bewegungs-Filter ───────────────────────────────────────────── + // Marker, die sich zwischen den drei Positionen kaum bewegen, liefern + // degenerate Umkreismittelpunkte und korrumpieren die Achsenschätzung. + // Dieselbe Logik wie im Python-Skript (min_movement_mm). + const maxMoveMm = Math.max( + Math.sqrt(dist2(P1, P2)), + Math.sqrt(dist2(P2, P3)), + Math.sqrt(dist2(P1, P3)), + ); + if (maxMoveMm < Y_AXIS_MIN_MOVEMENT_MM) { + vlog(`Y-Achse: Marker ${id} übersprungen – Bewegung zu gering` + + ` (${maxMoveMm.toFixed(1)} mm < ${Y_AXIS_MIN_MOVEMENT_MM} mm, kein rotierender Marker)`, 'warn'); + skipped.push({ id, reason: 'Bewegung zu gering', maxMoveMm: +maxMoveMm.toFixed(2) }); + continue; + } + // Normalenvektor der Kreisebene = Achsenrichtung const v1 = [P2[0]-P1[0], P2[1]-P1[1], P2[2]-P1[2]]; const v2 = [P3[0]-P1[0], P3[1]-P1[1], P3[2]-P1[2]]; @@ -795,6 +817,7 @@ function computeAndShowYAxis() { (w1*P1[2] + w2*P2[2] + w3*P3[2]) / wSum, ]; circumcenters.push({ id, C }); + markerData.push({ markerId: id, posA: P1, posB: P2, posC: P3, circumcenter: C, normal: n }); // Kreismittelpunkt (rose) gYAxis.add(makeSphere(r2vArr(C), 0.007, 0xfb7185)); @@ -803,8 +826,11 @@ function computeAndShowYAxis() { } if (circumcenters.length === 0) { - vlog('Y-Achse: Keine gemeinsamen fremd-Marker in Pos A+B+C gefunden', 'warn'); - window.parent.postMessage({ type: 'yaxis-measurement', axisDir: null }, '*'); + const why = skipped.length + ? `Alle ${skipped.length} Marker gefiltert (Bewegung < ${Y_AXIS_MIN_MOVEMENT_MM} mm)` + : 'Keine gemeinsamen fremd-Marker in Pos A+B+C gefunden'; + vlog(`Y-Achse: ${why}`, 'warn'); + window.parent.postMessage({ type: 'yaxis-measurement', axisDir: null, skipped }, '*'); return; } @@ -837,7 +863,11 @@ function computeAndShowYAxis() { const fmt = v => (v >= 0 ? '+' : '') + v.toFixed(3) + '°'; const good = Math.abs(tiltXY) < 0.5 && Math.abs(tiltYZ) < 0.5; - vlog(`Y-Achse (${circumcenters.length} Marker): dir=[${axisDir.map(v => v.toFixed(4)).join(', ')}]`); + const usedIds = circumcenters.map(c => c.id); + const skippedIds = skipped.map(s => s.id); + vlog(`Y-Achse: ${usedIds.length} Marker genutzt (${usedIds.join(', ')})` + + (skippedIds.length ? ` · ${skippedIds.length} gefiltert (${skippedIds.join(', ')})` : '')); + vlog(` dir=[${axisDir.map(v => v.toFixed(4)).join(', ')}]`); vlog(` Referenzpunkt: [${axisPoint.map(v => v.toFixed(1)).join(', ')}] mm`); vlog(` Abw. von Y-Achse: XY ${fmt(tiltXY)} YZ ${fmt(tiltYZ)}`, good ? 'ok' : 'warn'); @@ -847,7 +877,14 @@ function computeAndShowYAxis() { axisPoint, tiltXY, tiltYZ, - numMarkers: circumcenters.length, + numMarkers: circumcenters.length, + numMarkersCommon: circumcenters.length + skipped.length, + skipped, + // Für rotation_detection.json: Run-Referenzen und Marker-Rohdaten + runA: document.getElementById('sel-run-primary')?.value ?? null, + runB: document.getElementById('sel-run-compare')?.value ?? null, + runC: document.getElementById('sel-run-c')?.value ?? null, + markerData, }, '*'); } diff --git a/public/calibration.css b/public/calibration.css index aa3f005..63208e7 100644 --- a/public/calibration.css +++ b/public/calibration.css @@ -60,7 +60,6 @@ body { display: flex; flex-direction: column; gap: 3px; - padding-top: 4px; flex-shrink: 0; width: 148px; } @@ -92,6 +91,7 @@ body { border-right: none; border-left: 3px solid var(--accent); padding-left: 13px; /* kompensiert den dickeren linken Rand */ + margin-right: -1px; /* überlappt 1px ins Panel → kein Zoom-Spalt */ z-index: 1; } diff --git a/public/calibration.js b/public/calibration.js index 9df55c0..c7fadf7 100644 --- a/public/calibration.js +++ b/public/calibration.js @@ -565,6 +565,20 @@ function initArm(tab) { log(`📐 Achse (${msg.numMarkers} Marker): dir=[${msg.axisDir.map(v => v.toFixed(4)).join(', ')}]` + ` XY=${fmt(msg.tiltXY)} YZ=${fmt(msg.tiltYZ)}`); log(` Referenzpunkt: [${msg.axisPoint.map(v => v.toFixed(1)).join(', ')}] mm`); + + // In rotation_detection.json speichern (anhängen) + fetch('/api/xaxis/save-rotation-detection', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + axis: { dir: msg.axisDir, referencePoint: msg.axisPoint, tiltXY_deg: msg.tiltXY, tiltYZ_deg: msg.tiltYZ }, + runs: { A: msg.runA ?? null, B: msg.runB ?? null, C: msg.runC ?? null }, + numMarkers: msg.numMarkers, + markers: msg.markerData ?? [], + }), + }).then(r => r.json()) + .then(d => log(`💾 Gespeichert: ${d.file} (${d.total} Messungen)`)) + .catch(e => log(`⚠ Speichern fehlgeschlagen: ${e.message}`)); } }); } diff --git a/public/calibration_arm.html b/public/calibration_arm.html index fb97732..67a640b 100644 --- a/public/calibration_arm.html +++ b/public/calibration_arm.html @@ -20,6 +20,20 @@ + +
+

Aktionen

+
+ + Roboter-Bieps drehen (Schrittweite folgt) + +
+
+

Ausgabe / Log

diff --git a/public/calibration_arm2.html b/public/calibration_arm2.html index c8df57c..18d5bdc 100644 --- a/public/calibration_arm2.html +++ b/public/calibration_arm2.html @@ -20,6 +20,20 @@
+ +
+

Aktionen

+
+ + Roboter-Unterarm drehen (Schrittweite folgt) + +
+
+

Ausgabe / Log

diff --git a/scripts/4_yAxis_rotation_reconstruction.py b/scripts/4_yAxis_rotation_reconstruction.py new file mode 100644 index 0000000..09e015c --- /dev/null +++ b/scripts/4_yAxis_rotation_reconstruction.py @@ -0,0 +1,349 @@ +#!/usr/bin/env python3 +""" +4_yAxis_rotation_reconstruction.py +==================================== +Berechnet die Rotationsachse eines Gelenks aus drei Board-Erkennungs-Timestamps. + +Gegeben drei Messungen (Pos A, B, C) – in denen dieselben fremd-Marker +(link != 'Board') erkannt wurden – bestimmt das Skript: + - Richtung der Rotationsachse (axisDir, Einheitsvektor) + - Referenzpunkt auf der Achse (axisPoint_mm) + - Residuen pro Punkt (Qualitätsmass) + +Methode (doc/04_y_achse.md): + Jeder Marker bewegt sich auf einem Kreisbogen. Die Ebene des Kreises + steht senkrecht zur Rotationsachse → Normalenvektor = Achsenrichtung. + Der Umkreismittelpunkt des Dreiecks P1-P2-P3 liegt auf der Achse. + + Statt nur dem Marker-Zentrum werden alle vier Ecken (corners_m) verwendet: + das liefert 4× mehr Datenpunkte und macht die Schätzung robuster. + +Usage: + python3 4_yAxis_rotation_reconstruction.py [Optionen] + + Verzeichnis mit aruco_marker_poses.json ODER direkter Dateipfad + +Optionen: + --output, -o Ergebnis in JSON-Datei speichern + --pretty Eingerücktes JSON auf stdout + --link Marker-Link, der als "Referenz" gilt und NICHT verwendet wird + (Default: 'Board') + +Output (stdout): + JSON mit axisDir, axisPoint_mm, residuals, tiltXY_deg, tiltYZ_deg, … +""" +from __future__ import annotations + +import argparse +import json +import math +import os +import sys +from typing import List, Optional, Tuple + +import numpy as np + + +# ── Laden ───────────────────────────────────────────────────────────────────── + +def load_poses(path: str) -> dict: + """Lädt aruco_marker_poses.json – akzeptiert Verzeichnis oder direkten Pfad.""" + if os.path.isdir(path): + path = os.path.join(path, 'aruco_marker_poses.json') + if not os.path.exists(path): + raise FileNotFoundError(f'Nicht gefunden: {path}') + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + + +def fremd_markers(data: dict, ref_link: str = 'Board') -> dict[int, dict]: + """Gibt fremd-Marker als {marker_id: marker_dict} zurück.""" + return { + m['marker_id']: m + for m in data.get('markers', []) + if m.get('link') != ref_link + } + + +def get_points_mm(marker: dict) -> List[np.ndarray]: + """ + Gibt alle 3D-Punkte eines Markers in mm zurück. + Bevorzugt corners_m (4 Ecken); Fallback: Zentrum position_mm. + """ + corners = marker.get('corners_m') + if corners: + return [np.array(c, dtype=float) * 1000.0 for c in corners] + pos = marker.get('position_mm') + if pos: + return [np.array(pos, dtype=float)] + pos_m = marker.get('position_m') + if pos_m: + return [np.array(pos_m, dtype=float) * 1000.0] + return [] + + +# ── Geometrie ───────────────────────────────────────────────────────────────── + +def circumcenter_and_normal( + P1: np.ndarray, P2: np.ndarray, P3: np.ndarray +) -> Tuple[Optional[np.ndarray], Optional[np.ndarray], float]: + """ + Umkreismittelpunkt + Normalenvektor des Dreiecks P1-P2-P3. + + Rückgabe: (circumcenter_mm, normal, cross_length) + Bei Degeneration (kollinear / identisch): (None, None, cross_length) + """ + v1 = P2 - P1 + v2 = P3 - P1 + cross = np.cross(v1, v2) + cross_len = float(np.linalg.norm(cross)) + + if cross_len < 1e-6: # Punkte (fast) kollinear oder identisch + return None, None, cross_len + + n = cross / cross_len + + # Baryzentrische Gewichte → Umkreismittelpunkt + a2 = float(np.dot(P2 - P3, P2 - P3)) + b2 = float(np.dot(P1 - P3, P1 - P3)) + c2 = float(np.dot(P1 - P2, P1 - P2)) + + w1 = a2 * (b2 + c2 - a2) + w2 = b2 * (a2 + c2 - b2) + w3 = c2 * (a2 + b2 - c2) + w_sum = w1 + w2 + w3 + + if abs(w_sum) < 1e-12: # gleichseitiges / entartetes Dreieck + return None, None, cross_len + + C = (w1 * P1 + w2 * P2 + w3 * P3) / w_sum + return C, n, cross_len + + +def point_line_distance(point: np.ndarray, line_pt: np.ndarray, line_dir: np.ndarray) -> float: + """Abstand Punkt → Gerade (line_pt + t·line_dir, line_dir normiert).""" + diff = point - line_pt + return float(np.linalg.norm(diff - np.dot(diff, line_dir) * line_dir)) + + +# ── Kernberechnung ──────────────────────────────────────────────────────────── + +def compute_rotation_axis( + posA: dict, + posB: dict, + posC: dict, + ref_link: str = 'Board', + min_radius_mm: float = 0.5, + min_movement_mm: float = 10.0, +) -> dict: + """ + Berechnet die Rotationsachse aus drei Messungen. + + Parameter: + min_radius_mm – Kreisradius unter dem ein Ecken-Triplet als degenerat gilt + min_movement_mm – Minimale Zentren-Bewegung (max Paarweisabstand A/B/C) + Marker die sich weniger bewegen werden ignoriert. + Default 10 mm → filtert Board-nahe / fest stehende Marker. + """ + mA = fremd_markers(posA, ref_link) + mB = fremd_markers(posB, ref_link) + mC = fremd_markers(posC, ref_link) + + common_ids = sorted(set(mA) & set(mB) & set(mC)) + if not common_ids: + return {'ok': False, 'error': 'Keine gemeinsamen fremd-Marker in A+B+C'} + + circumcenters: List[np.ndarray] = [] + normals: List[np.ndarray] = [] + skipped: List[dict] = [] + marker_results: List[dict] = [] + + for mid in common_ids: + # ── Mindest-Bewegungs-Filter ─────────────────────────────────────────── + # Marker die sich kaum bewegen liefern degenerate Umkreismittelpunkte. + # Wir vergleichen die Zentren (position_mm) der drei Messungen. + cA = np.array(mA[mid].get('position_mm', [0, 0, 0]), dtype=float) + cB = np.array(mB[mid].get('position_mm', [0, 0, 0]), dtype=float) + cC = np.array(mC[mid].get('position_mm', [0, 0, 0]), dtype=float) + max_movement = max( + np.linalg.norm(cB - cA), + np.linalg.norm(cC - cB), + np.linalg.norm(cC - cA), + ) + if max_movement < min_movement_mm: + skipped.append({ + 'marker_id': mid, + 'reason': 'Bewegung zu gering (kein rotierender Marker)', + 'max_movement_mm': round(float(max_movement), 2), + 'threshold_mm': min_movement_mm, + }) + continue + + pts_a = get_points_mm(mA[mid]) + pts_b = get_points_mm(mB[mid]) + pts_c = get_points_mm(mC[mid]) + + n_pts = min(len(pts_a), len(pts_b), len(pts_c)) + ok_pts: List[np.ndarray] = [] + ok_ns: List[np.ndarray] = [] + + for i in range(n_pts): + P1, P2, P3 = pts_a[i], pts_b[i], pts_c[i] + C, n, cross_len = circumcenter_and_normal(P1, P2, P3) + + if C is None: + skipped.append({ + 'marker_id': mid, 'point_idx': i, + 'reason': 'degenerat (kollinear)', + 'cross_len': round(cross_len, 6), + }) + continue + + radius = float(np.linalg.norm(C - P1)) + if radius < min_radius_mm: + skipped.append({ + 'marker_id': mid, 'point_idx': i, + 'reason': 'radius zu klein (Bewegung zu gering)', + 'radius_mm': round(radius, 4), + }) + continue + + ok_pts.append(C) + ok_ns.append(n) + circumcenters.append(C) + normals.append(n) + + cc_arr = np.array(ok_pts) if ok_pts else np.empty((0, 3)) + marker_results.append({ + 'marker_id': mid, + 'n_points_used': len(ok_pts), + 'n_points_total': n_pts, + 'circumcenter_mean_mm': cc_arr.mean(axis=0).round(3).tolist() + if len(ok_pts) else None, + }) + + if not normals: + return { + 'ok': False, + 'error': 'Alle Triplets degenerat – Bewegung zu gering oder Marker kollinear.', + 'skipped': skipped, + } + + normals_arr = np.array(normals) # (N, 3) + circumcenters_arr = np.array(circumcenters) # (N, 3) + + # ── Achsenrichtung ───────────────────────────────────────────────────────── + # Alle Normalen auf dieselbe Halbkugel (Vorzeichenanpassung) + ref = normals_arr[0] + signs = np.where(normals_arr @ ref >= 0, 1.0, -1.0) + aligned = normals_arr * signs[:, np.newaxis] + + mean_n = aligned.mean(axis=0) + axis_dir = mean_n / np.linalg.norm(mean_n) + + # Streuung der Normalen (Winkelresidum) + cos_angles = np.clip(aligned @ axis_dir, -1, 1) + angle_residuals_deg = np.degrees(np.arccos(cos_angles)) + + # ── Referenzpunkt ────────────────────────────────────────────────────────── + axis_point = circumcenters_arr.mean(axis=0) + + # ── Abstandsresiduen ─────────────────────────────────────────────────────── + dist_residuals = np.array([ + point_line_distance(C, axis_point, axis_dir) + for C in circumcenters_arr + ]) + + # ── Abweichung von Y-Achse [0, 1, 0] in Roboter-Koordinaten ────────────── + ax, ay, az = axis_dir + tilt_xy_deg = math.degrees(math.atan2(ax, ay)) # Kippung in XY-Ebene + tilt_yz_deg = math.degrees(math.atan2(az, ay)) # Kippung in YZ-Ebene + + used_ids = [r['marker_id'] for r in marker_results if r['n_points_used'] > 0] + + return { + 'ok': True, + 'axisDir': axis_dir.round(6).tolist(), + 'axisPoint_mm': axis_point.round(3).tolist(), + 'tiltXY_deg': round(tilt_xy_deg, 4), + 'tiltYZ_deg': round(tilt_yz_deg, 4), + 'numMarkersUsed': len(used_ids), + 'numMarkersCommon': len(common_ids), + 'usedMarkerIds': used_ids, + 'commonMarkerIds': common_ids, + 'numPoints': len(normals), + 'residual_dist_mean_mm': round(float(dist_residuals.mean()), 3), + 'residual_dist_max_mm': round(float(dist_residuals.max()), 3), + 'residual_dist_mm': dist_residuals.round(3).tolist(), + 'residual_angle_mean_deg': round(float(angle_residuals_deg.mean()), 4), + 'residual_angle_max_deg': round(float(angle_residuals_deg.max()), 4), + 'markerResults': marker_results, + 'skipped': skipped, + } + + +# ── CLI ─────────────────────────────────────────────────────────────────────── + +def main() -> None: + parser = argparse.ArgumentParser( + description='Rotationsachse aus drei Board-Timestamps berechnen' + ) + parser.add_argument('posA', help='Timestamp A – Verzeichnis oder aruco_marker_poses.json') + parser.add_argument('posB', help='Timestamp B – Verzeichnis oder aruco_marker_poses.json') + parser.add_argument('posC', help='Timestamp C – Verzeichnis oder aruco_marker_poses.json') + parser.add_argument('--output', '-o', metavar='FILE', + help='Ergebnis zusätzlich in JSON-Datei speichern') + parser.add_argument('--pretty', action='store_true', + help='Eingerücktes JSON auf stdout') + parser.add_argument('--link', default='Board', + help='Referenz-Link der Board-Marker (Default: Board)') + parser.add_argument('--min-radius', type=float, default=0.5, + help='Min. Kreisradius mm (Default 0.5)') + parser.add_argument('--min-movement', type=float, default=10.0, + help='Min. Marker-Zentrumsbewegung mm (Default 10.0)') + args = parser.parse_args() + + try: + data_a = load_poses(args.posA) + data_b = load_poses(args.posB) + data_c = load_poses(args.posC) + except FileNotFoundError as e: + print(f'Fehler: {e}', file=sys.stderr) + sys.exit(1) + + result = compute_rotation_axis(data_a, data_b, data_c, + ref_link=args.link, + min_radius_mm=args.min_radius, + min_movement_mm=args.min_movement) + + indent = 2 if args.pretty else None + out_str = json.dumps(result, indent=indent, ensure_ascii=False) + print(out_str) + + if args.output: + with open(args.output, 'w', encoding='utf-8') as f: + f.write(out_str) + print(f'Ergebnis gespeichert: {args.output}', file=sys.stderr) + + if result['ok']: + r = result + fmt = lambda v: f'{v:+.3f}°' + print('', file=sys.stderr) + print('─── Rotationsachse ───────────────────────────────────────', file=sys.stderr) + print(f" Richtung: [{', '.join(f'{v:.4f}' for v in r['axisDir'])}]", file=sys.stderr) + print(f" Referenzpunkt: [{', '.join(f'{v:.1f}' for v in r['axisPoint_mm'])}] mm", file=sys.stderr) + print(f" Abw. von Y: XY={fmt(r['tiltXY_deg'])} YZ={fmt(r['tiltYZ_deg'])}", file=sys.stderr) + print(f" Marker: {r['numMarkersUsed']} genutzt / {r['numMarkersCommon']} gemeinsam " + f"Punkte: {r['numPoints']}", file=sys.stderr) + print(f" Residuen Abstand: ⌀{r['residual_dist_mean_mm']:.2f} mm " + f"max={r['residual_dist_max_mm']:.2f} mm", file=sys.stderr) + print(f" Residuen Winkel: ⌀{r['residual_angle_mean_deg']:.3f}° " + f"max={r['residual_angle_max_deg']:.3f}°", file=sys.stderr) + print('──────────────────────────────────────────────────────────', file=sys.stderr) + else: + print(f"Fehler: {result['error']}", file=sys.stderr) + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/server/robotActions.js b/server/robotActions.js new file mode 100644 index 0000000..aa6dc68 --- /dev/null +++ b/server/robotActions.js @@ -0,0 +1,69 @@ +/** + * robotActions.js – Roboter-Bewegungsaktionen + * + * Alle Bewegungsbefehle laufen hier durch, bevor sie ans Roboter-Backend + * weitergeleitet werden (ROBOT_URL). Solange ROBOT_URL nicht konfiguriert + * ist, werden die Aktionen nur geloggt und eine Stub-Antwort zurückgegeben. + * + * Joint-Namen: 'x-axis' | 'arm1' | 'arm2' | 'elbow' | 'hand' + * Directions: 'left' | 'right' (x-axis, linear) + * 'cw' | 'ccw' (alle Gelenke, rotatorisch) + */ + +const ROBOT_URL = process.env.ROBOT_URL || ''; + +// ── Validierung ─────────────────────────────────────────────────────────────── + +const VALID_JOINTS = new Set(['x-axis', 'arm1', 'arm2', 'elbow', 'hand']); +const VALID_DIRECTIONS = new Set(['left', 'right', 'cw', 'ccw']); + +function validateMove({ joint, direction, steps = 1 }) { + if (!joint) return '"joint" fehlt'; + if (!direction) return '"direction" fehlt'; + if (!VALID_JOINTS.has(joint)) return `Unbekanntes Joint: "${joint}"`; + if (!VALID_DIRECTIONS.has(direction)) return `Unbekannte Richtung: "${direction}"`; + if (typeof steps !== 'number' || steps < 1 || steps > 100) + return '"steps" muss eine Zahl zwischen 1 und 100 sein'; + return null; // ok +} + +// ── Ausführung ──────────────────────────────────────────────────────────────── + +/** + * Sendet einen Bewegungsbefehl. + * Gibt { ok, joint, direction, steps, message } zurück oder wirft einen Fehler. + */ +export async function executeMove({ joint, direction, steps = 1 }) { + const err = validateMove({ joint, direction, steps }); + if (err) throw Object.assign(new Error(err), { statusCode: 400 }); + + const payload = { joint, direction, steps }; + console.log(`[robotActions] move: ${JSON.stringify(payload)}`); + + if (ROBOT_URL) { + // ── Weiterleitung an das Roboter-Backend ───────────────────────────────── + const url = new URL('/api/move', ROBOT_URL).toString(); + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + }); + if (!res.ok) { + const text = await res.text().catch(() => ''); + throw Object.assign( + new Error(`Robot-Backend: ${res.status} – ${text}`), + { statusCode: 502 } + ); + } + const data = await res.json(); + return { ok: true, joint, direction, steps, ...data }; + } + + // ── Stub (ROBOT_URL nicht konfiguriert) ─────────────────────────────────── + const label = joint === 'x-axis' + ? `X-Achse ${direction === 'left' ? '⬅' : '➡'}` + : `${joint} ${direction === 'ccw' ? '↺ Rauf' : 'Runter ↻'}`; + const message = `[Stub] ${label} – ${steps} Schritt(e). ROBOT_URL nicht konfiguriert.`; + console.warn(`[robotActions] ${message}`); + return { ok: true, stub: true, joint, direction, steps, message }; +} diff --git a/server/server.js b/server/server.js index 79d93e9..a7bd4ed 100755 --- a/server/server.js +++ b/server/server.js @@ -937,6 +937,54 @@ app.post('/api/calibration/upload-npz', async (req, res) => { } }); +// ── X-Achse / Rotations-Detektion ──────────────────────────────────────────── + +const xaxisDataDir = path.join(__dirname, '..', 'data', 'xaxis'); +const ROTATION_DETECTION_FILE = path.join(xaxisDataDir, 'rotation_detection.json'); + +/** POST /api/xaxis/save-rotation-detection + * Speichert eine Achsmessung an rotation_detection.json (append-Modus). */ +app.post('/api/xaxis/save-rotation-detection', express.json(), async (req, res) => { + try { + const { axis, runs, numMarkers, markers } = req.body ?? {}; + if (!axis || !axis.dir || !axis.referencePoint) { + return res.status(400).json({ error: 'Ungültige Nutzlast: axis.dir und axis.referencePoint erwartet' }); + } + + // Verzeichnis anlegen falls nötig + await fsPromises.mkdir(xaxisDataDir, { recursive: true }); + + // Bestehende Einträge lesen oder leer beginnen + let entries = []; + try { + const raw = await fsPromises.readFile(ROTATION_DETECTION_FILE, 'utf-8'); + entries = JSON.parse(raw); + if (!Array.isArray(entries)) entries = []; + } catch { + // Datei existiert noch nicht – kein Fehler + } + + const newEntry = { + timestamp: new Date().toISOString(), + runs: runs ?? {}, + axis, + numMarkers: numMarkers ?? null, + markers: markers ?? [], + }; + + entries.push(newEntry); + await fsPromises.writeFile(ROTATION_DETECTION_FILE, JSON.stringify(entries, null, 2), 'utf-8'); + + return res.json({ + file: 'data/xaxis/rotation_detection.json', + total: entries.length, + }); + } catch (err) { + console.error('save-rotation-detection error:', err); + return res.status(500).json({ error: String(err) }); + } +}); + async function checkServiceReachability(name, url) { try { const controller = new AbortController(); diff --git a/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.csv b/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.csv new file mode 100644 index 0000000..e0c7f29 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.csv @@ -0,0 +1,20 @@ +marker_id,link,set,num_cameras,x_mm,y_mm,z_mm,nx,ny,nz,model_x_mm,model_y_mm,model_z_mm,dist_to_model_mm,delta_z_mm,edge_length_mm +0,Board,rail,2,493.98,-96.39,-8.97,-0.00886,0.04951,0.99873,494.12,-100.21,-9.76,3.908,0.794,23.35 +50,Board,A0,2,576.77,208.61,-25.71,0.06252,0.0994,0.99308,578.55,209.43,-26.11,1.995,0.397,25.08 +55,Board,A0,2,277.19,-258.42,-29.07,0.00488,-0.03269,0.99945,277.76,-258.03,-29.52,0.823,0.45,23.98 +62,Board,A0,2,399.27,-174.12,-27.58,0.01876,0.03279,0.99929,400.76,-173.44,-28.11,1.717,0.526,23.1 +79,Board,A0,2,306.77,-156.23,-28.44,-0.02974,0.00922,0.99952,308.77,-155.27,-29.18,2.337,0.74,23.06 +101,Board,A0,2,123.4,305.1,-30.43,-0.05779,0.03321,0.99778,125.05,306.96,-31.31,2.64,0.882,23.2 +197,unknown,,2,133.85,89.2,297.08,-0.99892,0.04634,-0.00288,,,,,,24.59 +201,unknown,,3,82.03,56.25,90.01,-0.99863,-0.01609,0.04969,,,,,,24.11 +204,unknown,,3,117.59,128.98,111.27,0.02638,0.04121,0.9988,,,,,,24.3 +211,Board,rail,2,321.33,-1.22,-9.18,0.05719,-0.04545,0.99733,321.45,-2.7,-10.7,2.127,1.522,22.73 +215,Board,rail,2,322.26,-90.67,-11.82,0.01124,-0.02807,0.99954,318.76,-92.52,-11.4,3.976,-0.422,24.6 +218,unknown,,2,237.95,75.51,408.78,-0.90327,0.41967,0.08937,,,,,,24.53 +219,unknown,,3,245.24,50.43,509.71,-0.91875,0.39116,0.05377,,,,,,24.43 +242,unknown,,2,187.54,55.65,288.93,0.02295,-0.99479,-0.09934,,,,,,23.94 + +camera_id,x_mm,y_mm,z_mm,dir_x,dir_y,dir_z +cam0,-718.06,-492.09,666.56,0.85634,0.40766,-0.31702 +cam1,-262.59,-550.95,834.39,0.50249,0.63431,-0.5875 +cam2,-583.76,-45.55,423.16,0.98358,-0.02341,-0.17892 diff --git a/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.json b/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.json new file mode 100644 index 0000000..f1119eb --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/aruco_marker_poses.json @@ -0,0 +1,683 @@ +{ + "schema_version": "1.1", + "stage": "corner_marker_poses", + "created_utc": "2026-06-12T19:00:31Z", + "summary": { + "num_cameras": 3, + "num_markers": 14 + }, + "cameras": [ + { + "camera_id": "cam0", + "position_m": [ + -0.7180634917282753, + -0.49208966903674867, + 0.6665606327170663 + ], + "position_mm": [ + -718.0634917282754, + -492.08966903674866, + 666.5606327170664 + ], + "direction": [ + 0.8563353419303894, + 0.40766438841819763, + -0.3170166611671448 + ] + }, + { + "camera_id": "cam1", + "position_m": [ + -0.26258841285717693, + -0.5509450542524021, + 0.8343948303300692 + ], + "position_mm": [ + -262.58841285717693, + -550.9450542524021, + 834.3948303300692 + ], + "direction": [ + 0.5024934411048889, + 0.6343097686767578, + -0.5874959230422974 + ] + }, + { + "camera_id": "cam2", + "position_m": [ + -0.5837626291434723, + -0.04555215829402515, + 0.4231631282080641 + ], + "position_mm": [ + -583.7626291434723, + -45.55215829402515, + 423.1631282080641 + ], + "direction": [ + 0.9835845232009888, + -0.023413510993123055, + -0.17892251908779144 + ] + } + ], + "markers": [ + { + "marker_id": 0, + "link": "Board", + "set": "rail", + "position_m": [ + 0.49397948741994885, + -0.09638593339821536, + -0.00896644769861376 + ], + "position_mm": [ + 493.97948741994884, + -96.38593339821536, + -8.96644769861376 + ], + "normal": [ + -0.008863367653711178, + 0.049510108714268405, + 0.9987342939185259 + ], + "corners_m": [ + [ + 0.48294592590238633, + -0.08480381756456407, + -0.009607839817976846 + ], + [ + 0.5066424602465543, + -0.08438346867471515, + -0.009478690251174529 + ], + [ + 0.5043368833035816, + -0.1083683622695555, + -0.008249155572841175 + ], + [ + 0.48199268022727293, + -0.10798808508402676, + -0.00853010515246249 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.35137293252651 + }, + { + "marker_id": 50, + "link": "Board", + "set": "A0", + "position_m": [ + 0.5767732806886829, + 0.2086133709108033, + -0.025712509060081008 + ], + "position_mm": [ + 576.7732806886829, + 208.6133709108033, + -25.712509060081008 + ], + "normal": [ + 0.06252187536281394, + 0.09939554354389576, + 0.9930818400437752 + ], + "corners_m": [ + [ + 0.5643507669245819, + 0.19626406377909925, + -0.02476468444628229 + ], + [ + 0.5645101471299887, + 0.2193255413440415, + -0.025146028191533786 + ], + [ + 0.5920522502309562, + 0.22261533365758898, + -0.028821142084045667 + ], + [ + 0.5861799584692048, + 0.19624854486248342, + -0.024118181518462293 + ] + ], + "num_cameras": 2, + "edge_length_mm": 25.075844739930425 + }, + { + "marker_id": 55, + "link": "Board", + "set": "A0", + "position_m": [ + 0.27719031988849724, + -0.258417990253453, + -0.029070069741005202 + ], + "position_mm": [ + 277.19031988849724, + -258.417990253453, + -29.070069741005202 + ], + "normal": [ + 0.00487700345450989, + -0.03269370394162277, + 0.9994535189591771 + ], + "corners_m": [ + [ + 0.2645343806546454, + -0.2699484929988187, + -0.029194956078738163 + ], + [ + 0.26579230672428167, + -0.24628474461149416, + -0.028844010837047903 + ], + [ + 0.28776760761357834, + -0.2467774779248151, + -0.02851569903501853 + ], + [ + 0.2906669845614836, + -0.2706612454786842, + -0.029725613013216204 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.980063556129757 + }, + { + "marker_id": 62, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3992713257860654, + -0.17411573697686158, + -0.027584020558572106 + ], + "position_mm": [ + 399.2713257860654, + -174.1157369768616, + -27.584020558572107 + ], + "normal": [ + 0.01876023464695634, + 0.03279209442496106, + 0.999286111251035 + ], + "corners_m": [ + [ + 0.3869459712947692, + -0.1855737663818189, + -0.027117643355740205 + ], + [ + 0.38902232597781217, + -0.16187342134192415, + -0.02765527100417573 + ], + [ + 0.41180681962930116, + -0.16288268879013573, + -0.028328541925806704 + ], + [ + 0.4093101862423789, + -0.18613307139356752, + -0.027234625948565776 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.0987748549114 + }, + { + "marker_id": 79, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3067741304225983, + -0.1562340884302455, + -0.02843974476716067 + ], + "position_mm": [ + 306.7741304225983, + -156.2340884302455, + -28.439744767160672 + ], + "normal": [ + -0.02974243725509544, + 0.009220417022036133, + 0.9995150680885538 + ], + "corners_m": [ + [ + 0.2952423978153188, + -0.16816777476909714, + -0.028256859473922556 + ], + [ + 0.2966220434877867, + -0.14376012438046695, + -0.029299995382111966 + ], + [ + 0.3175952294319708, + -0.14434994104859644, + -0.02778165176791071 + ], + [ + 0.31763685095531696, + -0.16865851352282143, + -0.02842047244469744 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.05565714285999 + }, + { + "marker_id": 101, + "link": "Board", + "set": "A0", + "position_m": [ + 0.12339811349186083, + 0.30509860635852715, + -0.030428357916216005 + ], + "position_mm": [ + 123.39811349186084, + 305.09860635852715, + -30.428357916216004 + ], + "normal": [ + -0.0577875306393219, + 0.03321241623035066, + 0.9977762959254702 + ], + "corners_m": [ + [ + 0.11127995819078222, + 0.2941539901568767, + -0.03105712020908271 + ], + [ + 0.11269990571162847, + 0.3172775128248137, + -0.03114708852651905 + ], + [ + 0.13498045929634425, + 0.31637239656451716, + -0.030431103325512222 + ], + [ + 0.13463213076868843, + 0.2925905258879012, + -0.029078119603750053 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.197130190212892 + }, + { + "marker_id": 197, + "link": "unknown", + "set": "", + "position_m": [ + 0.13385492909696134, + 0.08919550802550008, + 0.2970779702669671 + ], + "position_mm": [ + 133.85492909696134, + 89.19550802550008, + 297.0779702669671 + ], + "normal": [ + -0.9989216891364574, + 0.046337649740720244, + -0.0028777055570595083 + ], + "corners_m": [ + [ + 0.13440166542920987, + 0.0997384908806034, + 0.31041993615153585 + ], + [ + 0.13306660708725362, + 0.07488827850029012, + 0.30793984917077233 + ], + [ + 0.13351746433034806, + 0.07900788192034877, + 0.2834243232312586 + ], + [ + 0.13443397954103384, + 0.10314738080075801, + 0.28652777251430167 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.590558027936563 + }, + { + "marker_id": 201, + "link": "unknown", + "set": "", + "position_m": [ + 0.08202988082522256, + 0.05625171974699189, + 0.09001427195484893 + ], + "position_mm": [ + 82.02988082522256, + 56.25171974699189, + 90.01427195484892 + ], + "normal": [ + -0.9986349216896542, + -0.01608660078099279, + 0.04969420949377586 + ], + "corners_m": [ + [ + 0.08256527642569832, + 0.06838994843172955, + 0.10191632603441497 + ], + [ + 0.08268079655262271, + 0.04357718147943237, + 0.10181636812870559 + ], + [ + 0.08177929151157849, + 0.04445724017499826, + 0.07825634629193905 + ], + [ + 0.08109415881099068, + 0.0685825089018074, + 0.07806804736433609 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.10925872200067 + }, + { + "marker_id": 204, + "link": "unknown", + "set": "", + "position_m": [ + 0.11758749736517302, + 0.12898422867274198, + 0.11127128421538723 + ], + "position_mm": [ + 117.58749736517302, + 128.98422867274198, + 111.27128421538724 + ], + "normal": [ + 0.026383974472787525, + 0.041207800866848165, + 0.9988021841379491 + ], + "corners_m": [ + [ + 0.10535645037838809, + 0.1409265086803713, + 0.1111989209985799 + ], + [ + 0.1298675811219171, + 0.14158322510701732, + 0.11033165454610783 + ], + [ + 0.12931795573276098, + 0.11681566885905771, + 0.11156304469459387 + ], + [ + 0.1058080022276259, + 0.11661151204452154, + 0.11199151662226733 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.296585901570836 + }, + { + "marker_id": 211, + "link": "Board", + "set": "rail", + "position_m": [ + 0.3213317392761455, + -0.001218501271978103, + -0.009178107707792899 + ], + "position_mm": [ + 321.3317392761455, + -1.2185012719781032, + -9.178107707792899 + ], + "normal": [ + 0.05718886361581609, + -0.04545053534803469, + 0.9973282722929842 + ], + "corners_m": [ + [ + 0.30917590545870877, + 0.009285174127548928, + -0.007552692908546776 + ], + [ + 0.33326444823911944, + 0.010273710088338434, + -0.00976507135580152 + ], + [ + 0.3327320875965143, + -0.012339779204488, + -0.009880572791528378 + ], + [ + 0.31015451581023945, + -0.012093110099311775, + -0.00951409377529492 + ] + ], + "num_cameras": 2, + "edge_length_mm": 22.72560607161495 + }, + { + "marker_id": 215, + "link": "Board", + "set": "rail", + "position_m": [ + 0.3222566522456536, + -0.09067427418482966, + -0.011821807446382464 + ], + "position_mm": [ + 322.2566522456536, + -90.67427418482967, + -11.821807446382465 + ], + "normal": [ + 0.01123582722128988, + -0.02807398884589295, + 0.9995426991064134 + ], + "corners_m": [ + [ + 0.3101718246479266, + -0.07812135858376335, + -0.011551388012469202 + ], + [ + 0.3326391024229767, + -0.07878459384415874, + -0.011389013835539996 + ], + [ + 0.33644903504441404, + -0.1034400536271514, + -0.012521295546534639 + ], + [ + 0.3097666468672971, + -0.10235109068424515, + -0.011825532390986021 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.599939356081414 + }, + { + "marker_id": 218, + "link": "unknown", + "set": "", + "position_m": [ + 0.23794561203330558, + 0.07550948878225408, + 0.40878417607404516 + ], + "position_mm": [ + 237.9456120333056, + 75.50948878225408, + 408.78417607404515 + ], + "normal": [ + -0.9032685368357206, + 0.41966584664314727, + 0.0893673739344888 + ], + "corners_m": [ + [ + 0.23229328144894346, + 0.06741929115693258, + 0.39434440362976536 + ], + [ + 0.24412376554125356, + 0.08965763192998884, + 0.40004824703828085 + ], + [ + 0.2424848418733382, + 0.083318787858556, + 0.42303175337228793 + ], + [ + 0.23288055926968707, + 0.061642244183538905, + 0.41771230025584644 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.525478347889035 + }, + { + "marker_id": 219, + "link": "unknown", + "set": "", + "position_m": [ + 0.24523876400799488, + 0.05043006150498616, + 0.5097112365456904 + ], + "position_mm": [ + 245.2387640079949, + 50.43006150498616, + 509.7112365456904 + ], + "normal": [ + -0.9187511491717072, + 0.3911585636108862, + 0.05377084720864818 + ], + "corners_m": [ + [ + 0.24106772151097072, + 0.042671725800897176, + 0.49487695096475826 + ], + [ + 0.2505838958143419, + 0.06423818270828136, + 0.5005970135967202 + ], + [ + 0.24935210164127958, + 0.05804187148606357, + 0.5246164680990176 + ], + [ + 0.23995133706538743, + 0.03676846602470254, + 0.5187545135222654 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.425050533658705 + }, + { + "marker_id": 242, + "link": "unknown", + "set": "", + "position_m": [ + 0.18754208775859485, + 0.055648630159377044, + 0.2889321954589718 + ], + "position_mm": [ + 187.54208775859485, + 55.64863015937704, + 288.9321954589718 + ], + "normal": [ + 0.022952857088486465, + -0.994788656394326, + -0.09934130792700138 + ], + "corners_m": [ + [ + 0.17573085704771815, + 0.05477812791976055, + 0.2995206761727464 + ], + [ + 0.19904204462311584, + 0.054258468446762805, + 0.3013404462759671 + ], + [ + 0.20069544147960217, + 0.05748717951301637, + 0.2772762831672883 + ], + [ + 0.17470000788394321, + 0.05607074475796844, + 0.27759137621988533 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.937837207323692 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam0.jpg b/test/y-axis-finder-examples/20260612_190019/cam0.jpg new file mode 100644 index 0000000..1cf138d Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam0.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190019/cam0_aruco_detection.json b/test/y-axis-finder-examples/20260612_190019/cam0_aruco_detection.json new file mode 100644 index 0000000..17ee1bf --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam0_aruco_detection.json @@ -0,0 +1,2465 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:21Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam0", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam0_calibration.npz", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190019/cam0.jpg", + "image_sha256": "d8f62115c6b20a2fd3c4f50cefdb849a1fdf68e3670b46c14e17b2206f00302c", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 16, + "num_rejected_candidates": 62 + }, + "detections": [ + { + "observation_id": "89c4c9b3-40f5-46ef-bd04-c066907ee6d1", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 568.0, + 92.0 + ], + [ + 593.0, + 103.0 + ], + [ + 589.0, + 135.0 + ], + [ + 562.0, + 123.0 + ] + ], + "center_px": [ + 578.0, + 113.25 + ], + "quality": { + "area_px": 876.5, + "perimeter_px": 120.68391036987305, + "sharpness": { + "laplacian_var": 1819.7260416666666 + }, + "contrast": { + "p05": 5.0, + "p95": 145.04999999999995, + "dynamic_range": 140.04999999999995, + "mean_gray": 72.53166666666667, + "std_gray": 55.42498531548946 + }, + "geometry": { + "distance_to_center_norm": 0.4649421274662018, + "distance_to_border_px": 92.0 + }, + "edge_ratio": 1.1807209530695721, + "edge_lengths_px": [ + 27.312999725341797, + 32.24903106689453, + 29.546573638916016, + 31.575305938720703 + ] + }, + "confidence": 0.4948953703364172 + }, + { + "observation_id": "30981d4b-7769-4f0e-abda-e6eb04a0931d", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 415.0, + 513.0 + ], + [ + 443.0, + 520.0 + ], + [ + 442.0, + 549.0 + ], + [ + 415.0, + 542.0 + ] + ], + "center_px": [ + 428.75, + 531.0 + ], + "quality": { + "area_px": 801.0, + "perimeter_px": 114.77162742614746, + "sharpness": { + "laplacian_var": 2228.9781609946217 + }, + "contrast": { + "p05": 11.0, + "p95": 145.0, + "dynamic_range": 134.0, + "mean_gray": 76.11640211640211, + "std_gray": 53.3343967728025 + }, + "geometry": { + "distance_to_center_norm": 0.2716487944126129, + "distance_to_border_px": 411.0 + }, + "edge_ratio": 1.040318366343262, + "edge_lengths_px": [ + 28.861740112304688, + 29.017236709594727, + 27.892650604248047, + 29.0 + ] + }, + "confidence": 0.5133044049553981 + }, + { + "observation_id": "6db2c8c3-22ed-4121-aac6-e6082013963d", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 442.0, + 797.0 + ], + [ + 470.0, + 802.0 + ], + [ + 472.0, + 830.0 + ], + [ + 444.0, + 825.0 + ] + ], + "center_px": [ + 457.0, + 813.5 + ], + "quality": { + "area_px": 774.0, + "perimeter_px": 113.02852249145508, + "sharpness": { + "laplacian_var": 2729.036226744694 + }, + "contrast": { + "p05": 5.0, + "p95": 144.0, + "dynamic_range": 139.0, + "mean_gray": 54.33271028037383, + "std_gray": 50.88779626336977 + }, + "geometry": { + "distance_to_center_norm": 0.47551167011260986, + "distance_to_border_px": 130.0 + }, + "edge_ratio": 1.0132372660645024, + "edge_lengths_px": [ + 28.44292449951172, + 28.07133674621582, + 28.44292449951172, + 28.07133674621582 + ] + }, + "confidence": 0.5092588056933465 + }, + { + "observation_id": "6083549c-950d-4d3c-9b9b-8bcdb28b43fa", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 518.0, + 242.0 + ], + [ + 500.0, + 233.0 + ], + [ + 502.0, + 200.0 + ], + [ + 521.0, + 211.0 + ] + ], + "center_px": [ + 510.25, + 221.5 + ], + "quality": { + "area_px": 617.0, + "perimeter_px": 106.28448295593262, + "sharpness": { + "laplacian_var": 3088.1772889563754 + }, + "contrast": { + "p05": 5.0, + "p95": 153.39999999999998, + "dynamic_range": 148.39999999999998, + "mean_gray": 65.26634382566586, + "std_gray": 55.45520850700056 + }, + "geometry": { + "distance_to_center_norm": 0.3615446984767914, + "distance_to_border_px": 200.0 + }, + "edge_ratio": 1.6427920446528188, + "edge_lengths_px": [ + 20.124610900878906, + 33.060550689697266, + 21.954498291015625, + 31.14482307434082 + ] + }, + "confidence": 0.2503867331669864 + }, + { + "observation_id": "a6d5e359-b1d5-4796-b4c0-30e44ce21944", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 504.0, + 375.0 + ], + [ + 486.0, + 363.0 + ], + [ + 489.0, + 336.0 + ], + [ + 507.0, + 345.0 + ] + ], + "center_px": [ + 496.5, + 354.75 + ], + "quality": { + "area_px": 544.5, + "perimeter_px": 99.07370185852051, + "sharpness": { + "laplacian_var": 2525.5663157894737 + }, + "contrast": { + "p05": 5.0, + "p95": 149.0, + "dynamic_range": 144.0, + "mean_gray": 58.91315789473684, + "std_gray": 53.0953991021555 + }, + "geometry": { + "distance_to_center_norm": 0.23809076845645905, + "distance_to_border_px": 336.0 + }, + "edge_ratio": 1.4981471112184408, + "edge_lengths_px": [ + 21.63330841064453, + 27.166154861450195, + 20.124610900878906, + 30.149627685546875 + ] + }, + "confidence": 0.2422993024395132 + }, + { + "observation_id": "cc2950b8-77f4-4452-88ff-22f48a705f6d", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 377.0, + 758.0 + ], + [ + 394.0, + 744.0 + ], + [ + 420.0, + 747.0 + ], + [ + 404.0, + 761.0 + ] + ], + "center_px": [ + 398.75, + 752.5 + ], + "quality": { + "area_px": 420.5, + "perimeter_px": 96.62166595458984, + "sharpness": { + "laplacian_var": 4822.268680462241 + }, + "contrast": { + "p05": 17.400000000000002, + "p95": 208.0, + "dynamic_range": 190.6, + "mean_gray": 84.11475409836065, + "std_gray": 64.84627429940214 + }, + "geometry": { + "distance_to_center_norm": 0.45493441820144653, + "distance_to_border_px": 199.0 + }, + "edge_ratio": 1.2777884138864557, + "edge_lengths_px": [ + 22.022714614868164, + 26.172504425048828, + 21.260292053222656, + 27.166154861450195 + ] + }, + "confidence": 0.2193894781693049 + }, + { + "observation_id": "ccf1bf73-79e6-42b0-acac-ed5b67a335ae", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 943.0, + 895.0 + ], + [ + 914.0, + 888.0 + ], + [ + 921.0, + 873.0 + ], + [ + 951.0, + 878.0 + ] + ], + "center_px": [ + 932.25, + 883.5 + ], + "quality": { + "area_px": 517.0, + "perimeter_px": 95.58792114257812, + "sharpness": { + "laplacian_var": 4503.673289547757 + }, + "contrast": { + "p05": 15.0, + "p95": 209.8, + "dynamic_range": 194.8, + "mean_gray": 95.92602739726027, + "std_gray": 70.15206580189368 + }, + "geometry": { + "distance_to_center_norm": 0.6227739453315735, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 1.837365534248905, + "edge_lengths_px": [ + 29.832868576049805, + 16.552946090698242, + 30.4138126373291, + 18.788293838500977 + ] + }, + "confidence": 0.18758742353767002 + }, + { + "observation_id": "8c4cd7f5-3580-427f-9fd5-f7e61e0f61dd", + "type": "aruco", + "marker_id": 52, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 325.0, + 911.0 + ], + [ + 301.0, + 906.0 + ], + [ + 318.0, + 890.0 + ], + [ + 341.0, + 895.0 + ] + ], + "center_px": [ + 321.25, + 900.5 + ], + "quality": { + "area_px": 458.5, + "perimeter_px": 94.0251579284668, + "sharpness": { + "laplacian_var": 3050.661372474967 + }, + "contrast": { + "p05": 4.0, + "p95": 158.0, + "dynamic_range": 154.0, + "mean_gray": 64.38977635782747, + "std_gray": 54.94017795987818 + }, + "geometry": { + "distance_to_center_norm": 0.6595711708068848, + "distance_to_border_px": 49.0 + }, + "edge_ratio": 1.083433481271584, + "edge_lengths_px": [ + 24.515300750732422, + 23.34523582458496, + 23.53720474243164, + 22.627416610717773 + ] + }, + "confidence": 0.276485209762725 + }, + { + "observation_id": "d0be565d-09ba-4ec8-b6cb-58dc57ac6f7d", + "type": "aruco", + "marker_id": 242, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 491.0, + 511.0 + ], + [ + 506.0, + 499.0 + ], + [ + 507.0, + 527.0 + ], + [ + 492.0, + 538.0 + ] + ], + "center_px": [ + 499.0, + 518.75 + ], + "quality": { + "area_px": 424.0, + "perimeter_px": 92.8468132019043, + "sharpness": { + "laplacian_var": 5277.83968915238 + }, + "contrast": { + "p05": 35.0, + "p95": 236.0, + "dynamic_range": 201.0, + "mean_gray": 116.03481012658227, + "std_gray": 68.23884471102653 + }, + "geometry": { + "distance_to_center_norm": 0.18278473615646362, + "distance_to_border_px": 422.0 + }, + "edge_ratio": 1.5062489226923519, + "edge_lengths_px": [ + 19.209373474121094, + 28.017850875854492, + 18.601076126098633, + 27.018512725830078 + ] + }, + "confidence": 0.1876626515100922 + }, + { + "observation_id": "184591bd-43e8-4dcd-931c-013514af2db6", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 255.0, + 877.0 + ], + [ + 235.0, + 872.0 + ], + [ + 252.0, + 857.0 + ], + [ + 273.0, + 860.0 + ] + ], + "center_px": [ + 253.75, + 866.5 + ], + "quality": { + "area_px": 398.0, + "perimeter_px": 89.25913619995117, + "sharpness": { + "laplacian_var": 4680.485376780099 + }, + "contrast": { + "p05": 5.0, + "p95": 177.7, + "dynamic_range": 172.7, + "mean_gray": 86.97560975609755, + "std_gray": 62.25704917249552 + }, + "geometry": { + "distance_to_center_norm": 0.6830210089683533, + "distance_to_border_px": 83.0 + }, + "edge_ratio": 1.2009799903298097, + "edge_lengths_px": [ + 20.615528106689453, + 22.671567916870117, + 21.21320343017578, + 24.75883674621582 + ] + }, + "confidence": 0.22093068616444492 + }, + { + "observation_id": "46428742-fdd8-46d4-949d-7e1ca2f8888a", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 831.0, + 850.0 + ], + [ + 804.0, + 845.0 + ], + [ + 812.0, + 831.0 + ], + [ + 839.0, + 836.0 + ] + ], + "center_px": [ + 821.5, + 840.5 + ], + "quality": { + "area_px": 418.0, + "perimeter_px": 87.16715240478516, + "sharpness": { + "laplacian_var": 4277.08720355503 + }, + "contrast": { + "p05": 23.0, + "p95": 211.0, + "dynamic_range": 188.0, + "mean_gray": 111.7872340425532, + "std_gray": 68.81500477819525 + }, + "geometry": { + "distance_to_center_norm": 0.504514753818512, + "distance_to_border_px": 110.0 + }, + "edge_ratio": 1.702938647178991, + "edge_lengths_px": [ + 27.459060668945312, + 16.124515533447266, + 27.459060668945312, + 16.124515533447266 + ] + }, + "confidence": 0.16363870015416757 + }, + { + "observation_id": "3b263c3d-7170-42bd-b7f5-ecea0d660f06", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1058.0, + 769.0 + ], + [ + 1031.0, + 763.0 + ], + [ + 1035.0, + 754.0 + ], + [ + 1062.0, + 758.0 + ] + ], + "center_px": [ + 1046.5, + 761.0 + ], + "quality": { + "area_px": 290.0, + "perimeter_px": 76.50687885284424, + "sharpness": { + "laplacian_var": 8831.233310657595 + }, + "contrast": { + "p05": 21.450000000000003, + "p95": 220.54999999999998, + "dynamic_range": 199.09999999999997, + "mean_gray": 144.71904761904761, + "std_gray": 70.18568650066166 + }, + "geometry": { + "distance_to_center_norm": 0.6177115440368652, + "distance_to_border_px": 191.0 + }, + "edge_ratio": 2.8083087931415798, + "edge_lengths_px": [ + 27.658634185791016, + 9.848857879638672, + 27.294687271118164, + 11.704699516296387 + ] + }, + "confidence": 0.0688433315472607 + }, + { + "observation_id": "f6ce8386-4bad-4c70-ac9a-a331a607636d", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 879.0, + 797.0 + ], + [ + 854.0, + 792.0 + ], + [ + 862.0, + 781.0 + ], + [ + 886.0, + 785.0 + ] + ], + "center_px": [ + 870.25, + 788.75 + ], + "quality": { + "area_px": 315.5, + "perimeter_px": 77.32006359100342, + "sharpness": { + "laplacian_var": 2855.8337161067493 + }, + "contrast": { + "p05": 25.8, + "p95": 155.39999999999998, + "dynamic_range": 129.59999999999997, + "mean_gray": 63.91561181434599, + "std_gray": 38.73682229921387 + }, + "geometry": { + "distance_to_center_norm": 0.4814392924308777, + "distance_to_border_px": 163.0 + }, + "edge_ratio": 1.8744368320794806, + "edge_lengths_px": [ + 25.495098114013672, + 13.601470947265625, + 24.331050872802734, + 13.892443656921387 + ] + }, + "confidence": 0.11221148119458993 + }, + { + "observation_id": "b9c6e413-3716-461f-bd2e-528020638235", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 644.0, + 786.0 + ], + [ + 654.0, + 775.0 + ], + [ + 676.0, + 779.0 + ], + [ + 666.0, + 791.0 + ] + ], + "center_px": [ + 660.0, + 782.75 + ], + "quality": { + "area_px": 298.0, + "perimeter_px": 75.40827560424805, + "sharpness": { + "laplacian_var": 6318.7319756206325 + }, + "contrast": { + "p05": 37.0, + "p95": 217.0, + "dynamic_range": 180.0, + "mean_gray": 116.03225806451613, + "std_gray": 66.9363400089604 + }, + "geometry": { + "distance_to_center_norm": 0.37926235795021057, + "distance_to_border_px": 169.0 + }, + "edge_ratio": 1.5176189327275247, + "edge_lengths_px": [ + 14.866068840026855, + 22.360679626464844, + 15.620499610900879, + 22.56102752685547 + ] + }, + "confidence": 0.1309068188215174 + }, + { + "observation_id": "84d91dab-4f7e-4df1-a817-9e7bc5f3257d", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 541.0, + 717.0 + ], + [ + 520.0, + 714.0 + ], + [ + 534.0, + 704.0 + ], + [ + 553.0, + 707.0 + ] + ], + "center_px": [ + 537.0, + 710.5 + ], + "quality": { + "area_px": 239.0, + "perimeter_px": 73.27373790740967, + "sharpness": { + "laplacian_var": 8208.590563265307 + }, + "contrast": { + "p05": 27.700000000000003, + "p95": 186.59999999999997, + "dynamic_range": 158.89999999999998, + "mean_gray": 93.98857142857143, + "std_gray": 51.469157318748096 + }, + "geometry": { + "distance_to_center_norm": 0.31558293104171753, + "distance_to_border_px": 243.0 + }, + "edge_ratio": 1.3580361677658501, + "edge_lengths_px": [ + 21.21320343017578, + 17.20465087890625, + 19.235383987426758, + 15.620499610900879 + ] + }, + "confidence": 0.11732628122523263 + }, + { + "observation_id": "13ddf97f-22de-4c58-b784-8750a57aaa44", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 586.0, + 660.0 + ], + [ + 568.0, + 658.0 + ], + [ + 576.0, + 650.0 + ], + [ + 594.0, + 651.0 + ] + ], + "center_px": [ + 581.0, + 654.75 + ], + "quality": { + "area_px": 165.0, + "perimeter_px": 59.49382972717285, + "sharpness": { + "laplacian_var": 8187.576481557019 + }, + "contrast": { + "p05": 55.0, + "p95": 180.5, + "dynamic_range": 125.5, + "mean_gray": 105.6793893129771, + "std_gray": 40.974813931564086 + }, + "geometry": { + "distance_to_center_norm": 0.23055152595043182, + "distance_to_border_px": 300.0 + }, + "edge_ratio": 1.6007811665624094, + "edge_lengths_px": [ + 18.11077117919922, + 11.313708305358887, + 18.027755737304688, + 12.041594505310059 + ] + }, + "confidence": 0.06871645062905071 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 385.0, + 213.0 + ], + [ + 453.0, + 207.0 + ], + [ + 466.0, + 349.0 + ], + [ + 411.0, + 344.0 + ] + ], + "center_px": [ + 428.75, + 278.25 + ], + "area_px": 8404.5 + }, + { + "image_points_px": [ + [ + 490.0, + 799.0 + ], + [ + 571.0, + 813.0 + ], + [ + 574.0, + 861.0 + ], + [ + 500.0, + 864.0 + ] + ], + "center_px": [ + 533.75, + 834.25 + ], + "area_px": 4343.0 + }, + { + "image_points_px": [ + [ + 494.0, + 176.0 + ], + [ + 491.0, + 195.0 + ], + [ + 380.0, + 211.0 + ], + [ + 390.0, + 187.0 + ] + ], + "center_px": [ + 438.75, + 192.25 + ], + "area_px": 2223.5 + }, + { + "image_points_px": [ + [ + 617.0, + 207.0 + ], + [ + 709.0, + 205.0 + ], + [ + 703.0, + 226.0 + ], + [ + 620.0, + 221.0 + ] + ], + "center_px": [ + 662.25, + 214.75 + ], + "area_px": 1533.5 + }, + { + "image_points_px": [ + [ + 363.0, + 63.0 + ], + [ + 377.0, + 64.0 + ], + [ + 385.0, + 133.0 + ], + [ + 372.0, + 131.0 + ] + ], + "center_px": [ + 374.25, + 97.75 + ], + "area_px": 912.0 + }, + { + "image_points_px": [ + [ + 485.0, + 53.0 + ], + [ + 494.0, + 53.0 + ], + [ + 502.0, + 114.0 + ], + [ + 493.0, + 120.0 + ] + ], + "center_px": [ + 493.5, + 85.0 + ], + "area_px": 600.0 + }, + { + "image_points_px": [ + [ + 575.0, + 291.0 + ], + [ + 578.0, + 319.0 + ], + [ + 574.0, + 344.0 + ], + [ + 565.0, + 327.0 + ] + ], + "center_px": [ + 573.0, + 320.25 + ], + "area_px": 340.5 + }, + { + "image_points_px": [ + [ + 382.0, + 11.0 + ], + [ + 391.0, + 13.0 + ], + [ + 392.0, + 56.0 + ], + [ + 386.0, + 53.0 + ] + ], + "center_px": [ + 387.75, + 33.25 + ], + "area_px": 312.5 + }, + { + "image_points_px": [ + [ + 338.0, + 225.0 + ], + [ + 345.0, + 270.0 + ], + [ + 336.0, + 268.0 + ], + [ + 333.0, + 234.0 + ] + ], + "center_px": [ + 338.0, + 249.25 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 303.0, + 91.0 + ], + [ + 307.0, + 110.0 + ], + [ + 275.0, + 111.0 + ], + [ + 275.0, + 92.0 + ] + ], + "center_px": [ + 290.0, + 101.0 + ], + "area_px": 572.0 + }, + { + "image_points_px": [ + [ + 1048.0, + 883.0 + ], + [ + 1078.0, + 889.0 + ], + [ + 1074.0, + 905.0 + ], + [ + 1043.0, + 900.0 + ] + ], + "center_px": [ + 1060.75, + 894.25 + ], + "area_px": 528.0 + }, + { + "image_points_px": [ + [ + 179.0, + 901.0 + ], + [ + 161.0, + 916.0 + ], + [ + 139.0, + 911.0 + ], + [ + 157.0, + 896.0 + ] + ], + "center_px": [ + 159.0, + 906.0 + ], + "area_px": 420.0 + }, + { + "image_points_px": [ + [ + 1019.0, + 852.0 + ], + [ + 1049.0, + 856.0 + ], + [ + 1045.0, + 871.0 + ], + [ + 1015.0, + 866.0 + ] + ], + "center_px": [ + 1032.0, + 861.25 + ], + "area_px": 453.0 + }, + { + "image_points_px": [ + [ + 961.0, + 853.0 + ], + [ + 967.0, + 840.0 + ], + [ + 996.0, + 844.0 + ], + [ + 989.0, + 860.0 + ] + ], + "center_px": [ + 978.25, + 849.25 + ], + "area_px": 449.0 + }, + { + "image_points_px": [ + [ + 439.0, + 470.0 + ], + [ + 452.0, + 462.0 + ], + [ + 481.0, + 466.0 + ], + [ + 466.0, + 475.0 + ] + ], + "center_px": [ + 459.5, + 468.25 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 867.0, + 575.0 + ], + [ + 844.0, + 607.0 + ], + [ + 839.0, + 609.0 + ], + [ + 859.0, + 580.0 + ] + ], + "center_px": [ + 852.25, + 592.75 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 399.0, + 64.0 + ], + [ + 404.0, + 77.0 + ], + [ + 404.0, + 103.0 + ], + [ + 399.0, + 100.0 + ] + ], + "center_px": [ + 401.5, + 86.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 126.0, + 44.0 + ], + [ + 131.0, + 48.0 + ], + [ + 134.0, + 82.0 + ], + [ + 128.0, + 77.0 + ] + ], + "center_px": [ + 129.75, + 62.75 + ], + "area_px": 173.0 + }, + { + "image_points_px": [ + [ + 736.0, + 804.0 + ], + [ + 744.0, + 791.0 + ], + [ + 768.0, + 794.0 + ], + [ + 760.0, + 809.0 + ] + ], + "center_px": [ + 752.0, + 799.5 + ], + "area_px": 368.0 + }, + { + "image_points_px": [ + [ + 855.0, + 815.0 + ], + [ + 862.0, + 803.0 + ], + [ + 887.0, + 806.0 + ], + [ + 879.0, + 821.0 + ] + ], + "center_px": [ + 870.75, + 811.25 + ], + "area_px": 364.5 + }, + { + "image_points_px": [ + [ + 315.0, + 793.0 + ], + [ + 301.0, + 806.0 + ], + [ + 280.0, + 802.0 + ], + [ + 296.0, + 790.0 + ] + ], + "center_px": [ + 298.0, + 797.75 + ], + "area_px": 302.5 + }, + { + "image_points_px": [ + [ + 600.0, + 828.0 + ], + [ + 605.0, + 847.0 + ], + [ + 603.0, + 867.0 + ], + [ + 598.0, + 841.0 + ] + ], + "center_px": [ + 601.5, + 845.75 + ], + "area_px": 127.5 + }, + { + "image_points_px": [ + [ + 344.0, + 800.0 + ], + [ + 330.0, + 814.0 + ], + [ + 310.0, + 810.0 + ], + [ + 325.0, + 797.0 + ] + ], + "center_px": [ + 327.25, + 805.25 + ], + "area_px": 314.0 + }, + { + "image_points_px": [ + [ + 560.0, + 469.0 + ], + [ + 558.0, + 491.0 + ], + [ + 545.0, + 503.0 + ], + [ + 548.0, + 480.0 + ] + ], + "center_px": [ + 552.75, + 485.75 + ], + "area_px": 252.5 + }, + { + "image_points_px": [ + [ + 984.0, + 746.0 + ], + [ + 989.0, + 736.0 + ], + [ + 1014.0, + 739.0 + ], + [ + 1009.0, + 750.0 + ] + ], + "center_px": [ + 999.0, + 742.75 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 554.0, + 62.0 + ], + [ + 550.0, + 83.0 + ], + [ + 539.0, + 93.0 + ], + [ + 543.0, + 71.0 + ] + ], + "center_px": [ + 546.5, + 77.25 + ], + "area_px": 198.5 + }, + { + "image_points_px": [ + [ + 771.0, + 633.0 + ], + [ + 778.0, + 623.0 + ], + [ + 801.0, + 626.0 + ], + [ + 795.0, + 635.0 + ] + ], + "center_px": [ + 786.25, + 629.25 + ], + "area_px": 239.5 + }, + { + "image_points_px": [ + [ + 802.0, + 713.0 + ], + [ + 810.0, + 703.0 + ], + [ + 831.0, + 705.0 + ], + [ + 826.0, + 716.0 + ] + ], + "center_px": [ + 817.25, + 709.25 + ], + "area_px": 252.5 + }, + { + "image_points_px": [ + [ + 1073.0, + 679.0 + ], + [ + 1078.0, + 669.0 + ], + [ + 1101.0, + 672.0 + ], + [ + 1097.0, + 682.0 + ] + ], + "center_px": [ + 1087.25, + 675.5 + ], + "area_px": 248.5 + }, + { + "image_points_px": [ + [ + 1019.0, + 699.0 + ], + [ + 1024.0, + 690.0 + ], + [ + 1047.0, + 693.0 + ], + [ + 1044.0, + 703.0 + ] + ], + "center_px": [ + 1033.5, + 696.25 + ], + "area_px": 242.0 + }, + { + "image_points_px": [ + [ + 969.0, + 682.0 + ], + [ + 974.0, + 672.0 + ], + [ + 997.0, + 675.0 + ], + [ + 991.0, + 685.0 + ] + ], + "center_px": [ + 982.75, + 678.5 + ], + "area_px": 241.5 + }, + { + "image_points_px": [ + [ + 529.0, + 692.0 + ], + [ + 538.0, + 683.0 + ], + [ + 559.0, + 686.0 + ], + [ + 548.0, + 695.0 + ] + ], + "center_px": [ + 543.5, + 689.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 931.0, + 679.0 + ], + [ + 936.0, + 670.0 + ], + [ + 959.0, + 672.0 + ], + [ + 955.0, + 681.0 + ] + ], + "center_px": [ + 945.25, + 675.5 + ], + "area_px": 220.5 + }, + { + "image_points_px": [ + [ + 570.0, + 693.0 + ], + [ + 579.0, + 684.0 + ], + [ + 599.0, + 686.0 + ], + [ + 590.0, + 695.0 + ] + ], + "center_px": [ + 584.5, + 689.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 1048.0, + 649.0 + ], + [ + 1051.0, + 640.0 + ], + [ + 1074.0, + 643.0 + ], + [ + 1071.0, + 651.0 + ] + ], + "center_px": [ + 1061.0, + 645.75 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 1117.0, + 628.0 + ], + [ + 1120.0, + 619.0 + ], + [ + 1142.0, + 621.0 + ], + [ + 1139.0, + 631.0 + ] + ], + "center_px": [ + 1129.5, + 624.75 + ], + "area_px": 216.5 + }, + { + "image_points_px": [ + [ + 573.0, + 675.0 + ], + [ + 583.0, + 666.0 + ], + [ + 601.0, + 669.0 + ], + [ + 591.0, + 678.0 + ] + ], + "center_px": [ + 587.0, + 672.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 726.0, + 688.0 + ], + [ + 733.0, + 679.0 + ], + [ + 752.0, + 681.0 + ], + [ + 746.0, + 691.0 + ] + ], + "center_px": [ + 739.25, + 684.75 + ], + "area_px": 201.5 + }, + { + "image_points_px": [ + [ + 1069.0, + 629.0 + ], + [ + 1072.0, + 622.0 + ], + [ + 1095.0, + 625.0 + ], + [ + 1092.0, + 632.0 + ] + ], + "center_px": [ + 1082.0, + 627.0 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 600.0, + 662.0 + ], + [ + 609.0, + 654.0 + ], + [ + 627.0, + 656.0 + ], + [ + 619.0, + 665.0 + ] + ], + "center_px": [ + 613.75, + 659.25 + ], + "area_px": 178.5 + }, + { + "image_points_px": [ + [ + 837.0, + 660.0 + ], + [ + 841.0, + 652.0 + ], + [ + 862.0, + 653.0 + ], + [ + 858.0, + 662.0 + ] + ], + "center_px": [ + 849.5, + 656.75 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 558.0, + 398.0 + ], + [ + 556.0, + 423.0 + ], + [ + 551.0, + 425.0 + ], + [ + 554.0, + 400.0 + ] + ], + "center_px": [ + 554.75, + 411.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 1008.0, + 632.0 + ], + [ + 1013.0, + 624.0 + ], + [ + 1033.0, + 627.0 + ], + [ + 1029.0, + 635.0 + ] + ], + "center_px": [ + 1020.75, + 629.5 + ], + "area_px": 177.5 + }, + { + "image_points_px": [ + [ + 1114.0, + 611.0 + ], + [ + 1117.0, + 605.0 + ], + [ + 1139.0, + 607.0 + ], + [ + 1136.0, + 615.0 + ] + ], + "center_px": [ + 1126.5, + 609.5 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 518.0, + 622.0 + ], + [ + 526.0, + 615.0 + ], + [ + 545.0, + 617.0 + ], + [ + 535.0, + 624.0 + ] + ], + "center_px": [ + 531.0, + 619.5 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 1113.0, + 578.0 + ], + [ + 1116.0, + 571.0 + ], + [ + 1137.0, + 573.0 + ], + [ + 1133.0, + 581.0 + ] + ], + "center_px": [ + 1124.75, + 575.75 + ], + "area_px": 162.5 + }, + { + "image_points_px": [ + [ + 542.0, + 595.0 + ], + [ + 551.0, + 587.0 + ], + [ + 567.0, + 590.0 + ], + [ + 559.0, + 597.0 + ] + ], + "center_px": [ + 554.75, + 592.25 + ], + "area_px": 145.0 + }, + { + "image_points_px": [ + [ + 1045.0, + 577.0 + ], + [ + 1049.0, + 569.0 + ], + [ + 1068.0, + 572.0 + ], + [ + 1065.0, + 579.0 + ] + ], + "center_px": [ + 1056.75, + 574.25 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 646.0, + 623.0 + ], + [ + 654.0, + 615.0 + ], + [ + 670.0, + 617.0 + ], + [ + 664.0, + 625.0 + ] + ], + "center_px": [ + 658.5, + 620.0 + ], + "area_px": 150.0 + }, + { + "image_points_px": [ + [ + 567.0, + 396.0 + ], + [ + 564.0, + 417.0 + ], + [ + 561.0, + 422.0 + ], + [ + 564.0, + 397.0 + ] + ], + "center_px": [ + 564.0, + 408.0 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 168.0, + 113.0 + ], + [ + 177.0, + 128.0 + ], + [ + 179.0, + 136.0 + ], + [ + 172.0, + 135.0 + ] + ], + "center_px": [ + 174.0, + 128.0 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 566.0, + 582.0 + ], + [ + 574.0, + 576.0 + ], + [ + 591.0, + 578.0 + ], + [ + 581.0, + 585.0 + ] + ], + "center_px": [ + 578.0, + 580.25 + ], + "area_px": 126.5 + }, + { + "image_points_px": [ + [ + 640.0, + 571.0 + ], + [ + 648.0, + 565.0 + ], + [ + 665.0, + 567.0 + ], + [ + 658.0, + 573.0 + ] + ], + "center_px": [ + 652.75, + 569.0 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 681.0, + 584.0 + ], + [ + 688.0, + 577.0 + ], + [ + 705.0, + 579.0 + ], + [ + 699.0, + 585.0 + ] + ], + "center_px": [ + 693.25, + 581.25 + ], + "area_px": 123.5 + }, + { + "image_points_px": [ + [ + 702.0, + 562.0 + ], + [ + 708.0, + 556.0 + ], + [ + 726.0, + 557.0 + ], + [ + 720.0, + 563.0 + ] + ], + "center_px": [ + 714.0, + 559.5 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 741.0, + 547.0 + ], + [ + 749.0, + 541.0 + ], + [ + 763.0, + 543.0 + ], + [ + 757.0, + 549.0 + ] + ], + "center_px": [ + 752.5, + 545.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 750.0, + 528.0 + ], + [ + 756.0, + 521.0 + ], + [ + 771.0, + 523.0 + ], + [ + 767.0, + 528.0 + ] + ], + "center_px": [ + 761.0, + 525.0 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 424.0, + 305.0 + ], + [ + 427.0, + 308.0 + ], + [ + 428.0, + 327.0 + ], + [ + 424.0, + 320.0 + ] + ], + "center_px": [ + 425.75, + 315.0 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 146.0, + 48.0 + ], + [ + 149.0, + 64.0 + ], + [ + 148.0, + 69.0 + ], + [ + 145.0, + 54.0 + ] + ], + "center_px": [ + 147.0, + 58.75 + ], + "area_px": 32.0 + }, + { + "image_points_px": [ + [ + 501.0, + 343.0 + ], + [ + 506.0, + 345.0 + ], + [ + 505.0, + 362.0 + ], + [ + 502.0, + 355.0 + ] + ], + "center_px": [ + 503.5, + 351.25 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 530.0, + 709.0 + ], + [ + 534.0, + 705.0 + ], + [ + 549.0, + 708.0 + ], + [ + 547.0, + 710.0 + ] + ], + "center_px": [ + 540.0, + 708.0 + ], + "area_px": 54.0 + }, + { + "image_points_px": [ + [ + 532.0, + 911.0 + ], + [ + 547.0, + 911.0 + ], + [ + 550.0, + 913.0 + ], + [ + 550.0, + 915.0 + ] + ], + "center_px": [ + 544.75, + 912.5 + ], + "area_px": 33.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam0_camera_pose.json b/test/y-axis-finder-examples/20260612_190019/cam0_camera_pose.json new file mode 100644 index 0000000..9ac9f38 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam0_camera_pose.json @@ -0,0 +1,327 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:22Z", + "source": { + "detection_json": "/app/data/board/20260612_190019/cam0_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam0", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 9, + "used_marker_ids": [ + 55, + 52, + 101, + 79, + 85, + 62, + 211, + 72, + 50 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.009867545134691569, + 0.0009572110530993923, + 0.0007906194507444952, + 0.000790612586474178 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 1.6069333342094732, + "residual_median_px": 0.7798148754478401, + "residual_max_px": 4.234883802186747, + "sigma2_normalized": 9.376023926813464e-07 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.4078372120857239, + -0.9104359149932861, + -0.06910330057144165 + ], + [ + -0.3167943060398102, + -0.0701155960559845, + -0.9458991289138794 + ], + [ + 0.8563353419303894, + 0.40766438841819763, + -0.3170166611671448 + ] + ], + "translation_m": [ + -0.10910157114267349, + 0.36851754784584045, + 1.0268213748931885 + ], + "rvec_rad": [ + 1.6164154189661377, + -1.1051518584730555, + 0.7089223550127144 + ] + }, + "camera_in_world": { + "position_m": [ + -0.7180635333061218, + -0.4920896589756012, + 0.6665606498718262 + ], + "position_mm": [ + -718.0635375976562, + -492.08966064453125, + 666.5606689453125 + ], + "orientation_deg": { + "roll": 127.87010955810547, + "pitch": -58.907569885253906, + "yaw": -37.838863372802734 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 1.0712935529781991e-05, + -5.117936945274433e-06, + -4.336407987592733e-06, + -6.153727842763172e-08, + 3.4214711722436857e-06, + 2.375676651524977e-06 + ], + [ + -5.117936945274421e-06, + 1.044079149217191e-05, + -3.4545066247116983e-06, + -2.7204528022669726e-06, + -2.760889344201066e-06, + -1.3862288475645067e-06 + ], + [ + -4.3364079875928e-06, + -3.454506624711639e-06, + 2.5279083310954225e-05, + 5.406549604636585e-06, + -3.0238066145519227e-06, + -2.0158589163870086e-06 + ], + [ + -6.15372784276484e-08, + -2.720452802266963e-06, + 5.406549604636597e-06, + 1.7433224009696393e-06, + -2.8278155420413365e-08, + -8.996611115884647e-09 + ], + [ + 3.4214711722436874e-06, + -2.7608893442010793e-06, + -3.0238066145518926e-06, + -2.8278155420404895e-08, + 1.985242773096834e-06, + 2.070349501630324e-06 + ], + [ + 2.375676651524967e-06, + -1.3862288475645192e-06, + -2.0158589163869836e-06, + -8.996611115876812e-09, + 2.0703495016303227e-06, + 5.507393168818372e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.1875326445833758, + 0.18513534673219628, + 0.2880734892621611 + ], + "tvec_std_m": [ + 0.0013203493480778636, + 0.0014089864346745267, + 0.0023467835794589945 + ] + }, + "camera_center_std_m": [ + 0.0036409894894807848, + 0.005297032735242445, + 0.0049939490377814266 + ], + "camera_center_std_mm": [ + 3.6409894894807846, + 5.297032735242445, + 4.993949037781427 + ], + "orientation_std_deg": { + "roll": 0.4343691773488056, + "pitch": 0.21526807249043164, + "yaw": 0.3569335793648647 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 55, + "observed_center_px": [ + 932.25, + 883.5 + ], + "projected_center_px": [ + 931.89697265625, + 883.3240966796875 + ], + "reprojection_error_px": 0.39442398954949814, + "confidence": 0.18758742353767002 + }, + { + "marker_id": 52, + "observed_center_px": [ + 321.25, + 900.5 + ], + "projected_center_px": [ + 320.1341857910156, + 900.7659301757812 + ], + "reprojection_error_px": 1.1470659123879818, + "confidence": 0.276485209762725 + }, + { + "marker_id": 101, + "observed_center_px": [ + 253.75, + 866.5 + ], + "projected_center_px": [ + 253.0921173095703, + 865.616943359375 + ], + "reprojection_error_px": 1.1011805777977173, + "confidence": 0.22093068616444492 + }, + { + "marker_id": 79, + "observed_center_px": [ + 821.5, + 840.5 + ], + "projected_center_px": [ + 821.1113891601562, + 839.8239135742188 + ], + "reprojection_error_px": 0.7798148754478401, + "confidence": 0.16363870015416757 + }, + { + "marker_id": 85, + "observed_center_px": [ + 1046.5, + 761.0 + ], + "projected_center_px": [ + 1045.5458984375, + 760.2865600585938 + ], + "reprojection_error_px": 1.1913464406119216, + "confidence": 0.0688433315472607 + }, + { + "marker_id": 62, + "observed_center_px": [ + 870.25, + 788.75 + ], + "projected_center_px": [ + 869.9884033203125, + 788.5245971679688 + ], + "reprojection_error_px": 0.34531038141247994, + "confidence": 0.11221148119458993 + }, + { + "marker_id": 211, + "observed_center_px": [ + 660.0, + 782.75 + ], + "projected_center_px": [ + 663.32666015625, + 785.37060546875 + ], + "reprojection_error_px": 4.234883802186747, + "confidence": 0.1309068188215174 + }, + { + "marker_id": 72, + "observed_center_px": [ + 537.0, + 710.5 + ], + "projected_center_px": [ + 537.4723510742188, + 710.7101440429688 + ], + "reprojection_error_px": 0.516987481580414, + "confidence": 0.11732628122523263 + }, + { + "marker_id": 50, + "observed_center_px": [ + 581.0, + 654.75 + ], + "projected_center_px": [ + 581.088623046875, + 654.3026123046875 + ], + "reprojection_error_px": 0.45608090768463305, + "confidence": 0.06871645062905071 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam0_debug.jpg b/test/y-axis-finder-examples/20260612_190019/cam0_debug.jpg new file mode 100644 index 0000000..c5bc94a Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam0_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190019/cam1.jpg b/test/y-axis-finder-examples/20260612_190019/cam1.jpg new file mode 100644 index 0000000..085f3b5 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam1.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190019/cam1_aruco_detection.json b/test/y-axis-finder-examples/20260612_190019/cam1_aruco_detection.json new file mode 100644 index 0000000..4336262 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam1_aruco_detection.json @@ -0,0 +1,2135 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:29Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam1_calibration.npz", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190019/cam1.jpg", + "image_sha256": "be095cad81577bccecf5ff90a82caea1168b03e1c5cc62b733c070c0c9a236e7", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 21, + "num_rejected_candidates": 38 + }, + "detections": [ + { + "observation_id": "adefc8f1-faf0-4903-b333-b86166429103", + "type": "aruco", + "marker_id": 196, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 307.0, + 684.0 + ], + [ + 295.0, + 645.0 + ], + [ + 332.0, + 639.0 + ], + [ + 344.0, + 678.0 + ] + ], + "center_px": [ + 319.5, + 661.5 + ], + "quality": { + "area_px": 1515.0, + "perimeter_px": 156.5754852294922, + "sharpness": { + "laplacian_var": 3729.707413397387 + }, + "contrast": { + "p05": 9.0, + "p95": 222.0, + "dynamic_range": 213.0, + "mean_gray": 91.7485604606526, + "std_gray": 84.67478783926455 + }, + "geometry": { + "distance_to_center_norm": 0.4604049026966095, + "distance_to_border_px": 276.0 + }, + "edge_ratio": 1.0886016020712332, + "edge_lengths_px": [ + 40.804412841796875, + 37.48332977294922, + 40.804412841796875, + 37.48332977294922 + ] + }, + "confidence": 0.9186097081773029 + }, + { + "observation_id": "bd11e8da-5423-41cc-b90d-27b40624010f", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 434.0, + 620.0 + ], + [ + 425.0, + 646.0 + ], + [ + 398.0, + 664.0 + ], + [ + 406.0, + 640.0 + ] + ], + "center_px": [ + 415.75, + 642.5 + ], + "quality": { + "area_px": 526.0, + "perimeter_px": 119.6711196899414, + "sharpness": { + "laplacian_var": 2687.282802775227 + }, + "contrast": { + "p05": 6.0, + "p95": 137.5, + "dynamic_range": 131.5, + "mean_gray": 55.69191919191919, + "std_gray": 45.35339390542834 + }, + "geometry": { + "distance_to_center_norm": 0.3461717367172241, + "distance_to_border_px": 296.0 + }, + "edge_ratio": 1.3601470616397384, + "edge_lengths_px": [ + 27.513633728027344, + 32.4499626159668, + 25.298221588134766, + 34.4093017578125 + ] + }, + "confidence": 0.25781525877350137 + }, + { + "observation_id": "4623c0d5-ba3e-423d-bae5-8bad03bf47e0", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 684.0, + 552.0 + ], + [ + 656.0, + 542.0 + ], + [ + 653.0, + 514.0 + ], + [ + 683.0, + 525.0 + ] + ], + "center_px": [ + 669.0, + 533.25 + ], + "quality": { + "area_px": 776.5, + "perimeter_px": 116.8639965057373, + "sharpness": { + "laplacian_var": 3418.3054397368633 + }, + "contrast": { + "p05": 18.0, + "p95": 228.0, + "dynamic_range": 210.0, + "mean_gray": 93.8, + "std_gray": 80.09375479725072 + }, + "geometry": { + "distance_to_center_norm": 0.0757933259010315, + "distance_to_border_px": 408.0 + }, + "edge_ratio": 1.1826369198026583, + "edge_lengths_px": [ + 29.73213768005371, + 28.160255432128906, + 31.95309066772461, + 27.018512725830078 + ] + }, + "confidence": 0.43772239645033884 + }, + { + "observation_id": "57903c91-9a8f-49db-af4d-7f50dc1e9eb8", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 757.0, + 70.0 + ], + [ + 733.0, + 65.0 + ], + [ + 727.0, + 33.0 + ], + [ + 755.0, + 40.0 + ] + ], + "center_px": [ + 743.0, + 52.0 + ], + "quality": { + "area_px": 782.0, + "perimeter_px": 116.00127410888672, + "sharpness": { + "laplacian_var": 3452.410706537152 + }, + "contrast": { + "p05": 9.0, + "p95": 197.0, + "dynamic_range": 188.0, + "mean_gray": 84.52495378927911, + "std_gray": 73.560981192601 + }, + "geometry": { + "distance_to_center_norm": 0.5502740740776062, + "distance_to_border_px": 33.0 + }, + "edge_ratio": 1.3280538716095864, + "edge_lengths_px": [ + 24.515300750732422, + 32.557640075683594, + 28.861740112304688, + 30.066593170166016 + ] + }, + "confidence": 0.25908587547203854 + }, + { + "observation_id": "13f8b507-2282-469c-b25b-93c26da186e4", + "type": "aruco", + "marker_id": 242, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 702.0, + 478.0 + ], + [ + 672.0, + 469.0 + ], + [ + 690.0, + 452.0 + ], + [ + 721.0, + 461.0 + ] + ], + "center_px": [ + 696.25, + 465.0 + ], + "quality": { + "area_px": 685.0, + "perimeter_px": 113.85487937927246, + "sharpness": { + "laplacian_var": 4005.6921772975816 + }, + "contrast": { + "p05": 27.0, + "p95": 221.0, + "dynamic_range": 194.0, + "mean_gray": 100.27180527383368, + "std_gray": 72.17709202209055 + }, + "geometry": { + "distance_to_center_norm": 0.07276956737041473, + "distance_to_border_px": 452.0 + }, + "edge_ratio": 1.303777952617724, + "edge_lengths_px": [ + 31.320919036865234, + 24.75883674621582, + 32.280025482177734, + 25.495098114013672 + ] + }, + "confidence": 0.350264142563365 + }, + { + "observation_id": "d309d76a-c6d5-4583-91ef-48ba969cd01b", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 958.0, + 369.0 + ], + [ + 958.0, + 341.0 + ], + [ + 973.0, + 326.0 + ], + [ + 974.0, + 352.0 + ] + ], + "center_px": [ + 965.75, + 347.0 + ], + "quality": { + "area_px": 426.5, + "perimeter_px": 98.57766342163086, + "sharpness": { + "laplacian_var": 1612.6098335067638 + }, + "contrast": { + "p05": 21.0, + "p95": 134.55, + "dynamic_range": 113.55000000000001, + "mean_gray": 63.95483870967742, + "std_gray": 36.59337890674616 + }, + "geometry": { + "distance_to_center_norm": 0.43981894850730896, + "distance_to_border_px": 306.0 + }, + "edge_ratio": 1.3199326585521733, + "edge_lengths_px": [ + 28.0, + 21.21320343017578, + 26.019224166870117, + 23.34523582458496 + ] + }, + "confidence": 0.21541503007071358 + }, + { + "observation_id": "bdf5ac2a-7f68-4c22-81d1-3d995955b8eb", + "type": "aruco", + "marker_id": 75, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1164.0, + 441.0 + ], + [ + 1162.0, + 463.0 + ], + [ + 1132.0, + 454.0 + ], + [ + 1135.0, + 432.0 + ] + ], + "center_px": [ + 1148.25, + 447.5 + ], + "quality": { + "area_px": 671.5, + "perimeter_px": 105.97969627380371, + "sharpness": { + "laplacian_var": 3865.8488306350514 + }, + "contrast": { + "p05": 5.0, + "p95": 189.0, + "dynamic_range": 184.0, + "mean_gray": 107.84478935698448, + "std_gray": 68.68632927907619 + }, + "geometry": { + "distance_to_center_norm": 0.6366100907325745, + "distance_to_border_px": 116.0 + }, + "edge_ratio": 1.4178314438908988, + "edge_lengths_px": [ + 22.090721130371094, + 31.320919036865234, + 22.203603744506836, + 30.364452362060547 + ] + }, + "confidence": 0.3157403996050142 + }, + { + "observation_id": "26f20ecb-9b6c-475c-b7ec-d9396fd6ebd5", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 924.0, + 445.0 + ], + [ + 896.0, + 436.0 + ], + [ + 895.0, + 413.0 + ], + [ + 923.0, + 421.0 + ] + ], + "center_px": [ + 909.5, + 428.75 + ], + "quality": { + "area_px": 649.5, + "perimeter_px": 105.5738754272461, + "sharpness": { + "laplacian_var": 1866.0967420025863 + }, + "contrast": { + "p05": 26.0, + "p95": 195.95, + "dynamic_range": 169.95, + "mean_gray": 83.87445887445888, + "std_gray": 61.02839305525189 + }, + "geometry": { + "distance_to_center_norm": 0.3429121673107147, + "distance_to_border_px": 356.0 + }, + "edge_ratio": 1.2775271383235947, + "edge_lengths_px": [ + 29.4108829498291, + 23.021728515625, + 29.120439529418945, + 24.020824432373047 + ] + }, + "confidence": 0.33893604841005115 + }, + { + "observation_id": "f6ac9168-85c7-40df-bbbb-ebe87c7c7dad", + "type": "aruco", + "marker_id": 77, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1111.0, + 422.0 + ], + [ + 1109.0, + 444.0 + ], + [ + 1081.0, + 436.0 + ], + [ + 1082.0, + 414.0 + ] + ], + "center_px": [ + 1095.75, + 429.0 + ], + "quality": { + "area_px": 639.0, + "perimeter_px": 103.31709289550781, + "sharpness": { + "laplacian_var": 2567.4362072949493 + }, + "contrast": { + "p05": 10.0, + "p95": 179.0, + "dynamic_range": 169.0, + "mean_gray": 73.6829268292683, + "std_gray": 63.25154193955107 + }, + "geometry": { + "distance_to_center_norm": 0.5732433199882507, + "distance_to_border_px": 169.0 + }, + "edge_ratio": 1.36600860279684, + "edge_lengths_px": [ + 22.090721130371094, + 29.120439529418945, + 22.022714614868164, + 30.08321762084961 + ] + }, + "confidence": 0.31185747961453864 + }, + { + "observation_id": "20cbd177-0d15-4efa-a3e3-71e36322eb17", + "type": "aruco", + "marker_id": 222, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 589.0, + 416.0 + ], + [ + 617.0, + 424.0 + ], + [ + 599.0, + 436.0 + ], + [ + 571.0, + 428.0 + ] + ], + "center_px": [ + 594.0, + 426.0 + ], + "quality": { + "area_px": 480.0, + "perimeter_px": 101.50749588012695, + "sharpness": { + "laplacian_var": 3755.6425623976743 + }, + "contrast": { + "p05": 24.0, + "p95": 213.0, + "dynamic_range": 189.0, + "mean_gray": 128.79190751445086, + "std_gray": 71.76960200991759 + }, + "geometry": { + "distance_to_center_norm": 0.08867073804140091, + "distance_to_border_px": 416.0 + }, + "edge_ratio": 1.3460927462713201, + "edge_lengths_px": [ + 29.120439529418945, + 21.63330841064453, + 29.120439529418945, + 21.63330841064453 + ] + }, + "confidence": 0.23772507569511883 + }, + { + "observation_id": "29cc71c3-96cc-4fa3-a4cb-76d905e2886a", + "type": "aruco", + "marker_id": 0, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 582.0, + 33.0 + ], + [ + 560.0, + 30.0 + ], + [ + 556.0, + 3.0 + ], + [ + 577.0, + 7.0 + ] + ], + "center_px": [ + 568.75, + 18.25 + ], + "quality": { + "area_px": 554.0, + "perimeter_px": 97.35225296020508, + "sharpness": { + "laplacian_var": 3194.838429738824 + }, + "contrast": { + "p05": 8.700000000000003, + "p95": 197.0, + "dynamic_range": 188.3, + "mean_gray": 88.0886075949367, + "std_gray": 70.82272214112452 + }, + "geometry": { + "distance_to_center_norm": 0.5840184688568115, + "distance_to_border_px": 3.0 + }, + "edge_ratio": 1.2767916515323836, + "edge_lengths_px": [ + 22.203603744506836, + 27.294687271118164, + 21.3775577545166, + 26.476404190063477 + ] + }, + "confidence": 0.01735600320804412 + }, + { + "observation_id": "74818f92-3613-4320-abaf-765055e56fe7", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 764.0, + 172.0 + ], + [ + 741.0, + 167.0 + ], + [ + 739.0, + 142.0 + ], + [ + 762.0, + 147.0 + ] + ], + "center_px": [ + 751.5, + 157.0 + ], + "quality": { + "area_px": 565.0, + "perimeter_px": 97.2341537475586, + "sharpness": { + "laplacian_var": 2224.7425881682625 + }, + "contrast": { + "p05": 22.6, + "p95": 206.0, + "dynamic_range": 183.4, + "mean_gray": 105.01272264631044, + "std_gray": 71.38140641403558 + }, + "geometry": { + "distance_to_center_norm": 0.427129328250885, + "distance_to_border_px": 142.0 + }, + "edge_ratio": 1.065541656530479, + "edge_lengths_px": [ + 23.53720474243164, + 25.079872131347656, + 23.53720474243164, + 25.079872131347656 + ] + }, + "confidence": 0.3534978331050283 + }, + { + "observation_id": "52608f3a-52d3-4e9a-bab9-4948c3c36b87", + "type": "aruco", + "marker_id": 61, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1141.0, + 568.0 + ], + [ + 1138.0, + 587.0 + ], + [ + 1112.0, + 576.0 + ], + [ + 1115.0, + 557.0 + ] + ], + "center_px": [ + 1126.5, + 572.0 + ], + "quality": { + "area_px": 527.0, + "perimeter_px": 94.93314361572266, + "sharpness": { + "laplacian_var": 3780.695475181898 + }, + "contrast": { + "p05": 9.0, + "p95": 186.0, + "dynamic_range": 177.0, + "mean_gray": 94.2827763496144, + "std_gray": 68.98513111657512 + }, + "geometry": { + "distance_to_center_norm": 0.6189031004905701, + "distance_to_border_px": 139.0 + }, + "edge_ratio": 1.4676695738898655, + "edge_lengths_px": [ + 19.235383987426758, + 28.23118782043457, + 19.235383987426758, + 28.23118782043457 + ] + }, + "confidence": 0.23938176520357402 + }, + { + "observation_id": "3977f788-f0a1-4dde-a1df-6f1da49e4e99", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1067.0, + 543.0 + ], + [ + 1066.0, + 562.0 + ], + [ + 1040.0, + 553.0 + ], + [ + 1042.0, + 535.0 + ] + ], + "center_px": [ + 1053.75, + 548.25 + ], + "quality": { + "area_px": 484.5, + "perimeter_px": 90.8995132446289, + "sharpness": { + "laplacian_var": 2898.776147589764 + }, + "contrast": { + "p05": 13.0, + "p95": 184.0, + "dynamic_range": 171.0, + "mean_gray": 99.58028169014085, + "std_gray": 62.19026829290243 + }, + "geometry": { + "distance_to_center_norm": 0.5241766571998596, + "distance_to_border_px": 213.0 + }, + "edge_ratio": 1.5191862044851852, + "edge_lengths_px": [ + 19.02629852294922, + 27.513633728027344, + 18.11077117919922, + 26.248809814453125 + ] + }, + "confidence": 0.21261383169909495 + }, + { + "observation_id": "0de9836a-bf81-442c-92f0-56ce7d9e9ed0", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 992.0, + 484.0 + ], + [ + 990.0, + 503.0 + ], + [ + 967.0, + 495.0 + ], + [ + 967.0, + 476.0 + ] + ], + "center_px": [ + 979.0, + 489.5 + ], + "quality": { + "area_px": 464.0, + "perimeter_px": 88.70537376403809, + "sharpness": { + "laplacian_var": 2063.683210354535 + }, + "contrast": { + "p05": 17.3, + "p95": 168.7, + "dynamic_range": 151.39999999999998, + "mean_gray": 91.05810397553516, + "std_gray": 55.184037270697914 + }, + "geometry": { + "distance_to_center_norm": 0.42391636967658997, + "distance_to_border_px": 288.0 + }, + "edge_ratio": 1.3815163060238487, + "edge_lengths_px": [ + 19.10497283935547, + 24.351591110229492, + 19.0, + 26.248809814453125 + ] + }, + "confidence": 0.22390856480270416 + }, + { + "observation_id": "e65c240a-f518-4a48-822c-e75ae5997b21", + "type": "aruco", + "marker_id": 76, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 483.0, + 222.0 + ], + [ + 487.0, + 241.0 + ], + [ + 471.0, + 236.0 + ], + [ + 467.0, + 217.0 + ] + ], + "center_px": [ + 477.0, + 229.0 + ], + "quality": { + "area_px": 284.0, + "perimeter_px": 72.35908508300781, + "sharpness": { + "laplacian_var": 5196.166356239585 + }, + "contrast": { + "p05": 16.0, + "p95": 186.0, + "dynamic_range": 170.0, + "mean_gray": 103.22772277227723, + "std_gray": 62.15381450233341 + }, + "geometry": { + "distance_to_center_norm": 0.3741030991077423, + "distance_to_border_px": 217.0 + }, + "edge_ratio": 1.1582906533731847, + "edge_lengths_px": [ + 19.416488647460938, + 16.76305389404297, + 19.416488647460938, + 16.76305389404297 + ] + }, + "confidence": 0.16345926023140656 + }, + { + "observation_id": "808be043-f72c-4124-b9d7-11d9b21c416e", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 575.0, + 285.0 + ], + [ + 579.0, + 304.0 + ], + [ + 561.0, + 298.0 + ], + [ + 558.0, + 280.0 + ] + ], + "center_px": [ + 568.25, + 291.75 + ], + "quality": { + "area_px": 304.5, + "perimeter_px": 74.35848617553711, + "sharpness": { + "laplacian_var": 3483.248473627366 + }, + "contrast": { + "p05": 12.600000000000001, + "p95": 173.0, + "dynamic_range": 160.4, + "mean_gray": 79.54929577464789, + "std_gray": 55.14176064571842 + }, + "geometry": { + "distance_to_center_norm": 0.2518249750137329, + "distance_to_border_px": 280.0 + }, + "edge_ratio": 1.095735848816957, + "edge_lengths_px": [ + 19.416488647460938, + 18.973665237426758, + 18.248287200927734, + 17.72004508972168 + ] + }, + "confidence": 0.18526362920331105 + }, + { + "observation_id": "6625383c-d5da-4b71-b51e-f43c4dea8943", + "type": "aruco", + "marker_id": 207, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 266.0, + 61.0 + ], + [ + 251.0, + 58.0 + ], + [ + 245.0, + 37.0 + ], + [ + 259.0, + 40.0 + ] + ], + "center_px": [ + 255.25, + 49.0 + ], + "quality": { + "area_px": 285.0, + "perimeter_px": 73.59115409851074, + "sharpness": { + "laplacian_var": 2788.5084694429424 + }, + "contrast": { + "p05": 7.700000000000001, + "p95": 169.0, + "dynamic_range": 161.3, + "mean_gray": 77.42325581395349, + "std_gray": 56.11336050005362 + }, + "geometry": { + "distance_to_center_norm": 0.7221859097480774, + "distance_to_border_px": 37.0 + }, + "edge_ratio": 1.5460413696527164, + "edge_lengths_px": [ + 15.29705810546875, + 21.840330123901367, + 14.317821502685547, + 22.135944366455078 + ] + }, + "confidence": 0.09094193904499635 + }, + { + "observation_id": "fccf6b91-7cdf-44c4-97e1-0eae11f4191e", + "type": "aruco", + "marker_id": 93, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 303.0, + 153.0 + ], + [ + 310.0, + 173.0 + ], + [ + 295.0, + 168.0 + ], + [ + 289.0, + 150.0 + ] + ], + "center_px": [ + 299.25, + 161.0 + ], + "quality": { + "area_px": 249.5, + "perimeter_px": 70.29249572753906, + "sharpness": { + "laplacian_var": 4152.4176270410935 + }, + "contrast": { + "p05": 2.3000000000000007, + "p95": 161.39999999999998, + "dynamic_range": 159.09999999999997, + "mean_gray": 63.026737967914436, + "std_gray": 56.21144507845661 + }, + "geometry": { + "distance_to_center_norm": 0.5834589600563049, + "distance_to_border_px": 150.0 + }, + "edge_ratio": 1.4799472788304575, + "edge_lengths_px": [ + 21.189620971679688, + 15.81138801574707, + 18.973665237426758, + 14.317821502685547 + ] + }, + "confidence": 0.11239139103980775 + }, + { + "observation_id": "d265dc74-892f-4925-8fdc-f0f7cd81ada8", + "type": "aruco", + "marker_id": 91, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 485.0, + 342.0 + ], + [ + 489.0, + 358.0 + ], + [ + 473.0, + 353.0 + ], + [ + 470.0, + 336.0 + ] + ], + "center_px": [ + 479.25, + 347.25 + ], + "quality": { + "area_px": 236.5, + "perimeter_px": 66.67364692687988, + "sharpness": { + "laplacian_var": 3471.429452472301 + }, + "contrast": { + "p05": 20.3, + "p95": 196.09999999999997, + "dynamic_range": 175.79999999999995, + "mean_gray": 97.23952095808383, + "std_gray": 63.865334517748614 + }, + "geometry": { + "distance_to_center_norm": 0.2605976462364197, + "distance_to_border_px": 336.0 + }, + "edge_ratio": 1.068532816253631, + "edge_lengths_px": [ + 16.492422103881836, + 16.76305389404297, + 17.262676239013672, + 16.155494689941406 + ] + }, + "confidence": 0.14755435141380097 + }, + { + "observation_id": "b07fdad8-3c49-47fb-85da-2a8bd9e459b7", + "type": "aruco", + "marker_id": 49, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 261.0, + 153.0 + ], + [ + 268.0, + 172.0 + ], + [ + 253.0, + 167.0 + ], + [ + 248.0, + 150.0 + ] + ], + "center_px": [ + 257.5, + 160.5 + ], + "quality": { + "area_px": 228.0, + "perimeter_px": 67.12155437469482, + "sharpness": { + "laplacian_var": 3975.70973708548 + }, + "contrast": { + "p05": 2.0, + "p95": 144.39999999999998, + "dynamic_range": 142.39999999999998, + "mean_gray": 49.672413793103445, + "std_gray": 47.03302383384692 + }, + "geometry": { + "distance_to_center_norm": 0.6229798793792725, + "distance_to_border_px": 150.0 + }, + "edge_ratio": 1.5176859856456324, + "edge_lengths_px": [ + 20.248456954956055, + 15.81138801574707, + 17.72004508972168, + 13.34166431427002 + ] + }, + "confidence": 0.10015246990327734 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 147.0, + 566.0 + ], + [ + 166.0, + 616.0 + ], + [ + 42.0, + 708.0 + ], + [ + 20.0, + 664.0 + ] + ], + "center_px": [ + 93.75, + 638.5 + ], + "area_px": 7846.0 + }, + { + "image_points_px": [ + [ + 894.0, + 231.0 + ], + [ + 930.0, + 239.0 + ], + [ + 930.0, + 277.0 + ], + [ + 894.0, + 270.0 + ] + ], + "center_px": [ + 912.0, + 254.25 + ], + "area_px": 1386.0 + }, + { + "image_points_px": [ + [ + 200.0, + 573.0 + ], + [ + 223.0, + 623.0 + ], + [ + 212.0, + 612.0 + ], + [ + 199.0, + 583.0 + ] + ], + "center_px": [ + 208.5, + 597.75 + ], + "area_px": 228.0 + }, + { + "image_points_px": [ + [ + 763.0, + 504.0 + ], + [ + 765.0, + 531.0 + ], + [ + 745.0, + 551.0 + ], + [ + 744.0, + 520.0 + ] + ], + "center_px": [ + 754.25, + 526.5 + ], + "area_px": 592.5 + }, + { + "image_points_px": [ + [ + 546.0, + 546.0 + ], + [ + 538.0, + 569.0 + ], + [ + 515.0, + 585.0 + ], + [ + 524.0, + 561.0 + ] + ], + "center_px": [ + 530.75, + 565.25 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 513.0, + 489.0 + ], + [ + 533.0, + 506.0 + ], + [ + 504.0, + 523.0 + ], + [ + 495.0, + 506.0 + ] + ], + "center_px": [ + 511.25, + 506.0 + ], + "area_px": 646.0 + }, + { + "image_points_px": [ + [ + 430.0, + 71.0 + ], + [ + 452.0, + 75.0 + ], + [ + 459.0, + 104.0 + ], + [ + 437.0, + 98.0 + ] + ], + "center_px": [ + 444.5, + 87.0 + ], + "area_px": 581.0 + }, + { + "image_points_px": [ + [ + 550.0, + 102.0 + ], + [ + 570.0, + 106.0 + ], + [ + 573.0, + 130.0 + ], + [ + 554.0, + 125.0 + ] + ], + "center_px": [ + 561.75, + 115.75 + ], + "area_px": 442.5 + }, + { + "image_points_px": [ + [ + 1001.0, + 409.0 + ], + [ + 1021.0, + 412.0 + ], + [ + 1020.0, + 433.0 + ], + [ + 993.0, + 425.0 + ] + ], + "center_px": [ + 1008.75, + 419.75 + ], + "area_px": 459.5 + }, + { + "image_points_px": [ + [ + 867.0, + 444.0 + ], + [ + 890.0, + 451.0 + ], + [ + 889.0, + 469.0 + ], + [ + 867.0, + 462.0 + ] + ], + "center_px": [ + 878.25, + 456.5 + ], + "area_px": 408.5 + }, + { + "image_points_px": [ + [ + 865.0, + 472.0 + ], + [ + 887.0, + 478.0 + ], + [ + 888.0, + 497.0 + ], + [ + 865.0, + 488.0 + ] + ], + "center_px": [ + 876.25, + 483.75 + ], + "area_px": 390.0 + }, + { + "image_points_px": [ + [ + 610.0, + 260.0 + ], + [ + 630.0, + 266.0 + ], + [ + 633.0, + 286.0 + ], + [ + 614.0, + 280.0 + ] + ], + "center_px": [ + 621.75, + 273.0 + ], + "area_px": 369.0 + }, + { + "image_points_px": [ + [ + 908.0, + 456.0 + ], + [ + 945.0, + 467.0 + ], + [ + 941.0, + 471.0 + ], + [ + 921.0, + 466.0 + ] + ], + "center_px": [ + 928.75, + 465.0 + ], + "area_px": 163.5 + }, + { + "image_points_px": [ + [ + 662.0, + 296.0 + ], + [ + 681.0, + 302.0 + ], + [ + 684.0, + 322.0 + ], + [ + 664.0, + 316.0 + ] + ], + "center_px": [ + 672.75, + 309.0 + ], + "area_px": 375.0 + }, + { + "image_points_px": [ + [ + 389.0, + 68.0 + ], + [ + 406.0, + 73.0 + ], + [ + 411.0, + 95.0 + ], + [ + 393.0, + 89.0 + ] + ], + "center_px": [ + 399.75, + 81.25 + ], + "area_px": 351.5 + }, + { + "image_points_px": [ + [ + 626.0, + 301.0 + ], + [ + 645.0, + 306.0 + ], + [ + 648.0, + 326.0 + ], + [ + 629.0, + 320.0 + ] + ], + "center_px": [ + 637.0, + 313.25 + ], + "area_px": 354.0 + }, + { + "image_points_px": [ + [ + 697.0, + 359.0 + ], + [ + 717.0, + 366.0 + ], + [ + 719.0, + 384.0 + ], + [ + 699.0, + 377.0 + ] + ], + "center_px": [ + 708.0, + 371.5 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 583.0, + 265.0 + ], + [ + 601.0, + 272.0 + ], + [ + 604.0, + 291.0 + ], + [ + 585.0, + 285.0 + ] + ], + "center_px": [ + 593.25, + 278.25 + ], + "area_px": 344.5 + }, + { + "image_points_px": [ + [ + 551.0, + 244.0 + ], + [ + 570.0, + 251.0 + ], + [ + 572.0, + 270.0 + ], + [ + 554.0, + 264.0 + ] + ], + "center_px": [ + 561.75, + 257.25 + ], + "area_px": 344.5 + }, + { + "image_points_px": [ + [ + 677.0, + 372.0 + ], + [ + 696.0, + 378.0 + ], + [ + 698.0, + 397.0 + ], + [ + 679.0, + 390.0 + ] + ], + "center_px": [ + 687.5, + 384.25 + ], + "area_px": 338.5 + }, + { + "image_points_px": [ + [ + 605.0, + 336.0 + ], + [ + 623.0, + 343.0 + ], + [ + 625.0, + 361.0 + ], + [ + 608.0, + 354.0 + ] + ], + "center_px": [ + 615.25, + 348.5 + ], + "area_px": 297.5 + }, + { + "image_points_px": [ + [ + 202.0, + 860.0 + ], + [ + 199.0, + 869.0 + ], + [ + 180.0, + 887.0 + ], + [ + 186.0, + 874.0 + ] + ], + "center_px": [ + 191.75, + 872.5 + ], + "area_px": 120.5 + }, + { + "image_points_px": [ + [ + 572.0, + 361.0 + ], + [ + 589.0, + 367.0 + ], + [ + 593.0, + 384.0 + ], + [ + 575.0, + 377.0 + ] + ], + "center_px": [ + 582.25, + 372.25 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 384.0, + 198.0 + ], + [ + 399.0, + 203.0 + ], + [ + 404.0, + 222.0 + ], + [ + 388.0, + 216.0 + ] + ], + "center_px": [ + 393.75, + 209.75 + ], + "area_px": 262.0 + }, + { + "image_points_px": [ + [ + 550.0, + 344.0 + ], + [ + 567.0, + 349.0 + ], + [ + 571.0, + 366.0 + ], + [ + 553.0, + 360.0 + ] + ], + "center_px": [ + 560.25, + 354.75 + ], + "area_px": 269.5 + }, + { + "image_points_px": [ + [ + 164.0, + 850.0 + ], + [ + 147.0, + 874.0 + ], + [ + 142.0, + 876.0 + ], + [ + 142.0, + 871.0 + ] + ], + "center_px": [ + 148.75, + 867.75 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 336.0, + 185.0 + ], + [ + 350.0, + 190.0 + ], + [ + 355.0, + 209.0 + ], + [ + 340.0, + 203.0 + ] + ], + "center_px": [ + 345.25, + 196.75 + ], + "area_px": 243.5 + }, + { + "image_points_px": [ + [ + 523.0, + 346.0 + ], + [ + 540.0, + 352.0 + ], + [ + 542.0, + 369.0 + ], + [ + 526.0, + 362.0 + ] + ], + "center_px": [ + 532.75, + 357.25 + ], + "area_px": 256.0 + }, + { + "image_points_px": [ + [ + 383.0, + 248.0 + ], + [ + 398.0, + 251.0 + ], + [ + 403.0, + 270.0 + ], + [ + 387.0, + 264.0 + ] + ], + "center_px": [ + 392.75, + 258.25 + ], + "area_px": 251.0 + }, + { + "image_points_px": [ + [ + 439.0, + 318.0 + ], + [ + 455.0, + 325.0 + ], + [ + 457.0, + 341.0 + ], + [ + 442.0, + 334.0 + ] + ], + "center_px": [ + 448.25, + 329.5 + ], + "area_px": 230.5 + }, + { + "image_points_px": [ + [ + 788.0, + 508.0 + ], + [ + 772.0, + 525.0 + ], + [ + 766.0, + 528.0 + ], + [ + 784.0, + 506.0 + ] + ], + "center_px": [ + 777.5, + 516.75 + ], + "area_px": 89.0 + }, + { + "image_points_px": [ + [ + 147.0, + 887.0 + ], + [ + 152.0, + 886.0 + ], + [ + 173.0, + 902.0 + ], + [ + 165.0, + 900.0 + ] + ], + "center_px": [ + 159.25, + 893.75 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 558.0, + 466.0 + ], + [ + 540.0, + 478.0 + ], + [ + 533.0, + 475.0 + ], + [ + 552.0, + 463.0 + ] + ], + "center_px": [ + 545.75, + 470.5 + ], + "area_px": 133.5 + }, + { + "image_points_px": [ + [ + 319.0, + 662.0 + ], + [ + 333.0, + 659.0 + ], + [ + 338.0, + 673.0 + ], + [ + 324.0, + 676.0 + ] + ], + "center_px": [ + 328.5, + 667.5 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 856.0, + 277.0 + ], + [ + 863.0, + 276.0 + ], + [ + 879.0, + 284.0 + ], + [ + 857.0, + 280.0 + ] + ], + "center_px": [ + 863.75, + 279.25 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 603.0, + 513.0 + ], + [ + 584.0, + 527.0 + ], + [ + 588.0, + 521.0 + ], + [ + 601.0, + 512.0 + ] + ], + "center_px": [ + 594.0, + 518.25 + ], + "area_px": 44.5 + }, + { + "image_points_px": [ + [ + 480.0, + 600.0 + ], + [ + 464.0, + 615.0 + ], + [ + 464.0, + 611.0 + ], + [ + 470.0, + 605.0 + ] + ], + "center_px": [ + 469.5, + 607.75 + ], + "area_px": 47.0 + }, + { + "image_points_px": [ + [ + 266.0, + 581.0 + ], + [ + 272.0, + 595.0 + ], + [ + 271.0, + 600.0 + ], + [ + 265.0, + 585.0 + ] + ], + "center_px": [ + 268.5, + 590.25 + ], + "area_px": 41.5 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam1_camera_pose.json b/test/y-axis-finder-examples/20260612_190019/cam1_camera_pose.json new file mode 100644 index 0000000..131f2ba --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam1_camera_pose.json @@ -0,0 +1,383 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:29Z", + "source": { + "detection_json": "/app/data/board/20260612_190019/cam1_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 13, + "used_marker_ids": [ + 215, + 75, + 77, + 0, + 211, + 61, + 83, + 101, + 76, + 50, + 93, + 91, + 49 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.017022918082395283, + 0.0016029139407840972, + 0.0009266432889417533, + 0.0009266138587975449 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 1.8236001246900813, + "residual_median_px": 1.7993926830506055, + "residual_max_px": 3.117158028688972, + "sigma2_normalized": 1.1161972156231532e-06 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.8183506727218628, + 0.12972214818000793, + -0.5598878264427185 + ], + [ + -0.2789310812950134, + 0.7621176242828369, + 0.5842723250389099 + ], + [ + 0.5024934411048889, + 0.6343097686767578, + -0.5874959230422974 + ] + ], + "translation_m": [ + 0.3237478733062744, + -0.14087295532226562, + 0.9716223478317261 + ], + "rvec_rad": [ + 0.11135007986257006, + -2.364155336810066, + -0.9093907546480695 + ] + }, + "camera_in_world": { + "position_m": [ + -0.2625884413719177, + -0.5509450435638428, + 0.8343948125839233 + ], + "position_mm": [ + -262.58843994140625, + -550.945068359375, + 834.3948364257812 + ], + "orientation_deg": { + "roll": 132.80577087402344, + "pitch": -30.165102005004883, + "yaw": -161.1785430908203 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 2.851729441256815e-06, + -2.147156723968646e-06, + 1.8576183193782376e-06, + 8.473687623801159e-07, + 8.483100932855552e-08, + 1.397890679328617e-06 + ], + [ + -2.147156723968639e-06, + 7.026317930056324e-06, + -5.934943538668077e-06, + -1.9307467532566697e-06, + 1.313438438880565e-06, + -3.4794633911191294e-06 + ], + [ + 1.8576183193783278e-06, + -5.934943538668317e-06, + 2.1108153906603782e-05, + -9.840570982919328e-09, + -3.0806723732569776e-06, + 4.388293425822464e-07 + ], + [ + 8.473687623801028e-07, + -1.930746753256646e-06, + -9.840570983004e-09, + 8.820973196642204e-07, + -1.2071719052749886e-07, + 1.4398692627954377e-06 + ], + [ + 8.48310093285469e-08, + 1.3134384388805927e-06, + -3.0806723732569615e-06, + -1.207171905275097e-07, + 7.565638379797291e-07, + -4.899305484537102e-07 + ], + [ + 1.3978906793285827e-06, + -3.4794633911190833e-06, + 4.388293425820637e-07, + 1.4398692627954383e-06, + -4.899305484536892e-07, + 4.322545340630154e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.09675575186144396, + 0.1518750839275168, + 0.26323750052305256 + ], + "tvec_std_m": [ + 0.0009392003618313935, + 0.0008698067819807621, + 0.0020790731927063447 + ] + }, + "camera_center_std_m": [ + 0.0022883403448389484, + 0.003574064270477857, + 0.0034820809395586243 + ], + "camera_center_std_mm": [ + 2.2883403448389483, + 3.5740642704778574, + 3.482080939558624 + ], + "orientation_std_deg": { + "roll": 0.21656039550247336, + "pitch": 0.13029819568345818, + "yaw": 0.047876159027645304 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 215, + "observed_center_px": [ + 743.0, + 52.0 + ], + "projected_center_px": [ + 744.772216796875, + 52.942100524902344 + ], + "reprojection_error_px": 2.0070639686236103, + "confidence": 0.25908587547203854 + }, + { + "marker_id": 75, + "observed_center_px": [ + 1148.25, + 447.5 + ], + "projected_center_px": [ + 1149.3878173828125, + 448.89398193359375 + ], + "reprojection_error_px": 1.7993926830506055, + "confidence": 0.3157403996050142 + }, + { + "marker_id": 77, + "observed_center_px": [ + 1095.75, + 429.0 + ], + "projected_center_px": [ + 1095.99755859375, + 430.639404296875 + ], + "reprojection_error_px": 1.6579902611148507, + "confidence": 0.31185747961453864 + }, + { + "marker_id": 0, + "observed_center_px": [ + 568.75, + 18.25 + ], + "projected_center_px": [ + 567.065673828125, + 15.62707805633545 + ], + "reprojection_error_px": 3.117158028688972, + "confidence": 0.01735600320804412 + }, + { + "marker_id": 211, + "observed_center_px": [ + 751.5, + 157.0 + ], + "projected_center_px": [ + 751.8925170898438, + 156.7000732421875 + ], + "reprojection_error_px": 0.4939896009748834, + "confidence": 0.3534978331050283 + }, + { + "marker_id": 61, + "observed_center_px": [ + 1126.5, + 572.0 + ], + "projected_center_px": [ + 1126.9600830078125, + 569.77197265625 + ], + "reprojection_error_px": 2.27503455327067, + "confidence": 0.23938176520357402 + }, + { + "marker_id": 83, + "observed_center_px": [ + 1053.75, + 548.25 + ], + "projected_center_px": [ + 1052.75634765625, + 547.5562744140625 + ], + "reprojection_error_px": 1.2118581471542764, + "confidence": 0.21261383169909495 + }, + { + "marker_id": 101, + "observed_center_px": [ + 979.0, + 489.5 + ], + "projected_center_px": [ + 977.7030639648438, + 489.5307922363281 + ], + "reprojection_error_px": 1.2973015228176141, + "confidence": 0.22390856480270416 + }, + { + "marker_id": 76, + "observed_center_px": [ + 477.0, + 229.0 + ], + "projected_center_px": [ + 475.4937438964844, + 230.33995056152344 + ], + "reprojection_error_px": 2.01600470155827, + "confidence": 0.16345926023140656 + }, + { + "marker_id": 50, + "observed_center_px": [ + 568.25, + 291.75 + ], + "projected_center_px": [ + 567.2425537109375, + 291.9026794433594 + ], + "reprojection_error_px": 1.0189499682370724, + "confidence": 0.18526362920331105 + }, + { + "marker_id": 93, + "observed_center_px": [ + 299.25, + 161.0 + ], + "projected_center_px": [ + 299.7609558105469, + 162.38560485839844 + ], + "reprojection_error_px": 1.4768130091345242, + "confidence": 0.11239139103980775 + }, + { + "marker_id": 91, + "observed_center_px": [ + 479.25, + 347.25 + ], + "projected_center_px": [ + 479.1844482421875, + 345.42974853515625 + ], + "reprojection_error_px": 1.8214314228699708, + "confidence": 0.14755435141380097 + }, + { + "marker_id": 49, + "observed_center_px": [ + 257.5, + 160.5 + ], + "projected_center_px": [ + 259.39337158203125, + 161.36175537109375 + ], + "reprojection_error_px": 2.0802591827107615, + "confidence": 0.10015246990327734 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam1_debug.jpg b/test/y-axis-finder-examples/20260612_190019/cam1_debug.jpg new file mode 100644 index 0000000..faa98f9 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam1_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190019/cam2.jpg b/test/y-axis-finder-examples/20260612_190019/cam2.jpg new file mode 100644 index 0000000..33e04e5 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam2.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190019/cam2_aruco_detection.json b/test/y-axis-finder-examples/20260612_190019/cam2_aruco_detection.json new file mode 100644 index 0000000..47854c6 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam2_aruco_detection.json @@ -0,0 +1,2898 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:31Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam2", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam2_calibration.npz", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190019/cam2.jpg", + "image_sha256": "6d3430ac2d7df292ede237a5d7f3e1af6ef8e0db4f646424772bbc918b7efdc7", + "width_px": 1920, + "height_px": 1080 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 18, + "num_rejected_candidates": 75 + }, + "detections": [ + { + "observation_id": "8af662a6-4004-4ac2-b3b7-da2ad11708ad", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 669.0, + 943.0 + ], + [ + 718.0, + 944.0 + ], + [ + 717.0, + 989.0 + ], + [ + 669.0, + 989.0 + ] + ], + "center_px": [ + 693.25, + 966.25 + ], + "quality": { + "area_px": 2207.0, + "perimeter_px": 188.02131271362305, + "sharpness": { + "laplacian_var": 849.8855328081718 + }, + "contrast": { + "p05": 9.0, + "p95": 125.0, + "dynamic_range": 116.0, + "mean_gray": 44.31907894736842, + "std_gray": 45.8566720645521 + }, + "geometry": { + "distance_to_center_norm": 0.4565208852291107, + "distance_to_border_px": 91.0 + }, + "edge_ratio": 1.0888468660080113, + "edge_lengths_px": [ + 49.01020431518555, + 45.0111083984375, + 48.0, + 46.0 + ] + }, + "confidence": 0.9184027903448476 + }, + { + "observation_id": "09ad8de8-33e5-463f-be18-c0b2fd2c16c2", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 624.0, + 526.0 + ], + [ + 671.0, + 531.0 + ], + [ + 664.0, + 578.0 + ], + [ + 618.0, + 571.0 + ] + ], + "center_px": [ + 644.25, + 551.5 + ], + "quality": { + "area_px": 2178.0, + "perimeter_px": 186.71142578125, + "sharpness": { + "laplacian_var": 1351.4948109032082 + }, + "contrast": { + "p05": 6.0, + "p95": 126.0, + "dynamic_range": 120.0, + "mean_gray": 61.23066298342541, + "std_gray": 51.3554867673106 + }, + "geometry": { + "distance_to_center_norm": 0.2868567109107971, + "distance_to_border_px": 502.0 + }, + "edge_ratio": 1.0467017722056764, + "edge_lengths_px": [ + 47.26520919799805, + 47.51841735839844, + 46.52956008911133, + 45.39823913574219 + ] + }, + "confidence": 0.9553819689181728 + }, + { + "observation_id": "72d607d0-2ee2-440b-9c11-59021292943c", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 755.0, + 177.0 + ], + [ + 719.0, + 167.0 + ], + [ + 729.0, + 124.0 + ], + [ + 765.0, + 133.0 + ] + ], + "center_px": [ + 742.0, + 150.25 + ], + "quality": { + "area_px": 1661.0, + "perimeter_px": 163.74057006835938, + "sharpness": { + "laplacian_var": 1080.7353283950617 + }, + "contrast": { + "p05": 8.0, + "p95": 129.0, + "dynamic_range": 121.0, + "mean_gray": 51.18311111111111, + "std_gray": 48.935733629695825 + }, + "geometry": { + "distance_to_center_norm": 0.4054413139820099, + "distance_to_border_px": 124.0 + }, + "edge_ratio": 1.21596726519222, + "edge_lengths_px": [ + 37.36308288574219, + 44.14748001098633, + 37.10795211791992, + 45.12205505371094 + ] + }, + "confidence": 0.8223905598658695 + }, + { + "observation_id": "12c523b4-a330-4746-816f-a7de7e02fe16", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 712.0, + 358.0 + ], + [ + 677.0, + 347.0 + ], + [ + 687.0, + 307.0 + ], + [ + 723.0, + 319.0 + ] + ], + "center_px": [ + 699.75, + 332.75 + ], + "quality": { + "area_px": 1523.0, + "perimeter_px": 156.38785934448242, + "sharpness": { + "laplacian_var": 1054.585675278303 + }, + "contrast": { + "p05": 7.0, + "p95": 129.0, + "dynamic_range": 122.0, + "mean_gray": 46.00386473429952, + "std_gray": 48.70703095335294 + }, + "geometry": { + "distance_to_center_norm": 0.3020462989807129, + "distance_to_border_px": 307.0 + }, + "edge_ratio": 1.1238333513906829, + "edge_lengths_px": [ + 36.68787384033203, + 41.231056213378906, + 37.947330474853516, + 40.52159881591797 + ] + }, + "confidence": 0.8898116422355273 + }, + { + "observation_id": "0553aec0-87bc-4b60-a367-9a92f2dc88d5", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 539.0, + 906.0 + ], + [ + 549.0, + 888.0 + ], + [ + 595.0, + 888.0 + ], + [ + 585.0, + 905.0 + ] + ], + "center_px": [ + 567.0, + 896.75 + ], + "quality": { + "area_px": 800.0, + "perimeter_px": 132.3252124786377, + "sharpness": { + "laplacian_var": 3046.3401972386587 + }, + "contrast": { + "p05": 11.200000000000003, + "p95": 196.0, + "dynamic_range": 184.8, + "mean_gray": 70.4940170940171, + "std_gray": 65.99357944760536 + }, + "geometry": { + "distance_to_center_norm": 0.4818837344646454, + "distance_to_border_px": 174.0 + }, + "edge_ratio": 2.3328435475934803, + "edge_lengths_px": [ + 20.59126091003418, + 46.0, + 19.72308349609375, + 46.010868072509766 + ] + }, + "confidence": 0.2286194176559806 + }, + { + "observation_id": "ed1afc2c-1b98-4744-a21c-9baa545a6eeb", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 349.0, + 1044.0 + ], + [ + 310.0, + 1043.0 + ], + [ + 326.0, + 1023.0 + ], + [ + 364.0, + 1025.0 + ] + ], + "center_px": [ + 337.25, + 1033.75 + ], + "quality": { + "area_px": 774.0, + "perimeter_px": 126.88534927368164, + "sharpness": { + "laplacian_var": 2172.139164437275 + }, + "contrast": { + "p05": 13.3, + "p95": 172.0, + "dynamic_range": 158.7, + "mean_gray": 85.63946869070209, + "std_gray": 62.73938594283749 + }, + "geometry": { + "distance_to_center_norm": 0.7215345501899719, + "distance_to_border_px": 36.0 + }, + "edge_ratio": 1.6116045888054598, + "edge_lengths_px": [ + 39.0128173828125, + 25.612497329711914, + 38.05259704589844, + 24.20743751525879 + ] + }, + "confidence": 0.23052801076681903 + }, + { + "observation_id": "e9465c26-1a59-4f84-86ae-05fe5c73ed14", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1231.0, + 1015.0 + ], + [ + 1195.0, + 1013.0 + ], + [ + 1189.0, + 996.0 + ], + [ + 1223.0, + 996.0 + ] + ], + "center_px": [ + 1209.5, + 1005.0 + ], + "quality": { + "area_px": 623.0, + "perimeter_px": 108.69879531860352, + "sharpness": { + "laplacian_var": 3084.4645510396977 + }, + "contrast": { + "p05": 26.0, + "p95": 192.0, + "dynamic_range": 166.0, + "mean_gray": 87.92826086956522, + "std_gray": 61.82195038292903 + }, + "geometry": { + "distance_to_center_norm": 0.4791010022163391, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 2.0, + "edge_lengths_px": [ + 36.055511474609375, + 18.027755737304688, + 34.0, + 20.615528106689453 + ] + }, + "confidence": 0.20766666666666667 + }, + { + "observation_id": "ceab5dc8-492a-498c-8c8a-755cf5e561b2", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1368.0, + 1002.0 + ], + [ + 1332.0, + 1002.0 + ], + [ + 1323.0, + 985.0 + ], + [ + 1357.0, + 986.0 + ] + ], + "center_px": [ + 1345.0, + 993.75 + ], + "quality": { + "area_px": 572.5, + "perimeter_px": 108.66657447814941, + "sharpness": { + "laplacian_var": 2841.3720181405897 + }, + "contrast": { + "p05": 21.0, + "p95": 196.0999999999999, + "dynamic_range": 175.0999999999999, + "mean_gray": 104.49047619047619, + "std_gray": 65.34463511160256 + }, + "geometry": { + "distance_to_center_norm": 0.5402631759643555, + "distance_to_border_px": 78.0 + }, + "edge_ratio": 1.8715508888999286, + "edge_lengths_px": [ + 36.0, + 19.235383987426758, + 34.01470184326172, + 19.416488647460938 + ] + }, + "confidence": 0.20393069134818181 + }, + { + "observation_id": "9ecc5ad0-f4f8-470c-988f-8a3bc71c7801", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1072.0, + 989.0 + ], + [ + 1036.0, + 989.0 + ], + [ + 1034.0, + 972.0 + ], + [ + 1069.0, + 974.0 + ] + ], + "center_px": [ + 1052.75, + 981.0 + ], + "quality": { + "area_px": 565.5, + "perimeter_px": 103.47139549255371, + "sharpness": { + "laplacian_var": 3859.8742913425067 + }, + "contrast": { + "p05": 20.6, + "p95": 188.39999999999998, + "dynamic_range": 167.79999999999998, + "mean_gray": 100.43825665859565, + "std_gray": 64.09171084011992 + }, + "geometry": { + "distance_to_center_norm": 0.4091392755508423, + "distance_to_border_px": 91.0 + }, + "edge_ratio": 2.353393688628919, + "edge_lengths_px": [ + 36.0, + 17.11724281311035, + 35.05709457397461, + 15.29705810546875 + ] + }, + "confidence": 0.1601941918267144 + }, + { + "observation_id": "2bdf9dfc-b148-4650-b595-cb4925e70b79", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 436.0, + 939.0 + ], + [ + 404.0, + 938.0 + ], + [ + 415.0, + 923.0 + ], + [ + 448.0, + 924.0 + ] + ], + "center_px": [ + 425.75, + 931.0 + ], + "quality": { + "area_px": 499.0, + "perimeter_px": 102.84121894836426, + "sharpness": { + "laplacian_var": 2303.9914789445193 + }, + "contrast": { + "p05": 17.0, + "p95": 189.0, + "dynamic_range": 172.0, + "mean_gray": 93.3249299719888, + "std_gray": 66.42023729191175 + }, + "geometry": { + "distance_to_center_norm": 0.6010650992393494, + "distance_to_border_px": 141.0 + }, + "edge_ratio": 1.7749052763952293, + "edge_lengths_px": [ + 32.015621185302734, + 18.601076126098633, + 33.0151481628418, + 19.209373474121094 + ] + }, + "confidence": 0.18742784253946276 + }, + { + "observation_id": "fe7ce356-f371-4a89-bcb0-74b7e195ff20", + "type": "aruco", + "marker_id": 54, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1311.0, + 976.0 + ], + [ + 1277.0, + 974.0 + ], + [ + 1269.0, + 959.0 + ], + [ + 1302.0, + 960.0 + ] + ], + "center_px": [ + 1289.75, + 967.25 + ], + "quality": { + "area_px": 506.5, + "perimeter_px": 102.43148040771484, + "sharpness": { + "laplacian_var": 1840.199587164571 + }, + "contrast": { + "p05": 27.2, + "p95": 171.60000000000002, + "dynamic_range": 144.40000000000003, + "mean_gray": 66.31232876712329, + "std_gray": 48.71196850260479 + }, + "geometry": { + "distance_to_center_norm": 0.48999014496803284, + "distance_to_border_px": 104.0 + }, + "edge_ratio": 2.0034572376924404, + "edge_lengths_px": [ + 34.058773040771484, + 17.0, + 33.0151481628418, + 18.357559204101562 + ] + }, + "confidence": 0.16854198847567486 + }, + { + "observation_id": "c2048e27-f3ed-4c1e-a950-6a3a377ece67", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 938.0, + 952.0 + ], + [ + 938.0, + 937.0 + ], + [ + 972.0, + 936.0 + ], + [ + 973.0, + 953.0 + ] + ], + "center_px": [ + 955.25, + 944.5 + ], + "quality": { + "area_px": 552.0, + "perimeter_px": 101.05837059020996, + "sharpness": { + "laplacian_var": 3097.1065124618067 + }, + "contrast": { + "p05": 17.0, + "p95": 191.0, + "dynamic_range": 174.0, + "mean_gray": 88.53517587939699, + "std_gray": 65.22849300992588 + }, + "geometry": { + "distance_to_center_norm": 0.36726731061935425, + "distance_to_border_px": 127.0 + }, + "edge_ratio": 2.3342854817708334, + "edge_lengths_px": [ + 15.0, + 34.01470184326172, + 17.029386520385742, + 35.0142822265625 + ] + }, + "confidence": 0.1576499545037774 + }, + { + "observation_id": "08e9da42-00c5-40a9-8dac-61ed76f68b18", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1247.0, + 972.0 + ], + [ + 1213.0, + 972.0 + ], + [ + 1207.0, + 957.0 + ], + [ + 1240.0, + 957.0 + ] + ], + "center_px": [ + 1226.75, + 964.5 + ], + "quality": { + "area_px": 502.5, + "perimeter_px": 99.70844078063965, + "sharpness": { + "laplacian_var": 2953.514385438168 + }, + "contrast": { + "p05": 19.0, + "p95": 186.0, + "dynamic_range": 167.0, + "mean_gray": 85.04383561643836, + "std_gray": 59.524722586389906 + }, + "geometry": { + "distance_to_center_norm": 0.45517483353614807, + "distance_to_border_px": 108.0 + }, + "edge_ratio": 2.1045471310246406, + "edge_lengths_px": [ + 34.0, + 16.155494689941406, + 33.0, + 16.552946090698242 + ] + }, + "confidence": 0.15917913885677562 + }, + { + "observation_id": "c7fedaeb-a5ed-47e7-aac3-aabf7d8281af", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1102.0, + 952.0 + ], + [ + 1068.0, + 951.0 + ], + [ + 1066.0, + 936.0 + ], + [ + 1098.0, + 937.0 + ] + ], + "center_px": [ + 1083.5, + 944.0 + ], + "quality": { + "area_px": 492.0, + "perimeter_px": 96.68724346160889, + "sharpness": { + "laplacian_var": 2886.162729003464 + }, + "contrast": { + "p05": 24.85, + "p95": 195.14999999999998, + "dynamic_range": 170.29999999999998, + "mean_gray": 98.62849162011173, + "std_gray": 66.03891669187587 + }, + "geometry": { + "distance_to_center_norm": 0.3835431635379791, + "distance_to_border_px": 128.0 + }, + "edge_ratio": 2.247754797535694, + "edge_lengths_px": [ + 34.01470184326172, + 15.132745742797852, + 32.015621185302734, + 15.524174690246582 + ] + }, + "confidence": 0.1459233900243923 + }, + { + "observation_id": "6a3c8082-21fe-4010-9751-b835b1548a81", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 500.0, + 912.0 + ], + [ + 470.0, + 912.0 + ], + [ + 481.0, + 899.0 + ], + [ + 511.0, + 899.0 + ] + ], + "center_px": [ + 490.5, + 905.5 + ], + "quality": { + "area_px": 390.0, + "perimeter_px": 94.05877304077148, + "sharpness": { + "laplacian_var": 4052.385110743801 + }, + "contrast": { + "p05": 18.0, + "p95": 189.0, + "dynamic_range": 171.0, + "mean_gray": 104.49454545454546, + "std_gray": 57.59074236899165 + }, + "geometry": { + "distance_to_center_norm": 0.5401918292045593, + "distance_to_border_px": 168.0 + }, + "edge_ratio": 1.761660642565558, + "edge_lengths_px": [ + 30.0, + 17.029386520385742, + 30.0, + 17.029386520385742 + ] + }, + "confidence": 0.14758801651000977 + }, + { + "observation_id": "2a205251-c815-4dba-a62b-f86a9f6696c7", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1081.0, + 929.0 + ], + [ + 1049.0, + 928.0 + ], + [ + 1047.0, + 915.0 + ], + [ + 1078.0, + 916.0 + ] + ], + "center_px": [ + 1063.75, + 922.0 + ], + "quality": { + "area_px": 407.0, + "perimeter_px": 89.52635669708252, + "sharpness": { + "laplacian_var": 2236.504875148633 + }, + "contrast": { + "p05": 18.0, + "p95": 156.10000000000002, + "dynamic_range": 138.10000000000002, + "mean_gray": 55.786206896551725, + "std_gray": 42.76869403033768 + }, + "geometry": { + "distance_to_center_norm": 0.35937821865081787, + "distance_to_border_px": 151.0 + }, + "edge_ratio": 2.4341025984594977, + "edge_lengths_px": [ + 32.015621185302734, + 13.152946472167969, + 31.016124725341797, + 13.34166431427002 + ] + }, + "confidence": 0.11147160908708433 + }, + { + "observation_id": "60714c84-f079-425a-b305-f02e33f78e25", + "type": "aruco", + "marker_id": 0, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 941.0, + 852.0 + ], + [ + 940.0, + 841.0 + ], + [ + 969.0, + 841.0 + ], + [ + 970.0, + 852.0 + ] + ], + "center_px": [ + 955.0, + 846.5 + ], + "quality": { + "area_px": 319.0, + "perimeter_px": 80.0907211303711, + "sharpness": { + "laplacian_var": 4737.077987756188 + }, + "contrast": { + "p05": 22.0, + "p95": 183.0, + "dynamic_range": 161.0, + "mean_gray": 94.14027149321267, + "std_gray": 55.90799858525294 + }, + "geometry": { + "distance_to_center_norm": 0.27830564975738525, + "distance_to_border_px": 228.0 + }, + "edge_ratio": 2.625536742676072, + "edge_lengths_px": [ + 11.045360565185547, + 29.0, + 11.045360565185547, + 29.0 + ] + }, + "confidence": 0.08099931081136068 + }, + { + "observation_id": "acfeb592-3074-4568-9a40-036d71dde2c4", + "type": "aruco", + "marker_id": 48, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1204.0, + 799.0 + ], + [ + 1180.0, + 798.0 + ], + [ + 1176.0, + 790.0 + ], + [ + 1200.0, + 790.0 + ] + ], + "center_px": [ + 1190.0, + 794.25 + ], + "quality": { + "area_px": 202.0, + "perimeter_px": 66.81395435333252, + "sharpness": { + "laplacian_var": 4199.822245982157 + }, + "contrast": { + "p05": 21.2, + "p95": 173.4, + "dynamic_range": 152.20000000000002, + "mean_gray": 82.58959537572254, + "std_gray": 47.5141513006885 + }, + "geometry": { + "distance_to_center_norm": 0.3112664520740509, + "distance_to_border_px": 281.0 + }, + "edge_ratio": 2.685609775888021, + "edge_lengths_px": [ + 24.020824432373047, + 8.9442720413208, + 24.0, + 9.848857879638672 + ] + }, + "confidence": 0.05014379522882766 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 654.0, + 499.0 + ], + [ + 698.0, + 556.0 + ], + [ + 590.0, + 842.0 + ], + [ + 598.0, + 539.0 + ] + ], + "center_px": [ + 635.0, + 609.0 + ], + "area_px": 17694.0 + }, + { + "image_points_px": [ + [ + 271.0, + 343.0 + ], + [ + 284.0, + 512.0 + ], + [ + 201.0, + 514.0 + ], + [ + 187.0, + 354.0 + ] + ], + "center_px": [ + 235.75, + 430.75 + ], + "area_px": 13823.5 + }, + { + "image_points_px": [ + [ + 752.0, + 910.0 + ], + [ + 871.0, + 937.0 + ], + [ + 872.0, + 1014.0 + ], + [ + 748.0, + 1040.0 + ] + ], + "center_px": [ + 810.75, + 975.25 + ], + "area_px": 12576.0 + }, + { + "image_points_px": [ + [ + 499.0, + 347.0 + ], + [ + 610.0, + 351.0 + ], + [ + 611.0, + 371.0 + ], + [ + 502.0, + 366.0 + ] + ], + "center_px": [ + 555.5, + 358.75 + ], + "area_px": 2136.0 + }, + { + "image_points_px": [ + [ + 766.0, + 772.0 + ], + [ + 745.0, + 856.0 + ], + [ + 729.0, + 867.0 + ], + [ + 753.0, + 779.0 + ] + ], + "center_px": [ + 748.25, + 818.5 + ], + "area_px": 1044.5 + }, + { + "image_points_px": [ + [ + 163.0, + 164.0 + ], + [ + 183.0, + 165.0 + ], + [ + 187.0, + 250.0 + ], + [ + 167.0, + 249.0 + ] + ], + "center_px": [ + 175.0, + 207.0 + ], + "area_px": 1696.0 + }, + { + "image_points_px": [ + [ + 1647.0, + 668.0 + ], + [ + 1585.0, + 690.0 + ], + [ + 1557.0, + 684.0 + ], + [ + 1620.0, + 663.0 + ] + ], + "center_px": [ + 1602.25, + 676.25 + ], + "area_px": 935.0 + }, + { + "image_points_px": [ + [ + 1658.0, + 707.0 + ], + [ + 1682.0, + 708.0 + ], + [ + 1728.0, + 723.0 + ], + [ + 1704.0, + 722.0 + ] + ], + "center_px": [ + 1693.0, + 715.0 + ], + "area_px": 314.0 + }, + { + "image_points_px": [ + [ + 810.0, + 261.0 + ], + [ + 814.0, + 291.0 + ], + [ + 808.0, + 328.0 + ], + [ + 793.0, + 309.0 + ] + ], + "center_px": [ + 806.25, + 297.25 + ], + "area_px": 685.5 + }, + { + "image_points_px": [ + [ + 33.0, + 190.0 + ], + [ + 77.0, + 190.0 + ], + [ + 80.0, + 214.0 + ], + [ + 35.0, + 214.0 + ] + ], + "center_px": [ + 56.25, + 202.0 + ], + "area_px": 1068.0 + }, + { + "image_points_px": [ + [ + 255.0, + 1039.0 + ], + [ + 272.0, + 1019.0 + ], + [ + 310.0, + 1021.0 + ], + [ + 293.0, + 1040.0 + ] + ], + "center_px": [ + 282.5, + 1029.75 + ], + "area_px": 766.5 + }, + { + "image_points_px": [ + [ + 1325.0, + 276.0 + ], + [ + 1344.0, + 309.0 + ], + [ + 1345.0, + 325.0 + ], + [ + 1326.0, + 316.0 + ] + ], + "center_px": [ + 1335.0, + 306.5 + ], + "area_px": 511.0 + }, + { + "image_points_px": [ + [ + 176.0, + 170.0 + ], + [ + 179.0, + 218.0 + ], + [ + 171.0, + 208.0 + ], + [ + 169.0, + 178.0 + ] + ], + "center_px": [ + 173.75, + 193.5 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 449.0, + 895.0 + ], + [ + 460.0, + 883.0 + ], + [ + 490.0, + 884.0 + ], + [ + 480.0, + 896.0 + ] + ], + "center_px": [ + 469.75, + 889.5 + ], + "area_px": 376.5 + }, + { + "image_points_px": [ + [ + 761.0, + 397.0 + ], + [ + 754.0, + 434.0 + ], + [ + 748.0, + 436.0 + ], + [ + 755.0, + 400.0 + ] + ], + "center_px": [ + 754.5, + 416.75 + ], + "area_px": 201.5 + }, + { + "image_points_px": [ + [ + 505.0, + 851.0 + ], + [ + 514.0, + 841.0 + ], + [ + 542.0, + 841.0 + ], + [ + 534.0, + 852.0 + ] + ], + "center_px": [ + 523.75, + 846.25 + ], + "area_px": 303.5 + }, + { + "image_points_px": [ + [ + 449.0, + 552.0 + ], + [ + 484.0, + 551.0 + ], + [ + 490.0, + 554.0 + ], + [ + 475.0, + 557.0 + ] + ], + "center_px": [ + 474.5, + 553.5 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1203.0, + 867.0 + ], + [ + 1230.0, + 868.0 + ], + [ + 1237.0, + 880.0 + ], + [ + 1208.0, + 879.0 + ] + ], + "center_px": [ + 1219.5, + 873.5 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 840.0, + 770.0 + ], + [ + 870.0, + 770.0 + ], + [ + 870.0, + 780.0 + ], + [ + 839.0, + 779.0 + ] + ], + "center_px": [ + 854.75, + 774.75 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 1143.0, + 856.0 + ], + [ + 1171.0, + 857.0 + ], + [ + 1176.0, + 867.0 + ], + [ + 1147.0, + 867.0 + ] + ], + "center_px": [ + 1159.25, + 861.75 + ], + "area_px": 297.0 + }, + { + "image_points_px": [ + [ + 1784.0, + 726.0 + ], + [ + 1808.0, + 727.0 + ], + [ + 1822.0, + 734.0 + ], + [ + 1795.0, + 732.0 + ] + ], + "center_px": [ + 1802.25, + 729.75 + ], + "area_px": 147.0 + }, + { + "image_points_px": [ + [ + 1715.0, + 731.0 + ], + [ + 1741.0, + 733.0 + ], + [ + 1752.0, + 740.0 + ], + [ + 1725.0, + 738.0 + ] + ], + "center_px": [ + 1733.25, + 735.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1662.0, + 729.0 + ], + [ + 1687.0, + 731.0 + ], + [ + 1699.0, + 737.0 + ], + [ + 1673.0, + 737.0 + ] + ], + "center_px": [ + 1680.25, + 733.5 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 1770.0, + 733.0 + ], + [ + 1795.0, + 735.0 + ], + [ + 1807.0, + 741.0 + ], + [ + 1781.0, + 740.0 + ] + ], + "center_px": [ + 1788.25, + 737.25 + ], + "area_px": 148.5 + }, + { + "image_points_px": [ + [ + 830.0, + 826.0 + ], + [ + 859.0, + 827.0 + ], + [ + 857.0, + 837.0 + ], + [ + 829.0, + 836.0 + ] + ], + "center_px": [ + 843.75, + 831.5 + ], + "area_px": 286.5 + }, + { + "image_points_px": [ + [ + 1239.0, + 824.0 + ], + [ + 1265.0, + 825.0 + ], + [ + 1272.0, + 834.0 + ], + [ + 1245.0, + 834.0 + ] + ], + "center_px": [ + 1255.25, + 829.25 + ], + "area_px": 248.5 + }, + { + "image_points_px": [ + [ + 691.0, + 421.0 + ], + [ + 686.0, + 454.0 + ], + [ + 682.0, + 456.0 + ], + [ + 687.0, + 423.0 + ] + ], + "center_px": [ + 686.5, + 438.5 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 1731.0, + 724.0 + ], + [ + 1756.0, + 726.0 + ], + [ + 1767.0, + 732.0 + ], + [ + 1740.0, + 730.0 + ] + ], + "center_px": [ + 1748.5, + 728.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 503.0, + 818.0 + ], + [ + 496.0, + 826.0 + ], + [ + 469.0, + 826.0 + ], + [ + 476.0, + 818.0 + ] + ], + "center_px": [ + 486.0, + 822.0 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 1608.0, + 726.0 + ], + [ + 1634.0, + 729.0 + ], + [ + 1643.0, + 735.0 + ], + [ + 1618.0, + 734.0 + ] + ], + "center_px": [ + 1625.75, + 731.0 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 1678.0, + 722.0 + ], + [ + 1703.0, + 724.0 + ], + [ + 1713.0, + 731.0 + ], + [ + 1688.0, + 729.0 + ] + ], + "center_px": [ + 1695.5, + 726.5 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 491.0, + 799.0 + ], + [ + 500.0, + 789.0 + ], + [ + 524.0, + 791.0 + ], + [ + 517.0, + 799.0 + ] + ], + "center_px": [ + 508.0, + 794.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 1141.0, + 812.0 + ], + [ + 1168.0, + 813.0 + ], + [ + 1171.0, + 823.0 + ], + [ + 1144.0, + 821.0 + ] + ], + "center_px": [ + 1156.0, + 817.25 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 1746.0, + 717.0 + ], + [ + 1769.0, + 719.0 + ], + [ + 1781.0, + 726.0 + ], + [ + 1755.0, + 723.0 + ] + ], + "center_px": [ + 1762.75, + 721.25 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 631.0, + 210.0 + ], + [ + 635.0, + 223.0 + ], + [ + 634.0, + 246.0 + ], + [ + 630.0, + 240.0 + ] + ], + "center_px": [ + 632.5, + 229.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 1760.0, + 711.0 + ], + [ + 1784.0, + 712.0 + ], + [ + 1795.0, + 719.0 + ], + [ + 1769.0, + 716.0 + ] + ], + "center_px": [ + 1777.0, + 714.5 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 1589.0, + 711.0 + ], + [ + 1614.0, + 713.0 + ], + [ + 1623.0, + 719.0 + ], + [ + 1598.0, + 718.0 + ] + ], + "center_px": [ + 1606.0, + 715.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1625.0, + 720.0 + ], + [ + 1650.0, + 722.0 + ], + [ + 1659.0, + 728.0 + ], + [ + 1633.0, + 726.0 + ] + ], + "center_px": [ + 1641.75, + 724.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 1709.0, + 709.0 + ], + [ + 1734.0, + 711.0 + ], + [ + 1743.0, + 717.0 + ], + [ + 1719.0, + 715.0 + ] + ], + "center_px": [ + 1726.25, + 713.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 1078.0, + 801.0 + ], + [ + 1103.0, + 802.0 + ], + [ + 1107.0, + 811.0 + ], + [ + 1081.0, + 811.0 + ] + ], + "center_px": [ + 1092.25, + 806.25 + ], + "area_px": 240.5 + }, + { + "image_points_px": [ + [ + 1738.0, + 697.0 + ], + [ + 1761.0, + 698.0 + ], + [ + 1772.0, + 704.0 + ], + [ + 1747.0, + 702.0 + ] + ], + "center_px": [ + 1754.5, + 700.25 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 1724.0, + 703.0 + ], + [ + 1749.0, + 705.0 + ], + [ + 1758.0, + 710.0 + ], + [ + 1733.0, + 708.0 + ] + ], + "center_px": [ + 1741.0, + 706.5 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 1642.0, + 713.0 + ], + [ + 1664.0, + 715.0 + ], + [ + 1675.0, + 722.0 + ], + [ + 1649.0, + 719.0 + ] + ], + "center_px": [ + 1657.5, + 717.25 + ], + "area_px": 133.5 + }, + { + "image_points_px": [ + [ + 1038.0, + 802.0 + ], + [ + 1064.0, + 803.0 + ], + [ + 1066.0, + 811.0 + ], + [ + 1039.0, + 811.0 + ] + ], + "center_px": [ + 1051.75, + 806.75 + ], + "area_px": 224.5 + }, + { + "image_points_px": [ + [ + 1606.0, + 705.0 + ], + [ + 1631.0, + 707.0 + ], + [ + 1639.0, + 713.0 + ], + [ + 1615.0, + 711.0 + ] + ], + "center_px": [ + 1622.75, + 709.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 505.0, + 769.0 + ], + [ + 512.0, + 760.0 + ], + [ + 536.0, + 762.0 + ], + [ + 530.0, + 769.0 + ] + ], + "center_px": [ + 520.75, + 765.0 + ], + "area_px": 202.5 + }, + { + "image_points_px": [ + [ + 936.0, + 789.0 + ], + [ + 961.0, + 789.0 + ], + [ + 962.0, + 798.0 + ], + [ + 936.0, + 798.0 + ] + ], + "center_px": [ + 948.75, + 793.5 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 1688.0, + 695.0 + ], + [ + 1712.0, + 697.0 + ], + [ + 1721.0, + 702.0 + ], + [ + 1696.0, + 700.0 + ] + ], + "center_px": [ + 1704.25, + 698.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 1572.0, + 697.0 + ], + [ + 1597.0, + 699.0 + ], + [ + 1604.0, + 704.0 + ], + [ + 1579.0, + 703.0 + ] + ], + "center_px": [ + 1588.0, + 700.75 + ], + "area_px": 127.0 + }, + { + "image_points_px": [ + [ + 1623.0, + 699.0 + ], + [ + 1647.0, + 701.0 + ], + [ + 1655.0, + 707.0 + ], + [ + 1630.0, + 704.0 + ] + ], + "center_px": [ + 1638.75, + 702.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 1575.0, + 71.0 + ], + [ + 1562.0, + 79.0 + ], + [ + 1547.0, + 84.0 + ], + [ + 1544.0, + 82.0 + ] + ], + "center_px": [ + 1557.0, + 79.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 1654.0, + 687.0 + ], + [ + 1677.0, + 689.0 + ], + [ + 1686.0, + 695.0 + ], + [ + 1662.0, + 692.0 + ] + ], + "center_px": [ + 1669.75, + 690.75 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 1703.0, + 689.0 + ], + [ + 1726.0, + 691.0 + ], + [ + 1735.0, + 696.0 + ], + [ + 1712.0, + 694.0 + ] + ], + "center_px": [ + 1719.0, + 692.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 182.0, + 7.0 + ], + [ + 188.0, + 26.0 + ], + [ + 187.0, + 38.0 + ], + [ + 181.0, + 35.0 + ] + ], + "center_px": [ + 184.5, + 26.5 + ], + "area_px": 131.0 + }, + { + "image_points_px": [ + [ + 530.0, + 754.0 + ], + [ + 536.0, + 747.0 + ], + [ + 559.0, + 747.0 + ], + [ + 553.0, + 755.0 + ] + ], + "center_px": [ + 544.5, + 750.75 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 1589.0, + 691.0 + ], + [ + 1613.0, + 693.0 + ], + [ + 1620.0, + 698.0 + ], + [ + 1600.0, + 697.0 + ] + ], + "center_px": [ + 1605.5, + 694.75 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 1129.0, + 766.0 + ], + [ + 1153.0, + 768.0 + ], + [ + 1156.0, + 775.0 + ], + [ + 1132.0, + 775.0 + ] + ], + "center_px": [ + 1142.5, + 771.0 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 1605.0, + 686.0 + ], + [ + 1628.0, + 687.0 + ], + [ + 1636.0, + 692.0 + ], + [ + 1613.0, + 691.0 + ] + ], + "center_px": [ + 1620.5, + 689.0 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 1718.0, + 684.0 + ], + [ + 1740.0, + 685.0 + ], + [ + 1749.0, + 690.0 + ], + [ + 1729.0, + 689.0 + ] + ], + "center_px": [ + 1734.0, + 687.0 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 1669.0, + 682.0 + ], + [ + 1689.0, + 683.0 + ], + [ + 1700.0, + 688.0 + ], + [ + 1681.0, + 687.0 + ] + ], + "center_px": [ + 1684.75, + 685.0 + ], + "area_px": 86.0 + }, + { + "image_points_px": [ + [ + 1556.0, + 683.0 + ], + [ + 1579.0, + 685.0 + ], + [ + 1586.0, + 690.0 + ], + [ + 1563.0, + 689.0 + ] + ], + "center_px": [ + 1571.0, + 686.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 1621.0, + 680.0 + ], + [ + 1640.0, + 681.0 + ], + [ + 1651.0, + 687.0 + ], + [ + 1628.0, + 685.0 + ] + ], + "center_px": [ + 1635.0, + 683.25 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 93.0, + 802.0 + ], + [ + 96.0, + 799.0 + ], + [ + 123.0, + 800.0 + ], + [ + 119.0, + 803.0 + ] + ], + "center_px": [ + 107.75, + 801.0 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 1134.0, + 751.0 + ], + [ + 1156.0, + 750.0 + ], + [ + 1162.0, + 757.0 + ], + [ + 1139.0, + 757.0 + ] + ], + "center_px": [ + 1147.75, + 753.75 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1079.0, + 756.0 + ], + [ + 1102.0, + 757.0 + ], + [ + 1105.0, + 764.0 + ], + [ + 1081.0, + 763.0 + ] + ], + "center_px": [ + 1091.75, + 760.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 1541.0, + 671.0 + ], + [ + 1564.0, + 672.0 + ], + [ + 1570.0, + 677.0 + ], + [ + 1547.0, + 676.0 + ] + ], + "center_px": [ + 1555.5, + 674.0 + ], + "area_px": 109.0 + }, + { + "image_points_px": [ + [ + 1637.0, + 674.0 + ], + [ + 1656.0, + 676.0 + ], + [ + 1666.0, + 681.0 + ], + [ + 1644.0, + 680.0 + ] + ], + "center_px": [ + 1650.75, + 677.75 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 1177.0, + 745.0 + ], + [ + 1199.0, + 745.0 + ], + [ + 1203.0, + 753.0 + ], + [ + 1181.0, + 752.0 + ] + ], + "center_px": [ + 1190.0, + 748.75 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 1619.0, + 662.0 + ], + [ + 1641.0, + 664.0 + ], + [ + 1648.0, + 668.0 + ], + [ + 1626.0, + 667.0 + ] + ], + "center_px": [ + 1633.5, + 665.25 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 1665.0, + 664.0 + ], + [ + 1688.0, + 666.0 + ], + [ + 1694.0, + 670.0 + ], + [ + 1673.0, + 669.0 + ] + ], + "center_px": [ + 1680.0, + 667.25 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 1651.0, + 670.0 + ], + [ + 1673.0, + 671.0 + ], + [ + 1680.0, + 676.0 + ], + [ + 1659.0, + 674.0 + ] + ], + "center_px": [ + 1665.75, + 672.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 1527.0, + 659.0 + ], + [ + 1549.0, + 660.0 + ], + [ + 1555.0, + 665.0 + ], + [ + 1533.0, + 664.0 + ] + ], + "center_px": [ + 1541.0, + 662.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 1605.0, + 667.0 + ], + [ + 1626.0, + 669.0 + ], + [ + 1633.0, + 674.0 + ], + [ + 1611.0, + 672.0 + ] + ], + "center_px": [ + 1618.75, + 670.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 1558.0, + 666.0 + ], + [ + 1580.0, + 667.0 + ], + [ + 1586.0, + 672.0 + ], + [ + 1563.0, + 670.0 + ] + ], + "center_px": [ + 1571.75, + 668.75 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 1574.0, + 660.0 + ], + [ + 1595.0, + 662.0 + ], + [ + 1601.0, + 667.0 + ], + [ + 1579.0, + 665.0 + ] + ], + "center_px": [ + 1587.25, + 663.5 + ], + "area_px": 96.5 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam2_camera_pose.json b/test/y-axis-finder-examples/20260612_190019/cam2_camera_pose.json new file mode 100644 index 0000000..911c6d2 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190019/cam2_camera_pose.json @@ -0,0 +1,383 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:00:31Z", + "source": { + "detection_json": "/app/data/board/20260612_190019/cam2_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam2", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 13, + "used_marker_ids": [ + 82, + 55, + 97, + 79, + 86, + 54, + 215, + 47, + 96, + 84, + 62, + 0, + 48 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.009716206434249548, + 0.0015911016344702215, + 0.001466424120315349, + 0.0014664222097830186 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 2.8913387746849297, + "residual_median_px": 1.4771728969567979, + "residual_max_px": 6.979209801584479, + "sigma2_normalized": 2.795512326392338e-06 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.019326819106936455, + -0.9995117783546448, + 0.02454984001815319 + ], + [ + -0.1794099509716034, + -0.020688839256763458, + -0.9835568070411682 + ], + [ + 0.9835845232009888, + -0.023413510993123055, + -0.17892251908779144 + ] + ], + "translation_m": [ + -0.06720077991485596, + 0.3105297386646271, + 0.6488267779350281 + ], + "rvec_rad": [ + 1.3480273366855815, + -1.3464708466594553, + 1.151411088487507 + ] + }, + "camera_in_world": { + "position_m": [ + -0.5837626457214355, + -0.04555215314030647, + 0.42316314578056335 + ], + "position_mm": [ + -583.7626342773438, + -45.552154541015625, + 423.16314697265625 + ], + "orientation_deg": { + "roll": -172.5447235107422, + "pitch": -79.60414123535156, + "yaw": -96.14842987060547 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 2.0367228064551632e-05, + -1.2187859963869738e-05, + -1.1093376067391107e-05, + -1.2294135068985496e-06, + 7.661101772070765e-06, + 1.8134836025409103e-06 + ], + [ + -1.2187859963869726e-05, + 2.5717640366998433e-05, + -6.872293707873139e-06, + -7.226012794771124e-06, + -7.803110380202457e-06, + -1.898648447683659e-06 + ], + [ + -1.1093376067391206e-05, + -6.872293707873177e-06, + 3.6646680518964816e-05, + 1.1560149616625154e-05, + -4.304462885234192e-06, + -9.406591865646356e-07 + ], + [ + -1.2294135068985848e-06, + -7.22601279477114e-06, + 1.1560149616625163e-05, + 4.966874182730818e-06, + 3.3798680910057096e-07, + 1.7204204086133662e-07 + ], + [ + 7.661101772070777e-06, + -7.803110380202462e-06, + -4.304462885234182e-06, + 3.3798680910057605e-07, + 4.238359895770475e-06, + 1.884024503119572e-06 + ], + [ + 1.8134836025409236e-06, + -1.8986484476836522e-06, + -9.406591865646636e-07, + 1.720420408613272e-07, + 1.8840245031195756e-06, + 3.7821436142086905e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.2585762278757417, + 0.29056158229212065, + 0.3468486060437743 + ], + "tvec_std_m": [ + 0.002228648510360218, + 0.0020587277371645033, + 0.001944773409476973 + ] + }, + "camera_center_std_m": [ + 0.0029006832030301056, + 0.006279494567851161, + 0.005068452592102307 + ], + "camera_center_std_mm": [ + 2.9006832030301055, + 6.279494567851161, + 5.0684525921023065 + ], + "orientation_std_deg": { + "roll": 1.721066965026385, + "pitch": 0.3408447415595661, + "yaw": 1.5745107066700454 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 82, + "observed_center_px": [ + 337.25, + 1033.75 + ], + "projected_center_px": [ + 335.0711669921875, + 1033.1549072265625 + ], + "reprojection_error_px": 2.2586386795879507, + "confidence": 0.23052801076681903 + }, + { + "marker_id": 55, + "observed_center_px": [ + 1209.5, + 1005.0 + ], + "projected_center_px": [ + 1208.7025146484375, + 1005.1795043945312 + ], + "reprojection_error_px": 0.8174378958751514, + "confidence": 0.20766666666666667 + }, + { + "marker_id": 97, + "observed_center_px": [ + 1345.0, + 993.75 + ], + "projected_center_px": [ + 1344.606201171875, + 993.5772094726562 + ], + "reprojection_error_px": 0.4300396300021133, + "confidence": 0.20393069134818181 + }, + { + "marker_id": 79, + "observed_center_px": [ + 1052.75, + 981.0 + ], + "projected_center_px": [ + 1050.9676513671875, + 980.423828125 + ], + "reprojection_error_px": 1.8731632813050771, + "confidence": 0.1601941918267144 + }, + { + "marker_id": 86, + "observed_center_px": [ + 425.75, + 931.0 + ], + "projected_center_px": [ + 425.39044189453125, + 930.6254272460938 + ], + "reprojection_error_px": 0.5192174680971249, + "confidence": 0.18742784253946276 + }, + { + "marker_id": 54, + "observed_center_px": [ + 1289.75, + 967.25 + ], + "projected_center_px": [ + 1288.624755859375, + 966.2073364257812 + ], + "reprojection_error_px": 1.534054009809796, + "confidence": 0.16854198847567486 + }, + { + "marker_id": 215, + "observed_center_px": [ + 955.25, + 944.5 + ], + "projected_center_px": [ + 960.2931518554688, + 948.2427368164062 + ], + "reprojection_error_px": 6.280243587170858, + "confidence": 0.1576499545037774 + }, + { + "marker_id": 47, + "observed_center_px": [ + 1226.75, + 964.5 + ], + "projected_center_px": [ + 1226.192138671875, + 963.2927856445312 + ], + "reprojection_error_px": 1.3298781002284452, + "confidence": 0.15917913885677562 + }, + { + "marker_id": 96, + "observed_center_px": [ + 1083.5, + 944.0 + ], + "projected_center_px": [ + 1082.2056884765625, + 943.108642578125 + ], + "reprojection_error_px": 1.5715471272713233, + "confidence": 0.1459233900243923 + }, + { + "marker_id": 84, + "observed_center_px": [ + 490.5, + 905.5 + ], + "projected_center_px": [ + 490.6635437011719, + 905.3240966796875 + ], + "reprojection_error_px": 0.24018434647153325, + "confidence": 0.14758801651000977 + }, + { + "marker_id": 62, + "observed_center_px": [ + 1063.75, + 922.0 + ], + "projected_center_px": [ + 1062.477783203125, + 921.4132690429688 + ], + "reprojection_error_px": 1.400995643886765, + "confidence": 0.11147160908708433 + }, + { + "marker_id": 0, + "observed_center_px": [ + 955.0, + 846.5 + ], + "projected_center_px": [ + 961.4362182617188, + 849.198974609375 + ], + "reprojection_error_px": 6.979209801584479, + "confidence": 0.08099931081136068 + }, + { + "marker_id": 48, + "observed_center_px": [ + 1190.0, + 794.25 + ], + "projected_center_px": [ + 1188.8980712890625, + 793.2662353515625 + ], + "reprojection_error_px": 1.4771728969567979, + "confidence": 0.05014379522882766 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190019/cam2_debug.jpg b/test/y-axis-finder-examples/20260612_190019/cam2_debug.jpg new file mode 100644 index 0000000..40cf0d6 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190019/cam2_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.csv b/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.csv new file mode 100644 index 0000000..a8cf9e9 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.csv @@ -0,0 +1,25 @@ +marker_id,link,set,num_cameras,x_mm,y_mm,z_mm,nx,ny,nz,model_x_mm,model_y_mm,model_z_mm,dist_to_model_mm,delta_z_mm,edge_length_mm +0,Board,rail,2,495.9,-96.39,-9.82,-0.01124,0.05778,0.99827,494.12,-100.21,-9.76,4.22,-0.059,23.24 +17,unknown,,2,1453.08,994.38,541.24,-0.9541,0.29947,0.00433,,,,,,76.69 +62,Board,A0,2,400.81,-173.86,-28.11,0.03493,0.00934,0.99935,400.76,-173.44,-28.11,0.423,-0.002,23.6 +79,Board,A0,2,309.04,-155.69,-29.37,-0.03701,0.03277,0.99878,308.77,-155.27,-29.18,0.536,-0.194,22.93 +82,Board,A0,2,223.35,301.15,-28.28,-0.04293,0.06985,0.99663,226.44,303.15,-30.15,4.129,1.872,23.84 +83,Board,A0,2,50.86,346.6,-30.14,0.13079,0.06499,0.98928,52.49,349.25,-32.14,3.704,2.001,25.83 +86,Board,A0,2,368.77,293.87,-28.21,-0.07956,-0.00084,0.99683,370,294.53,-28.5,1.425,0.29,22.6 +96,Board,A0,2,364.99,-184.52,-28.65,-0.08157,0.04048,0.99584,365.58,-183.99,-28.52,0.801,-0.133,22.49 +102,Board,A0,2,640.97,-227.58,-24.05,0.01841,0.04122,0.99898,644.54,-227.1,-25.33,3.826,1.281,22.65 +180,unknown,,3,268.14,-253.19,485.78,-0.59922,0.2494,0.76075,,,,,,24.1 +189,unknown,,3,260.42,-263.46,450.32,-0.98723,0.14058,0.07495,,,,,,23.59 +196,unknown,,2,236.56,-246.32,451.8,-0.3094,-0.77924,0.54503,,,,,,23.4 +197,unknown,,2,139.09,-30.33,249.54,-0.99633,0.07761,0.03607,,,,,,24.63 +201,unknown,,2,78.99,56.65,92.9,-0.99952,0.01599,0.02642,,,,,,24.6 +204,unknown,,2,117.44,128.54,111.26,0.02861,0.05054,0.99831,,,,,,24.38 +211,Board,rail,2,319.86,-2.52,-7.75,-0.02829,-0.01557,0.99948,321.45,-2.7,-10.7,3.361,2.953,21.9 +218,unknown,,3,243.68,-101.89,336.62,-0.91224,0.31518,0.26169,,,,,,24.04 +219,unknown,,3,244.01,-176.41,413.25,-0.9323,0.27355,0.23663,,,,,,23.97 +243,unknown,,2,184.27,-55.74,277.29,0.08467,-0.62817,0.77346,,,,,,24.23 + +camera_id,x_mm,y_mm,z_mm,dir_x,dir_y,dir_z +cam0,-717.8,-497.64,666.57,0.85497,0.41127,-0.31606 +cam1,-268.29,-544.35,839.26,0.50671,0.62784,-0.59081 +cam2,-583.53,-42.61,424.28,0.98339,-0.02549,-0.17971 diff --git a/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.json b/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.json new file mode 100644 index 0000000..676b7c0 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/aruco_marker_poses.json @@ -0,0 +1,903 @@ +{ + "schema_version": "1.1", + "stage": "corner_marker_poses", + "created_utc": "2026-06-12T19:01:13Z", + "summary": { + "num_cameras": 3, + "num_markers": 19 + }, + "cameras": [ + { + "camera_id": "cam0", + "position_m": [ + -0.7177989697512599, + -0.497637294137647, + 0.6665705134157172 + ], + "position_mm": [ + -717.7989697512598, + -497.637294137647, + 666.5705134157172 + ], + "direction": [ + 0.8549650311470032, + 0.41126808524131775, + -0.3160591721534729 + ] + }, + { + "camera_id": "cam1", + "position_m": [ + -0.26828777585252084, + -0.5443487689214095, + 0.8392557799362308 + ], + "position_mm": [ + -268.28777585252084, + -544.3487689214095, + 839.2557799362307 + ], + "direction": [ + 0.5067112445831299, + 0.627842366695404, + -0.5908110737800598 + ] + }, + { + "camera_id": "cam2", + "position_m": [ + -0.5835335325974174, + -0.04260982267267188, + 0.4242815682712163 + ], + "position_mm": [ + -583.5335325974173, + -42.60982267267188, + 424.2815682712163 + ], + "direction": [ + 0.9833903312683105, + -0.025485455989837646, + -0.17970512807369232 + ] + } + ], + "markers": [ + { + "marker_id": 0, + "link": "Board", + "set": "rail", + "position_m": [ + 0.4959035140621296, + -0.09638613280068559, + -0.009819315934956847 + ], + "position_mm": [ + 495.9035140621296, + -96.38613280068559, + -9.819315934956848 + ], + "normal": [ + -0.011235720131947725, + 0.05777622465166247, + 0.9982663304239592 + ], + "corners_m": [ + [ + 0.4854179732649712, + -0.08452961572220506, + -0.010435926054871446 + ], + [ + 0.5086579328625245, + -0.08456084109706913, + -0.010546475920102829 + ], + [ + 0.5057942588039956, + -0.10829936584749572, + -0.008822313386833007 + ], + [ + 0.483743891317027, + -0.1081547085359724, + -0.009472548378020107 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.24432475344645 + }, + { + "marker_id": 17, + "link": "unknown", + "set": "", + "position_m": [ + 1.4530796672754922, + 0.9943849726065002, + 0.5412355382809938 + ], + "position_mm": [ + 1453.0796672754923, + 994.3849726065001, + 541.2355382809938 + ], + "normal": [ + -0.9540951947557637, + 0.29947217566864853, + 0.004333052532279974 + ], + "corners_m": [ + [ + 1.4590503049024712, + 1.0123975083407233, + 0.6008976632845706 + ], + [ + 1.4476408357832211, + 0.9763745707886786, + 0.5986529658316441 + ], + [ + 1.4476578818900947, + 0.9778026675516871, + 0.4823442272682128 + ], + [ + 1.4579696465261813, + 1.0109651437449119, + 0.4830472967395477 + ] + ], + "num_cameras": 2, + "edge_length_mm": 76.6926423157162 + }, + { + "marker_id": 62, + "link": "Board", + "set": "A0", + "position_m": [ + 0.40081134682469843, + -0.17385945706493294, + -0.028112226859377528 + ], + "position_mm": [ + 400.81134682469843, + -173.85945706493294, + -28.11222685937753 + ], + "normal": [ + 0.03493267902246509, + 0.009343614681925462, + 0.9993459885349963 + ], + "corners_m": [ + [ + 0.3880876196282671, + -0.18525882715713404, + -0.027459063792266748 + ], + [ + 0.3900989933029908, + -0.16150750732765035, + -0.02796277903924936 + ], + [ + 0.412686951321115, + -0.1625199649357028, + -0.028522981481499156 + ], + [ + 0.41237182304642095, + -0.18615152883924452, + -0.028504083124494855 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.603992437675593 + }, + { + "marker_id": 79, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3090390777226699, + -0.15569084205573325, + -0.029373732151658602 + ], + "position_mm": [ + 309.0390777226699, + -155.69084205573324, + -29.3737321516586 + ], + "normal": [ + -0.037010338277854715, + 0.03277287137898376, + 0.9987773394316349 + ], + "corners_m": [ + [ + 0.2973893434657985, + -0.1677642741689291, + -0.029636386537297287 + ], + [ + 0.2989560731179298, + -0.14323709298359444, + -0.02994064026529188 + ], + [ + 0.3212247199890606, + -0.14416575984111418, + -0.029525605410374627 + ], + [ + 0.3185861743178909, + -0.1675962412292952, + -0.0283922963936706 + ] + ], + "num_cameras": 2, + "edge_length_mm": 22.92767304325437 + }, + { + "marker_id": 82, + "link": "Board", + "set": "A0", + "position_m": [ + 0.2233522725634513, + 0.30114768333493946, + -0.02827846361196515 + ], + "position_mm": [ + 223.3522725634513, + 301.1476833349395, + -28.278463611965147 + ], + "normal": [ + -0.042928396210429196, + 0.0698479928278641, + 0.9966335388179143 + ], + "corners_m": [ + [ + 0.2119083759520826, + 0.28944059337069855, + -0.02857019667345116 + ], + [ + 0.21286087482222538, + 0.31397324109816344, + -0.029109820212172316 + ], + [ + 0.23695647770212067, + 0.3136250315169422, + -0.029045183764852992 + ], + [ + 0.2316833617773766, + 0.28755186735395377, + -0.026388653797384132 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.84325932265194 + }, + { + "marker_id": 83, + "link": "Board", + "set": "A0", + "position_m": [ + 0.0508574385943988, + 0.3465954768728997, + -0.030138848150202832 + ], + "position_mm": [ + 50.8574385943988, + 346.5954768728997, + -30.138848150202833 + ], + "normal": [ + 0.1307919970523133, + 0.06499300289795047, + 0.989277192237532 + ], + "corners_m": [ + [ + 0.03733953014059789, + 0.33192734074858626, + -0.027284354075789757 + ], + [ + 0.038809358202190725, + 0.35763201363086566, + -0.02937403056788247 + ], + [ + 0.06446684179512845, + 0.36103308298691805, + -0.03278158230562374 + ], + [ + 0.06281402423967813, + 0.3357894701252289, + -0.03111542565151537 + ] + ], + "num_cameras": 2, + "edge_length_mm": 25.83448154340726 + }, + { + "marker_id": 86, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3687703464972961, + 0.2938700883085349, + -0.02821048625908841 + ], + "position_mm": [ + 368.77034649729615, + 293.8700883085349, + -28.21048625908841 + ], + "normal": [ + -0.0795588649635262, + -0.0008396729962074634, + 0.9968298159440131 + ], + "corners_m": [ + [ + 0.35772120813442937, + 0.2829357386442751, + -0.029192714532217237 + ], + [ + 0.3586685461863166, + 0.30651574085843714, + -0.02891700302606048 + ], + [ + 0.38009805154613796, + 0.30509534000481814, + -0.027383703229619014 + ], + [ + 0.3785935801223003, + 0.2809335337266093, + -0.027348524248456914 + ] + ], + "num_cameras": 2, + "edge_length_mm": 22.59739516161692 + }, + { + "marker_id": 96, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3649941784371009, + -0.18451960429986458, + -0.028652559512834328 + ], + "position_mm": [ + 364.9941784371009, + -184.51960429986457, + -28.65255951283433 + ], + "normal": [ + -0.08157137096657496, + 0.0404843149726617, + 0.9958449335513174 + ], + "corners_m": [ + [ + 0.3533954488356145, + -0.19626029783840263, + -0.02898370436853248 + ], + [ + 0.35598451072264875, + -0.17201807691557355, + -0.030051120110203704 + ], + [ + 0.3758138884795852, + -0.17284155926038217, + -0.028087465737548497 + ], + [ + 0.3747828657105551, + -0.19695848318509998, + -0.027487947835052626 + ] + ], + "num_cameras": 2, + "edge_length_mm": 22.486058867893863 + }, + { + "marker_id": 102, + "link": "Board", + "set": "A0", + "position_m": [ + 0.6409676043299635, + -0.22758161673856356, + -0.02404910405599666 + ], + "position_mm": [ + 640.9676043299635, + -227.58161673856355, + -24.04910405599666 + ], + "normal": [ + 0.018405293426048745, + 0.041217884137697884, + 0.998980646059328 + ], + "corners_m": [ + [ + 0.628168914215749, + -0.2393407236418058, + -0.023004207178700217 + ], + [ + 0.6329685599187987, + -0.21502092728943362, + -0.02480231399695442 + ], + [ + 0.6520462463694006, + -0.21595696980072232, + -0.024343746755265322 + ], + [ + 0.6506866968159057, + -0.2400078462222924, + -0.02404614829306669 + ] + ], + "num_cameras": 2, + "edge_length_mm": 22.650753783906055 + }, + { + "marker_id": 180, + "link": "unknown", + "set": "", + "position_m": [ + 0.2681405508078976, + -0.25319148543602876, + 0.48578231923627885 + ], + "position_mm": [ + 268.1405508078976, + -253.19148543602876, + 485.78231923627885 + ], + "normal": [ + -0.5992178589874199, + 0.2493978498345446, + 0.760748756139922 + ], + "corners_m": [ + [ + 0.2700892609842782, + -0.26857115865948356, + 0.4927102388925223 + ], + [ + 0.2547519119632988, + -0.25844535924190054, + 0.4765951083515476 + ], + [ + 0.2656359128843578, + -0.23802903384841198, + 0.47920137945593855 + ], + [ + 0.2820851173996557, + -0.24772038999431892, + 0.494622550245107 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.099715289217816 + }, + { + "marker_id": 189, + "link": "unknown", + "set": "", + "position_m": [ + 0.26042217748224655, + -0.26346196100647173, + 0.45031604172412454 + ], + "position_mm": [ + 260.4221774822465, + -263.4619610064717, + 450.31604172412455 + ], + "normal": [ + -0.987227594389732, + 0.1405845097771574, + 0.07495113398861387 + ], + "corners_m": [ + [ + 0.26165197553771513, + -0.26516772803657895, + 0.4669678295061544 + ], + [ + 0.2578294116295362, + -0.27957805334860214, + 0.44913255454437845 + ], + [ + 0.2595524411240357, + -0.2619696438957344, + 0.4333892235539295 + ], + [ + 0.2626548816376992, + -0.24713241874497147, + 0.4517745592920358 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.590053140476307 + }, + { + "marker_id": 196, + "link": "unknown", + "set": "", + "position_m": [ + 0.23655612784702762, + -0.24631880188164235, + 0.45179609418606653 + ], + "position_mm": [ + 236.55612784702762, + -246.31880188164234, + 451.7960941860665 + ], + "normal": [ + -0.3093959639845102, + -0.7792384939691024, + 0.5450334916194243 + ], + "corners_m": [ + [ + 0.24317231820375784, + -0.23932116720592553, + 0.4650051647140232 + ], + [ + 0.2511153940572844, + -0.2540922678401282, + 0.4495068167178451 + ], + [ + 0.23033137677108564, + -0.2529271000168783, + 0.43826056308938893 + ], + [ + 0.22160542235598255, + -0.23893467246363742, + 0.45441183222300885 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.402432570606738 + }, + { + "marker_id": 197, + "link": "unknown", + "set": "", + "position_m": [ + 0.1390927380355264, + -0.03032574924044018, + 0.24953919324852158 + ], + "position_mm": [ + 139.0927380355264, + -30.32574924044018, + 249.5391932485216 + ], + "normal": [ + -0.9963315186413005, + 0.07760512074996907, + 0.03606868718573868 + ], + "corners_m": [ + [ + 0.14019399063205745, + -0.02758606226435148, + 0.2663864496298566 + ], + [ + 0.13752153621978983, + -0.04842104751128373, + 0.25229310536418786 + ], + [ + 0.13864049270376114, + -0.0319059857482782, + 0.2326340853652054 + ], + [ + 0.14001493258649725, + -0.013389901437847311, + 0.24684313263483665 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.632798408237363 + }, + { + "marker_id": 201, + "link": "unknown", + "set": "", + "position_m": [ + 0.07898787154265886, + 0.05664833220913929, + 0.09290117316376278 + ], + "position_mm": [ + 78.98787154265887, + 56.64833220913929, + 92.90117316376279 + ], + "normal": [ + -0.9995230692291366, + 0.015992005104595693, + 0.026417604953916964 + ], + "corners_m": [ + [ + 0.07913011879622174, + 0.06871582169220812, + 0.10503406906313549 + ], + [ + 0.07949730799550712, + 0.0441327838748963, + 0.1051767143553439 + ], + [ + 0.0781035414402634, + 0.04443266100494991, + 0.08123756284273835 + ], + [ + 0.07922051793864322, + 0.06931206226450284, + 0.08015634639383337 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.59517792808874 + }, + { + "marker_id": 204, + "link": "unknown", + "set": "", + "position_m": [ + 0.11743656283073742, + 0.12854485252811704, + 0.11126069978714423 + ], + "position_mm": [ + 117.43656283073742, + 128.54485252811705, + 111.26069978714423 + ], + "normal": [ + 0.02861323996080747, + 0.05054115225363077, + 0.9983120125631167 + ], + "corners_m": [ + [ + 0.10605702904788235, + 0.14077861707373582, + 0.1107149305471551 + ], + [ + 0.13017435426590937, + 0.1408153764441786, + 0.11053216173168084 + ], + [ + 0.12885401787491074, + 0.11653547481138093, + 0.11128450339217408 + ], + [ + 0.10466085013424718, + 0.11604994178317284, + 0.11251120347756696 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.376919580540658 + }, + { + "marker_id": 211, + "link": "Board", + "set": "rail", + "position_m": [ + 0.31985557163530237, + -0.0025173461535350616, + -0.007746962355359113 + ], + "position_mm": [ + 319.8555716353024, + -2.5173461535350614, + -7.746962355359114 + ], + "normal": [ + -0.028286778708723585, + -0.01557183423325681, + 0.9994785521104972 + ], + "corners_m": [ + [ + 0.3091212217364301, + 0.008720833872077775, + -0.007942728212007158 + ], + [ + 0.33030033232905726, + 0.008345577426672239, + -0.007214211962286078 + ], + [ + 0.33108110855376843, + -0.013617137550980499, + -0.00766712031613749 + ], + [ + 0.3089196239219538, + -0.013518658361909762, + -0.008163788931005724 + ] + ], + "num_cameras": 2, + "edge_length_mm": 21.896246721704113 + }, + { + "marker_id": 218, + "link": "unknown", + "set": "", + "position_m": [ + 0.24367920010615435, + -0.10188686694979668, + 0.3366198400848723 + ], + "position_mm": [ + 243.67920010615435, + -101.88686694979668, + 336.6198400848723 + ], + "normal": [ + -0.9122382900350822, + 0.31518430771955813, + 0.26168713067556865 + ], + "corners_m": [ + [ + 0.2394631684863205, + -0.10078424987771971, + 0.3205476205768951 + ], + [ + 0.2491695968190208, + -0.08563442499911075, + 0.33622990287988 + ], + [ + 0.24799911873796812, + -0.10313926043545674, + 0.3531428602120246 + ], + [ + 0.238084916381308, + -0.11798953248689951, + 0.33655897667068935 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.037172371083443 + }, + { + "marker_id": 219, + "link": "unknown", + "set": "", + "position_m": [ + 0.24401093185913197, + -0.176413105153727, + 0.4132459876213448 + ], + "position_mm": [ + 244.01093185913197, + -176.413105153727, + 413.2459876213448 + ], + "normal": [ + -0.9322987642418413, + 0.2735462737141289, + 0.23662512616003056 + ], + "corners_m": [ + [ + 0.24021281699089986, + -0.17570119334487708, + 0.3966375667026969 + ], + [ + 0.24837017691429789, + -0.1601944823619091, + 0.41250439136011297 + ], + [ + 0.24819682573920104, + -0.1770784762272216, + 0.42967908388156545 + ], + [ + 0.23926390779212897, + -0.19267826868090016, + 0.414162908541004 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.971927129304202 + }, + { + "marker_id": 243, + "link": "unknown", + "set": "", + "position_m": [ + 0.1842739129992133, + -0.055735670563343456, + 0.2772871982842746 + ], + "position_mm": [ + 184.2739129992133, + -55.735670563343454, + 277.2871982842746 + ], + "normal": [ + 0.08467046621965559, + -0.6281673922756276, + 0.773457587351617 + ], + "corners_m": [ + [ + 0.1715829589135198, + -0.04703653173211839, + 0.28570977563017796 + ], + [ + 0.19711449949834012, + -0.0463440541209715, + 0.28354074583180067 + ], + [ + 0.19648013235562867, + -0.06441447131634678, + 0.2688694493325217 + ], + [ + 0.1719180612293647, + -0.06514762508393714, + 0.2710288223425981 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.225482154873134 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam0.jpg b/test/y-axis-finder-examples/20260612_190104/cam0.jpg new file mode 100644 index 0000000..d55cb6a Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam0.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/cam0_aruco_detection.json b/test/y-axis-finder-examples/20260612_190104/cam0_aruco_detection.json new file mode 100644 index 0000000..d49ba1e --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam0_aruco_detection.json @@ -0,0 +1,2356 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:07Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam0", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam0_calibration.npz", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190104/cam0.jpg", + "image_sha256": "66a78c3c0e98a31e2918cc909389b49e3a6267c5b8f30c20f9392789804f7a06", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 20, + "num_rejected_candidates": 49 + }, + "detections": [ + { + "observation_id": "533cc954-722b-4ffa-ad63-01ca64e32cec", + "type": "aruco", + "marker_id": 17, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 363.0, + 63.0 + ], + [ + 377.0, + 64.0 + ], + [ + 385.0, + 133.0 + ], + [ + 372.0, + 132.0 + ] + ], + "center_px": [ + 374.25, + 98.0 + ], + "quality": { + "area_px": 923.0, + "perimeter_px": 166.12077236175537, + "sharpness": { + "laplacian_var": 1026.1801060177875 + }, + "contrast": { + "p05": 51.0, + "p95": 79.69999999999993, + "dynamic_range": 28.699999999999932, + "mean_gray": 63.79289026275116, + "std_gray": 9.791666590214545 + }, + "geometry": { + "distance_to_center_norm": 0.5816826820373535, + "distance_to_border_px": 63.0 + }, + "edge_ratio": 5.336886156118328, + "edge_lengths_px": [ + 14.03566837310791, + 69.46221923828125, + 13.03840446472168, + 69.58448028564453 + ] + }, + "confidence": 0.04136322695964931 + }, + { + "observation_id": "af08526a-c1e0-49eb-a41d-bc9655773c85", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 929.0, + 279.0 + ], + [ + 948.0, + 305.0 + ], + [ + 923.0, + 327.0 + ], + [ + 904.0, + 299.0 + ] + ], + "center_px": [ + 926.0, + 302.5 + ], + "quality": { + "area_px": 1074.0, + "perimeter_px": 131.35760498046875, + "sharpness": { + "laplacian_var": 2442.7493797162165 + }, + "contrast": { + "p05": 10.0, + "p95": 167.0, + "dynamic_range": 157.0, + "mean_gray": 87.48985115020298, + "std_gray": 62.35244746478915 + }, + "geometry": { + "distance_to_center_norm": 0.420754998922348, + "distance_to_border_px": 279.0 + }, + "edge_ratio": 1.0569168240553728, + "edge_lengths_px": [ + 32.202484130859375, + 33.30165100097656, + 33.83784866333008, + 32.015621185302734 + ] + }, + "confidence": 0.6774421446455168 + }, + { + "observation_id": "13ab45c4-e321-46db-a34a-59ac77991325", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 798.0, + 380.0 + ], + [ + 781.0, + 355.0 + ], + [ + 802.0, + 333.0 + ], + [ + 820.0, + 358.0 + ] + ], + "center_px": [ + 800.25, + 356.5 + ], + "quality": { + "area_px": 922.5, + "perimeter_px": 122.56478691101074, + "sharpness": { + "laplacian_var": 2613.2897179436823 + }, + "contrast": { + "p05": 9.649999999999999, + "p95": 172.0, + "dynamic_range": 162.35, + "mean_gray": 73.12691131498471, + "std_gray": 61.81273468103063 + }, + "geometry": { + "distance_to_center_norm": 0.2528966963291168, + "distance_to_border_px": 333.0 + }, + "edge_ratio": 1.0291165541633949, + "edge_lengths_px": [ + 30.232433319091797, + 30.4138126373291, + 30.805843353271484, + 31.11269760131836 + ] + }, + "confidence": 0.5975999487249092 + }, + { + "observation_id": "8cc3e2f6-3f2b-4eea-9522-bf1d4c20d5b4", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 936.0, + 238.0 + ], + [ + 916.0, + 266.0 + ], + [ + 891.0, + 259.0 + ], + [ + 911.0, + 233.0 + ] + ], + "center_px": [ + 913.5, + 249.0 + ], + "quality": { + "area_px": 795.0, + "perimeter_px": 118.66835021972656, + "sharpness": { + "laplacian_var": 4402.156452118026 + }, + "contrast": { + "p05": 59.0, + "p95": 220.0, + "dynamic_range": 161.0, + "mean_gray": 125.44280442804428, + "std_gray": 60.37346450015453 + }, + "geometry": { + "distance_to_center_norm": 0.44749870896339417, + "distance_to_border_px": 233.0 + }, + "edge_ratio": 1.3496438258026955, + "edge_lengths_px": [ + 34.4093017578125, + 25.961509704589844, + 32.80244064331055, + 25.495098114013672 + ] + }, + "confidence": 0.3926961987061917 + }, + { + "observation_id": "b64bd3bf-8426-4d82-8519-37d30bea73ac", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 573.0, + 582.0 + ], + [ + 598.0, + 603.0 + ], + [ + 581.0, + 625.0 + ], + [ + 558.0, + 604.0 + ] + ], + "center_px": [ + 577.5, + 603.5 + ], + "quality": { + "area_px": 864.0, + "perimeter_px": 118.22440910339355, + "sharpness": { + "laplacian_var": 2600.075155583897 + }, + "contrast": { + "p05": 9.0, + "p95": 156.0, + "dynamic_range": 147.0, + "mean_gray": 86.0704467353952, + "std_gray": 56.38082513369021 + }, + "geometry": { + "distance_to_center_norm": 0.17301778495311737, + "distance_to_border_px": 335.0 + }, + "edge_ratio": 1.2261834946306458, + "edge_lengths_px": [ + 32.649654388427734, + 27.80287742614746, + 31.14482307434082, + 26.62705421447754 + ] + }, + "confidence": 0.46975024743217914 + }, + { + "observation_id": "d55795e4-8552-4d20-b98c-b851c4a59256", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 442.0, + 797.0 + ], + [ + 470.0, + 801.0 + ], + [ + 472.0, + 830.0 + ], + [ + 445.0, + 826.0 + ] + ], + "center_px": [ + 457.25, + 813.5 + ], + "quality": { + "area_px": 787.5, + "perimeter_px": 113.80260276794434, + "sharpness": { + "laplacian_var": 3000.207734573119 + }, + "contrast": { + "p05": 5.0, + "p95": 150.0, + "dynamic_range": 145.0, + "mean_gray": 55.75091575091575, + "std_gray": 51.92975892297944 + }, + "geometry": { + "distance_to_center_norm": 0.4753614068031311, + "distance_to_border_px": 130.0 + }, + "edge_ratio": 1.0681478073415351, + "edge_lengths_px": [ + 28.284271240234375, + 29.068883895874023, + 27.294687271118164, + 29.154760360717773 + ] + }, + "confidence": 0.49150501119002327 + }, + { + "observation_id": "1d61cd67-fa7e-4eed-921e-9237de2e3440", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 708.0, + 474.0 + ], + [ + 693.0, + 450.0 + ], + [ + 712.0, + 430.0 + ], + [ + 727.0, + 456.0 + ] + ], + "center_px": [ + 710.0, + 452.5 + ], + "quality": { + "area_px": 760.0, + "perimeter_px": 112.07733917236328, + "sharpness": { + "laplacian_var": 2031.6602329313962 + }, + "contrast": { + "p05": 8.0, + "p95": 173.0, + "dynamic_range": 165.0, + "mean_gray": 68.642166344294, + "std_gray": 61.90178782651864 + }, + "geometry": { + "distance_to_center_norm": 0.09401005506515503, + "distance_to_border_px": 430.0 + }, + "edge_ratio": 1.1468777351290962, + "edge_lengths_px": [ + 28.301942825317383, + 27.58622932434082, + 30.01666259765625, + 26.172504425048828 + ] + }, + "confidence": 0.44177914623971204 + }, + { + "observation_id": "08aaa635-1a06-4e6a-aad8-15487b28cd58", + "type": "aruco", + "marker_id": 196, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 880.0, + 290.0 + ], + [ + 904.0, + 310.0 + ], + [ + 896.0, + 333.0 + ], + [ + 872.0, + 312.0 + ] + ], + "center_px": [ + 888.0, + 311.25 + ], + "quality": { + "area_px": 704.0, + "perimeter_px": 110.89242744445801, + "sharpness": { + "laplacian_var": 6050.35317169862 + }, + "contrast": { + "p05": 43.800000000000004, + "p95": 241.0, + "dynamic_range": 197.2, + "mean_gray": 130.01492537313433, + "std_gray": 76.17607948957259 + }, + "geometry": { + "distance_to_center_norm": 0.3749594986438751, + "distance_to_border_px": 290.0 + }, + "edge_ratio": 1.362292044978733, + "edge_lengths_px": [ + 31.240999221801758, + 24.351591110229492, + 31.890438079833984, + 23.409399032592773 + ] + }, + "confidence": 0.344517414649265 + }, + { + "observation_id": "85cb7145-d1c7-441f-b9f6-030019ca2879", + "type": "aruco", + "marker_id": 52, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 324.0, + 912.0 + ], + [ + 301.0, + 906.0 + ], + [ + 318.0, + 890.0 + ], + [ + 341.0, + 895.0 + ] + ], + "center_px": [ + 321.0, + 900.75 + ], + "quality": { + "area_px": 473.0, + "perimeter_px": 94.69379806518555, + "sharpness": { + "laplacian_var": 3051.0725301775146 + }, + "contrast": { + "p05": 4.0, + "p95": 167.8, + "dynamic_range": 163.8, + "mean_gray": 66.43076923076923, + "std_gray": 57.26402259729637 + }, + "geometry": { + "distance_to_center_norm": 0.6600089073181152, + "distance_to_border_px": 48.0 + }, + "edge_ratio": 1.0298302391077767, + "edge_lengths_px": [ + 23.76972770690918, + 23.34523582458496, + 23.53720474243164, + 24.041629791259766 + ] + }, + "confidence": 0.2939513606264565 + }, + { + "observation_id": "3496a546-2b5a-49aa-b016-c615ca3bf9af", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 161.0, + 916.0 + ], + [ + 138.0, + 911.0 + ], + [ + 157.0, + 896.0 + ], + [ + 179.0, + 901.0 + ] + ], + "center_px": [ + 158.75, + 906.0 + ], + "quality": { + "area_px": 430.0, + "perimeter_px": 93.73641967773438, + "sharpness": { + "laplacian_var": 3503.664749837198 + }, + "contrast": { + "p05": 23.0, + "p95": 198.0, + "dynamic_range": 175.0, + "mean_gray": 117.34883720930233, + "std_gray": 61.853496722396 + }, + "geometry": { + "distance_to_center_norm": 0.8033888936042786, + "distance_to_border_px": 44.0 + }, + "edge_ratio": 1.0729758423654916, + "edge_lengths_px": [ + 23.53720474243164, + 24.20743751525879, + 22.56102752685547, + 23.430749893188477 + ] + }, + "confidence": 0.23510936286367592 + }, + { + "observation_id": "2c73b702-0ffc-40e7-b0a4-a1cd8f8fbc71", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 609.0, + 543.0 + ], + [ + 623.0, + 534.0 + ], + [ + 645.0, + 554.0 + ], + [ + 632.0, + 563.0 + ] + ], + "center_px": [ + 627.25, + 548.5 + ], + "quality": { + "area_px": 472.5, + "perimeter_px": 92.66634368896484, + "sharpness": { + "laplacian_var": 6217.374327575261 + }, + "contrast": { + "p05": 27.25, + "p95": 245.0, + "dynamic_range": 217.75, + "mean_gray": 119.84393063583815, + "std_gray": 79.36779774350644 + }, + "geometry": { + "distance_to_center_norm": 0.08709560334682465, + "distance_to_border_px": 397.0 + }, + "edge_ratio": 1.9276929826709488, + "edge_lengths_px": [ + 16.6433162689209, + 29.73213768005371, + 15.81138801574707, + 30.479501724243164 + ] + }, + "confidence": 0.1634077640120608 + }, + { + "observation_id": "9d012ad3-8a9c-4ce0-926d-266f1e5df924", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 257.0, + 876.0 + ], + [ + 235.0, + 872.0 + ], + [ + 252.0, + 857.0 + ], + [ + 273.0, + 861.0 + ] + ], + "center_px": [ + 254.25, + 866.5 + ], + "quality": { + "area_px": 388.5, + "perimeter_px": 88.34151840209961, + "sharpness": { + "laplacian_var": 3741.0708089846603 + }, + "contrast": { + "p05": 11.0, + "p95": 194.5, + "dynamic_range": 183.5, + "mean_gray": 97.96283783783784, + "std_gray": 65.68147418721763 + }, + "geometry": { + "distance_to_center_norm": 0.6825793385505676, + "distance_to_border_px": 84.0 + }, + "edge_ratio": 1.060531243896657, + "edge_lengths_px": [ + 22.360679626464844, + 22.671567916870117, + 21.3775577545166, + 21.931713104248047 + ] + }, + "confidence": 0.2442172274419462 + }, + { + "observation_id": "b591ada6-8a6e-4c3b-89f8-4675991a7c64", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 831.0, + 850.0 + ], + [ + 804.0, + 844.0 + ], + [ + 813.0, + 831.0 + ], + [ + 838.0, + 836.0 + ] + ], + "center_px": [ + 821.5, + 840.25 + ], + "quality": { + "area_px": 395.0, + "perimeter_px": 84.61759662628174, + "sharpness": { + "laplacian_var": 5306.059602649007 + }, + "contrast": { + "p05": 23.1, + "p95": 226.89999999999998, + "dynamic_range": 203.79999999999998, + "mean_gray": 126.93046357615894, + "std_gray": 73.10582775745705 + }, + "geometry": { + "distance_to_center_norm": 0.5042356848716736, + "distance_to_border_px": 110.0 + }, + "edge_ratio": 1.7670452672610437, + "edge_lengths_px": [ + 27.658634185791016, + 15.81138801574707, + 25.495098114013672, + 15.65247631072998 + ] + }, + "confidence": 0.14902466745603263 + }, + { + "observation_id": "08ff1c5a-36af-47b0-afed-7ca567ec6db3", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 881.0, + 821.0 + ], + [ + 855.0, + 816.0 + ], + [ + 862.0, + 803.0 + ], + [ + 888.0, + 807.0 + ] + ], + "center_px": [ + 871.5, + 811.75 + ], + "quality": { + "area_px": 382.5, + "perimeter_px": 83.1995964050293, + "sharpness": { + "laplacian_var": 3489.059208610467 + }, + "contrast": { + "p05": 30.0, + "p95": 224.39999999999998, + "dynamic_range": 194.39999999999998, + "mean_gray": 115.98293515358361, + "std_gray": 75.49642114962761 + }, + "geometry": { + "distance_to_center_norm": 0.5056714415550232, + "distance_to_border_px": 139.0 + }, + "edge_ratio": 1.7932083752017418, + "edge_lengths_px": [ + 26.476404190063477, + 14.764822959899902, + 26.305892944335938, + 15.65247631072998 + ] + }, + "confidence": 0.1422032171644925 + }, + { + "observation_id": "7771002b-aa54-4478-b40d-622ed1b4e4b3", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 330.0, + 814.0 + ], + [ + 309.0, + 810.0 + ], + [ + 325.0, + 797.0 + ], + [ + 344.0, + 801.0 + ] + ], + "center_px": [ + 327.0, + 805.5 + ], + "quality": { + "area_px": 320.0, + "perimeter_px": 80.51454734802246, + "sharpness": { + "laplacian_var": 4743.984263356348 + }, + "contrast": { + "p05": 13.0, + "p95": 213.0, + "dynamic_range": 200.0, + "mean_gray": 106.6804979253112, + "std_gray": 73.95177295645807 + }, + "geometry": { + "distance_to_center_norm": 0.56446772813797, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 1.1189525331582624, + "edge_lengths_px": [ + 21.3775577545166, + 20.615528106689453, + 19.416488647460938, + 19.10497283935547 + ] + }, + "confidence": 0.19065449785541522 + }, + { + "observation_id": "51ed0f5b-4270-4d66-b5ee-44ef6a1e40cb", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1057.0, + 770.0 + ], + [ + 1030.0, + 764.0 + ], + [ + 1036.0, + 753.0 + ], + [ + 1062.0, + 758.0 + ] + ], + "center_px": [ + 1046.25, + 761.25 + ], + "quality": { + "area_px": 335.0, + "perimeter_px": 79.66500282287598, + "sharpness": { + "laplacian_var": 6062.7946493489335 + }, + "contrast": { + "p05": 33.25, + "p95": 226.0, + "dynamic_range": 192.75, + "mean_gray": 148.8008130081301, + "std_gray": 68.5699820501902 + }, + "geometry": { + "distance_to_center_norm": 0.6176323890686035, + "distance_to_border_px": 190.0 + }, + "edge_ratio": 2.207399255020695, + "edge_lengths_px": [ + 27.658634185791016, + 12.529964447021484, + 26.476404190063477, + 13.0 + ] + }, + "confidence": 0.10117487030285308 + }, + { + "observation_id": "ed2adf89-b0a5-40ac-8834-e74f03dfd7ec", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 879.0, + 797.0 + ], + [ + 854.0, + 792.0 + ], + [ + 862.0, + 781.0 + ], + [ + 887.0, + 785.0 + ] + ], + "center_px": [ + 870.5, + 788.75 + ], + "quality": { + "area_px": 323.5, + "perimeter_px": 78.83675193786621, + "sharpness": { + "laplacian_var": 3401.4250392732733 + }, + "contrast": { + "p05": 27.0, + "p95": 161.0, + "dynamic_range": 134.0, + "mean_gray": 67.41735537190083, + "std_gray": 40.5516122060526 + }, + "geometry": { + "distance_to_center_norm": 0.48162615299224854, + "distance_to_border_px": 163.0 + }, + "edge_ratio": 1.8744368320794806, + "edge_lengths_px": [ + 25.495098114013672, + 13.601470947265625, + 25.317977905273438, + 14.422204971313477 + ] + }, + "confidence": 0.11505678024231328 + }, + { + "observation_id": "064d4ac6-1951-4914-8ac8-563b7c5c05ec", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 645.0, + 787.0 + ], + [ + 655.0, + 775.0 + ], + [ + 676.0, + 778.0 + ], + [ + 667.0, + 791.0 + ] + ], + "center_px": [ + 660.75, + 782.75 + ], + "quality": { + "area_px": 302.0, + "perimeter_px": 75.00577068328857, + "sharpness": { + "laplacian_var": 6553.204930283982 + }, + "contrast": { + "p05": 42.0, + "p95": 221.0, + "dynamic_range": 179.0, + "mean_gray": 120.13122171945702, + "std_gray": 67.35088085467825 + }, + "geometry": { + "distance_to_center_norm": 0.37932533025741577, + "distance_to_border_px": 169.0 + }, + "edge_ratio": 1.43149580253248, + "edge_lengths_px": [ + 15.620499610900879, + 21.21320343017578, + 15.81138801574707, + 22.360679626464844 + ] + }, + "confidence": 0.14064542346345105 + }, + { + "observation_id": "40efd537-c387-40c5-ae50-c4c16f8dcc1c", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 992.0, + 684.0 + ], + [ + 969.0, + 680.0 + ], + [ + 974.0, + 673.0 + ], + [ + 997.0, + 676.0 + ] + ], + "center_px": [ + 983.0, + 678.25 + ], + "quality": { + "area_px": 190.0, + "perimeter_px": 64.57636833190918, + "sharpness": { + "laplacian_var": 9242.820969387756 + }, + "contrast": { + "p05": 56.8, + "p95": 221.09999999999997, + "dynamic_range": 164.29999999999995, + "mean_gray": 154.71428571428572, + "std_gray": 51.534494095049126 + }, + "geometry": { + "distance_to_center_norm": 0.49521470069885254, + "distance_to_border_px": 276.0 + }, + "edge_ratio": 2.71382848613422, + "edge_lengths_px": [ + 23.34523582458496, + 8.602325439453125, + 23.194826126098633, + 9.433980941772461 + ] + }, + "confidence": 0.046674529106701265 + }, + { + "observation_id": "a1ec312a-1983-4b74-8360-dc9ccc824557", + "type": "aruco", + "marker_id": 179, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 757.0, + 549.0 + ], + [ + 741.0, + 547.0 + ], + [ + 749.0, + 541.0 + ], + [ + 763.0, + 543.0 + ] + ], + "center_px": [ + 752.5, + 545.0 + ], + "quality": { + "area_px": 104.0, + "perimeter_px": 48.75193214416504, + "sharpness": { + "laplacian_var": 9399.159994834712 + }, + "contrast": { + "p05": 82.0, + "p95": 165.64999999999998, + "dynamic_range": 83.64999999999998, + "mean_gray": 118.02272727272727, + "std_gray": 27.633550619395812 + }, + "geometry": { + "distance_to_center_norm": 0.16240984201431274, + "distance_to_border_px": 411.0 + }, + "edge_ratio": 1.9002924654244098, + "edge_lengths_px": [ + 16.124515533447266, + 10.0, + 14.142135620117188, + 8.485280990600586 + ] + }, + "confidence": 0.03648561187019624 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 450.0, + 205.0 + ], + [ + 470.0, + 344.0 + ], + [ + 414.0, + 346.0 + ], + [ + 391.0, + 215.0 + ] + ], + "center_px": [ + 431.25, + 277.5 + ], + "area_px": 7891.5 + }, + { + "image_points_px": [ + [ + 618.0, + 204.0 + ], + [ + 708.0, + 205.0 + ], + [ + 710.0, + 221.0 + ], + [ + 620.0, + 222.0 + ] + ], + "center_px": [ + 664.0, + 213.0 + ], + "area_px": 1530.0 + }, + { + "image_points_px": [ + [ + 543.0, + 797.0 + ], + [ + 558.0, + 776.0 + ], + [ + 596.0, + 783.0 + ], + [ + 579.0, + 804.0 + ] + ], + "center_px": [ + 569.0, + 790.0 + ], + "area_px": 889.0 + }, + { + "image_points_px": [ + [ + 569.0, + 223.0 + ], + [ + 579.0, + 224.0 + ], + [ + 581.0, + 271.0 + ], + [ + 573.0, + 269.0 + ] + ], + "center_px": [ + 575.5, + 246.75 + ], + "area_px": 414.0 + }, + { + "image_points_px": [ + [ + 370.0, + 66.0 + ], + [ + 375.0, + 70.0 + ], + [ + 379.0, + 101.0 + ], + [ + 376.0, + 116.0 + ] + ], + "center_px": [ + 375.0, + 88.25 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 376.0, + 758.0 + ], + [ + 395.0, + 744.0 + ], + [ + 421.0, + 748.0 + ], + [ + 404.0, + 761.0 + ] + ], + "center_px": [ + 399.0, + 752.75 + ], + "area_px": 427.5 + }, + { + "image_points_px": [ + [ + 1048.0, + 883.0 + ], + [ + 1078.0, + 889.0 + ], + [ + 1075.0, + 905.0 + ], + [ + 1043.0, + 901.0 + ] + ], + "center_px": [ + 1061.0, + 894.5 + ], + "area_px": 547.0 + }, + { + "image_points_px": [ + [ + 914.0, + 886.0 + ], + [ + 922.0, + 873.0 + ], + [ + 951.0, + 878.0 + ], + [ + 944.0, + 895.0 + ] + ], + "center_px": [ + 932.75, + 883.0 + ], + "area_px": 495.0 + }, + { + "image_points_px": [ + [ + 304.0, + 93.0 + ], + [ + 306.0, + 110.0 + ], + [ + 276.0, + 110.0 + ], + [ + 275.0, + 92.0 + ] + ], + "center_px": [ + 290.25, + 101.25 + ], + "area_px": 515.5 + }, + { + "image_points_px": [ + [ + 859.0, + 666.0 + ], + [ + 849.0, + 687.0 + ], + [ + 835.0, + 704.0 + ], + [ + 836.0, + 693.0 + ] + ], + "center_px": [ + 844.75, + 687.5 + ], + "area_px": 175.0 + }, + { + "image_points_px": [ + [ + 1014.0, + 864.0 + ], + [ + 1021.0, + 851.0 + ], + [ + 1050.0, + 857.0 + ], + [ + 1044.0, + 872.0 + ] + ], + "center_px": [ + 1032.25, + 861.0 + ], + "area_px": 458.5 + }, + { + "image_points_px": [ + [ + 961.0, + 854.0 + ], + [ + 968.0, + 840.0 + ], + [ + 996.0, + 845.0 + ], + [ + 990.0, + 859.0 + ] + ], + "center_px": [ + 978.75, + 849.5 + ], + "area_px": 431.5 + }, + { + "image_points_px": [ + [ + 424.0, + 16.0 + ], + [ + 430.0, + 22.0 + ], + [ + 431.0, + 55.0 + ], + [ + 426.0, + 50.0 + ] + ], + "center_px": [ + 427.75, + 35.75 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 736.0, + 805.0 + ], + [ + 744.0, + 791.0 + ], + [ + 768.0, + 795.0 + ], + [ + 760.0, + 809.0 + ] + ], + "center_px": [ + 752.0, + 800.0 + ], + "area_px": 368.0 + }, + { + "image_points_px": [ + [ + 600.0, + 827.0 + ], + [ + 606.0, + 858.0 + ], + [ + 603.0, + 866.0 + ], + [ + 600.0, + 863.0 + ] + ], + "center_px": [ + 602.25, + 853.5 + ], + "area_px": 124.5 + }, + { + "image_points_px": [ + [ + 643.0, + 711.0 + ], + [ + 627.0, + 735.0 + ], + [ + 618.0, + 741.0 + ], + [ + 618.0, + 736.0 + ] + ], + "center_px": [ + 626.5, + 730.75 + ], + "area_px": 122.5 + }, + { + "image_points_px": [ + [ + 280.0, + 802.0 + ], + [ + 295.0, + 790.0 + ], + [ + 315.0, + 793.0 + ], + [ + 301.0, + 806.0 + ] + ], + "center_px": [ + 297.75, + 797.75 + ], + "area_px": 307.0 + }, + { + "image_points_px": [ + [ + 984.0, + 746.0 + ], + [ + 989.0, + 736.0 + ], + [ + 1014.0, + 739.0 + ], + [ + 1010.0, + 750.0 + ] + ], + "center_px": [ + 999.25, + 742.75 + ], + "area_px": 283.5 + }, + { + "image_points_px": [ + [ + 1105.0, + 724.0 + ], + [ + 1110.0, + 714.0 + ], + [ + 1134.0, + 718.0 + ], + [ + 1131.0, + 727.0 + ] + ], + "center_px": [ + 1120.0, + 720.75 + ], + "area_px": 251.5 + }, + { + "image_points_px": [ + [ + 186.0, + 231.0 + ], + [ + 197.0, + 260.0 + ], + [ + 192.0, + 263.0 + ], + [ + 184.0, + 243.0 + ] + ], + "center_px": [ + 189.75, + 249.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 1019.0, + 700.0 + ], + [ + 1024.0, + 690.0 + ], + [ + 1048.0, + 694.0 + ], + [ + 1042.0, + 704.0 + ] + ], + "center_px": [ + 1033.25, + 697.0 + ], + "area_px": 257.0 + }, + { + "image_points_px": [ + [ + 803.0, + 712.0 + ], + [ + 810.0, + 703.0 + ], + [ + 833.0, + 706.0 + ], + [ + 826.0, + 716.0 + ] + ], + "center_px": [ + 818.0, + 709.25 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 771.0, + 633.0 + ], + [ + 780.0, + 623.0 + ], + [ + 800.0, + 625.0 + ], + [ + 794.0, + 636.0 + ] + ], + "center_px": [ + 786.25, + 629.25 + ], + "area_px": 244.5 + }, + { + "image_points_px": [ + [ + 1073.0, + 678.0 + ], + [ + 1077.0, + 670.0 + ], + [ + 1101.0, + 672.0 + ], + [ + 1097.0, + 682.0 + ] + ], + "center_px": [ + 1087.0, + 675.5 + ], + "area_px": 228.0 + }, + { + "image_points_px": [ + [ + 672.0, + 491.0 + ], + [ + 670.0, + 497.0 + ], + [ + 650.0, + 516.0 + ], + [ + 652.0, + 510.0 + ] + ], + "center_px": [ + 661.0, + 503.5 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 840.0, + 257.0 + ], + [ + 843.0, + 256.0 + ], + [ + 855.0, + 266.0 + ], + [ + 865.0, + 278.0 + ] + ], + "center_px": [ + 850.75, + 264.25 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 932.0, + 679.0 + ], + [ + 936.0, + 670.0 + ], + [ + 959.0, + 672.0 + ], + [ + 954.0, + 682.0 + ] + ], + "center_px": [ + 945.25, + 675.75 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 725.0, + 688.0 + ], + [ + 733.0, + 679.0 + ], + [ + 753.0, + 681.0 + ], + [ + 744.0, + 691.0 + ] + ], + "center_px": [ + 738.75, + 684.75 + ], + "area_px": 206.5 + }, + { + "image_points_px": [ + [ + 1048.0, + 649.0 + ], + [ + 1051.0, + 640.0 + ], + [ + 1074.0, + 643.0 + ], + [ + 1070.0, + 652.0 + ] + ], + "center_px": [ + 1060.75, + 646.0 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 666.0, + 483.0 + ], + [ + 665.0, + 489.0 + ], + [ + 647.0, + 508.0 + ], + [ + 649.0, + 500.0 + ] + ], + "center_px": [ + 656.75, + 495.0 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 1117.0, + 628.0 + ], + [ + 1120.0, + 619.0 + ], + [ + 1142.0, + 621.0 + ], + [ + 1139.0, + 631.0 + ] + ], + "center_px": [ + 1129.5, + 624.75 + ], + "area_px": 216.5 + }, + { + "image_points_px": [ + [ + 1069.0, + 630.0 + ], + [ + 1073.0, + 622.0 + ], + [ + 1095.0, + 624.0 + ], + [ + 1091.0, + 633.0 + ] + ], + "center_px": [ + 1082.0, + 627.25 + ], + "area_px": 197.0 + }, + { + "image_points_px": [ + [ + 610.0, + 744.0 + ], + [ + 612.0, + 749.0 + ], + [ + 595.0, + 769.0 + ], + [ + 593.0, + 766.0 + ] + ], + "center_px": [ + 602.5, + 757.0 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 837.0, + 660.0 + ], + [ + 842.0, + 652.0 + ], + [ + 863.0, + 653.0 + ], + [ + 858.0, + 662.0 + ] + ], + "center_px": [ + 850.0, + 656.75 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 1008.0, + 632.0 + ], + [ + 1012.0, + 624.0 + ], + [ + 1033.0, + 627.0 + ], + [ + 1028.0, + 635.0 + ] + ], + "center_px": [ + 1020.25, + 629.5 + ], + "area_px": 177.5 + }, + { + "image_points_px": [ + [ + 1114.0, + 611.0 + ], + [ + 1117.0, + 605.0 + ], + [ + 1139.0, + 607.0 + ], + [ + 1135.0, + 615.0 + ] + ], + "center_px": [ + 1126.25, + 609.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1160.0, + 573.0 + ], + [ + 1162.0, + 565.0 + ], + [ + 1183.0, + 567.0 + ], + [ + 1181.0, + 575.0 + ] + ], + "center_px": [ + 1171.5, + 570.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 1113.0, + 578.0 + ], + [ + 1117.0, + 571.0 + ], + [ + 1137.0, + 573.0 + ], + [ + 1133.0, + 581.0 + ] + ], + "center_px": [ + 1125.0, + 575.75 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 1044.0, + 576.0 + ], + [ + 1050.0, + 569.0 + ], + [ + 1068.0, + 571.0 + ], + [ + 1065.0, + 579.0 + ] + ], + "center_px": [ + 1056.75, + 573.75 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 646.0, + 623.0 + ], + [ + 654.0, + 615.0 + ], + [ + 670.0, + 617.0 + ], + [ + 664.0, + 625.0 + ] + ], + "center_px": [ + 658.5, + 620.0 + ], + "area_px": 150.0 + }, + { + "image_points_px": [ + [ + 681.0, + 584.0 + ], + [ + 688.0, + 577.0 + ], + [ + 705.0, + 579.0 + ], + [ + 699.0, + 585.0 + ] + ], + "center_px": [ + 693.25, + 581.25 + ], + "area_px": 123.5 + }, + { + "image_points_px": [ + [ + 741.0, + 513.0 + ], + [ + 727.0, + 528.0 + ], + [ + 722.0, + 530.0 + ], + [ + 738.0, + 513.0 + ] + ], + "center_px": [ + 732.0, + 521.0 + ], + "area_px": 49.0 + }, + { + "image_points_px": [ + [ + 703.0, + 563.0 + ], + [ + 709.0, + 556.0 + ], + [ + 726.0, + 557.0 + ], + [ + 720.0, + 563.0 + ] + ], + "center_px": [ + 714.5, + 559.75 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 743.0, + 598.0 + ], + [ + 745.0, + 600.0 + ], + [ + 730.0, + 617.0 + ], + [ + 728.0, + 615.0 + ] + ], + "center_px": [ + 736.5, + 607.5 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 750.0, + 528.0 + ], + [ + 756.0, + 521.0 + ], + [ + 771.0, + 523.0 + ], + [ + 765.0, + 529.0 + ] + ], + "center_px": [ + 760.5, + 525.25 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 663.0, + 687.0 + ], + [ + 665.0, + 690.0 + ], + [ + 651.0, + 705.0 + ], + [ + 650.0, + 702.0 + ] + ], + "center_px": [ + 657.25, + 696.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 532.0, + 911.0 + ], + [ + 547.0, + 911.0 + ], + [ + 552.0, + 914.0 + ], + [ + 548.0, + 915.0 + ] + ], + "center_px": [ + 544.75, + 912.75 + ], + "area_px": 38.5 + }, + { + "image_points_px": [ + [ + 544.0, + 267.0 + ], + [ + 547.0, + 268.0 + ], + [ + 547.0, + 286.0 + ], + [ + 545.0, + 285.0 + ] + ], + "center_px": [ + 545.75, + 276.5 + ], + "area_px": 44.5 + }, + { + "image_points_px": [ + [ + 410.0, + 63.0 + ], + [ + 412.0, + 81.0 + ], + [ + 410.0, + 79.0 + ], + [ + 409.0, + 72.0 + ] + ], + "center_px": [ + 410.25, + 73.75 + ], + "area_px": 24.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam0_camera_pose.json b/test/y-axis-finder-examples/20260612_190104/cam0_camera_pose.json new file mode 100644 index 0000000..400ff3e --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam0_camera_pose.json @@ -0,0 +1,341 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:07Z", + "source": { + "detection_json": "/app/data/board/20260612_190104/cam0_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam0", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 10, + "used_marker_ids": [ + 52, + 83, + 101, + 79, + 96, + 82, + 85, + 62, + 211, + 102 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.011583844656378784, + 0.0010775760688667888, + 0.0006996938864108234, + 0.0006996713708616039 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 1.4234011745571165, + "residual_median_px": 0.7265588557890328, + "residual_max_px": 3.9986631298653377, + "sigma2_normalized": 6.993428957285749e-07 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.41089680790901184, + -0.9088985323905945, + -0.07118469476699829 + ], + [ + -0.3165417015552521, + -0.06900728493928909, + -0.9460651874542236 + ], + [ + 0.8549650311470032, + 0.41126808524131775, + -0.3160591721534729 + ] + ], + "translation_m": [ + -0.10991090536117554, + 0.3690652549266815, + 1.0290310382843018 + ], + "rvec_rad": [ + 1.6159733338901459, + -1.102627655662336, + 0.7052305000367143 + ] + }, + "camera_in_world": { + "position_m": [ + -0.7177989482879639, + -0.4976372718811035, + 0.6665705442428589 + ], + "position_mm": [ + -717.7989501953125, + -497.63726806640625, + 666.570556640625 + ], + "orientation_deg": { + "roll": 127.54224395751953, + "pitch": -58.75586700439453, + "yaw": -37.6094970703125 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 2.9336364245259038e-05, + -1.5131763292360595e-05, + -8.000741720545609e-06, + 5.403820141352387e-07, + 8.183291830175566e-06, + 2.77591983113989e-06 + ], + [ + -1.5131763292361025e-05, + 1.503946747526301e-05, + -5.281098467042598e-06, + -3.6058045653269604e-06, + -4.208220594656872e-06, + 1.291082577225459e-07 + ], + [ + -8.000741720544699e-06, + -5.281098467043316e-06, + 2.3833724506853e-05, + 5.934358060420953e-06, + -3.4811586893567264e-06, + -4.176791137411806e-06 + ], + [ + 5.403820141354994e-07, + -3.605804565327115e-06, + 5.9343580604208434e-06, + 1.9851490879679564e-06, + -9.262865023587544e-08, + -9.586546378669777e-07 + ], + [ + 8.183291830175515e-06, + -4.208220594656706e-06, + -3.4811586893569954e-06, + -9.262865023595845e-08, + 2.692311638613372e-06, + 1.5136764207470052e-06 + ], + [ + 2.775919831139757e-06, + 1.2910825772269002e-07, + -4.176791137411877e-06, + -9.586546378670152e-07, + 1.5136764207469685e-06, + 3.1590931756874967e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.3103314402869839, + 0.22219734320776316, + 0.27971682494181066 + ], + "tvec_std_m": [ + 0.0014089531887071182, + 0.001640826510821108, + 0.0017773838008959958 + ] + }, + "camera_center_std_m": [ + 0.004128365061729185, + 0.00612812627219762, + 0.00707858820143781 + ], + "camera_center_std_mm": [ + 4.128365061729185, + 6.12812627219762, + 7.07858820143781 + ], + "orientation_std_deg": { + "roll": 0.5614561263249548, + "pitch": 0.2457328024166601, + "yaw": 0.5005500695619176 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 52, + "observed_center_px": [ + 321.0, + 900.75 + ], + "projected_center_px": [ + 320.75164794921875, + 900.75634765625 + ], + "reprojection_error_px": 0.248433157744937, + "confidence": 0.2939513606264565 + }, + { + "marker_id": 83, + "observed_center_px": [ + 158.75, + 906.0 + ], + "projected_center_px": [ + 157.76646423339844, + 906.006103515625 + ], + "reprojection_error_px": 0.9835547046745838, + "confidence": 0.23510936286367592 + }, + { + "marker_id": 101, + "observed_center_px": [ + 254.25, + 866.5 + ], + "projected_center_px": [ + 254.1676025390625, + 865.7137451171875 + ], + "reprojection_error_px": 0.7905606126765012, + "confidence": 0.2442172274419462 + }, + { + "marker_id": 79, + "observed_center_px": [ + 821.5, + 840.25 + ], + "projected_center_px": [ + 820.8829345703125, + 840.0087280273438 + ], + "reprojection_error_px": 0.6625570989015643, + "confidence": 0.14902466745603263 + }, + { + "marker_id": 96, + "observed_center_px": [ + 871.5, + 811.75 + ], + "projected_center_px": [ + 871.0283813476562, + 811.0065307617188 + ], + "reprojection_error_px": 0.8804377669710887, + "confidence": 0.1422032171644925 + }, + { + "marker_id": 82, + "observed_center_px": [ + 327.0, + 805.5 + ], + "projected_center_px": [ + 327.5209655761719, + 805.263671875 + ], + "reprojection_error_px": 0.5720630334343492, + "confidence": 0.19065449785541522 + }, + { + "marker_id": 85, + "observed_center_px": [ + 1046.25, + 761.25 + ], + "projected_center_px": [ + 1045.744384765625, + 760.5679931640625 + ], + "reprojection_error_px": 0.8489876851271555, + "confidence": 0.10117487030285308 + }, + { + "marker_id": 62, + "observed_center_px": [ + 870.5, + 788.75 + ], + "projected_center_px": [ + 870.0374755859375, + 788.7951049804688 + ], + "reprojection_error_px": 0.4647185092794834, + "confidence": 0.11505678024231328 + }, + { + "marker_id": 211, + "observed_center_px": [ + 660.75, + 782.75 + ], + "projected_center_px": [ + 663.4999389648438, + 785.6529541015625 + ], + "reprojection_error_px": 3.9986631298653377, + "confidence": 0.14064542346345105 + }, + { + "marker_id": 102, + "observed_center_px": [ + 983.0, + 678.25 + ], + "projected_center_px": [ + 983.2212524414062, + 677.9496459960938 + ], + "reprojection_error_px": 0.37304848276161334, + "confidence": 0.046674529106701265 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam0_debug.jpg b/test/y-axis-finder-examples/20260612_190104/cam0_debug.jpg new file mode 100644 index 0000000..e10481d Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam0_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/cam1.jpg b/test/y-axis-finder-examples/20260612_190104/cam1.jpg new file mode 100644 index 0000000..952dbd0 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam1.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/cam1_aruco_detection.json b/test/y-axis-finder-examples/20260612_190104/cam1_aruco_detection.json new file mode 100644 index 0000000..0551ca3 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam1_aruco_detection.json @@ -0,0 +1,1598 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:10Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam1_calibration.npz", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190104/cam1.jpg", + "image_sha256": "80bf95bd37933d41f8276d48a7b36a64bc3423df1e0a64d7c5922744f6cf6b9a", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 18, + "num_rejected_candidates": 23 + }, + "detections": [ + { + "observation_id": "7531d41c-0512-4fee-8335-a5c946e98e58", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 235.0, + 138.0 + ], + [ + 289.0, + 148.0 + ], + [ + 283.0, + 185.0 + ], + [ + 230.0, + 176.0 + ] + ], + "center_px": [ + 259.25, + 161.75 + ], + "quality": { + "area_px": 2058.5, + "perimeter_px": 184.48770904541016, + "sharpness": { + "laplacian_var": 2364.965989697482 + }, + "contrast": { + "p05": 27.0, + "p95": 190.0, + "dynamic_range": 163.0, + "mean_gray": 86.31363004172462, + "std_gray": 65.53063363770487 + }, + "geometry": { + "distance_to_center_norm": 0.6202993392944336, + "distance_to_border_px": 138.0 + }, + "edge_ratio": 1.4651345456913931, + "edge_lengths_px": [ + 54.918121337890625, + 37.48332977294922, + 53.75872039794922, + 38.327537536621094 + ] + }, + "confidence": 0.6825311729497872 + }, + { + "observation_id": "3e4c0356-9777-42f7-85fb-9ef5f31e3e48", + "type": "aruco", + "marker_id": 196, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 328.0, + 180.0 + ], + [ + 330.0, + 135.0 + ], + [ + 377.0, + 136.0 + ], + [ + 375.0, + 180.0 + ] + ], + "center_px": [ + 352.5, + 157.75 + ], + "quality": { + "area_px": 2092.5, + "perimeter_px": 183.1004867553711, + "sharpness": { + "laplacian_var": 3730.8834921090784 + }, + "contrast": { + "p05": 23.0, + "p95": 227.0, + "dynamic_range": 204.0, + "mean_gray": 103.65708274894811, + "std_gray": 83.02756142478248 + }, + "geometry": { + "distance_to_center_norm": 0.5398224592208862, + "distance_to_border_px": 135.0 + }, + "edge_ratio": 1.0673215404661862, + "edge_lengths_px": [ + 45.0444221496582, + 47.01063537597656, + 44.04542922973633, + 47.0 + ] + }, + "confidence": 0.9369247804773232 + }, + { + "observation_id": "6f4916cd-995a-4832-95a6-1170f11f735f", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 289.0, + 125.0 + ], + [ + 312.0, + 82.0 + ], + [ + 343.0, + 101.0 + ], + [ + 322.0, + 145.0 + ] + ], + "center_px": [ + 316.5, + 113.25 + ], + "quality": { + "area_px": 1821.0, + "perimeter_px": 172.46610641479492, + "sharpness": { + "laplacian_var": 1530.0695758313454 + }, + "contrast": { + "p05": 5.0, + "p95": 147.0, + "dynamic_range": 142.0, + "mean_gray": 71.59983498349835, + "std_gray": 58.13223885841867 + }, + "geometry": { + "distance_to_center_norm": 0.6112970113754272, + "distance_to_border_px": 82.0 + }, + "edge_ratio": 1.3411896308371813, + "edge_lengths_px": [ + 48.764739990234375, + 36.359317779541016, + 48.754486083984375, + 38.587562561035156 + ] + }, + "confidence": 0.7456067188469031 + }, + { + "observation_id": "c8a4a88e-84b1-431e-831b-fafa37fdd7f6", + "type": "aruco", + "marker_id": 200, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 927.0, + 272.0 + ], + [ + 898.0, + 266.0 + ], + [ + 896.0, + 239.0 + ], + [ + 926.0, + 244.0 + ] + ], + "center_px": [ + 911.75, + 255.25 + ], + "quality": { + "area_px": 803.0, + "perimeter_px": 115.11982154846191, + "sharpness": { + "laplacian_var": 3103.8497896910744 + }, + "contrast": { + "p05": 25.0, + "p95": 206.0, + "dynamic_range": 181.0, + "mean_gray": 91.14337568058076, + "std_gray": 66.28872765694108 + }, + "geometry": { + "distance_to_center_norm": 0.44081002473831177, + "distance_to_border_px": 239.0 + }, + "edge_ratio": 1.1233598028653091, + "edge_lengths_px": [ + 29.614185333251953, + 27.073972702026367, + 30.4138126373291, + 28.017850875854492 + ] + }, + "confidence": 0.476546634451295 + }, + { + "observation_id": "9bce75eb-6b81-44af-9282-7ad95fd1df5d", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 460.0, + 226.0 + ], + [ + 437.0, + 262.0 + ], + [ + 408.0, + 251.0 + ], + [ + 432.0, + 216.0 + ] + ], + "center_px": [ + 434.25, + 238.75 + ], + "quality": { + "area_px": 1258.5, + "perimeter_px": 145.90647315979004, + "sharpness": { + "laplacian_var": 2321.8373131216335 + }, + "contrast": { + "p05": 1.0, + "p95": 154.5, + "dynamic_range": 153.5, + "mean_gray": 60.52643948296122, + "std_gray": 60.22162510731474 + }, + "geometry": { + "distance_to_center_norm": 0.39633995294570923, + "distance_to_border_px": 216.0 + }, + "edge_ratio": 1.4368297615831664, + "edge_lengths_px": [ + 42.72002029418945, + 31.016124725341797, + 42.43819046020508, + 29.73213768005371 + ] + }, + "confidence": 0.5839244303205068 + }, + { + "observation_id": "5e605abd-0ecc-42f0-9d6f-3b002b9ab9f4", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 699.0, + 344.0 + ], + [ + 668.0, + 334.0 + ], + [ + 678.0, + 298.0 + ], + [ + 708.0, + 307.0 + ] + ], + "center_px": [ + 688.25, + 320.75 + ], + "quality": { + "area_px": 1203.5, + "perimeter_px": 139.3358612060547, + "sharpness": { + "laplacian_var": 2359.215536319868 + }, + "contrast": { + "p05": 33.0, + "p95": 231.0, + "dynamic_range": 198.0, + "mean_gray": 104.35722964763062, + "std_gray": 78.73468509673879 + }, + "geometry": { + "distance_to_center_norm": 0.20799873769283295, + "distance_to_border_px": 298.0 + }, + "edge_ratio": 1.2157646142646734, + "edge_lengths_px": [ + 32.572994232177734, + 37.36308288574219, + 31.320919036865234, + 38.07886505126953 + ] + }, + "confidence": 0.6599413438419622 + }, + { + "observation_id": "ed15ab5e-cae7-42aa-9d5d-c0f27a2e6785", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 568.0, + 276.0 + ], + [ + 545.0, + 305.0 + ], + [ + 524.0, + 295.0 + ], + [ + 549.0, + 264.0 + ] + ], + "center_px": [ + 546.5, + 285.0 + ], + "quality": { + "area_px": 864.0, + "perimeter_px": 122.56973838806152, + "sharpness": { + "laplacian_var": 1859.2027158532903 + }, + "contrast": { + "p05": 6.0, + "p95": 153.0, + "dynamic_range": 147.0, + "mean_gray": 59.603678929765884, + "std_gray": 56.80329068477742 + }, + "geometry": { + "distance_to_center_norm": 0.27032172679901123, + "distance_to_border_px": 264.0 + }, + "edge_ratio": 1.7721721958932455, + "edge_lengths_px": [ + 37.013511657714844, + 23.25940704345703, + 39.824615478515625, + 22.472204208374023 + ] + }, + "confidence": 0.3250248487899749 + }, + { + "observation_id": "f017fd92-8a60-4a21-a32f-46dbe6d998b5", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 757.0, + 70.0 + ], + [ + 732.0, + 65.0 + ], + [ + 730.0, + 37.0 + ], + [ + 756.0, + 40.0 + ] + ], + "center_px": [ + 743.75, + 53.0 + ], + "quality": { + "area_px": 733.5, + "perimeter_px": 109.75560188293457, + "sharpness": { + "laplacian_var": 2918.2597007751465 + }, + "contrast": { + "p05": 12.0, + "p95": 208.0, + "dynamic_range": 196.0, + "mean_gray": 94.830078125, + "std_gray": 77.1746221139527 + }, + "geometry": { + "distance_to_center_norm": 0.5492794513702393, + "distance_to_border_px": 37.0 + }, + "edge_ratio": 1.1773503464635522, + "edge_lengths_px": [ + 25.495098114013672, + 28.07133674621582, + 26.172504425048828, + 30.01666259765625 + ] + }, + "confidence": 0.3073511644914628 + }, + { + "observation_id": "0f64be44-2b5b-41af-bd08-31b501c33819", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 924.0, + 445.0 + ], + [ + 896.0, + 436.0 + ], + [ + 896.0, + 413.0 + ], + [ + 924.0, + 422.0 + ] + ], + "center_px": [ + 910.0, + 429.0 + ], + "quality": { + "area_px": 644.0, + "perimeter_px": 104.8217658996582, + "sharpness": { + "laplacian_var": 1564.786164973838 + }, + "contrast": { + "p05": 28.0, + "p95": 194.0, + "dynamic_range": 166.0, + "mean_gray": 85.85964912280701, + "std_gray": 59.55995463705554 + }, + "geometry": { + "distance_to_center_norm": 0.3434680700302124, + "distance_to_border_px": 356.0 + }, + "edge_ratio": 1.2787340412969175, + "edge_lengths_px": [ + 29.4108829498291, + 23.0, + 29.4108829498291, + 23.0 + ] + }, + "confidence": 0.3357487323148877 + }, + { + "observation_id": "0726977c-1763-479c-82a7-1e018e688f7d", + "type": "aruco", + "marker_id": 75, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1164.0, + 441.0 + ], + [ + 1161.0, + 464.0 + ], + [ + 1132.0, + 454.0 + ], + [ + 1136.0, + 433.0 + ] + ], + "center_px": [ + 1148.25, + 448.0 + ], + "quality": { + "area_px": 658.5, + "perimeter_px": 104.3685474395752, + "sharpness": { + "laplacian_var": 3752.831978445195 + }, + "contrast": { + "p05": 6.0, + "p95": 194.0, + "dynamic_range": 188.0, + "mean_gray": 113.21088435374149, + "std_gray": 67.80125330374103 + }, + "geometry": { + "distance_to_center_norm": 0.6365704536437988, + "distance_to_border_px": 116.0 + }, + "edge_ratio": 1.4349498844441162, + "edge_lengths_px": [ + 23.194826126098633, + 30.675724029541016, + 21.3775577545166, + 29.120439529418945 + ] + }, + "confidence": 0.30593402930588326 + }, + { + "observation_id": "33242924-d0a1-4cf4-a123-1fe16f6c2dd1", + "type": "aruco", + "marker_id": 77, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1111.0, + 422.0 + ], + [ + 1109.0, + 444.0 + ], + [ + 1081.0, + 436.0 + ], + [ + 1084.0, + 414.0 + ] + ], + "center_px": [ + 1096.25, + 429.0 + ], + "quality": { + "area_px": 625.0, + "perimeter_px": 101.57501983642578, + "sharpness": { + "laplacian_var": 2332.380835470486 + }, + "contrast": { + "p05": 10.0, + "p95": 184.0, + "dynamic_range": 174.0, + "mean_gray": 80.25570776255708, + "std_gray": 64.87767486379231 + }, + "geometry": { + "distance_to_center_norm": 0.5738644599914551, + "distance_to_border_px": 169.0 + }, + "edge_ratio": 1.3182204128856232, + "edge_lengths_px": [ + 22.090721130371094, + 29.120439529418945, + 22.203603744506836, + 28.160255432128906 + ] + }, + "confidence": 0.31608269951955237 + }, + { + "observation_id": "e0c0c5ac-ce6b-4518-8e8f-a68a6c12093d", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 764.0, + 172.0 + ], + [ + 742.0, + 168.0 + ], + [ + 739.0, + 142.0 + ], + [ + 762.0, + 147.0 + ] + ], + "center_px": [ + 751.75, + 157.25 + ], + "quality": { + "area_px": 562.5, + "perimeter_px": 97.15026092529297, + "sharpness": { + "laplacian_var": 2435.9017669262994 + }, + "contrast": { + "p05": 26.0, + "p95": 208.0, + "dynamic_range": 182.0, + "mean_gray": 108.74554707379134, + "std_gray": 72.14469054130886 + }, + "geometry": { + "distance_to_center_norm": 0.4269360601902008, + "distance_to_border_px": 142.0 + }, + "edge_ratio": 1.1704699884914287, + "edge_lengths_px": [ + 22.360679626464844, + 26.172504425048828, + 23.53720474243164, + 25.079872131347656 + ] + }, + "confidence": 0.32038412235013586 + }, + { + "observation_id": "0ca87e91-9131-4c8b-9499-5769969c5371", + "type": "aruco", + "marker_id": 0, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 581.0, + 34.0 + ], + [ + 560.0, + 30.0 + ], + [ + 556.0, + 4.0 + ], + [ + 577.0, + 7.0 + ] + ], + "center_px": [ + 568.5, + 18.75 + ], + "quality": { + "area_px": 542.5, + "perimeter_px": 96.19134140014648, + "sharpness": { + "laplacian_var": 3114.6662794036156 + }, + "contrast": { + "p05": 8.3, + "p95": 202.0, + "dynamic_range": 193.7, + "mean_gray": 94.20930232558139, + "std_gray": 72.80731084822418 + }, + "geometry": { + "distance_to_center_norm": 0.583448588848114, + "distance_to_border_px": 4.0 + }, + "edge_ratio": 1.2866838976470414, + "edge_lengths_px": [ + 21.3775577545166, + 26.305892944335938, + 21.21320343017578, + 27.294687271118164 + ] + }, + "confidence": 0.0224867454906708 + }, + { + "observation_id": "c4a00e52-97be-4708-ba5e-ede7bc4475a0", + "type": "aruco", + "marker_id": 61, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1141.0, + 568.0 + ], + [ + 1138.0, + 587.0 + ], + [ + 1112.0, + 576.0 + ], + [ + 1115.0, + 558.0 + ] + ], + "center_px": [ + 1126.5, + 572.25 + ], + "quality": { + "area_px": 512.5, + "perimeter_px": 93.57163619995117, + "sharpness": { + "laplacian_var": 2831.287911129321 + }, + "contrast": { + "p05": 13.0, + "p95": 196.0, + "dynamic_range": 183.0, + "mean_gray": 100.68637532133675, + "std_gray": 69.84771790199164 + }, + "geometry": { + "distance_to_center_norm": 0.6189612150192261, + "distance_to_border_px": 139.0 + }, + "edge_ratio": 1.54705959576301, + "edge_lengths_px": [ + 19.235383987426758, + 28.23118782043457, + 18.248287200927734, + 27.85677719116211 + ] + }, + "confidence": 0.2208490659328199 + }, + { + "observation_id": "a5fe0a7b-e4d7-4815-b63b-2dbb1911f39c", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1068.0, + 544.0 + ], + [ + 1066.0, + 562.0 + ], + [ + 1040.0, + 553.0 + ], + [ + 1042.0, + 535.0 + ] + ], + "center_px": [ + 1054.0, + 548.5 + ], + "quality": { + "area_px": 486.0, + "perimeter_px": 91.24880981445312, + "sharpness": { + "laplacian_var": 3093.5216041088124 + }, + "contrast": { + "p05": 23.0, + "p95": 195.0, + "dynamic_range": 172.0, + "mean_gray": 110.45081967213115, + "std_gray": 63.60080022252569 + }, + "geometry": { + "distance_to_center_norm": 0.5245358943939209, + "distance_to_border_px": 212.0 + }, + "edge_ratio": 1.5191862044851852, + "edge_lengths_px": [ + 18.11077117919922, + 27.513633728027344, + 18.11077117919922, + 27.513633728027344 + ] + }, + "confidence": 0.21327207885605812 + }, + { + "observation_id": "aa29606c-f576-4251-a9ea-c5610b2aa71a", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 411.0, + 95.0 + ], + [ + 394.0, + 91.0 + ], + [ + 389.0, + 69.0 + ], + [ + 407.0, + 72.0 + ] + ], + "center_px": [ + 400.25, + 81.75 + ], + "quality": { + "area_px": 378.0, + "perimeter_px": 81.61879920959473, + "sharpness": { + "laplacian_var": 3826.5194203207416 + }, + "contrast": { + "p05": 7.0, + "p95": 191.34999999999997, + "dynamic_range": 184.34999999999997, + "mean_gray": 78.16423357664233, + "std_gray": 62.987764119645945 + }, + "geometry": { + "distance_to_center_norm": 0.5810592770576477, + "distance_to_border_px": 69.0 + }, + "edge_ratio": 1.336744356014703, + "edge_lengths_px": [ + 17.464248657226562, + 22.56102752685547, + 18.248287200927734, + 23.34523582458496 + ] + }, + "confidence": 0.18851772133252098 + }, + { + "observation_id": "2bb77a74-df4f-472b-a14f-6bbc9a868e7a", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 758.0, + 404.0 + ], + [ + 759.0, + 423.0 + ], + [ + 740.0, + 417.0 + ], + [ + 739.0, + 398.0 + ] + ], + "center_px": [ + 749.0, + 410.5 + ], + "quality": { + "area_px": 355.0, + "perimeter_px": 77.90231323242188, + "sharpness": { + "laplacian_var": 2387.0664846376303 + }, + "contrast": { + "p05": 20.0, + "p95": 203.0, + "dynamic_range": 183.0, + "mean_gray": 108.29501915708812, + "std_gray": 63.52367898101587 + }, + "geometry": { + "distance_to_center_norm": 0.16159000992774963, + "distance_to_border_px": 398.0 + }, + "edge_ratio": 1.0472272401922356, + "edge_lengths_px": [ + 19.02629852294922, + 19.92485809326172, + 19.02629852294922, + 19.92485809326172 + ] + }, + "confidence": 0.22599361206763743 + }, + { + "observation_id": "a963dbbc-4aa9-4b6f-ab56-495d10a9c96a", + "type": "aruco", + "marker_id": 91, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 485.0, + 342.0 + ], + [ + 489.0, + 358.0 + ], + [ + 473.0, + 353.0 + ], + [ + 470.0, + 336.0 + ] + ], + "center_px": [ + 479.25, + 347.25 + ], + "quality": { + "area_px": 236.5, + "perimeter_px": 66.67364692687988, + "sharpness": { + "laplacian_var": 3880.6495033884325 + }, + "contrast": { + "p05": 24.3, + "p95": 201.7, + "dynamic_range": 177.39999999999998, + "mean_gray": 104.94011976047904, + "std_gray": 62.8509024224394 + }, + "geometry": { + "distance_to_center_norm": 0.2605976462364197, + "distance_to_border_px": 336.0 + }, + "edge_ratio": 1.068532816253631, + "edge_lengths_px": [ + 16.492422103881836, + 16.76305389404297, + 17.262676239013672, + 16.155494689941406 + ] + }, + "confidence": 0.14755435141380097 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 148.0, + 567.0 + ], + [ + 166.0, + 616.0 + ], + [ + 56.0, + 715.0 + ], + [ + 20.0, + 664.0 + ] + ], + "center_px": [ + 97.5, + 640.5 + ], + "area_px": 8596.0 + }, + { + "image_points_px": [ + [ + 772.0, + 322.0 + ], + [ + 788.0, + 327.0 + ], + [ + 779.0, + 362.0 + ], + [ + 761.0, + 360.0 + ] + ], + "center_px": [ + 775.0, + 342.75 + ], + "area_px": 655.5 + }, + { + "image_points_px": [ + [ + 974.0, + 325.0 + ], + [ + 974.0, + 352.0 + ], + [ + 959.0, + 371.0 + ], + [ + 958.0, + 341.0 + ] + ], + "center_px": [ + 966.25, + 347.25 + ], + "area_px": 450.5 + }, + { + "image_points_px": [ + [ + 330.0, + 872.0 + ], + [ + 338.0, + 878.0 + ], + [ + 348.0, + 898.0 + ], + [ + 351.0, + 917.0 + ] + ], + "center_px": [ + 341.75, + 891.25 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 431.0, + 72.0 + ], + [ + 453.0, + 76.0 + ], + [ + 459.0, + 104.0 + ], + [ + 438.0, + 100.0 + ] + ], + "center_px": [ + 445.25, + 88.0 + ], + "area_px": 576.0 + }, + { + "image_points_px": [ + [ + 550.0, + 102.0 + ], + [ + 570.0, + 106.0 + ], + [ + 574.0, + 130.0 + ], + [ + 554.0, + 126.0 + ] + ], + "center_px": [ + 562.0, + 116.0 + ], + "area_px": 464.0 + }, + { + "image_points_px": [ + [ + 967.0, + 477.0 + ], + [ + 992.0, + 484.0 + ], + [ + 991.0, + 503.0 + ], + [ + 967.0, + 495.0 + ] + ], + "center_px": [ + 979.25, + 489.75 + ], + "area_px": 457.0 + }, + { + "image_points_px": [ + [ + 207.0, + 856.0 + ], + [ + 191.0, + 879.0 + ], + [ + 178.0, + 888.0 + ], + [ + 197.0, + 862.0 + ] + ], + "center_px": [ + 193.25, + 871.25 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 867.0, + 444.0 + ], + [ + 890.0, + 451.0 + ], + [ + 890.0, + 469.0 + ], + [ + 867.0, + 461.0 + ] + ], + "center_px": [ + 878.5, + 456.25 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 866.0, + 472.0 + ], + [ + 887.0, + 478.0 + ], + [ + 888.0, + 497.0 + ], + [ + 866.0, + 489.0 + ] + ], + "center_px": [ + 876.75, + 484.0 + ], + "area_px": 383.5 + }, + { + "image_points_px": [ + [ + 678.0, + 370.0 + ], + [ + 697.0, + 379.0 + ], + [ + 698.0, + 397.0 + ], + [ + 679.0, + 391.0 + ] + ], + "center_px": [ + 688.0, + 384.25 + ], + "area_px": 363.0 + }, + { + "image_points_px": [ + [ + 470.0, + 79.0 + ], + [ + 475.0, + 80.0 + ], + [ + 475.0, + 112.0 + ], + [ + 468.0, + 109.0 + ] + ], + "center_px": [ + 472.0, + 95.0 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 245.0, + 38.0 + ], + [ + 260.0, + 41.0 + ], + [ + 266.0, + 61.0 + ], + [ + 251.0, + 57.0 + ] + ], + "center_px": [ + 255.5, + 49.25 + ], + "area_px": 271.5 + }, + { + "image_points_px": [ + [ + 573.0, + 361.0 + ], + [ + 590.0, + 368.0 + ], + [ + 592.0, + 385.0 + ], + [ + 576.0, + 379.0 + ] + ], + "center_px": [ + 582.75, + 373.25 + ], + "area_px": 272.5 + }, + { + "image_points_px": [ + [ + 550.0, + 344.0 + ], + [ + 568.0, + 350.0 + ], + [ + 571.0, + 366.0 + ], + [ + 553.0, + 360.0 + ] + ], + "center_px": [ + 560.5, + 355.0 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 45.0, + 559.0 + ], + [ + 36.0, + 569.0 + ], + [ + 19.0, + 580.0 + ], + [ + 20.0, + 574.0 + ] + ], + "center_px": [ + 30.0, + 570.5 + ], + "area_px": 103.0 + }, + { + "image_points_px": [ + [ + 524.0, + 346.0 + ], + [ + 540.0, + 352.0 + ], + [ + 542.0, + 369.0 + ], + [ + 526.0, + 363.0 + ] + ], + "center_px": [ + 533.0, + 357.5 + ], + "area_px": 260.0 + }, + { + "image_points_px": [ + [ + 352.0, + 157.0 + ], + [ + 369.0, + 156.0 + ], + [ + 369.0, + 173.0 + ], + [ + 352.0, + 174.0 + ] + ], + "center_px": [ + 360.5, + 165.0 + ], + "area_px": 289.0 + }, + { + "image_points_px": [ + [ + 439.0, + 318.0 + ], + [ + 455.0, + 325.0 + ], + [ + 458.0, + 341.0 + ], + [ + 442.0, + 334.0 + ] + ], + "center_px": [ + 448.5, + 329.5 + ], + "area_px": 235.0 + }, + { + "image_points_px": [ + [ + 370.0, + 141.0 + ], + [ + 369.0, + 150.0 + ], + [ + 344.0, + 149.0 + ], + [ + 346.0, + 141.0 + ] + ], + "center_px": [ + 357.25, + 145.25 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 149.0, + 888.0 + ], + [ + 156.0, + 888.0 + ], + [ + 175.0, + 903.0 + ], + [ + 168.0, + 903.0 + ] + ], + "center_px": [ + 162.0, + 895.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 855.0, + 276.0 + ], + [ + 872.0, + 279.0 + ], + [ + 879.0, + 285.0 + ], + [ + 856.0, + 280.0 + ] + ], + "center_px": [ + 865.5, + 280.0 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 87.0, + 554.0 + ], + [ + 87.0, + 556.0 + ], + [ + 75.0, + 566.0 + ], + [ + 72.0, + 566.0 + ] + ], + "center_px": [ + 80.25, + 560.5 + ], + "area_px": 30.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam1_camera_pose.json b/test/y-axis-finder-examples/20260612_190104/cam1_camera_pose.json new file mode 100644 index 0000000..0a832c7 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam1_camera_pose.json @@ -0,0 +1,327 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:10Z", + "source": { + "detection_json": "/app/data/board/20260612_190104/cam1_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 9, + "used_marker_ids": [ + 215, + 75, + 77, + 211, + 0, + 61, + 83, + 86, + 91 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.012947336622946096, + 0.0011576089370776525, + 0.000677632000689733, + 0.0006776103590894678 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 1.3281044255078918, + "residual_median_px": 1.0658534244946405, + "residual_max_px": 2.059176882684305, + "sigma2_normalized": 6.887336980837212e-07 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.8169831037521362, + 0.13087064027786255, + -0.5616150498390198 + ], + [ + -0.27528589963912964, + 0.7672592997550964, + 0.5792502164840698 + ], + [ + 0.5067112445831299, + 0.627842366695404, + -0.5908110737800598 + ] + ], + "translation_m": [ + 0.3233913779258728, + -0.14233827590942383, + 0.9735512137413025 + ], + "rvec_rad": [ + 0.10758069292838245, + -2.365224369289227, + -0.8992115453858641 + ] + }, + "camera_in_world": { + "position_m": [ + -0.2682877779006958, + -0.5443487763404846, + 0.8392557501792908 + ], + "position_mm": [ + -268.28778076171875, + -544.3487548828125, + 839.2557373046875 + ], + "orientation_deg": { + "roll": 133.2594757080078, + "pitch": -30.44501304626465, + "yaw": -161.3785400390625 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 2.9810522854302954e-06, + -1.0482507335242678e-06, + -1.6813660057154423e-06, + 6.556546524051395e-07, + 5.961719843201515e-07, + 4.1089513796106666e-07 + ], + [ + -1.0482507335242938e-06, + 8.385073534319184e-06, + -2.610876970904805e-06, + -1.9525804607578916e-06, + 9.396328561962556e-07, + -2.608725317091146e-06 + ], + [ + -1.6813660057154264e-06, + -2.610876970904928e-06, + 2.1648767954863357e-05, + -7.39269992505272e-07, + -3.27012470848216e-06, + 1.3585721907663655e-06 + ], + [ + 6.556546524051449e-07, + -1.952580460757881e-06, + -7.392699925053098e-07, + 7.327700229266102e-07, + -1.1671767604845103e-08, + 9.230879380859925e-07 + ], + [ + 5.961719843201468e-07, + 9.396328561962744e-07, + -3.2701247084821465e-06, + -1.1671767604851857e-08, + 7.283659079725829e-07, + -5.519544393213444e-07 + ], + [ + 4.1089513796107444e-07, + -2.608725317091145e-06, + 1.3585721907663187e-06, + 9.230879380859964e-07, + -5.519544393213375e-07, + 3.067745561222319e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.09892531209113063, + 0.1659113397082262, + 0.26658715819063034 + ], + "tvec_std_m": [ + 0.0008560198729741093, + 0.0008534435587504208, + 0.0017514980905562868 + ] + }, + "camera_center_std_m": [ + 0.003267016971335379, + 0.0038979723393674118, + 0.0030910250992406832 + ], + "camera_center_std_mm": [ + 3.267016971335379, + 3.8979723393674117, + 3.0910250992406834 + ], + "orientation_std_deg": { + "roll": 0.24590319935934407, + "pitch": 0.17144035635200663, + "yaw": 0.15105775828773535 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 215, + "observed_center_px": [ + 743.75, + 53.0 + ], + "projected_center_px": [ + 744.499267578125, + 53.447364807128906 + ], + "reprojection_error_px": 0.8726609732804524, + "confidence": 0.3073511644914628 + }, + { + "marker_id": 75, + "observed_center_px": [ + 1148.25, + 448.0 + ], + "projected_center_px": [ + 1149.0048828125, + 448.50213623046875 + ], + "reprojection_error_px": 0.9066360099605992, + "confidence": 0.30593402930588326 + }, + { + "marker_id": 77, + "observed_center_px": [ + 1096.25, + 429.0 + ], + "projected_center_px": [ + 1095.6392822265625, + 430.4338073730469 + ], + "reprojection_error_px": 1.5584542924949831, + "confidence": 0.31608269951955237 + }, + { + "marker_id": 211, + "observed_center_px": [ + 751.75, + 157.25 + ], + "projected_center_px": [ + 751.776611328125, + 157.24380493164062 + ], + "reprojection_error_px": 0.027322914495963736, + "confidence": 0.32038412235013586 + }, + { + "marker_id": 0, + "observed_center_px": [ + 568.5, + 18.75 + ], + "projected_center_px": [ + 567.7591552734375, + 17.23809814453125 + ], + "reprojection_error_px": 1.6836561791070392, + "confidence": 0.0224867454906708 + }, + { + "marker_id": 61, + "observed_center_px": [ + 1126.5, + 572.25 + ], + "projected_center_px": [ + 1127.1572265625, + 570.2985229492188 + ], + "reprojection_error_px": 2.059176882684305, + "confidence": 0.2208490659328199 + }, + { + "marker_id": 83, + "observed_center_px": [ + 1054.0, + 548.5 + ], + "projected_center_px": [ + 1052.9501953125, + 548.3157348632812 + ], + "reprojection_error_px": 1.0658534244946405, + "confidence": 0.21327207885605812 + }, + { + "marker_id": 86, + "observed_center_px": [ + 749.0, + 410.5 + ], + "projected_center_px": [ + 748.017822265625, + 410.86334228515625 + ], + "reprojection_error_px": 1.047230021573376, + "confidence": 0.22599361206763743 + }, + { + "marker_id": 91, + "observed_center_px": [ + 479.25, + 347.25 + ], + "projected_center_px": [ + 480.4934997558594, + 348.2538757324219 + ], + "reprojection_error_px": 1.5981420866017768, + "confidence": 0.14755435141380097 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam1_debug.jpg b/test/y-axis-finder-examples/20260612_190104/cam1_debug.jpg new file mode 100644 index 0000000..5a93b0d Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam1_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/cam2.jpg b/test/y-axis-finder-examples/20260612_190104/cam2.jpg new file mode 100644 index 0000000..e367f23 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam2.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190104/cam2_aruco_detection.json b/test/y-axis-finder-examples/20260612_190104/cam2_aruco_detection.json new file mode 100644 index 0000000..028dee9 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam2_aruco_detection.json @@ -0,0 +1,3164 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:12Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam2", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam2_calibration.npz", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190104/cam2.jpg", + "image_sha256": "952b4798dfff9d9bdb5b49f9d11b93c5ec721d538f82e679deae2782ba77d7bd", + "width_px": 1920, + "height_px": 1080 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 22, + "num_rejected_candidates": 77 + }, + "detections": [ + { + "observation_id": "1603de9f-de93-4b58-946c-6d1f89eb563e", + "type": "aruco", + "marker_id": 17, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 162.0, + 164.0 + ], + [ + 183.0, + 165.0 + ], + [ + 187.0, + 250.0 + ], + [ + 168.0, + 250.0 + ] + ], + "center_px": [ + 175.0, + 207.25 + ], + "quality": { + "area_px": 1707.5, + "perimeter_px": 211.326904296875, + "sharpness": { + "laplacian_var": 375.9640758797762 + }, + "contrast": { + "p05": 30.900000000000006, + "p95": 66.0, + "dynamic_range": 35.099999999999994, + "mean_gray": 44.551314673452076, + "std_gray": 11.186886689791121 + }, + "geometry": { + "distance_to_center_norm": 0.7740790843963623, + "distance_to_border_px": 162.0 + }, + "edge_ratio": 4.5373181794819075, + "edge_lengths_px": [ + 21.02379608154297, + 85.09406280517578, + 19.0, + 86.20904541015625 + ] + }, + "confidence": 0.09669808963013884 + }, + { + "observation_id": "8ce2924a-5276-4750-ad35-193683fb42c6", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 670.0, + 943.0 + ], + [ + 719.0, + 944.0 + ], + [ + 718.0, + 989.0 + ], + [ + 669.0, + 988.0 + ] + ], + "center_px": [ + 694.0, + 966.0 + ], + "quality": { + "area_px": 2206.0, + "perimeter_px": 188.0426254272461, + "sharpness": { + "laplacian_var": 883.3049293333332 + }, + "contrast": { + "p05": 8.0, + "p95": 124.0, + "dynamic_range": 116.0, + "mean_gray": 44.584, + "std_gray": 45.43747657312555 + }, + "geometry": { + "distance_to_center_norm": 0.4559674859046936, + "distance_to_border_px": 91.0 + }, + "edge_ratio": 1.0888468660080113, + "edge_lengths_px": [ + 49.01020431518555, + 45.0111083984375, + 49.01020431518555, + 45.0111083984375 + ] + }, + "confidence": 0.9184027903448476 + }, + { + "observation_id": "21d86462-83b4-4795-8f31-a2a74dca37ea", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 869.0, + 610.0 + ], + [ + 908.0, + 639.0 + ], + [ + 876.0, + 673.0 + ], + [ + 842.0, + 646.0 + ] + ], + "center_px": [ + 873.75, + 642.0 + ], + "quality": { + "area_px": 2103.5, + "perimeter_px": 183.70746994018555, + "sharpness": { + "laplacian_var": 1534.173009415935 + }, + "contrast": { + "p05": 6.0, + "p95": 128.0, + "dynamic_range": 122.0, + "mean_gray": 62.10057061340942, + "std_gray": 51.58320024449117 + }, + "geometry": { + "distance_to_center_norm": 0.12127421796321869, + "distance_to_border_px": 407.0 + }, + "edge_ratio": 1.1193972831808536, + "edge_lengths_px": [ + 48.60041046142578, + 46.69047164916992, + 43.416587829589844, + 45.0 + ] + }, + "confidence": 0.8933378837211602 + }, + { + "observation_id": "5c55df97-6a3e-47a2-8290-08da4e438a45", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1124.0, + 360.0 + ], + [ + 1097.0, + 332.0 + ], + [ + 1127.0, + 303.0 + ], + [ + 1155.0, + 331.0 + ] + ], + "center_px": [ + 1125.75, + 331.5 + ], + "quality": { + "area_px": 1651.5, + "perimeter_px": 162.6705436706543, + "sharpness": { + "laplacian_var": 1909.8207558049676 + }, + "contrast": { + "p05": 12.0, + "p95": 145.0, + "dynamic_range": 133.0, + "mean_gray": 60.45349867139061, + "std_gray": 54.43454239162406 + }, + "geometry": { + "distance_to_center_norm": 0.24182191491127014, + "distance_to_border_px": 303.0 + }, + "edge_ratio": 1.0913346031566702, + "edge_lengths_px": [ + 38.897300720214844, + 41.72529220581055, + 39.59798049926758, + 42.44997024536133 + ] + }, + "confidence": 0.9163092575892984 + }, + { + "observation_id": "3b61ad9a-7d55-4e45-8f30-31d26f1449a4", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1272.0, + 243.0 + ], + [ + 1296.0, + 275.0 + ], + [ + 1264.0, + 300.0 + ], + [ + 1240.0, + 269.0 + ] + ], + "center_px": [ + 1268.0, + 271.75 + ], + "quality": { + "area_px": 1620.0, + "perimeter_px": 161.04352569580078, + "sharpness": { + "laplacian_var": 1309.8796306381932 + }, + "contrast": { + "p05": 12.0, + "p95": 142.0, + "dynamic_range": 130.0, + "mean_gray": 71.30226244343892, + "std_gray": 55.770692804346844 + }, + "geometry": { + "distance_to_center_norm": 0.37081778049468994, + "distance_to_border_px": 243.0 + }, + "edge_ratio": 1.0516895184391775, + "edge_lengths_px": [ + 40.0, + 40.607879638671875, + 39.20458984375, + 41.231056213378906 + ] + }, + "confidence": 0.9508509711916779 + }, + { + "observation_id": "a240601c-9490-4bb7-a2ce-5969774293f0", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 995.0, + 487.0 + ], + [ + 969.0, + 457.0 + ], + [ + 999.0, + 430.0 + ], + [ + 1024.0, + 460.0 + ] + ], + "center_px": [ + 996.75, + 458.5 + ], + "quality": { + "area_px": 1573.5, + "perimeter_px": 158.73421096801758, + "sharpness": { + "laplacian_var": 1752.7734411851281 + }, + "contrast": { + "p05": 9.0, + "p95": 144.0, + "dynamic_range": 135.0, + "mean_gray": 52.96045197740113, + "std_gray": 54.34659242556329 + }, + "geometry": { + "distance_to_center_norm": 0.08116777241230011, + "distance_to_border_px": 430.0 + }, + "edge_ratio": 1.0335360284456947, + "edge_lengths_px": [ + 39.69886779785156, + 40.360870361328125, + 39.051246643066406, + 39.623226165771484 + ] + }, + "confidence": 0.9675521437833874 + }, + { + "observation_id": "21a26e63-e04b-48a3-b0e9-d6493a74bd24", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 539.0, + 906.0 + ], + [ + 550.0, + 887.0 + ], + [ + 595.0, + 888.0 + ], + [ + 586.0, + 905.0 + ] + ], + "center_px": [ + 567.5, + 896.5 + ], + "quality": { + "area_px": 828.0, + "perimeter_px": 133.21162605285645, + "sharpness": { + "laplacian_var": 2495.286806522092 + }, + "contrast": { + "p05": 12.0, + "p95": 186.0, + "dynamic_range": 174.0, + "mean_gray": 68.16965742251223, + "std_gray": 61.56822706076807 + }, + "geometry": { + "distance_to_center_norm": 0.48139509558677673, + "distance_to_border_px": 174.0 + }, + "edge_ratio": 2.4439665673794266, + "edge_lengths_px": [ + 21.954498291015625, + 45.0111083984375, + 19.235383987426758, + 47.01063537597656 + ] + }, + "confidence": 0.22586233681252393 + }, + { + "observation_id": "e675f706-be39-4383-b4c0-2eddc8a90c13", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1277.0, + 201.0 + ], + [ + 1265.0, + 226.0 + ], + [ + 1227.0, + 222.0 + ], + [ + 1238.0, + 198.0 + ] + ], + "center_px": [ + 1251.75, + 211.75 + ], + "quality": { + "area_px": 983.5, + "perimeter_px": 131.45676612854004, + "sharpness": { + "laplacian_var": 3002.545579958762 + }, + "contrast": { + "p05": 15.0, + "p95": 189.64999999999998, + "dynamic_range": 174.64999999999998, + "mean_gray": 89.4171511627907, + "std_gray": 69.75014876220152 + }, + "geometry": { + "distance_to_center_norm": 0.39871424436569214, + "distance_to_border_px": 198.0 + }, + "edge_ratio": 1.481594468847532, + "edge_lengths_px": [ + 27.73084831237793, + 38.20994567871094, + 26.4007568359375, + 39.11521530151367 + ] + }, + "confidence": 0.44254124894019164 + }, + { + "observation_id": "33902742-ef1f-44e0-8ae9-c14676cd9171", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 349.0, + 1044.0 + ], + [ + 310.0, + 1043.0 + ], + [ + 326.0, + 1023.0 + ], + [ + 364.0, + 1025.0 + ] + ], + "center_px": [ + 337.25, + 1033.75 + ], + "quality": { + "area_px": 774.0, + "perimeter_px": 126.88534927368164, + "sharpness": { + "laplacian_var": 2513.5727417734556 + }, + "contrast": { + "p05": 18.0, + "p95": 181.0, + "dynamic_range": 163.0, + "mean_gray": 91.48387096774194, + "std_gray": 65.14779013588 + }, + "geometry": { + "distance_to_center_norm": 0.7215345501899719, + "distance_to_border_px": 36.0 + }, + "edge_ratio": 1.6116045888054598, + "edge_lengths_px": [ + 39.0128173828125, + 25.612497329711914, + 38.05259704589844, + 24.20743751525879 + ] + }, + "confidence": 0.23052801076681903 + }, + { + "observation_id": "83683704-5b0c-49ff-8784-adfee8956657", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1231.0, + 1015.0 + ], + [ + 1195.0, + 1013.0 + ], + [ + 1189.0, + 996.0 + ], + [ + 1225.0, + 997.0 + ] + ], + "center_px": [ + 1210.0, + 1005.25 + ], + "quality": { + "area_px": 621.0, + "perimeter_px": 109.0708179473877, + "sharpness": { + "laplacian_var": 2872.0576246913583 + }, + "contrast": { + "p05": 24.0, + "p95": 185.0, + "dynamic_range": 161.0, + "mean_gray": 86.53555555555556, + "std_gray": 60.522831892162095 + }, + "geometry": { + "distance_to_center_norm": 0.4795157015323639, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 2.0, + "edge_lengths_px": [ + 36.055511474609375, + 18.027755737304688, + 36.013885498046875, + 18.973665237426758 + ] + }, + "confidence": 0.207 + }, + { + "observation_id": "116b7c5b-34e9-4c33-886c-0c0c0bf563d9", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1368.0, + 1002.0 + ], + [ + 1333.0, + 1003.0 + ], + [ + 1323.0, + 985.0 + ], + [ + 1356.0, + 986.0 + ] + ], + "center_px": [ + 1345.0, + 994.0 + ], + "quality": { + "area_px": 578.0, + "perimeter_px": 108.62069129943848, + "sharpness": { + "laplacian_var": 2602.5448739287185 + }, + "contrast": { + "p05": 23.0, + "p95": 190.0, + "dynamic_range": 167.0, + "mean_gray": 100.6935866983373, + "std_gray": 63.50206147520845 + }, + "geometry": { + "distance_to_center_norm": 0.5404362678527832, + "distance_to_border_px": 77.0 + }, + "edge_ratio": 1.750714111328125, + "edge_lengths_px": [ + 35.0142822265625, + 20.59126091003418, + 33.0151481628418, + 20.0 + ] + }, + "confidence": 0.22010066111880033 + }, + { + "observation_id": "09bcf8b2-2c76-43c3-8ce6-50b9061b64c4", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1072.0, + 990.0 + ], + [ + 1036.0, + 989.0 + ], + [ + 1034.0, + 972.0 + ], + [ + 1068.0, + 973.0 + ] + ], + "center_px": [ + 1052.5, + 981.0 + ], + "quality": { + "area_px": 592.0, + "perimeter_px": 104.61007881164551, + "sharpness": { + "laplacian_var": 3876.942365397805 + }, + "contrast": { + "p05": 20.55, + "p95": 196.0, + "dynamic_range": 175.45, + "mean_gray": 102.59027777777777, + "std_gray": 66.26270806081251 + }, + "geometry": { + "distance_to_center_norm": 0.40909263491630554, + "distance_to_border_px": 90.0 + }, + "edge_ratio": 2.1039536502025493, + "edge_lengths_px": [ + 36.013885498046875, + 17.11724281311035, + 34.01470184326172, + 17.464248657226562 + ] + }, + "confidence": 0.18758334653839537 + }, + { + "observation_id": "d3d66ae4-90cf-40a6-b1fc-238b20a89bb4", + "type": "aruco", + "marker_id": 54, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1311.0, + 976.0 + ], + [ + 1277.0, + 974.0 + ], + [ + 1269.0, + 959.0 + ], + [ + 1301.0, + 959.0 + ] + ], + "center_px": [ + 1289.5, + 967.0 + ], + "quality": { + "area_px": 519.0, + "perimeter_px": 102.78185653686523, + "sharpness": { + "laplacian_var": 1775.7853527409989 + }, + "contrast": { + "p05": 22.650000000000002, + "p95": 167.34999999999997, + "dynamic_range": 144.69999999999996, + "mean_gray": 63.95187165775401, + "std_gray": 48.08562810431758 + }, + "geometry": { + "distance_to_center_norm": 0.4896717965602875, + "distance_to_border_px": 104.0 + }, + "edge_ratio": 2.0034572376924404, + "edge_lengths_px": [ + 34.058773040771484, + 17.0, + 32.0, + 19.72308349609375 + ] + }, + "confidence": 0.17270146499284353 + }, + { + "observation_id": "f1e3c169-ba8b-4601-8de7-b875c2266427", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 436.0, + 939.0 + ], + [ + 404.0, + 938.0 + ], + [ + 416.0, + 923.0 + ], + [ + 448.0, + 924.0 + ] + ], + "center_px": [ + 426.0, + 931.0 + ], + "quality": { + "area_px": 492.0, + "perimeter_px": 102.44998931884766, + "sharpness": { + "laplacian_var": 2112.254663236965 + }, + "contrast": { + "p05": 17.0, + "p95": 184.0, + "dynamic_range": 167.0, + "mean_gray": 92.02247191011236, + "std_gray": 64.76191964871246 + }, + "geometry": { + "distance_to_center_norm": 0.6008819937705994, + "distance_to_border_px": 141.0 + }, + "edge_ratio": 1.6666666004716002, + "edge_lengths_px": [ + 32.015621185302734, + 19.209373474121094, + 32.015621185302734, + 19.209373474121094 + ] + }, + "confidence": 0.19680000781631377 + }, + { + "observation_id": "47dd6fd0-7bad-4af4-988c-12912d5557c7", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1248.0, + 972.0 + ], + [ + 1213.0, + 972.0 + ], + [ + 1207.0, + 957.0 + ], + [ + 1241.0, + 957.0 + ] + ], + "center_px": [ + 1227.25, + 964.5 + ], + "quality": { + "area_px": 517.5, + "perimeter_px": 101.70844078063965, + "sharpness": { + "laplacian_var": 2563.6645185664156 + }, + "contrast": { + "p05": 23.5, + "p95": 184.0, + "dynamic_range": 160.5, + "mean_gray": 84.03234501347708, + "std_gray": 57.56397148945144 + }, + "geometry": { + "distance_to_center_norm": 0.4554165303707123, + "distance_to_border_px": 108.0 + }, + "edge_ratio": 2.166445576054777, + "edge_lengths_px": [ + 35.0, + 16.155494689941406, + 34.0, + 16.552946090698242 + ] + }, + "confidence": 0.15924701908656527 + }, + { + "observation_id": "b5f811cb-c8c0-4641-843e-ebe60ec29e30", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1102.0, + 952.0 + ], + [ + 1068.0, + 951.0 + ], + [ + 1066.0, + 936.0 + ], + [ + 1099.0, + 937.0 + ] + ], + "center_px": [ + 1083.75, + 944.0 + ], + "quality": { + "area_px": 500.0, + "perimeter_px": 97.45965385437012, + "sharpness": { + "laplacian_var": 3105.389571174433 + }, + "contrast": { + "p05": 23.85, + "p95": 192.0, + "dynamic_range": 168.15, + "mean_gray": 99.06424581005587, + "std_gray": 66.11361311376302 + }, + "geometry": { + "distance_to_center_norm": 0.3836095929145813, + "distance_to_border_px": 128.0 + }, + "edge_ratio": 2.247754797535694, + "edge_lengths_px": [ + 34.01470184326172, + 15.132745742797852, + 33.0151481628418, + 15.29705810546875 + ] + }, + "confidence": 0.1482961280735694 + }, + { + "observation_id": "941a0d05-758a-4af7-bffc-7e445f630210", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1081.0, + 929.0 + ], + [ + 1049.0, + 928.0 + ], + [ + 1047.0, + 915.0 + ], + [ + 1078.0, + 916.0 + ] + ], + "center_px": [ + 1063.75, + 922.0 + ], + "quality": { + "area_px": 407.0, + "perimeter_px": 89.52635669708252, + "sharpness": { + "laplacian_var": 2212.4161236623067 + }, + "contrast": { + "p05": 17.0, + "p95": 157.55, + "dynamic_range": 140.55, + "mean_gray": 56.39655172413793, + "std_gray": 42.297688717801286 + }, + "geometry": { + "distance_to_center_norm": 0.35937821865081787, + "distance_to_border_px": 151.0 + }, + "edge_ratio": 2.4341025984594977, + "edge_lengths_px": [ + 32.015621185302734, + 13.152946472167969, + 31.016124725341797, + 13.34166431427002 + ] + }, + "confidence": 0.11147160908708433 + }, + { + "observation_id": "5211d79b-a4d3-4b08-9090-b70e2c7a934d", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 589.0, + 871.0 + ], + [ + 560.0, + 870.0 + ], + [ + 567.0, + 859.0 + ], + [ + 597.0, + 859.0 + ] + ], + "center_px": [ + 578.25, + 864.75 + ], + "quality": { + "area_px": 343.0, + "perimeter_px": 86.47784614562988, + "sharpness": { + "laplacian_var": 3967.951859566665 + }, + "contrast": { + "p05": 11.0, + "p95": 189.0, + "dynamic_range": 178.0, + "mean_gray": 110.82278481012658, + "std_gray": 62.01682625091673 + }, + "geometry": { + "distance_to_center_norm": 0.45502978563308716, + "distance_to_border_px": 209.0 + }, + "edge_ratio": 2.300895027545104, + "edge_lengths_px": [ + 29.017236709594727, + 13.03840446472168, + 30.0, + 14.422204971313477 + ] + }, + "confidence": 0.09938161625332304 + }, + { + "observation_id": "4edba335-b51d-43d1-9f5a-3c8c99b341f9", + "type": "aruco", + "marker_id": 0, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 941.0, + 852.0 + ], + [ + 940.0, + 841.0 + ], + [ + 969.0, + 841.0 + ], + [ + 970.0, + 852.0 + ] + ], + "center_px": [ + 955.0, + 846.5 + ], + "quality": { + "area_px": 319.0, + "perimeter_px": 80.0907211303711, + "sharpness": { + "laplacian_var": 4987.06922462685 + }, + "contrast": { + "p05": 20.0, + "p95": 185.0, + "dynamic_range": 165.0, + "mean_gray": 94.04524886877829, + "std_gray": 57.42488887270167 + }, + "geometry": { + "distance_to_center_norm": 0.27830564975738525, + "distance_to_border_px": 228.0 + }, + "edge_ratio": 2.625536742676072, + "edge_lengths_px": [ + 11.045360565185547, + 29.0, + 11.045360565185547, + 29.0 + ] + }, + "confidence": 0.08099931081136068 + }, + { + "observation_id": "f6420057-e9b6-495b-91eb-f31e8c1b1a78", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 615.0, + 830.0 + ], + [ + 587.0, + 830.0 + ], + [ + 593.0, + 820.0 + ], + [ + 621.0, + 820.0 + ] + ], + "center_px": [ + 604.0, + 825.0 + ], + "quality": { + "area_px": 280.0, + "perimeter_px": 79.32380676269531, + "sharpness": { + "laplacian_var": 2327.9023668639056 + }, + "contrast": { + "p05": 12.0, + "p95": 169.5999999999999, + "dynamic_range": 157.5999999999999, + "mean_gray": 72.91826923076923, + "std_gray": 50.77162340479457 + }, + "geometry": { + "distance_to_center_norm": 0.4140232503414154, + "distance_to_border_px": 250.0 + }, + "edge_ratio": 2.400980276065733, + "edge_lengths_px": [ + 28.0, + 11.661903381347656, + 28.0, + 11.661903381347656 + ] + }, + "confidence": 0.0777460225423177 + }, + { + "observation_id": "4fc85245-b813-4faa-94d9-9e7e231addd5", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1107.0, + 810.0 + ], + [ + 1080.0, + 810.0 + ], + [ + 1078.0, + 801.0 + ], + [ + 1104.0, + 802.0 + ] + ], + "center_px": [ + 1092.25, + 805.75 + ], + "quality": { + "area_px": 224.0, + "perimeter_px": 70.78277206420898, + "sharpness": { + "laplacian_var": 8539.577862448945 + }, + "contrast": { + "p05": 23.0, + "p95": 193.0, + "dynamic_range": 170.0, + "mean_gray": 114.14659685863874, + "std_gray": 54.44839505459021 + }, + "geometry": { + "distance_to_center_norm": 0.2694970965385437, + "distance_to_border_px": 270.0 + }, + "edge_ratio": 3.160111069973257, + "edge_lengths_px": [ + 27.0, + 9.219544410705566, + 26.019224166870117, + 8.5440034866333 + ] + }, + "confidence": 0.047255722987798995 + }, + { + "observation_id": "7f452703-564e-4d45-9fc4-9583d481026d", + "type": "aruco", + "marker_id": 48, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1204.0, + 799.0 + ], + [ + 1180.0, + 798.0 + ], + [ + 1176.0, + 790.0 + ], + [ + 1201.0, + 790.0 + ] + ], + "center_px": [ + 1190.25, + 794.25 + ], + "quality": { + "area_px": 206.5, + "perimeter_px": 67.45192909240723, + "sharpness": { + "laplacian_var": 4558.731130341808 + }, + "contrast": { + "p05": 22.6, + "p95": 176.8, + "dynamic_range": 154.20000000000002, + "mean_gray": 82.58959537572254, + "std_gray": 48.04320438021923 + }, + "geometry": { + "distance_to_center_norm": 0.311418741941452, + "distance_to_border_px": 281.0 + }, + "edge_ratio": 2.7950849308367247, + "edge_lengths_px": [ + 24.020824432373047, + 8.9442720413208, + 25.0, + 9.486832618713379 + ] + }, + "confidence": 0.04925312470753987 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 903.0, + 598.0 + ], + [ + 913.0, + 667.0 + ], + [ + 668.0, + 856.0 + ], + [ + 835.0, + 608.0 + ] + ], + "center_px": [ + 829.75, + 682.25 + ], + "area_px": 16994.5 + }, + { + "image_points_px": [ + [ + 271.0, + 343.0 + ], + [ + 284.0, + 514.0 + ], + [ + 201.0, + 513.0 + ], + [ + 187.0, + 353.0 + ] + ], + "center_px": [ + 235.75, + 430.75 + ], + "area_px": 13880.0 + }, + { + "image_points_px": [ + [ + 873.0, + 938.0 + ], + [ + 871.0, + 1017.0 + ], + [ + 747.0, + 1038.0 + ], + [ + 754.0, + 908.0 + ] + ], + "center_px": [ + 811.25, + 975.25 + ], + "area_px": 12717.0 + }, + { + "image_points_px": [ + [ + 1845.0, + 151.0 + ], + [ + 1823.0, + 339.0 + ], + [ + 1787.0, + 296.0 + ], + [ + 1808.0, + 157.0 + ] + ], + "center_px": [ + 1815.75, + 235.75 + ], + "area_px": 6365.5 + }, + { + "image_points_px": [ + [ + 33.0, + 190.0 + ], + [ + 78.0, + 190.0 + ], + [ + 80.0, + 215.0 + ], + [ + 37.0, + 215.0 + ] + ], + "center_px": [ + 57.0, + 202.5 + ], + "area_px": 1100.0 + }, + { + "image_points_px": [ + [ + 255.0, + 1038.0 + ], + [ + 272.0, + 1019.0 + ], + [ + 310.0, + 1021.0 + ], + [ + 293.0, + 1040.0 + ] + ], + "center_px": [ + 282.5, + 1029.5 + ], + "area_px": 756.0 + }, + { + "image_points_px": [ + [ + 918.0, + 943.0 + ], + [ + 923.0, + 989.0 + ], + [ + 916.0, + 1004.0 + ], + [ + 913.0, + 950.0 + ] + ], + "center_px": [ + 917.5, + 971.5 + ], + "area_px": 344.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 254.0 + ], + [ + 1236.0, + 299.0 + ], + [ + 1228.0, + 294.0 + ], + [ + 1205.0, + 259.0 + ] + ], + "center_px": [ + 1219.25, + 276.5 + ], + "area_px": 220.0 + }, + { + "image_points_px": [ + [ + 1328.0, + 278.0 + ], + [ + 1342.0, + 304.0 + ], + [ + 1346.0, + 323.0 + ], + [ + 1326.0, + 316.0 + ] + ], + "center_px": [ + 1335.5, + 305.25 + ], + "area_px": 468.0 + }, + { + "image_points_px": [ + [ + 939.0, + 511.0 + ], + [ + 940.0, + 517.0 + ], + [ + 906.0, + 549.0 + ], + [ + 904.0, + 544.0 + ] + ], + "center_px": [ + 922.25, + 530.25 + ], + "area_px": 238.5 + }, + { + "image_points_px": [ + [ + 930.0, + 503.0 + ], + [ + 931.0, + 508.0 + ], + [ + 898.0, + 539.0 + ], + [ + 898.0, + 532.0 + ] + ], + "center_px": [ + 914.25, + 520.5 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 939.0, + 937.0 + ], + [ + 972.0, + 937.0 + ], + [ + 974.0, + 952.0 + ], + [ + 939.0, + 952.0 + ] + ], + "center_px": [ + 956.0, + 944.5 + ], + "area_px": 510.0 + }, + { + "image_points_px": [ + [ + 470.0, + 912.0 + ], + [ + 480.0, + 899.0 + ], + [ + 511.0, + 899.0 + ], + [ + 502.0, + 912.0 + ] + ], + "center_px": [ + 490.75, + 905.5 + ], + "area_px": 409.5 + }, + { + "image_points_px": [ + [ + 449.0, + 895.0 + ], + [ + 459.0, + 883.0 + ], + [ + 490.0, + 884.0 + ], + [ + 480.0, + 896.0 + ] + ], + "center_px": [ + 469.5, + 889.5 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 1203.0, + 867.0 + ], + [ + 1231.0, + 868.0 + ], + [ + 1237.0, + 880.0 + ], + [ + 1208.0, + 879.0 + ] + ], + "center_px": [ + 1219.75, + 873.5 + ], + "area_px": 336.5 + }, + { + "image_points_px": [ + [ + 505.0, + 850.0 + ], + [ + 514.0, + 841.0 + ], + [ + 542.0, + 841.0 + ], + [ + 534.0, + 852.0 + ] + ], + "center_px": [ + 523.75, + 846.0 + ], + "area_px": 293.5 + }, + { + "image_points_px": [ + [ + 1011.0, + 538.0 + ], + [ + 985.0, + 565.0 + ], + [ + 981.0, + 564.0 + ], + [ + 1004.0, + 540.0 + ] + ], + "center_px": [ + 995.25, + 551.75 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 840.0, + 770.0 + ], + [ + 871.0, + 770.0 + ], + [ + 870.0, + 779.0 + ], + [ + 839.0, + 779.0 + ] + ], + "center_px": [ + 855.0, + 774.5 + ], + "area_px": 279.0 + }, + { + "image_points_px": [ + [ + 1143.0, + 856.0 + ], + [ + 1172.0, + 857.0 + ], + [ + 1176.0, + 867.0 + ], + [ + 1148.0, + 867.0 + ] + ], + "center_px": [ + 1159.75, + 861.75 + ], + "area_px": 297.0 + }, + { + "image_points_px": [ + [ + 1784.0, + 726.0 + ], + [ + 1807.0, + 727.0 + ], + [ + 1822.0, + 734.0 + ], + [ + 1796.0, + 732.0 + ] + ], + "center_px": [ + 1802.25, + 729.75 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 1770.0, + 733.0 + ], + [ + 1796.0, + 735.0 + ], + [ + 1807.0, + 742.0 + ], + [ + 1781.0, + 740.0 + ] + ], + "center_px": [ + 1788.5, + 737.5 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 1716.0, + 731.0 + ], + [ + 1742.0, + 733.0 + ], + [ + 1753.0, + 739.0 + ], + [ + 1726.0, + 738.0 + ] + ], + "center_px": [ + 1734.25, + 735.25 + ], + "area_px": 156.5 + }, + { + "image_points_px": [ + [ + 830.0, + 826.0 + ], + [ + 859.0, + 827.0 + ], + [ + 857.0, + 837.0 + ], + [ + 829.0, + 836.0 + ] + ], + "center_px": [ + 843.75, + 831.5 + ], + "area_px": 286.5 + }, + { + "image_points_px": [ + [ + 1662.0, + 729.0 + ], + [ + 1687.0, + 731.0 + ], + [ + 1698.0, + 738.0 + ], + [ + 1674.0, + 737.0 + ] + ], + "center_px": [ + 1680.25, + 733.75 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 1239.0, + 824.0 + ], + [ + 1266.0, + 825.0 + ], + [ + 1272.0, + 834.0 + ], + [ + 1245.0, + 834.0 + ] + ], + "center_px": [ + 1255.5, + 829.25 + ], + "area_px": 253.5 + }, + { + "image_points_px": [ + [ + 608.0, + 847.0 + ], + [ + 613.0, + 837.0 + ], + [ + 641.0, + 837.0 + ], + [ + 631.0, + 847.0 + ] + ], + "center_px": [ + 623.25, + 842.0 + ], + "area_px": 255.0 + }, + { + "image_points_px": [ + [ + 491.0, + 799.0 + ], + [ + 500.0, + 789.0 + ], + [ + 525.0, + 791.0 + ], + [ + 517.0, + 799.0 + ] + ], + "center_px": [ + 508.25, + 794.5 + ], + "area_px": 238.0 + }, + { + "image_points_px": [ + [ + 942.0, + 526.0 + ], + [ + 944.0, + 531.0 + ], + [ + 920.0, + 553.0 + ], + [ + 918.0, + 549.0 + ] + ], + "center_px": [ + 931.0, + 539.75 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 1731.0, + 724.0 + ], + [ + 1756.0, + 726.0 + ], + [ + 1767.0, + 732.0 + ], + [ + 1741.0, + 730.0 + ] + ], + "center_px": [ + 1748.75, + 728.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1746.0, + 717.0 + ], + [ + 1770.0, + 719.0 + ], + [ + 1782.0, + 725.0 + ], + [ + 1756.0, + 723.0 + ] + ], + "center_px": [ + 1763.5, + 721.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 469.0, + 826.0 + ], + [ + 479.0, + 817.0 + ], + [ + 503.0, + 818.0 + ], + [ + 496.0, + 826.0 + ] + ], + "center_px": [ + 486.75, + 821.75 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 1608.0, + 726.0 + ], + [ + 1634.0, + 729.0 + ], + [ + 1643.0, + 735.0 + ], + [ + 1618.0, + 734.0 + ] + ], + "center_px": [ + 1625.75, + 731.0 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 1678.0, + 722.0 + ], + [ + 1703.0, + 724.0 + ], + [ + 1713.0, + 731.0 + ], + [ + 1687.0, + 728.0 + ] + ], + "center_px": [ + 1695.25, + 726.25 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 1141.0, + 812.0 + ], + [ + 1168.0, + 813.0 + ], + [ + 1171.0, + 823.0 + ], + [ + 1145.0, + 821.0 + ] + ], + "center_px": [ + 1156.25, + 817.25 + ], + "area_px": 246.5 + }, + { + "image_points_px": [ + [ + 1760.0, + 711.0 + ], + [ + 1783.0, + 712.0 + ], + [ + 1795.0, + 719.0 + ], + [ + 1770.0, + 716.0 + ] + ], + "center_px": [ + 1777.0, + 714.5 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 1589.0, + 711.0 + ], + [ + 1614.0, + 713.0 + ], + [ + 1623.0, + 719.0 + ], + [ + 1598.0, + 718.0 + ] + ], + "center_px": [ + 1606.0, + 715.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1625.0, + 720.0 + ], + [ + 1651.0, + 722.0 + ], + [ + 1659.0, + 728.0 + ], + [ + 1634.0, + 726.0 + ] + ], + "center_px": [ + 1642.25, + 724.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 1038.0, + 802.0 + ], + [ + 1064.0, + 803.0 + ], + [ + 1066.0, + 812.0 + ], + [ + 1039.0, + 811.0 + ] + ], + "center_px": [ + 1051.75, + 807.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 1709.0, + 709.0 + ], + [ + 1733.0, + 711.0 + ], + [ + 1743.0, + 717.0 + ], + [ + 1721.0, + 715.0 + ] + ], + "center_px": [ + 1726.5, + 713.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 1673.0, + 701.0 + ], + [ + 1697.0, + 702.0 + ], + [ + 1707.0, + 708.0 + ], + [ + 1681.0, + 706.0 + ] + ], + "center_px": [ + 1689.5, + 704.25 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 1642.0, + 713.0 + ], + [ + 1666.0, + 715.0 + ], + [ + 1675.0, + 722.0 + ], + [ + 1650.0, + 719.0 + ] + ], + "center_px": [ + 1658.25, + 717.25 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1724.0, + 703.0 + ], + [ + 1744.0, + 704.0 + ], + [ + 1758.0, + 710.0 + ], + [ + 1733.0, + 708.0 + ] + ], + "center_px": [ + 1739.75, + 706.25 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 505.0, + 769.0 + ], + [ + 512.0, + 760.0 + ], + [ + 536.0, + 761.0 + ], + [ + 530.0, + 769.0 + ] + ], + "center_px": [ + 520.75, + 764.75 + ], + "area_px": 211.5 + }, + { + "image_points_px": [ + [ + 1738.0, + 696.0 + ], + [ + 1762.0, + 698.0 + ], + [ + 1771.0, + 704.0 + ], + [ + 1748.0, + 702.0 + ] + ], + "center_px": [ + 1754.75, + 700.0 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 781.0, + 858.0 + ], + [ + 784.0, + 864.0 + ], + [ + 779.0, + 886.0 + ], + [ + 773.0, + 890.0 + ] + ], + "center_px": [ + 779.25, + 874.5 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 1688.0, + 695.0 + ], + [ + 1713.0, + 697.0 + ], + [ + 1721.0, + 702.0 + ], + [ + 1696.0, + 700.0 + ] + ], + "center_px": [ + 1704.5, + 698.5 + ], + "area_px": 109.0 + }, + { + "image_points_px": [ + [ + 1607.0, + 705.0 + ], + [ + 1631.0, + 706.0 + ], + [ + 1639.0, + 713.0 + ], + [ + 1613.0, + 710.0 + ] + ], + "center_px": [ + 1622.5, + 708.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 261.0, + 200.0 + ], + [ + 263.0, + 226.0 + ], + [ + 256.0, + 231.0 + ], + [ + 254.0, + 208.0 + ] + ], + "center_px": [ + 258.5, + 216.25 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 936.0, + 789.0 + ], + [ + 961.0, + 789.0 + ], + [ + 963.0, + 797.0 + ], + [ + 937.0, + 798.0 + ] + ], + "center_px": [ + 949.25, + 793.25 + ], + "area_px": 217.5 + }, + { + "image_points_px": [ + [ + 1572.0, + 697.0 + ], + [ + 1597.0, + 699.0 + ], + [ + 1604.0, + 704.0 + ], + [ + 1580.0, + 703.0 + ] + ], + "center_px": [ + 1588.25, + 700.75 + ], + "area_px": 123.5 + }, + { + "image_points_px": [ + [ + 455.0, + 443.0 + ], + [ + 459.0, + 446.0 + ], + [ + 459.0, + 475.0 + ], + [ + 455.0, + 471.0 + ] + ], + "center_px": [ + 457.0, + 458.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 1639.0, + 875.0 + ], + [ + 1624.0, + 879.0 + ], + [ + 1606.0, + 879.0 + ], + [ + 1617.0, + 875.0 + ] + ], + "center_px": [ + 1621.5, + 877.0 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 182.0, + 7.0 + ], + [ + 188.0, + 24.0 + ], + [ + 188.0, + 38.0 + ], + [ + 181.0, + 34.0 + ] + ], + "center_px": [ + 184.75, + 25.75 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 1703.0, + 689.0 + ], + [ + 1726.0, + 691.0 + ], + [ + 1735.0, + 696.0 + ], + [ + 1712.0, + 694.0 + ] + ], + "center_px": [ + 1719.0, + 692.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 1655.0, + 687.0 + ], + [ + 1678.0, + 689.0 + ], + [ + 1686.0, + 694.0 + ], + [ + 1662.0, + 692.0 + ] + ], + "center_px": [ + 1670.25, + 690.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 1718.0, + 683.0 + ], + [ + 1741.0, + 685.0 + ], + [ + 1749.0, + 690.0 + ], + [ + 1725.0, + 688.0 + ] + ], + "center_px": [ + 1733.25, + 686.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 1605.0, + 686.0 + ], + [ + 1628.0, + 687.0 + ], + [ + 1636.0, + 693.0 + ], + [ + 1616.0, + 691.0 + ] + ], + "center_px": [ + 1621.25, + 689.25 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 1557.0, + 683.0 + ], + [ + 1580.0, + 685.0 + ], + [ + 1587.0, + 690.0 + ], + [ + 1563.0, + 689.0 + ] + ], + "center_px": [ + 1571.75, + 686.75 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 1590.0, + 691.0 + ], + [ + 1613.0, + 693.0 + ], + [ + 1620.0, + 698.0 + ], + [ + 1597.0, + 697.0 + ] + ], + "center_px": [ + 1605.0, + 694.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 620.0, + 737.0 + ], + [ + 625.0, + 730.0 + ], + [ + 648.0, + 731.0 + ], + [ + 643.0, + 738.0 + ] + ], + "center_px": [ + 634.0, + 734.0 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 1636.0, + 675.0 + ], + [ + 1658.0, + 676.0 + ], + [ + 1666.0, + 681.0 + ], + [ + 1644.0, + 680.0 + ] + ], + "center_px": [ + 1651.0, + 678.0 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 1670.0, + 682.0 + ], + [ + 1692.0, + 683.0 + ], + [ + 1700.0, + 688.0 + ], + [ + 1676.0, + 686.0 + ] + ], + "center_px": [ + 1684.5, + 684.75 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 1621.0, + 680.0 + ], + [ + 1640.0, + 681.0 + ], + [ + 1651.0, + 686.0 + ], + [ + 1628.0, + 685.0 + ] + ], + "center_px": [ + 1635.0, + 683.0 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 767.0 + ], + [ + 1153.0, + 768.0 + ], + [ + 1156.0, + 775.0 + ], + [ + 1135.0, + 775.0 + ] + ], + "center_px": [ + 1143.25, + 771.25 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 398.0, + 22.0 + ], + [ + 402.0, + 26.0 + ], + [ + 401.0, + 51.0 + ], + [ + 396.0, + 48.0 + ] + ], + "center_px": [ + 399.25, + 36.75 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 1177.0, + 745.0 + ], + [ + 1200.0, + 745.0 + ], + [ + 1204.0, + 752.0 + ], + [ + 1181.0, + 752.0 + ] + ], + "center_px": [ + 1190.5, + 748.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1079.0, + 756.0 + ], + [ + 1102.0, + 757.0 + ], + [ + 1105.0, + 764.0 + ], + [ + 1081.0, + 763.0 + ] + ], + "center_px": [ + 1091.75, + 760.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 1135.0, + 750.0 + ], + [ + 1157.0, + 750.0 + ], + [ + 1162.0, + 757.0 + ], + [ + 1139.0, + 757.0 + ] + ], + "center_px": [ + 1148.25, + 753.5 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 1573.0, + 678.0 + ], + [ + 1592.0, + 679.0 + ], + [ + 1602.0, + 685.0 + ], + [ + 1580.0, + 683.0 + ] + ], + "center_px": [ + 1586.75, + 681.25 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 1619.0, + 662.0 + ], + [ + 1639.0, + 663.0 + ], + [ + 1648.0, + 668.0 + ], + [ + 1626.0, + 667.0 + ] + ], + "center_px": [ + 1633.0, + 665.0 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 681.0, + 746.0 + ], + [ + 685.0, + 739.0 + ], + [ + 708.0, + 740.0 + ], + [ + 703.0, + 746.0 + ] + ], + "center_px": [ + 694.25, + 742.75 + ], + "area_px": 148.5 + }, + { + "image_points_px": [ + [ + 1574.0, + 660.0 + ], + [ + 1595.0, + 662.0 + ], + [ + 1602.0, + 667.0 + ], + [ + 1579.0, + 665.0 + ] + ], + "center_px": [ + 1587.5, + 663.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 1542.0, + 671.0 + ], + [ + 1564.0, + 672.0 + ], + [ + 1570.0, + 677.0 + ], + [ + 1548.0, + 676.0 + ] + ], + "center_px": [ + 1556.0, + 674.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 1605.0, + 667.0 + ], + [ + 1626.0, + 669.0 + ], + [ + 1633.0, + 674.0 + ], + [ + 1611.0, + 672.0 + ] + ], + "center_px": [ + 1618.75, + 670.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 1590.0, + 673.0 + ], + [ + 1611.0, + 674.0 + ], + [ + 1618.0, + 679.0 + ], + [ + 1595.0, + 677.0 + ] + ], + "center_px": [ + 1603.5, + 675.75 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 692.0, + 724.0 + ], + [ + 696.0, + 717.0 + ], + [ + 717.0, + 718.0 + ], + [ + 714.0, + 724.0 + ] + ], + "center_px": [ + 704.75, + 720.75 + ], + "area_px": 141.5 + }, + { + "image_points_px": [ + [ + 661.0, + 111.0 + ], + [ + 664.0, + 112.0 + ], + [ + 664.0, + 138.0 + ], + [ + 661.0, + 130.0 + ] + ], + "center_px": [ + 662.5, + 122.75 + ], + "area_px": 67.5 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam2_camera_pose.json b/test/y-axis-finder-examples/20260612_190104/cam2_camera_pose.json new file mode 100644 index 0000000..c4638f0 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190104/cam2_camera_pose.json @@ -0,0 +1,397 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:01:12Z", + "source": { + "detection_json": "/app/data/board/20260612_190104/cam2_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam2", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 14, + "used_marker_ids": [ + 82, + 55, + 97, + 79, + 54, + 86, + 47, + 96, + 62, + 53, + 0, + 50, + 102, + 48 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.007248107658778775, + 0.001138453540791939, + 0.001093970748147815, + 0.0010939704849369002 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 2.155713920760765, + "residual_median_px": 0.6221284009078569, + "residual_max_px": 7.501217984105138, + "sigma2_normalized": 1.5231636278868411e-06 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.021201852709054947, + -0.9994443655014038, + 0.025717686861753464 + ], + [ + -0.18026070296764374, + -0.021480444818735123, + -0.9833843111991882 + ], + [ + 0.9833903312683105, + -0.025485455989837646, + -0.17970512807369232 + ] + ], + "translation_m": [ + -0.06586968153715134, + 0.3111283779144287, + 0.649000883102417 + ], + "rvec_rad": [ + 1.3484514407444357, + -1.3481330361635824, + 1.1531796144363664 + ] + }, + "camera_in_world": { + "position_m": [ + -0.583533525466919, + -0.04260982573032379, + 0.42428159713745117 + ], + "position_mm": [ + -583.5335083007812, + -42.609825134277344, + 424.2815856933594 + ], + "orientation_deg": { + "roll": -171.92822265625, + "pitch": -79.54266357421875, + "yaw": -96.70817565917969 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 6.4594000171960524e-06, + -3.2324532334867306e-06, + -3.5270358443857963e-06, + -5.94977836053978e-07, + 2.5419321309202577e-06, + 7.886418225406485e-07 + ], + [ + -3.2324532334867577e-06, + 8.936276159870285e-06, + -2.3766223937093423e-06, + -2.7974030389964423e-06, + -2.881567645112875e-06, + -1.0549512396239754e-06 + ], + [ + -3.5270358443857175e-06, + -2.3766223937093863e-06, + 1.424829220436036e-05, + 4.697256316974025e-06, + -1.7003711044128018e-06, + -2.1380025910881637e-07 + ], + [ + -5.949778360539509e-07, + -2.797403038996459e-06, + 4.697256316974026e-06, + 2.1705723396858046e-06, + 1.3343817025818789e-07, + 1.959107120572131e-07 + ], + [ + 2.5419321309202565e-06, + -2.881567645112862e-06, + -1.7003711044128297e-06, + 1.3343817025817658e-07, + 1.7584087081804106e-06, + 9.835608135201958e-07 + ], + [ + 7.886418225406508e-07, + -1.0549512396239703e-06, + -2.1380025910882762e-07, + 1.9591071205720694e-07, + 9.835608135201964e-07, + 2.058542325894411e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.1456192274176634, + 0.1712777397185073, + 0.21627386371287913 + ], + "tvec_std_m": [ + 0.001473286238205531, + 0.0013260500398478221, + 0.0014347621147404231 + ] + }, + "camera_center_std_m": [ + 0.0017077450417900175, + 0.003968930213085602, + 0.0031107599308929836 + ], + "camera_center_std_mm": [ + 1.7077450417900175, + 3.968930213085602, + 3.1107599308929834 + ], + "orientation_std_deg": { + "roll": 1.015987263659873, + "pitch": 0.16623569877188035, + "yaw": 0.9721075235702595 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 82, + "observed_center_px": [ + 337.25, + 1033.75 + ], + "projected_center_px": [ + 336.156005859375, + 1033.67529296875 + ], + "reprojection_error_px": 1.0965419828898575, + "confidence": 0.23052801076681903 + }, + { + "marker_id": 55, + "observed_center_px": [ + 1210.0, + 1005.25 + ], + "projected_center_px": [ + 1209.6336669921875, + 1005.70068359375 + ], + "reprojection_error_px": 0.5807887518610947, + "confidence": 0.207 + }, + { + "marker_id": 97, + "observed_center_px": [ + 1345.0, + 994.0 + ], + "projected_center_px": [ + 1345.273681640625, + 994.0942993164062 + ], + "reprojection_error_px": 0.28947193558249773, + "confidence": 0.22010066111880033 + }, + { + "marker_id": 79, + "observed_center_px": [ + 1052.5, + 981.0 + ], + "projected_center_px": [ + 1051.9365234375, + 980.8867797851562 + ], + "reprojection_error_px": 0.5747387698216306, + "confidence": 0.18758334653839537 + }, + { + "marker_id": 54, + "observed_center_px": [ + 1289.5, + 967.0 + ], + "projected_center_px": [ + 1289.243896484375, + 966.6799926757812 + ], + "reprojection_error_px": 0.40987034324177296, + "confidence": 0.17270146499284353 + }, + { + "marker_id": 86, + "observed_center_px": [ + 426.0, + 931.0 + ], + "projected_center_px": [ + 426.0010986328125, + 930.8665771484375 + ], + "reprojection_error_px": 0.1334273746767342, + "confidence": 0.19680000781631377 + }, + { + "marker_id": 47, + "observed_center_px": [ + 1227.25, + 964.5 + ], + "projected_center_px": [ + 1226.8851318359375, + 963.751953125 + ], + "reprojection_error_px": 0.832287753330304, + "confidence": 0.15924701908656527 + }, + { + "marker_id": 96, + "observed_center_px": [ + 1083.75, + 944.0 + ], + "projected_center_px": [ + 1082.9525146484375, + 943.5097045898438 + ], + "reprojection_error_px": 0.9361476780813216, + "confidence": 0.1482961280735694 + }, + { + "marker_id": 62, + "observed_center_px": [ + 1063.75, + 922.0 + ], + "projected_center_px": [ + 1063.12744140625, + 921.7706298828125 + ], + "reprojection_error_px": 0.6634680499546192, + "confidence": 0.11147160908708433 + }, + { + "marker_id": 53, + "observed_center_px": [ + 578.25, + 864.75 + ], + "projected_center_px": [ + 578.2576293945312, + 864.9274291992188 + ], + "reprojection_error_px": 0.17759315413697777, + "confidence": 0.09938161625332304 + }, + { + "marker_id": 0, + "observed_center_px": [ + 955.0, + 846.5 + ], + "projected_center_px": [ + 961.9010620117188, + 849.4400024414062 + ], + "reprojection_error_px": 7.501217984105138, + "confidence": 0.08099931081136068 + }, + { + "marker_id": 50, + "observed_center_px": [ + 604.0, + 825.0 + ], + "projected_center_px": [ + 603.9185791015625, + 824.517333984375 + ], + "reprojection_error_px": 0.48948528613399855, + "confidence": 0.0777460225423177 + }, + { + "marker_id": 102, + "observed_center_px": [ + 1092.25, + 805.75 + ], + "projected_center_px": [ + 1091.0667724609375, + 805.486572265625 + ], + "reprojection_error_px": 1.2121970056198974, + "confidence": 0.047255722987798995 + }, + { + "marker_id": 48, + "observed_center_px": [ + 1190.25, + 794.25 + ], + "projected_center_px": [ + 1188.7596435546875, + 793.425048828125 + ], + "reprojection_error_px": 1.7034396878265008, + "confidence": 0.04925312470753987 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190104/cam2_debug.jpg b/test/y-axis-finder-examples/20260612_190104/cam2_debug.jpg new file mode 100644 index 0000000..68ec5d4 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190104/cam2_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.csv b/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.csv new file mode 100644 index 0000000..ab08e27 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.csv @@ -0,0 +1,24 @@ +marker_id,link,set,num_cameras,x_mm,y_mm,z_mm,nx,ny,nz,model_x_mm,model_y_mm,model_z_mm,dist_to_model_mm,delta_z_mm,edge_length_mm +47,Board,A0,2,338.21,-283.65,-29.38,-0.01811,0.04176,0.99896,337.68,-283.42,-28.83,0.795,-0.55,23.48 +50,Board,A0,2,575.98,208.79,-25.09,-0.03612,0.04104,0.9985,578.55,209.43,-26.11,2.833,1.018,23.17 +53,Board,A0,2,489.19,211.22,-25.76,0.01113,0.06244,0.99799,491.43,211.87,-27.1,2.692,1.344,24.18 +55,Board,A0,3,277.02,-257.91,-28.87,-0.01583,0.04502,0.99886,277.76,-258.03,-29.52,0.994,0.65,23.43 +79,Board,A0,3,307.81,-155.31,-28.77,0.00426,0.01709,0.99984,308.77,-155.27,-29.18,1.043,0.406,23.82 +86,Board,A0,2,368.74,294.18,-28.11,-0.03979,0.01354,0.99912,370,294.53,-28.5,1.368,0.386,23.39 +96,Board,A0,2,365.09,-183.98,-28.16,0.00349,0.04632,0.99892,365.58,-183.99,-28.52,0.61,0.362,24.26 +97,Board,A0,2,294.93,-355.08,-28.65,0.00468,0.03153,0.99949,296.09,-355.58,-29.3,1.419,0.645,23.58 +180,unknown,,3,270.07,-446.86,148.04,-0.6007,-0.30616,0.73853,,,,,,23.82 +189,unknown,,3,261.93,-431.5,114.4,-0.98376,0.05677,0.17027,,,,,,23.82 +197,unknown,,2,139.62,-123.85,109.07,-0.99911,0.0245,-0.03434,,,,,,24.56 +201,unknown,,3,83.47,58.87,89.97,-0.99933,-0.00241,0.03656,,,,,,24.35 +204,unknown,,3,118.73,130.98,111.23,-0.00447,0.0504,0.99872,,,,,,23.78 +218,unknown,,3,244.98,-235.08,130.03,-0.91277,0.07538,0.40146,,,,,,24.08 +219,unknown,,3,244.93,-341.29,141.72,-0.92296,0.0384,0.38298,,,,,,24.33 +226,unknown,,3,278.0,-121.22,140.05,0.03732,0.14573,0.98862,,,,,,23.84 +229,unknown,,2,188.74,-117.78,139.92,-0.01469,0.22678,0.97384,,,,,,23.47 +243,unknown,,2,187.86,-159.2,115.38,0.0115,-0.98548,0.16942,,,,,,24.33 + +camera_id,x_mm,y_mm,z_mm,dir_x,dir_y,dir_z +cam0,-720.15,-487.06,670.71,0.85714,0.40418,-0.3193 +cam1,-264.65,-544.17,843.83,0.56901,0.32489,-0.75543 +cam2,-584.63,-39.6,423.32,0.98357,-0.02788,-0.17837 diff --git a/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.json b/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.json new file mode 100644 index 0000000..6b3ce08 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/aruco_marker_poses.json @@ -0,0 +1,859 @@ +{ + "schema_version": "1.1", + "stage": "corner_marker_poses", + "created_utc": "2026-06-12T19:02:50Z", + "summary": { + "num_cameras": 3, + "num_markers": 18 + }, + "cameras": [ + { + "camera_id": "cam0", + "position_m": [ + -0.7201544100074937, + -0.48705793983084256, + 0.6707111069456531 + ], + "position_mm": [ + -720.1544100074937, + -487.05793983084254, + 670.711106945653 + ], + "direction": [ + 0.8571406006813049, + 0.4041753113269806, + -0.31929975748062134 + ] + }, + { + "camera_id": "cam1", + "position_m": [ + -0.26465423915458053, + -0.5441729848160466, + 0.8438284183851406 + ], + "position_mm": [ + -264.6542391545805, + -544.1729848160466, + 843.8284183851406 + ], + "direction": [ + 0.5690050721168518, + 0.3248927593231201, + -0.7554323077201843 + ] + }, + { + "camera_id": "cam2", + "position_m": [ + -0.5846257821893669, + -0.03959848327167603, + 0.42331815786922655 + ], + "position_mm": [ + -584.6257821893669, + -39.59848327167603, + 423.3181578692265 + ], + "direction": [ + 0.9835684895515442, + -0.027876116335392, + -0.17837022244930267 + ] + } + ], + "markers": [ + { + "marker_id": 47, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3382068063546062, + -0.283648872885339, + -0.029379639886670493 + ], + "position_mm": [ + 338.2068063546062, + -283.648872885339, + -29.379639886670493 + ], + "normal": [ + -0.018107012058621065, + 0.04175644919334975, + 0.998963730605407 + ], + "corners_m": [ + [ + 0.3270971794343852, + -0.2957310463110258, + -0.029221651617277106 + ], + [ + 0.32681533448254657, + -0.27097384271065406, + -0.029987357739541844 + ], + [ + 0.3506877155863978, + -0.2719724348106855, + -0.02977414879802638 + ], + [ + 0.34822699591509515, + -0.2959181677089907, + -0.02853540139183664 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.47758191868563 + }, + { + "marker_id": 50, + "link": "Board", + "set": "A0", + "position_m": [ + 0.5759847970558043, + 0.20878982981596897, + -0.025091914342401593 + ], + "position_mm": [ + 575.9847970558043, + 208.78982981596897, + -25.091914342401594 + ], + "normal": [ + -0.036121234231723635, + 0.04104252459693691, + 0.9985042651948397 + ], + "corners_m": [ + [ + 0.5642598164571903, + 0.1969085212587881, + -0.024955560923412376 + ], + [ + 0.5657891012480536, + 0.22127053421363824, + -0.02605005660904709 + ], + [ + 0.587089164396768, + 0.22065706943805213, + -0.02510147296517567 + ], + [ + 0.5868011061212057, + 0.19632319435339737, + -0.02426056687197123 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.168547203402927 + }, + { + "marker_id": 53, + "link": "Board", + "set": "A0", + "position_m": [ + 0.4891900163881931, + 0.21121944547444496, + -0.025756167733611703 + ], + "position_mm": [ + 489.1900163881931, + 211.21944547444497, + -25.756167733611704 + ], + "normal": [ + 0.011128086685223951, + 0.06244141012972508, + 0.9979865910861416 + ], + "corners_m": [ + [ + 0.47688131408744444, + 0.19956020855831932, + -0.02543676379660587 + ], + [ + 0.4777222296928443, + 0.22325892767153135, + -0.02589688723132351 + ], + [ + 0.5030412649428535, + 0.22349402064084614, + -0.02713433602194038 + ], + [ + 0.49911525682963026, + 0.19856462502708302, + -0.024556683884577053 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.177500966099156 + }, + { + "marker_id": 55, + "link": "Board", + "set": "A0", + "position_m": [ + 0.2770178023390555, + -0.2579076972856531, + -0.028869922299775135 + ], + "position_mm": [ + 277.0178023390555, + -257.9076972856531, + -28.869922299775133 + ], + "normal": [ + -0.01583380225649627, + 0.045024013953082864, + 0.9988604151099667 + ], + "corners_m": [ + [ + 0.2646384399617925, + -0.26941312561510916, + -0.028893072128895057 + ], + [ + 0.26635359388112984, + -0.24584468471889775, + -0.029239766413308624 + ], + [ + 0.2895062470545584, + -0.24628628433164657, + -0.029534445141012822 + ], + [ + 0.2875729284587412, + -0.270086694476959, + -0.027812405515884042 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.425669496829165 + }, + { + "marker_id": 79, + "link": "Board", + "set": "A0", + "position_m": [ + 0.30781029761263834, + -0.15531229877541092, + -0.028774290387492463 + ], + "position_mm": [ + 307.81029761263835, + -155.3122987754109, + -28.774290387492464 + ], + "normal": [ + 0.004264964103407638, + 0.017090366490424003, + 0.9998448526918662 + ], + "corners_m": [ + [ + 0.2950491134028762, + -0.1666986769644144, + -0.0286124580353631 + ], + [ + 0.29645496103050645, + -0.14332378362751674, + -0.02884344825563282 + ], + [ + 0.32056304841764144, + -0.14383701753747136, + -0.02911148207840972 + ], + [ + 0.3191740675995295, + -0.1673897169722412, + -0.02852977318056421 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.81727285880101 + }, + { + "marker_id": 86, + "link": "Board", + "set": "A0", + "position_m": [ + 0.36873599762280646, + 0.2941772216580727, + -0.02811368666082353 + ], + "position_mm": [ + 368.73599762280645, + 294.1772216580727, + -28.11368666082353 + ], + "normal": [ + -0.039786243832423664, + 0.013542559632416573, + 0.9991164365980121 + ], + "corners_m": [ + [ + 0.35730152483811345, + 0.2825235617088924, + -0.028791608861767973 + ], + [ + 0.3575701177680951, + 0.30640754823690936, + -0.02836618262469665 + ], + [ + 0.38090929677572377, + 0.3060493150180208, + -0.028140304510588368 + ], + [ + 0.37916305110929366, + 0.2817284616684682, + -0.027156650646241134 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.39314843955663 + }, + { + "marker_id": 96, + "link": "Board", + "set": "A0", + "position_m": [ + 0.3650887630681655, + -0.18397711545125672, + -0.028158049732942825 + ], + "position_mm": [ + 365.0887630681655, + -183.97711545125674, + -28.158049732942825 + ], + "normal": [ + 0.0034855659822991825, + 0.0463217546305117, + 0.9989204902682364 + ], + "corners_m": [ + [ + 0.3512750995973868, + -0.19554905736849995, + -0.02766409607905227 + ], + [ + 0.35448792900391174, + -0.1712778474780895, + -0.028616964648064225 + ], + [ + 0.37857591951687286, + -0.1728017233554196, + -0.02881945565025606 + ], + [ + 0.3760161041544907, + -0.19627983360301782, + -0.02753168255439874 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.260734676484557 + }, + { + "marker_id": 97, + "link": "Board", + "set": "A0", + "position_m": [ + 0.29492779052997814, + -0.35508342317576364, + -0.028654991954414274 + ], + "position_mm": [ + 294.92779052997815, + -355.08342317576364, + -28.654991954414275 + ], + "normal": [ + 0.004681394442789528, + 0.031528787414058866, + 0.9994918809626571 + ], + "corners_m": [ + [ + 0.28269220128105094, + -0.3667571800635026, + -0.028043787429016653 + ], + [ + 0.283798505808649, + -0.34280209013807944, + -0.029168416838632992 + ], + [ + 0.3076265983603983, + -0.34365117082339447, + -0.028893228975659168 + ], + [ + 0.30559385666981426, + -0.3671232516780781, + -0.028514534574348285 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.581045124118244 + }, + { + "marker_id": 180, + "link": "unknown", + "set": "", + "position_m": [ + 0.2700679139271133, + -0.44686472383491854, + 0.1480405275508206 + ], + "position_mm": [ + 270.0679139271133, + -446.86472383491855, + 148.0405275508206 + ], + "normal": [ + -0.6006987691916348, + -0.30616168893928486, + 0.7385296262963997 + ], + "corners_m": [ + [ + 0.2724040059573754, + -0.46287971575872333, + 0.14337517293259983 + ], + [ + 0.2567970204992979, + -0.4452330595691268, + 0.1378500853836622 + ], + [ + 0.26770741253168934, + -0.43075481328373466, + 0.15287142870791812 + ], + [ + 0.2833632167200905, + -0.4485913067280894, + 0.15806542317910227 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.81865678799756 + }, + { + "marker_id": 189, + "link": "unknown", + "set": "", + "position_m": [ + 0.2619331461846941, + -0.4315015407266738, + 0.11440467777749919 + ], + "position_mm": [ + 261.9331461846941, + -431.5015407266738, + 114.40467777749919 + ], + "normal": [ + -0.9837600894643872, + 0.05676804970200547, + 0.1702747042577131 + ], + "corners_m": [ + [ + 0.2629683312797077, + -0.44339902827383426, + 0.1263141698725682 + ], + [ + 0.25955133977491596, + -0.44364869879156055, + 0.10275359915421856 + ], + [ + 0.2602882024531369, + -0.4194295798201675, + 0.10285898753536349 + ], + [ + 0.2649247112310159, + -0.4195288560211329, + 0.12569195454784654 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.824098078351042 + }, + { + "marker_id": 197, + "link": "unknown", + "set": "", + "position_m": [ + 0.1396176490192085, + -0.12385297384189062, + 0.10907194175975259 + ], + "position_mm": [ + 139.6176490192085, + -123.85297384189062, + 109.07194175975259 + ], + "normal": [ + -0.9991097121920407, + 0.024499695775306266, + -0.034344547026495434 + ], + "corners_m": [ + [ + 0.13847051764570883, + -0.13314309476411054, + 0.12437432474366612 + ], + [ + 0.13996943011617297, + -0.13834533704731108, + 0.09964512414263772 + ], + [ + 0.1399539369649718, + -0.11409689141471022, + 0.09439771280013202 + ], + [ + 0.14007671134998043, + -0.10982657214143063, + 0.1178706053525745 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.560728280074386 + }, + { + "marker_id": 201, + "link": "unknown", + "set": "", + "position_m": [ + 0.08347346375926307, + 0.058868306266726726, + 0.08996708205955196 + ], + "position_mm": [ + 83.47346375926307, + 58.86830626672673, + 89.96708205955197 + ], + "normal": [ + -0.9993284387279755, + -0.002414558705698657, + 0.036562842555848886 + ], + "corners_m": [ + [ + 0.08400974979366777, + 0.07059233490731219, + 0.10191583759078152 + ], + [ + 0.0838306114243409, + 0.046255571317921074, + 0.10227112657351876 + ], + [ + 0.08317311987835356, + 0.04707631030171191, + 0.07762705998064305 + ], + [ + 0.08288037394069, + 0.07154900853996174, + 0.07805430409326453 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.34802054876952 + }, + { + "marker_id": 204, + "link": "unknown", + "set": "", + "position_m": [ + 0.11872733362211589, + 0.13097920872071422, + 0.11123470474221374 + ], + "position_mm": [ + 118.72733362211589, + 130.9792087207142, + 111.23470474221374 + ], + "normal": [ + -0.004474508481635519, + 0.050403773391193646, + 0.9987188985904778 + ], + "corners_m": [ + [ + 0.10753123297431019, + 0.14312043861125584, + 0.11047460533287934 + ], + [ + 0.13057168333051472, + 0.14323550721555423, + 0.11076512105994221 + ], + [ + 0.12999608107253446, + 0.11866552590076498, + 0.1118113706679391 + ], + [ + 0.10681033711110417, + 0.11889536315528176, + 0.1118877219080943 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.776380533217246 + }, + { + "marker_id": 218, + "link": "unknown", + "set": "", + "position_m": [ + 0.24498463899342335, + -0.23507985527427827, + 0.13003180301573652 + ], + "position_mm": [ + 244.98463899342335, + -235.07985527427826, + 130.03180301573653 + ], + "normal": [ + -0.9127702932767556, + 0.07538344538928804, + 0.40145700625684166 + ], + "corners_m": [ + [ + 0.24018220976991755, + -0.22382404128610536, + 0.11841235289517826 + ], + [ + 0.2508508990912934, + -0.222061411855815, + 0.13955893756722973 + ], + [ + 0.24874490293884877, + -0.24666254033730997, + 0.14212378718065807 + ], + [ + 0.24016054417363372, + -0.24777142761788273, + 0.12003213441988007 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.075952509300244 + }, + { + "marker_id": 219, + "link": "unknown", + "set": "", + "position_m": [ + 0.24492634517495548, + -0.3412939777778298, + 0.14171735878806702 + ], + "position_mm": [ + 244.9263451749555, + -341.2939777778298, + 141.717358788067 + ], + "normal": [ + -0.9229596027481167, + 0.038404982472089344, + 0.38297601624169264 + ], + "corners_m": [ + [ + 0.2402258811916882, + -0.33028021817912206, + 0.12939804197898108 + ], + [ + 0.24964431727563502, + -0.32798578574893655, + 0.1516409893135448 + ], + [ + 0.2495276940792813, + -0.3524312407295393, + 0.15403575081900053 + ], + [ + 0.2403074881532174, + -0.35447866645372134, + 0.13179465304074162 + ] + ], + "num_cameras": 3, + "edge_length_mm": 24.326673816624254 + }, + { + "marker_id": 226, + "link": "unknown", + "set": "", + "position_m": [ + 0.27799610734447416, + -0.12122434356148043, + 0.14005165088777843 + ], + "position_mm": [ + 277.9961073444742, + -121.22434356148042, + 140.05165088777844 + ], + "normal": [ + 0.03731793637335781, + 0.1457267519419907, + 0.9886207995957154 + ], + "corners_m": [ + [ + 0.26692866472298493, + -0.10937534087812126, + 0.1390049498949989 + ], + [ + 0.2908297897994939, + -0.10923905053510946, + 0.1375200769839389 + ], + [ + 0.2886338783508827, + -0.13306284844002014, + 0.14168648903554654 + ], + [ + 0.26559209650453514, + -0.13322013439267086, + 0.1419950876366295 + ] + ], + "num_cameras": 3, + "edge_length_mm": 23.836379979175288 + }, + { + "marker_id": 229, + "link": "unknown", + "set": "", + "position_m": [ + 0.18874226613268555, + -0.117779507204062, + 0.13991658869135887 + ], + "position_mm": [ + 188.74226613268556, + -117.779507204062, + 139.91658869135887 + ], + "normal": [ + -0.014692271370873252, + 0.2267766917479725, + 0.9738359560222707 + ], + "corners_m": [ + [ + 0.177271340819633, + -0.10627990356151631, + 0.1368832551368689 + ], + [ + 0.19958206178460242, + -0.10578668860377353, + 0.1374633060421795 + ], + [ + 0.2006918731846586, + -0.12978687054749005, + 0.14272420328007737 + ], + [ + 0.17742378874184825, + -0.12926456610346812, + 0.14259559030630972 + ] + ], + "num_cameras": 2, + "edge_length_mm": 23.469359052921362 + }, + { + "marker_id": 243, + "link": "unknown", + "set": "", + "position_m": [ + 0.1878617043951002, + -0.15919980365137432, + 0.11538032966353823 + ], + "position_mm": [ + 187.8617043951002, + -159.1998036513743, + 115.38032966353823 + ], + "normal": [ + 0.01149660429764313, + -0.985476260484058, + 0.16942363504535207 + ], + "corners_m": [ + [ + 0.17533213154955338, + -0.1574797975819566, + 0.12864524484636664 + ], + [ + 0.19965827187066756, + -0.15655217909018093, + 0.1272435318283527 + ], + [ + 0.19909579361294027, + -0.1615872507396788, + 0.10376610837024908 + ], + [ + 0.17736062054723956, + -0.1611799871936809, + 0.10186643360918454 + ] + ], + "num_cameras": 2, + "edge_length_mm": 24.333269401235214 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam0.jpg b/test/y-axis-finder-examples/20260612_190241/cam0.jpg new file mode 100644 index 0000000..ba860f8 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam0.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/cam0_aruco_detection.json b/test/y-axis-finder-examples/20260612_190241/cam0_aruco_detection.json new file mode 100644 index 0000000..23cd21e --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam0_aruco_detection.json @@ -0,0 +1,2427 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:44Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam0", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam0_calibration.npz", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190241/cam0.jpg", + "image_sha256": "02215a286979a7d46a65fc8b84f8769f4a983484ca647e6e62984be5bd2acfe5", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 19, + "num_rejected_candidates": 54 + }, + "detections": [ + { + "observation_id": "77b908b4-18b1-4d38-98f0-265adf285938", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1017.0, + 745.0 + ], + [ + 1016.0, + 711.0 + ], + [ + 1052.0, + 713.0 + ], + [ + 1052.0, + 747.0 + ] + ], + "center_px": [ + 1034.25, + 729.0 + ], + "quality": { + "area_px": 1206.0, + "perimeter_px": 139.1273078918457, + "sharpness": { + "laplacian_var": 2501.5697697709493 + }, + "contrast": { + "p05": 10.0, + "p95": 183.0, + "dynamic_range": 173.0, + "mean_gray": 77.60072815533981, + "std_gray": 67.1576145618987 + }, + "geometry": { + "distance_to_center_norm": 0.5828728079795837, + "distance_to_border_px": 213.0 + }, + "edge_ratio": 1.0604562198414522, + "edge_lengths_px": [ + 34.01470184326172, + 36.055511474609375, + 34.0, + 35.05709457397461 + ] + }, + "confidence": 0.758164255116732 + }, + { + "observation_id": "e1b82766-4670-4149-aded-7911b1e566bb", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1187.0, + 758.0 + ], + [ + 1185.0, + 790.0 + ], + [ + 1149.0, + 784.0 + ], + [ + 1151.0, + 753.0 + ] + ], + "center_px": [ + 1168.0, + 771.25 + ], + "quality": { + "area_px": 1145.0, + "perimeter_px": 135.96902465820312, + "sharpness": { + "laplacian_var": 1926.7855993663522 + }, + "contrast": { + "p05": 12.0, + "p95": 170.8499999999999, + "dynamic_range": 158.8499999999999, + "mean_gray": 86.03233830845771, + "std_gray": 63.505054830774505 + }, + "geometry": { + "distance_to_center_norm": 0.7537515759468079, + "distance_to_border_px": 93.0 + }, + "edge_ratio": 1.1748662928897031, + "edge_lengths_px": [ + 32.06243896484375, + 36.49657440185547, + 31.064449310302734, + 36.34556198120117 + ] + }, + "confidence": 0.6497193237673347 + }, + { + "observation_id": "998381be-d7ff-4975-933d-e8dc9481abf6", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1218.0, + 735.0 + ], + [ + 1189.0, + 748.0 + ], + [ + 1170.0, + 719.0 + ], + [ + 1199.0, + 706.0 + ] + ], + "center_px": [ + 1194.0, + 727.0 + ], + "quality": { + "area_px": 1088.0, + "perimeter_px": 132.90073776245117, + "sharpness": { + "laplacian_var": 2816.3558387399103 + }, + "contrast": { + "p05": 52.0, + "p95": 219.0, + "dynamic_range": 167.0, + "mean_gray": 124.17924528301887, + "std_gray": 63.623356426617065 + }, + "geometry": { + "distance_to_center_norm": 0.758210301399231, + "distance_to_border_px": 62.0 + }, + "edge_ratio": 1.0909166311420033, + "edge_lengths_px": [ + 31.78049659729004, + 34.66987228393555, + 31.78049659729004, + 34.66987228393555 + ] + }, + "confidence": 0.664884293288327 + }, + { + "observation_id": "295997ff-b43b-425a-95d5-cf0b40043a1e", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 875.0, + 736.0 + ], + [ + 876.0, + 705.0 + ], + [ + 907.0, + 708.0 + ], + [ + 906.0, + 739.0 + ] + ], + "center_px": [ + 891.0, + 722.0 + ], + "quality": { + "area_px": 964.0, + "perimeter_px": 124.32189559936523, + "sharpness": { + "laplacian_var": 2418.9599321612304 + }, + "contrast": { + "p05": 17.0, + "p95": 187.79999999999995, + "dynamic_range": 170.79999999999995, + "mean_gray": 79.09473684210526, + "std_gray": 65.88129027568749 + }, + "geometry": { + "distance_to_center_norm": 0.4358271360397339, + "distance_to_border_px": 221.0 + }, + "edge_ratio": 1.0041494013239465, + "edge_lengths_px": [ + 31.016124725341797, + 31.14482307434082, + 31.016124725341797, + 31.14482307434082 + ] + }, + "confidence": 0.6400110041586704 + }, + { + "observation_id": "637576bf-95fc-4982-ae4d-3372c065466c", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 719.0, + 776.0 + ], + [ + 728.0, + 806.0 + ], + [ + 698.0, + 807.0 + ], + [ + 691.0, + 778.0 + ] + ], + "center_px": [ + 709.0, + 791.75 + ], + "quality": { + "area_px": 867.5, + "perimeter_px": 119.24178695678711, + "sharpness": { + "laplacian_var": 2563.293767268979 + }, + "contrast": { + "p05": 17.0, + "p95": 159.85000000000002, + "dynamic_range": 142.85000000000002, + "mean_gray": 90.35761589403974, + "std_gray": 55.52633100949172 + }, + "geometry": { + "distance_to_center_norm": 0.3991183042526245, + "distance_to_border_px": 153.0 + }, + "edge_ratio": 1.1157615798644671, + "edge_lengths_px": [ + 31.320919036865234, + 30.01666259765625, + 29.832868576049805, + 28.07133674621582 + ] + }, + "confidence": 0.5183305679010601 + }, + { + "observation_id": "2acc9862-36fd-499b-97ff-a8b6e081c283", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 443.0, + 797.0 + ], + [ + 470.0, + 801.0 + ], + [ + 473.0, + 830.0 + ], + [ + 445.0, + 825.0 + ] + ], + "center_px": [ + 457.75, + 813.25 + ], + "quality": { + "area_px": 772.5, + "perimeter_px": 112.96370887756348, + "sharpness": { + "laplacian_var": 2694.0247443504604 + }, + "contrast": { + "p05": 5.0, + "p95": 149.0, + "dynamic_range": 144.0, + "mean_gray": 56.827715355805246, + "std_gray": 51.32112584940838 + }, + "geometry": { + "distance_to_center_norm": 0.474787175655365, + "distance_to_border_px": 130.0 + }, + "edge_ratio": 1.0681478073415351, + "edge_lengths_px": [ + 27.294687271118164, + 29.154760360717773, + 28.44292449951172, + 28.07133674621582 + ] + }, + "confidence": 0.48214301097687995 + }, + { + "observation_id": "a8163082-0581-4242-8182-dccfb593302c", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 765.0, + 752.0 + ], + [ + 774.0, + 738.0 + ], + [ + 782.0, + 767.0 + ], + [ + 772.0, + 783.0 + ] + ], + "center_px": [ + 773.25, + 760.0 + ], + "quality": { + "area_px": 397.5, + "perimeter_px": 97.37499237060547, + "sharpness": { + "laplacian_var": 5935.69284688308 + }, + "contrast": { + "p05": 40.0, + "p95": 240.60000000000002, + "dynamic_range": 200.60000000000002, + "mean_gray": 123.85084745762713, + "std_gray": 70.01354438668922 + }, + "geometry": { + "distance_to_center_norm": 0.387611985206604, + "distance_to_border_px": 177.0 + }, + "edge_ratio": 1.9095050579935047, + "edge_lengths_px": [ + 16.6433162689209, + 30.08321762084961, + 18.867961883544922, + 31.78049659729004 + ] + }, + "confidence": 0.13877941767719656 + }, + { + "observation_id": "4f077671-b514-49ed-8b1c-7975340c8e96", + "type": "aruco", + "marker_id": 52, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 324.0, + 912.0 + ], + [ + 301.0, + 906.0 + ], + [ + 318.0, + 890.0 + ], + [ + 341.0, + 895.0 + ] + ], + "center_px": [ + 321.0, + 900.75 + ], + "quality": { + "area_px": 473.0, + "perimeter_px": 94.69379806518555, + "sharpness": { + "laplacian_var": 3012.4940686390532 + }, + "contrast": { + "p05": 4.0, + "p95": 166.8, + "dynamic_range": 162.8, + "mean_gray": 66.73230769230769, + "std_gray": 57.77808237010696 + }, + "geometry": { + "distance_to_center_norm": 0.6600089073181152, + "distance_to_border_px": 48.0 + }, + "edge_ratio": 1.0298302391077767, + "edge_lengths_px": [ + 23.76972770690918, + 23.34523582458496, + 23.53720474243164, + 24.041629791259766 + ] + }, + "confidence": 0.2939513606264565 + }, + { + "observation_id": "e0af6599-66ac-455d-9bde-2ca0dbc1cee5", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 379.0, + 758.0 + ], + [ + 394.0, + 744.0 + ], + [ + 420.0, + 747.0 + ], + [ + 404.0, + 761.0 + ] + ], + "center_px": [ + 399.25, + 752.5 + ], + "quality": { + "area_px": 403.5, + "perimeter_px": 93.13043785095215, + "sharpness": { + "laplacian_var": 5128.961937716263 + }, + "contrast": { + "p05": 22.0, + "p95": 224.59999999999997, + "dynamic_range": 202.59999999999997, + "mean_gray": 96.57785467128028, + "std_gray": 68.36555766599392 + }, + "geometry": { + "distance_to_center_norm": 0.4545203745365143, + "distance_to_border_px": 199.0 + }, + "edge_ratio": 1.2755698587681699, + "edge_lengths_px": [ + 20.51828384399414, + 26.172504425048828, + 21.260292053222656, + 25.179357528686523 + ] + }, + "confidence": 0.21088613700842376 + }, + { + "observation_id": "110525f7-c664-40a1-a7fe-1f5228552e05", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 159.0, + 917.0 + ], + [ + 138.0, + 911.0 + ], + [ + 157.0, + 896.0 + ], + [ + 179.0, + 901.0 + ] + ], + "center_px": [ + 158.25, + 906.25 + ], + "quality": { + "area_px": 440.5, + "perimeter_px": 94.22129249572754, + "sharpness": { + "laplacian_var": 3490.4136565364765 + }, + "contrast": { + "p05": 27.0, + "p95": 202.0, + "dynamic_range": 175.0, + "mean_gray": 122.37201365187714, + "std_gray": 61.430180421301635 + }, + "geometry": { + "distance_to_center_norm": 0.8040640354156494, + "distance_to_border_px": 43.0 + }, + "edge_ratio": 1.172715667959726, + "edge_lengths_px": [ + 21.840330123901367, + 24.20743751525879, + 22.56102752685547, + 25.612497329711914 + ] + }, + "confidence": 0.21535768663577426 + }, + { + "observation_id": "1d504c33-490c-46c2-b970-5cfdfaa389e3", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 944.0, + 895.0 + ], + [ + 915.0, + 889.0 + ], + [ + 921.0, + 874.0 + ], + [ + 950.0, + 878.0 + ] + ], + "center_px": [ + 932.5, + 884.0 + ], + "quality": { + "area_px": 494.0, + "perimeter_px": 93.0719985961914, + "sharpness": { + "laplacian_var": 3579.6275435176635 + }, + "contrast": { + "p05": 17.0, + "p95": 202.0, + "dynamic_range": 185.0, + "mean_gray": 97.39473684210526, + "std_gray": 68.7723107982645 + }, + "geometry": { + "distance_to_center_norm": 0.6234634518623352, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 1.83307202296257, + "edge_lengths_px": [ + 29.614185333251953, + 16.155494689941406, + 29.27456283569336, + 18.027755737304688 + ] + }, + "confidence": 0.17966197138346596 + }, + { + "observation_id": "73c536fe-cfb1-4845-aa97-59614664265b", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 256.0, + 876.0 + ], + [ + 234.0, + 871.0 + ], + [ + 252.0, + 857.0 + ], + [ + 273.0, + 861.0 + ] + ], + "center_px": [ + 253.75, + 866.25 + ], + "quality": { + "area_px": 390.5, + "perimeter_px": 89.41366195678711, + "sharpness": { + "laplacian_var": 4089.1195902914983 + }, + "contrast": { + "p05": 13.0, + "p95": 198.0, + "dynamic_range": 185.0, + "mean_gray": 97.89368770764119, + "std_gray": 67.4765025671394 + }, + "geometry": { + "distance_to_center_norm": 0.6827999949455261, + "distance_to_border_px": 84.0 + }, + "edge_ratio": 1.0667031763124133, + "edge_lengths_px": [ + 22.56102752685547, + 22.803508758544922, + 21.3775577545166, + 22.671567916870117 + ] + }, + "confidence": 0.24405414656521807 + }, + { + "observation_id": "0830bab0-4eb7-4080-b185-9aa6baa0b3c7", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 991.0, + 859.0 + ], + [ + 961.0, + 855.0 + ], + [ + 968.0, + 840.0 + ], + [ + 996.0, + 845.0 + ] + ], + "center_px": [ + 979.0, + 849.75 + ], + "quality": { + "area_px": 447.5, + "perimeter_px": 90.12743091583252, + "sharpness": { + "laplacian_var": 4468.299326353381 + }, + "contrast": { + "p05": 18.0, + "p95": 209.0, + "dynamic_range": 191.0, + "mean_gray": 93.44744744744744, + "std_gray": 68.39319132494552 + }, + "geometry": { + "distance_to_center_norm": 0.627041757106781, + "distance_to_border_px": 101.0 + }, + "edge_ratio": 2.0358772592325107, + "edge_lengths_px": [ + 30.265491485595703, + 16.552946090698242, + 28.44292449951172, + 14.866068840026855 + ] + }, + "confidence": 0.14653797618713008 + }, + { + "observation_id": "848f8778-b585-49b6-9a10-30698445fbff", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 829.0, + 851.0 + ], + [ + 804.0, + 845.0 + ], + [ + 813.0, + 831.0 + ], + [ + 839.0, + 836.0 + ] + ], + "center_px": [ + 821.25, + 840.75 + ], + "quality": { + "area_px": 422.0, + "perimeter_px": 86.85739707946777, + "sharpness": { + "laplacian_var": 4505.935702393341 + }, + "contrast": { + "p05": 21.0, + "p95": 211.0, + "dynamic_range": 190.0, + "mean_gray": 115.83870967741936, + "std_gray": 69.56681484276339 + }, + "geometry": { + "distance_to_center_norm": 0.5046535730361938, + "distance_to_border_px": 109.0 + }, + "edge_ratio": 1.5908130184069456, + "edge_lengths_px": [ + 25.70992088317871, + 16.6433162689209, + 26.476404190063477, + 18.027755737304688 + ] + }, + "confidence": 0.17684877485794218 + }, + { + "observation_id": "02a803f7-a42a-4432-bbb0-488bc3bba6fe", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 880.0, + 821.0 + ], + [ + 854.0, + 815.0 + ], + [ + 863.0, + 802.0 + ], + [ + 888.0, + 807.0 + ] + ], + "center_px": [ + 871.25, + 811.25 + ], + "quality": { + "area_px": 391.0, + "perimeter_px": 84.11433029174805, + "sharpness": { + "laplacian_var": 4582.439222525138 + }, + "contrast": { + "p05": 27.0, + "p95": 218.0, + "dynamic_range": 191.0, + "mean_gray": 110.82724252491694, + "std_gray": 73.12863596006505 + }, + "geometry": { + "distance_to_center_norm": 0.5049800872802734, + "distance_to_border_px": 139.0 + }, + "edge_ratio": 1.6876019108483868, + "edge_lengths_px": [ + 26.68332862854004, + 15.81138801574707, + 25.495098114013672, + 16.124515533447266 + ] + }, + "confidence": 0.15445980772540427 + }, + { + "observation_id": "3ba6f50c-a531-4da8-a564-bdd59e712eb4", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 329.0, + 814.0 + ], + [ + 310.0, + 810.0 + ], + [ + 323.0, + 798.0 + ], + [ + 346.0, + 801.0 + ] + ], + "center_px": [ + 327.0, + 805.75 + ], + "quality": { + "area_px": 315.0, + "perimeter_px": 81.70405578613281, + "sharpness": { + "laplacian_var": 6349.635440556012 + }, + "contrast": { + "p05": 11.9, + "p95": 220.1, + "dynamic_range": 208.2, + "mean_gray": 109.13389121338912, + "std_gray": 77.3459250056781 + }, + "geometry": { + "distance_to_center_norm": 0.564693033695221, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 1.3110490294861725, + "edge_lengths_px": [ + 19.416488647460938, + 17.69180679321289, + 23.194826126098633, + 21.40093421936035 + ] + }, + "confidence": 0.1601770759727448 + }, + { + "observation_id": "df7890a1-5f42-48b4-a325-2d8694f0bcb4", + "type": "aruco", + "marker_id": 226, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 746.0, + 678.0 + ], + [ + 755.0, + 667.0 + ], + [ + 781.0, + 667.0 + ], + [ + 772.0, + 679.0 + ] + ], + "center_px": [ + 763.5, + 672.75 + ], + "quality": { + "area_px": 303.5, + "perimeter_px": 81.23189449310303, + "sharpness": { + "laplacian_var": 3572.4839427803126 + }, + "contrast": { + "p05": 37.0, + "p95": 217.39999999999998, + "dynamic_range": 180.39999999999998, + "mean_gray": 103.53521126760563, + "std_gray": 63.6844843654954 + }, + "geometry": { + "distance_to_center_norm": 0.2861512303352356, + "distance_to_border_px": 281.0 + }, + "edge_ratio": 1.830706233918996, + "edge_lengths_px": [ + 14.21267032623291, + 26.0, + 15.0, + 26.019224166870117 + ] + }, + "confidence": 0.11052201035017947 + }, + { + "observation_id": "cdfb3308-630b-4af4-a0e1-e2f3d3bec85c", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 879.0, + 798.0 + ], + [ + 854.0, + 792.0 + ], + [ + 862.0, + 781.0 + ], + [ + 887.0, + 785.0 + ] + ], + "center_px": [ + 870.5, + 789.0 + ], + "quality": { + "area_px": 340.0, + "perimeter_px": 79.89370727539062, + "sharpness": { + "laplacian_var": 2941.6199909387738 + }, + "contrast": { + "p05": 25.6, + "p95": 159.39999999999986, + "dynamic_range": 133.79999999999987, + "mean_gray": 64.09486166007905, + "std_gray": 40.22563452827321 + }, + "geometry": { + "distance_to_center_norm": 0.4818766415119171, + "distance_to_border_px": 162.0 + }, + "edge_ratio": 1.8902309156751396, + "edge_lengths_px": [ + 25.70992088317871, + 13.601470947265625, + 25.317977905273438, + 15.264337539672852 + ] + }, + "confidence": 0.11991480235932307 + }, + { + "observation_id": "ed4f630b-e8a8-4e64-8aba-4c6f73617549", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 542.0, + 717.0 + ], + [ + 521.0, + 714.0 + ], + [ + 533.0, + 704.0 + ], + [ + 552.0, + 707.0 + ] + ], + "center_px": [ + 537.0, + 710.5 + ], + "quality": { + "area_px": 233.0, + "perimeter_px": 70.2112226486206, + "sharpness": { + "laplacian_var": 8263.508748708677 + }, + "contrast": { + "p05": 33.0, + "p95": 188.5, + "dynamic_range": 155.5, + "mean_gray": 95.07386363636364, + "std_gray": 52.73260375430629 + }, + "geometry": { + "distance_to_center_norm": 0.31558293104171753, + "distance_to_border_px": 243.0 + }, + "edge_ratio": 1.5, + "edge_lengths_px": [ + 21.21320343017578, + 15.620499610900879, + 19.235383987426758, + 14.142135620117188 + ] + }, + "confidence": 0.10355555555555554 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 386.0, + 213.0 + ], + [ + 454.0, + 208.0 + ], + [ + 468.0, + 348.0 + ], + [ + 411.0, + 342.0 + ] + ], + "center_px": [ + 429.75, + 277.75 + ], + "area_px": 8396.5 + }, + { + "image_points_px": [ + [ + 617.0, + 207.0 + ], + [ + 711.0, + 211.0 + ], + [ + 704.0, + 226.0 + ], + [ + 619.0, + 221.0 + ] + ], + "center_px": [ + 662.75, + 216.25 + ], + "area_px": 1309.0 + }, + { + "image_points_px": [ + [ + 606.0, + 49.0 + ], + [ + 621.0, + 49.0 + ], + [ + 625.0, + 136.0 + ], + [ + 610.0, + 128.0 + ] + ], + "center_px": [ + 615.5, + 90.5 + ], + "area_px": 1229.0 + }, + { + "image_points_px": [ + [ + 362.0, + 62.0 + ], + [ + 377.0, + 64.0 + ], + [ + 385.0, + 133.0 + ], + [ + 373.0, + 133.0 + ] + ], + "center_px": [ + 374.25, + 98.0 + ], + "area_px": 935.5 + }, + { + "image_points_px": [ + [ + 468.0, + 167.0 + ], + [ + 464.0, + 175.0 + ], + [ + 402.0, + 185.0 + ], + [ + 391.0, + 180.0 + ] + ], + "center_px": [ + 431.25, + 176.75 + ], + "area_px": 492.0 + }, + { + "image_points_px": [ + [ + 588.0, + 737.0 + ], + [ + 589.0, + 752.0 + ], + [ + 524.0, + 756.0 + ], + [ + 561.0, + 737.0 + ] + ], + "center_px": [ + 565.5, + 745.5 + ], + "area_px": 746.0 + }, + { + "image_points_px": [ + [ + 570.0, + 223.0 + ], + [ + 579.0, + 224.0 + ], + [ + 581.0, + 271.0 + ], + [ + 573.0, + 269.0 + ] + ], + "center_px": [ + 575.75, + 246.75 + ], + "area_px": 391.5 + }, + { + "image_points_px": [ + [ + 607.0, + 821.0 + ], + [ + 616.0, + 830.0 + ], + [ + 610.0, + 868.0 + ], + [ + 605.0, + 855.0 + ] + ], + "center_px": [ + 609.5, + 843.5 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 338.0, + 225.0 + ], + [ + 346.0, + 261.0 + ], + [ + 344.0, + 270.0 + ], + [ + 336.0, + 268.0 + ] + ], + "center_px": [ + 341.0, + 256.0 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 1046.0, + 886.0 + ], + [ + 1079.0, + 889.0 + ], + [ + 1075.0, + 905.0 + ], + [ + 1043.0, + 901.0 + ] + ], + "center_px": [ + 1060.75, + 895.25 + ], + "area_px": 516.0 + }, + { + "image_points_px": [ + [ + 274.0, + 94.0 + ], + [ + 303.0, + 91.0 + ], + [ + 306.0, + 111.0 + ], + [ + 278.0, + 111.0 + ] + ], + "center_px": [ + 290.25, + 101.75 + ], + "area_px": 532.5 + }, + { + "image_points_px": [ + [ + 1143.0, + 738.0 + ], + [ + 1141.0, + 763.0 + ], + [ + 1130.0, + 780.0 + ], + [ + 1128.0, + 758.0 + ] + ], + "center_px": [ + 1135.5, + 759.75 + ], + "area_px": 305.5 + }, + { + "image_points_px": [ + [ + 1019.0, + 853.0 + ], + [ + 1050.0, + 856.0 + ], + [ + 1046.0, + 871.0 + ], + [ + 1015.0, + 866.0 + ] + ], + "center_px": [ + 1032.5, + 861.5 + ], + "area_px": 450.0 + }, + { + "image_points_px": [ + [ + 739.0, + 714.0 + ], + [ + 729.0, + 727.0 + ], + [ + 701.0, + 730.0 + ], + [ + 714.0, + 715.0 + ] + ], + "center_px": [ + 720.75, + 721.5 + ], + "area_px": 348.0 + }, + { + "image_points_px": [ + [ + 315.0, + 793.0 + ], + [ + 299.0, + 807.0 + ], + [ + 280.0, + 802.0 + ], + [ + 296.0, + 790.0 + ] + ], + "center_px": [ + 297.5, + 798.0 + ], + "area_px": 311.0 + }, + { + "image_points_px": [ + [ + 795.0, + 716.0 + ], + [ + 829.0, + 716.0 + ], + [ + 831.0, + 721.0 + ], + [ + 797.0, + 720.0 + ] + ], + "center_px": [ + 813.0, + 718.25 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 600.0, + 830.0 + ], + [ + 605.0, + 839.0 + ], + [ + 604.0, + 866.0 + ], + [ + 600.0, + 858.0 + ] + ], + "center_px": [ + 602.25, + 848.25 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 796.0, + 706.0 + ], + [ + 827.0, + 705.0 + ], + [ + 830.0, + 710.0 + ], + [ + 797.0, + 710.0 + ] + ], + "center_px": [ + 812.5, + 707.75 + ], + "area_px": 145.0 + }, + { + "image_points_px": [ + [ + 159.0, + 117.0 + ], + [ + 167.0, + 151.0 + ], + [ + 163.0, + 149.0 + ], + [ + 159.0, + 133.0 + ] + ], + "center_px": [ + 162.0, + 137.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 770.0, + 632.0 + ], + [ + 780.0, + 623.0 + ], + [ + 801.0, + 626.0 + ], + [ + 793.0, + 636.0 + ] + ], + "center_px": [ + 786.0, + 629.25 + ], + "area_px": 240.5 + }, + { + "image_points_px": [ + [ + 236.0, + 83.0 + ], + [ + 240.0, + 86.0 + ], + [ + 242.0, + 116.0 + ], + [ + 235.0, + 106.0 + ] + ], + "center_px": [ + 238.25, + 97.75 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 453.0, + 720.0 + ], + [ + 464.0, + 711.0 + ], + [ + 484.0, + 714.0 + ], + [ + 472.0, + 724.0 + ] + ], + "center_px": [ + 468.25, + 717.25 + ], + "area_px": 225.5 + }, + { + "image_points_px": [ + [ + 1073.0, + 677.0 + ], + [ + 1078.0, + 669.0 + ], + [ + 1101.0, + 671.0 + ], + [ + 1098.0, + 682.0 + ] + ], + "center_px": [ + 1087.5, + 674.75 + ], + "area_px": 242.0 + }, + { + "image_points_px": [ + [ + 699.0, + 648.0 + ], + [ + 700.0, + 651.0 + ], + [ + 678.0, + 674.0 + ], + [ + 678.0, + 670.0 + ] + ], + "center_px": [ + 688.75, + 660.75 + ], + "area_px": 86.5 + }, + { + "image_points_px": [ + [ + 447.0, + 705.0 + ], + [ + 457.0, + 696.0 + ], + [ + 477.0, + 698.0 + ], + [ + 465.0, + 708.0 + ] + ], + "center_px": [ + 461.5, + 701.75 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 981.0, + 770.0 + ], + [ + 1011.0, + 769.0 + ], + [ + 1012.0, + 773.0 + ], + [ + 984.0, + 773.0 + ] + ], + "center_px": [ + 997.0, + 771.25 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 502.0, + 671.0 + ], + [ + 514.0, + 663.0 + ], + [ + 532.0, + 665.0 + ], + [ + 520.0, + 674.0 + ] + ], + "center_px": [ + 517.0, + 668.25 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 529.0, + 692.0 + ], + [ + 539.0, + 683.0 + ], + [ + 558.0, + 686.0 + ], + [ + 548.0, + 695.0 + ] + ], + "center_px": [ + 543.5, + 689.0 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 1048.0, + 649.0 + ], + [ + 1051.0, + 640.0 + ], + [ + 1074.0, + 643.0 + ], + [ + 1071.0, + 651.0 + ] + ], + "center_px": [ + 1061.0, + 645.75 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 571.0, + 693.0 + ], + [ + 579.0, + 684.0 + ], + [ + 599.0, + 686.0 + ], + [ + 590.0, + 695.0 + ] + ], + "center_px": [ + 584.75, + 689.5 + ], + "area_px": 192.5 + }, + { + "image_points_px": [ + [ + 573.0, + 675.0 + ], + [ + 581.0, + 667.0 + ], + [ + 601.0, + 669.0 + ], + [ + 591.0, + 678.0 + ] + ], + "center_px": [ + 586.5, + 672.25 + ], + "area_px": 184.0 + }, + { + "image_points_px": [ + [ + 1117.0, + 628.0 + ], + [ + 1120.0, + 620.0 + ], + [ + 1142.0, + 622.0 + ], + [ + 1140.0, + 631.0 + ] + ], + "center_px": [ + 1129.75, + 625.25 + ], + "area_px": 197.5 + }, + { + "image_points_px": [ + [ + 1069.0, + 629.0 + ], + [ + 1073.0, + 622.0 + ], + [ + 1095.0, + 624.0 + ], + [ + 1091.0, + 633.0 + ] + ], + "center_px": [ + 1082.0, + 627.0 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 600.0, + 662.0 + ], + [ + 609.0, + 654.0 + ], + [ + 627.0, + 656.0 + ], + [ + 620.0, + 665.0 + ] + ], + "center_px": [ + 614.0, + 659.25 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 1008.0, + 632.0 + ], + [ + 1013.0, + 624.0 + ], + [ + 1033.0, + 626.0 + ], + [ + 1029.0, + 635.0 + ] + ], + "center_px": [ + 1020.75, + 629.25 + ], + "area_px": 185.5 + }, + { + "image_points_px": [ + [ + 1114.0, + 611.0 + ], + [ + 1117.0, + 605.0 + ], + [ + 1139.0, + 606.0 + ], + [ + 1136.0, + 615.0 + ] + ], + "center_px": [ + 1126.5, + 609.25 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 568.0, + 658.0 + ], + [ + 576.0, + 650.0 + ], + [ + 594.0, + 651.0 + ], + [ + 587.0, + 660.0 + ] + ], + "center_px": [ + 581.25, + 654.75 + ], + "area_px": 168.5 + }, + { + "image_points_px": [ + [ + 662.0, + 128.0 + ], + [ + 656.0, + 135.0 + ], + [ + 638.0, + 135.0 + ], + [ + 637.0, + 128.0 + ] + ], + "center_px": [ + 648.25, + 131.5 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 1161.0, + 565.0 + ], + [ + 1183.0, + 567.0 + ], + [ + 1182.0, + 574.0 + ], + [ + 1160.0, + 573.0 + ] + ], + "center_px": [ + 1171.5, + 569.75 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 645.0, + 623.0 + ], + [ + 654.0, + 615.0 + ], + [ + 671.0, + 617.0 + ], + [ + 664.0, + 625.0 + ] + ], + "center_px": [ + 658.5, + 620.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 858.0, + 496.0 + ], + [ + 864.0, + 522.0 + ], + [ + 859.0, + 520.0 + ], + [ + 854.0, + 501.0 + ] + ], + "center_px": [ + 858.75, + 509.75 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 518.0, + 622.0 + ], + [ + 526.0, + 615.0 + ], + [ + 544.0, + 617.0 + ], + [ + 536.0, + 624.0 + ] + ], + "center_px": [ + 531.0, + 619.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 542.0, + 595.0 + ], + [ + 550.0, + 588.0 + ], + [ + 567.0, + 590.0 + ], + [ + 559.0, + 597.0 + ] + ], + "center_px": [ + 554.5, + 592.5 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 1114.0, + 578.0 + ], + [ + 1117.0, + 571.0 + ], + [ + 1137.0, + 573.0 + ], + [ + 1134.0, + 580.0 + ] + ], + "center_px": [ + 1125.5, + 575.5 + ], + "area_px": 146.0 + }, + { + "image_points_px": [ + [ + 566.0, + 583.0 + ], + [ + 574.0, + 576.0 + ], + [ + 591.0, + 578.0 + ], + [ + 581.0, + 585.0 + ] + ], + "center_px": [ + 578.0, + 580.5 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 168.0, + 114.0 + ], + [ + 176.0, + 126.0 + ], + [ + 178.0, + 136.0 + ], + [ + 173.0, + 137.0 + ] + ], + "center_px": [ + 173.75, + 128.25 + ], + "area_px": 88.0 + }, + { + "image_points_px": [ + [ + 682.0, + 584.0 + ], + [ + 688.0, + 577.0 + ], + [ + 705.0, + 579.0 + ], + [ + 697.0, + 586.0 + ] + ], + "center_px": [ + 693.0, + 581.5 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 641.0, + 571.0 + ], + [ + 648.0, + 565.0 + ], + [ + 664.0, + 566.0 + ], + [ + 658.0, + 573.0 + ] + ], + "center_px": [ + 652.75, + 568.75 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 742.0, + 548.0 + ], + [ + 746.0, + 542.0 + ], + [ + 763.0, + 543.0 + ], + [ + 757.0, + 549.0 + ] + ], + "center_px": [ + 752.0, + 545.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 750.0, + 527.0 + ], + [ + 755.0, + 521.0 + ], + [ + 771.0, + 523.0 + ], + [ + 767.0, + 528.0 + ] + ], + "center_px": [ + 760.75, + 524.75 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 704.0, + 562.0 + ], + [ + 709.0, + 556.0 + ], + [ + 725.0, + 557.0 + ], + [ + 719.0, + 563.0 + ] + ], + "center_px": [ + 714.25, + 559.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 803.0, + 727.0 + ], + [ + 822.0, + 727.0 + ], + [ + 824.0, + 729.0 + ], + [ + 804.0, + 730.0 + ] + ], + "center_px": [ + 813.25, + 728.25 + ], + "area_px": 49.5 + }, + { + "image_points_px": [ + [ + 1049.0, + 695.0 + ], + [ + 1061.0, + 695.0 + ], + [ + 1069.0, + 699.0 + ], + [ + 1053.0, + 698.0 + ] + ], + "center_px": [ + 1058.0, + 696.75 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 409.0, + 63.0 + ], + [ + 411.0, + 63.0 + ], + [ + 413.0, + 81.0 + ], + [ + 410.0, + 77.0 + ] + ], + "center_px": [ + 410.75, + 71.0 + ], + "area_px": 37.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam0_camera_pose.json b/test/y-axis-finder-examples/20260612_190241/cam0_camera_pose.json new file mode 100644 index 0000000..8c97393 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam0_camera_pose.json @@ -0,0 +1,341 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:44Z", + "source": { + "detection_json": "/app/data/board/20260612_190241/cam0_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam0", + "camera_matrix": [ + [ + 1424.7584228515625, + 0.0, + 635.95947265625 + ], + [ + 0.0, + 1421.5770263671875, + 482.1744384765625 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.05634751915931702, + 0.33765655755996704, + 0.002130246954038739, + -0.004022662527859211, + -1.182201862335205 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 10, + "used_marker_ids": [ + 52, + 83, + 55, + 101, + 47, + 79, + 96, + 82, + 62, + 72 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.00945903620406907, + 0.0006630901752764398, + 0.00024358128156231842, + 0.00024356018287453274 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.5010493898996421, + "residual_median_px": 0.5177531918766651, + "residual_max_px": 0.7327763807349081, + "sigma2_normalized": 8.474508891706403e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.4051128029823303, + -0.9118297100067139, + -0.06670987606048584 + ], + [ + -0.3181094825267792, + -0.07217267155647278, + -0.9453028440475464 + ], + [ + 0.8571406006813049, + 0.4041753113269806, + -0.31929975748062134 + ] + ], + "translation_m": [ + -0.10762709379196167, + 0.3697848916053772, + 1.0282882452011108 + ], + "rvec_rad": [ + 1.6183746501472032, + -1.1079365352846473, + 0.7120246782560965 + ] + }, + "camera_in_world": { + "position_m": [ + -0.7201544046401978, + -0.48705795407295227, + 0.670711100101471 + ], + "position_mm": [ + -720.1544189453125, + -487.0579528808594, + 670.7111206054688 + ], + "orientation_deg": { + "roll": 128.308837890625, + "pitch": -58.99702453613281, + "yaw": -38.14030456542969 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 1.6494448567854165e-06, + -1.0100102055724762e-06, + -9.610355851455482e-07, + -2.1102980967596137e-08, + 4.904850430857246e-07, + 1.7764282401590815e-07 + ], + [ + -1.0100102055724724e-06, + 1.9449186295263454e-06, + -1.3398593790548594e-06, + -5.664159207565906e-07, + -4.0008472398099634e-07, + -2.7873012989396937e-07 + ], + [ + -9.610355851455558e-07, + -1.3398593790548505e-06, + 5.152052303362552e-06, + 1.1541982155319063e-06, + -2.6838384862376767e-07, + 2.058561731874794e-07 + ], + [ + -2.110298096759818e-08, + -5.664159207565888e-07, + 1.1541982155319078e-06, + 3.1719856374559714e-07, + 1.493155616024482e-08, + 7.849338883794885e-08 + ], + [ + 4.904850430857252e-07, + -4.0008472398099804e-07, + -2.683838486237657e-07, + 1.4931556160245477e-08, + 1.941921387291911e-07, + 1.3331392216799263e-07 + ], + [ + 1.7764282401590812e-07, + -2.7873012989396995e-07, + 2.0585617318747894e-07, + 7.849338883794892e-08, + 1.3331392216799269e-07, + 3.307203443975521e-07 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.0735853793212305, + 0.07990488863183044, + 0.13005072094022094 + ], + "tvec_std_m": [ + 0.0005632038385394733, + 0.0004406723711888358, + 0.0005750829021954593 + ] + }, + "camera_center_std_m": [ + 0.0016931038541462763, + 0.002371620659928403, + 0.0018111292689069259 + ], + "camera_center_std_mm": [ + 1.6931038541462764, + 2.3716206599284027, + 1.8111292689069258 + ], + "orientation_std_deg": { + "roll": 0.19809662739478043, + "pitch": 0.09849499317344503, + "yaw": 0.14748394477383087 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 52, + "observed_center_px": [ + 321.0, + 900.75 + ], + "projected_center_px": [ + 321.3458557128906, + 901.2568359375 + ], + "reprojection_error_px": 0.6135950143870029, + "confidence": 0.2939513606264565 + }, + { + "marker_id": 83, + "observed_center_px": [ + 158.25, + 906.25 + ], + "projected_center_px": [ + 157.55067443847656, + 906.4688720703125 + ], + "reprojection_error_px": 0.7327763807349081, + "confidence": 0.21535768663577426 + }, + { + "marker_id": 55, + "observed_center_px": [ + 932.5, + 884.0 + ], + "projected_center_px": [ + 932.4688110351562, + 884.16552734375 + ], + "reprojection_error_px": 0.16844005775632867, + "confidence": 0.17966197138346596 + }, + { + "marker_id": 101, + "observed_center_px": [ + 253.75, + 866.25 + ], + "projected_center_px": [ + 253.99021911621094, + 865.9517211914062 + ], + "reprojection_error_px": 0.38298233829939315, + "confidence": 0.24405414656521807 + }, + { + "marker_id": 47, + "observed_center_px": [ + 979.0, + 849.75 + ], + "projected_center_px": [ + 978.5487670898438, + 849.3796997070312 + ], + "reprojection_error_px": 0.5837237755829554, + "confidence": 0.14653797618713008 + }, + { + "marker_id": 79, + "observed_center_px": [ + 821.25, + 840.75 + ], + "projected_center_px": [ + 821.6685180664062, + 840.507080078125 + ], + "reprojection_error_px": 0.4839085247773409, + "confidence": 0.17684877485794218 + }, + { + "marker_id": 96, + "observed_center_px": [ + 871.25, + 811.25 + ], + "projected_center_px": [ + 871.4161376953125, + 811.4320678710938 + ], + "reprojection_error_px": 0.24647605053708455, + "confidence": 0.15445980772540427 + }, + { + "marker_id": 82, + "observed_center_px": [ + 327.0, + 805.75 + ], + "projected_center_px": [ + 326.9396667480469, + 805.1625366210938 + ], + "reprojection_error_px": 0.59055340389095, + "confidence": 0.1601770759727448 + }, + { + "marker_id": 62, + "observed_center_px": [ + 870.5, + 789.0 + ], + "projected_center_px": [ + 870.1605834960938, + 789.1346435546875 + ], + "reprojection_error_px": 0.36514716203583897, + "confidence": 0.11991480235932307 + }, + { + "marker_id": 72, + "observed_center_px": [ + 537.0, + 710.5 + ], + "projected_center_px": [ + 537.47705078125, + 710.7769165039062 + ], + "reprojection_error_px": 0.5515978589759895, + "confidence": 0.10355555555555554 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam0_debug.jpg b/test/y-axis-finder-examples/20260612_190241/cam0_debug.jpg new file mode 100644 index 0000000..803fc5a Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam0_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/cam1.jpg b/test/y-axis-finder-examples/20260612_190241/cam1.jpg new file mode 100644 index 0000000..3594bc7 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam1.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/cam1_aruco_detection.json b/test/y-axis-finder-examples/20260612_190241/cam1_aruco_detection.json new file mode 100644 index 0000000..228d162 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam1_aruco_detection.json @@ -0,0 +1,3621 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:47Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam1_calibration.npz", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190241/cam1.jpg", + "image_sha256": "16f91386cec9f5a6d9d7676c274fa1441fc8fc40cbe34319e8a044dccecff146", + "width_px": 1280, + "height_px": 960 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 55, + "num_rejected_candidates": 24 + }, + "detections": [ + { + "observation_id": "891bce02-3099-4ed3-b049-013abc1b50b3", + "type": "aruco", + "marker_id": 200, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 931.0, + 766.0 + ], + [ + 902.0, + 761.0 + ], + [ + 899.0, + 731.0 + ], + [ + 928.0, + 736.0 + ] + ], + "center_px": [ + 915.0, + 748.5 + ], + "quality": { + "area_px": 855.0, + "perimeter_px": 119.15501022338867, + "sharpness": { + "laplacian_var": 3411.2246964024835 + }, + "contrast": { + "p05": 9.55, + "p95": 180.44999999999993, + "dynamic_range": 170.89999999999992, + "mean_gray": 68.79391891891892, + "std_gray": 62.22424109008216 + }, + "geometry": { + "distance_to_center_norm": 0.48042502999305725, + "distance_to_border_px": 194.0 + }, + "edge_ratio": 1.02452607264016, + "edge_lengths_px": [ + 29.42787742614746, + 30.149627685546875, + 29.42787742614746, + 30.149627685546875 + ] + }, + "confidence": 0.5563548017193298 + }, + { + "observation_id": "45586561-e661-4573-b0e3-4e9fcdbd1346", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 617.0, + 115.0 + ], + [ + 646.0, + 141.0 + ], + [ + 622.0, + 169.0 + ], + [ + 593.0, + 143.0 + ] + ], + "center_px": [ + 619.5, + 142.0 + ], + "quality": { + "area_px": 1436.0, + "perimeter_px": 151.65372467041016, + "sharpness": { + "laplacian_var": 2491.8886278776217 + }, + "contrast": { + "p05": 10.0, + "p95": 193.0, + "dynamic_range": 183.0, + "mean_gray": 86.375, + "std_gray": 72.20267288430986 + }, + "geometry": { + "distance_to_center_norm": 0.4232763648033142, + "distance_to_border_px": 115.0 + }, + "edge_ratio": 1.0561445055559446, + "edge_lengths_px": [ + 38.94868469238281, + 36.878177642822266, + 38.94868469238281, + 36.878177642822266 + ] + }, + "confidence": 0.9064416169351769 + }, + { + "observation_id": "a04cf6cb-aef5-4838-89da-8b5ca0614bf8", + "type": "aruco", + "marker_id": 69, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1160.0, + 336.0 + ], + [ + 1159.0, + 371.0 + ], + [ + 1122.0, + 368.0 + ], + [ + 1123.0, + 334.0 + ] + ], + "center_px": [ + 1141.0, + 352.25 + ], + "quality": { + "area_px": 1279.0, + "perimeter_px": 143.2044219970703, + "sharpness": { + "laplacian_var": 2925.264635321906 + }, + "contrast": { + "p05": 2.0, + "p95": 179.79999999999995, + "dynamic_range": 177.79999999999995, + "mean_gray": 63.92090395480226, + "std_gray": 67.80924110210852 + }, + "geometry": { + "distance_to_center_norm": 0.6462887525558472, + "distance_to_border_px": 120.0 + }, + "edge_ratio": 1.0913346230409062, + "edge_lengths_px": [ + 35.0142822265625, + 37.121421813964844, + 34.01470184326172, + 37.05401611328125 + ] + }, + "confidence": 0.7813063460689879 + }, + { + "observation_id": "8a798a07-8c8b-4fdb-962a-4844f6f3101e", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1201.0, + 475.0 + ], + [ + 1199.0, + 509.0 + ], + [ + 1163.0, + 503.0 + ], + [ + 1164.0, + 470.0 + ] + ], + "center_px": [ + 1181.75, + 489.25 + ], + "quality": { + "area_px": 1231.0, + "perimeter_px": 140.90680313110352, + "sharpness": { + "laplacian_var": 2470.45623295962 + }, + "contrast": { + "p05": 3.0, + "p95": 173.0, + "dynamic_range": 170.0, + "mean_gray": 60.451539338654506, + "std_gray": 65.30188811306307 + }, + "geometry": { + "distance_to_center_norm": 0.6772862076759338, + "distance_to_border_px": 79.0 + }, + "edge_ratio": 1.1308841426814007, + "edge_lengths_px": [ + 34.058773040771484, + 36.49657440185547, + 33.0151481628418, + 37.336307525634766 + ] + }, + "confidence": 0.725685890970946 + }, + { + "observation_id": "8188185e-9744-4b0f-ad23-fbf1d0f66407", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 696.0, + 316.0 + ], + [ + 666.0, + 327.0 + ], + [ + 660.0, + 292.0 + ], + [ + 690.0, + 281.0 + ] + ], + "center_px": [ + 678.0, + 304.0 + ], + "quality": { + "area_px": 1116.0, + "perimeter_px": 134.92730712890625, + "sharpness": { + "laplacian_var": 1956.9343097128226 + }, + "contrast": { + "p05": 2.0, + "p95": 154.0, + "dynamic_range": 152.0, + "mean_gray": 63.09857328145266, + "std_gray": 59.21322139613032 + }, + "geometry": { + "distance_to_center_norm": 0.22506943345069885, + "distance_to_border_px": 281.0 + }, + "edge_ratio": 1.1113342138323183, + "edge_lengths_px": [ + 31.95309066772461, + 35.510562896728516, + 31.95309066772461, + 35.510562896728516 + ] + }, + "confidence": 0.669465576367342 + }, + { + "observation_id": "d1c43b6b-0f73-4e70-ad26-ba788e6a358c", + "type": "aruco", + "marker_id": 58, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1094.0, + 421.0 + ], + [ + 1094.0, + 454.0 + ], + [ + 1059.0, + 449.0 + ], + [ + 1060.0, + 418.0 + ] + ], + "center_px": [ + 1076.75, + 435.5 + ], + "quality": { + "area_px": 1106.0, + "perimeter_px": 133.50355911254883, + "sharpness": { + "laplacian_var": 2542.8638872486927 + }, + "contrast": { + "p05": 4.0, + "p95": 177.0, + "dynamic_range": 173.0, + "mean_gray": 66.39559014267185, + "std_gray": 66.38642471559555 + }, + "geometry": { + "distance_to_center_norm": 0.5487639904022217, + "distance_to_border_px": 186.0 + }, + "edge_ratio": 1.1399018853379128, + "edge_lengths_px": [ + 33.0, + 35.35533905029297, + 31.016124725341797, + 34.13209533691406 + ] + }, + "confidence": 0.6468392962739578 + }, + { + "observation_id": "907d3427-b79f-4482-ab98-d72b27b07ed6", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 650.0, + 141.0 + ], + [ + 674.0, + 135.0 + ], + [ + 678.0, + 172.0 + ], + [ + 652.0, + 179.0 + ] + ], + "center_px": [ + 663.5, + 156.75 + ], + "quality": { + "area_px": 957.0, + "perimeter_px": 126.93264198303223, + "sharpness": { + "laplacian_var": 1822.3815368505432 + }, + "contrast": { + "p05": 6.0, + "p95": 148.19999999999993, + "dynamic_range": 142.19999999999993, + "mean_gray": 74.92998477929984, + "std_gray": 55.818726765183584 + }, + "geometry": { + "distance_to_center_norm": 0.4051288664340973, + "distance_to_border_px": 135.0 + }, + "edge_ratio": 1.538185046008267, + "edge_lengths_px": [ + 24.73863410949707, + 37.2155876159668, + 26.925823211669922, + 38.05259704589844 + ] + }, + "confidence": 0.41477454332017416 + }, + { + "observation_id": "8e296ff1-868a-4cbc-9112-d1d53c26cfc4", + "type": "aruco", + "marker_id": 66, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 874.0, + 207.0 + ], + [ + 875.0, + 241.0 + ], + [ + 845.0, + 239.0 + ], + [ + 844.0, + 207.0 + ] + ], + "center_px": [ + 859.5, + 223.5 + ], + "quality": { + "area_px": 989.0, + "perimeter_px": 126.09691619873047, + "sharpness": { + "laplacian_var": 1506.8503134658226 + }, + "contrast": { + "p05": 12.649999999999999, + "p95": 177.0, + "dynamic_range": 164.35, + "mean_gray": 65.04896142433235, + "std_gray": 62.87080370777849 + }, + "geometry": { + "distance_to_center_norm": 0.42199766635894775, + "distance_to_border_px": 207.0 + }, + "edge_ratio": 1.1338233947753906, + "edge_lengths_px": [ + 34.01470184326172, + 30.066593170166016, + 32.015621185302734, + 30.0 + ] + }, + "confidence": 0.5815132553901365 + }, + { + "observation_id": "2f1efd32-4e10-484a-8b0d-8acd20c6ebf8", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 723.0, + 462.0 + ], + [ + 694.0, + 473.0 + ], + [ + 690.0, + 441.0 + ], + [ + 718.0, + 430.0 + ] + ], + "center_px": [ + 706.25, + 451.5 + ], + "quality": { + "area_px": 961.5, + "perimeter_px": 125.73664474487305, + "sharpness": { + "laplacian_var": 2038.484896788657 + }, + "contrast": { + "p05": 3.0, + "p95": 157.94999999999993, + "dynamic_range": 154.94999999999993, + "mean_gray": 58.69626168224299, + "std_gray": 59.88579175865345 + }, + "geometry": { + "distance_to_center_norm": 0.09015015512704849, + "distance_to_border_px": 430.0 + }, + "edge_ratio": 1.0766225787410437, + "edge_lengths_px": [ + 31.016124725341797, + 32.24903106689453, + 30.08321762084961, + 32.38827133178711 + ] + }, + "confidence": 0.5953804171091767 + }, + { + "observation_id": "e3500933-b1ee-455b-9e9e-4dec427161d0", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1017.0, + 455.0 + ], + [ + 1016.0, + 485.0 + ], + [ + 985.0, + 480.0 + ], + [ + 985.0, + 450.0 + ] + ], + "center_px": [ + 1000.75, + 467.5 + ], + "quality": { + "area_px": 947.5, + "perimeter_px": 123.80557060241699, + "sharpness": { + "laplacian_var": 1695.457712188363 + }, + "contrast": { + "p05": 12.0, + "p95": 181.0, + "dynamic_range": 169.0, + "mean_gray": 109.7962382445141, + "std_gray": 67.32324484302598 + }, + "geometry": { + "distance_to_center_norm": 0.45120811462402344, + "distance_to_border_px": 263.0 + }, + "edge_ratio": 1.0796090443929036, + "edge_lengths_px": [ + 30.01666259765625, + 31.400636672973633, + 30.0, + 32.38827133178711 + ] + }, + "confidence": 0.5850883428101251 + }, + { + "observation_id": "827f315f-6559-4914-a7fc-b77ea7992a17", + "type": "aruco", + "marker_id": 95, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 908.0, + 331.0 + ], + [ + 910.0, + 362.0 + ], + [ + 880.0, + 359.0 + ], + [ + 881.0, + 328.0 + ] + ], + "center_px": [ + 894.75, + 345.0 + ], + "quality": { + "area_px": 882.0, + "perimeter_px": 119.3963565826416, + "sharpness": { + "laplacian_var": 1392.1187388729004 + }, + "contrast": { + "p05": 11.0, + "p95": 168.0, + "dynamic_range": 157.0, + "mean_gray": 75.21348314606742, + "std_gray": 62.68088568105715 + }, + "geometry": { + "distance_to_center_norm": 0.36038729548454285, + "distance_to_border_px": 328.0 + }, + "edge_ratio": 1.1434982046128424, + "edge_lengths_px": [ + 31.064449310302734, + 30.149627685546875, + 31.016124725341797, + 27.166154861450195 + ] + }, + "confidence": 0.514211563803094 + }, + { + "observation_id": "bb3a5c3e-0d88-4f8a-b444-f2ff33cafc34", + "type": "aruco", + "marker_id": 51, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 937.0, + 464.0 + ], + [ + 938.0, + 494.0 + ], + [ + 908.0, + 489.0 + ], + [ + 907.0, + 461.0 + ] + ], + "center_px": [ + 922.5, + 477.0 + ], + "quality": { + "area_px": 866.0, + "perimeter_px": 118.59795379638672, + "sharpness": { + "laplacian_var": 1742.6809680017611 + }, + "contrast": { + "p05": 7.0, + "p95": 161.0, + "dynamic_range": 154.0, + "mean_gray": 61.45575959933222, + "std_gray": 58.63250446936028 + }, + "geometry": { + "distance_to_center_norm": 0.35314491391181946, + "distance_to_border_px": 342.0 + }, + "edge_ratio": 1.085515544075489, + "edge_lengths_px": [ + 30.01666259765625, + 30.4138126373291, + 28.017850875854492, + 30.149627685546875 + ] + }, + "confidence": 0.531851742229114 + }, + { + "observation_id": "b83f44cc-e106-4d45-9128-04f5e80fa0a1", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 940.0, + 953.0 + ], + [ + 910.0, + 943.0 + ], + [ + 908.0, + 916.0 + ], + [ + 938.0, + 926.0 + ] + ], + "center_px": [ + 924.0, + 934.5 + ], + "quality": { + "area_px": 790.0, + "perimeter_px": 117.39349746704102, + "sharpness": { + "laplacian_var": 2122.4230280450306 + }, + "contrast": { + "p05": 5.0, + "p95": 171.64999999999998, + "dynamic_range": 166.64999999999998, + "mean_gray": 59.67077464788732, + "std_gray": 60.934642816501096 + }, + "geometry": { + "distance_to_center_norm": 0.6699186563491821, + "distance_to_border_px": 7.0 + }, + "edge_ratio": 1.1680138847568282, + "edge_lengths_px": [ + 31.62277603149414, + 27.073972702026367, + 31.62277603149414, + 27.073972702026367 + ] + }, + "confidence": 0.06312710344936016 + }, + { + "observation_id": "dd228762-ea4f-4240-b379-ae3139fe2daf", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 806.0, + 642.0 + ], + [ + 777.0, + 638.0 + ], + [ + 768.0, + 610.0 + ], + [ + 798.0, + 616.0 + ] + ], + "center_px": [ + 787.25, + 626.5 + ], + "quality": { + "area_px": 754.0, + "perimeter_px": 116.48250389099121, + "sharpness": { + "laplacian_var": 1869.5252441368705 + }, + "contrast": { + "p05": 7.0, + "p95": 161.54999999999995, + "dynamic_range": 154.54999999999995, + "mean_gray": 59.44313725490196, + "std_gray": 57.58430905186899 + }, + "geometry": { + "distance_to_center_norm": 0.2596416175365448, + "distance_to_border_px": 318.0 + }, + "edge_ratio": 1.124662043155266, + "edge_lengths_px": [ + 29.27456283569336, + 29.4108829498291, + 30.5941162109375, + 27.20294189453125 + ] + }, + "confidence": 0.44694908103808983 + }, + { + "observation_id": "2eb5d5e1-1cf7-427a-8566-fcb80e0a0612", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 759.0, + 211.0 + ], + [ + 762.0, + 242.0 + ], + [ + 735.0, + 241.0 + ], + [ + 734.0, + 210.0 + ] + ], + "center_px": [ + 747.5, + 226.0 + ], + "quality": { + "area_px": 804.0, + "perimeter_px": 114.19945335388184, + "sharpness": { + "laplacian_var": 1871.7048447967984 + }, + "contrast": { + "p05": 10.0, + "p95": 173.0, + "dynamic_range": 163.0, + "mean_gray": 91.13879003558719, + "std_gray": 65.51098321945263 + }, + "geometry": { + "distance_to_center_norm": 0.34476497769355774, + "distance_to_border_px": 210.0 + }, + "edge_ratio": 1.2447974421090555, + "edge_lengths_px": [ + 31.14482307434082, + 27.018512725830078, + 31.016124725341797, + 25.01999282836914 + ] + }, + "confidence": 0.4305921444470976 + }, + { + "observation_id": "e3245997-1884-444b-ac7b-43ee27b1cdb8", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 807.0, + 568.0 + ], + [ + 777.0, + 563.0 + ], + [ + 794.0, + 544.0 + ], + [ + 823.0, + 547.0 + ] + ], + "center_px": [ + 800.25, + 555.5 + ], + "quality": { + "area_px": 656.0, + "perimeter_px": 111.46442794799805, + "sharpness": { + "laplacian_var": 3628.756169544741 + }, + "contrast": { + "p05": 20.700000000000003, + "p95": 205.0, + "dynamic_range": 184.3, + "mean_gray": 91.84615384615384, + "std_gray": 68.72786326158995 + }, + "geometry": { + "distance_to_center_norm": 0.22143112123012543, + "distance_to_border_px": 392.0 + }, + "edge_ratio": 1.1929278523000388, + "edge_lengths_px": [ + 30.4138126373291, + 25.495098114013672, + 29.154760360717773, + 26.4007568359375 + ] + }, + "confidence": 0.36660501512319255 + }, + { + "observation_id": "bb47fe5c-bad6-4c4a-a7ab-2d5455b9ec1e", + "type": "aruco", + "marker_id": 77, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1135.0, + 928.0 + ], + [ + 1135.0, + 953.0 + ], + [ + 1105.0, + 943.0 + ], + [ + 1105.0, + 920.0 + ] + ], + "center_px": [ + 1120.0, + 936.0 + ], + "quality": { + "area_px": 720.0, + "perimeter_px": 110.6711254119873, + "sharpness": { + "laplacian_var": 1726.2541095376055 + }, + "contrast": { + "p05": 6.0, + "p95": 145.0, + "dynamic_range": 139.0, + "mean_gray": 58.05367793240557, + "std_gray": 52.55287124160988 + }, + "geometry": { + "distance_to_center_norm": 0.827586829662323, + "distance_to_border_px": 7.0 + }, + "edge_ratio": 1.3749033057171365, + "edge_lengths_px": [ + 25.0, + 31.62277603149414, + 23.0, + 31.048349380493164 + ] + }, + "confidence": 0.04887616439684762 + }, + { + "observation_id": "a1224f99-87a1-46b9-a0bd-60ea73c4f4e9", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 793.0, + 338.0 + ], + [ + 794.0, + 367.0 + ], + [ + 768.0, + 364.0 + ], + [ + 766.0, + 336.0 + ] + ], + "center_px": [ + 780.25, + 351.25 + ], + "quality": { + "area_px": 751.5, + "perimeter_px": 110.33505058288574, + "sharpness": { + "laplacian_var": 1296.0319448095086 + }, + "contrast": { + "p05": 7.0, + "p95": 163.0, + "dynamic_range": 156.0, + "mean_gray": 71.84440227703985, + "std_gray": 60.41232832491258 + }, + "geometry": { + "distance_to_center_norm": 0.23798184096813202, + "distance_to_border_px": 336.0 + }, + "edge_ratio": 1.1086916344858193, + "edge_lengths_px": [ + 29.017236709594727, + 26.172504425048828, + 28.07133674621582, + 27.073972702026367 + ] + }, + "confidence": 0.45188399047707256 + }, + { + "observation_id": "246f84be-b4e5-45cb-87dd-d20680b8ea0c", + "type": "aruco", + "marker_id": 226, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 694.0, + 618.0 + ], + [ + 668.0, + 611.0 + ], + [ + 663.0, + 584.0 + ], + [ + 689.0, + 589.0 + ] + ], + "center_px": [ + 678.5, + 600.5 + ], + "quality": { + "area_px": 698.0, + "perimeter_px": 110.28916549682617, + "sharpness": { + "laplacian_var": 2979.564105807612 + }, + "contrast": { + "p05": 5.0, + "p95": 181.0, + "dynamic_range": 176.0, + "mean_gray": 67.86147186147186, + "std_gray": 66.38685544735948 + }, + "geometry": { + "distance_to_center_norm": 0.15812623500823975, + "distance_to_border_px": 342.0 + }, + "edge_ratio": 1.1114756072953313, + "edge_lengths_px": [ + 26.925823211669922, + 27.459060668945312, + 26.476404190063477, + 29.42787742614746 + ] + }, + "confidence": 0.41866265915243706 + }, + { + "observation_id": "116f5bfa-0dc5-4669-98b4-f6d390534649", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 832.0, + 740.0 + ], + [ + 805.0, + 734.0 + ], + [ + 798.0, + 710.0 + ], + [ + 826.0, + 716.0 + ] + ], + "center_px": [ + 815.25, + 725.0 + ], + "quality": { + "area_px": 621.0, + "perimeter_px": 106.03291130065918, + "sharpness": { + "laplacian_var": 3323.891220987853 + }, + "contrast": { + "p05": 5.0, + "p95": 176.09999999999997, + "dynamic_range": 171.09999999999997, + "mean_gray": 76.21867881548975, + "std_gray": 63.196677611442766 + }, + "geometry": { + "distance_to_center_norm": 0.37653347849845886, + "distance_to_border_px": 220.0 + }, + "edge_ratio": 1.1575272457899353, + "edge_lengths_px": [ + 27.658634185791016, + 25.0, + 28.635643005371094, + 24.73863410949707 + ] + }, + "confidence": 0.35765896786081486 + }, + { + "observation_id": "b52688f3-b186-4c95-9175-f88e3722f97c", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 970.0, + 869.0 + ], + [ + 968.0, + 839.0 + ], + [ + 983.0, + 822.0 + ], + [ + 985.0, + 852.0 + ] + ], + "center_px": [ + 976.5, + 845.5 + ], + "quality": { + "area_px": 484.0, + "perimeter_px": 105.47632217407227, + "sharpness": { + "laplacian_var": 1203.7887244594326 + }, + "contrast": { + "p05": 5.0, + "p95": 108.30000000000001, + "dynamic_range": 103.30000000000001, + "mean_gray": 41.19718309859155, + "std_gray": 33.8821568889194 + }, + "geometry": { + "distance_to_center_norm": 0.6210154294967651, + "distance_to_border_px": 91.0 + }, + "edge_ratio": 1.32618058355784, + "edge_lengths_px": [ + 30.066593170166016, + 22.671567916870117, + 30.066593170166016, + 22.671567916870117 + ] + }, + "confidence": 0.2433052260507582 + }, + { + "observation_id": "e09dd748-9e3c-4f7c-8423-91e404e026b8", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 771.0, + 459.0 + ], + [ + 773.0, + 486.0 + ], + [ + 748.0, + 482.0 + ], + [ + 746.0, + 456.0 + ] + ], + "center_px": [ + 759.5, + 470.75 + ], + "quality": { + "area_px": 655.5, + "perimeter_px": 103.64811706542969, + "sharpness": { + "laplacian_var": 2495.3568742305324 + }, + "contrast": { + "p05": 4.0, + "p95": 174.25, + "dynamic_range": 170.25, + "mean_gray": 90.24122807017544, + "std_gray": 64.19131672081117 + }, + "geometry": { + "distance_to_center_norm": 0.14982183277606964, + "distance_to_border_px": 456.0 + }, + "edge_ratio": 1.0752447782347636, + "edge_lengths_px": [ + 27.073972702026367, + 25.317977905273438, + 26.07680892944336, + 25.179357528686523 + ] + }, + "confidence": 0.4064190860033059 + }, + { + "observation_id": "ed864ee0-74f0-4e89-8578-3ad6acce035a", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 561.0, + 262.0 + ], + [ + 563.0, + 290.0 + ], + [ + 542.0, + 287.0 + ], + [ + 539.0, + 260.0 + ] + ], + "center_px": [ + 551.25, + 274.75 + ], + "quality": { + "area_px": 585.0, + "perimeter_px": 98.54141616821289, + "sharpness": { + "laplacian_var": 2595.2624113475176 + }, + "contrast": { + "p05": 12.100000000000001, + "p95": 187.0, + "dynamic_range": 174.9, + "mean_gray": 116.1323877068558, + "std_gray": 66.22671474082559 + }, + "geometry": { + "distance_to_center_norm": 0.27952003479003906, + "distance_to_border_px": 260.0 + }, + "edge_ratio": 1.3232955050194986, + "edge_lengths_px": [ + 28.07133674621582, + 21.21320343017578, + 27.166154861450195, + 22.090721130371094 + ] + }, + "confidence": 0.29471875217641086 + }, + { + "observation_id": "fc15958f-773a-4b81-a9c7-9bf880d3bf1d", + "type": "aruco", + "marker_id": 57, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 463.0, + 198.0 + ], + [ + 468.0, + 226.0 + ], + [ + 448.0, + 224.0 + ], + [ + 444.0, + 198.0 + ] + ], + "center_px": [ + 455.75, + 211.5 + ], + "quality": { + "area_px": 522.0, + "perimeter_px": 93.84856796264648, + "sharpness": { + "laplacian_var": 4306.21202488889 + }, + "contrast": { + "p05": 3.0, + "p95": 181.3, + "dynamic_range": 178.3, + "mean_gray": 78.904, + "std_gray": 66.69573787481976 + }, + "geometry": { + "distance_to_center_norm": 0.4070478677749634, + "distance_to_border_px": 198.0 + }, + "edge_ratio": 1.4969960262900905, + "edge_lengths_px": [ + 28.44292449951172, + 20.099750518798828, + 26.305892944335938, + 19.0 + ] + }, + "confidence": 0.23246554692762017 + }, + { + "observation_id": "5f2d8a52-5d84-41b5-8f9e-c1666c7df925", + "type": "aruco", + "marker_id": 59, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 459.0, + 293.0 + ], + [ + 463.0, + 319.0 + ], + [ + 444.0, + 318.0 + ], + [ + 440.0, + 292.0 + ] + ], + "center_px": [ + 451.5, + 305.5 + ], + "quality": { + "area_px": 490.0, + "perimeter_px": 90.66438293457031, + "sharpness": { + "laplacian_var": 2492.09824221476 + }, + "contrast": { + "p05": 9.0, + "p95": 181.59999999999997, + "dynamic_range": 172.59999999999997, + "mean_gray": 97.65329512893983, + "std_gray": 67.85225498341306 + }, + "geometry": { + "distance_to_center_norm": 0.3210882246494293, + "distance_to_border_px": 292.0 + }, + "edge_ratio": 1.3826069696428964, + "edge_lengths_px": [ + 26.305892944335938, + 19.02629852294922, + 26.305892944335938, + 19.02629852294922 + ] + }, + "confidence": 0.23626863876654625 + }, + { + "observation_id": "44d30a2e-3a54-4cdc-af45-638ec911d6dd", + "type": "aruco", + "marker_id": 0, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 587.0, + 535.0 + ], + [ + 567.0, + 532.0 + ], + [ + 564.0, + 508.0 + ], + [ + 584.0, + 512.0 + ] + ], + "center_px": [ + 575.5, + 521.75 + ], + "quality": { + "area_px": 459.5, + "perimeter_px": 88.00142669677734, + "sharpness": { + "laplacian_var": 2916.061744773925 + }, + "contrast": { + "p05": 9.650000000000002, + "p95": 178.0, + "dynamic_range": 168.35, + "mean_gray": 79.8443113772455, + "std_gray": 62.62625341931425 + }, + "geometry": { + "distance_to_center_norm": 0.09604126960039139, + "distance_to_border_px": 425.0 + }, + "edge_ratio": 1.195958924722644, + "edge_lengths_px": [ + 20.2237491607666, + 24.1867733001709, + 20.39607810974121, + 23.194826126098633 + ] + }, + "confidence": 0.2561403464624635 + }, + { + "observation_id": "da64ae95-4235-4cd2-b7a1-75de0421b8b6", + "type": "aruco", + "marker_id": 48, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 401.0, + 245.0 + ], + [ + 405.0, + 270.0 + ], + [ + 386.0, + 268.0 + ], + [ + 382.0, + 243.0 + ] + ], + "center_px": [ + 393.5, + 256.5 + ], + "quality": { + "area_px": 467.0, + "perimeter_px": 88.84590148925781, + "sharpness": { + "laplacian_var": 3773.5218089990817 + }, + "contrast": { + "p05": 3.0, + "p95": 169.0, + "dynamic_range": 166.0, + "mean_gray": 56.2939393939394, + "std_gray": 59.427533866473645 + }, + "geometry": { + "distance_to_center_norm": 0.4159223437309265, + "distance_to_border_px": 243.0 + }, + "edge_ratio": 1.3252035539731013, + "edge_lengths_px": [ + 25.317977905273438, + 19.10497283935547, + 25.317977905273438, + 19.10497283935547 + ] + }, + "confidence": 0.2349324618092993 + }, + { + "observation_id": "80d1a46c-1420-4d39-8d01-87bb809961bb", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 762.0, + 904.0 + ], + [ + 764.0, + 926.0 + ], + [ + 743.0, + 918.0 + ], + [ + 741.0, + 898.0 + ] + ], + "center_px": [ + 752.5, + 911.5 + ], + "quality": { + "area_px": 427.0, + "perimeter_px": 86.50300598144531, + "sharpness": { + "laplacian_var": 3005.684024331522 + }, + "contrast": { + "p05": 1.9000000000000004, + "p95": 171.0, + "dynamic_range": 169.1, + "mean_gray": 73.7742946708464, + "std_gray": 64.78398514359534 + }, + "geometry": { + "distance_to_center_norm": 0.557405412197113, + "distance_to_border_px": 34.0 + }, + "edge_ratio": 1.118033986907265, + "edge_lengths_px": [ + 22.090721130371094, + 22.472204208374023, + 20.099750518798828, + 21.840330123901367 + ] + }, + "confidence": 0.17313725307117095 + }, + { + "observation_id": "eaf97887-1677-461e-a626-a1bf067fe251", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 450.0, + 353.0 + ], + [ + 454.0, + 376.0 + ], + [ + 435.0, + 373.0 + ], + [ + 432.0, + 350.0 + ] + ], + "center_px": [ + 442.75, + 363.0 + ], + "quality": { + "area_px": 415.0, + "perimeter_px": 84.02373313903809, + "sharpness": { + "laplacian_var": 3775.6928516733483 + }, + "contrast": { + "p05": 9.0, + "p95": 183.14999999999998, + "dynamic_range": 174.14999999999998, + "mean_gray": 105.13758389261746, + "std_gray": 63.75544085376343 + }, + "geometry": { + "distance_to_center_norm": 0.28667426109313965, + "distance_to_border_px": 350.0 + }, + "edge_ratio": 1.279311069994454, + "edge_lengths_px": [ + 23.34523582458496, + 19.235383987426758, + 23.194826126098633, + 18.248287200927734 + ] + }, + "confidence": 0.21626223141168163 + }, + { + "observation_id": "0a1e3de9-20e3-46b2-a20e-b4a64a0c0f1a", + "type": "aruco", + "marker_id": 92, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 460.0, + 391.0 + ], + [ + 463.0, + 416.0 + ], + [ + 445.0, + 412.0 + ], + [ + 442.0, + 389.0 + ] + ], + "center_px": [ + 452.5, + 402.0 + ], + "quality": { + "area_px": 423.0, + "perimeter_px": 84.92404365539551, + "sharpness": { + "laplacian_var": 2321.7555359496346 + }, + "contrast": { + "p05": 5.0, + "p95": 173.0, + "dynamic_range": 168.0, + "mean_gray": 63.0, + "std_gray": 58.82294292078038 + }, + "geometry": { + "distance_to_center_norm": 0.2538461983203888, + "distance_to_border_px": 389.0 + }, + "edge_ratio": 1.3902973694243232, + "edge_lengths_px": [ + 25.179357528686523, + 18.439088821411133, + 23.194826126098633, + 18.11077117919922 + ] + }, + "confidence": 0.20283430451772125 + }, + { + "observation_id": "2f8839de-8379-4eb2-b7c5-3674bb5562c8", + "type": "aruco", + "marker_id": 71, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 360.0, + 280.0 + ], + [ + 365.0, + 305.0 + ], + [ + 347.0, + 304.0 + ], + [ + 343.0, + 280.0 + ] + ], + "center_px": [ + 353.75, + 292.25 + ], + "quality": { + "area_px": 426.5, + "perimeter_px": 84.8539047241211, + "sharpness": { + "laplacian_var": 3963.824831944843 + }, + "contrast": { + "p05": 4.0, + "p95": 179.90000000000003, + "dynamic_range": 175.90000000000003, + "mean_gray": 97.0, + "std_gray": 66.96470104794524 + }, + "geometry": { + "distance_to_center_norm": 0.4279112219810486, + "distance_to_border_px": 280.0 + }, + "edge_ratio": 1.4997116537655102, + "edge_lengths_px": [ + 25.495098114013672, + 18.027755737304688, + 24.331050872802734, + 17.0 + ] + }, + "confidence": 0.18959200098193724 + }, + { + "observation_id": "554ac93a-4a18-4a1d-9ee4-77657b8b332f", + "type": "aruco", + "marker_id": 78, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 293.0, + 214.0 + ], + [ + 298.0, + 239.0 + ], + [ + 281.0, + 238.0 + ], + [ + 276.0, + 214.0 + ] + ], + "center_px": [ + 287.0, + 226.25 + ], + "quality": { + "area_px": 414.0, + "perimeter_px": 84.03978538513184, + "sharpness": { + "laplacian_var": 4268.162437673131 + }, + "contrast": { + "p05": 3.0, + "p95": 166.8, + "dynamic_range": 163.8, + "mean_gray": 70.66666666666667, + "std_gray": 61.331807761347235 + }, + "geometry": { + "distance_to_center_norm": 0.5434238314628601, + "distance_to_border_px": 214.0 + }, + "edge_ratio": 1.4997116537655102, + "edge_lengths_px": [ + 25.495098114013672, + 17.029386520385742, + 24.515300750732422, + 17.0 + ] + }, + "confidence": 0.18403537727203287 + }, + { + "observation_id": "b081ddaa-791d-41bd-a681-4e9eb1991233", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 719.0, + 862.0 + ], + [ + 721.0, + 882.0 + ], + [ + 700.0, + 874.0 + ], + [ + 698.0, + 855.0 + ] + ], + "center_px": [ + 709.5, + 868.25 + ], + "quality": { + "area_px": 394.5, + "perimeter_px": 83.8128719329834, + "sharpness": { + "laplacian_var": 3399.563538456088 + }, + "contrast": { + "p05": 2.0, + "p95": 177.0, + "dynamic_range": 175.0, + "mean_gray": 78.54639175257732, + "std_gray": 61.144753147723264 + }, + "geometry": { + "distance_to_center_norm": 0.49302685260772705, + "distance_to_border_px": 78.0 + }, + "edge_ratio": 1.1762489482362517, + "edge_lengths_px": [ + 20.099750518798828, + 22.472204208374023, + 19.10497283935547, + 22.135944366455078 + ] + }, + "confidence": 0.22359212341431653 + }, + { + "observation_id": "6fea48d5-4d8c-4ae8-8056-14d22fd8618c", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 645.0, + 799.0 + ], + [ + 648.0, + 819.0 + ], + [ + 628.0, + 812.0 + ], + [ + 626.0, + 793.0 + ] + ], + "center_px": [ + 636.75, + 805.75 + ], + "quality": { + "area_px": 364.0, + "perimeter_px": 80.44320106506348, + "sharpness": { + "laplacian_var": 4228.218262167125 + }, + "contrast": { + "p05": 4.0, + "p95": 181.0, + "dynamic_range": 177.0, + "mean_gray": 102.57575757575758, + "std_gray": 64.07862372402728 + }, + "geometry": { + "distance_to_center_norm": 0.40720775723457336, + "distance_to_border_px": 141.0 + }, + "edge_ratio": 1.1091154721785277, + "edge_lengths_px": [ + 20.2237491607666, + 21.189620971679688, + 19.10497283935547, + 19.92485809326172 + ] + }, + "confidence": 0.21879296858966374 + }, + { + "observation_id": "629dae5c-8838-4f33-b1cb-898469cb3660", + "type": "aruco", + "marker_id": 56, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 630.0, + 757.0 + ], + [ + 632.0, + 777.0 + ], + [ + 613.0, + 771.0 + ], + [ + 610.0, + 751.0 + ] + ], + "center_px": [ + 621.25, + 764.0 + ], + "quality": { + "area_px": 375.0, + "perimeter_px": 81.12897109985352, + "sharpness": { + "laplacian_var": 2699.5634512396696 + }, + "contrast": { + "p05": 1.0, + "p95": 152.3, + "dynamic_range": 151.3, + "mean_gray": 50.050909090909094, + "std_gray": 50.475314840667046 + }, + "geometry": { + "distance_to_center_norm": 0.35577285289764404, + "distance_to_border_px": 183.0 + }, + "edge_ratio": 1.0479679819696117, + "edge_lengths_px": [ + 20.099750518798828, + 19.92485809326172, + 20.2237491607666, + 20.880613327026367 + ] + }, + "confidence": 0.2385569066052338 + }, + { + "observation_id": "22b7dda9-4d9c-4436-87fd-5659a9654821", + "type": "aruco", + "marker_id": 65, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 317.0, + 264.0 + ], + [ + 322.0, + 289.0 + ], + [ + 305.0, + 286.0 + ], + [ + 301.0, + 263.0 + ] + ], + "center_px": [ + 311.25, + 275.5 + ], + "quality": { + "area_px": 387.0, + "perimeter_px": 82.13422966003418, + "sharpness": { + "laplacian_var": 3967.1700391598433 + }, + "contrast": { + "p05": 2.0, + "p95": 171.0, + "dynamic_range": 169.0, + "mean_gray": 79.26037735849057, + "std_gray": 63.663058627589244 + }, + "geometry": { + "distance_to_center_norm": 0.48395636677742004, + "distance_to_border_px": 263.0 + }, + "edge_ratio": 1.5903405316088945, + "edge_lengths_px": [ + 25.495098114013672, + 17.262676239013672, + 23.34523582458496, + 16.031219482421875 + ] + }, + "confidence": 0.16222940613793577 + }, + { + "observation_id": "8d07935a-390d-49f0-a03f-a9f0c5aa862d", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 486.0, + 520.0 + ], + [ + 468.0, + 518.0 + ], + [ + 464.0, + 495.0 + ], + [ + 481.0, + 497.0 + ] + ], + "center_px": [ + 474.75, + 507.5 + ], + "quality": { + "area_px": 393.5, + "perimeter_px": 82.11045455932617, + "sharpness": { + "laplacian_var": 3456.5892455418384 + }, + "contrast": { + "p05": 7.0, + "p95": 177.09999999999997, + "dynamic_range": 170.09999999999997, + "mean_gray": 77.11481481481482, + "std_gray": 62.59403121292177 + }, + "geometry": { + "distance_to_center_norm": 0.20940321683883667, + "distance_to_border_px": 440.0 + }, + "edge_ratio": 1.3750581796037937, + "edge_lengths_px": [ + 18.11077117919922, + 23.34523582458496, + 17.11724281311035, + 23.53720474243164 + ] + }, + "confidence": 0.1907798064289334 + }, + { + "observation_id": "7d772a05-2097-4030-9dc2-b9aa5e349c7c", + "type": "aruco", + "marker_id": 63, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 349.0, + 329.0 + ], + [ + 353.0, + 352.0 + ], + [ + 336.0, + 350.0 + ], + [ + 332.0, + 327.0 + ] + ], + "center_px": [ + 342.5, + 339.5 + ], + "quality": { + "area_px": 383.0, + "perimeter_px": 80.92495727539062, + "sharpness": { + "laplacian_var": 3594.6837166938944 + }, + "contrast": { + "p05": 3.0, + "p95": 156.0, + "dynamic_range": 153.0, + "mean_gray": 49.62357414448669, + "std_gray": 52.58112449715379 + }, + "geometry": { + "distance_to_center_norm": 0.4112604558467865, + "distance_to_border_px": 327.0 + }, + "edge_ratio": 1.3638432357052561, + "edge_lengths_px": [ + 23.34523582458496, + 17.11724281311035, + 23.34523582458496, + 17.11724281311035 + ] + }, + "confidence": 0.1872160426130633 + }, + { + "observation_id": "83e5960d-8f71-4e41-9adb-f3dd3575d3a2", + "type": "aruco", + "marker_id": 80, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 266.0, + 222.0 + ], + [ + 270.0, + 247.0 + ], + [ + 255.0, + 245.0 + ], + [ + 251.0, + 221.0 + ] + ], + "center_px": [ + 260.5, + 233.75 + ], + "quality": { + "area_px": 361.5, + "perimeter_px": 79.81507110595703, + "sharpness": { + "laplacian_var": 2736.9171597633135 + }, + "contrast": { + "p05": 4.0, + "p95": 167.0, + "dynamic_range": 163.0, + "mean_gray": 64.32307692307693, + "std_gray": 61.020515514124156 + }, + "geometry": { + "distance_to_center_norm": 0.5654910802841187, + "distance_to_border_px": 221.0 + }, + "edge_ratio": 1.6841268155645612, + "edge_lengths_px": [ + 25.317977905273438, + 15.132745742797852, + 24.331050872802734, + 15.033296585083008 + ] + }, + "confidence": 0.14310086257917032 + }, + { + "observation_id": "6125252d-f116-4b80-8636-f4e0c53efa88", + "type": "aruco", + "marker_id": 89, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 174.0, + 185.0 + ], + [ + 179.0, + 209.0 + ], + [ + 163.0, + 208.0 + ], + [ + 159.0, + 185.0 + ] + ], + "center_px": [ + 168.75, + 196.75 + ], + "quality": { + "area_px": 362.0, + "perimeter_px": 78.89175605773926, + "sharpness": { + "laplacian_var": 3033.4831828066217 + }, + "contrast": { + "p05": 4.0, + "p95": 159.0, + "dynamic_range": 155.0, + "mean_gray": 72.86055776892431, + "std_gray": 57.33010999500604 + }, + "geometry": { + "distance_to_center_norm": 0.6872808337211609, + "distance_to_border_px": 159.0 + }, + "edge_ratio": 1.6343533833821615, + "edge_lengths_px": [ + 24.515300750732422, + 16.031219482421875, + 23.34523582458496, + 15.0 + ] + }, + "confidence": 0.14766288355209548 + }, + { + "observation_id": "9bd0ddbc-ce3e-48ab-84e5-a5e1d340a6e9", + "type": "aruco", + "marker_id": 68, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 569.0, + 740.0 + ], + [ + 571.0, + 761.0 + ], + [ + 553.0, + 754.0 + ], + [ + 551.0, + 735.0 + ] + ], + "center_px": [ + 561.0, + 747.5 + ], + "quality": { + "area_px": 348.0, + "perimeter_px": 78.19474411010742, + "sharpness": { + "laplacian_var": 2847.925537109375 + }, + "contrast": { + "p05": 1.0, + "p95": 160.25, + "dynamic_range": 159.25, + "mean_gray": 61.62890625, + "std_gray": 56.205598659552685 + }, + "geometry": { + "distance_to_center_norm": 0.3486519753932953, + "distance_to_border_px": 199.0 + }, + "edge_ratio": 1.1291906648092993, + "edge_lengths_px": [ + 21.095022201538086, + 19.313207626342773, + 19.10497283935547, + 18.681541442871094 + ] + }, + "confidence": 0.20545688804395207 + }, + { + "observation_id": "a384da18-e3f7-49c8-b15a-28ad4abea35e", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 421.0, + 592.0 + ], + [ + 404.0, + 587.0 + ], + [ + 401.0, + 568.0 + ], + [ + 418.0, + 572.0 + ] + ], + "center_px": [ + 411.0, + 579.75 + ], + "quality": { + "area_px": 318.0, + "perimeter_px": 74.6434268951416, + "sharpness": { + "laplacian_var": 3896.9149753565334 + }, + "contrast": { + "p05": 4.5, + "p95": 169.0, + "dynamic_range": 164.5, + "mean_gray": 68.81818181818181, + "std_gray": 55.970476278802856 + }, + "geometry": { + "distance_to_center_norm": 0.3122275471687317, + "distance_to_border_px": 368.0 + }, + "edge_ratio": 1.1580085440662906, + "edge_lengths_px": [ + 17.72004508972168, + 19.235383987426758, + 17.464248657226562, + 20.2237491607666 + ] + }, + "confidence": 0.18307291520973784 + }, + { + "observation_id": "cbe824c4-b1a2-49b9-9089-8526a5684a04", + "type": "aruco", + "marker_id": 67, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 621.0, + 837.0 + ], + [ + 624.0, + 856.0 + ], + [ + 606.0, + 850.0 + ], + [ + 602.0, + 831.0 + ] + ], + "center_px": [ + 613.25, + 843.5 + ], + "quality": { + "area_px": 330.5, + "perimeter_px": 77.55039596557617, + "sharpness": { + "laplacian_var": 3156.9605432322314 + }, + "contrast": { + "p05": 1.0, + "p95": 150.0, + "dynamic_range": 149.0, + "mean_gray": 57.94042553191489, + "std_gray": 51.82003087435324 + }, + "geometry": { + "distance_to_center_norm": 0.455603688955307, + "distance_to_border_px": 104.0 + }, + "edge_ratio": 1.0501322672204985, + "edge_lengths_px": [ + 19.235383987426758, + 18.973665237426758, + 19.416488647460938, + 19.92485809326172 + ] + }, + "confidence": 0.20981483972158477 + }, + { + "observation_id": "a1e73f1c-ab04-4705-8fee-8735c002eb1b", + "type": "aruco", + "marker_id": 99, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 204.0, + 233.0 + ], + [ + 209.0, + 257.0 + ], + [ + 194.0, + 255.0 + ], + [ + 190.0, + 232.0 + ] + ], + "center_px": [ + 199.25, + 244.25 + ], + "quality": { + "area_px": 334.0, + "perimeter_px": 77.02895069122314, + "sharpness": { + "laplacian_var": 4138.2644527856555 + }, + "contrast": { + "p05": 3.0, + "p95": 159.0, + "dynamic_range": 156.0, + "mean_gray": 66.44534412955466, + "std_gray": 59.64955050194431 + }, + "geometry": { + "distance_to_center_norm": 0.6247982382774353, + "distance_to_border_px": 190.0 + }, + "edge_ratio": 1.7466429171056292, + "edge_lengths_px": [ + 24.515300750732422, + 15.132745742797852, + 23.34523582458496, + 14.03566837310791 + ] + }, + "confidence": 0.12748264942192578 + }, + { + "observation_id": "b9080430-5f2d-458a-85b2-f90855a7d4d6", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 574.0, + 776.0 + ], + [ + 577.0, + 796.0 + ], + [ + 560.0, + 791.0 + ], + [ + 556.0, + 771.0 + ] + ], + "center_px": [ + 566.75, + 783.5 + ], + "quality": { + "area_px": 332.5, + "perimeter_px": 77.02141380310059, + "sharpness": { + "laplacian_var": 2826.586063837299 + }, + "contrast": { + "p05": 2.0, + "p95": 156.29999999999995, + "dynamic_range": 154.29999999999995, + "mean_gray": 57.05042016806723, + "std_gray": 52.0430249832126 + }, + "geometry": { + "distance_to_center_norm": 0.390267938375473, + "distance_to_border_px": 164.0 + }, + "edge_ratio": 1.1510172805131142, + "edge_lengths_px": [ + 20.2237491607666, + 17.72004508972168, + 20.39607810974121, + 18.681541442871094 + ] + }, + "confidence": 0.19258326562034714 + }, + { + "observation_id": "4d4863a5-cb91-45b8-9057-bf4862e1ec5d", + "type": "aruco", + "marker_id": 98, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 586.0, + 863.0 + ], + [ + 589.0, + 882.0 + ], + [ + 570.0, + 874.0 + ], + [ + 568.0, + 857.0 + ] + ], + "center_px": [ + 578.25, + 869.0 + ], + "quality": { + "area_px": 315.5, + "perimeter_px": 75.94182014465332, + "sharpness": { + "laplacian_var": 3470.7542596106027 + }, + "contrast": { + "p05": 1.0, + "p95": 164.0, + "dynamic_range": 163.0, + "mean_gray": 73.6824034334764, + "std_gray": 59.70932802712634 + }, + "geometry": { + "distance_to_center_norm": 0.49233826994895935, + "distance_to_border_px": 78.0 + }, + "edge_ratio": 1.20437200849308, + "edge_lengths_px": [ + 19.235383987426758, + 20.615528106689453, + 17.11724281311035, + 18.973665237426758 + ] + }, + "confidence": 0.1746414993457911 + }, + { + "observation_id": "a63f8e19-7a10-483f-b291-74d0a1224b65", + "type": "aruco", + "marker_id": 87, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 232.0, + 309.0 + ], + [ + 236.0, + 330.0 + ], + [ + 222.0, + 328.0 + ], + [ + 217.0, + 306.0 + ] + ], + "center_px": [ + 226.75, + 318.25 + ], + "quality": { + "area_px": 300.5, + "perimeter_px": 73.37777900695801, + "sharpness": { + "laplacian_var": 3781.724943413309 + }, + "contrast": { + "p05": 3.0, + "p95": 167.29999999999998, + "dynamic_range": 164.29999999999998, + "mean_gray": 85.23404255319149, + "std_gray": 62.28438989091324 + }, + "geometry": { + "distance_to_center_norm": 0.5547220706939697, + "distance_to_border_px": 217.0 + }, + "edge_ratio": 1.5953055558852376, + "edge_lengths_px": [ + 21.3775577545166, + 14.142135620117188, + 22.56102752685547, + 15.29705810546875 + ] + }, + "confidence": 0.12557677906548007 + }, + { + "observation_id": "3101bdc2-4914-43f4-be6c-1e50b518dadc", + "type": "aruco", + "marker_id": 76, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 484.0, + 713.0 + ], + [ + 487.0, + 732.0 + ], + [ + 470.0, + 727.0 + ], + [ + 467.0, + 708.0 + ] + ], + "center_px": [ + 477.0, + 720.0 + ], + "quality": { + "area_px": 308.0, + "perimeter_px": 73.91085815429688, + "sharpness": { + "laplacian_var": 4034.944647350052 + }, + "contrast": { + "p05": 1.0, + "p95": 167.95, + "dynamic_range": 166.95, + "mean_gray": 80.04504504504504, + "std_gray": 60.12762513418645 + }, + "geometry": { + "distance_to_center_norm": 0.3626486659049988, + "distance_to_border_px": 228.0 + }, + "edge_ratio": 1.0855155215481949, + "edge_lengths_px": [ + 19.235383987426758, + 17.72004508972168, + 19.235383987426758, + 17.72004508972168 + ] + }, + "confidence": 0.1891574364966065 + }, + { + "observation_id": "de28b87d-60b8-45af-ab83-3c2768baca05", + "type": "aruco", + "marker_id": 90, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 534.0, + 846.0 + ], + [ + 537.0, + 865.0 + ], + [ + 521.0, + 859.0 + ], + [ + 518.0, + 841.0 + ] + ], + "center_px": [ + 527.5, + 852.75 + ], + "quality": { + "area_px": 279.5, + "perimeter_px": 71.33473205566406, + "sharpness": { + "laplacian_var": 3778.274702037678 + }, + "contrast": { + "p05": 4.0, + "p95": 170.85, + "dynamic_range": 166.85, + "mean_gray": 82.23529411764706, + "std_gray": 62.468921915666606 + }, + "geometry": { + "distance_to_center_norm": 0.48669615387916565, + "distance_to_border_px": 95.0 + }, + "edge_ratio": 1.1474868546633006, + "edge_lengths_px": [ + 19.235383987426758, + 17.0880069732666, + 18.248287200927734, + 16.76305389404297 + ] + }, + "confidence": 0.16238385004245462 + }, + { + "observation_id": "0caae260-4c60-44b1-8534-9569609c7cee", + "type": "aruco", + "marker_id": 205, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 266.0, + 485.0 + ], + [ + 252.0, + 482.0 + ], + [ + 247.0, + 462.0 + ], + [ + 261.0, + 464.0 + ] + ], + "center_px": [ + 256.5, + 473.25 + ], + "quality": { + "area_px": 274.5, + "perimeter_px": 70.66251754760742, + "sharpness": { + "laplacian_var": 4818.41774417342 + }, + "contrast": { + "p05": 2.0, + "p95": 158.89999999999998, + "dynamic_range": 156.89999999999998, + "mean_gray": 64.43497757847534, + "std_gray": 55.47587877938293 + }, + "geometry": { + "distance_to_center_norm": 0.47944924235343933, + "distance_to_border_px": 247.0 + }, + "edge_ratio": 1.5264336941732959, + "edge_lengths_px": [ + 14.317821502685547, + 20.615528106689453, + 14.142135620117188, + 21.587032318115234 + ] + }, + "confidence": 0.11988729068189977 + }, + { + "observation_id": "04adc94b-5c31-4579-8b42-c7be7beabda3", + "type": "aruco", + "marker_id": 91, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 479.0, + 836.0 + ], + [ + 482.0, + 854.0 + ], + [ + 466.0, + 849.0 + ], + [ + 464.0, + 831.0 + ] + ], + "center_px": [ + 472.75, + 842.5 + ], + "quality": { + "area_px": 266.5, + "perimeter_px": 68.93350028991699, + "sharpness": { + "laplacian_var": 3637.0774468315976 + }, + "contrast": { + "p05": 3.0, + "p95": 167.45, + "dynamic_range": 164.45, + "mean_gray": 74.09895833333333, + "std_gray": 60.68167968106132 + }, + "geometry": { + "distance_to_center_norm": 0.49902844429016113, + "distance_to_border_px": 106.0 + }, + "edge_ratio": 1.1541230398465763, + "edge_lengths_px": [ + 18.248287200927734, + 16.76305389404297, + 18.11077117919922, + 15.81138801574707 + ] + }, + "confidence": 0.15394083692349203 + }, + { + "observation_id": "090e3e06-b848-4347-9d6f-3a47ea48b2ff", + "type": "aruco", + "marker_id": 88, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 448.0, + 817.0 + ], + [ + 451.0, + 835.0 + ], + [ + 436.0, + 829.0 + ], + [ + 432.0, + 812.0 + ] + ], + "center_px": [ + 441.75, + 823.25 + ], + "quality": { + "area_px": 252.0, + "perimeter_px": 68.63108444213867, + "sharpness": { + "laplacian_var": 4301.369869854249 + }, + "contrast": { + "p05": 3.0, + "p95": 168.0, + "dynamic_range": 165.0, + "mean_gray": 80.99441340782123, + "std_gray": 61.51844863016795 + }, + "geometry": { + "distance_to_center_norm": 0.4954852759838104, + "distance_to_border_px": 125.0 + }, + "edge_ratio": 1.1295406022007686, + "edge_lengths_px": [ + 18.248287200927734, + 16.155494689941406, + 17.464248657226562, + 16.76305389404297 + ] + }, + "confidence": 0.14873303329926613 + }, + { + "observation_id": "7c799728-9022-4bf2-8809-67d082fdda1b", + "type": "aruco", + "marker_id": 207, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 284.0, + 562.0 + ], + [ + 270.0, + 559.0 + ], + [ + 267.0, + 540.0 + ], + [ + 281.0, + 544.0 + ] + ], + "center_px": [ + 275.5, + 551.25 + ], + "quality": { + "area_px": 248.5, + "perimeter_px": 66.36171245574951, + "sharpness": { + "laplacian_var": 3825.507416992804 + }, + "contrast": { + "p05": 8.0, + "p95": 162.15, + "dynamic_range": 154.15, + "mean_gray": 68.37640449438203, + "std_gray": 54.84543044780416 + }, + "geometry": { + "distance_to_center_norm": 0.46424809098243713, + "distance_to_border_px": 267.0 + }, + "edge_ratio": 1.343457451527723, + "edge_lengths_px": [ + 14.317821502685547, + 19.235383987426758, + 14.560219764709473, + 18.248287200927734 + ] + }, + "confidence": 0.12331366838471701 + }, + { + "observation_id": "c3d1f374-a31f-447f-bd16-9603aad19621", + "type": "aruco", + "marker_id": 94, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 354.0, + 682.0 + ], + [ + 357.0, + 701.0 + ], + [ + 343.0, + 695.0 + ], + [ + 340.0, + 678.0 + ] + ], + "center_px": [ + 348.5, + 689.0 + ], + "quality": { + "area_px": 237.0, + "perimeter_px": 66.28982639312744, + "sharpness": { + "laplacian_var": 4129.213399943311 + }, + "contrast": { + "p05": 1.0, + "p95": 154.3, + "dynamic_range": 153.3, + "mean_gray": 59.535714285714285, + "std_gray": 53.44455213640793 + }, + "geometry": { + "distance_to_center_norm": 0.4483533203601837, + "distance_to_border_px": 259.0 + }, + "edge_ratio": 1.3210915973980542, + "edge_lengths_px": [ + 19.235383987426758, + 15.231546401977539, + 17.262676239013672, + 14.560219764709473 + ] + }, + "confidence": 0.11959806595635586 + }, + { + "observation_id": "5b176663-24db-4dd8-ab18-0342ce14ee48", + "type": "aruco", + "marker_id": 49, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 271.0, + 649.0 + ], + [ + 275.0, + 666.0 + ], + [ + 260.0, + 661.0 + ], + [ + 257.0, + 645.0 + ] + ], + "center_px": [ + 265.75, + 655.25 + ], + "quality": { + "area_px": 223.5, + "perimeter_px": 64.1146764755249, + "sharpness": { + "laplacian_var": 3786.6298670084925 + }, + "contrast": { + "p05": 1.0, + "p95": 136.3, + "dynamic_range": 135.3, + "mean_gray": 39.04430379746835, + "std_gray": 43.278366703415486 + }, + "geometry": { + "distance_to_center_norm": 0.5165625810623169, + "distance_to_border_px": 257.0 + }, + "edge_ratio": 1.1994495233894593, + "edge_lengths_px": [ + 17.464248657226562, + 15.81138801574707, + 16.278820037841797, + 14.560219764709473 + ] + }, + "confidence": 0.12422365184568084 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 222.0, + 445.0 + ], + [ + 244.0, + 529.0 + ], + [ + 239.0, + 544.0 + ], + [ + 217.0, + 456.0 + ] + ], + "center_px": [ + 230.5, + 493.5 + ], + "area_px": 716.0 + }, + { + "image_points_px": [ + [ + 880.0, + 697.0 + ], + [ + 934.0, + 711.0 + ], + [ + 939.0, + 726.0 + ], + [ + 891.0, + 720.0 + ] + ], + "center_px": [ + 911.0, + 713.5 + ], + "area_px": 889.0 + }, + { + "image_points_px": [ + [ + 825.0, + 808.0 + ], + [ + 864.0, + 816.0 + ], + [ + 870.0, + 827.0 + ], + [ + 830.0, + 819.0 + ] + ], + "center_px": [ + 847.25, + 817.5 + ], + "area_px": 390.5 + }, + { + "image_points_px": [ + [ + 728.0, + 402.0 + ], + [ + 743.0, + 416.0 + ], + [ + 743.0, + 431.0 + ], + [ + 734.0, + 447.0 + ] + ], + "center_px": [ + 737.0, + 424.0 + ], + "area_px": 363.0 + }, + { + "image_points_px": [ + [ + 649.0, + 191.0 + ], + [ + 661.0, + 185.0 + ], + [ + 693.0, + 193.0 + ], + [ + 684.0, + 202.0 + ] + ], + "center_px": [ + 671.75, + 192.75 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 441.0, + 570.0 + ], + [ + 462.0, + 573.0 + ], + [ + 467.0, + 599.0 + ], + [ + 446.0, + 595.0 + ] + ], + "center_px": [ + 454.0, + 584.25 + ], + "area_px": 518.0 + }, + { + "image_points_px": [ + [ + 529.0, + 312.0 + ], + [ + 548.0, + 314.0 + ], + [ + 553.0, + 340.0 + ], + [ + 532.0, + 338.0 + ] + ], + "center_px": [ + 540.5, + 326.0 + ], + "area_px": 512.0 + }, + { + "image_points_px": [ + [ + 555.0, + 597.0 + ], + [ + 574.0, + 600.0 + ], + [ + 578.0, + 623.0 + ], + [ + 558.0, + 619.0 + ] + ], + "center_px": [ + 566.25, + 609.75 + ], + "area_px": 426.5 + }, + { + "image_points_px": [ + [ + 662.0, + 788.0 + ], + [ + 682.0, + 794.0 + ], + [ + 684.0, + 815.0 + ], + [ + 664.0, + 809.0 + ] + ], + "center_px": [ + 673.0, + 801.5 + ], + "area_px": 408.0 + }, + { + "image_points_px": [ + [ + 677.0, + 869.0 + ], + [ + 697.0, + 876.0 + ], + [ + 699.0, + 897.0 + ], + [ + 680.0, + 889.0 + ] + ], + "center_px": [ + 688.25, + 882.75 + ], + "area_px": 381.0 + }, + { + "image_points_px": [ + [ + 582.0, + 757.0 + ], + [ + 600.0, + 762.0 + ], + [ + 603.0, + 783.0 + ], + [ + 584.0, + 776.0 + ] + ], + "center_px": [ + 592.25, + 769.5 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 669.0, + 485.0 + ], + [ + 673.0, + 485.0 + ], + [ + 679.0, + 515.0 + ], + [ + 675.0, + 519.0 + ] + ], + "center_px": [ + 674.0, + 501.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 709.0, + 518.0 + ], + [ + 717.0, + 546.0 + ], + [ + 715.0, + 554.0 + ], + [ + 708.0, + 526.0 + ] + ], + "center_px": [ + 712.25, + 536.0 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 545.0, + 839.0 + ], + [ + 563.0, + 843.0 + ], + [ + 566.0, + 862.0 + ], + [ + 549.0, + 856.0 + ] + ], + "center_px": [ + 555.75, + 850.0 + ], + "area_px": 297.5 + }, + { + "image_points_px": [ + [ + 386.0, + 690.0 + ], + [ + 401.0, + 694.0 + ], + [ + 406.0, + 713.0 + ], + [ + 389.0, + 707.0 + ] + ], + "center_px": [ + 395.5, + 701.0 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 382.0, + 738.0 + ], + [ + 397.0, + 744.0 + ], + [ + 400.0, + 761.0 + ], + [ + 385.0, + 757.0 + ] + ], + "center_px": [ + 391.0, + 750.0 + ], + "area_px": 255.0 + }, + { + "image_points_px": [ + [ + 434.0, + 517.0 + ], + [ + 439.0, + 516.0 + ], + [ + 465.0, + 527.0 + ], + [ + 456.0, + 527.0 + ] + ], + "center_px": [ + 448.5, + 521.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 298.0, + 644.0 + ], + [ + 311.0, + 648.0 + ], + [ + 315.0, + 667.0 + ], + [ + 301.0, + 661.0 + ] + ], + "center_px": [ + 306.25, + 655.0 + ], + "area_px": 225.5 + }, + { + "image_points_px": [ + [ + 1124.0, + 34.0 + ], + [ + 1125.0, + 51.0 + ], + [ + 1123.0, + 60.0 + ], + [ + 1121.0, + 38.0 + ] + ], + "center_px": [ + 1123.25, + 45.75 + ], + "area_px": 58.5 + }, + { + "image_points_px": [ + [ + 730.0, + 514.0 + ], + [ + 735.0, + 534.0 + ], + [ + 733.0, + 539.0 + ], + [ + 728.0, + 519.0 + ] + ], + "center_px": [ + 731.5, + 526.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 657.0, + 512.0 + ], + [ + 658.0, + 523.0 + ], + [ + 655.0, + 535.0 + ], + [ + 652.0, + 536.0 + ] + ], + "center_px": [ + 655.5, + 526.5 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 423.0, + 484.0 + ], + [ + 447.0, + 488.0 + ], + [ + 439.0, + 490.0 + ], + [ + 425.0, + 487.0 + ] + ], + "center_px": [ + 433.5, + 487.25 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 748.0, + 531.0 + ], + [ + 756.0, + 527.0 + ], + [ + 770.0, + 531.0 + ], + [ + 760.0, + 534.0 + ] + ], + "center_px": [ + 758.5, + 530.75 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 1260.0, + 80.0 + ], + [ + 1260.0, + 97.0 + ], + [ + 1258.0, + 98.0 + ], + [ + 1257.0, + 96.0 + ] + ], + "center_px": [ + 1258.75, + 92.75 + ], + "area_px": 28.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam1_camera_pose.json b/test/y-axis-finder-examples/20260612_190241/cam1_camera_pose.json new file mode 100644 index 0000000..766e6f0 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam1_camera_pose.json @@ -0,0 +1,778 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:47Z", + "source": { + "detection_json": "/app/data/board/20260612_190241/cam1_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1367.5723876953125, + 0.0, + 672.1165771484375 + ], + [ + 0.0, + 1372.3011474609375, + 445.8396911621094 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.01016925647854805, + 0.7656787633895874, + -0.0031530377455055714, + -0.00288817984983325, + -2.490830183029175 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 41, + "used_marker_ids": [ + 69, + 64, + 58, + 66, + 103, + 95, + 51, + 97, + 77, + 55, + 79, + 85, + 57, + 59, + 0, + 48, + 86, + 102, + 92, + 71, + 78, + 84, + 53, + 56, + 65, + 208, + 63, + 80, + 89, + 68, + 67, + 99, + 50, + 98, + 87, + 76, + 90, + 91, + 88, + 94, + 49 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3, + 4 + ], + "rms": [ + 0.01626831058482708, + 0.0019037918592798373, + 0.001247731562271114, + 0.0012476908106882525, + 0.0012476908087616105 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125, + 6.25e-05 + ] + }, + "residual_rms_px": 2.441060868215605, + "residual_median_px": 1.6480122900302094, + "residual_max_px": 7.179998518731448, + "sigma2_normalized": 1.679632276973586e-06 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.8173407912254333, + 0.12236006557941437, + -0.5630115866661072 + ], + [ + -0.0904836505651474, + 0.9378020763397217, + 0.3351716101169586 + ], + [ + 0.5690050721168518, + 0.3248927593231201, + -0.7554323077201843 + ] + ], + "translation_m": [ + 0.3253575265407562, + 0.20355235040187836, + 0.964842677116394 + ], + "rvec_rad": [ + -0.022556792807664847, + -2.484197746332878, + -0.4670831287352907 + ] + }, + "camera_in_world": { + "position_m": [ + -0.2646542489528656, + -0.544173002243042, + 0.8438284397125244 + ], + "position_mm": [ + -264.65423583984375, + -544.1729736328125, + 843.8284301757812 + ], + "orientation_deg": { + "roll": 156.7286376953125, + "pitch": -34.68087387084961, + "yaw": -173.68280029296875 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 9.020495954543757e-07, + -2.5186644463900055e-07, + 4.1544562424560804e-07, + -2.7185362313316923e-08, + 2.3516989168739422e-07, + 2.5860929096456504e-07 + ], + [ + -2.5186644463900463e-07, + 3.331555463970283e-06, + -5.164756336945231e-07, + -9.398036900652846e-07, + 1.9612304620126222e-07, + -2.6666374844345805e-06 + ], + [ + 4.1544562424560153e-07, + -5.164756336945163e-07, + 3.975040776698669e-06, + -2.2358239196827201e-07, + -2.9935451057369255e-07, + 5.679794091450418e-08 + ], + [ + -2.7185362313315162e-08, + -9.398036900652857e-07, + -2.2358239196826953e-07, + 3.657699708448382e-07, + -5.039174278856826e-08, + 7.731255031871781e-07 + ], + [ + 2.3516989168739477e-07, + 1.9612304620126273e-07, + -2.9935451057369043e-07, + -5.039174278856851e-08, + 1.8174642641776504e-07, + -7.871456697548212e-08 + ], + [ + 2.5860929096456864e-07, + -2.6666374844345796e-06, + 5.679794091451072e-08, + 7.73125503187177e-07, + -7.871456697548164e-08, + 3.0109863485192825e-06 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.0544174065900163, + 0.10457940252524857, + 0.11423348503526454 + ], + "tvec_std_m": [ + 0.0006047891953770654, + 0.0004263172837427132, + 0.0017352193949236744 + ] + }, + "camera_center_std_m": [ + 0.0013365683362617945, + 0.0016919316300862315, + 0.0022104681815435802 + ], + "camera_center_std_mm": [ + 1.3365683362617944, + 1.6919316300862315, + 2.2104681815435803 + ], + "orientation_std_deg": { + "roll": 0.1259555176900748, + "pitch": 0.0993322135565253, + "yaw": 0.07432949479267956 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 69, + "observed_center_px": [ + 1141.0, + 352.25 + ], + "projected_center_px": [ + 1143.9259033203125, + 352.16204833984375 + ], + "reprojection_error_px": 2.927224920353739, + "confidence": 0.7813063460689879 + }, + { + "marker_id": 64, + "observed_center_px": [ + 1181.75, + 489.25 + ], + "projected_center_px": [ + 1186.3818359375, + 489.28424072265625 + ], + "reprojection_error_px": 4.631962497581832, + "confidence": 0.725685890970946 + }, + { + "marker_id": 58, + "observed_center_px": [ + 1076.75, + 435.5 + ], + "projected_center_px": [ + 1078.8704833984375, + 436.0857849121094 + ], + "reprojection_error_px": 2.199907681313931, + "confidence": 0.6468392962739578 + }, + { + "marker_id": 66, + "observed_center_px": [ + 859.5, + 223.5 + ], + "projected_center_px": [ + 858.2955322265625, + 223.2216339111328 + ], + "reprojection_error_px": 1.2362161205390843, + "confidence": 0.5815132553901365 + }, + { + "marker_id": 103, + "observed_center_px": [ + 1000.75, + 467.5 + ], + "projected_center_px": [ + 1001.87646484375, + 467.74969482421875 + ], + "reprojection_error_px": 1.153806981018205, + "confidence": 0.5850883428101251 + }, + { + "marker_id": 95, + "observed_center_px": [ + 894.75, + 345.0 + ], + "projected_center_px": [ + 894.1392211914062, + 345.0137023925781 + ], + "reprojection_error_px": 0.610932491024635, + "confidence": 0.514211563803094 + }, + { + "marker_id": 51, + "observed_center_px": [ + 922.5, + 477.0 + ], + "projected_center_px": [ + 922.7356567382812, + 477.46380615234375 + ], + "reprojection_error_px": 0.520240564786399, + "confidence": 0.531851742229114 + }, + { + "marker_id": 97, + "observed_center_px": [ + 747.5, + 226.0 + ], + "projected_center_px": [ + 746.2076416015625, + 225.6285858154297 + ], + "reprojection_error_px": 1.344670489938695, + "confidence": 0.4305921444470976 + }, + { + "marker_id": 77, + "observed_center_px": [ + 1120.0, + 936.0 + ], + "projected_center_px": [ + 1122.4146728515625, + 937.3768920898438 + ], + "reprojection_error_px": 2.779654080483265, + "confidence": 0.04887616439684762 + }, + { + "marker_id": 55, + "observed_center_px": [ + 780.25, + 351.25 + ], + "projected_center_px": [ + 779.5296630859375, + 350.7990417480469 + ], + "reprojection_error_px": 0.8498521134678102, + "confidence": 0.45188399047707256 + }, + { + "marker_id": 79, + "observed_center_px": [ + 759.5, + 470.75 + ], + "projected_center_px": [ + 758.6536865234375, + 470.7616882324219 + ], + "reprojection_error_px": 0.8463941844013657, + "confidence": 0.4064190860033059 + }, + { + "marker_id": 85, + "observed_center_px": [ + 551.25, + 274.75 + ], + "projected_center_px": [ + 549.5010375976562, + 275.5161437988281 + ], + "reprojection_error_px": 1.9094098054882853, + "confidence": 0.29471875217641086 + }, + { + "marker_id": 57, + "observed_center_px": [ + 455.75, + 211.5 + ], + "projected_center_px": [ + 454.1186218261719, + 212.99258422851562 + ], + "reprojection_error_px": 2.2111540935123384, + "confidence": 0.23246554692762017 + }, + { + "marker_id": 59, + "observed_center_px": [ + 451.5, + 305.5 + ], + "projected_center_px": [ + 450.2358703613281, + 306.5943603515625 + ], + "reprojection_error_px": 1.672019235068988, + "confidence": 0.23626863876654625 + }, + { + "marker_id": 0, + "observed_center_px": [ + 575.5, + 521.75 + ], + "projected_center_px": [ + 576.5433349609375, + 515.0587158203125 + ], + "reprojection_error_px": 6.772136429078395, + "confidence": 0.2561403464624635 + }, + { + "marker_id": 48, + "observed_center_px": [ + 393.5, + 256.5 + ], + "projected_center_px": [ + 392.5115966796875, + 258.2700500488281 + ], + "reprojection_error_px": 2.027318006372267, + "confidence": 0.2349324618092993 + }, + { + "marker_id": 86, + "observed_center_px": [ + 752.5, + 911.5 + ], + "projected_center_px": [ + 751.4478759765625, + 911.4331665039062 + ], + "reprojection_error_px": 1.0542446001258088, + "confidence": 0.17313725307117095 + }, + { + "marker_id": 102, + "observed_center_px": [ + 442.75, + 363.0 + ], + "projected_center_px": [ + 441.2080383300781, + 363.5816345214844 + ], + "reprojection_error_px": 1.6480122900302094, + "confidence": 0.21626223141168163 + }, + { + "marker_id": 92, + "observed_center_px": [ + 452.5, + 402.0 + ], + "projected_center_px": [ + 451.4149169921875, + 402.95751953125 + ], + "reprojection_error_px": 1.44715195697226, + "confidence": 0.20283430451772125 + }, + { + "marker_id": 71, + "observed_center_px": [ + 353.75, + 292.25 + ], + "projected_center_px": [ + 353.2550354003906, + 293.890380859375 + ], + "reprojection_error_px": 1.7134291110723934, + "confidence": 0.18959200098193724 + }, + { + "marker_id": 78, + "observed_center_px": [ + 287.0, + 226.25 + ], + "projected_center_px": [ + 287.53631591796875, + 228.46209716796875 + ], + "reprojection_error_px": 2.276182911016166, + "confidence": 0.18403537727203287 + }, + { + "marker_id": 84, + "observed_center_px": [ + 709.5, + 868.25 + ], + "projected_center_px": [ + 708.224365234375, + 867.7926635742188 + ], + "reprojection_error_px": 1.355138613433149, + "confidence": 0.22359212341431653 + }, + { + "marker_id": 53, + "observed_center_px": [ + 636.75, + 805.75 + ], + "projected_center_px": [ + 635.7542114257812, + 805.0380249023438 + ], + "reprojection_error_px": 1.224133744419799, + "confidence": 0.21879296858966374 + }, + { + "marker_id": 56, + "observed_center_px": [ + 621.25, + 764.0 + ], + "projected_center_px": [ + 620.3877563476562, + 763.2960205078125 + ], + "reprojection_error_px": 1.1131267858728673, + "confidence": 0.2385569066052338 + }, + { + "marker_id": 65, + "observed_center_px": [ + 311.25, + 275.5 + ], + "projected_center_px": [ + 311.5706481933594, + 277.46697998046875 + ], + "reprojection_error_px": 1.9929439298358285, + "confidence": 0.16222940613793577 + }, + { + "marker_id": 208, + "observed_center_px": [ + 474.75, + 507.5 + ], + "projected_center_px": [ + 475.4454345703125, + 500.353759765625 + ], + "reprojection_error_px": 7.179998518731448, + "confidence": 0.1907798064289334 + }, + { + "marker_id": 63, + "observed_center_px": [ + 342.5, + 339.5 + ], + "projected_center_px": [ + 342.5025329589844, + 340.3869934082031 + ], + "reprojection_error_px": 0.8869970248411276, + "confidence": 0.1872160426130633 + }, + { + "marker_id": 80, + "observed_center_px": [ + 260.5, + 233.75 + ], + "projected_center_px": [ + 261.1359558105469, + 235.85646057128906 + ], + "reprojection_error_px": 2.200367226479202, + "confidence": 0.14310086257917032 + }, + { + "marker_id": 89, + "observed_center_px": [ + 168.75, + 196.75 + ], + "projected_center_px": [ + 171.71939086914062, + 199.38575744628906 + ], + "reprojection_error_px": 3.9704533052793805, + "confidence": 0.14766288355209548 + }, + { + "marker_id": 68, + "observed_center_px": [ + 561.0, + 747.5 + ], + "projected_center_px": [ + 560.0670166015625, + 747.2664184570312 + ], + "reprojection_error_px": 0.9617787474131714, + "confidence": 0.20545688804395207 + }, + { + "marker_id": 67, + "observed_center_px": [ + 613.25, + 843.5 + ], + "projected_center_px": [ + 611.8975830078125, + 842.6251831054688 + ], + "reprojection_error_px": 1.610694359496793, + "confidence": 0.20981483972158477 + }, + { + "marker_id": 99, + "observed_center_px": [ + 199.25, + 244.25 + ], + "projected_center_px": [ + 201.05361938476562, + 246.8247528076172 + ], + "reprojection_error_px": 3.1436276664762515, + "confidence": 0.12748264942192578 + }, + { + "marker_id": 50, + "observed_center_px": [ + 566.75, + 783.5 + ], + "projected_center_px": [ + 565.5367431640625, + 782.8196411132812 + ], + "reprojection_error_px": 1.3909997716341476, + "confidence": 0.19258326562034714 + }, + { + "marker_id": 98, + "observed_center_px": [ + 578.25, + 869.0 + ], + "projected_center_px": [ + 576.6578369140625, + 868.5824584960938 + ], + "reprojection_error_px": 1.6460024907959028, + "confidence": 0.1746414993457911 + }, + { + "marker_id": 87, + "observed_center_px": [ + 226.75, + 318.25 + ], + "projected_center_px": [ + 227.798828125, + 320.0245056152344 + ], + "reprojection_error_px": 2.061288581031133, + "confidence": 0.12557677906548007 + }, + { + "marker_id": 76, + "observed_center_px": [ + 477.0, + 720.0 + ], + "projected_center_px": [ + 475.8730773925781, + 719.6278076171875 + ], + "reprojection_error_px": 1.1867947307526117, + "confidence": 0.1891574364966065 + }, + { + "marker_id": 90, + "observed_center_px": [ + 527.5, + 852.75 + ], + "projected_center_px": [ + 526.2864379882812, + 851.8463745117188 + ], + "reprojection_error_px": 1.5130339650379256, + "confidence": 0.16238385004245462 + }, + { + "marker_id": 91, + "observed_center_px": [ + 472.75, + 842.5 + ], + "projected_center_px": [ + 471.3303527832031, + 841.0626831054688 + ], + "reprojection_error_px": 2.0202173337203275, + "confidence": 0.15394083692349203 + }, + { + "marker_id": 88, + "observed_center_px": [ + 441.75, + 823.25 + ], + "projected_center_px": [ + 441.02813720703125, + 821.6939086914062 + ], + "reprojection_error_px": 1.7153734440504942, + "confidence": 0.14873303329926613 + }, + { + "marker_id": 94, + "observed_center_px": [ + 348.5, + 689.0 + ], + "projected_center_px": [ + 348.7214050292969, + 688.1775512695312 + ], + "reprojection_error_px": 0.8517288895227217, + "confidence": 0.11959806595635586 + }, + { + "marker_id": 49, + "observed_center_px": [ + 265.75, + 655.25 + ], + "projected_center_px": [ + 267.3890075683594, + 653.9424438476562 + ], + "reprojection_error_px": 2.0966756784661054, + "confidence": 0.12422365184568084 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam1_debug.jpg b/test/y-axis-finder-examples/20260612_190241/cam1_debug.jpg new file mode 100644 index 0000000..c5c99a9 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam1_debug.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/cam2.jpg b/test/y-axis-finder-examples/20260612_190241/cam2.jpg new file mode 100644 index 0000000..e3f219c Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam2.jpg differ diff --git a/test/y-axis-finder-examples/20260612_190241/cam2_aruco_detection.json b/test/y-axis-finder-examples/20260612_190241/cam2_aruco_detection.json new file mode 100644 index 0000000..704fcbb --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam2_aruco_detection.json @@ -0,0 +1,2827 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:50Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam2", + "intrinsics_file": "/app/data/calibration/20260610_092149/cam2_calibration.npz", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "image": { + "image_file": "/app/data/board/20260612_190241/cam2.jpg", + "image_sha256": "f8aec5128f5be8616ad392998f9fe298fb5b32b062d6ce419a8998e083fecfe5", + "width_px": 1920, + "height_px": 1080 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 19, + "num_rejected_candidates": 70 + }, + "detections": [ + { + "observation_id": "8c8ac9f7-dbac-4384-b342-958932ae26f5", + "type": "aruco", + "marker_id": 201, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 671.0, + 943.0 + ], + [ + 719.0, + 944.0 + ], + [ + 717.0, + 990.0 + ], + [ + 669.0, + 988.0 + ] + ], + "center_px": [ + 694.0, + 966.25 + ], + "quality": { + "area_px": 2187.0, + "perimeter_px": 187.13994216918945, + "sharpness": { + "laplacian_var": 931.8841855806047 + }, + "contrast": { + "p05": 9.0, + "p95": 125.0, + "dynamic_range": 116.0, + "mean_gray": 45.14016172506739, + "std_gray": 46.22615832168397 + }, + "geometry": { + "distance_to_center_norm": 0.4561600387096405, + "distance_to_border_px": 90.0 + }, + "edge_ratio": 1.0665393531995977, + "edge_lengths_px": [ + 48.010414123535156, + 46.04345703125, + 48.041648864746094, + 45.0444221496582 + ] + }, + "confidence": 0.9376119099590832 + }, + { + "observation_id": "8f7c1d41-4835-47c9-a50c-5132679de368", + "type": "aruco", + "marker_id": 197, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1058.0, + 868.0 + ], + [ + 1065.0, + 909.0 + ], + [ + 1021.0, + 917.0 + ], + [ + 1015.0, + 877.0 + ] + ], + "center_px": [ + 1039.75, + 892.75 + ], + "quality": { + "area_px": 1817.0, + "perimeter_px": 170.6938934326172, + "sharpness": { + "laplacian_var": 1386.1674688020182 + }, + "contrast": { + "p05": 12.0, + "p95": 139.0, + "dynamic_range": 127.0, + "mean_gray": 72.41559485530547, + "std_gray": 53.518306341976775 + }, + "geometry": { + "distance_to_center_norm": 0.32834121584892273, + "distance_to_border_px": 163.0 + }, + "edge_ratio": 1.1056644071636241, + "edge_lengths_px": [ + 41.59326934814453, + 44.72135925292969, + 40.4474983215332, + 43.931766510009766 + ] + }, + "confidence": 0.9044335636753593 + }, + { + "observation_id": "5b609498-d412-4767-b49e-e7fa01e8d5da", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1184.0, + 815.0 + ], + [ + 1179.0, + 776.0 + ], + [ + 1219.0, + 774.0 + ], + [ + 1222.0, + 813.0 + ] + ], + "center_px": [ + 1201.0, + 794.5 + ], + "quality": { + "area_px": 1529.0, + "perimeter_px": 156.5369873046875, + "sharpness": { + "laplacian_var": 1541.1514066646505 + }, + "contrast": { + "p05": 16.0, + "p95": 165.0, + "dynamic_range": 149.0, + "mean_gray": 65.80720545277508, + "std_gray": 60.16491314534901 + }, + "geometry": { + "distance_to_center_norm": 0.3182171583175659, + "distance_to_border_px": 265.0 + }, + "edge_ratio": 1.0524897596654121, + "edge_lengths_px": [ + 39.31920623779297, + 40.04996871948242, + 39.11521530151367, + 38.05259704589844 + ] + }, + "confidence": 0.9501280091484228 + }, + { + "observation_id": "70fd390f-f9b0-4a5d-92e9-61e1a3b012c7", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1354.0, + 801.0 + ], + [ + 1348.0, + 762.0 + ], + [ + 1386.0, + 759.0 + ], + [ + 1392.0, + 798.0 + ] + ], + "center_px": [ + 1370.0, + 780.0 + ], + "quality": { + "area_px": 1500.0, + "perimeter_px": 155.1541519165039, + "sharpness": { + "laplacian_var": 1588.242222142541 + }, + "contrast": { + "p05": 15.0, + "p95": 164.0, + "dynamic_range": 149.0, + "mean_gray": 73.89620758483034, + "std_gray": 61.03100554891913 + }, + "geometry": { + "distance_to_center_norm": 0.4313199818134308, + "distance_to_border_px": 279.0 + }, + "edge_ratio": 1.0351695932545988, + "edge_lengths_px": [ + 39.458839416503906, + 38.11823654174805, + 39.458839416503906, + 38.11823654174805 + ] + }, + "confidence": 0.9660252836986597 + }, + { + "observation_id": "9babb653-0c72-4462-be01-5b6dd6826fb0", + "type": "aruco", + "marker_id": 189, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1514.0, + 796.0 + ], + [ + 1514.0, + 833.0 + ], + [ + 1476.0, + 831.0 + ], + [ + 1477.0, + 795.0 + ] + ], + "center_px": [ + 1495.25, + 813.75 + ], + "quality": { + "area_px": 1369.5, + "perimeter_px": 148.07999420166016, + "sharpness": { + "laplacian_var": 1519.9140401796326 + }, + "contrast": { + "p05": 15.0, + "p95": 159.0, + "dynamic_range": 144.0, + "mean_gray": 79.35343035343035, + "std_gray": 60.09334244589822 + }, + "geometry": { + "distance_to_center_norm": 0.5458167791366577, + "distance_to_border_px": 247.0 + }, + "edge_ratio": 1.056609041753135, + "edge_lengths_px": [ + 37.0, + 38.05259704589844, + 36.013885498046875, + 37.013511657714844 + ] + }, + "confidence": 0.8640849774341722 + }, + { + "observation_id": "bc723db9-3c1c-4839-90db-ec54d6e3fb18", + "type": "aruco", + "marker_id": 204, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 540.0, + 906.0 + ], + [ + 551.0, + 887.0 + ], + [ + 596.0, + 887.0 + ], + [ + 586.0, + 905.0 + ] + ], + "center_px": [ + 568.25, + 896.25 + ], + "quality": { + "area_px": 836.5, + "perimeter_px": 133.55662727355957, + "sharpness": { + "laplacian_var": 3083.1364558133387 + }, + "contrast": { + "p05": 14.0, + "p95": 203.0, + "dynamic_range": 189.0, + "mean_gray": 75.62113821138212, + "std_gray": 67.5841026816946 + }, + "geometry": { + "distance_to_center_norm": 0.4807385802268982, + "distance_to_border_px": 174.0 + }, + "edge_ratio": 2.2344852155259973, + "edge_lengths_px": [ + 21.954498291015625, + 45.0, + 20.59126091003418, + 46.010868072509766 + ] + }, + "confidence": 0.24957277085200677 + }, + { + "observation_id": "c3d7f59b-3744-4b37-8f1a-0dbdb81bf17a", + "type": "aruco", + "marker_id": 73, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 293.0, + 1040.0 + ], + [ + 255.0, + 1038.0 + ], + [ + 272.0, + 1019.0 + ], + [ + 310.0, + 1021.0 + ] + ], + "center_px": [ + 282.5, + 1029.5 + ], + "quality": { + "area_px": 756.0, + "perimeter_px": 127.09539031982422, + "sharpness": { + "laplacian_var": 3214.1581853133407 + }, + "contrast": { + "p05": 21.0, + "p95": 190.0, + "dynamic_range": 169.0, + "mean_gray": 108.05490196078432, + "std_gray": 62.964111513749465 + }, + "geometry": { + "distance_to_center_norm": 0.7588452100753784, + "distance_to_border_px": 40.0 + }, + "edge_ratio": 1.492545620955363, + "edge_lengths_px": [ + 38.05259704589844, + 25.495098114013672, + 38.05259704589844, + 25.495098114013672 + ] + }, + "confidence": 0.2701424963760343 + }, + { + "observation_id": "22ea6df6-8a0f-4b7f-925a-f60703b72edf", + "type": "aruco", + "marker_id": 180, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1541.0, + 767.0 + ], + [ + 1524.0, + 783.0 + ], + [ + 1496.0, + 754.0 + ], + [ + 1514.0, + 740.0 + ] + ], + "center_px": [ + 1518.75, + 761.0 + ], + "quality": { + "area_px": 902.5, + "perimeter_px": 124.64379692077637, + "sharpness": { + "laplacian_var": 4231.579169578071 + }, + "contrast": { + "p05": 42.0, + "p95": 208.0, + "dynamic_range": 166.0, + "mean_gray": 114.71311475409836, + "std_gray": 64.24561980453453 + }, + "geometry": { + "distance_to_center_norm": 0.5455228686332703, + "distance_to_border_px": 297.0 + }, + "edge_ratio": 1.7677668534744286, + "edge_lengths_px": [ + 23.34523582458496, + 40.31128692626953, + 22.803508758544922, + 38.18376541137695 + ] + }, + "confidence": 0.3403540831666409 + }, + { + "observation_id": "12b3513b-125b-430f-8947-9b0b7cd419d4", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1003.0, + 817.0 + ], + [ + 1000.0, + 803.0 + ], + [ + 1041.0, + 795.0 + ], + [ + 1044.0, + 809.0 + ] + ], + "center_px": [ + 1022.0, + 806.0 + ], + "quality": { + "area_px": 598.0, + "perimeter_px": 112.18203735351562, + "sharpness": { + "laplacian_var": 2946.207120181406 + }, + "contrast": { + "p05": 16.0, + "p95": 180.0, + "dynamic_range": 164.0, + "mean_gray": 71.21190476190476, + "std_gray": 58.98829868784289 + }, + "geometry": { + "distance_to_center_norm": 0.24797232449054718, + "distance_to_border_px": 263.0 + }, + "edge_ratio": 2.9175665562136675, + "edge_lengths_px": [ + 14.317821502685547, + 41.773197174072266, + 14.317821502685547, + 41.773197174072266 + ] + }, + "confidence": 0.1366435551633292 + }, + { + "observation_id": "26bd3dd5-2640-4db6-bc0c-effe6708f4da", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1231.0, + 1015.0 + ], + [ + 1195.0, + 1013.0 + ], + [ + 1189.0, + 996.0 + ], + [ + 1225.0, + 997.0 + ] + ], + "center_px": [ + 1210.0, + 1005.25 + ], + "quality": { + "area_px": 621.0, + "perimeter_px": 109.0708179473877, + "sharpness": { + "laplacian_var": 2495.888498765432 + }, + "contrast": { + "p05": 23.0, + "p95": 178.0, + "dynamic_range": 155.0, + "mean_gray": 81.92666666666666, + "std_gray": 58.55756104514221 + }, + "geometry": { + "distance_to_center_norm": 0.4795157015323639, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 2.0, + "edge_lengths_px": [ + 36.055511474609375, + 18.027755737304688, + 36.013885498046875, + 18.973665237426758 + ] + }, + "confidence": 0.207 + }, + { + "observation_id": "6f6ef23f-097d-43c7-b94e-e88d64a8d220", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1368.0, + 1002.0 + ], + [ + 1332.0, + 1002.0 + ], + [ + 1323.0, + 985.0 + ], + [ + 1357.0, + 986.0 + ] + ], + "center_px": [ + 1345.0, + 993.75 + ], + "quality": { + "area_px": 572.5, + "perimeter_px": 108.66657447814941, + "sharpness": { + "laplacian_var": 2574.0928344671206 + }, + "contrast": { + "p05": 20.950000000000003, + "p95": 188.04999999999995, + "dynamic_range": 167.09999999999997, + "mean_gray": 99.97380952380952, + "std_gray": 62.888766350649426 + }, + "geometry": { + "distance_to_center_norm": 0.5402631759643555, + "distance_to_border_px": 78.0 + }, + "edge_ratio": 1.8715508888999286, + "edge_lengths_px": [ + 36.0, + 19.235383987426758, + 34.01470184326172, + 19.416488647460938 + ] + }, + "confidence": 0.20393069134818181 + }, + { + "observation_id": "fb43d2bf-7fae-4a4a-acc1-d4ae57ce2dce", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1072.0, + 990.0 + ], + [ + 1037.0, + 989.0 + ], + [ + 1034.0, + 972.0 + ], + [ + 1068.0, + 973.0 + ] + ], + "center_px": [ + 1052.75, + 981.0 + ], + "quality": { + "area_px": 583.0, + "perimeter_px": 103.75590896606445, + "sharpness": { + "laplacian_var": 3330.6451361694553 + }, + "contrast": { + "p05": 17.0, + "p95": 187.0, + "dynamic_range": 170.0, + "mean_gray": 97.36320754716981, + "std_gray": 63.82375618735225 + }, + "geometry": { + "distance_to_center_norm": 0.4091392755508423, + "distance_to_border_px": 90.0 + }, + "edge_ratio": 2.028322940299962, + "edge_lengths_px": [ + 35.0142822265625, + 17.262676239013672, + 34.01470184326172, + 17.464248657226562 + ] + }, + "confidence": 0.1916197164388369 + }, + { + "observation_id": "cb1a79ed-dd4c-4d5f-ac95-8aa59af1dd7d", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 437.0, + 939.0 + ], + [ + 404.0, + 938.0 + ], + [ + 415.0, + 923.0 + ], + [ + 448.0, + 924.0 + ] + ], + "center_px": [ + 426.0, + 931.0 + ], + "quality": { + "area_px": 506.0, + "perimeter_px": 103.23244857788086, + "sharpness": { + "laplacian_var": 2420.303758850716 + }, + "contrast": { + "p05": 16.0, + "p95": 189.0, + "dynamic_range": 173.0, + "mean_gray": 93.59779614325069, + "std_gray": 66.82849391127111 + }, + "geometry": { + "distance_to_center_norm": 0.6008819937705994, + "distance_to_border_px": 141.0 + }, + "edge_ratio": 1.7749052763952293, + "edge_lengths_px": [ + 33.0151481628418, + 18.601076126098633, + 33.0151481628418, + 18.601076126098633 + ] + }, + "confidence": 0.19005709083159952 + }, + { + "observation_id": "3be76a6c-3b9d-46e9-8908-6735fb212ade", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1248.0, + 972.0 + ], + [ + 1213.0, + 972.0 + ], + [ + 1207.0, + 956.0 + ], + [ + 1241.0, + 957.0 + ] + ], + "center_px": [ + 1227.25, + 964.25 + ], + "quality": { + "area_px": 531.5, + "perimeter_px": 102.65565490722656, + "sharpness": { + "laplacian_var": 2877.0814171478432 + }, + "contrast": { + "p05": 23.0, + "p95": 185.0, + "dynamic_range": 162.0, + "mean_gray": 82.2976501305483, + "std_gray": 58.43217191842817 + }, + "geometry": { + "distance_to_center_norm": 0.4552244544029236, + "distance_to_border_px": 108.0 + }, + "edge_ratio": 2.1144272329665768, + "edge_lengths_px": [ + 35.0, + 17.0880069732666, + 34.01470184326172, + 16.552946090698242 + ] + }, + "confidence": 0.1675788732801165 + }, + { + "observation_id": "01a27873-8777-44d0-8293-165fbd5507f4", + "type": "aruco", + "marker_id": 54, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1311.0, + 975.0 + ], + [ + 1277.0, + 974.0 + ], + [ + 1269.0, + 959.0 + ], + [ + 1301.0, + 959.0 + ] + ], + "center_px": [ + 1289.5, + 966.75 + ], + "quality": { + "area_px": 507.0, + "perimeter_px": 101.88266372680664, + "sharpness": { + "laplacian_var": 2039.4186315058569 + }, + "contrast": { + "p05": 21.150000000000002, + "p95": 169.84999999999997, + "dynamic_range": 148.69999999999996, + "mean_gray": 64.81593406593407, + "std_gray": 49.41750445040241 + }, + "geometry": { + "distance_to_center_norm": 0.48949214816093445, + "distance_to_border_px": 105.0 + }, + "edge_ratio": 2.0008648143095127, + "edge_lengths_px": [ + 34.01470184326172, + 17.0, + 32.0, + 18.867961883544922 + ] + }, + "confidence": 0.16892695477612363 + }, + { + "observation_id": "0fda3ae9-9f36-470f-bf1e-a1e9393eef89", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1102.0, + 952.0 + ], + [ + 1068.0, + 951.0 + ], + [ + 1066.0, + 936.0 + ], + [ + 1098.0, + 936.0 + ] + ], + "center_px": [ + 1083.5, + 943.75 + ], + "quality": { + "area_px": 510.0, + "perimeter_px": 97.6398696899414, + "sharpness": { + "laplacian_var": 2591.800277533584 + }, + "contrast": { + "p05": 19.5, + "p95": 189.0, + "dynamic_range": 169.5, + "mean_gray": 94.22102425876011, + "std_gray": 65.50899355986036 + }, + "geometry": { + "distance_to_center_norm": 0.38332611322402954, + "distance_to_border_px": 128.0 + }, + "edge_ratio": 2.247754797535694, + "edge_lengths_px": [ + 34.01470184326172, + 15.132745742797852, + 32.0, + 16.492422103881836 + ] + }, + "confidence": 0.1512620506350408 + }, + { + "observation_id": "64e6cbc2-11c5-40de-9405-9c48154e3926", + "type": "aruco", + "marker_id": 226, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 999.0, + 765.0 + ], + [ + 996.0, + 755.0 + ], + [ + 1033.0, + 751.0 + ], + [ + 1037.0, + 762.0 + ] + ], + "center_px": [ + 1016.25, + 758.25 + ], + "quality": { + "area_px": 406.0, + "perimeter_px": 97.47883033752441, + "sharpness": { + "laplacian_var": 3371.06957339954 + }, + "contrast": { + "p05": 15.0, + "p95": 194.2, + "dynamic_range": 179.2, + "mean_gray": 75.88215488215488, + "std_gray": 64.5980807644788 + }, + "geometry": { + "distance_to_center_norm": 0.20462247729301453, + "distance_to_border_px": 315.0 + }, + "edge_ratio": 3.6510648365304994, + "edge_lengths_px": [ + 10.440306663513184, + 37.2155876159668, + 11.704699516296387, + 38.11823654174805 + ] + }, + "confidence": 0.07413362369206056 + }, + { + "observation_id": "8faa7102-0dee-4e37-a7a5-a338b150f163", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 590.0, + 871.0 + ], + [ + 560.0, + 870.0 + ], + [ + 567.0, + 859.0 + ], + [ + 597.0, + 859.0 + ] + ], + "center_px": [ + 578.5, + 864.75 + ], + "quality": { + "area_px": 348.5, + "perimeter_px": 86.94751071929932, + "sharpness": { + "laplacian_var": 3819.7189442330537 + }, + "contrast": { + "p05": 12.0, + "p95": 188.0, + "dynamic_range": 176.0, + "mean_gray": 111.97925311203319, + "std_gray": 62.88416856970894 + }, + "geometry": { + "distance_to_center_norm": 0.4548569321632385, + "distance_to_border_px": 209.0 + }, + "edge_ratio": 2.3021729904815458, + "edge_lengths_px": [ + 30.01666259765625, + 13.03840446472168, + 30.0, + 13.892443656921387 + ] + }, + "confidence": 0.10091914651675944 + }, + { + "observation_id": "272bb878-c4c5-4c1f-993b-624a92de1385", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 615.0, + 830.0 + ], + [ + 587.0, + 830.0 + ], + [ + 593.0, + 820.0 + ], + [ + 621.0, + 820.0 + ] + ], + "center_px": [ + 604.0, + 825.0 + ], + "quality": { + "area_px": 280.0, + "perimeter_px": 79.32380676269531, + "sharpness": { + "laplacian_var": 2293.8666558801774 + }, + "contrast": { + "p05": 10.0, + "p95": 171.64999999999998, + "dynamic_range": 161.64999999999998, + "mean_gray": 74.02884615384616, + "std_gray": 51.15370065768782 + }, + "geometry": { + "distance_to_center_norm": 0.4140232503414154, + "distance_to_border_px": 250.0 + }, + "edge_ratio": 2.400980276065733, + "edge_lengths_px": [ + 28.0, + 11.661903381347656, + 28.0, + 11.661903381347656 + ] + }, + "confidence": 0.0777460225423177 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 273.0, + 343.0 + ], + [ + 284.0, + 514.0 + ], + [ + 201.0, + 514.0 + ], + [ + 186.0, + 354.0 + ] + ], + "center_px": [ + 236.0, + 431.25 + ], + "area_px": 14139.0 + }, + { + "image_points_px": [ + [ + 499.0, + 348.0 + ], + [ + 609.0, + 351.0 + ], + [ + 610.0, + 372.0 + ], + [ + 501.0, + 365.0 + ] + ], + "center_px": [ + 554.75, + 359.0 + ], + "area_px": 2073.0 + }, + { + "image_points_px": [ + [ + 852.0, + 867.0 + ], + [ + 757.0, + 888.0 + ], + [ + 747.0, + 872.0 + ], + [ + 831.0, + 847.0 + ] + ], + "center_px": [ + 796.75, + 868.5 + ], + "area_px": 1967.5 + }, + { + "image_points_px": [ + [ + 4.0, + 235.0 + ], + [ + 112.0, + 237.0 + ], + [ + 95.0, + 255.0 + ], + [ + 22.0, + 252.0 + ] + ], + "center_px": [ + 58.25, + 244.75 + ], + "area_px": 1582.5 + }, + { + "image_points_px": [ + [ + 163.0, + 164.0 + ], + [ + 184.0, + 166.0 + ], + [ + 188.0, + 250.0 + ], + [ + 167.0, + 247.0 + ] + ], + "center_px": [ + 175.5, + 206.75 + ], + "area_px": 1743.5 + }, + { + "image_points_px": [ + [ + 1647.0, + 667.0 + ], + [ + 1584.0, + 690.0 + ], + [ + 1557.0, + 684.0 + ], + [ + 1621.0, + 662.0 + ] + ], + "center_px": [ + 1602.25, + 675.75 + ], + "area_px": 945.5 + }, + { + "image_points_px": [ + [ + 33.0, + 190.0 + ], + [ + 78.0, + 190.0 + ], + [ + 80.0, + 214.0 + ], + [ + 35.0, + 214.0 + ] + ], + "center_px": [ + 56.5, + 202.0 + ], + "area_px": 1080.0 + }, + { + "image_points_px": [ + [ + 310.0, + 1042.0 + ], + [ + 326.0, + 1023.0 + ], + [ + 364.0, + 1024.0 + ], + [ + 348.0, + 1044.0 + ] + ], + "center_px": [ + 337.0, + 1033.25 + ], + "area_px": 765.0 + }, + { + "image_points_px": [ + [ + 1324.0, + 274.0 + ], + [ + 1339.0, + 297.0 + ], + [ + 1345.0, + 323.0 + ], + [ + 1327.0, + 316.0 + ] + ], + "center_px": [ + 1333.75, + 302.5 + ], + "area_px": 493.5 + }, + { + "image_points_px": [ + [ + 1127.0, + 799.0 + ], + [ + 1120.0, + 804.0 + ], + [ + 1086.0, + 807.0 + ], + [ + 1078.0, + 803.0 + ] + ], + "center_px": [ + 1102.75, + 803.25 + ], + "area_px": 188.5 + }, + { + "image_points_px": [ + [ + 1124.0, + 786.0 + ], + [ + 1119.0, + 791.0 + ], + [ + 1078.0, + 792.0 + ], + [ + 1081.0, + 787.0 + ] + ], + "center_px": [ + 1100.5, + 789.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 471.0, + 912.0 + ], + [ + 480.0, + 899.0 + ], + [ + 512.0, + 899.0 + ], + [ + 502.0, + 912.0 + ] + ], + "center_px": [ + 491.25, + 905.5 + ], + "area_px": 409.5 + }, + { + "image_points_px": [ + [ + 449.0, + 895.0 + ], + [ + 459.0, + 883.0 + ], + [ + 490.0, + 884.0 + ], + [ + 480.0, + 896.0 + ] + ], + "center_px": [ + 469.5, + 889.5 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 617.0, + 865.0 + ], + [ + 624.0, + 854.0 + ], + [ + 653.0, + 855.0 + ], + [ + 647.0, + 865.0 + ] + ], + "center_px": [ + 635.25, + 859.75 + ], + "area_px": 313.0 + }, + { + "image_points_px": [ + [ + 506.0, + 851.0 + ], + [ + 513.0, + 841.0 + ], + [ + 542.0, + 841.0 + ], + [ + 534.0, + 852.0 + ] + ], + "center_px": [ + 523.75, + 846.25 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 1225.0, + 851.0 + ], + [ + 1215.0, + 861.0 + ], + [ + 1207.0, + 863.0 + ], + [ + 1187.0, + 854.0 + ] + ], + "center_px": [ + 1208.5, + 857.25 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 840.0, + 769.0 + ], + [ + 871.0, + 770.0 + ], + [ + 870.0, + 779.0 + ], + [ + 839.0, + 779.0 + ] + ], + "center_px": [ + 855.0, + 774.25 + ], + "area_px": 295.0 + }, + { + "image_points_px": [ + [ + 632.0, + 210.0 + ], + [ + 636.0, + 227.0 + ], + [ + 634.0, + 249.0 + ], + [ + 629.0, + 216.0 + ] + ], + "center_px": [ + 632.75, + 225.5 + ], + "area_px": 125.5 + }, + { + "image_points_px": [ + [ + 608.0, + 847.0 + ], + [ + 614.0, + 837.0 + ], + [ + 642.0, + 837.0 + ], + [ + 636.0, + 847.0 + ] + ], + "center_px": [ + 625.0, + 842.0 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 1770.0, + 733.0 + ], + [ + 1796.0, + 735.0 + ], + [ + 1807.0, + 742.0 + ], + [ + 1782.0, + 740.0 + ] + ], + "center_px": [ + 1788.75, + 737.5 + ], + "area_px": 155.5 + }, + { + "image_points_px": [ + [ + 635.0, + 831.0 + ], + [ + 640.0, + 821.0 + ], + [ + 668.0, + 822.0 + ], + [ + 663.0, + 831.0 + ] + ], + "center_px": [ + 651.5, + 826.25 + ], + "area_px": 268.5 + }, + { + "image_points_px": [ + [ + 1784.0, + 726.0 + ], + [ + 1808.0, + 727.0 + ], + [ + 1821.0, + 734.0 + ], + [ + 1797.0, + 732.0 + ] + ], + "center_px": [ + 1802.5, + 729.75 + ], + "area_px": 136.5 + }, + { + "image_points_px": [ + [ + 468.0, + 826.0 + ], + [ + 478.0, + 817.0 + ], + [ + 503.0, + 818.0 + ], + [ + 496.0, + 826.0 + ] + ], + "center_px": [ + 486.25, + 821.75 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 1662.0, + 729.0 + ], + [ + 1687.0, + 731.0 + ], + [ + 1698.0, + 738.0 + ], + [ + 1674.0, + 737.0 + ] + ], + "center_px": [ + 1680.25, + 733.75 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 491.0, + 799.0 + ], + [ + 499.0, + 789.0 + ], + [ + 525.0, + 791.0 + ], + [ + 517.0, + 799.0 + ] + ], + "center_px": [ + 508.0, + 794.5 + ], + "area_px": 242.0 + }, + { + "image_points_px": [ + [ + 1121.0, + 812.0 + ], + [ + 1119.0, + 817.0 + ], + [ + 1087.0, + 818.0 + ], + [ + 1088.0, + 813.0 + ] + ], + "center_px": [ + 1103.75, + 815.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1731.0, + 724.0 + ], + [ + 1756.0, + 726.0 + ], + [ + 1767.0, + 732.0 + ], + [ + 1741.0, + 730.0 + ] + ], + "center_px": [ + 1748.75, + 728.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1746.0, + 718.0 + ], + [ + 1771.0, + 719.0 + ], + [ + 1782.0, + 725.0 + ], + [ + 1761.0, + 724.0 + ] + ], + "center_px": [ + 1765.0, + 721.5 + ], + "area_px": 125.0 + }, + { + "image_points_px": [ + [ + 1608.0, + 727.0 + ], + [ + 1630.0, + 728.0 + ], + [ + 1643.0, + 735.0 + ], + [ + 1619.0, + 734.0 + ] + ], + "center_px": [ + 1625.0, + 731.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1761.0, + 710.0 + ], + [ + 1784.0, + 712.0 + ], + [ + 1796.0, + 718.0 + ], + [ + 1770.0, + 716.0 + ] + ], + "center_px": [ + 1777.75, + 714.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1709.0, + 709.0 + ], + [ + 1734.0, + 711.0 + ], + [ + 1744.0, + 716.0 + ], + [ + 1721.0, + 715.0 + ] + ], + "center_px": [ + 1727.0, + 712.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 1625.0, + 720.0 + ], + [ + 1651.0, + 722.0 + ], + [ + 1659.0, + 728.0 + ], + [ + 1634.0, + 726.0 + ] + ], + "center_px": [ + 1642.25, + 724.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 1694.0, + 715.0 + ], + [ + 1719.0, + 717.0 + ], + [ + 1728.0, + 723.0 + ], + [ + 1707.0, + 722.0 + ] + ], + "center_px": [ + 1712.0, + 719.25 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 1724.0, + 703.0 + ], + [ + 1747.0, + 704.0 + ], + [ + 1758.0, + 710.0 + ], + [ + 1733.0, + 708.0 + ] + ], + "center_px": [ + 1740.5, + 706.25 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 1589.0, + 711.0 + ], + [ + 1614.0, + 713.0 + ], + [ + 1622.0, + 719.0 + ], + [ + 1598.0, + 718.0 + ] + ], + "center_px": [ + 1605.75, + 715.25 + ], + "area_px": 146.5 + }, + { + "image_points_px": [ + [ + 1658.0, + 707.0 + ], + [ + 1682.0, + 708.0 + ], + [ + 1691.0, + 715.0 + ], + [ + 1667.0, + 713.0 + ] + ], + "center_px": [ + 1674.5, + 710.75 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 1606.0, + 705.0 + ], + [ + 1631.0, + 706.0 + ], + [ + 1639.0, + 713.0 + ], + [ + 1618.0, + 711.0 + ] + ], + "center_px": [ + 1623.5, + 708.75 + ], + "area_px": 134.5 + }, + { + "image_points_px": [ + [ + 1642.0, + 713.0 + ], + [ + 1666.0, + 715.0 + ], + [ + 1675.0, + 721.0 + ], + [ + 1650.0, + 719.0 + ] + ], + "center_px": [ + 1658.25, + 717.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 505.0, + 768.0 + ], + [ + 512.0, + 760.0 + ], + [ + 536.0, + 761.0 + ], + [ + 530.0, + 769.0 + ] + ], + "center_px": [ + 520.75, + 764.5 + ], + "area_px": 202.5 + }, + { + "image_points_px": [ + [ + 1739.0, + 696.0 + ], + [ + 1762.0, + 698.0 + ], + [ + 1772.0, + 704.0 + ], + [ + 1748.0, + 702.0 + ] + ], + "center_px": [ + 1755.25, + 700.0 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 1673.0, + 701.0 + ], + [ + 1697.0, + 702.0 + ], + [ + 1706.0, + 708.0 + ], + [ + 1681.0, + 706.0 + ] + ], + "center_px": [ + 1689.25, + 704.25 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 1688.0, + 695.0 + ], + [ + 1713.0, + 697.0 + ], + [ + 1721.0, + 702.0 + ], + [ + 1697.0, + 700.0 + ] + ], + "center_px": [ + 1704.75, + 698.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 664.0, + 787.0 + ], + [ + 669.0, + 778.0 + ], + [ + 693.0, + 779.0 + ], + [ + 690.0, + 787.0 + ] + ], + "center_px": [ + 679.0, + 782.75 + ], + "area_px": 214.5 + }, + { + "image_points_px": [ + [ + 181.0, + 6.0 + ], + [ + 187.0, + 20.0 + ], + [ + 187.0, + 38.0 + ], + [ + 181.0, + 34.0 + ] + ], + "center_px": [ + 184.0, + 24.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1573.0, + 696.0 + ], + [ + 1597.0, + 699.0 + ], + [ + 1604.0, + 705.0 + ], + [ + 1580.0, + 703.0 + ] + ], + "center_px": [ + 1588.5, + 700.75 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 892.0, + 761.0 + ], + [ + 893.0, + 789.0 + ], + [ + 888.0, + 792.0 + ], + [ + 888.0, + 763.0 + ] + ], + "center_px": [ + 890.25, + 776.25 + ], + "area_px": 129.5 + }, + { + "image_points_px": [ + [ + 1654.0, + 687.0 + ], + [ + 1678.0, + 689.0 + ], + [ + 1686.0, + 694.0 + ], + [ + 1662.0, + 692.0 + ] + ], + "center_px": [ + 1670.0, + 690.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 1703.0, + 689.0 + ], + [ + 1726.0, + 691.0 + ], + [ + 1735.0, + 696.0 + ], + [ + 1712.0, + 694.0 + ] + ], + "center_px": [ + 1719.0, + 692.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 393.0, + 353.0 + ], + [ + 396.0, + 381.0 + ], + [ + 392.0, + 384.0 + ], + [ + 390.0, + 356.0 + ] + ], + "center_px": [ + 392.75, + 368.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 530.0, + 754.0 + ], + [ + 538.0, + 746.0 + ], + [ + 559.0, + 747.0 + ], + [ + 552.0, + 755.0 + ] + ], + "center_px": [ + 544.75, + 750.5 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 620.0, + 737.0 + ], + [ + 625.0, + 730.0 + ], + [ + 649.0, + 731.0 + ], + [ + 643.0, + 738.0 + ] + ], + "center_px": [ + 634.25, + 734.0 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 1454.0, + 798.0 + ], + [ + 1451.0, + 812.0 + ], + [ + 1444.0, + 820.0 + ], + [ + 1433.0, + 817.0 + ] + ], + "center_px": [ + 1445.5, + 811.75 + ], + "area_px": 173.0 + }, + { + "image_points_px": [ + [ + 1718.0, + 684.0 + ], + [ + 1736.0, + 684.0 + ], + [ + 1749.0, + 690.0 + ], + [ + 1725.0, + 688.0 + ] + ], + "center_px": [ + 1732.0, + 686.5 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 1557.0, + 683.0 + ], + [ + 1580.0, + 685.0 + ], + [ + 1587.0, + 690.0 + ], + [ + 1564.0, + 689.0 + ] + ], + "center_px": [ + 1572.0, + 686.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 1590.0, + 691.0 + ], + [ + 1613.0, + 693.0 + ], + [ + 1620.0, + 698.0 + ], + [ + 1596.0, + 696.0 + ] + ], + "center_px": [ + 1604.75, + 694.5 + ], + "area_px": 104.5 + }, + { + "image_points_px": [ + [ + 1621.0, + 680.0 + ], + [ + 1643.0, + 681.0 + ], + [ + 1651.0, + 687.0 + ], + [ + 1627.0, + 684.0 + ] + ], + "center_px": [ + 1635.5, + 683.0 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 1606.0, + 685.0 + ], + [ + 1629.0, + 687.0 + ], + [ + 1636.0, + 692.0 + ], + [ + 1616.0, + 691.0 + ] + ], + "center_px": [ + 1621.75, + 688.75 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 840.0, + 757.0 + ], + [ + 842.0, + 750.0 + ], + [ + 866.0, + 750.0 + ], + [ + 865.0, + 757.0 + ] + ], + "center_px": [ + 853.25, + 753.5 + ], + "area_px": 171.5 + }, + { + "image_points_px": [ + [ + 1670.0, + 681.0 + ], + [ + 1692.0, + 683.0 + ], + [ + 1700.0, + 688.0 + ], + [ + 1677.0, + 686.0 + ] + ], + "center_px": [ + 1684.75, + 684.5 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 681.0, + 746.0 + ], + [ + 684.0, + 739.0 + ], + [ + 708.0, + 739.0 + ], + [ + 704.0, + 746.0 + ] + ], + "center_px": [ + 694.25, + 742.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1637.0, + 674.0 + ], + [ + 1658.0, + 675.0 + ], + [ + 1666.0, + 681.0 + ], + [ + 1643.0, + 679.0 + ] + ], + "center_px": [ + 1651.0, + 677.25 + ], + "area_px": 110.5 + }, + { + "image_points_px": [ + [ + 1574.0, + 678.0 + ], + [ + 1595.0, + 679.0 + ], + [ + 1603.0, + 684.0 + ], + [ + 1580.0, + 683.0 + ] + ], + "center_px": [ + 1588.0, + 681.0 + ], + "area_px": 103.0 + }, + { + "image_points_px": [ + [ + 1619.0, + 662.0 + ], + [ + 1640.0, + 663.0 + ], + [ + 1648.0, + 668.0 + ], + [ + 1626.0, + 667.0 + ] + ], + "center_px": [ + 1633.25, + 665.0 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 1666.0, + 664.0 + ], + [ + 1687.0, + 665.0 + ], + [ + 1695.0, + 670.0 + ], + [ + 1672.0, + 668.0 + ] + ], + "center_px": [ + 1680.0, + 666.75 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 1272.0, + 862.0 + ], + [ + 1263.0, + 868.0 + ], + [ + 1245.0, + 872.0 + ], + [ + 1247.0, + 867.0 + ] + ], + "center_px": [ + 1256.75, + 867.25 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 1590.0, + 672.0 + ], + [ + 1611.0, + 674.0 + ], + [ + 1618.0, + 679.0 + ], + [ + 1595.0, + 677.0 + ] + ], + "center_px": [ + 1603.5, + 675.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 1605.0, + 667.0 + ], + [ + 1626.0, + 669.0 + ], + [ + 1633.0, + 673.0 + ], + [ + 1611.0, + 672.0 + ] + ], + "center_px": [ + 1618.75, + 670.25 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 565.0, + 221.0 + ], + [ + 567.0, + 249.0 + ], + [ + 564.0, + 248.0 + ], + [ + 563.0, + 225.0 + ] + ], + "center_px": [ + 564.75, + 235.75 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 1652.0, + 669.0 + ], + [ + 1674.0, + 671.0 + ], + [ + 1680.0, + 675.0 + ], + [ + 1661.0, + 674.0 + ] + ], + "center_px": [ + 1666.75, + 672.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 691.0, + 723.0 + ], + [ + 696.0, + 717.0 + ], + [ + 717.0, + 718.0 + ], + [ + 714.0, + 724.0 + ] + ], + "center_px": [ + 704.5, + 720.5 + ], + "area_px": 136.0 + } + ] +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam2_camera_pose.json b/test/y-axis-finder-examples/20260612_190241/cam2_camera_pose.json new file mode 100644 index 0000000..933a740 --- /dev/null +++ b/test/y-axis-finder-examples/20260612_190241/cam2_camera_pose.json @@ -0,0 +1,341 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-12T19:02:50Z", + "source": { + "detection_json": "/app/data/board/20260612_190241/cam2_aruco_detection.json", + "robot_json": "/app/scripts/robot_1781069752019.json" + }, + "camera": { + "camera_id": "cam2", + "camera_matrix": [ + [ + 1388.99072265625, + 0.0, + 933.082763671875 + ], + [ + 0.0, + 1394.8729248046875, + 562.4996948242188 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.019531700760126114, + -0.11213663965463638, + 0.0026758278254419565, + 0.0007694826927036047, + 0.05339815095067024 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 10, + "used_marker_ids": [ + 73, + 55, + 97, + 79, + 86, + 47, + 54, + 96, + 53, + 50 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.00675018017174477, + 0.00030810421229384566, + 0.00017395898347590652, + 0.00017395785079825019 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.34308905267501016, + "residual_median_px": 0.31405333670877, + "residual_max_px": 0.5198413955685609, + "sigma2_normalized": 4.3230476926941007e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.023455562070012093, + -0.9993643760681152, + 0.02684442512691021 + ], + [ + -0.17900516092777252, + -0.02221955731511116, + -0.9835972189903259 + ], + [ + 0.9835684895515442, + -0.027876116335392, + -0.17837022244930267 + ] + ], + "translation_m": [ + -0.06464977562427521, + 0.31084364652633667, + 0.6494230031967163 + ], + "rvec_rad": [ + 1.3471090656498854, + -1.3485228045912157, + 1.156313687922157 + ] + }, + "camera_in_world": { + "position_m": [ + -0.584625780582428, + -0.0395984873175621, + 0.42331814765930176 + ], + "position_mm": [ + -584.6257934570312, + -39.598487854003906, + 423.3181457519531 + ], + "orientation_deg": { + "roll": -171.11752319335938, + "pitch": -79.59905242919922, + "yaw": -97.46509552001953 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 3.8699833118803495e-07, + -2.0965459720288319e-07, + -4.4951122349821747e-07, + -8.844596585242352e-08, + 1.5602155308698614e-07, + 9.493094275809797e-09 + ], + [ + -2.0965459720287646e-07, + 6.16805924990911e-07, + -1.907025139597296e-07, + -1.8857877067802316e-07, + -1.7938071115301147e-07, + -8.085072055721061e-08 + ], + [ + -4.495112234982262e-07, + -1.9070251395971585e-07, + 1.348902402147079e-06, + 4.19469316243e-07, + -1.352287343678228e-07, + 7.892937004578717e-08 + ], + [ + -8.844596585242736e-08, + -1.8857877067801895e-07, + 4.1946931624300236e-07, + 1.6374022243246834e-07, + -1.9105468246810816e-10, + 3.8928276983301634e-08 + ], + [ + 1.5602155308698505e-07, + -1.7938071115301388e-07, + -1.3522873436781753e-07, + -1.910546824660751e-10, + 9.231713777059217e-08, + 3.159115056685431e-08 + ], + [ + 9.493094275808272e-09, + -8.085072055721008e-08, + 7.892937004578959e-08, + 3.892827698330227e-08, + 3.1591150566853695e-08, + 6.726641142991001e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.03564324029978236, + 0.04499838227408881, + 0.06654461188792467 + ], + "tvec_std_m": [ + 0.000404648270022829, + 0.00030383735413966497, + 0.0002593576901306572 + ] + }, + "camera_center_std_m": [ + 0.0004457946862661493, + 0.0011402536193186525, + 0.0007659183648344579 + ], + "camera_center_std_mm": [ + 0.44579468626614926, + 1.1402536193186525, + 0.7659183648344579 + ], + "orientation_std_deg": { + "roll": 0.32271501459803387, + "pitch": 0.0438516150160676, + "yaw": 0.2927085898600246 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 73, + "observed_center_px": [ + 282.5, + 1029.5 + ], + "projected_center_px": [ + 282.4800720214844, + 1029.4407958984375 + ], + "reprojection_error_px": 0.06246799156001437, + "confidence": 0.2701424963760343 + }, + { + "marker_id": 55, + "observed_center_px": [ + 1210.0, + 1005.25 + ], + "projected_center_px": [ + 1210.1278076171875, + 1005.594482421875 + ], + "reprojection_error_px": 0.3674274431666911, + "confidence": 0.207 + }, + { + "marker_id": 97, + "observed_center_px": [ + 1345.0, + 993.75 + ], + "projected_center_px": [ + 1345.4345703125, + 994.0352783203125 + ], + "reprojection_error_px": 0.5198413955685609, + "confidence": 0.20393069134818181 + }, + { + "marker_id": 79, + "observed_center_px": [ + 1052.75, + 981.0 + ], + "projected_center_px": [ + 1052.5294189453125, + 980.861083984375 + ], + "reprojection_error_px": 0.26067923025084894, + "confidence": 0.1916197164388369 + }, + { + "marker_id": 86, + "observed_center_px": [ + 426.0, + 931.0 + ], + "projected_center_px": [ + 426.3905334472656, + 930.916015625 + ], + "reprojection_error_px": 0.3994618238046201, + "confidence": 0.19005709083159952 + }, + { + "marker_id": 47, + "observed_center_px": [ + 1227.25, + 964.25 + ], + "projected_center_px": [ + 1227.119384765625, + 963.7993774414062 + ], + "reprojection_error_px": 0.46917057640522797, + "confidence": 0.1675788732801165 + }, + { + "marker_id": 54, + "observed_center_px": [ + 1289.5, + 966.75 + ], + "projected_center_px": [ + 1289.375, + 966.7219848632812 + ], + "reprojection_error_px": 0.12810092851096067, + "confidence": 0.16892695477612363 + }, + { + "marker_id": 96, + "observed_center_px": [ + 1083.5, + 943.75 + ], + "projected_center_px": [ + 1083.2991943359375, + 943.6123657226562 + ], + "reprojection_error_px": 0.2434463165043125, + "confidence": 0.1512620506350408 + }, + { + "marker_id": 53, + "observed_center_px": [ + 578.5, + 864.75 + ], + "projected_center_px": [ + 578.3684692382812, + 865.16064453125 + ], + "reprojection_error_px": 0.43119516732431823, + "confidence": 0.10091914651675944 + }, + { + "marker_id": 50, + "observed_center_px": [ + 604.0, + 825.0 + ], + "projected_center_px": [ + 603.8051147460938, + 824.8560180664062 + ], + "reprojection_error_px": 0.2423036512137169, + "confidence": 0.0777460225423177 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/test/y-axis-finder-examples/20260612_190241/cam2_debug.jpg b/test/y-axis-finder-examples/20260612_190241/cam2_debug.jpg new file mode 100644 index 0000000..dc32f94 Binary files /dev/null and b/test/y-axis-finder-examples/20260612_190241/cam2_debug.jpg differ diff --git a/test/yAxisRotation.test.js b/test/yAxisRotation.test.js new file mode 100644 index 0000000..ff6f12a --- /dev/null +++ b/test/yAxisRotation.test.js @@ -0,0 +1,170 @@ +/** + * Unit-Test für scripts/4_yAxis_rotation_reconstruction.py + * + * Das Python-Skript wird via child_process aufgerufen. + * stdout enthält das JSON-Ergebnis (letzte Zeile – davor ggf. Leerzeilen). + * stderr enthält menschenlesbare Zusammenfassung (wird ignoriert). + * + * Test-Daten: test/y-axis-finder-examples/ (drei Timestamps → Arm1-Bogen) + * + * Erwartete Werte stammen aus verifiziertem Lauf (2026-06-12): + * Marker 197, 218, 219 → rotieren (12 Punkte, 3 × 4 Ecken) + * Marker 201, 204 → gefiltert (Bewegung < 10 mm) + * axisDir ≈ [0.9995, 0.029, -0.015] (fast reine X-Achse des Roboters) + */ + +const { execFileSync } = require('child_process'); +const path = require('path'); + +const SCRIPT = path.join(__dirname, '..', 'scripts', '4_yAxis_rotation_reconstruction.py'); +const EXAMPLES = path.join(__dirname, 'y-axis-finder-examples'); +const POS_A = path.join(EXAMPLES, '20260612_190019'); +const POS_B = path.join(EXAMPLES, '20260612_190104'); +const POS_C = path.join(EXAMPLES, '20260612_190241'); + +// ── Hilfsfunktion ────────────────────────────────────────────────────────────── +const { spawnSync } = require('child_process'); + +/** + * Ruft das Python-Skript auf und gibt das geparste JSON zurück. + * Verwendet spawnSync (statt execFileSync) damit ein Fehler-Exit-Code (ok:false) + * nicht sofort eine Exception auslöst – wir parsen das stdout trotzdem. + * stdout kann mehrere Zeilen haben – JSON ist die letzte nicht-leere Zeile. + */ +function runScript(posA, posB, posC, extraArgs = []) { + const proc = spawnSync('python3', [SCRIPT, posA, posB, posC, ...extraArgs], { + encoding: 'utf-8', + // stderr läuft zum Terminal durch → menschenlesbarer Summary sichtbar + }); + if (proc.error) throw proc.error; // z. B. python3 nicht gefunden + + const stdout = proc.stdout || ''; + const lastJsonLine = stdout + .trim() + .split('\n') + .filter(l => l.trim().startsWith('{')) + .at(-1); + + if (!lastJsonLine) { + throw new Error( + `Kein JSON in stdout.\nstdout: ${stdout}\nstderr: ${proc.stderr}` + ); + } + return JSON.parse(lastJsonLine); +} + +// ── Haupt-Test-Suite ────────────────────────────────────────────────────────── +describe('4_yAxis_rotation_reconstruction.py – Arm1-Testdaten (190019 / 190104 / 190241)', () => { + + /** Einmalig ausführen – dauert ca. 1 s */ + let r; + beforeAll(() => { + r = runScript(POS_A, POS_B, POS_C); + }); + + // ── Grundstatus ─────────────────────────────────────────────────────────── + test('Berechnung erfolgreich (ok: true)', () => { + expect(r.ok).toBe(true); + }); + + // ── Marker-Anzahlen ─────────────────────────────────────────────────────── + test('5 gemeinsame fremd-Marker erkannt', () => { + expect(r.numMarkersCommon).toBe(5); + expect(r.commonMarkerIds).toEqual([197, 201, 204, 218, 219]); + }); + + test('3 Marker tatsächlich genutzt (197, 218, 219)', () => { + expect(r.numMarkersUsed).toBe(3); + expect(r.usedMarkerIds).toEqual([197, 218, 219]); + }); + + test('12 Punkte (3 Marker × 4 Ecken)', () => { + expect(r.numPoints).toBe(12); + }); + + // ── Filterung ───────────────────────────────────────────────────────────── + test('2 Marker wegen zu geringer Bewegung gefiltert (201, 204)', () => { + expect(r.skipped).toHaveLength(2); + + const skippedIds = r.skipped.map(s => s.marker_id).sort((a, b) => a - b); + expect(skippedIds).toEqual([201, 204]); + + // Beide mit korrektem Grund + r.skipped.forEach(s => { + expect(s.reason).toMatch(/Bewegung zu gering/); + expect(s.max_movement_mm).toBeLessThan(10.0); // unter dem Threshold + }); + }); + + // ── Residuen ────────────────────────────────────────────────────────────── + test('Abstandsresiduen: Mittelwert < 10 mm', () => { + expect(r.residual_dist_mean_mm).toBeLessThan(10); + }); + + test('Abstandsresiduen: Maximum < 15 mm', () => { + expect(r.residual_dist_max_mm).toBeLessThan(15); + }); + + test('Winkelresiduen: Mittelwert < 5°', () => { + expect(r.residual_angle_mean_deg).toBeLessThan(5); + }); + + test('Winkelresiduen: Maximum < 7°', () => { + expect(r.residual_angle_max_deg).toBeLessThan(7); + }); + + // ── Achsenrichtung ──────────────────────────────────────────────────────── + test('axisDir ist ein Einheitsvektor (|axisDir| ≈ 1)', () => { + const [ax, ay, az] = r.axisDir; + const len = Math.sqrt(ax * ax + ay * ay + az * az); + expect(len).toBeCloseTo(1.0, 4); // ≤ 0.00005 Abweichung + }); + + test('Achse liegt fast auf X-Achse des Roboters (axisDir[0] > 0.99)', () => { + // Physikalisch: Arm1 schwingt auf/ab → Drehachse = X-Richtung + expect(r.axisDir[0]).toBeGreaterThan(0.99); + }); + + test('axisDir hat 3 Komponenten', () => { + expect(r.axisDir).toHaveLength(3); + }); + + test('axisPoint_mm hat 3 Komponenten', () => { + expect(r.axisPoint_mm).toHaveLength(3); + }); + + // ── Marker-Ergebnis-Struktur ────────────────────────────────────────────── + test('markerResults enthält genau 3 Einträge (verwendete Marker)', () => { + expect(r.markerResults).toHaveLength(3); + }); + + test('jeder Marker-Eintrag hat n_points_used === 4', () => { + r.markerResults.forEach(mr => { + expect(mr.n_points_used).toBe(4); + expect(mr.circumcenter_mean_mm).toHaveLength(3); + }); + }); +}); + +// ── Parametertest: benutzerdefinierter min-movement-Threshold ───────────────── +describe('4_yAxis_rotation_reconstruction.py – min-movement-Parameter', () => { + + test('mit --min-movement 0 werden alle 5 Marker genutzt (kein Filter)', () => { + const r = runScript(POS_A, POS_B, POS_C, ['--min-movement', '0']); + // Alle 5 gemeinsamen Marker werden versucht; Ergebnis ist schlechter + expect(r.ok).toBe(true); + expect(r.numMarkersUsed).toBe(5); + expect(r.numMarkersCommon).toBe(5); + // skipped enthält nur noch ggf. degenerierte Punkte (keine Bewegungs-Skips) + const movementSkips = r.skipped.filter(s => s.reason && s.reason.includes('Bewegung zu gering')); + expect(movementSkips).toHaveLength(0); + }); + + test('mit --min-movement 1000 werden alle Marker gefiltert → ok: false', () => { + // Die rotierenden Marker (197, 218, 219) bewegen sich >100 mm, + // erst ab 1000 mm werden auch sie herausgefiltert. + const r = runScript(POS_A, POS_B, POS_C, ['--min-movement', '1000']); + expect(r.ok).toBe(false); + expect(r.error).toBeDefined(); + }); +});