arbeiten am callibration
@@ -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,
|
||||
}, '*');
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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}`));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -20,6 +20,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Aktionen ───────────────────────────────────────────────────────────── -->
|
||||
<div class="section full">
|
||||
<h2>Aktionen</h2>
|
||||
<div style="margin-top:14px;display:flex;align-items:center;gap:20px;flex-wrap:wrap">
|
||||
<button id="btn-arm1-ccw" style="font-size:18px;padding:6px 22px" title="Bieps rauf">
|
||||
⤴ Rauf
|
||||
</button>
|
||||
<span style="color:var(--muted);font-size:11px">Roboter-Bieps drehen (Schrittweite folgt)</span>
|
||||
<button id="btn-arm1-cw" style="font-size:18px;padding:6px 22px" title="Bieps runter">
|
||||
Runter ⤵
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section full">
|
||||
<h2>Ausgabe / Log</h2>
|
||||
<textarea id="log-arm1" readonly placeholder="(Ausgabe erscheint hier)"></textarea>
|
||||
|
||||
@@ -20,6 +20,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── Aktionen ───────────────────────────────────────────────────────────── -->
|
||||
<div class="section full">
|
||||
<h2>Aktionen</h2>
|
||||
<div style="margin-top:14px;display:flex;align-items:center;gap:20px;flex-wrap:wrap">
|
||||
<button id="btn-arm2-ccw" style="font-size:18px;padding:6px 22px" title="Unterarm rauf">
|
||||
⤴ Rauf
|
||||
</button>
|
||||
<span style="color:var(--muted);font-size:11px">Roboter-Unterarm drehen (Schrittweite folgt)</span>
|
||||
<button id="btn-arm2-cw" style="font-size:18px;padding:6px 22px" title="Unterarm runter">
|
||||
Runter ⤵
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section full">
|
||||
<h2>Ausgabe / Log</h2>
|
||||
<textarea id="log-arm2" readonly placeholder="(Ausgabe erscheint hier)"></textarea>
|
||||
|
||||
349
scripts/4_yAxis_rotation_reconstruction.py
Normal file
@@ -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 <posA> <posB> <posC> [Optionen]
|
||||
|
||||
<posA/B/C> 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()
|
||||
69
server/robotActions.js
Normal file
@@ -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 };
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190019/cam0.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190019/cam0_debug.jpg
Normal file
|
After Width: | Height: | Size: 201 KiB |
BIN
test/y-axis-finder-examples/20260612_190019/cam1.jpg
Normal file
|
After Width: | Height: | Size: 83 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190019/cam1_debug.jpg
Normal file
|
After Width: | Height: | Size: 195 KiB |
BIN
test/y-axis-finder-examples/20260612_190019/cam2.jpg
Normal file
|
After Width: | Height: | Size: 290 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190019/cam2_debug.jpg
Normal file
|
After Width: | Height: | Size: 432 KiB |
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190104/cam0.jpg
Normal file
|
After Width: | Height: | Size: 91 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190104/cam0_debug.jpg
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
test/y-axis-finder-examples/20260612_190104/cam1.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190104/cam1_debug.jpg
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
test/y-axis-finder-examples/20260612_190104/cam2.jpg
Normal file
|
After Width: | Height: | Size: 289 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190104/cam2_debug.jpg
Normal file
|
After Width: | Height: | Size: 436 KiB |
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190241/cam0.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190241/cam0_debug.jpg
Normal file
|
After Width: | Height: | Size: 210 KiB |
BIN
test/y-axis-finder-examples/20260612_190241/cam1.jpg
Normal file
|
After Width: | Height: | Size: 72 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190241/cam1_debug.jpg
Normal file
|
After Width: | Height: | Size: 210 KiB |
BIN
test/y-axis-finder-examples/20260612_190241/cam2.jpg
Normal file
|
After Width: | Height: | Size: 287 KiB |
@@ -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": []
|
||||
}
|
||||
}
|
||||
BIN
test/y-axis-finder-examples/20260612_190241/cam2_debug.jpg
Normal file
|
After Width: | Height: | Size: 427 KiB |
170
test/yAxisRotation.test.js
Normal file
@@ -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();
|
||||
});
|
||||
});
|
||||