diff --git a/public/calculateAngles.cjs b/public/calculateAngles.cjs index 75dd0ed..e510db9 100644 --- a/public/calculateAngles.cjs +++ b/public/calculateAngles.cjs @@ -1,3 +1,3 @@ -const { calculate } = require('./calculateAngles.js'); -module.exports = { calculate }; +const { calculate, optimizeRobot } = require('./calculateAngles.js'); +module.exports = { calculate, optimizeRobot }; diff --git a/public/calculateAngles.js b/public/calculateAngles.js index 1f92de1..a981188 100644 --- a/public/calculateAngles.js +++ b/public/calculateAngles.js @@ -4,24 +4,127 @@ * Browser + Server + Jest (CJS) kompatibel */ +function calculateXPos(listIdAndX, jsonRobot){ + const partsMovingFixedX = new Set(['Base', 'Arm1', 'Joint1']); + const markersMovingFixedX = jsonRobot.Marker.filter(m => partsMovingFixedX.has(m.on)); + // Join: Robot-Marker ↔ Found-Marker + + const markersListeWithRobotInfo = jsonRobot.Marker + .filter(m => partsMovingFixedX.has(m.on)) // nur relevante Teile + .map(m => { + const found = listIdAndX.get(m.id); + if (!found) return null; + + return { + id: m.id, + relPos: m.relPos, // oder m.relPos, je nach Struktur + position: found, + Px: found[0] - m.relPos[0] + }; + }) + .filter(Boolean); // nulls entfernen + + const pxValues = markersListeWithRobotInfo.map(m => m.Px); + const meanPx = pxValues.reduce((sum, x) => sum + x, 0) / pxValues.length; + + const variancePx = pxValues.reduce((sum, x) => sum + Math.pow(x - meanPx, 2), 0) / pxValues.length; + const stdDevPx = Math.sqrt(variancePx); + + return { meanPx, stdDevPx }; +} + + +function optimizeRobot(listFoundMarkers, jsonRobot) { + + const map = new Map(); + + for (const foundMarkers of listFoundMarkers) { + var x_222_226 = null; + var x_222_226_count = 0; + + for (const mark of foundMarkers.markers.filter(m => m.id === 226).map(f => [f.id, f.position_mm])) { + x_222_226 = mark[1][0]; + x_222_226_count++; + } + if (x_222_226_count > 0) { + x_222_226 = x_222_226 / x_222_226_count; + } + else{ + continue; // Wenn weder 222 noch 226 gefunden wurden, überspringen + } + + for (const mark of foundMarkers.markers.map(f => [f.id, f.position_mm ])){ + const id = mark[0]; + const dx_222_226 = mark[1][0] - x_222_226; + if (!map.has(id)) { + map.set(id, []); // Initialisiere mit x_222_226, damit wir später die Abweichung berechnen können + } + map.get(id).push(dx_222_226); + } + } + + const result = Array.from(map, ([id, mm]) => ({ id, mm })).filter(m => [198,200,204,229,243].includes(m.id)); + + + const withStats = result.map(entry => { + const { mm } = entry; + const n = mm.length; + + if (n === 0) { + return { + ...entry, + n: 0, + average: null, + deviation: null + }; + } + + const average = mm.reduce((a, b) => a + b, 0) / n; + + const deviation = Math.sqrt( + mm.reduce((sum, x) => sum + Math.pow(x - average, 2), 0) / n + ); + + return { + ...entry, + n, + average, + deviation + }; + }); + + return withStats; +} +function calculateRotAngle(listIdAndX, jsonRobot, jointName){ + // Achse finden + const jointInfo = jsonRobot.Joints[jointName]; + if(!jointInfo){return null, null; } + if(jointInfo.type !== 'revolute'){ return null, null; } + if(!(jointInfo.origin)){ return null, null; } + if(!(jointInfo.axis)){ return null, null; } + if(!(jointInfo.child)){ return null, null; } + + markerUsed = jsonRobot.Marker.filter(m => m.on === jointInfo.child) + if(markerUsed.length === 0){ return null, null; } + + var markerFound = [] + for (const m of markerUsed){ + markerFound.push(listIdAndX.get(m.id)); + } + + + var angle = 0; + var varAngle = 0; + + return angle, varAngle; +} + function calculate(foundMarkers, jsonRobot) { - // --- X of the Hand-Joint --- - const validOns = new Set(['Base', 'Arm1', 'Joint1']); - const foundById = new Map(foundMarkers.map(f => [f.id, f])); - const markersMovingFixedX = jsonRobot.Marker.filter(m => validOns.has(m.on)); - const markersXPosition = new Map(); + const foundById = new Map(foundMarkers.markers.map(f => [f.id, f.position_mm ])); + const { meanPx: x, stdDevPx: varx } = calculateXPos(foundById, jsonRobot); - const xs = markersMovingFixedX - .map(m => { - const f = foundById.get(m.id); - return f ? f.position[0] - m.relPos[0] : null; - }) - .filter(x => x !== null); - - const xAvg = xs.length - ? xs.reduce((a, b) => a + b, 0) / xs.length - : 0; + const { meanY: y, stdDevY: vary } = calculateRotAngle(foundById, jsonRobot, "jointB"); return { meta: { @@ -34,10 +137,11 @@ function calculate(foundMarkers, jsonRobot) { }, status: 'ok', result: { - xAvg + x: x, + varx: varx } }; } -module.exports = { calculate }; \ No newline at end of file +module.exports = { calculate, optimizeRobot }; \ No newline at end of file diff --git a/public/robot.json b/public/robot.json index dae1a73..5285df2 100644 --- a/public/robot.json +++ b/public/robot.json @@ -2,7 +2,7 @@ "Elements":["Board","Base","Arm1","Joint1","Arm2","Finger1","Finger2"], "Joints":{ "jointA":{"name":"Slider", "type":"lninear", "axis":[1,0,0],"parent":"Board","child":"Base"}, - "jointB":{"name":"Shoulder","type":"revolute","axis":[1,0,0],"parent":"Base","child":"Arm1","origin":[-89.5, 115, 61]}, + "jointB":{"name":"Shoulder","type":"revolute","axis":[1,0,0],"parent":"Base","child":"Arm1","origin":[-89.5, 115, 53], "originSource":[null, "229_198_Foto_5_2026", "229_198_Foto_5_2026"]}, "jointC":{"name":"EllbowLift","type":"revolute","axis":[1,0,0],"parent":"Arm1","child":"Joint1"}, "jointD":{"name":"EllbowTwist","type":"revolute","axis":[0,1,0],"parent":"Joint1","child":"Arm2"} }, @@ -15,13 +15,14 @@ {"id":214,"on":"Board","position":[0.40, 0.0, 0.0]}, {"id":215,"on":"Board","position":[0.20, -0.090, 0.0]}, - {"id":200,"on":"Base","relPos":[-166, 6.5, 55]}, - {"id":201,"on":"Base","relPos":[-190, 97.5, 74.5]}, + {"id":200,"on":"Base","relPos":[-163.8, 6.5, 55], "relPosSource":["226_FotoAverage_5_2026",null,null]}, + {"id":201,"on":"Base","relPos":[-164.8, 97.5, 74.5], "relPosSource":["226_FotoAverage_5_2026",null,null]}, {"id":204,"on":"Base","relPos":[-158.5,152.5,111]}, - {"id":198,"on":"Arm1", "relPos":[-89.5,-160, 35]}, - {"id":229,"on":"Arm1", "relPos":[-89.5,-250, 35]}, - {"id":243,"on":"Arm1", "relPos":[-89.5,-285, 0]}, + {"id":198,"on":"Arm1", "relPos":[-93.4,-160, 35], "relPosSource":["226_FotoAverage_5_2026",null,null]}, + {"id":229,"on":"Arm1", "relPos":[-90.6,-250, 35], "relPosSource":["226_FotoAverage_5_2026",null,null]}, + {"id":242,"on":"Arm1", "relPos":[-89.5,-250,-35]}, + {"id":243,"on":"Arm1", "relPos":[-89.5,-285, 0]}, {"id":222,"on":"Joint1", "relPos":[0,0, -35]}, {"id":226,"on":"Joint1", "relPos":[0,0, 35]}, diff --git a/test/calculateAngles.test.js b/test/calculateAngles.test.js index 9109fd3..3b1218b 100644 --- a/test/calculateAngles.test.js +++ b/test/calculateAngles.test.js @@ -2,38 +2,7 @@ const fs = require('fs'); const path = require('path'); const { calculate } = require('../public/calculateAngles.cjs'); -/* ------------------------- - Hilfsfunktionen -------------------------- */ -function loadMarkersFromCSV(filePath) { - const text = fs.readFileSync(filePath, 'utf8'); - - const [header, ...lines] = text - .split('\n') - .map(l => l.trim()) - .filter(Boolean); - - return lines.map(line => { - const [ - id, - x, y, z, - roll, pitch, yaw, - seen_by - ] = line.split(','); - - return { - id: Number(id), - position: [Number(x), Number(y), Number(z)], - rotation: [Number(roll), Number(pitch), Number(yaw)], - seen_by: Number(seen_by) - }; - }); -} - -function loadJSON(filePath) { - return JSON.parse(fs.readFileSync(filePath, 'utf8')); -} /* ------------------------- Tests @@ -41,11 +10,28 @@ function loadJSON(filePath) { describe('calculateAngles.calculate', () => { test('berechnet X-Durchschnitt für Base / Arm1 / Joint1', async () => { - const markersPath = path.resolve('./test/snapshots/snapshot_video0_1774805028717_two_cam.csv'); + //const markersPath = path.resolve('./test/snapshots/snapshot_video0_1774805028717_two_cam.json'); + const markersPath = path.resolve('./test/snapshots/snapshot_video0_1775406055428_two_cam.json'); const robotPath = path.resolve('./public/robot.json'); - const foundMarkers = loadMarkersFromCSV(markersPath); - const jsonRobot = loadJSON(robotPath); + const foundMarkers = JSON.parse(fs.readFileSync(markersPath, 'utf8')); + const jsonRobot = JSON.parse(fs.readFileSync(robotPath, 'utf8')); + + const result = await calculate(foundMarkers, jsonRobot); + + expect(result.status).toBe('ok'); + expect(result.result).toBeDefined(); + }); +}); + + +describe('calculateAngles.y', () => { + test('berechnet y-Durchschnitt für Base / Arm1 / Joint1', async () => { + const markersPath = path.resolve('./test/snapshots/snapshot_video0_1778407171886_two_cam.json'); + const robotPath = path.resolve('./public/robot.json'); + + const foundMarkers = JSON.parse(fs.readFileSync(markersPath, 'utf8')); + const jsonRobot = JSON.parse(fs.readFileSync(robotPath, 'utf8')); const result = await calculate(foundMarkers, jsonRobot); diff --git a/test/optimizeRobot.test.js b/test/optimizeRobot.test.js new file mode 100644 index 0000000..5ea210a --- /dev/null +++ b/test/optimizeRobot.test.js @@ -0,0 +1,34 @@ +const fs = require('fs'); +const path = require('path'); +const { calculate, optimizeRobot } = require('../public/calculateAngles.cjs'); + + + +/* ------------------------- + Tests +------------------------- */ + +describe('optimizeRobot.', () => { + test('berechnet X-Durchschnitt für Base / Arm1 / Joint1', async () => { + //const markersPath1 = path.resolve('./test/snapshots/snapshot_video0_1777958128576_two_cam.json'); + const markersPath1 = path.resolve('./test/snapshots/snapshot_video0_1778406635059_two_cam.json'); + //const markersPath2 = path.resolve('./test/snapshots/snapshot_video0_1777957783463_two_cam.json'); + const markersPath2 = path.resolve('./test/snapshots/snapshot_video0_1778406621349_two_cam.json'); + const markersPath3 = path.resolve('./test/snapshots/snapshot_video0_1778407153025_two_cam.json'); + const markersPath4 = path.resolve('./test/snapshots/snapshot_video0_1778407171886_two_cam.json'); + const robotPath = path.resolve('./public/robot.json'); + + const foundMarkers1 = JSON.parse(fs.readFileSync(markersPath1, 'utf8')); + const foundMarkers2 = JSON.parse(fs.readFileSync(markersPath2, 'utf8')); + const foundMarkers3 = JSON.parse(fs.readFileSync(markersPath3, 'utf8')); + const foundMarkers4 = JSON.parse(fs.readFileSync(markersPath4, 'utf8')); + + const list=[foundMarkers1, foundMarkers2, foundMarkers3, foundMarkers4]; + const jsonRobot = JSON.parse(fs.readFileSync(robotPath, 'utf8')); + + const result = await optimizeRobot(list, jsonRobot); + + //expect(result.status).toBe('ok'); + //expect(result.result).toBeDefined(); + }); +}); diff --git a/test/snapshots/snapshot_video0_1777957783463.jpg b/test/snapshots/snapshot_video0_1777957783463.jpg new file mode 100644 index 0000000..703b69c Binary files /dev/null and b/test/snapshots/snapshot_video0_1777957783463.jpg differ diff --git a/test/snapshots/snapshot_video0_1777957783463_two_cam.csv b/test/snapshots/snapshot_video0_1777957783463_two_cam.csv new file mode 100644 index 0000000..0fe18a2 --- /dev/null +++ b/test/snapshots/snapshot_video0_1777957783463_two_cam.csv @@ -0,0 +1,21 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,52.51,-848.87,600.02,-121.404,-2.306,-21.261 +camera 1,353.00,-480.56,1185.56,-166.739,1.583,0.395 +0,396.47,-42.96,-40.41,-0.938,-1.625,-1.286,1 +178,434.70,-346.30,161.82,14.660,-9.061,127.657,3 +179,410.47,-291.22,139.29,-4.164,55.412,-152.725,1 +187,397.52,-341.22,141.15,-27.505,19.727,93.759,3 +200,257.99,-24.24,118.95,-0.938,-0.465,2.088,3 +204,258.36,127.36,126.23,131.455,-8.390,-19.321,3 +205,805.33,-88.85,-1.77,-1.373,-0.755,-1.917,3 +208,498.96,-80.59,-31.57,-3.711,0.412,1.079,2 +210,-4.17,2.35,-2.53,-3.329,2.596,-0.816,3 +211,200.91,-0.39,0.35,112.239,-7.122,-11.633,3 +214,431.62,65.62,-47.50,114.928,-19.137,-29.993,1 +215,199.30,-89.61,-0.57,-2.325,-0.729,-2.726,3 +217,615.09,30.80,-73.14,-0.531,0.733,-1.364,2 +226,420.76,-77.03,270.10,26.782,2.029,-0.030,3 +228,400.09,-176.95,215.07,27.186,-28.754,-17.246,3 +229,333.70,-35.80,258.29,-46.300,1.911,1.507,2 +242,343.11,-34.31,190.43,135.274,0.085,-2.030,1 +243,329.38,-87.08,265.66,42.490,1.111,-1.823,3 diff --git a/test/snapshots/snapshot_video0_1777957783463_two_cam.json b/test/snapshots/snapshot_video0_1777957783463_two_cam.json new file mode 100644 index 0000000..94efe6a --- /dev/null +++ b/test/snapshots/snapshot_video0_1777957783463_two_cam.json @@ -0,0 +1,280 @@ +{ + "metadata": { + "timestamp": "2026-05-05 05:09:43", + "reference_markers": [ + 210, + 211, + 215, + 205 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 4.671353744091205, + "rms_refs_px_cam2": 3.1040055485065166, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 52.50705149143897, + -848.8746743773831, + 600.0158350840767 + ], + "orientation_deg": { + "roll": -121.40391168229475, + "pitch": -2.306436189824197, + "yaw": -21.260996144039062 + } + }, + { + "id": "camera2", + "position_mm": [ + 352.9965583411941, + -480.5647619160942, + 1185.560920507425 + ], + "orientation_deg": { + "roll": -166.73896963486465, + "pitch": 1.5832050600381053, + "yaw": 0.39465785124673575 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + 396.4664087076043, + -42.96067455601671, + -40.40681141345037 + ], + "orientation_deg": { + "roll": -0.9375313569440544, + "pitch": -1.6254708655757175, + "yaw": -1.2864045600920857 + } + }, + { + "id": 178, + "position_mm": [ + 434.701416015625, + -346.30255126953125, + 161.82244873046875 + ], + "orientation_deg": { + "roll": 14.660044975945809, + "pitch": -9.060615532311536, + "yaw": 127.65722760442327 + } + }, + { + "id": 179, + "position_mm": [ + 410.4690229459951, + -291.2238586627398, + 139.29182445163846 + ], + "orientation_deg": { + "roll": -4.164149490729818, + "pitch": 55.41156542149833, + "yaw": -152.7245941169703 + } + }, + { + "id": 187, + "position_mm": [ + 397.520263671875, + -341.2248229980469, + 141.1533203125 + ], + "orientation_deg": { + "roll": -27.504707713464253, + "pitch": 19.727305083968414, + "yaw": 93.7587269029218 + } + }, + { + "id": 200, + "position_mm": [ + 257.988037109375, + -24.238113403320312, + 118.95182037353516 + ], + "orientation_deg": { + "roll": -0.9378750676447358, + "pitch": -0.46498037079853055, + "yaw": 2.088489211025033 + } + }, + { + "id": 204, + "position_mm": [ + 258.36309814453125, + 127.355712890625, + 126.2347412109375 + ], + "orientation_deg": { + "roll": 131.45520428430584, + "pitch": -8.390047805254406, + "yaw": -19.32140480702805 + } + }, + { + "id": 205, + "position_mm": [ + 805.3345336914062, + -88.8466796875, + -1.772031307220459 + ], + "orientation_deg": { + "roll": -1.3732577845338951, + "pitch": -0.755221584659945, + "yaw": -1.9174437143486767 + } + }, + { + "id": 208, + "position_mm": [ + 498.96205325263963, + -80.58717235952845, + -31.572839312099976 + ], + "orientation_deg": { + "roll": -3.710891042088827, + "pitch": 0.41201015735627716, + "yaw": 1.0794999035785666 + } + }, + { + "id": 210, + "position_mm": [ + -4.165961742401123, + 2.3509929180145264, + -2.526089668273926 + ], + "orientation_deg": { + "roll": -3.328954072289312, + "pitch": 2.5958542701376963, + "yaw": -0.8159059084027147 + } + }, + { + "id": 211, + "position_mm": [ + 200.90512084960938, + -0.38677510619163513, + 0.34789878129959106 + ], + "orientation_deg": { + "roll": 112.23902036479667, + "pitch": -7.122227983034214, + "yaw": -11.633422115111248 + } + }, + { + "id": 214, + "position_mm": [ + 431.6227926849502, + 65.62094846958766, + -47.50279224705922 + ], + "orientation_deg": { + "roll": 114.92780566359703, + "pitch": -19.136547203279413, + "yaw": -29.993356126435852 + } + }, + { + "id": 215, + "position_mm": [ + 199.30484008789062, + -89.61498260498047, + -0.5710603594779968 + ], + "orientation_deg": { + "roll": -2.325372314878339, + "pitch": -0.7287700728739313, + "yaw": -2.7262640326032175 + } + }, + { + "id": 217, + "position_mm": [ + 615.0909335800857, + 30.80487435405388, + -73.13761132332198 + ], + "orientation_deg": { + "roll": -0.5312076724112325, + "pitch": 0.733422156922922, + "yaw": -1.3642012070521408 + } + }, + { + "id": 226, + "position_mm": [ + 420.7601623535156, + -77.025390625, + 270.102783203125 + ], + "orientation_deg": { + "roll": 26.781667281645746, + "pitch": 2.0289279897051853, + "yaw": -0.029585611475562927 + } + }, + { + "id": 228, + "position_mm": [ + 400.0892639160156, + -176.95059204101562, + 215.06854248046875 + ], + "orientation_deg": { + "roll": 27.18577804896399, + "pitch": -28.75366590348638, + "yaw": -17.246112881667592 + } + }, + { + "id": 229, + "position_mm": [ + 333.7011791401545, + -35.8008587982585, + 258.2860495531072 + ], + "orientation_deg": { + "roll": -46.30034850320603, + "pitch": 1.9106830493551008, + "yaw": 1.5074126579645082 + } + }, + { + "id": 242, + "position_mm": [ + 343.10525826663707, + -34.30694513106547, + 190.4347424613153 + ], + "orientation_deg": { + "roll": 135.27419902188078, + "pitch": 0.08530734885954665, + "yaw": -2.0299609451153673 + } + }, + { + "id": 243, + "position_mm": [ + 329.3802795410156, + -87.07755279541016, + 265.6557312011719 + ], + "orientation_deg": { + "roll": 42.49029610133165, + "pitch": 1.1112401667954726, + "yaw": -1.8231069586598487 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1777957783463_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1777957783463_two_cam_annotated.jpg new file mode 100644 index 0000000..9152226 Binary files /dev/null and b/test/snapshots/snapshot_video0_1777957783463_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1777957783463_two_cam_overlay.png b/test/snapshots/snapshot_video0_1777957783463_two_cam_overlay.png new file mode 100644 index 0000000..06b8479 Binary files /dev/null and b/test/snapshots/snapshot_video0_1777957783463_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1777958128576_two_cam.csv b/test/snapshots/snapshot_video0_1777958128576_two_cam.csv new file mode 100644 index 0000000..ed89a5c --- /dev/null +++ b/test/snapshots/snapshot_video0_1777958128576_two_cam.csv @@ -0,0 +1,21 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,256.17,-822.43,643.20,-123.532,-0.788,-9.098 +camera 1,629.68,-270.32,1205.64,-171.411,10.923,11.668 +0,385.87,-56.31,-33.55,100.596,-9.989,-12.304,1 +178,494.28,-336.90,276.53,16.619,-4.277,132.262,3 +179,425.50,-337.67,297.09,-14.032,53.897,-146.912,1 +187,456.07,-335.85,259.58,-115.447,-36.884,-147.096,3 +200,268.20,-14.01,117.32,-3.139,0.850,3.172,1 +204,272.97,143.23,115.44,-2.727,3.637,0.923,3 +205,804.71,-90.62,-1.30,-1.466,1.393,-0.486,3 +207,799.64,-5.60,0.22,-2.190,2.670,2.302,3 +208,499.89,-82.94,-54.66,29.194,-1.655,0.389,2 +210,-31.34,6.71,-22.45,36.767,44.126,13.395,2 +211,199.74,0.05,-0.18,107.619,3.693,4.245,3 +214,409.79,26.15,-22.96,-3.559,0.080,-0.908,1 +215,199.60,-89.94,-0.50,-2.825,0.115,0.368,3 +217,604.05,19.26,-100.39,-10.000,4.687,0.680,2 +226,461.88,-22.14,258.77,137.748,-9.547,-25.264,3 +228,471.30,-140.24,256.77,-9.794,-8.559,3.734,2 +229,383.65,-6.45,251.30,-52.687,10.507,3.203,2 +243,366.01,-50.21,251.71,41.338,1.927,-0.577,3 diff --git a/test/snapshots/snapshot_video0_1777958128576_two_cam.json b/test/snapshots/snapshot_video0_1777958128576_two_cam.json new file mode 100644 index 0000000..34b5a8e --- /dev/null +++ b/test/snapshots/snapshot_video0_1777958128576_two_cam.json @@ -0,0 +1,279 @@ +{ + "metadata": { + "timestamp": "2026-05-05 05:15:28", + "reference_markers": [ + 211, + 215, + 205 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 4.6375655603331385, + "rms_refs_px_cam2": 2.7443840845140404, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 256.1736410256437, + -822.4276726253502, + 643.2026671719713 + ], + "orientation_deg": { + "roll": -123.5316900379821, + "pitch": -0.7884129637642172, + "yaw": -9.097970726569594 + } + }, + { + "id": "camera2", + "position_mm": [ + 629.6754325211745, + -270.3191926197733, + 1205.6426460653051 + ], + "orientation_deg": { + "roll": -171.41083174640656, + "pitch": 10.922928735643563, + "yaw": 11.668247833176194 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + 385.87069622396274, + -56.31153562235403, + -33.54904549877591 + ], + "orientation_deg": { + "roll": 100.59635796327298, + "pitch": -9.988991138734189, + "yaw": -12.304433726646625 + } + }, + { + "id": 178, + "position_mm": [ + 494.27813720703125, + -336.8986511230469, + 276.5267333984375 + ], + "orientation_deg": { + "roll": 16.61888387917759, + "pitch": -4.276930983519099, + "yaw": 132.26226500097638 + } + }, + { + "id": 179, + "position_mm": [ + 425.50282620904954, + -337.66631245337317, + 297.0947712329073 + ], + "orientation_deg": { + "roll": -14.03207370980746, + "pitch": 53.897382259538816, + "yaw": -146.91173919479965 + } + }, + { + "id": 187, + "position_mm": [ + 456.0668029785156, + -335.8484191894531, + 259.5787658691406 + ], + "orientation_deg": { + "roll": -115.44727568007977, + "pitch": -36.88432807413855, + "yaw": -147.09594966123984 + } + }, + { + "id": 200, + "position_mm": [ + 268.19624900285766, + -14.007162810458107, + 117.31979998476683 + ], + "orientation_deg": { + "roll": -3.1391365497288004, + "pitch": 0.849526608275676, + "yaw": 3.1721064317497194 + } + }, + { + "id": 204, + "position_mm": [ + 272.970458984375, + 143.23162841796875, + 115.44142150878906 + ], + "orientation_deg": { + "roll": -2.726554071240893, + "pitch": 3.6374217353973566, + "yaw": 0.9234750688709343 + } + }, + { + "id": 205, + "position_mm": [ + 804.7095336914062, + -90.62186431884766, + -1.299379825592041 + ], + "orientation_deg": { + "roll": -1.4658959348870262, + "pitch": 1.3933641879342518, + "yaw": -0.4862554682096239 + } + }, + { + "id": 207, + "position_mm": [ + 799.6442260742188, + -5.6020660400390625, + 0.22404810786247253 + ], + "orientation_deg": { + "roll": -2.189789906214652, + "pitch": 2.67045298129937, + "yaw": 2.302090287657334 + } + }, + { + "id": 208, + "position_mm": [ + 499.8863711359788, + -82.9365943571326, + -54.661945244869784 + ], + "orientation_deg": { + "roll": 29.194092496312926, + "pitch": -1.6546496155382426, + "yaw": 0.38917806200082566 + } + }, + { + "id": 210, + "position_mm": [ + -31.340368831395793, + 6.7093997800957155, + -22.44573483244117 + ], + "orientation_deg": { + "roll": 36.76670266178536, + "pitch": 44.1262498780372, + "yaw": 13.394948310954723 + } + }, + { + "id": 211, + "position_mm": [ + 199.744384765625, + 0.05302027612924576, + -0.17967739701271057 + ], + "orientation_deg": { + "roll": 107.61913087124054, + "pitch": 3.6929670477766554, + "yaw": 4.244923292001919 + } + }, + { + "id": 214, + "position_mm": [ + 409.78569191526424, + 26.14888337450583, + -22.95924977723651 + ], + "orientation_deg": { + "roll": -3.5591880651619534, + "pitch": 0.07958832800522347, + "yaw": -0.908281512466989 + } + }, + { + "id": 215, + "position_mm": [ + 199.60459899902344, + -89.9400405883789, + -0.4983225464820862 + ], + "orientation_deg": { + "roll": -2.8248904023375925, + "pitch": 0.11546147778295654, + "yaw": 0.3680811987678786 + } + }, + { + "id": 217, + "position_mm": [ + 604.0510107770316, + 19.25716435846797, + -100.39204520392686 + ], + "orientation_deg": { + "roll": -9.999857114318917, + "pitch": 4.687411623510123, + "yaw": 0.6798235392761715 + } + }, + { + "id": 226, + "position_mm": [ + 461.88153076171875, + -22.143922805786133, + 258.7698059082031 + ], + "orientation_deg": { + "roll": 137.74833212868913, + "pitch": -9.546682190154835, + "yaw": -25.26374103690034 + } + }, + { + "id": 228, + "position_mm": [ + 471.3025228843485, + -140.24054627084377, + 256.76517144080714 + ], + "orientation_deg": { + "roll": -9.794001434347695, + "pitch": -8.559400619598163, + "yaw": 3.7341109472929315 + } + }, + { + "id": 229, + "position_mm": [ + 383.6541118252914, + -6.447470537112753, + 251.29615453599862 + ], + "orientation_deg": { + "roll": -52.68677699532855, + "pitch": 10.506929671117463, + "yaw": 3.2028428302931338 + } + }, + { + "id": 243, + "position_mm": [ + 366.0063171386719, + -50.20854949951172, + 251.70713806152344 + ], + "orientation_deg": { + "roll": 41.337890377168854, + "pitch": 1.9272769657975612, + "yaw": -0.5767882855037844 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1777958128576_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1777958128576_two_cam_annotated.jpg new file mode 100644 index 0000000..bcd30c3 Binary files /dev/null and b/test/snapshots/snapshot_video0_1777958128576_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1777958128576_two_cam_overlay.png b/test/snapshots/snapshot_video0_1777958128576_two_cam_overlay.png new file mode 100644 index 0000000..0a38ba3 Binary files /dev/null and b/test/snapshots/snapshot_video0_1777958128576_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1778054889025_two_cam.csv b/test/snapshots/snapshot_video0_1778054889025_two_cam.csv new file mode 100644 index 0000000..b605cee --- /dev/null +++ b/test/snapshots/snapshot_video0_1778054889025_two_cam.csv @@ -0,0 +1,19 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,147.42,-751.09,594.62,-121.791,-0.822,-16.558 +camera 1,393.29,-388.36,1179.31,-166.014,1.894,3.112 +0,372.49,-94.59,0.47,-1.368,-0.236,-0.161,3 +178,456.12,-359.81,245.47,50.538,-32.792,83.890,1 +179,435.62,-348.24,284.44,-52.619,25.235,147.081,3 +187,404.37,-362.35,274.95,13.506,10.207,73.990,3 +200,280.33,-27.04,118.17,-0.012,-0.778,3.812,3 +204,278.61,125.53,123.01,126.488,-7.084,-15.783,3 +208,518.66,-28.70,-54.78,105.248,-29.214,-36.129,1 +210,-4.16,1.46,-2.90,-0.317,2.970,-0.772,3 +211,199.76,0.13,-0.34,-3.856,1.306,-0.502,3 +214,426.36,88.57,-71.53,0.908,-0.975,-0.593,1 +215,199.65,-89.81,-0.78,-1.530,-0.638,-0.883,3 +217,612.39,25.75,-81.35,-1.901,-0.742,-2.150,2 +223,432.78,-177.96,275.89,-2.274,-14.074,0.887,3 +226,442.85,-63.87,268.88,-4.845,2.287,0.660,3 +229,357.96,-53.35,287.65,-47.898,1.975,2.923,2 +243,353.42,-92.26,263.01,44.821,2.132,0.166,3 diff --git a/test/snapshots/snapshot_video0_1778054889025_two_cam.json b/test/snapshots/snapshot_video0_1778054889025_two_cam.json new file mode 100644 index 0000000..86659a8 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778054889025_two_cam.json @@ -0,0 +1,253 @@ +{ + "metadata": { + "timestamp": "2026-05-06 08:08:09", + "reference_markers": [ + 210, + 211, + 215 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 4.590816018090041, + "rms_refs_px_cam2": 1.6240034592105381, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 147.42494865275995, + -751.0854570669217, + 594.6183586095766 + ], + "orientation_deg": { + "roll": -121.79096706534146, + "pitch": -0.8218092217060426, + "yaw": -16.55800609169854 + } + }, + { + "id": "camera2", + "position_mm": [ + 393.2881919726487, + -388.3550283648296, + 1179.3091897188835 + ], + "orientation_deg": { + "roll": -166.0141656191962, + "pitch": 1.89358083964142, + "yaw": 3.111972751662505 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + 372.48663330078125, + -94.5899429321289, + 0.47164931893348694 + ], + "orientation_deg": { + "roll": -1.3681401980979884, + "pitch": -0.23638593167529084, + "yaw": -0.1613986718329691 + } + }, + { + "id": 178, + "position_mm": [ + 456.11608239895315, + -359.80777627987607, + 245.4731644376812 + ], + "orientation_deg": { + "roll": 50.538176524873926, + "pitch": -32.79186919733686, + "yaw": 83.89001220022 + } + }, + { + "id": 179, + "position_mm": [ + 435.61993408203125, + -348.2384033203125, + 284.43634033203125 + ], + "orientation_deg": { + "roll": -52.61873975144137, + "pitch": 25.234584609200773, + "yaw": 147.0807634416476 + } + }, + { + "id": 187, + "position_mm": [ + 404.3673095703125, + -362.3518981933594, + 274.95159912109375 + ], + "orientation_deg": { + "roll": 13.506344281555837, + "pitch": 10.207437257161248, + "yaw": 73.9895685873278 + } + }, + { + "id": 200, + "position_mm": [ + 280.331298828125, + -27.04494857788086, + 118.17294311523438 + ], + "orientation_deg": { + "roll": -0.012251456947055669, + "pitch": -0.7775758584681589, + "yaw": 3.8124863453082036 + } + }, + { + "id": 204, + "position_mm": [ + 278.6128234863281, + 125.52925872802734, + 123.01371765136719 + ], + "orientation_deg": { + "roll": 126.48782678823211, + "pitch": -7.083549530230612, + "yaw": -15.782702355540186 + } + }, + { + "id": 208, + "position_mm": [ + 518.6632773344581, + -28.697352192997517, + -54.77502128181433 + ], + "orientation_deg": { + "roll": 105.24776703452369, + "pitch": -29.213657366588535, + "yaw": -36.12852775174824 + } + }, + { + "id": 210, + "position_mm": [ + -4.164219856262207, + 1.4597249031066895, + -2.9007458686828613 + ], + "orientation_deg": { + "roll": -0.31694418737468777, + "pitch": 2.969889470432295, + "yaw": -0.7718500078010664 + } + }, + { + "id": 211, + "position_mm": [ + 199.76065063476562, + 0.1294933259487152, + -0.3412942886352539 + ], + "orientation_deg": { + "roll": -3.8561307789129287, + "pitch": 1.306318032876168, + "yaw": -0.5015868400366902 + } + }, + { + "id": 214, + "position_mm": [ + 426.35580492728934, + 88.56616440062004, + -71.52535523553838 + ], + "orientation_deg": { + "roll": 0.9078878446492741, + "pitch": -0.9747977726478123, + "yaw": -0.5931841691660048 + } + }, + { + "id": 215, + "position_mm": [ + 199.64529418945312, + -89.81466674804688, + -0.7764945030212402 + ], + "orientation_deg": { + "roll": -1.5304041632561065, + "pitch": -0.6375461965750857, + "yaw": -0.882874775136248 + } + }, + { + "id": 217, + "position_mm": [ + 612.3893168517301, + 25.752911347790675, + -81.35457809472312 + ], + "orientation_deg": { + "roll": -1.9014094956510394, + "pitch": -0.7421121932072762, + "yaw": -2.150141418143064 + } + }, + { + "id": 223, + "position_mm": [ + 432.781005859375, + -177.96484375, + 275.8923645019531 + ], + "orientation_deg": { + "roll": -2.274470910826712, + "pitch": -14.074084979235563, + "yaw": 0.8872004060360167 + } + }, + { + "id": 226, + "position_mm": [ + 442.849609375, + -63.87300109863281, + 268.8798522949219 + ], + "orientation_deg": { + "roll": -4.8454999463535655, + "pitch": 2.2873307526536966, + "yaw": 0.660174117408432 + } + }, + { + "id": 229, + "position_mm": [ + 357.96071174966926, + -53.345881802605135, + 287.6518056414521 + ], + "orientation_deg": { + "roll": -47.898354075997865, + "pitch": 1.974847488204686, + "yaw": 2.9226765105596173 + } + }, + { + "id": 243, + "position_mm": [ + 353.41839599609375, + -92.26097106933594, + 263.00689697265625 + ], + "orientation_deg": { + "roll": 44.821402430458285, + "pitch": 2.1320756192699135, + "yaw": 0.1658569371921932 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1778054889025_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1778054889025_two_cam_annotated.jpg new file mode 100644 index 0000000..c12a033 Binary files /dev/null and b/test/snapshots/snapshot_video0_1778054889025_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1778054889025_two_cam_overlay.png b/test/snapshots/snapshot_video0_1778054889025_two_cam_overlay.png new file mode 100644 index 0000000..7154b64 Binary files /dev/null and b/test/snapshots/snapshot_video0_1778054889025_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1778406621349.jpg b/test/snapshots/snapshot_video0_1778406621349.jpg new file mode 100644 index 0000000..be19d7e Binary files /dev/null and b/test/snapshots/snapshot_video0_1778406621349.jpg differ diff --git a/test/snapshots/snapshot_video0_1778406621349_two_cam.csv b/test/snapshots/snapshot_video0_1778406621349_two_cam.csv new file mode 100644 index 0000000..2dfdf5d --- /dev/null +++ b/test/snapshots/snapshot_video0_1778406621349_two_cam.csv @@ -0,0 +1,13 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,264.84,-448.46,516.54,-140.171,-1.865,2.388 +camera 1,389.91,-409.85,935.42,-157.399,8.669,7.846 +198,379.47,-47.52,91.56,1.884,2.172,1.413,3 +200,310.61,-28.22,116.65,2.481,-1.302,2.910,3 +204,309.61,123.65,124.82,0.922,1.511,1.327,3 +210,-1.38,-0.36,0.53,2.268,0.168,0.630,3 +211,200.01,-0.03,0.03,1.212,0.080,1.086,3 +215,200.00,-90.02,0.01,0.329,0.082,1.119,3 +223,461.70,-239.97,68.70,-6.283,-26.057,3.143,2 +226,473.32,-128.20,82.36,-7.045,3.550,2.138,3 +229,382.10,-138.78,91.38,2.122,1.637,1.333,3 +243,384.75,-153.93,31.47,92.284,1.185,1.570,1 diff --git a/test/snapshots/snapshot_video0_1778406621349_two_cam.json b/test/snapshots/snapshot_video0_1778406621349_two_cam.json new file mode 100644 index 0000000..4a44ad1 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778406621349_two_cam.json @@ -0,0 +1,175 @@ +{ + "metadata": { + "timestamp": "2026-05-10 09:50:21", + "reference_markers": [ + 210, + 211, + 215 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 3.24786159840821, + "rms_refs_px_cam2": 0.35373435298091754, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 264.8418896705653, + -448.4588280097624, + 516.5430654974838 + ], + "orientation_deg": { + "roll": -140.17119986117208, + "pitch": -1.865223311233184, + "yaw": 2.388475258105415 + } + }, + { + "id": "camera2", + "position_mm": [ + 389.91429402212697, + -409.84642833812615, + 935.419816456442 + ], + "orientation_deg": { + "roll": -157.39944112599088, + "pitch": 8.668739432057341, + "yaw": 7.84617553314689 + } + } + ], + "markers": [ + { + "id": 198, + "position_mm": [ + 379.4744873046875, + -47.51786804199219, + 91.5611801147461 + ], + "orientation_deg": { + "roll": 1.883785213403855, + "pitch": 2.172404640223496, + "yaw": 1.4128404521411706 + } + }, + { + "id": 200, + "position_mm": [ + 310.6123352050781, + -28.22052764892578, + 116.64888763427734 + ], + "orientation_deg": { + "roll": 2.4805237147914183, + "pitch": -1.3021544214965108, + "yaw": 2.9096889693911945 + } + }, + { + "id": 204, + "position_mm": [ + 309.6077880859375, + 123.64892578125, + 124.82405853271484 + ], + "orientation_deg": { + "roll": 0.9217037882864602, + "pitch": 1.510909167972885, + "yaw": 1.3270366048715656 + } + }, + { + "id": 210, + "position_mm": [ + -1.3822473287582397, + -0.35651564598083496, + 0.5323472619056702 + ], + "orientation_deg": { + "roll": 2.2680841460779426, + "pitch": 0.16754081520133732, + "yaw": 0.6300169958322452 + } + }, + { + "id": 211, + "position_mm": [ + 200.0091094970703, + -0.027147645130753517, + 0.029545657336711884 + ], + "orientation_deg": { + "roll": 1.2120159665924424, + "pitch": 0.07991626682053452, + "yaw": 1.0861087648303256 + } + }, + { + "id": 215, + "position_mm": [ + 199.99989318847656, + -90.02400207519531, + 0.011483968235552311 + ], + "orientation_deg": { + "roll": 0.3291608166417733, + "pitch": 0.08225944124668336, + "yaw": 1.1185856551828588 + } + }, + { + "id": 223, + "position_mm": [ + 461.6983083182723, + -239.9714317762591, + 68.7005685225841 + ], + "orientation_deg": { + "roll": -6.283431761105847, + "pitch": -26.057398472817134, + "yaw": 3.1429438658960946 + } + }, + { + "id": 226, + "position_mm": [ + 473.31671142578125, + -128.2008819580078, + 82.3624267578125 + ], + "orientation_deg": { + "roll": -7.044637777230225, + "pitch": 3.5502536437242425, + "yaw": 2.1379181565828254 + } + }, + { + "id": 229, + "position_mm": [ + 382.09576416015625, + -138.7764129638672, + 91.38326263427734 + ], + "orientation_deg": { + "roll": 2.1223433653949817, + "pitch": 1.636784042225621, + "yaw": 1.3329059458000578 + } + }, + { + "id": 243, + "position_mm": [ + 384.7495384614813, + -153.92526815108292, + 31.465031813878554 + ], + "orientation_deg": { + "roll": 92.28432644230978, + "pitch": 1.185328109849308, + "yaw": 1.5702705780719146 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1778406621349_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1778406621349_two_cam_annotated.jpg new file mode 100644 index 0000000..ebc8a94 Binary files /dev/null and b/test/snapshots/snapshot_video0_1778406621349_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1778406621349_two_cam_overlay.png b/test/snapshots/snapshot_video0_1778406621349_two_cam_overlay.png new file mode 100644 index 0000000..e7142de Binary files /dev/null and b/test/snapshots/snapshot_video0_1778406621349_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1778406635059_two_cam.json b/test/snapshots/snapshot_video0_1778406635059_two_cam.json new file mode 100644 index 0000000..63f4814 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778406635059_two_cam.json @@ -0,0 +1,201 @@ +{ + "metadata": { + "timestamp": "2026-05-10 09:50:35", + "reference_markers": [ + 210, + 211, + 215 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 3.2482731059855747, + "rms_refs_px_cam2": 0.3537390578212888, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 265.397015887861, + -448.6315082129522, + 515.3628550421728 + ], + "orientation_deg": { + "roll": -140.09181177429903, + "pitch": -1.842611823442935, + "yaw": 2.450610543799479 + } + }, + { + "id": "camera2", + "position_mm": [ + 383.3214578496451, + -385.83974146528055, + 953.5667818268885 + ], + "orientation_deg": { + "roll": -159.08748070867932, + "pitch": 8.461582940811079, + "yaw": 7.425461023601154 + } + } + ], + "markers": [ + { + "id": 198, + "position_mm": [ + 349.6740417480469, + -44.07814407348633, + 88.61839294433594 + ], + "orientation_deg": { + "roll": 2.5667577692881807, + "pitch": 1.4580715758695812, + "yaw": 1.4609442861632849 + } + }, + { + "id": 200, + "position_mm": [ + 280.2397155761719, + -23.60141944885254, + 112.71051788330078 + ], + "orientation_deg": { + "roll": 2.633060948359525, + "pitch": -0.5171332067681839, + "yaw": 3.8143400316997913 + } + }, + { + "id": 204, + "position_mm": [ + 279.1097717285156, + 127.85354614257812, + 122.40876007080078 + ], + "orientation_deg": { + "roll": 0.11539855528707277, + "pitch": 1.8119645874878296, + "yaw": 1.2059489621885167 + } + }, + { + "id": 210, + "position_mm": [ + -1.3366869688034058, + -0.41581201553344727, + 0.6352185010910034 + ], + "orientation_deg": { + "roll": 1.392657022348894, + "pitch": -0.34765543020625655, + "yaw": 0.9545639555981095 + } + }, + { + "id": 211, + "position_mm": [ + 200.00827026367188, + -0.023877479135990143, + 0.02531452104449272 + ], + "orientation_deg": { + "roll": 0.5726747013059821, + "pitch": -0.4386454622262142, + "yaw": 0.6785547309411363 + } + }, + { + "id": 214, + "position_mm": [ + 402.29820802367976, + 7.204420898576203, + -21.035325233706548 + ], + "orientation_deg": { + "roll": -4.430514955898216, + "pitch": -3.1619089568308882, + "yaw": 0.1308589144890069 + } + }, + { + "id": 215, + "position_mm": [ + 199.99966430664062, + -90.02363586425781, + 0.01089040469378233 + ], + "orientation_deg": { + "roll": 0.4079874268727783, + "pitch": 0.10662199276007521, + "yaw": 1.1834191807022583 + } + }, + { + "id": 223, + "position_mm": [ + 427.94940185546875, + -240.49069213867188, + 92.17993927001953 + ], + "orientation_deg": { + "roll": -7.682039212213371, + "pitch": -28.31260565779191, + "yaw": 5.048647103544987 + } + }, + { + "id": 226, + "position_mm": [ + 443.6652526855469, + -125.32998657226562, + 79.9815902709961 + ], + "orientation_deg": { + "roll": -5.654114523378114, + "pitch": 3.6471568870248174, + "yaw": 2.809074607780799 + } + }, + { + "id": 228, + "position_mm": [ + 481.57039719357545, + -236.29591842142963, + 39.87178136845826 + ], + "orientation_deg": { + "roll": -16.057635594680953, + "pitch": 55.60127692022108, + "yaw": -11.892761289401005 + } + }, + { + "id": 229, + "position_mm": [ + 352.33184814453125, + -135.92752075195312, + 88.81539154052734 + ], + "orientation_deg": { + "roll": 2.2601297965351503, + "pitch": 0.9413138522933149, + "yaw": 1.2921332576257998 + } + }, + { + "id": 243, + "position_mm": [ + 354.5863316838132, + -150.94967446548407, + 26.990575716774543 + ], + "orientation_deg": { + "roll": 92.20701707845971, + "pitch": 2.043955224411742, + "yaw": 1.9432810218927754 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1778406635059_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1778406635059_two_cam_annotated.jpg new file mode 100644 index 0000000..bb04b2d Binary files /dev/null and b/test/snapshots/snapshot_video0_1778406635059_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1778406635059_two_cam_overlay.png b/test/snapshots/snapshot_video0_1778406635059_two_cam_overlay.png new file mode 100644 index 0000000..3dc1a9c Binary files /dev/null and b/test/snapshots/snapshot_video0_1778406635059_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1778407153025.jpg b/test/snapshots/snapshot_video0_1778407153025.jpg new file mode 100644 index 0000000..804a19a Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407153025.jpg differ diff --git a/test/snapshots/snapshot_video0_1778407153025_two_cam.csv b/test/snapshots/snapshot_video0_1778407153025_two_cam.csv new file mode 100644 index 0000000..bebe0f9 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778407153025_two_cam.csv @@ -0,0 +1,17 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,158.36,-593.39,578.95,-128.888,1.436,-15.566 +camera 1,387.25,-391.56,947.37,-158.603,8.621,7.638 +0,390.64,-42.76,-57.96,0.869,1.093,1.096,1 +198,334.11,-6.38,159.48,-30.514,0.703,2.172,2 +200,263.51,-25.92,115.97,1.396,0.003,3.587,3 +204,262.09,125.71,123.56,-1.138,2.084,1.523,3 +208,499.27,-81.15,-32.64,36.786,-9.918,-1.006,2 +210,-3.29,2.01,-3.86,-0.284,2.089,0.732,3 +211,199.97,0.04,-0.10,-0.360,0.282,-0.331,3 +214,416.92,55.17,-54.53,2.603,-0.313,0.497,1 +215,199.88,-89.84,-0.54,1.273,0.406,0.044,3 +217,642.91,84.41,-81.51,3.494,2.015,-0.760,1 +223,407.39,-219.71,161.30,24.607,-26.107,-13.137,3 +226,427.44,-115.61,205.02,22.093,3.594,0.933,3 +229,336.88,-83.96,194.87,-29.693,0.904,1.026,2 +243,336.42,-136.74,196.57,44.605,-22.045,-30.908,3 diff --git a/test/snapshots/snapshot_video0_1778407153025_two_cam.json b/test/snapshots/snapshot_video0_1778407153025_two_cam.json new file mode 100644 index 0000000..409a4b3 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778407153025_two_cam.json @@ -0,0 +1,227 @@ +{ + "metadata": { + "timestamp": "2026-05-10 09:59:13", + "reference_markers": [ + 210, + 211, + 215 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 4.037640585863036, + "rms_refs_px_cam2": 0.35368062284827945, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 158.3637652609236, + -593.3933430814283, + 578.9501861619086 + ], + "orientation_deg": { + "roll": -128.88780220793933, + "pitch": 1.4363565503299847, + "yaw": -15.565753425224687 + } + }, + { + "id": "camera2", + "position_mm": [ + 387.2468230079705, + -391.55964302648147, + 947.3689579287991 + ], + "orientation_deg": { + "roll": -158.60294191586274, + "pitch": 8.621452909290047, + "yaw": 7.638107369992987 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + 390.6387843924503, + -42.7621855424406, + -57.962717237959204 + ], + "orientation_deg": { + "roll": 0.8692799659217282, + "pitch": 1.0931707841628564, + "yaw": 1.0964523562377044 + } + }, + { + "id": 198, + "position_mm": [ + 334.1105761644491, + -6.383341988162982, + 159.47917099190266 + ], + "orientation_deg": { + "roll": -30.513876703780277, + "pitch": 0.7030511432366292, + "yaw": 2.1723530299232174 + } + }, + { + "id": 200, + "position_mm": [ + 263.5056457519531, + -25.92091941833496, + 115.9714584350586 + ], + "orientation_deg": { + "roll": 1.3958934920738213, + "pitch": 0.0030810830461071785, + "yaw": 3.587025581205188 + } + }, + { + "id": 204, + "position_mm": [ + 262.0873107910156, + 125.70845794677734, + 123.56187438964844 + ], + "orientation_deg": { + "roll": -1.1384989840329478, + "pitch": 2.0838607039127384, + "yaw": 1.5234662612083132 + } + }, + { + "id": 208, + "position_mm": [ + 499.2681534131064, + -81.1536514000235, + -32.6360145861917 + ], + "orientation_deg": { + "roll": 36.78623735054579, + "pitch": -9.917537883912583, + "yaw": -1.0060423963714051 + } + }, + { + "id": 210, + "position_mm": [ + -3.2904393672943115, + 2.0091781616210938, + -3.8569560050964355 + ], + "orientation_deg": { + "roll": -0.2844449975671197, + "pitch": 2.088986796376549, + "yaw": 0.7318757468677802 + } + }, + { + "id": 211, + "position_mm": [ + 199.96714782714844, + 0.036044832319021225, + -0.10493536293506622 + ], + "orientation_deg": { + "roll": -0.3596510701204492, + "pitch": 0.2819800595592275, + "yaw": -0.33064209912600223 + } + }, + { + "id": 214, + "position_mm": [ + 416.9196684070423, + 55.16722846050992, + -54.53336540373432 + ], + "orientation_deg": { + "roll": 2.6025596581543113, + "pitch": -0.31274834760090375, + "yaw": 0.4965197650165277 + } + }, + { + "id": 215, + "position_mm": [ + 199.87811279296875, + -89.84262084960938, + -0.537714421749115 + ], + "orientation_deg": { + "roll": 1.272501125792174, + "pitch": 0.4056540461945203, + "yaw": 0.04380828051345797 + } + }, + { + "id": 217, + "position_mm": [ + 642.9125537201817, + 84.41179556964696, + -81.51024043559329 + ], + "orientation_deg": { + "roll": 3.4938631545234684, + "pitch": 2.0153184255735406, + "yaw": -0.7601476308219924 + } + }, + { + "id": 223, + "position_mm": [ + 407.3850402832031, + -219.70761108398438, + 161.30087280273438 + ], + "orientation_deg": { + "roll": 24.606665041324728, + "pitch": -26.10740646159854, + "yaw": -13.137366415947858 + } + }, + { + "id": 226, + "position_mm": [ + 427.4405822753906, + -115.60576629638672, + 205.0249786376953 + ], + "orientation_deg": { + "roll": 22.09290336947975, + "pitch": 3.5938824646587535, + "yaw": 0.9331204880248806 + } + }, + { + "id": 229, + "position_mm": [ + 336.87580740414757, + -83.959242272582, + 194.86770890959903 + ], + "orientation_deg": { + "roll": -29.692998825834785, + "pitch": 0.9037989541452385, + "yaw": 1.0260204426370985 + } + }, + { + "id": 243, + "position_mm": [ + 336.4207458496094, + -136.7364959716797, + 196.57156372070312 + ], + "orientation_deg": { + "roll": 44.6053999146273, + "pitch": -22.04468899658641, + "yaw": -30.908455971021343 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1778407153025_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1778407153025_two_cam_annotated.jpg new file mode 100644 index 0000000..16d35e1 Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407153025_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1778407153025_two_cam_overlay.png b/test/snapshots/snapshot_video0_1778407153025_two_cam_overlay.png new file mode 100644 index 0000000..8066f2d Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407153025_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video0_1778407171886.jpg b/test/snapshots/snapshot_video0_1778407171886.jpg new file mode 100644 index 0000000..f6519d7 Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407171886.jpg differ diff --git a/test/snapshots/snapshot_video0_1778407171886_two_cam.csv b/test/snapshots/snapshot_video0_1778407171886_two_cam.csv new file mode 100644 index 0000000..e66a120 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778407171886_two_cam.csv @@ -0,0 +1,17 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,158.04,-592.18,579.62,-128.975,1.364,-15.554 +camera 1,388.46,-401.39,943.65,-158.006,8.598,7.755 +0,390.69,-42.64,-58.10,0.765,1.049,1.109,1 +198,385.31,-8.17,159.76,-28.970,2.390,1.497,2 +200,312.76,-26.17,115.22,2.281,-0.327,3.654,3 +204,311.88,127.59,120.99,0.516,2.065,2.400,3 +208,523.91,-27.55,-70.87,4.376,1.392,3.328,1 +210,-3.34,2.13,-3.99,91.337,14.104,14.036,3 +211,199.97,0.04,-0.11,92.750,-3.786,-5.385,3 +214,433.21,95.07,-93.91,1.294,-1.762,0.048,1 +215,199.88,-89.83,-0.55,1.169,0.360,0.057,3 +223,457.00,-220.65,160.56,32.192,-28.164,-16.125,3 +226,477.70,-116.40,204.08,24.445,3.521,2.498,3 +228,507.31,-218.59,145.95,39.614,50.980,31.819,2 +229,388.41,-88.19,198.82,-28.626,1.389,1.347,2 +243,385.41,-138.00,196.06,60.074,3.006,0.942,3 diff --git a/test/snapshots/snapshot_video0_1778407171886_two_cam.json b/test/snapshots/snapshot_video0_1778407171886_two_cam.json new file mode 100644 index 0000000..bc3a709 --- /dev/null +++ b/test/snapshots/snapshot_video0_1778407171886_two_cam.json @@ -0,0 +1,227 @@ +{ + "metadata": { + "timestamp": "2026-05-10 09:59:32", + "reference_markers": [ + 210, + 211, + 215 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "rms_refs_px_cam1": 4.0379342194834145, + "rms_refs_px_cam2": 0.3525640978340953, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 158.03930225498664, + -592.180367667669, + 579.6243862008779 + ], + "orientation_deg": { + "roll": -128.9753618664107, + "pitch": 1.3642445786373374, + "yaw": -15.553542082518831 + } + }, + { + "id": "camera2", + "position_mm": [ + 388.4601350644073, + -401.3948487989071, + 943.6529198481344 + ], + "orientation_deg": { + "roll": -158.0062544707651, + "pitch": 8.597964890026196, + "yaw": 7.754523539624292 + } + } + ], + "markers": [ + { + "id": 0, + "position_mm": [ + 390.6880896022262, + -42.64412449230426, + -58.0972316427476 + ], + "orientation_deg": { + "roll": 0.7647269178228525, + "pitch": 1.049185198054671, + "yaw": 1.108848865155235 + } + }, + { + "id": 198, + "position_mm": [ + 385.3133827088088, + -8.171522799495012, + 159.7637737468176 + ], + "orientation_deg": { + "roll": -28.969920792916543, + "pitch": 2.39030770057407, + "yaw": 1.4968801274589405 + } + }, + { + "id": 200, + "position_mm": [ + 312.7627868652344, + -26.1728572845459, + 115.22242736816406 + ], + "orientation_deg": { + "roll": 2.2808890072502392, + "pitch": -0.3274094066131204, + "yaw": 3.6541782174556747 + } + }, + { + "id": 204, + "position_mm": [ + 311.876220703125, + 127.58633422851562, + 120.98774719238281 + ], + "orientation_deg": { + "roll": 0.5158318086332035, + "pitch": 2.06453002657979, + "yaw": 2.400260110706478 + } + }, + { + "id": 208, + "position_mm": [ + 523.9084074808294, + -27.546175716282264, + -70.86775385107103 + ], + "orientation_deg": { + "roll": 4.376126337936395, + "pitch": 1.3924940964670567, + "yaw": 3.328036024175951 + } + }, + { + "id": 210, + "position_mm": [ + -3.338937520980835, + 2.1271181106567383, + -3.9890851974487305 + ], + "orientation_deg": { + "roll": 91.33725138238549, + "pitch": 14.104010525793678, + "yaw": 14.035641296225394 + } + }, + { + "id": 211, + "position_mm": [ + 199.96713256835938, + 0.037796709686517715, + -0.10643231868743896 + ], + "orientation_deg": { + "roll": 92.74967187358487, + "pitch": -3.786197853433813, + "yaw": -5.384933547204122 + } + }, + { + "id": 214, + "position_mm": [ + 433.21136641262757, + 95.07263850323223, + -93.91074803910848 + ], + "orientation_deg": { + "roll": 1.2942096661143863, + "pitch": -1.7616427894502695, + "yaw": 0.04798612599241947 + } + }, + { + "id": 215, + "position_mm": [ + 199.87725830078125, + -89.83390045166016, + -0.5476088523864746 + ], + "orientation_deg": { + "roll": 1.1687892340044546, + "pitch": 0.35975660897382916, + "yaw": 0.05746662106150169 + } + }, + { + "id": 223, + "position_mm": [ + 457.0023193359375, + -220.65341186523438, + 160.55662536621094 + ], + "orientation_deg": { + "roll": 32.19215623582208, + "pitch": -28.163885080615586, + "yaw": -16.12513107176477 + } + }, + { + "id": 226, + "position_mm": [ + 477.6986999511719, + -116.39785766601562, + 204.0816192626953 + ], + "orientation_deg": { + "roll": 24.44540408786654, + "pitch": 3.5209180259894635, + "yaw": 2.498316767787566 + } + }, + { + "id": 228, + "position_mm": [ + 507.3054086247164, + -218.5947100755589, + 145.95120715412878 + ], + "orientation_deg": { + "roll": 39.61414520333383, + "pitch": 50.97993589341308, + "yaw": 31.81879176756129 + } + }, + { + "id": 229, + "position_mm": [ + 388.40604224907537, + -88.1935956561397, + 198.81778665267646 + ], + "orientation_deg": { + "roll": -28.62629432681035, + "pitch": 1.3894110554484702, + "yaw": 1.3473468463901406 + } + }, + { + "id": 243, + "position_mm": [ + 385.4113464355469, + -137.99954223632812, + 196.05523681640625 + ], + "orientation_deg": { + "roll": 60.07436472666781, + "pitch": 3.005858013729151, + "yaw": 0.9420958018669331 + } + } + ] +} \ No newline at end of file diff --git a/test/snapshots/snapshot_video0_1778407171886_two_cam_annotated.jpg b/test/snapshots/snapshot_video0_1778407171886_two_cam_annotated.jpg new file mode 100644 index 0000000..1c08feb Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407171886_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video0_1778407171886_two_cam_overlay.png b/test/snapshots/snapshot_video0_1778407171886_two_cam_overlay.png new file mode 100644 index 0000000..3f1812c Binary files /dev/null and b/test/snapshots/snapshot_video0_1778407171886_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video1_1777957783463.jpg b/test/snapshots/snapshot_video1_1777957783463.jpg new file mode 100644 index 0000000..c1449a5 Binary files /dev/null and b/test/snapshots/snapshot_video1_1777957783463.jpg differ diff --git a/test/snapshots/snapshot_video1_1777957783463_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1777957783463_two_cam_annotated.jpg new file mode 100644 index 0000000..256e0a8 Binary files /dev/null and b/test/snapshots/snapshot_video1_1777957783463_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1777957783463_two_cam_overlay.png b/test/snapshots/snapshot_video1_1777957783463_two_cam_overlay.png new file mode 100644 index 0000000..4c220f5 Binary files /dev/null and b/test/snapshots/snapshot_video1_1777957783463_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video1_1777958128576.jpg b/test/snapshots/snapshot_video1_1777958128576.jpg new file mode 100644 index 0000000..0a01fa7 Binary files /dev/null and b/test/snapshots/snapshot_video1_1777958128576.jpg differ diff --git a/test/snapshots/snapshot_video1_1777958128576_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1777958128576_two_cam_annotated.jpg new file mode 100644 index 0000000..ce47c60 Binary files /dev/null and b/test/snapshots/snapshot_video1_1777958128576_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1777958128576_two_cam_overlay.png b/test/snapshots/snapshot_video1_1777958128576_two_cam_overlay.png new file mode 100644 index 0000000..a19332a Binary files /dev/null and b/test/snapshots/snapshot_video1_1777958128576_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video1_1778054889025.jpg b/test/snapshots/snapshot_video1_1778054889025.jpg new file mode 100644 index 0000000..1391a02 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778054889025.jpg differ diff --git a/test/snapshots/snapshot_video1_1778406621349.jpg b/test/snapshots/snapshot_video1_1778406621349.jpg new file mode 100644 index 0000000..8a54499 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406621349.jpg differ diff --git a/test/snapshots/snapshot_video1_1778406621349_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1778406621349_two_cam_annotated.jpg new file mode 100644 index 0000000..b1c530c Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406621349_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1778406621349_two_cam_overlay.png b/test/snapshots/snapshot_video1_1778406621349_two_cam_overlay.png new file mode 100644 index 0000000..f5e25b4 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406621349_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video1_1778406635059.jpg b/test/snapshots/snapshot_video1_1778406635059.jpg new file mode 100644 index 0000000..cb99eb8 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406635059.jpg differ diff --git a/test/snapshots/snapshot_video1_1778406635059_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1778406635059_two_cam_annotated.jpg new file mode 100644 index 0000000..1a5ace4 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406635059_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1778406635059_two_cam_overlay.png b/test/snapshots/snapshot_video1_1778406635059_two_cam_overlay.png new file mode 100644 index 0000000..5b4ccf9 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778406635059_two_cam_overlay.png differ diff --git a/test/snapshots/snapshot_video1_1778407153025.jpg b/test/snapshots/snapshot_video1_1778407153025.jpg new file mode 100644 index 0000000..a63bda2 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778407153025.jpg differ diff --git a/test/snapshots/snapshot_video1_1778407153025_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1778407153025_two_cam_annotated.jpg new file mode 100644 index 0000000..23db81e Binary files /dev/null and b/test/snapshots/snapshot_video1_1778407153025_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1778407171886.jpg b/test/snapshots/snapshot_video1_1778407171886.jpg new file mode 100644 index 0000000..d7ad254 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778407171886.jpg differ diff --git a/test/snapshots/snapshot_video1_1778407171886_two_cam_annotated.jpg b/test/snapshots/snapshot_video1_1778407171886_two_cam_annotated.jpg new file mode 100644 index 0000000..e0f9e20 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778407171886_two_cam_annotated.jpg differ diff --git a/test/snapshots/snapshot_video1_1778407171886_two_cam_overlay.png b/test/snapshots/snapshot_video1_1778407171886_two_cam_overlay.png new file mode 100644 index 0000000..0c158d6 Binary files /dev/null and b/test/snapshots/snapshot_video1_1778407171886_two_cam_overlay.png differ