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();
+ });
+});