diff --git a/data/evaluations/Scene5/aruco_positions_initial.json b/data/evaluations/Scene5/aruco_positions_initial.json index 8ccb8d9..0ea79c6 100644 --- a/data/evaluations/Scene5/aruco_positions_initial.json +++ b/data/evaluations/Scene5/aruco_positions_initial.json @@ -1,782 +1,1076 @@ { "schema_version": "1.2", "stage": "initial_triangulation", - "created_utc": "2026-05-31T08:42:49Z", + "created_utc": "2026-06-01T19:02:41Z", "summary": { "num_cameras": 7, - "num_markers": 55, - "num_constraints": 89 + "num_markers": 56, + "num_constraints": 94 }, "markers": [ { "marker_id": 41, "position_m": [ - 0.36491943436434837, - -0.15341836855742522, - 0.20512832629130354 + 0.36687279654649646, + -0.16269108332749885, + 0.16630561261260557 ], "position_mm": [ - 364.9194343643484, - -153.41836855742523, - 205.12832629130352 + 366.8727965464965, + -162.69108332749886, + 166.30561261260556 ], - "link": "FingerA" + "link": "FingerA", + "normal": [ + 0.0, + -0.9375276894468237, + 0.34791066600565723 + ] }, { "marker_id": 42, "position_m": [ - 0.3762966001705929, - -0.17649441008502625, - 0.1587454543524568 + 0.3782391436170156, + -0.18286261422073177, + 0.12502205960840154 ], "position_mm": [ - 376.2966001705929, - -176.49441008502626, - 158.7454543524568 + 378.2391436170156, + -182.86261422073179, + 125.02205960840155 ], - "link": "FingerA" + "link": "FingerA", + "normal": [ + 0.8830215713766957, + -0.3090575499818435, + 0.3532086285506783 + ] }, { "marker_id": 43, "position_m": [ - 0.334631482008935, - -0.18710614513031634, - 0.16591588247152117 + 0.33126928798298777, + -0.14924650220821273, + 0.13810406767612168 ], "position_mm": [ - 334.631482008935, - -187.10614513031635, - 165.91588247152117 + 331.26928798298775, + -149.24650220821272, + 138.10406767612167 ], - "link": "FingerB" + "link": "FingerB", + "normal": [ + 0.4224220616915755, + 0.0, + 0.9063992507699015 + ] }, { "marker_id": 46, "position_m": [ - 0.5348101937245319, - 0.18614586764872093, - -0.026404450211016686 + 0.5368177517090647, + 0.1853159738447234, + -0.027448612692106564 ], "position_mm": [ - 534.8101937245318, - 186.14586764872092, - -26.404450211016687 + 536.8177517090646, + 185.3159738447234, + -27.448612692106565 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 47, "position_m": [ - 0.3441549352912641, - -0.28949267930295414, - -0.02926505845950718 + 0.3443815659854445, + -0.28672056841048005, + -0.02718224212174643 ], "position_mm": [ - 344.1549352912641, - -289.4926793029541, - -29.26505845950718 + 344.3815659854445, + -286.72056841048004, + -27.18224212174643 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 51, "position_m": [ - 0.16643692631172335, - -0.17224694369816523, - -0.028388250034234296 + 0.16763413928846924, + -0.17195870471121605, + -0.027400349294695415 ], "position_mm": [ - 166.43692631172337, - -172.24694369816524, - -28.388250034234296 + 167.63413928846924, + -171.95870471121606, + -27.400349294695413 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 52, "position_m": [ - 0.10201931659302299, - 0.22427132169709932, - -0.0458445726799247 + 0.0949567847508655, + 0.20833398339029024, + -0.02687779882830732 ], "position_mm": [ - 102.01931659302299, - 224.27132169709932, - -45.8445726799247 + 94.9567847508655, + 208.33398339029026, + -26.87779882830732 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 53, "position_m": [ - 0.4804806672034692, - 0.22290013832209646, - -0.03298401993792536 + 0.48626754387687443, + 0.21209951308225597, + -0.02738400453889517 ], "position_mm": [ - 480.48066720346924, - 222.90013832209647, - -32.98401993792536 + 486.2675438768744, + 212.09951308225598, + -27.384004538895173 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 54, "position_m": [ - 0.34227592357653824, - -0.32651034206834256, - -0.024247226208955232 + 0.34236971162965696, + -0.33057679351820407, + -0.027118024158326592 ], "position_mm": [ - 342.2759235765382, - -326.51034206834254, - -24.247226208955233 + 342.36971162965693, + -330.57679351820406, + -27.11802415832659 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 55, "position_m": [ - 0.28503129467591654, - -0.26220090150216113, - -0.026871285910969503 + 0.2837588003522096, + -0.26269525361944635, + -0.027236377335146243 ], "position_mm": [ - 285.0312946759165, - -262.2009015021611, - -26.871285910969505 + 283.75880035220956, + -262.69525361944636, + -27.236377335146244 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 56, "position_m": [ - 0.4975276245025126, - 0.16980698571696468, - -0.02664966035093813 + 0.4986955870963211, + 0.16877595800293496, + -0.027420955341862965 ], "position_mm": [ - 497.5276245025126, - 169.80698571696468, - -26.64966035093813 + 498.6955870963211, + 168.77595800293497, + -27.420955341862964 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 58, "position_m": [ - 0.0525090460798551, - -0.21741328405627652, - -0.02881473780240553 + 0.05002663460318394, + -0.21800987443964, + -0.027328975653380945 ], "position_mm": [ - 52.509046079855096, - -217.41328405627652, - -28.81473780240553 + 50.02663460318394, + -218.00987443964001, + -27.328975653380944 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 61, "position_m": [ - -0.011977943033331646, - 0.364540277267162, - -0.06084083856924159 + -0.022459502011385933, + 0.33630586911596383, + -0.02757675503510813 ], "position_mm": [ - -11.977943033331647, - 364.54027726716197, - -60.84083856924159 + -22.459502011385933, + 336.30586911596384, + -27.57675503510813 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 62, "position_m": [ - 0.40457835574230283, - -0.17601291718337936, - -0.029020307229570795 + 0.4046747928604227, + -0.1751302599985015, + -0.02740648686783664 ], "position_mm": [ - 404.57835574230285, - -176.01291718337936, - -29.020307229570793 + 404.67479286042266, + -175.1302599985015, + -27.40648686783664 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 63, "position_m": [ - 0.7962738849802937, - -0.24485880482411773, - -0.05168221406234657 + 0.7773804137316271, + -0.23622947742545178, + -0.027639115167645046 ], "position_mm": [ - 796.2738849802937, - -244.85880482411773, - -51.68221406234657 + 777.3804137316272, + -236.2294774254518, + -27.639115167645045 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 64, "position_m": [ - -0.019311415934851407, - -0.18697653469693007, - -0.02650726165326947 + -0.021255606940066785, + -0.18801819690343263, + -0.027179039698216875 ], "position_mm": [ - -19.311415934851407, - -186.97653469693006, - -26.50726165326947 + -21.255606940066784, + -188.01819690343262, + -27.179039698216876 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 66, "position_m": [ - 0.21606554625551835, - -0.3587307601391551, - -0.024788136377347024 + 0.20987276350792824, + -0.36338837648039785, + -0.027274993584734897 ], "position_mm": [ - 216.06554625551834, - -358.7307601391551, - -24.788136377347023 + 209.87276350792825, + -363.3883764803978, + -27.274993584734897 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 68, "position_m": [ - 0.5700081839874442, - 0.17227552203356292, - -0.020966733825936768 + 0.5737432035845004, + 0.1704810903666484, + -0.02734726902910839 ], "position_mm": [ - 570.0081839874442, - 172.2755220335629, - -20.966733825936767 + 573.7432035845004, + 170.4810903666484, + -27.34726902910839 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 69, "position_m": [ - 0.01606058427016535, - -0.27863620345839213, - -0.024050819698399103 + 0.00755574141251021, + -0.28110924567195544, + -0.027461901502363727 ], "position_mm": [ - 16.06058427016535, - -278.6362034583921, - -24.050819698399103 + 7.55574141251021, + -281.1092456719554, + -27.461901502363727 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 72, "position_m": [ - 0.43309377081875733, - 0.20407063379317097, - -0.03366854493680052 + 0.4406145001061791, + 0.19397689288267184, + -0.026942116326505443 ], "position_mm": [ - 433.0937708187573, - 204.07063379317097, - -33.66854493680052 + 440.6145001061791, + 193.97689288267185, + -26.94211632650544 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 73, "position_m": [ - 0.2242973122178266, - 0.32936312562239684, - -0.026995858795568893 + 0.22176314591781232, + 0.33300396234440044, + -0.02709735120117999 ], "position_mm": [ - 224.2973122178266, - 329.3631256223968, - -26.995858795568893 + 221.76314591781232, + 333.00396234440046, + -27.09735120117999 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 74, "position_m": [ - 0.08475466117863692, - 0.12208473354911287, - -0.0031657385117373495 + 0.09385544036167941, + 0.14448848538356282, + -0.027182652876823386 ], "position_mm": [ - 84.75466117863692, - 122.08473354911287, - -3.1657385117373495 + 93.85544036167941, + 144.48848538356282, + -27.182652876823386 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 75, "position_m": [ - -0.020246016635978782, - 0.21963995627837535, - -0.05847879587228368 + -0.025763998800622002, + 0.19444176428774437, + -0.027301932107234264 ], "position_mm": [ - -20.246016635978783, - 219.63995627837534, - -58.47879587228368 + -25.763998800622, + 194.44176428774438, + -27.301932107234265 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 77, "position_m": [ - -0.02332857373814633, - 0.35758004759490997, - -0.2973088924687588 + 0.018169208444387453, + 0.19143990930014382, + -0.02706833088952131 ], "position_mm": [ - -23.328573738146332, - 357.58004759490996, - -297.3088924687588 + 18.169208444387454, + 191.43990930014382, + -27.06833088952131 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 79, "position_m": [ - 0.31140858591456766, - -0.16062607243756685, - -0.028880573550973523 + 0.3126746054816076, + -0.158717625668886, + -0.027311371106187077 ], "position_mm": [ - 311.40858591456765, - -160.62607243756685, - -28.880573550973523 + 312.67460548160756, + -158.717625668886, + -27.311371106187078 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 81, "position_m": [ - 0.1377617139852063, - 0.18229654891083222, - -0.043053305675717836 + 0.13204212954394157, + 0.16914390659535763, + -0.027480032106360967 ], "position_mm": [ - 137.7617139852063, - 182.29654891083223, - -43.05330567571784 + 132.04212954394157, + 169.14390659535763, + -27.480032106360966 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 82, "position_m": [ - 0.2112801742734882, - 0.2790429148071016, - -0.00593931018486768 + 0.21925812882956283, + 0.29746581757501084, + -0.027729774106746444 ], "position_mm": [ - 211.2801742734882, - 279.04291480710157, - -5.93931018486768 + 219.25812882956282, + 297.4658175750108, + -27.729774106746444 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 83, "position_m": [ - 0.055013790042519654, - 0.36069462280513026, - -0.05294901635948005 + 0.04421333122656243, + 0.3393763402679264, + -0.02742588305408099 ], "position_mm": [ - 55.01379004251965, - 360.6946228051303, - -52.949016359480055 + 44.21333122656243, + 339.3763402679264, + -27.42588305408099 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 84, "position_m": [ - 0.3950453580385908, - 0.2772761867353298, - -0.03683680737639849 + 0.4074264090263185, + 0.2583730126516718, + -0.027292223270580108 ], "position_mm": [ - 395.0453580385908, - 277.27618673532976, - -36.83680737639849 + 407.4264090263185, + 258.3730126516718, + -27.29222327058011 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 85, "position_m": [ - 0.5047824695340085, - -0.3120210496432309, - -0.02862498233440109 + 0.5044103136812026, + -0.3125915793033571, + -0.027504006275488692 ], "position_mm": [ - 504.7824695340085, - -312.0210496432309, - -28.62498233440109 + 504.4103136812026, + -312.59157930335715, + -27.504006275488692 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 86, "position_m": [ - 0.36343835760467236, - 0.29083273079168975, - -0.027959808797070284 + 0.36328902745790426, + 0.2916071825316134, + -0.026986852007204486 ], "position_mm": [ - 363.4383576046724, - 290.83273079168976, - -27.959808797070284 + 363.28902745790424, + 291.6071825316134, + -26.986852007204487 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 92, "position_m": [ - 0.648438998084497, - -0.19147171931201065, - -0.027168982413039514 + 0.645416075566258, + -0.18508625058963127, + -0.027223376810718493 ], "position_mm": [ - 648.438998084497, - -191.47171931201066, - -27.168982413039515 + 645.416075566258, + -185.08625058963128, + -27.22337681071849 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 95, "position_m": [ - 0.18898933657207065, - -0.2727868842406354, - -0.025631037100150297 + 0.1858664135424314, + -0.2742319048544393, + -0.02721831151586433 ], "position_mm": [ - 188.98933657207064, - -272.7868842406354, - -25.631037100150298 + 185.86641354243142, + -274.23190485443934, + -27.21831151586433 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 96, "position_m": [ - 0.36912277687798833, - -0.18855283423347605, - -0.028458096734912945 + 0.3694396203720345, + -0.18635894103784878, + -0.027280841967275808 ], "position_mm": [ - 369.1227768779883, - -188.55283423347603, - -28.458096734912946 + 369.4396203720345, + -186.35894103784878, + -27.28084196727581 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 97, "position_m": [ - 0.3074397972605943, - -0.35570356406958475, - -0.025832179420471807 + 0.30415826635665294, + -0.35976880250839965, + -0.027100580288146162 ], "position_mm": [ - 307.4397972605943, - -355.70356406958473, - -25.832179420471807 + 304.1582663566529, + -359.76880250839963, + -27.100580288146162 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 102, "position_m": [ - 0.6556381590624528, - -0.2270895504257825, - -0.03566043278927424 + 0.6498559253369631, + -0.2227950825046267, + -0.02779028826842327 ], "position_mm": [ - 655.6381590624528, - -227.0895504257825, - -35.66043278927424 + 649.8559253369631, + -222.79508250462672, + -27.790288268423268 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 103, "position_m": [ - 0.10600529640978833, - -0.1873398386552967, - -0.027818012802384738 + 0.10598409663240727, + -0.1876934030826573, + -0.027530516744529852 ], "position_mm": [ - 106.00529640978833, - -187.3398386552967, - -27.81801280238474 + 105.98409663240727, + -187.6934030826573, + -27.53051674452985 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 105, "position_m": [ - 0.5254125670481129, - -0.2681971642720504, - -0.02796420389119132 + 0.5246936834016044, + -0.26645325107210227, + -0.027102835841396843 ], "position_mm": [ - 525.4125670481129, - -268.19716427205043, - -27.964203891191318 + 524.6936834016044, + -266.45325107210226, + -27.102835841396843 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 113, "position_m": [ - 0.3881808776542281, - -0.03320691424453553, - 0.2686501264315494 + 0.406306212975191, + -0.06894271060790462, + 0.22063552252341065 ], "position_mm": [ - 388.1808776542281, - -33.206914244535525, - 268.6501264315494 + 406.306212975191, + -68.94271060790462, + 220.63552252341066 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 115, "position_m": [ - 0.3262062519991027, - -0.1596679141497278, - 0.2745459169610198 + 0.34593195670164295, + -0.0652549391327112, + 0.21577719919627816 ], "position_mm": [ - 326.2062519991027, - -159.6679141497278, - 274.5459169610198 + 345.93195670164295, + -65.2549391327112, + 215.77719919627816 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -0.7071067811865475, + 0.0, + -0.7071067811865475 + ] }, { "marker_id": 122, "position_m": [ - 0.37010034466195196, - -0.12066831288775577, - 0.31943120784418927 + 0.3623663857308669, + -0.019072711453021453, + 0.2726542666118881 ], "position_mm": [ - 370.10034466195197, - -120.66831288775577, - 319.43120784418926 + 362.36638573086685, + -19.07271145302145, + 272.6542666118881 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -1.0, + 0.0, + 0.0 + ] }, { "marker_id": 124, "position_m": [ - 0.3670303281623567, - -0.1834319085337774, - 0.2562859856503314 + 0.3622967098084236, + -0.10812751956849523, + 0.21272619936068318 ], "position_mm": [ - 367.0303281623567, - -183.43190853377737, - 256.2859856503314 + 362.2967098084236, + -108.12751956849523, + 212.72619936068318 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -1.0, + 0.0, + 0.0 + ] }, { "marker_id": 205, "position_m": [ - 0.7342483829218235, - -0.10924269715787209, - 0.03942157899859458 + 0.750084878378726, + -0.08999180999484437, + 0.0003863732190603025 ], "position_mm": [ - 734.2483829218235, - -109.24269715787209, - 39.42157899859458 + 750.084878378726, + -89.99180999484436, + 0.38637321906030253 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 206, "position_m": [ - 0.6484625381211852, - -0.0063490528836260334, - 0.0038602697671912987 + 0.6499859131167766, + -0.009646345575546049, + 0.00013050963098775242 ], "position_mm": [ - 648.4625381211852, - -6.349052883626033, - 3.8602697671912987 + 649.9859131167766, + -9.646345575546048, + 0.13050963098775242 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 207, "position_m": [ - 0.7497149617850667, - -0.0031153139731276316, - 0.0029488243690723665 + 0.7507132787293569, + -0.009535114104152738, + -0.0003780564061822259 ], "position_mm": [ - 749.7149617850666, - -3.115313973127632, - 2.9488243690723666 + 750.713278729357, + -9.535114104152738, + -0.3780564061822259 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 208, "position_m": [ - 0.349164898069492, - -0.10190853583916244, - 0.002842144851479469 + 0.34999484340873555, + -0.09004625214657956, + 0.0003044471593212442 ], "position_mm": [ - 349.16489806949204, - -101.90853583916244, - 2.842144851479469 + 349.99484340873556, + -90.04625214657956, + 0.3044471593212442 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 210, "position_m": [ - 0.017785564239698168, - -0.01705599117575304, - 0.0034780454112439277 + 0.020197100885936306, + -0.019672233905416562, + -9.432218596201098e-05 ], "position_mm": [ - 17.785564239698168, - -17.05599117575304, - 3.4780454112439276 + 20.197100885936305, + -19.67223390541656, + -0.09432218596201097 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 211, "position_m": [ - 0.24969922847055254, - -0.00833057987208165, - 0.003907233877621789 + 0.24970650058471464, + -0.009733770306651957, + 0.00015592780785901754 ], "position_mm": [ - 249.69922847055253, - -8.33057987208165, - 3.907233877621789 + 249.70650058471463, + -9.733770306651957, + 0.15592780785901755 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 214, "position_m": [ - 0.349378669487225, - -0.009215415022042085, - 0.00611350165445435 + 0.3496596168465944, + -0.01009872866262521, + 0.0005453862194602949 ], "position_mm": [ - 349.378669487225, - -9.215415022042084, - 6.11350165445435 + 349.6596168465944, + -10.09872866262521, + 0.5453862194602949 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 215, "position_m": [ - 0.248249106327495, - -0.09967254590100509, - 0.002705057531327002 + 0.25004283274211697, + -0.08991721617963214, + 0.0004237151413322776 ], "position_mm": [ - 248.249106327495, - -99.6725459010051, - 2.705057531327002 + 250.04283274211699, + -89.91721617963213, + 0.4237151413322776 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 217, "position_m": [ - 0.6541943128716132, - -0.10491351237266673, - 0.006443825482350651 + 0.6502202803239158, + -0.0896760740485087, + 8.808816296974863e-05 ], "position_mm": [ - 654.1943128716132, - -104.91351237266673, - 6.443825482350651 + 650.2202803239157, + -89.67607404850871, + 0.08808816296974863 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 231, + "position_m": [ + 0.3800267011983782, + 0.09723279901521602, + 0.3444213213734971 + ], + "position_mm": [ + 380.02670119837825, + 97.23279901521602, + 344.4213213734971 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.7071067811865475, + 0.7071067811865475 + ] }, { "marker_id": 242, "position_m": [ - 0.29443841678390603, - 0.08517206308396548, - 0.38690571318243044 + 0.28989346127624344, + 0.055251168644866074, + 0.3076146980783263 ], "position_mm": [ - 294.438416783906, - 85.17206308396548, - 386.9057131824304 + 289.89346127624344, + 55.25116864486608, + 307.6146980783263 ], - "link": "Arm1" + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + -1.0 + ] }, { "marker_id": 243, "position_m": [ - 0.23227009996317585, - -0.06768781829758978, - 0.5980139826894932 + 0.29003939154155983, + 0.08827374048338495, + 0.34508499365097506 ], "position_mm": [ - 232.27009996317585, - -67.68781829758979, - 598.0139826894932 + 290.03939154155984, + 88.27374048338494, + 345.08499365097504 ], - "link": "Arm1" + "link": "Arm1", + "normal": [ + 0.0, + -1.0, + 0.0 + ] }, { "marker_id": 246, "position_m": [ - 0.300253542020094, - -0.08068324718750165, - 0.5922886528066482 + 0.3799140142192884, + 0.07091170512535183, + 0.33918016355014696 ], "position_mm": [ - 300.253542020094, - -80.68324718750165, - 592.2886528066482 + 379.9140142192884, + 70.91170512535183, + 339.180163550147 ], - "link": "Ellbow" + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 247, "position_m": [ - 0.27205825932733146, - -0.08001400386920078, - 0.592030183756874 + 0.34249986610484184, + 0.07098597957188753, + 0.3391879731705899 ], "position_mm": [ - 272.0582593273315, - -80.01400386920078, - 592.030183756874 + 342.49986610484183, + 70.98597957188753, + 339.1879731705899 ], - "link": "Ellbow" + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + 1.0 + ] } ] } \ No newline at end of file diff --git a/data/evaluations/Scene5/aruco_positions_optimized.json b/data/evaluations/Scene5/aruco_positions_optimized.json index 75033cb..13d25d5 100644 --- a/data/evaluations/Scene5/aruco_positions_optimized.json +++ b/data/evaluations/Scene5/aruco_positions_optimized.json @@ -1,781 +1,1075 @@ { "schema_version": "1.2", - "created_utc": "2026-05-31T08:42:58Z", + "created_utc": "2026-06-01T19:02:43Z", "summary": { "num_cameras": 7, - "num_markers": 55, - "num_constraints": 89 + "num_markers": 56, + "num_constraints": 94 }, "markers": [ { "marker_id": 41, "position_m": [ - 0.3648011321705721, - -0.14643841809454972, - 0.18972937633293152 + 0.3668983666968734, + -0.16262742859658788, + 0.16629055149437 ], "position_mm": [ - 364.8011321705721, - -146.43841809454972, - 189.7293763329315 + 366.89836669687344, + -162.6274285965879, + 166.29055149437 ], - "link": "FingerA" + "link": "FingerA", + "normal": [ + 0.0, + -0.9375276894468237, + 0.34791066600565723 + ] }, { "marker_id": 42, "position_m": [ - 0.3731845692625049, - -0.17078928092159862, - 0.14991572151544888 + 0.3781536758299953, + -0.182821552912383, + 0.12489303939318709 ], "position_mm": [ - 373.18456926250485, - -170.78928092159862, - 149.9157215154489 + 378.15367582999534, + -182.821552912383, + 124.8930393931871 ], - "link": "FingerA" + "link": "FingerA", + "normal": [ + 0.8830215713766957, + -0.3090575499818435, + 0.3532086285506783 + ] }, { "marker_id": 43, "position_m": [ - 0.326865876249431, - -0.1572287874985, - 0.16914575382028169 + 0.33147946924251426, + -0.14925303742152896, + 0.1381334956183035 ], "position_mm": [ - 326.865876249431, - -157.2287874985, - 169.1457538202817 + 331.47946924251426, + -149.25303742152894, + 138.1334956183035 ], - "link": "FingerB" + "link": "FingerB", + "normal": [ + 0.4224220616915755, + 0.0, + 0.9063992507699015 + ] }, { "marker_id": 46, "position_m": [ - 0.5511064138835953, - 0.19631028103427958, - -0.04635476096669423 + 0.5367082536974385, + 0.18527421311582715, + -0.027348711750685498 ], "position_mm": [ - 551.1064138835952, - 196.31028103427957, - -46.354760966694236 + 536.7082536974384, + 185.27421311582714, + -27.3487117506855 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 47, "position_m": [ - 0.3427887478889181, - -0.2891877794664311, - -0.029215701908143283 + 0.3443101102305359, + -0.2866187383319009, + -0.02721389381820845 ], "position_mm": [ - 342.7887478889181, - -289.1877794664311, - -29.215701908143284 + 344.31011023053594, + -286.6187383319009, + -27.213893818208447 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 51, "position_m": [ - 0.16751307706319918, - -0.1682099286568666, - -0.03481766674302241 + 0.1678343115625662, + -0.17209040270220877, + -0.02736701627752163 ], "position_mm": [ - 167.51307706319918, - -168.2099286568666, - -34.817666743022414 + 167.8343115625662, + -172.09040270220876, + -27.367016277521632 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 52, "position_m": [ - 0.09203836571582896, - 0.2054251530261849, - -0.025518367221198157 + 0.09475259284240561, + 0.20848373987901606, + -0.027106964286739935 ], "position_mm": [ - 92.03836571582896, - 205.4251530261849, - -25.518367221198158 + 94.75259284240562, + 208.48373987901604, + -27.106964286739935 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 53, "position_m": [ - 0.4883192549891964, - 0.21403304962981504, - -0.029441863648241466 + 0.4861813768823861, + 0.21214791967184773, + -0.027298950544006335 ], "position_mm": [ - 488.31925498919645, - 214.03304962981503, - -29.441863648241466 + 486.18137688238613, + 212.14791967184775, + -27.298950544006335 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 54, "position_m": [ - 0.3392713672780587, - -0.3277145232810788, - -0.008060036572332898 + 0.3422329049835335, + -0.3306632938345787, + -0.027133255094437776 ], "position_mm": [ - 339.2713672780587, - -327.7145232810788, - -8.060036572332898 + 342.2329049835335, + -330.6632938345787, + -27.133255094437775 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 55, "position_m": [ - 0.28348963427474705, - -0.26242040541353673, - -0.027583182887169634 + 0.2837583624576382, + -0.2627644363694878, + -0.027218866067172668 ], "position_mm": [ - 283.48963427474706, - -262.42040541353674, - -27.583182887169635 + 283.7583624576382, + -262.76443636948784, + -27.21886606717267 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 56, "position_m": [ - 0.5123492434341672, - 0.1818589165187949, - -0.05042369947907831 + 0.4986421010574931, + 0.16858672822975587, + -0.0272501129974518 ], "position_mm": [ - 512.3492434341672, - 181.8589165187949, - -50.42369947907831 + 498.6421010574931, + 168.58672822975586, + -27.2501129974518 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 58, "position_m": [ - 0.04989744820108467, - -0.21387185958391247, - -0.03661658837196917 + 0.05011421095098151, + -0.21803368786966118, + -0.027305747845789336 ], "position_mm": [ - 49.897448201084664, - -213.87185958391248, - -36.61658837196917 + 50.11421095098151, + -218.03368786966118, + -27.305747845789337 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 61, "position_m": [ - -0.012175188963493584, - 0.36090707976593617, - -0.056028221467720976 + -0.02244407110780901, + 0.33632940053748944, + -0.02759643442764882 ], "position_mm": [ - -12.175188963493584, - 360.90707976593615, - -56.028221467720975 + -22.444071107809012, + 336.32940053748945, + -27.59643442764882 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 62, "position_m": [ - 0.4040829569545171, - -0.18098337050356866, - -0.028708659019672036 + 0.40463024170664, + -0.17508909577736922, + -0.027389479516054464 ], "position_mm": [ - 404.0829569545171, - -180.98337050356866, - -28.708659019672037 + 404.63024170664005, + -175.08909577736924, + -27.389479516054465 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 63, "position_m": [ - 0.7964971556488843, - -0.245084666785164, - -0.05241624501799096 + 0.777409174763789, + -0.23621793988996534, + -0.027619307453738633 ], "position_mm": [ - 796.4971556488844, - -245.084666785164, - -52.41624501799096 + 777.409174763789, + -236.21793988996535, + -27.61930745373863 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 64, "position_m": [ - -0.02191512955309043, - -0.18621243019042436, - -0.028682644652570807 + -0.021277368328502015, + -0.18822926613594734, + -0.027251355862714013 ], "position_mm": [ - -21.91512955309043, - -186.21243019042436, - -28.682644652570808 + -21.277368328502014, + -188.22926613594734, + -27.251355862714014 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 66, "position_m": [ - 0.2112317020751818, - -0.3585132389142793, - -0.022830333430919576 + 0.20973489764001532, + -0.3632392788864606, + -0.027299758449837824 ], "position_mm": [ - 211.2317020751818, - -358.51323891427927, - -22.830333430919577 + 209.73489764001533, + -363.2392788864606, + -27.299758449837825 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 68, "position_m": [ - 0.5700055379830983, - 0.17211625918448076, - -0.02091870857850832 + 0.5737313375790203, + 0.17048193337215453, + -0.02733703458171003 ], "position_mm": [ - 570.0055379830983, - 172.11625918448075, - -20.91870857850832 + 573.7313375790203, + 170.48193337215454, + -27.337034581710032 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 69, "position_m": [ - 0.016610294362560896, - -0.2786291038945729, - -0.014603405699775498 + 0.0074640609154423155, + -0.28101868567315813, + -0.027429381884186352 ], "position_mm": [ - 16.610294362560897, - -278.6291038945729, - -14.603405699775498 + 7.464060915442316, + -281.01868567315813, + -27.429381884186352 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 72, "position_m": [ - 0.44167055977556335, - 0.20070147596875706, - -0.033412918848095524 + 0.4409076064405219, + 0.19426358909029348, + -0.02712150300203632 ], "position_mm": [ - 441.67055977556333, - 200.70147596875705, - -33.41291884809552 + 440.90760644052193, + 194.2635890902935, + -27.12150300203632 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 73, "position_m": [ - 0.2212494774743102, - 0.33327877763529046, - -0.026573789626283796 + 0.22178681313658333, + 0.33303716936732614, + -0.02711664255776693 ], "position_mm": [ - 221.2494774743102, - 333.27877763529045, - -26.573789626283798 + 221.78681313658333, + 333.03716936732616, + -27.11664255776693 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 74, "position_m": [ - 0.09159814216350823, - 0.14426258138808765, - -0.030382718680150328 + 0.09375531217723018, + 0.14434178212735055, + -0.02703247826584338 ], "position_mm": [ - 91.59814216350823, - 144.26258138808765, - -30.38271868015033 + 93.75531217723018, + 144.34178212735054, + -27.03247826584338 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 75, "position_m": [ - -0.027591923052651096, - 0.19816371923464401, - -0.03394948169276834 + -0.0256720313704232, + 0.1944286579217622, + -0.027250980873742846 ], "position_mm": [ - -27.591923052651097, - 198.16371923464402, - -33.94948169276834 + -25.672031370423202, + 194.4286579217622, + -27.250980873742847 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 77, "position_m": [ - 0.01563143500295418, - 0.199675523323058, - -0.04200225994035828 + 0.018226944298585655, + 0.1915541211065334, + -0.02715377612401446 ], "position_mm": [ - 15.63143500295418, - 199.675523323058, - -42.00225994035828 + 18.226944298585654, + 191.5541211065334, + -27.15377612401446 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 79, "position_m": [ - 0.31124427916409236, - -0.16080777238140614, - -0.028385442144214172 + 0.3123752463469038, + -0.1588922283544559, + -0.02750891980669492 ], "position_mm": [ - 311.24427916409235, - -160.80777238140615, - -28.38544214421417 + 312.3752463469038, + -158.8922283544559, + -27.50891980669492 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 81, "position_m": [ - 0.1307089912043717, - 0.16697749903046405, - -0.02512959076818571 + 0.13215885515019454, + 0.16880309176951377, + -0.02718244435465877 ], "position_mm": [ - 130.7089912043717, - 166.97749903046406, - -25.12959076818571 + 132.15885515019454, + 168.80309176951377, + -27.18244435465877 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 82, "position_m": [ - 0.21678198730078885, - 0.29759701681316747, - -0.026915616541411336 + 0.21926260278280887, + 0.2971655707585168, + -0.027460708544017907 ], "position_mm": [ - 216.78198730078884, - 297.59701681316744, - -26.915616541411335 + 219.26260278280887, + 297.1655707585168, + -27.46070854401791 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 83, "position_m": [ - 0.04233364459883416, - 0.3382595543302905, - -0.025040065690528343 + 0.04415478712902471, + 0.339322219200544, + -0.027442596218632355 ], "position_mm": [ - 42.33364459883416, - 338.2595543302905, - -25.040065690528344 + 44.15478712902471, + 339.322219200544, + -27.442596218632357 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 84, "position_m": [ - 0.4066043622380977, - 0.26392628319530864, - -0.03139634464381274 + 0.4074562952947026, + 0.25838876185939386, + -0.027300848565521646 ], "position_mm": [ - 406.6043622380977, - 263.92628319530866, - -31.39634464381274 + 407.4562952947026, + 258.38876185939387, + -27.300848565521648 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 85, "position_m": [ - 0.5051637424164694, - -0.3147684997715523, - -0.028844718989980967 + 0.5044818006940952, + -0.3128205954122554, + -0.027379160005760496 ], "position_mm": [ - 505.16374241646946, - -314.7684997715523, - -28.84471898998097 + 504.4818006940952, + -312.8205954122554, + -27.379160005760497 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 86, "position_m": [ - 0.3605584735274213, - 0.29547413475036255, - -0.029996732680063417 + 0.3630007184518053, + 0.29216956233221547, + -0.027215390690458346 ], "position_mm": [ - 360.5584735274213, - 295.47413475036257, - -29.996732680063417 + 363.0007184518053, + 292.1695623322155, + -27.215390690458346 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 92, "position_m": [ - 0.6478658222444716, - -0.18750647979595778, - -0.026939082474986057 + 0.6452282421735954, + -0.18472913301372543, + -0.02730935909190101 ], "position_mm": [ - 647.8658222444717, - -187.50647979595777, - -26.93908247498606 + 645.2282421735954, + -184.72913301372543, + -27.30935909190101 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 95, "position_m": [ - 0.186840640106035, - -0.2695802707824018, - -0.025591922607769716 + 0.18591400288907065, + -0.27410886407777824, + -0.027238365517756206 ], "position_mm": [ - 186.84064010603498, - -269.58027078240184, - -25.591922607769718 + 185.91400288907064, + -274.1088640777782, + -27.238365517756208 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 96, "position_m": [ - 0.36825690451670035, - -0.18911957052566786, - -0.029076320346612186 + 0.36971875451184777, + -0.18653532563698286, + -0.02729300568291305 ], "position_mm": [ - 368.25690451670033, - -189.11957052566785, - -29.076320346612185 + 369.71875451184775, + -186.53532563698286, + -27.29300568291305 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 97, "position_m": [ - 0.3056076327245882, - -0.35439634134873793, - -0.02899799131347532 + 0.3043381953671399, + -0.35977616324679085, + -0.027062332985047188 ], "position_mm": [ - 305.6076327245882, - -354.3963413487379, - -28.99799131347532 + 304.3381953671399, + -359.7761632467909, + -27.06233298504719 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 102, "position_m": [ - 0.6539355068388856, - -0.2250370180668092, - -0.032593759887933144 + 0.6498078513221139, + -0.22289038962716723, + -0.027611375068749847 ], "position_mm": [ - 653.9355068388855, - -225.0370180668092, - -32.593759887933146 + 649.807851322114, + -222.89038962716722, + -27.611375068749847 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 103, "position_m": [ - 0.10719801068193267, - -0.188380307056187, - -0.027422236112501722 + 0.10571297756113167, + -0.18759518886919188, + -0.027446225988362764 ], "position_mm": [ - 107.19801068193267, - -188.380307056187, - -27.42223611250172 + 105.71297756113167, + -187.59518886919187, + -27.446225988362766 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 105, "position_m": [ - 0.5266580395239618, - -0.26883010683504005, - -0.02823273806880547 + 0.5247160892568289, + -0.2663100669140422, + -0.027132080944265606 ], "position_mm": [ - 526.6580395239619, - -268.83010683504006, - -28.232738068805467 + 524.7160892568289, + -266.3100669140422, + -27.132080944265606 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 113, "position_m": [ - 0.3929777707734413, - -0.08101390535388868, - 0.25889589816103964 + 0.40627666868978884, + -0.06907531462534046, + 0.22080461289870215 ], "position_mm": [ - 392.9777707734413, - -81.01390535388867, - 258.89589816103967 + 406.27666868978883, + -69.07531462534045, + 220.80461289870215 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 115, "position_m": [ - 0.3229725797609112, - -0.11343010828974076, - 0.2869651835495714 + 0.34600939894102023, + -0.06541430234175337, + 0.21583467950121318 ], "position_mm": [ - 322.97257976091123, - -113.43010828974076, - 286.9651835495714 + 346.0093989410202, + -65.41430234175337, + 215.83467950121317 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -0.7071067811865475, + 0.0, + -0.7071067811865475 + ] }, { "marker_id": 122, "position_m": [ - 0.34479118447139273, - -0.05785106464409772, - 0.3278071608782708 + 0.3624413199779874, + -0.01940691001599499, + 0.27263252885579925 ], "position_mm": [ - 344.79118447139274, - -57.85106464409772, - 327.8071608782708 + 362.4413199779874, + -19.40691001599499, + 272.63252885579925 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -1.0, + 0.0, + 0.0 + ] }, { "marker_id": 124, "position_m": [ - 0.35379894566006603, - -0.12513353663858923, - 0.255353166726964 + 0.3624500164052124, + -0.1079253060223497, + 0.21281045399551185 ], "position_mm": [ - 353.798945660066, - -125.13353663858922, - 255.35316672696402 + 362.4500164052124, + -107.9253060223497, + 212.81045399551186 ], - "link": "Arm2" + "link": "Arm2", + "normal": [ + -1.0, + 0.0, + 0.0 + ] }, { "marker_id": 205, "position_m": [ - 0.7488273978396515, - -0.09421474194077328, - 0.011634274101033994 + 0.7500855594375708, + -0.09001150665640828, + 0.00041520560194364703 ], "position_mm": [ - 748.8273978396514, - -94.21474194077328, - 11.634274101033993 + 750.0855594375709, + -90.01150665640829, + 0.41520560194364703 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 206, "position_m": [ - 0.6470358766630553, - -0.013771269419647496, - 0.007446984219844249 + 0.6501529926364698, + -0.009827433871951542, + 0.0001863116817642774 ], "position_mm": [ - 647.0358766630553, - -13.771269419647496, - 7.446984219844249 + 650.1529926364698, + -9.827433871951543, + 0.1863116817642774 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 207, "position_m": [ - 0.7468893650238416, - -0.014247076788111579, - 0.012835302131853635 + 0.7501528247694234, + -0.01001181869531142, + 0.0002022769713001225 ], "position_mm": [ - 746.8893650238416, - -14.24707678811158, - 12.835302131853636 + 750.1528247694233, + -10.01181869531142, + 0.2022769713001225 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 208, "position_m": [ - 0.34952808605868707, - -0.09339423930378817, - 0.0024206241979595174 + 0.3501033852739628, + -0.08990246850927484, + 0.00035217562159193904 ], "position_mm": [ - 349.52808605868705, - -93.39423930378817, - 2.4206241979595173 + 350.1033852739628, + -89.90246850927484, + 0.35217562159193905 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 210, "position_m": [ - 0.01839055224687664, - -0.018199478743466096, - 0.0015396265329424537 + 0.020052556554971027, + -0.019989957078735566, + 0.00020183621855765906 ], "position_mm": [ - 18.39055224687664, - -18.199478743466095, - 1.5396265329424537 + 20.052556554971027, + -19.989957078735564, + 0.20183621855765904 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 211, "position_m": [ - 0.25029208142308085, - -0.01314282895587427, - 0.005540678825750451 + 0.24983013467902312, + -0.00991461994860066, + 0.0002532468926771275 ], "position_mm": [ - 250.29208142308084, - -13.14282895587427, - 5.540678825750451 + 249.83013467902313, + -9.91461994860066, + 0.2532468926771275 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 214, "position_m": [ - 0.3503814492270893, - -0.013433545982671257, - 0.00478133945197722 + 0.34984585287500614, + -0.009902941936170934, + 0.00025782312037350865 ], "position_mm": [ - 350.3814492270893, - -13.433545982671257, - 4.78133945197722 + 349.84585287500613, + -9.902941936170935, + 0.25782312037350863 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 215, "position_m": [ - 0.2484538587750239, - -0.09300813348681763, - 0.0012765308002101786 + 0.25001782638523373, + -0.08991439253924605, + 0.0002913118077363806 ], "position_mm": [ - 248.45385877502392, - -93.00813348681764, - 1.2765308002101785 + 250.01782638523372, + -89.91439253924605, + 0.2913118077363806 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 217, "position_m": [ - 0.6501199140733472, - -0.09364309672558822, - 0.004127630274393995 + 0.650203457503112, + -0.08982732800492235, + 6.563220656559706e-05 ], "position_mm": [ - 650.1199140733472, - -93.64309672558822, - 4.1276302743939945 + 650.2034575031121, + -89.82732800492235, + 0.06563220656559707 ], - "link": "Board" + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 231, + "position_m": [ + 0.38000933625144484, + 0.09702795372824102, + 0.3443712658330114 + ], + "position_mm": [ + 380.00933625144484, + 97.02795372824102, + 344.3712658330114 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.7071067811865475, + 0.7071067811865475 + ] }, { "marker_id": 242, "position_m": [ - 0.24796404902447716, - -0.006085384069828635, - 0.4390181011718798 + 0.2899230371163785, + 0.055391010474236946, + 0.3076369974422148 ], "position_mm": [ - 247.96404902447716, - -6.085384069828635, - 439.0181011718798 + 289.9230371163785, + 55.39101047423694, + 307.6369974422148 ], - "link": "Arm1" + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + -1.0 + ] }, { "marker_id": 243, "position_m": [ - 0.22315999835472475, - -0.04404187723595726, - 0.4191627769661677 + 0.29007025784004925, + 0.08802225532940203, + 0.34485501162858095 ], "position_mm": [ - 223.15999835472473, - -44.04187723595726, - 419.1627769661677 + 290.07025784004924, + 88.02225532940203, + 344.85501162858094 ], - "link": "Arm1" + "link": "Arm1", + "normal": [ + 0.0, + -1.0, + 0.0 + ] }, { "marker_id": 246, "position_m": [ - 0.3067312166782816, - -0.04575358162426518, - 0.3975077760415219 + 0.3799075576943633, + 0.0707670617936637, + 0.33908157078210666 ], "position_mm": [ - 306.7312166782816, - -45.75358162426518, - 397.5077760415219 + 379.9075576943633, + 70.7670617936637, + 339.08157078210667 ], - "link": "Ellbow" + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + 1.0 + ] }, { "marker_id": 247, "position_m": [ - 0.2703452460684435, - -0.05085600544281668, - 0.4050093525519926 + 0.34240793934199587, + 0.07061181667569899, + 0.33914456498414847 ], "position_mm": [ - 270.3452460684435, - -50.85600544281668, - 405.0093525519926 + 342.40793934199587, + 70.61181667569899, + 339.1445649841485 ], - "link": "Ellbow" + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + 1.0 + ] } ] } \ No newline at end of file diff --git a/data/evaluations/Scene5/render_a_aruco_detection.json b/data/evaluations/Scene5/render_a_aruco_detection.json index 77abbc6..a582a1d 100644 --- a/data/evaluations/Scene5/render_a_aruco_detection.json +++ b/data/evaluations/Scene5/render_a_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:43Z", + "created_utc": "2026-06-01T19:02:32Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,7 +35,7 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_a.png", - "image_sha256": "cd520e496c2ba52df05dae892d940cc62454b21809c22c07d0d8c7a9d8c1c4da", + "image_sha256": "3c49eea929954cd3d498869ae2578e20e5c291fd169e9350b89578b8835a458c", "width_px": 1280, "height_px": 720 }, @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "c761f4cb-430b-4b63-a282-f658feb6b5bb", + "observation_id": "26009bc3-d9ad-4c34-87b9-bfa9c97f1809", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.9534814647781058 }, { - "observation_id": "28b422c4-49b0-4d12-90ab-891b182a2c1c", + "observation_id": "6b79f1d9-c62f-4758-be9c-496b38d8367b", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -130,14 +130,14 @@ "area_px": 1384.0, "perimeter_px": 148.8763656616211, "sharpness": { - "laplacian_var": 2856.666514132721 + "laplacian_var": 2856.677360119706 }, "contrast": { "p05": 50.0, "p95": 192.0, "dynamic_range": 142.0, - "mean_gray": 93.28199566160521, - "std_gray": 60.43164225115306 + "mean_gray": 93.27982646420824, + "std_gray": 60.433159907916334 }, "geometry": { "distance_to_center_norm": 0.38883718848228455, @@ -154,7 +154,7 @@ "confidence": 0.8810013242977345 }, { - "observation_id": "45b8687d-ba81-4f33-88d1-fd7d87b8f448", + "observation_id": "0aecba85-0635-40f4-a6a4-abb8d39a93ab", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -184,14 +184,14 @@ "area_px": 1307.5, "perimeter_px": 144.99626541137695, "sharpness": { - "laplacian_var": 2820.027348237219 + "laplacian_var": 2820.2062848189203 }, "contrast": { "p05": 28.0, "p95": 190.0, "dynamic_range": 162.0, - "mean_gray": 86.08599779492833, - "std_gray": 70.74465545766401 + "mean_gray": 86.08820286659316, + "std_gray": 70.74538522099441 }, "geometry": { "distance_to_center_norm": 0.27732402086257935, @@ -208,7 +208,7 @@ "confidence": 0.7733614724853967 }, { - "observation_id": "d023eb75-5749-4d1a-9c6e-94033767c2ad", + "observation_id": "9d38c2b0-a4e5-422e-af5c-1b5b1149c476", "type": "aruco", "marker_id": 47, "marker_size_m": 0.025, @@ -238,14 +238,14 @@ "area_px": 1029.5, "perimeter_px": 132.67654037475586, "sharpness": { - "laplacian_var": 4005.44773854394 + "laplacian_var": 4005.2702737552077 }, "contrast": { "p05": 10.0, "p95": 176.0, "dynamic_range": 166.0, - "mean_gray": 69.46338028169014, - "std_gray": 72.10171363913938 + "mean_gray": 69.46197183098592, + "std_gray": 72.09966178779689 }, "geometry": { "distance_to_center_norm": 0.6501306891441345, @@ -262,7 +262,7 @@ "confidence": 0.12146268776527554 }, { - "observation_id": "5e3ab73b-95b6-40ba-8312-559df2af99eb", + "observation_id": "01042af9-314d-4cfa-a121-0456db293478", "type": "aruco", "marker_id": 115, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.5819518243971115 }, { - "observation_id": "9b01a54d-8902-4423-8607-3eb7b56b39c9", + "observation_id": "446026e6-472e-4012-8c21-baf7f11b961b", "type": "aruco", "marker_id": 242, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.20467827127148344 }, { - "observation_id": "898c0ffa-ded3-45f4-9ed0-a53135c78e27", + "observation_id": "09eb9e19-9c53-4cc2-9035-41f841102748", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.47917663082333867 }, { - "observation_id": "4cce2392-135c-46fc-8f86-b1f873d322e8", + "observation_id": "a9789190-05e9-456a-9f80-d8b974b000f3", "type": "aruco", "marker_id": 85, "marker_size_m": 0.025, @@ -454,14 +454,14 @@ "area_px": 895.0, "perimeter_px": 125.45559501647949, "sharpness": { - "laplacian_var": 3873.585984563896 + "laplacian_var": 3873.681852332491 }, "contrast": { "p05": 9.0, "p95": 172.0, "dynamic_range": 163.0, - "mean_gray": 114.31239669421488, - "std_gray": 68.11591914790033 + "mean_gray": 114.31570247933884, + "std_gray": 68.11418100703105 }, "geometry": { "distance_to_center_norm": 0.8151581883430481, @@ -478,7 +478,7 @@ "confidence": 0.4560525484643318 }, { - "observation_id": "1b4fc6aa-7195-4b2f-a63d-8011f33afab3", + "observation_id": "3dd6fb79-3723-4947-82af-49aa4fb7fb3a", "type": "aruco", "marker_id": 79, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.5734281513866332 }, { - "observation_id": "c770f948-4247-45f2-832e-bf5073deef29", + "observation_id": "e5fc8434-492b-4f88-9be6-8a997bc8b6a3", "type": "aruco", "marker_id": 96, "marker_size_m": 0.025, @@ -562,14 +562,14 @@ "area_px": 834.0, "perimeter_px": 120.57016181945801, "sharpness": { - "laplacian_var": 3473.4540448750768 + "laplacian_var": 3473.7612406198105 }, "contrast": { "p05": 11.0, "p95": 174.75, "dynamic_range": 163.75, - "mean_gray": 86.26325088339223, - "std_gray": 73.1465900219182 + "mean_gray": 86.26148409893993, + "std_gray": 73.14834750473707 }, "geometry": { "distance_to_center_norm": 0.47566938400268555, @@ -586,7 +586,7 @@ "confidence": 0.525542829627259 }, { - "observation_id": "70f2966e-1d70-4c1d-b495-a989bc117aed", + "observation_id": "9427650a-5f95-4ddb-ac38-52d855d5318c", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -616,14 +616,14 @@ "area_px": 822.5, "perimeter_px": 120.13125228881836, "sharpness": { - "laplacian_var": 3826.1772576221033 + "laplacian_var": 3823.293954210973 }, "contrast": { "p05": 13.0, "p95": 177.0, "dynamic_range": 164.0, - "mean_gray": 82.16157989228007, - "std_gray": 72.87486456081467 + "mean_gray": 82.15619389587074, + "std_gray": 72.87296700289083 }, "geometry": { "distance_to_center_norm": 0.26240772008895874, @@ -640,7 +640,7 @@ "confidence": 0.456911083882938 }, { - "observation_id": "f0145b12-12ce-4744-b8d2-46cedd47f0c9", + "observation_id": "dffee89c-f89c-4b10-8798-29170850667d", "type": "aruco", "marker_id": 41, "marker_size_m": 0.025, @@ -670,14 +670,14 @@ "area_px": 792.0, "perimeter_px": 119.11717987060547, "sharpness": { - "laplacian_var": 2098.2697652892566 + "laplacian_var": 2098.6370380165295 }, "contrast": { "p05": 28.0, "p95": 174.0, "dynamic_range": 146.0, - "mean_gray": 70.73818181818181, - "std_gray": 53.7731987683932 + "mean_gray": 70.74, + "std_gray": 53.772311563750826 }, "geometry": { "distance_to_center_norm": 0.35873544216156006, @@ -694,7 +694,7 @@ "confidence": 0.2689554084930072 }, { - "observation_id": "641ea2b3-b44e-4c1d-afbb-a906d6b0b203", + "observation_id": "763b0856-4b48-483d-abe7-c532dd089382", "type": "aruco", "marker_id": 62, "marker_size_m": 0.025, @@ -748,7 +748,7 @@ "confidence": 0.5038606541951498 }, { - "observation_id": "f7d192b7-5769-48be-8774-69d102904a43", + "observation_id": "bcdfffb1-ea74-4f13-aca3-93b6e3bb26ab", "type": "aruco", "marker_id": 105, "marker_size_m": 0.025, @@ -778,14 +778,14 @@ "area_px": 772.0, "perimeter_px": 118.03386306762695, "sharpness": { - "laplacian_var": 2167.6912184604626 + "laplacian_var": 2167.702668842142 }, "contrast": { "p05": 9.0, "p95": 169.0, "dynamic_range": 160.0, - "mean_gray": 38.06488549618321, - "std_gray": 54.11614231054054 + "mean_gray": 38.06297709923664, + "std_gray": 54.11714960355189 }, "geometry": { "distance_to_center_norm": 0.7464743256568909, @@ -802,7 +802,7 @@ "confidence": 0.43622925667631085 }, { - "observation_id": "4552120d-ae87-408d-b3be-eee1910ab526", + "observation_id": "f9d62017-0426-4f6c-b128-ad584da5ba09", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -832,14 +832,14 @@ "area_px": 735.0, "perimeter_px": 114.19036865234375, "sharpness": { - "laplacian_var": 3171.854623514855 + "laplacian_var": 3173.8970945573265 }, "contrast": { "p05": 10.0, "p95": 170.0, "dynamic_range": 160.0, - "mean_gray": 69.47876447876448, - "std_gray": 67.69878874048698 + "mean_gray": 69.47104247104247, + "std_gray": 67.69510720753675 }, "geometry": { "distance_to_center_norm": 0.2758570611476898, @@ -856,7 +856,7 @@ "confidence": 0.4417935296159658 }, { - "observation_id": "eba923e3-3220-45ea-86f3-f3fea8fc1f04", + "observation_id": "58f60a94-2bbf-4e18-8da1-938825edc413", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -886,14 +886,14 @@ "area_px": 727.5, "perimeter_px": 113.00139427185059, "sharpness": { - "laplacian_var": 2784.894987381329 + "laplacian_var": 2786.6601537218385 }, "contrast": { "p05": 12.0, "p95": 178.0, "dynamic_range": 166.0, - "mean_gray": 80.98238747553816, - "std_gray": 72.27925895390865 + "mean_gray": 80.98434442270059, + "std_gray": 72.28376721944691 }, "geometry": { "distance_to_center_norm": 0.17820203304290771, @@ -910,7 +910,7 @@ "confidence": 0.40054559871813256 }, { - "observation_id": "2ed860b9-eee6-4810-9b2c-9d989c7bdd2f", + "observation_id": "a17e5b28-3c15-4729-ae9f-8e2fa92a9553", "type": "aruco", "marker_id": 42, "marker_size_m": 0.025, @@ -964,7 +964,7 @@ "confidence": 0.27884375907821757 }, { - "observation_id": "ee5c2d6f-18e8-40a9-8d9d-b1332e3268ee", + "observation_id": "0b0bc3b8-488d-4d79-9dc2-5ea0f25c4a96", "type": "aruco", "marker_id": 75, "marker_size_m": 0.025, @@ -994,14 +994,14 @@ "area_px": 722.5, "perimeter_px": 112.32038497924805, "sharpness": { - "laplacian_var": 3770.8553279090283 + "laplacian_var": 3770.609783354573 }, "contrast": { "p05": 10.0, "p95": 173.0, "dynamic_range": 163.0, - "mean_gray": 102.98415841584159, - "std_gray": 67.30200699149927 + "mean_gray": 102.98217821782178, + "std_gray": 67.30231543254735 }, "geometry": { "distance_to_center_norm": 0.7277610301971436, @@ -1018,7 +1018,7 @@ "confidence": 0.29844141482805986 }, { - "observation_id": "6fc6008a-e0e0-420b-a961-01ae6c19507f", + "observation_id": "2f5f7664-2681-4b3f-9195-014071414c68", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -1072,7 +1072,7 @@ "confidence": 0.2521714913889437 }, { - "observation_id": "0245de0e-0180-48ad-a460-e92adf2f7abd", + "observation_id": "259173de-7c7b-447f-9fde-744beb32c069", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -1102,14 +1102,14 @@ "area_px": 635.0, "perimeter_px": 107.61724662780762, "sharpness": { - "laplacian_var": 3875.6299438288706 + "laplacian_var": 3874.300202947061 }, "contrast": { "p05": 11.0, "p95": 171.0, "dynamic_range": 160.0, - "mean_gray": 92.53947368421052, - "std_gray": 68.86853878811944 + "mean_gray": 92.54385964912281, + "std_gray": 68.86866350651277 }, "geometry": { "distance_to_center_norm": 0.1513148695230484, @@ -1126,7 +1126,7 @@ "confidence": 0.35589175865715006 }, { - "observation_id": "68b9db20-b3bb-4986-88f4-56d77372404b", + "observation_id": "99df37b0-d7b8-4f95-b240-6c41aa4e7763", "type": "aruco", "marker_id": 74, "marker_size_m": 0.025, @@ -1180,7 +1180,7 @@ "confidence": 0.27942076592245474 }, { - "observation_id": "f1e7ff82-9b89-443f-a1de-2cc0a6ec9910", + "observation_id": "a0944862-fa96-41dd-b059-665cafeeeb39", "type": "aruco", "marker_id": 92, "marker_size_m": 0.025, @@ -1210,14 +1210,14 @@ "area_px": 580.0, "perimeter_px": 104.17594909667969, "sharpness": { - "laplacian_var": 2393.9573521039283 + "laplacian_var": 2392.815865293377 }, "contrast": { "p05": 10.0, "p95": 167.0, "dynamic_range": 157.0, "mean_gray": 64.28776978417267, - "std_gray": 62.665942154070514 + "std_gray": 62.67202642316084 }, "geometry": { "distance_to_center_norm": 0.733877956867218, @@ -1234,7 +1234,7 @@ "confidence": 0.31777455864589965 }, { - "observation_id": "13ae671f-af20-413b-a7f9-c9be9f4959e0", + "observation_id": "ccac453d-e92d-4e4a-a1cd-e77569e892af", "type": "aruco", "marker_id": 81, "marker_size_m": 0.025, @@ -1264,14 +1264,14 @@ "area_px": 608.5, "perimeter_px": 103.9414234161377, "sharpness": { - "laplacian_var": 2473.1050331724305 + "laplacian_var": 2472.4984956688486 }, "contrast": { "p05": 9.0, "p95": 169.75, "dynamic_range": 160.75, "mean_gray": 71.1056338028169, - "std_gray": 67.74330600263298 + "std_gray": 67.73821201745216 }, "geometry": { "distance_to_center_norm": 0.42410150170326233, @@ -1288,7 +1288,7 @@ "confidence": 0.2741936898356918 }, { - "observation_id": "6f91a102-1243-451e-bf38-1d787952fe08", + "observation_id": "4a3c178a-7305-4e0f-bbe4-11977beb0d88", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -1342,7 +1342,7 @@ "confidence": 0.3029173397022545 }, { - "observation_id": "05f40d51-1b97-404f-b6c1-e9dc3c9e1733", + "observation_id": "cd5ba542-05a5-4178-8f82-1ea950585dcb", "type": "aruco", "marker_id": 61, "marker_size_m": 0.025, @@ -1372,14 +1372,14 @@ "area_px": 541.0, "perimeter_px": 99.51516723632812, "sharpness": { - "laplacian_var": 3914.6540857324544 + "laplacian_var": 3915.885268528154 }, "contrast": { "p05": 9.0, "p95": 168.0, "dynamic_range": 159.0, - "mean_gray": 100.2258064516129, - "std_gray": 64.43023717990889 + "mean_gray": 100.23387096774194, + "std_gray": 64.4286438091019 }, "geometry": { "distance_to_center_norm": 0.7955067753791809, @@ -1396,7 +1396,7 @@ "confidence": 0.1527342148240039 }, { - "observation_id": "bab681b9-5d5a-45e0-91f1-442117627c22", + "observation_id": "665192cf-6547-4c06-bd09-07aa65da7224", "type": "aruco", "marker_id": 52, "marker_size_m": 0.025, @@ -1426,14 +1426,14 @@ "area_px": 557.5, "perimeter_px": 98.96007919311523, "sharpness": { - "laplacian_var": 3088.0864417641133 + "laplacian_var": 3088.6523992919188 }, "contrast": { "p05": 10.0, "p95": 171.0, "dynamic_range": 161.0, - "mean_gray": 77.93198992443325, - "std_gray": 65.87911920268678 + "mean_gray": 77.91435768261965, + "std_gray": 65.87284691057312 }, "geometry": { "distance_to_center_norm": 0.5113449692726135, @@ -1450,7 +1450,7 @@ "confidence": 0.21946523336267398 }, { - "observation_id": "58784339-7959-4005-b901-1ce87ff4eb3d", + "observation_id": "8875e653-aab9-4520-8101-e6de9f049ec1", "type": "aruco", "marker_id": 83, "marker_size_m": 0.025, @@ -1480,14 +1480,14 @@ "area_px": 526.0, "perimeter_px": 98.26437950134277, "sharpness": { - "laplacian_var": 3515.7748070987655 + "laplacian_var": 3516.3136959876542 }, "contrast": { "p05": 10.0, "p95": 168.0, "dynamic_range": 158.0, - "mean_gray": 100.19166666666666, - "std_gray": 60.8551964137456 + "mean_gray": 100.18888888888888, + "std_gray": 60.852260880931844 }, "geometry": { "distance_to_center_norm": 0.6829988360404968, @@ -1504,7 +1504,7 @@ "confidence": 0.19743498130596515 }, { - "observation_id": "f98163c0-2af4-4030-899f-196273508359", + "observation_id": "3b59a578-dcc4-4de4-a849-6b4132bd3438", "type": "aruco", "marker_id": 206, "marker_size_m": 0.025, @@ -1534,14 +1534,14 @@ "area_px": 462.0, "perimeter_px": 95.09099197387695, "sharpness": { - "laplacian_var": 2247.395639721198 + "laplacian_var": 2246.180449847781 }, "contrast": { "p05": 11.0, "p95": 160.0, "dynamic_range": 149.0, - "mean_gray": 74.9873417721519, - "std_gray": 57.3340188124554 + "mean_gray": 74.98417721518987, + "std_gray": 57.330678625538674 }, "geometry": { "distance_to_center_norm": 0.5142804980278015, @@ -1558,7 +1558,7 @@ "confidence": 0.2849187633475991 }, { - "observation_id": "94a9bb89-dd33-46b8-8a9d-5bf3d746c43d", + "observation_id": "f200c492-4233-4e4f-8a1c-109ca3b5a148", "type": "aruco", "marker_id": 82, "marker_size_m": 0.025, @@ -1588,14 +1588,14 @@ "area_px": 442.0, "perimeter_px": 89.91087341308594, "sharpness": { - "laplacian_var": 1759.2243692462375 + "laplacian_var": 1759.567411317435 }, "contrast": { "p05": 9.0, "p95": 159.0, "dynamic_range": 150.0, "mean_gray": 86.68608414239482, - "std_gray": 60.39568958884412 + "std_gray": 60.39558242063897 }, "geometry": { "distance_to_center_norm": 0.380372017621994, @@ -1612,7 +1612,7 @@ "confidence": 0.20388582934250105 }, { - "observation_id": "1544f57d-15b6-4f17-a9d5-2bff57eb344c", + "observation_id": "85be9b24-6407-4cb9-84eb-0bc7c75ee3cf", "type": "aruco", "marker_id": 207, "marker_size_m": 0.025, @@ -1666,7 +1666,7 @@ "confidence": 0.24627951083020566 }, { - "observation_id": "44420ebd-cb9b-4c84-bca5-7e835a11c136", + "observation_id": "1fb82fcd-3125-4532-ac91-bc23f3daa1b1", "type": "aruco", "marker_id": 72, "marker_size_m": 0.025, @@ -1696,14 +1696,14 @@ "area_px": 421.5, "perimeter_px": 89.53175735473633, "sharpness": { - "laplacian_var": 1499.4291285469737 + "laplacian_var": 1498.568105295378 }, "contrast": { "p05": 8.0, "p95": 130.2, "dynamic_range": 122.19999999999999, - "mean_gray": 49.5993265993266, - "std_gray": 45.84137927046464 + "mean_gray": 49.55892255892256, + "std_gray": 45.775370837057096 }, "geometry": { "distance_to_center_norm": 0.08397825062274933, @@ -1720,7 +1720,7 @@ "confidence": 0.2345502390230936 }, { - "observation_id": "1596039b-76ad-4133-ad68-a47d8d29795e", + "observation_id": "232bab2a-b3d3-4773-ae3f-e29a0dd5da01", "type": "aruco", "marker_id": 73, "marker_size_m": 0.025, @@ -1750,14 +1750,14 @@ "area_px": 418.5, "perimeter_px": 88.74666213989258, "sharpness": { - "laplacian_var": 3545.7231833910037 + "laplacian_var": 3544.43598615917 }, "contrast": { "p05": 13.0, "p95": 161.0, "dynamic_range": 148.0, - "mean_gray": 101.04498269896193, - "std_gray": 52.39226597170826 + "mean_gray": 101.0484429065744, + "std_gray": 52.39051268478643 }, "geometry": { "distance_to_center_norm": 0.408814936876297, @@ -1774,7 +1774,7 @@ "confidence": 0.17208874842045807 }, { - "observation_id": "f3bb4632-5a88-4a13-8df9-f2310bb2941b", + "observation_id": "b098d41f-e52b-4dff-9177-c02f10e845cb", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -1804,14 +1804,14 @@ "area_px": 370.0, "perimeter_px": 85.7244815826416, "sharpness": { - "laplacian_var": 1153.2910310864881 + "laplacian_var": 1152.7065558633428 }, "contrast": { "p05": 10.0, "p95": 134.0, "dynamic_range": 124.0, - "mean_gray": 81.4421052631579, - "std_gray": 44.501696980726 + "mean_gray": 81.43157894736842, + "std_gray": 44.490247927661855 }, "geometry": { "distance_to_center_norm": 0.13281923532485962, @@ -1828,7 +1828,7 @@ "confidence": 0.19579935125865724 }, { - "observation_id": "006893d0-f0d9-4686-aae7-f6e6f7f55c46", + "observation_id": "e23125e5-4ba4-466e-b085-01cfaf82612a", "type": "aruco", "marker_id": 56, "marker_size_m": 0.025, @@ -1858,14 +1858,14 @@ "area_px": 387.5, "perimeter_px": 85.55499839782715, "sharpness": { - "laplacian_var": 1352.496847257426 + "laplacian_var": 1352.8431370100761 }, "contrast": { "p05": 9.0, "p95": 136.89999999999998, "dynamic_range": 127.89999999999998, - "mean_gray": 49.83745583038869, - "std_gray": 45.40748070279336 + "mean_gray": 49.840989399293285, + "std_gray": 45.40924410966554 }, "geometry": { "distance_to_center_norm": 0.15219897031784058, @@ -1882,7 +1882,7 @@ "confidence": 0.2119841467910161 }, { - "observation_id": "4d8b707e-fe2d-40fc-8574-d2a94ddd16c4", + "observation_id": "bef29c51-654b-4589-b882-f35cc31684b8", "type": "aruco", "marker_id": 46, "marker_size_m": 0.025, @@ -1912,14 +1912,14 @@ "area_px": 351.0, "perimeter_px": 84.78064155578613, "sharpness": { - "laplacian_var": 1637.1454595336074 + "laplacian_var": 1635.503209876543 }, "contrast": { "p05": 10.0, "p95": 143.0, "dynamic_range": 133.0, - "mean_gray": 85.44814814814815, - "std_gray": 48.267033994691644 + "mean_gray": 85.45185185185186, + "std_gray": 48.25245624429581 }, "geometry": { "distance_to_center_norm": 0.19568586349487305, @@ -1936,7 +1936,7 @@ "confidence": 0.18860386268790535 }, { - "observation_id": "2ebe8283-ec4c-4771-a1bf-294cf55abb57", + "observation_id": "47f5165b-33c0-45ce-b3e9-0d1a01c894e7", "type": "aruco", "marker_id": 93, "marker_size_m": 0.025, @@ -1966,14 +1966,14 @@ "area_px": 250.5, "perimeter_px": 72.85183525085449, "sharpness": { - "laplacian_var": 2767.719724716446 + "laplacian_var": 2767.111029064272 }, "contrast": { "p05": 13.0, "p95": 142.09999999999997, "dynamic_range": 129.09999999999997, - "mean_gray": 71.81521739130434, - "std_gray": 45.527327996687426 + "mean_gray": 71.80978260869566, + "std_gray": 45.521873766982495 }, "geometry": { "distance_to_center_norm": 0.6914032101631165, diff --git a/data/evaluations/Scene5/render_a_camera_pose.json b/data/evaluations/Scene5/render_a_camera_pose.json index 28acb8d..3bfdf69 100644 --- a/data/evaluations/Scene5/render_a_camera_pose.json +++ b/data/evaluations/Scene5/render_a_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:46Z", + "created_utc": "2026-06-01T19:02:38Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_a_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -73,153 +73,150 @@ 0, 1, 2, - 3, - 4 + 3 ], "rms": [ - 0.015260198374214953, - 0.0025525032748664883, - 0.0022602152833107463, - 0.002260200662236655, - 0.0022602006603216662 + 0.012034135265417424, + 0.0008689120238386504, + 0.00012891590996672188, + 0.00012884796602483946 ], "lambda": [ 0.001, 0.0005, 0.00025, - 0.000125, - 6.25e-05 + 0.000125 ] }, - "residual_rms_px": 5.09452198874059, - "residual_median_px": 4.648384866897346, - "residual_max_px": 9.405731412621606, - "sigma2_normalized": 5.697950143172918e-06 + "residual_rms_px": 0.3239397860194149, + "residual_median_px": 0.22686032746950102, + "residual_max_px": 0.9295587856283213, + "sigma2_normalized": 1.8517390464419332e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.8048436641693115, - -0.5934643149375916, - 0.005176590755581856 + 0.8081132173538208, + -0.5890271663665771, + 0.00012020689609926194 ], [ - -0.4034935235977173, - -0.5535640716552734, - -0.728532612323761 + -0.34314170479774475, + -0.470937579870224, + -0.8126940131187439 ], [ - 0.43522366881370544, - 0.5842661261558533, - -0.6849915385246277 + 0.47875547409057617, + 0.6567075252532959, + -0.5826906561851501 ] ], "translation_m": [ - -0.2272687554359436, - 0.20672205090522766, - 1.1459629535675049 + -0.22891609370708466, + 0.1707439124584198, + 1.1347811222076416 ], "rvec_rad": [ - 2.231312095310395, - -0.7309340182172712, - 0.3228858087476899 + 2.1062697076327828, + -0.6860854039131205, + 0.3524571805154137 ] }, "camera_in_world": { "position_m": [ - -0.23242336511611938, - -0.6899893283843994, - 0.9367551803588867 + -0.2997032105922699, + -0.799647331237793, + 0.8000164031982422 ], "position_mm": [ - -232.42337036132812, - -689.9893188476562, - 936.7551879882812 + -299.7032165527344, + -799.6473388671875, + 800.0164184570312 ], "orientation_deg": { - "roll": 139.53733825683594, - "pitch": -25.79952621459961, - "yaw": -26.62605094909668 + "roll": 131.58233642578125, + "pitch": -28.604148864746094, + "yaw": -23.0070858001709 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 2.8238082103615285e-05, - -8.969394874730575e-06, - 2.888276572277622e-07, - 1.2706865123406641e-06, - 4.6185625978102386e-06, - 7.781907969033415e-06 + 7.117355394105872e-08, + -2.1230474986829976e-08, + -3.1053899136843836e-09, + 2.5552783637509647e-09, + 1.2198618642205762e-08, + 1.9110381248128544e-08 ], [ - -8.969394874730572e-06, - 1.1305584954180433e-05, - -5.687954368121178e-06, - -2.471757098939849e-06, - -2.8854007794687056e-06, - -1.2521255159224394e-06 + -2.1230474986829728e-08, + 3.481018949594211e-08, + -1.674551612113021e-08, + -7.72855379465477e-09, + -8.329714684899453e-09, + -1.7422641696187877e-09 ], [ - 2.8882765722775916e-07, - -5.687954368121139e-06, - 3.786166004195518e-05, - 5.349604098108682e-06, - -2.7773868060518817e-06, - -8.706407298772477e-06 + -3.105389913684412e-09, + -1.6745516121130328e-08, + 9.379942357400827e-08, + 1.4627600222264534e-08, + -8.013775296579182e-09, + -2.1124302781088823e-08 ], [ - 1.270686512340658e-06, - -2.471757098939847e-06, - 5.349604098108696e-06, - 1.3777875282442502e-06, - 1.366483059277274e-07, - -5.835177215332592e-07 + 2.5552783637509287e-09, + -7.728553794654778e-09, + 1.4627600222264496e-08, + 4.263337150942713e-09, + 3.342107400025696e-10, + -1.512925050651277e-09 ], [ - 4.61856259781024e-06, - -2.8854007794687157e-06, - -2.7773868060518664e-06, - 1.3664830592773096e-07, - 1.7819029607426296e-06, - 2.430031796111393e-06 + 1.2198618642205698e-08, + -8.329714684899453e-09, + -8.013775296579222e-09, + 3.342107400025638e-10, + 5.36479988762239e-09, + 6.289076196119577e-09 ], [ - 7.78190796903343e-06, - -1.2521255159224654e-06, - -8.706407298772454e-06, - -5.835177215332591e-07, - 2.430031796111399e-06, - 1.1539186980921234e-05 + 1.91103812481286e-08, + -1.742264169618804e-09, + -2.1124302781088863e-08, + -1.512925050651283e-09, + 6.289076196119589e-09, + 3.4600591715292965e-08 ] ], "parameter_std": { "rvec_std_deg": [ - 0.30446700189331066, - 0.19265006119433434, - 0.3525514118645909 + 0.015285581272251669, + 0.010689953747439269, + 0.01754780166676714 ], "tvec_std_m": [ - 0.0011737919441895358, - 0.0013348793805968498, - 0.0033969378829942173 + 6.529423520451643e-05, + 7.324479426977994e-05, + 0.00018601234291114384 ] }, "camera_center_std_m": [ - 0.005800066712512348, - 0.006326130224562286, - 0.006540786998015982 + 0.00030822711317601175, + 0.0002919271293487338, + 0.00033325927291978326 ], "camera_center_std_mm": [ - 5.800066712512348, - 6.326130224562286, - 6.5407869980159825 + 0.30822711317601176, + 0.2919271293487338, + 0.33325927291978324 ], "orientation_std_deg": { - "roll": 0.40470786738488734, - "pitch": 0.25976886725665777, - "yaw": 0.18624293148192822 + "roll": 0.022231224869631416, + "pitch": 0.014895707439856385, + "yaw": 0.011102795425160114 } } }, @@ -232,10 +229,10 @@ 690.75 ], "projected_center_px": [ - 980.490478515625, - 682.1282958984375 + 983.844482421875, + 690.7804565429688 ], - "reprojection_error_px": 9.405731412621606, + "reprojection_error_px": 0.40665969455795936, "confidence": 0.12146268776527554 }, { @@ -245,10 +242,10 @@ 632.25 ], "projected_center_px": [ - 329.9543151855469, - 634.9945678710938 + 324.11065673828125, + 632.0090942382812 ], - "reprojection_error_px": 6.330234161158713, + "reprojection_error_px": 0.2783022289089888, "confidence": 0.47917663082333867 }, { @@ -258,10 +255,10 @@ 610.25 ], "projected_center_px": [ - 1179.0181884765625, - 604.8651733398438 + 1183.810302734375, + 610.2540893554688 ], - "reprojection_error_px": 7.168430682741198, + "reprojection_error_px": 0.060441232625183965, "confidence": 0.4560525484643318 }, { @@ -271,10 +268,10 @@ 599.0 ], "projected_center_px": [ - 814.25439453125, - 594.3585815429688 + 814.2139282226562, + 598.9244995117188 ], - "reprojection_error_px": 4.648384866897346, + "reprojection_error_px": 0.22686032746950102, "confidence": 0.5734281513866332 }, { @@ -284,10 +281,10 @@ 587.25 ], "projected_center_px": [ - 904.2947387695312, - 582.7190551757812 + 905.1282958984375, + 586.9659423828125 ], - "reprojection_error_px": 4.6305491055112835, + "reprojection_error_px": 0.3090317430610901, "confidence": 0.525542829627259 }, { @@ -297,10 +294,10 @@ 548.75 ], "projected_center_px": [ - 680.4599609375, - 553.9935913085938 + 678.8589477539062, + 549.0524291992188 ], - "reprojection_error_px": 5.51536183938423, + "reprojection_error_px": 0.3214545591857599, "confidence": 0.456911083882938 }, { @@ -310,10 +307,10 @@ 557.5 ], "projected_center_px": [ - 930.2821655273438, - 554.0820922851562 + 931.0244750976562, + 557.4100952148438 ], - "reprojection_error_px": 3.4924746924383148, + "reprojection_error_px": 0.09317671811817824, "confidence": 0.5038606541951498 }, { @@ -323,10 +320,10 @@ 560.25 ], "projected_center_px": [ - 1147.1253662109375, - 556.6358032226562 + 1150.0174560546875, + 560.2509155273438 ], - "reprojection_error_px": 4.777630653484321, + "reprojection_error_px": 0.23254574752469706, "confidence": 0.43622925667631085 }, { @@ -336,10 +333,10 @@ 492.75 ], "projected_center_px": [ - 793.9262084960938, - 498.6206359863281 + 792.93505859375, + 492.69671630859375 ], - "reprojection_error_px": 5.94325071507227, + "reprojection_error_px": 0.08400320241278912, "confidence": 0.4417935296159658 }, { @@ -349,10 +346,10 @@ 487.25 ], "projected_center_px": [ - 611.3532104492188, - 493.5355529785156 + 610.08251953125, + 487.4124755859375 ], - "reprojection_error_px": 6.5530576996406955, + "reprojection_error_px": 0.6047539336899378, "confidence": 0.40054559871813256 }, { @@ -362,10 +359,10 @@ 514.75 ], "projected_center_px": [ - 129.92556762695312, - 513.0206909179688 + 128.4987335205078, + 514.6072387695312 ], - "reprojection_error_px": 2.241149919173755, + "reprojection_error_px": 0.1427668480259184, "confidence": 0.29844141482805986 }, { @@ -375,10 +372,10 @@ 461.5 ], "projected_center_px": [ - 1217.4583740234375, - 460.11529541015625 + 1217.762939453125, + 461.39080810546875 ], - "reprojection_error_px": 1.41508039041617, + "reprojection_error_px": 0.10995589697009295, "confidence": 0.2521714913889437 }, { @@ -388,10 +385,10 @@ 435.25 ], "projected_center_px": [ - 723.0428466796875, - 442.2016906738281 + 722.0742797851562, + 435.6196594238281 ], - "reprojection_error_px": 7.070887904766128, + "reprojection_error_px": 0.491737194735079, "confidence": 0.35589175865715006 }, { @@ -401,10 +398,10 @@ 487.5 ], "projected_center_px": [ - 312.41351318359375, - 486.499267578125 + 311.78607177734375, + 487.70458984375 ], - "reprojection_error_px": 1.2007144227477724, + "reprojection_error_px": 0.2077454627335733, "confidence": 0.27942076592245474 }, { @@ -414,10 +411,10 @@ 437.75 ], "projected_center_px": [ - 1173.6719970703125, - 436.986083984375 + 1173.09326171875, + 437.8807373046875 ], - "reprojection_error_px": 0.8727251607927368, + "reprojection_error_px": 0.20410568744196306, "confidence": 0.31777455864589965 }, { @@ -427,10 +424,10 @@ 451.25 ], "projected_center_px": [ - 342.0672302246094, - 450.531982421875 + 342.5326232910156, + 451.2200927734375 ], - "reprojection_error_px": 0.7409143225048561, + "reprojection_error_px": 0.28420127871838186, "confidence": 0.2741936898356918 }, { @@ -440,10 +437,10 @@ 347.0 ], "projected_center_px": [ - 1091.2603759765625, - 353.51788330078125 + 1087.9014892578125, + 346.9776611328125 ], - "reprojection_error_px": 7.403076537455911, + "reprojection_error_px": 0.1531274639632057, "confidence": 0.3029173397022545 }, { @@ -453,10 +450,10 @@ 415.5 ], "projected_center_px": [ - 54.796043395996094, - 415.2362976074219 + 58.70878219604492, + 415.49444580078125 ], - "reprojection_error_px": 3.7133318564593143, + "reprojection_error_px": 0.20885606171308926, "confidence": 0.1527342148240039 }, { @@ -466,10 +463,10 @@ 442.75 ], "projected_center_px": [ - 271.7474365234375, - 442.3570556640625 + 272.8359680175781, + 442.919189453125 ], - "reprojection_error_px": 2.0407512657860707, + "reprojection_error_px": 0.9295587856283213, "confidence": 0.21946523336267398 }, { @@ -479,10 +476,10 @@ 383.0 ], "projected_center_px": [ - 134.24522399902344, - 382.8055725097656 + 138.9648895263672, + 382.9786682128906 ], - "reprojection_error_px": 4.7587495067949845, + "reprojection_error_px": 0.04108272751412836, "confidence": 0.19743498130596515 }, { @@ -492,10 +489,10 @@ 301.0 ], "projected_center_px": [ - 1017.1138916015625, - 307.0431823730469 + 1013.3450317382812, + 300.9158020019531 ], - "reprojection_error_px": 7.310551094364291, + "reprojection_error_px": 0.3551565898255058, "confidence": 0.2849187633475991 }, { @@ -505,10 +502,10 @@ 333.0 ], "projected_center_px": [ - 358.00128173828125, - 332.4212341308594 + 361.9694519042969, + 332.7307434082031 ], - "reprojection_error_px": 4.040385831561774, + "reprojection_error_px": 0.2709839448697215, "confidence": 0.20388582934250105 }, { @@ -518,10 +515,10 @@ 262.0 ], "projected_center_px": [ - 1103.499755859375, - 267.3392028808594 + 1097.9324951171875, + 261.7966613769531 ], - "reprojection_error_px": 7.665142002318463, + "reprojection_error_px": 0.21425103226385744, "confidence": 0.24627951083020566 }, { @@ -531,10 +528,10 @@ 300.25 ], "projected_center_px": [ - 654.7481689453125, - 299.9090881347656 + 655.5056762695312, + 300.4344177246094 ], - "reprojection_error_px": 0.6066756195087695, + "reprojection_error_px": 0.31524633534985885, "confidence": 0.2345502390230936 }, { @@ -544,10 +541,10 @@ 311.5 ], "projected_center_px": [ - 338.8076477050781, - 311.3116455078125 + 343.6866760253906, + 311.7745056152344 ], - "reprojection_error_px": 4.945940115068796, + "reprojection_error_px": 0.2817148532746037, "confidence": 0.17208874842045807 }, { @@ -557,10 +554,10 @@ 274.0 ], "projected_center_px": [ - 685.0142822265625, - 272.94097900390625 + 685.5405883789062, + 273.7601318359375 ], - "reprojection_error_px": 1.4467774531827557, + "reprojection_error_px": 0.5182622634600186, "confidence": 0.19579935125865724 }, { @@ -570,10 +567,10 @@ 291.75 ], "projected_center_px": [ - 728.6934814453125, - 291.1202087402344 + 728.5443725585938, + 291.7182312011719 ], - "reprojection_error_px": 0.6588414836342554, + "reprojection_error_px": 0.054572708702589186, "confidence": 0.2119841467910161 }, { @@ -583,10 +580,10 @@ 268.75 ], "projected_center_px": [ - 751.5160522460938, - 267.80462646484375 + 751.09375, + 268.6739196777344 ], - "reprojection_error_px": 1.0770520143763855, + "reprojection_error_px": 0.12073639855503955, "confidence": 0.18860386268790535 }, { @@ -596,10 +593,10 @@ 154.5 ], "projected_center_px": [ - 1112.300537109375, - 151.50733947753906 + 1104.235595703125, + 154.6660614013672 ], - "reprojection_error_px": 8.588781331022473, + "reprojection_error_px": 0.16668495070790668, "confidence": 0.15396639291733288 } ] diff --git a/data/evaluations/Scene5/render_b_aruco_detection.json b/data/evaluations/Scene5/render_b_aruco_detection.json index 5412818..93d94d4 100644 --- a/data/evaluations/Scene5/render_b_aruco_detection.json +++ b/data/evaluations/Scene5/render_b_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:43Z", + "created_utc": "2026-06-01T19:02:33Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,18 +35,18 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_b.png", - "image_sha256": "751007107acedd68f99a6a4b137a7ee2901203f61afd79f37b6853eaceeb76c5", + "image_sha256": "6e598a93792b3aa3e9c8756a6ea8bf1d2ae57bb701043723843011224153751c", "width_px": 1280, "height_px": 720 }, "aruco": { "dictionary": "DICT_4X4_250", "num_detected_markers": 49, - "num_rejected_candidates": 13 + "num_rejected_candidates": 15 }, "detections": [ { - "observation_id": "d11b7353-ad3d-4198-8af4-86cad918f5ce", + "observation_id": "f332309f-478b-463a-8107-f360eafdd213", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -76,14 +76,14 @@ "area_px": 1105.0, "perimeter_px": 133.01470184326172, "sharpness": { - "laplacian_var": 3179.084916558293 + "laplacian_var": 3184.0782906256136 }, "contrast": { - "p05": 33.0, + "p05": 33.050000000000004, "p95": 186.0, - "dynamic_range": 153.0, - "mean_gray": 109.62938005390835, - "std_gray": 68.88557526166484 + "dynamic_range": 152.95, + "mean_gray": 109.633423180593, + "std_gray": 68.89660102078436 }, "geometry": { "distance_to_center_norm": 0.41691911220550537, @@ -100,7 +100,7 @@ "confidence": 0.5544269284959954 }, { - "observation_id": "3f62861e-fdc1-452e-90d2-5af05032890c", + "observation_id": "96d1ef06-b66f-4c75-a06e-f4bb7f0a978c", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -130,14 +130,14 @@ "area_px": 1089.0, "perimeter_px": 132.0302963256836, "sharpness": { - "laplacian_var": 2443.6912366297615 + "laplacian_var": 2465.7131544379813 }, "contrast": { "p05": 31.0, - "p95": 184.0, - "dynamic_range": 153.0, - "mean_gray": 79.46986301369863, - "std_gray": 64.74844724415543 + "p95": 184.54999999999995, + "dynamic_range": 153.54999999999995, + "mean_gray": 79.44520547945206, + "std_gray": 64.74726744346925 }, "geometry": { "distance_to_center_norm": 0.43311360478401184, @@ -154,7 +154,7 @@ "confidence": 0.5466352941176471 }, { - "observation_id": "4e6ac51f-1c0b-4bf0-905d-b6e7b3286411", + "observation_id": "484e57c7-7eab-4790-830b-ac85b9dfb3c3", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -184,14 +184,14 @@ "area_px": 1040.5, "perimeter_px": 129.04262924194336, "sharpness": { - "laplacian_var": 3081.540597529917 + "laplacian_var": 3081.2764465865207 }, "contrast": { "p05": 63.0, "p95": 192.0, "dynamic_range": 129.0, - "mean_gray": 112.26850507982583, - "std_gray": 56.3381523619058 + "mean_gray": 112.26705370101597, + "std_gray": 56.336987081137735 }, "geometry": { "distance_to_center_norm": 0.15372250974178314, @@ -208,7 +208,7 @@ "confidence": 0.6668638701841824 }, { - "observation_id": "f5b6e6be-889e-4e8d-b5ef-ce07c237f6c6", + "observation_id": "aa12605b-fde5-44a0-88df-39e22897f0d3", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -238,14 +238,14 @@ "area_px": 1007.5, "perimeter_px": 127.2460708618164, "sharpness": { - "laplacian_var": 2915.425246149641 + "laplacian_var": 2913.8066144174722 }, "contrast": { "p05": 53.0, "p95": 193.0, "dynamic_range": 140.0, "mean_gray": 116.95778748180494, - "std_gray": 63.30683321903464 + "std_gray": 63.30409701158885 }, "geometry": { "distance_to_center_norm": 0.10009558498859406, @@ -262,7 +262,7 @@ "confidence": 0.5937058777020776 }, { - "observation_id": "1b021305-8aa5-4b8f-b668-d173327e187f", + "observation_id": "894608c5-3a26-4c17-9781-5d82b2d7e1ce", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -292,14 +292,14 @@ "area_px": 994.0, "perimeter_px": 126.561279296875, "sharpness": { - "laplacian_var": 1963.8160387755106 + "laplacian_var": 1964.1874673469392 }, "contrast": { "p05": 48.0, "p95": 192.0, "dynamic_range": 144.0, - "mean_gray": 91.06571428571428, - "std_gray": 60.29696719621331 + "mean_gray": 91.06428571428572, + "std_gray": 60.29456392391863 }, "geometry": { "distance_to_center_norm": 0.22445325553417206, @@ -316,7 +316,7 @@ "confidence": 0.6074766727947272 }, { - "observation_id": "32e803f1-dc92-4a84-807d-75245e08a34e", + "observation_id": "8790b313-081b-42e5-b428-613a390c1313", "type": "aruco", "marker_id": 63, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.1539593300495616 }, { - "observation_id": "c0c4d373-afc1-4743-b255-fb1af651a5b3", + "observation_id": "dec18b38-f329-40c2-981e-f960289e6ef3", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.39637168760361213 }, { - "observation_id": "d366451f-c999-4c35-8484-7ad52360a485", + "observation_id": "24bf73ba-6ce7-4e8b-b725-00d9c56ea313", "type": "aruco", "marker_id": 64, "marker_size_m": 0.025, @@ -454,14 +454,14 @@ "area_px": 819.5, "perimeter_px": 115.6167049407959, "sharpness": { - "laplacian_var": 3099.3678662741604 + "laplacian_var": 3100.0904690138864 }, "contrast": { "p05": 15.0, "p95": 181.0, "dynamic_range": 166.0, - "mean_gray": 73.33561643835617, - "std_gray": 71.45918246710201 + "mean_gray": 73.33390410958904, + "std_gray": 71.45999322231475 }, "geometry": { "distance_to_center_norm": 0.6832876801490784, @@ -478,7 +478,7 @@ "confidence": 0.4633649853376546 }, { - "observation_id": "e54e10ea-e145-4e43-9ffa-fb214ebee165", + "observation_id": "71de1ac8-5510-4b61-bd0b-8d176096b319", "type": "aruco", "marker_id": 58, "marker_size_m": 0.025, @@ -508,14 +508,14 @@ "area_px": 820.0, "perimeter_px": 115.4936294555664, "sharpness": { - "laplacian_var": 3396.6173971429916 + "laplacian_var": 3396.750958786827 }, "contrast": { "p05": 16.0, "p95": 181.0, "dynamic_range": 165.0, - "mean_gray": 75.2791095890411, - "std_gray": 71.25453007873546 + "mean_gray": 75.27739726027397, + "std_gray": 71.25202546560885 }, "geometry": { "distance_to_center_norm": 0.6174793243408203, @@ -532,7 +532,7 @@ "confidence": 0.3638956157928849 }, { - "observation_id": "d2079244-95b5-42f9-b132-e473e5a44505", + "observation_id": "1f20112f-ea81-4b22-b5dd-82b0476797bf", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -562,14 +562,14 @@ "area_px": 792.0, "perimeter_px": 114.0416488647461, "sharpness": { - "laplacian_var": 2502.779410150891 + "laplacian_var": 2507.052054183813 }, "contrast": { "p05": 9.0, "p95": 173.0, "dynamic_range": 164.0, - "mean_gray": 66.67222222222222, - "std_gray": 71.29935565826631 + "mean_gray": 66.66666666666667, + "std_gray": 71.30770567679828 }, "geometry": { "distance_to_center_norm": 0.44460585713386536, @@ -586,7 +586,7 @@ "confidence": 0.17159346582749313 }, { - "observation_id": "1cd8fbb0-19de-4980-b55d-a72e49b0a670", + "observation_id": "f4371b3c-9576-4196-a630-c22d8715ce64", "type": "aruco", "marker_id": 92, "marker_size_m": 0.025, @@ -616,14 +616,14 @@ "area_px": 797.5, "perimeter_px": 113.95212745666504, "sharpness": { - "laplacian_var": 2831.7979352145267 + "laplacian_var": 2830.056800462753 }, "contrast": { "p05": 9.0, "p95": 167.0, "dynamic_range": 158.0, - "mean_gray": 56.659574468085104, - "std_gray": 64.93713051073213 + "mean_gray": 56.65780141843972, + "std_gray": 64.9345682079871 }, "geometry": { "distance_to_center_norm": 0.6798796653747559, @@ -640,7 +640,7 @@ "confidence": 0.46896024883690896 }, { - "observation_id": "1219cf7c-39d8-4524-9637-aabcc5df5c2a", + "observation_id": "fea93be6-29be-4135-9b14-6ce5b1add937", "type": "aruco", "marker_id": 96, "marker_size_m": 0.025, @@ -670,14 +670,14 @@ "area_px": 793.0, "perimeter_px": 113.09603309631348, "sharpness": { - "laplacian_var": 2575.804436310256 + "laplacian_var": 2576.75630796801 }, "contrast": { "p05": 13.0, "p95": 175.0, "dynamic_range": 162.0, - "mean_gray": 83.70053475935829, - "std_gray": 72.45168886206427 + "mean_gray": 83.6916221033868, + "std_gray": 72.45614139156542 }, "geometry": { "distance_to_center_norm": 0.3796437680721283, @@ -694,7 +694,7 @@ "confidence": 0.44372569385651617 }, { - "observation_id": "6e366653-99fa-4bc0-aca8-6d332b915edc", + "observation_id": "2ea2d1a7-d6d6-44a5-aecf-b4420258de6e", "type": "aruco", "marker_id": 103, "marker_size_m": 0.025, @@ -724,14 +724,14 @@ "area_px": 780.0, "perimeter_px": 112.15361785888672, "sharpness": { - "laplacian_var": 3254.115044628099 + "laplacian_var": 3255.161110743802 }, "contrast": { "p05": 16.0, "p95": 180.0, "dynamic_range": 164.0, "mean_gray": 112.79636363636364, - "std_gray": 72.72652626889652 + "std_gray": 72.72982622789976 }, "geometry": { "distance_to_center_norm": 0.5115378499031067, @@ -748,7 +748,7 @@ "confidence": 0.45199802144368495 }, { - "observation_id": "3a283390-de28-4582-bb6d-088ae2a44976", + "observation_id": "4f3e8c75-3450-4784-970a-40fbfde23d82", "type": "aruco", "marker_id": 51, "marker_size_m": 0.025, @@ -802,7 +802,7 @@ "confidence": 0.45199802144368495 }, { - "observation_id": "944cea3b-d662-4beb-9d57-c54d862d8207", + "observation_id": "980079aa-9ad2-4f02-951a-76d19bb0f561", "type": "aruco", "marker_id": 62, "marker_size_m": 0.025, @@ -832,14 +832,14 @@ "area_px": 767.0, "perimeter_px": 111.09603309631348, "sharpness": { - "laplacian_var": 2014.0153586143513 + "laplacian_var": 2013.7457464348533 }, "contrast": { "p05": 13.0, "p95": 172.0, "dynamic_range": 159.0, - "mean_gray": 40.60296846011132, - "std_gray": 53.39308904524131 + "mean_gray": 40.59925788497217, + "std_gray": 53.39497241526239 }, "geometry": { "distance_to_center_norm": 0.38394394516944885, @@ -856,7 +856,7 @@ "confidence": 0.44348322079976393 }, { - "observation_id": "ecbabb2d-7bb0-4217-b4f0-22422e29720e", + "observation_id": "b5e7bd43-0be1-427c-8996-6f90539f370c", "type": "aruco", "marker_id": 42, "marker_size_m": 0.025, @@ -910,7 +910,7 @@ "confidence": 0.33469798269642576 }, { - "observation_id": "19492b51-c1ef-4c04-83ea-96c9a7c358f1", + "observation_id": "7419fc98-76c2-46ce-8745-5417ac0cfb74", "type": "aruco", "marker_id": 242, "marker_size_m": 0.025, @@ -940,14 +940,14 @@ "area_px": 731.5, "perimeter_px": 110.03786277770996, "sharpness": { - "laplacian_var": 3195.3420408163265 + "laplacian_var": 3195.8864681382756 }, "contrast": { "p05": 24.0, "p95": 181.0, "dynamic_range": 157.0, - "mean_gray": 83.15102040816326, - "std_gray": 68.26581934464349 + "mean_gray": 83.14897959183673, + "std_gray": 68.27537465787393 }, "geometry": { "distance_to_center_norm": 0.35004138946533203, @@ -964,7 +964,7 @@ "confidence": 0.3252974596452519 }, { - "observation_id": "564c1897-13a4-4f9f-b4d4-d854ab9d1bcb", + "observation_id": "7ba1ebbf-6a2a-436e-8a01-46d8a7bd0119", "type": "aruco", "marker_id": 79, "marker_size_m": 0.025, @@ -994,14 +994,14 @@ "area_px": 752.5, "perimeter_px": 110.03665542602539, "sharpness": { - "laplacian_var": 4399.166788739791 + "laplacian_var": 4398.761584278825 }, "contrast": { "p05": 16.0, "p95": 177.0, "dynamic_range": 161.0, - "mean_gray": 97.03159851301115, - "std_gray": 70.36443190012204 + "mean_gray": 97.02230483271376, + "std_gray": 70.37060328949264 }, "geometry": { "distance_to_center_norm": 0.3251786530017853, @@ -1018,7 +1018,7 @@ "confidence": 0.41815762699787656 }, { - "observation_id": "822e8efd-0dfa-445a-8552-1867bb7f96f9", + "observation_id": "94cd91d0-f47c-49ca-bc73-9470de0d7be3", "type": "aruco", "marker_id": 205, "marker_size_m": 0.025, @@ -1048,14 +1048,14 @@ "area_px": 720.0, "perimeter_px": 109.47726821899414, "sharpness": { - "laplacian_var": 3328.4253559999997 + "laplacian_var": 3328.9733559999995 }, "contrast": { "p05": 8.0, "p95": 163.0, "dynamic_range": 155.0, - "mean_gray": 71.47, - "std_gray": 65.92684658013 + "mean_gray": 71.468, + "std_gray": 65.9275433790764 }, "geometry": { "distance_to_center_norm": 0.7617100477218628, @@ -1072,7 +1072,7 @@ "confidence": 0.3958181457519531 }, { - "observation_id": "bdae3987-ec60-460f-aec7-445001761e76", + "observation_id": "6dee4404-e3c2-44e6-9647-47e25f45f01b", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -1102,14 +1102,14 @@ "area_px": 713.0, "perimeter_px": 108.02763557434082, "sharpness": { - "laplacian_var": 3231.681329803799 + "laplacian_var": 3232.592260977888 }, "contrast": { "p05": 8.0, "p95": 166.0, "dynamic_range": 158.0, - "mean_gray": 65.92712550607287, - "std_gray": 66.00566434591339 + "mean_gray": 65.92914979757084, + "std_gray": 66.00847265336618 }, "geometry": { "distance_to_center_norm": 0.6017478704452515, @@ -1126,7 +1126,7 @@ "confidence": 0.4015868133874269 }, { - "observation_id": "af6d1183-bdcb-4910-b9ce-7b0d1fbb6e63", + "observation_id": "60b87193-0968-400c-9685-42bc16b8688e", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -1156,14 +1156,14 @@ "area_px": 696.0, "perimeter_px": 106.03447341918945, "sharpness": { - "laplacian_var": 2740.7604960000003 + "laplacian_var": 2739.364496 }, "contrast": { "p05": 19.0, "p95": 177.0, "dynamic_range": 158.0, - "mean_gray": 82.98, - "std_gray": 69.6852896958892 + "mean_gray": 82.97, + "std_gray": 69.68274607103253 }, "geometry": { "distance_to_center_norm": 0.22625556588172913, @@ -1180,7 +1180,7 @@ "confidence": 0.38377189776715764 }, { - "observation_id": "b2fc322e-ec72-4e0e-8807-3ba56ada5f06", + "observation_id": "092fcd86-d44c-4c85-8f54-25735fbf8c1c", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -1234,7 +1234,7 @@ "confidence": 0.3320910299473707 }, { - "observation_id": "fdd4a323-88a4-4aad-b966-1a6118f1b8c7", + "observation_id": "56ad5c2f-b4c7-46d2-a9fd-93b8a9fdec5a", "type": "aruco", "marker_id": 206, "marker_size_m": 0.025, @@ -1264,14 +1264,14 @@ "area_px": 644.0, "perimeter_px": 102.69047164916992, "sharpness": { - "laplacian_var": 2930.8308884297526 + "laplacian_var": 2930.603615702479 }, "contrast": { "p05": 8.0, "p95": 162.0, "dynamic_range": 154.0, - "mean_gray": 65.975, - "std_gray": 63.491601538385304 + "mean_gray": 65.97045454545454, + "std_gray": 63.4904899089958 }, "geometry": { "distance_to_center_norm": 0.5558050274848938, @@ -1288,7 +1288,7 @@ "confidence": 0.3579602826436361 }, { - "observation_id": "755f2b20-1679-4b89-b45c-4838530fb0e7", + "observation_id": "f6e1f748-f2a0-4453-a79d-4e3447ee4829", "type": "aruco", "marker_id": 207, "marker_size_m": 0.025, @@ -1318,14 +1318,14 @@ "area_px": 633.0, "perimeter_px": 102.5910873413086, "sharpness": { - "laplacian_var": 2910.73442330785 + "laplacian_var": 2907.135355708782 }, "contrast": { "p05": 8.0, "p95": 162.0, "dynamic_range": 154.0, - "mean_gray": 66.39393939393939, - "std_gray": 64.8565284861777 + "mean_gray": 66.38694638694639, + "std_gray": 64.85033454199944 }, "geometry": { "distance_to_center_norm": 0.7160782814025879, @@ -1342,7 +1342,7 @@ "confidence": 0.343462485354258 }, { - "observation_id": "a8601e00-7142-49e4-a639-4d6ed1f8628b", + "observation_id": "c9d9132a-71f4-4d63-a4c5-88871cea9f1a", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -1396,7 +1396,7 @@ "confidence": 0.3524419738837484 }, { - "observation_id": "7f8e0cbd-6ebb-4fe0-8c0c-cd0dc7edd2f3", + "observation_id": "4c0b8592-3a5c-4b44-87bb-7709eab5de5a", "type": "aruco", "marker_id": 113, "marker_size_m": 0.025, @@ -1426,14 +1426,14 @@ "area_px": 466.5, "perimeter_px": 95.48980712890625, "sharpness": { - "laplacian_var": 912.3580829863178 + "laplacian_var": 911.8046456722188 }, "contrast": { "p05": 13.0, - "p95": 101.0, - "dynamic_range": 88.0, + "p95": 100.64999999999998, + "dynamic_range": 87.64999999999998, "mean_gray": 34.646341463414636, - "std_gray": 31.872410253942164 + "std_gray": 31.86820112137914 }, "geometry": { "distance_to_center_norm": 0.19274351000785828, @@ -1450,7 +1450,7 @@ "confidence": 0.1293030348501416 }, { - "observation_id": "605dc35c-d23e-4d90-8568-d8506c0e01c7", + "observation_id": "c8af20e3-9333-4a0c-b770-316f09f2020c", "type": "aruco", "marker_id": 94, "marker_size_m": 0.025, @@ -1480,14 +1480,14 @@ "area_px": 494.0, "perimeter_px": 91.84971618652344, "sharpness": { - "laplacian_var": 2214.891186200378 + "laplacian_var": 2214.8422731569 }, "contrast": { "p05": 7.0, "p95": 152.0, "dynamic_range": 145.0, - "mean_gray": 58.80434782608695, - "std_gray": 57.80937360626374 + "mean_gray": 58.80163043478261, + "std_gray": 57.811362069217886 }, "geometry": { "distance_to_center_norm": 0.8406231999397278, @@ -1504,7 +1504,7 @@ "confidence": 0.06057156860351561 }, { - "observation_id": "10d01448-c813-4a5b-8b7f-af8e62690328", + "observation_id": "8bee69da-7677-42b6-adf3-a50699c64290", "type": "aruco", "marker_id": 76, "marker_size_m": 0.025, @@ -1534,14 +1534,14 @@ "area_px": 494.0, "perimeter_px": 90.83297729492188, "sharpness": { - "laplacian_var": 2257.6236929938564 + "laplacian_var": 2259.2476075141776 }, "contrast": { "p05": 7.0, "p95": 148.0, "dynamic_range": 141.0, - "mean_gray": 70.48641304347827, - "std_gray": 58.066395937183344 + "mean_gray": 70.48913043478261, + "std_gray": 58.07467916496329 }, "geometry": { "distance_to_center_norm": 0.5616520643234253, @@ -1558,7 +1558,7 @@ "confidence": 0.2459421895345052 }, { - "observation_id": "b421a4da-8d76-4841-aedf-0cdbca381afc", + "observation_id": "ceddd6ad-92d0-4b73-a57e-962cf33b7558", "type": "aruco", "marker_id": 100, "marker_size_m": 0.025, @@ -1588,14 +1588,14 @@ "area_px": 484.5, "perimeter_px": 90.57174110412598, "sharpness": { - "laplacian_var": 2179.903331005747 + "laplacian_var": 2180.9615027508994 }, "contrast": { "p05": 7.0, "p95": 152.0, "dynamic_range": 145.0, - "mean_gray": 79.06094182825485, - "std_gray": 60.88221813912131 + "mean_gray": 79.05817174515235, + "std_gray": 60.884473010129575 }, "geometry": { "distance_to_center_norm": 0.7340260744094849, @@ -1612,7 +1612,7 @@ "confidence": 0.24407473894265982 }, { - "observation_id": "af8676dc-dbf0-4f2b-8a58-1de7527216eb", + "observation_id": "bbf182f3-9650-4f9c-89fb-bc884319aedf", "type": "aruco", "marker_id": 41, "marker_size_m": 0.025, @@ -1666,7 +1666,7 @@ "confidence": 0.060547802731330126 }, { - "observation_id": "37bd7c8b-7fbe-4818-9a0a-ec50adaeadab", + "observation_id": "a75b3501-c220-4896-9686-ecbe621f074a", "type": "aruco", "marker_id": 81, "marker_size_m": 0.025, @@ -1720,7 +1720,7 @@ "confidence": 0.24033422651029265 }, { - "observation_id": "ae90470e-c172-4c81-8cae-901dc216242b", + "observation_id": "311a0611-d6d5-4d12-8ed3-25f0069fc4f3", "type": "aruco", "marker_id": 75, "marker_size_m": 0.025, @@ -1774,7 +1774,7 @@ "confidence": 0.23896265492072474 }, { - "observation_id": "c5ca9202-3d49-47d6-95d3-f739561a9a1b", + "observation_id": "ed9d5bfb-cab9-447f-88f8-832da0d5e9d2", "type": "aruco", "marker_id": 68, "marker_size_m": 0.025, @@ -1804,14 +1804,14 @@ "area_px": 486.0, "perimeter_px": 89.4791259765625, "sharpness": { - "laplacian_var": 2275.98433257389 + "laplacian_var": 2276.901251521488 }, "contrast": { "p05": 7.0, "p95": 144.0, "dynamic_range": 137.0, - "mean_gray": 57.29329608938548, - "std_gray": 54.62012551690231 + "mean_gray": 57.28491620111732, + "std_gray": 54.62157621417995 }, "geometry": { "distance_to_center_norm": 0.3999340832233429, @@ -1828,7 +1828,7 @@ "confidence": 0.24909137483284013 }, { - "observation_id": "eb60556e-e5cd-4ea9-88ee-eb2e45d84e47", + "observation_id": "d318de30-1035-4217-b9cd-30a3e552c8c0", "type": "aruco", "marker_id": 77, "marker_size_m": 0.025, @@ -1858,14 +1858,14 @@ "area_px": 484.5, "perimeter_px": 89.34035682678223, "sharpness": { - "laplacian_var": 2545.3969811937127 + "laplacian_var": 2545.7021583054293 }, "contrast": { "p05": 8.0, "p95": 166.0, "dynamic_range": 158.0, - "mean_gray": 65.45231607629428, - "std_gray": 64.08069069309342 + "mean_gray": 65.44959128065395, + "std_gray": 64.08115634042187 }, "geometry": { "distance_to_center_norm": 0.4524144232273102, @@ -1882,7 +1882,7 @@ "confidence": 0.23734254719660833 }, { - "observation_id": "637e755d-5f1b-47ac-b2a4-43f863dc9d84", + "observation_id": "f45dd642-2a5a-45a6-92bd-4be23b478342", "type": "aruco", "marker_id": 46, "marker_size_m": 0.025, @@ -1912,14 +1912,14 @@ "area_px": 484.5, "perimeter_px": 89.34035682678223, "sharpness": { - "laplacian_var": 1982.6226937611834 + "laplacian_var": 1981.211249619494 }, "contrast": { "p05": 7.0, "p95": 145.0, "dynamic_range": 138.0, - "mean_gray": 72.82561307901908, - "std_gray": 56.78264978602379 + "mean_gray": 72.8283378746594, + "std_gray": 56.78181832054824 }, "geometry": { "distance_to_center_norm": 0.35030537843704224, @@ -1936,7 +1936,7 @@ "confidence": 0.23734254719660833 }, { - "observation_id": "ae1c8262-c038-4d4b-8806-d24950ce7d64", + "observation_id": "7a47f997-16e8-4fe1-84f5-4b6ff1daf0fa", "type": "aruco", "marker_id": 56, "marker_size_m": 0.025, @@ -1990,7 +1990,7 @@ "confidence": 0.236365170112023 }, { - "observation_id": "7c1858de-2fb9-4225-a5b6-df0d46047e0d", + "observation_id": "f02f7b22-3161-49d6-bba9-c497030a526d", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -2020,14 +2020,14 @@ "area_px": 472.5, "perimeter_px": 88.15629386901855, "sharpness": { - "laplacian_var": 1703.771517169549 + "laplacian_var": 1707.2771351470772 }, "contrast": { "p05": 6.0, "p95": 136.0, "dynamic_range": 130.0, - "mean_gray": 72.09269662921348, - "std_gray": 52.553021407149615 + "mean_gray": 72.09831460674157, + "std_gray": 52.56113505726226 }, "geometry": { "distance_to_center_norm": 0.29185158014297485, @@ -2044,7 +2044,7 @@ "confidence": 0.21925684197423947 }, { - "observation_id": "55bef921-c8fa-40c7-ab89-10ae3fbc61e0", + "observation_id": "78ee5151-9ea2-4203-9d7e-4f19a622d677", "type": "aruco", "marker_id": 50, "marker_size_m": 0.025, @@ -2074,14 +2074,14 @@ "area_px": 464.0, "perimeter_px": 87.56328582763672, "sharpness": { - "laplacian_var": 2325.2294151936353 + "laplacian_var": 2321.5857341072733 }, "contrast": { "p05": 6.0, - "p95": 144.59999999999997, - "dynamic_range": 138.59999999999997, - "mean_gray": 50.16905444126075, - "std_gray": 52.45811607450139 + "p95": 144.0, + "dynamic_range": 138.0, + "mean_gray": 50.146131805157594, + "std_gray": 52.433217103385026 }, "geometry": { "distance_to_center_norm": 0.4071614444255829, @@ -2098,7 +2098,7 @@ "confidence": 0.21921579106955483 }, { - "observation_id": "cf70e9d2-a952-42d6-8ec7-247c3f8b81c1", + "observation_id": "808a41bf-c146-44ec-b1cd-42b837cee9ef", "type": "aruco", "marker_id": 104, "marker_size_m": 0.025, @@ -2128,14 +2128,14 @@ "area_px": 450.0, "perimeter_px": 87.36308288574219, "sharpness": { - "laplacian_var": 1878.5058106575962 + "laplacian_var": 1879.4760487528342 }, "contrast": { "p05": 7.0, "p95": 151.0, "dynamic_range": 144.0, - "mean_gray": 84.11607142857143, - "std_gray": 60.22572800006452 + "mean_gray": 84.11011904761905, + "std_gray": 60.22188450883409 }, "geometry": { "distance_to_center_norm": 0.7623366713523865, @@ -2152,7 +2152,7 @@ "confidence": 0.22417849731445313 }, { - "observation_id": "3ad2e99f-5014-4aa6-a85b-4af1ff3e6fa5", + "observation_id": "0d04f29b-796d-4ecf-a778-2085c36e4a05", "type": "aruco", "marker_id": 52, "marker_size_m": 0.025, @@ -2182,14 +2182,14 @@ "area_px": 459.0, "perimeter_px": 87.1385269165039, "sharpness": { - "laplacian_var": 2868.848152717685 + "laplacian_var": 2866.9628177393183 }, "contrast": { "p05": 10.0, "p95": 171.0, "dynamic_range": 161.0, "mean_gray": 72.78779069767442, - "std_gray": 64.66446286724789 + "std_gray": 64.65560616893535 }, "geometry": { "distance_to_center_norm": 0.34990212321281433, @@ -2206,7 +2206,7 @@ "confidence": 0.21217281752366285 }, { - "observation_id": "252303c9-04cd-41ef-a7d5-b24930d1446c", + "observation_id": "e9dd5851-74bb-4526-9c77-3ebfc8072af6", "type": "aruco", "marker_id": 67, "marker_size_m": 0.025, @@ -2236,14 +2236,14 @@ "area_px": 430.0, "perimeter_px": 84.38635444641113, "sharpness": { - "laplacian_var": 1662.8054166134373 + "laplacian_var": 1661.570306895569 }, "contrast": { "p05": 6.0, "p95": 131.0, "dynamic_range": 125.0, - "mean_gray": 47.47962382445141, - "std_gray": 45.82656474384839 + "mean_gray": 47.46708463949843, + "std_gray": 45.80712612385084 }, "geometry": { "distance_to_center_norm": 0.36235129833221436, @@ -2260,7 +2260,7 @@ "confidence": 0.19627771759033205 }, { - "observation_id": "712e48f6-7cfa-4b42-b431-e85dc7998b28", + "observation_id": "650693aa-a14b-4c22-b95d-415d5590b9c1", "type": "aruco", "marker_id": 88, "marker_size_m": 0.025, @@ -2314,7 +2314,7 @@ "confidence": 0.20782158780899712 }, { - "observation_id": "b5dd6078-a60f-4839-a291-9d6c973c2991", + "observation_id": "67e43b95-2c10-432c-bb35-d0e6a5e7b5cf", "type": "aruco", "marker_id": 70, "marker_size_m": 0.025, @@ -2344,14 +2344,14 @@ "area_px": 408.0, "perimeter_px": 82.2344856262207, "sharpness": { - "laplacian_var": 2031.9286555555557 + "laplacian_var": 2027.3753222222222 }, "contrast": { "p05": 7.0, "p95": 145.0, "dynamic_range": 138.0, - "mean_gray": 71.67, - "std_gray": 55.41956122766281 + "mean_gray": 71.66333333333333, + "std_gray": 55.408753720769504 }, "geometry": { "distance_to_center_norm": 0.4716681241989136, @@ -2368,7 +2368,7 @@ "confidence": 0.193995418548584 }, { - "observation_id": "1dbfdb0a-6131-46a0-a382-0e319aaba49a", + "observation_id": "8c07028a-1447-4b30-b408-99a46d535bbd", "type": "aruco", "marker_id": 73, "marker_size_m": 0.025, @@ -2398,14 +2398,14 @@ "area_px": 404.0, "perimeter_px": 82.04937934875488, "sharpness": { - "laplacian_var": 3395.0972478717176 + "laplacian_var": 3391.862348542858 }, "contrast": { "p05": 9.0, "p95": 162.0, "dynamic_range": 153.0, - "mean_gray": 92.04026845637584, - "std_gray": 58.37875397235002 + "mean_gray": 92.03020134228188, + "std_gray": 58.36056428546464 }, "geometry": { "distance_to_center_norm": 0.29950854182243347, @@ -2422,7 +2422,7 @@ "confidence": 0.1722355942663244 }, { - "observation_id": "54b837a5-3cba-4b39-b150-37ec4435fb6b", + "observation_id": "d6594bec-6360-4e69-ae52-a30b15879bc5", "type": "aruco", "marker_id": 98, "marker_size_m": 0.025, @@ -2452,14 +2452,14 @@ "area_px": 399.5, "perimeter_px": 81.37991905212402, "sharpness": { - "laplacian_var": 1883.9028312066052 + "laplacian_var": 1884.1615218615123 }, "contrast": { "p05": 7.0, "p95": 141.0, "dynamic_range": 134.0, - "mean_gray": 64.9931506849315, - "std_gray": 54.1727319284687 + "mean_gray": 64.98972602739725, + "std_gray": 54.17200438260567 }, "geometry": { "distance_to_center_norm": 0.4462646245956421, @@ -2476,7 +2476,7 @@ "confidence": 0.1899538473288218 }, { - "observation_id": "35b16fa1-e00f-4cc4-ae26-1b516b8e5505", + "observation_id": "6e55e80f-3f2c-4653-ab27-7e431fdf8b94", "type": "aruco", "marker_id": 83, "marker_size_m": 0.025, @@ -2530,7 +2530,7 @@ "confidence": 0.17676838843571283 }, { - "observation_id": "8f290ad0-b46b-4976-820b-7690a7a98ad7", + "observation_id": "e12868a2-1e6d-40f8-8d2a-1337506d6f99", "type": "aruco", "marker_id": 61, "marker_size_m": 0.025, @@ -2560,14 +2560,14 @@ "area_px": 390.5, "perimeter_px": 81.19655227661133, "sharpness": { - "laplacian_var": 3407.0557484473575 + "laplacian_var": 3407.2095946012037 }, "contrast": { "p05": 9.0, "p95": 169.0, "dynamic_range": 160.0, - "mean_gray": 98.1118881118881, - "std_gray": 62.92443074471887 + "mean_gray": 98.11538461538461, + "std_gray": 62.92834176172167 }, "geometry": { "distance_to_center_norm": 0.5446262955665588, @@ -2584,7 +2584,7 @@ "confidence": 0.1668050360320266 }, { - "observation_id": "ef4c7f94-d7fb-4155-ac61-6d9fca7943fc", + "observation_id": "ee69775f-81e3-41de-891c-b5817978e6e9", "type": "aruco", "marker_id": 90, "marker_size_m": 0.025, @@ -2614,14 +2614,14 @@ "area_px": 389.5, "perimeter_px": 80.76479721069336, "sharpness": { - "laplacian_var": 1620.135992725641 + "laplacian_var": 1620.7476765744382 }, "contrast": { "p05": 6.0, "p95": 142.0, "dynamic_range": 136.0, - "mean_gray": 70.56357388316151, - "std_gray": 55.34104117277218 + "mean_gray": 70.55670103092784, + "std_gray": 55.34017929847089 }, "geometry": { "distance_to_center_norm": 0.527838945388794, @@ -2638,7 +2638,7 @@ "confidence": 0.17612778902053833 }, { - "observation_id": "8958b42c-5c59-43bb-8c83-a98457f1a9de", + "observation_id": "bc186931-8abe-462e-b65c-22412ea9210f", "type": "aruco", "marker_id": 91, "marker_size_m": 0.025, @@ -2668,14 +2668,14 @@ "area_px": 389.5, "perimeter_px": 80.76479721069336, "sharpness": { - "laplacian_var": 1597.8592128104297 + "laplacian_var": 1595.9004499238317 }, "contrast": { "p05": 7.0, "p95": 147.0, "dynamic_range": 140.0, - "mean_gray": 65.78694158075601, - "std_gray": 58.31743888645092 + "mean_gray": 65.78350515463917, + "std_gray": 58.309559048012744 }, "geometry": { "distance_to_center_norm": 0.6315658688545227, @@ -2743,6 +2743,31 @@ ], "area_px": 3603.5 }, + { + "image_points_px": [ + [ + 716.0, + 18.0 + ], + [ + 748.0, + 18.0 + ], + [ + 751.0, + 33.0 + ], + [ + 717.0, + 34.0 + ] + ], + "center_px": [ + 733.0, + 25.75 + ], + "area_px": 512.5 + }, { "image_points_px": [ [ @@ -2968,6 +2993,31 @@ ], "area_px": 52.0 }, + { + "image_points_px": [ + [ + 564.0, + 59.0 + ], + [ + 568.0, + 60.0 + ], + [ + 568.0, + 80.0 + ], + [ + 564.0, + 71.0 + ] + ], + "center_px": [ + 566.0, + 67.5 + ], + "area_px": 64.0 + }, { "image_points_px": [ [ diff --git a/data/evaluations/Scene5/render_b_camera_pose.json b/data/evaluations/Scene5/render_b_camera_pose.json index 0bb389d..2b6b246 100644 --- a/data/evaluations/Scene5/render_b_camera_pose.json +++ b/data/evaluations/Scene5/render_b_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:47Z", + "created_utc": "2026-06-01T19:02:39Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_b_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -83,156 +83,150 @@ 0, 1, 2, - 3, - 4, - 5 + 3 ], "rms": [ - 0.019014748761315543, - 0.004619788184640585, - 0.004538441176855119, - 0.004537863788318027, - 0.004537858373125672, - 0.004537858312023645 + 0.010788374414626498, + 0.0006283868577842543, + 0.00010015437449340027, + 0.00010012312045103065 ], "lambda": [ 0.001, 0.0005, 0.00025, - 0.000125, - 6.25e-05, - 3.125e-05 + 0.000125 ] }, - "residual_rms_px": 10.633457645916426, - "residual_median_px": 9.016718027971324, - "residual_max_px": 22.39722591631947, - "sigma2_normalized": 2.230817122379446e-05 + "residual_rms_px": 0.25172161827996986, + "residual_median_px": 0.18693759385431497, + "residual_max_px": 0.5431542525628097, + "sigma2_normalized": 1.0860025851246174e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.9995320439338684, - -0.024739401414990425, - 0.017991842702031136 + 0.9999215602874756, + -0.012518510222434998, + 0.0004309560463298112 ], [ - -0.01416316069662571, - -0.8955954909324646, - -0.44464385509490967 + -0.009490192867815495, + -0.7795912027359009, + -0.6262168288230896 ], [ - 0.02711363509297371, - 0.444180965423584, - -0.8955267071723938 + 0.00817527063190937, + 0.6261636018753052, + -0.7796488404273987 ] ], "translation_m": [ - -0.31101080775260925, - 0.07255169749259949, - 1.4765533208847046 + -0.3113338351249695, + 0.05273256078362465, + 1.4961143732070923 ], "rvec_rad": [ - 2.68068224348394, - -0.027511189328419717, - 0.03189778031780517 + 2.464863487857364, + -0.01524191774975167, + 0.005960160508327033 ] }, "camera_in_world": { "position_m": [ - 0.2718580961227417, - -0.598574161529541, - 1.3601481914520264 + 0.2995787262916565, + -0.8995999097824097, + 1.1995999813079834 ], "position_mm": [ - 271.85809326171875, - -598.5741577148438, - 1360.148193359375 + 299.5787353515625, + -899.5999145507812, + 1199.5999755859375 ], "orientation_deg": { - "roll": 153.61859130859375, - "pitch": -1.5536872148513794, - "yaw": -0.8118149042129517 + "roll": 141.23080444335938, + "pitch": -0.46841371059417725, + "yaw": -0.5437742471694946 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 0.00019133657717055122, - -1.0916805209409927e-06, - 8.861758548696409e-06, - 2.7234100904324163e-06, - 1.39023864013734e-05, - 4.4073908024237204e-05 + 5.1223996619942105e-08, + 5.436565373815403e-10, + 2.663456418502318e-09, + 1.0329860552718278e-09, + 3.078386141902941e-09, + 1.4142279456401988e-08 ], [ - -1.0916805209412515e-06, - 2.2833577802798103e-05, - -1.5816789589176068e-05, - -2.1844931942382565e-06, - -5.795227126258946e-06, - 6.857593537450532e-06 + 5.436565373815247e-10, + 1.1163075057660146e-08, + -7.554998341612341e-09, + -9.552443607937791e-10, + -2.5506221219613407e-09, + 4.163590572092998e-09 ], [ - 8.861758548697637e-06, - -1.581678958917603e-05, - 0.00030460889350283763, - 2.070341169352513e-05, - -1.7321493479760594e-05, - -0.00010707981029759272 + 2.663456418502147e-09, + -7.554998341612328e-09, + 8.255636663368415e-08, + 5.5119910232811535e-09, + -6.826870643038208e-09, + -3.0484897534294594e-08 ], [ - 2.723410090432499e-06, - -2.1844931942382578e-06, - 2.070341169352517e-05, - 2.9833009116325044e-06, - -6.33420526642329e-07, - -4.788921674075976e-06 + 1.0329860552718176e-09, + -9.552443607937785e-10, + 5.5119910232811535e-09, + 1.1546827745142382e-09, + -2.2881424871401727e-10, + -7.22587431737592e-10 ], [ - 1.3902386401373393e-05, - -5.795227126258937e-06, - -1.732149347976066e-05, - -6.334205266423318e-07, - 5.443286172132083e-06, - 9.901129428504407e-06 + 3.0783861419029624e-09, + -2.5506221219613403e-09, + -6.826870643038182e-09, + -2.2881424871401595e-10, + 2.4517455642815944e-09, + 3.5314875955708873e-09 ], [ - 4.40739080242368e-05, - 6.857593537450539e-06, - -0.0001070798102975928, - -4.788921674075968e-06, - 9.901129428504386e-06, - 7.708528147006182e-05 + 1.4142279456402096e-08, + 4.163590572092981e-09, + -3.048489753429441e-08, + -7.225874317375766e-10, + 3.531487595570884e-09, + 3.081348312908613e-08 ] ], "parameter_std": { "rvec_std_deg": [ - 0.7925408068516079, - 0.27378497804757806, - 0.9999860048326508 + 0.01296759273639198, + 0.0060536116232332285, + 0.016462580739937345 ], "tvec_std_m": [ - 0.001727223468932872, - 0.002333085118921314, - 0.0087798224053828 + 3.398062351567785e-05, + 4.951510440543971e-05, + 0.00017553769717381545 ] }, "camera_center_std_m": [ - 0.020267484830436125, - 0.01943078553031624, - 0.014686466065403877 + 0.0003407588982733064, + 0.0002405235424008798, + 0.00028986017261716846 ], "camera_center_std_mm": [ - 20.267484830436125, - 19.430785530316243, - 14.686466065403877 + 0.3407588982733064, + 0.2405235424008798, + 0.28986017261716845 ], "orientation_std_deg": { - "roll": 0.8442655356428828, - "pitch": 0.717094434071231, - "yaw": 0.22985076602033067 + "roll": 0.01726739420377664, + "pitch": 0.012353544048253897, + "yaw": 0.005236141764521027 } } }, @@ -245,10 +239,10 @@ 678.75 ], "projected_center_px": [ - 1231.3145751953125, - 661.8392333984375 + 1245.9285888671875, + 678.5679321289062 ], - "reprojection_error_px": 22.39722591631947, + "reprojection_error_px": 0.19557162261988542, "confidence": 0.1539593300495616 }, { @@ -258,10 +252,10 @@ 665.5 ], "projected_center_px": [ - 1070.0548095703125, - 650.8004150390625 + 1078.4239501953125, + 665.29248046875 ], - "reprojection_error_px": 16.829704222078934, + "reprojection_error_px": 0.27078224886331936, "confidence": 0.39637168760361213 }, { @@ -271,10 +265,10 @@ 635.25 ], "projected_center_px": [ - 228.30343627929688, - 628.4571533203125 + 220.4341278076172, + 635.3922729492188 ], - "reprojection_error_px": 10.345838959639192, + "reprojection_error_px": 0.15678245376546215, "confidence": 0.4633649853376546 }, { @@ -284,10 +278,10 @@ 668.0 ], "projected_center_px": [ - 316.1379089355469, - 658.1041259765625 + 307.2491760253906, + 668.116455078125 ], - "reprojection_error_px": 13.301249863615038, + "reprojection_error_px": 0.11645799309303226, "confidence": 0.3638956157928849 }, { @@ -297,10 +291,10 @@ 622.75 ], "projected_center_px": [ - 1058.1583251953125, - 611.7727661132812 + 1064.5740966796875, + 622.5802612304688 ], - "reprojection_error_px": 12.677401276765467, + "reprojection_error_px": 0.18520682444957254, "confidence": 0.46896024883690896 }, { @@ -310,10 +304,10 @@ 628.0 ], "projected_center_px": [ - 718.0581665039062, - 618.8654174804688 + 716.9169921875, + 628.133056640625 ], - "reprojection_error_px": 9.227778573853415, + "reprojection_error_px": 0.2135192270041402, "confidence": 0.44372569385651617 }, { @@ -323,10 +317,10 @@ 633.0 ], "projected_center_px": [ - 388.1963195800781, - 625.3720092773438 + 381.98260498046875, + 633.0802001953125 ], - "reprojection_error_px": 9.82754388458222, + "reprojection_error_px": 0.08206496227170104, "confidence": 0.45199802144368495 }, { @@ -336,10 +330,10 @@ 615.0 ], "projected_center_px": [ - 466.4371337890625, - 608.1547241210938 + 461.8410339355469, + 614.9932861328125 ], - "reprojection_error_px": 8.157570601617609, + "reprojection_error_px": 0.15910778001193557, "confidence": 0.45199802144368495 }, { @@ -349,10 +343,10 @@ 615.0 ], "projected_center_px": [ - 760.65966796875, - 606.5950317382812 + 760.3372802734375, + 615.1187133789062 ], - "reprojection_error_px": 8.414946186703707, + "reprojection_error_px": 0.14734555460774393, "confidence": 0.44348322079976393 }, { @@ -362,10 +356,10 @@ 598.75 ], "projected_center_px": [ - 645.6691284179688, - 592.2417602539062 + 643.6570434570312, + 598.95068359375 ], - "reprojection_error_px": 6.785295754592402, + "reprojection_error_px": 0.22116695883679394, "confidence": 0.41815762699787656 }, { @@ -375,10 +369,10 @@ 502.0 ], "projected_center_px": [ - 1178.065185546875, - 506.63800048828125 + 1180.75732421875, + 502.1455993652344 ], - "reprojection_error_px": 5.48855030072318, + "reprojection_error_px": 0.2830030211180629, "confidence": 0.3958181457519531 }, { @@ -388,10 +382,10 @@ 503.25 ], "projected_center_px": [ - 1056.85205078125, - 508.3726501464844 + 1058.0296630859375, + 503.39373779296875 ], - "reprojection_error_px": 5.24969827057757, + "reprojection_error_px": 0.14676665764015595, "confidence": 0.4015868133874269 }, { @@ -401,10 +395,10 @@ 508.5 ], "projected_center_px": [ - 567.444580078125, - 515.3764038085938 + 565.72705078125, + 508.4004211425781 ], - "reprojection_error_px": 7.146070320048863, + "reprojection_error_px": 0.24792742105640808, "confidence": 0.38377189776715764 }, { @@ -414,10 +408,10 @@ 441.75 ], "projected_center_px": [ - 288.16082763671875, - 452.01336669921875 + 291.1782531738281, + 441.4239807128906 ], - "reprojection_error_px": 10.648830720367961, + "reprojection_error_px": 0.3715679877856875, "confidence": 0.3320910299473707 }, { @@ -427,10 +421,10 @@ 424.5 ], "projected_center_px": [ - 1044.544921875, - 432.6785583496094 + 1042.8310546875, + 424.42144775390625 ], - "reprojection_error_px": 8.323196518034326, + "reprojection_error_px": 0.1863141808400416, "confidence": 0.3579602826436361 }, { @@ -440,10 +434,10 @@ 423.25 ], "projected_center_px": [ - 1162.8939208984375, - 431.1227722167969 + 1161.4569091796875, + 423.25830078125 ], - "reprojection_error_px": 7.92336020576069, + "reprojection_error_px": 0.5431542525628097, "confidence": 0.343462485354258 }, { @@ -453,10 +447,10 @@ 429.0 ], "projected_center_px": [ - 566.8086547851562, - 438.9588317871094 + 567.0277099609375, + 429.0868835449219 ], - "reprojection_error_px": 9.960669834663918, + "reprojection_error_px": 0.09119535247669833, "confidence": 0.3524419738837484 }, { @@ -466,10 +460,10 @@ 279.5 ], "projected_center_px": [ - 1260.9298095703125, - 282.06109619140625 + 1251.8382568359375, + 279.6079406738281 ], - "reprojection_error_px": 9.28981768732198, + "reprojection_error_px": 0.19445318250781718, "confidence": 0.06057156860351561 }, { @@ -479,10 +473,10 @@ 287.5 ], "projected_center_px": [ - 1051.9197998046875, - 289.9732971191406 + 1046.06005859375, + 287.12738037109375 ], - "reprojection_error_px": 6.415701704967858, + "reprojection_error_px": 0.3774286986034038, "confidence": 0.2459421895345052 }, { @@ -492,10 +486,10 @@ 281.5 ], "projected_center_px": [ - 1181.4547119140625, - 283.9833679199219 + 1173.4600830078125, + 281.3835754394531 ], - "reprojection_error_px": 8.572305046978684, + "reprojection_error_px": 0.24018648685985625, "confidence": 0.24407473894265982 }, { @@ -505,10 +499,10 @@ 291.0 ], "projected_center_px": [ - 433.3675537109375, - 294.8941650390625 + 441.53662109375, + 290.8290710449219 ], - "reprojection_error_px": 9.016718027971324, + "reprojection_error_px": 0.1748079294298344, "confidence": 0.24033422651029265 }, { @@ -518,10 +512,10 @@ 271.5 ], "projected_center_px": [ - 256.81854248046875, - 275.6658630371094 + 271.7822570800781, + 271.46978759765625 ], - "reprojection_error_px": 15.50170437408482, + "reprojection_error_px": 0.0441962495077037, "confidence": 0.23896265492072474 }, { @@ -531,10 +525,10 @@ 285.25 ], "projected_center_px": [ - 927.7509765625, - 288.1630859375 + 923.9786376953125, + 285.0816650390625 ], - "reprojection_error_px": 4.749304670336971, + "reprojection_error_px": 0.16968502330904528, "confidence": 0.24909137483284013 }, { @@ -544,10 +538,10 @@ 273.5 ], "projected_center_px": [ - 306.0224609375, - 277.6189880371094 + 319.1261291503906, + 273.482666015625 ], - "reprojection_error_px": 13.854019348182444, + "reprojection_error_px": 0.12507779338180355, "confidence": 0.23734254719660833 }, { @@ -557,10 +551,10 @@ 273.5 ], "projected_center_px": [ - 885.1730346679688, - 276.4631652832031 + 882.0449829101562, + 273.3497619628906 ], - "reprojection_error_px": 4.162268632095655, + "reprojection_error_px": 0.2541721364006649, "confidence": 0.23734254719660833 }, { @@ -570,10 +564,10 @@ 287.5 ], "projected_center_px": [ - 844.4288330078125, - 290.6997375488281 + 842.3339233398438, + 287.45281982421875 ], - "reprojection_error_px": 3.8711282150445343, + "reprojection_error_px": 0.09627614427925126, "confidence": 0.236365170112023 }, { @@ -583,10 +577,10 @@ 252.25 ], "projected_center_px": [ - 827.0885009765625, - 255.29331970214844 + 825.06640625, + 252.26885986328125 ], - "reprojection_error_px": 3.5555422442021585, + "reprojection_error_px": 0.1845599075694663, "confidence": 0.21925684197423947 }, { @@ -596,10 +590,10 @@ 251.25 ], "projected_center_px": [ - 923.0028686523438, - 254.603271484375 + 918.6514892578125, + 251.72935485839844 ], - "reprojection_error_px": 5.614290315630511, + "reprojection_error_px": 0.5027226626110745, "confidence": 0.21921579106955483 }, { @@ -609,10 +603,10 @@ 228.0 ], "projected_center_px": [ - 1195.1627197265625, - 230.02491760253906 + 1184.094482421875, + 227.8125 ], - "reprojection_error_px": 11.344893256036396, + "reprojection_error_px": 0.20995994390208214, "confidence": 0.22417849731445313 }, { @@ -622,10 +616,10 @@ 259.0 ], "projected_center_px": [ - 392.7223815917969, - 262.7169494628906 + 403.56524658203125, + 258.92913818359375 ], - "reprojection_error_px": 11.63718527250569, + "reprojection_error_px": 0.19787678609561232, "confidence": 0.21217281752366285 }, { @@ -635,10 +629,10 @@ 209.25 ], "projected_center_px": [ - 862.7577514648438, - 211.37908935546875 + 859.30615234375, + 209.13885498046875 ], - "reprojection_error_px": 4.103333013866144, + "reprojection_error_px": 0.12452429913563098, "confidence": 0.19627771759033205 }, { @@ -648,10 +642,10 @@ 169.75 ], "projected_center_px": [ - 1117.2315673828125, - 171.20729064941406 + 1105.221435546875, + 170.17445373535156 ], - "reprojection_error_px": 12.318073578167663, + "reprojection_error_px": 0.47874280660258967, "confidence": 0.20782158780899712 }, { @@ -661,10 +655,10 @@ 183.5 ], "projected_center_px": [ - 944.41259765625, - 184.79647827148438 + 938.0165405273438, + 183.28164672851562 ], - "reprojection_error_px": 6.542343969050703, + "reprojection_error_px": 0.21897885791267274, "confidence": 0.193995418548584 }, { @@ -674,10 +668,10 @@ 162.25 ], "projected_center_px": [ - 534.602783203125, - 163.51803588867188 + 543.4832763671875, + 162.48081970214844 ], - "reprojection_error_px": 9.234689499056913, + "reprojection_error_px": 0.352731103250891, "confidence": 0.1722355942663244 }, { @@ -687,10 +681,10 @@ 172.5 ], "projected_center_px": [ - 914.4183959960938, - 173.80784606933594 + 908.763671875, + 172.59487915039062 ], - "reprojection_error_px": 5.817316779204062, + "reprojection_error_px": 0.09585913281927007, "confidence": 0.1899538473288218 }, { @@ -700,10 +694,10 @@ 159.75 ], "projected_center_px": [ - 343.40704345703125, - 160.58468627929688 + 361.09503173828125, + 159.58901977539062 ], - "reprojection_error_px": 17.612745984304475, + "reprojection_error_px": 0.18693759385431497, "confidence": 0.17676838843571283 }, { @@ -713,10 +707,10 @@ 162.5 ], "projected_center_px": [ - 271.1806335449219, - 163.80271911621094 + 292.1957092285156, + 162.64959716796875 ], - "reprojection_error_px": 21.10960160481748, + "reprojection_error_px": 0.15914396165937, "confidence": 0.1668050360320266 }, { @@ -726,10 +720,10 @@ 170.75 ], "projected_center_px": [ - 986.7044677734375, - 172.1038818359375 + 978.668212890625, + 170.97964477539062 ], - "reprojection_error_px": 8.562185547964651, + "reprojection_error_px": 0.4771150225565412, "confidence": 0.17612778902053833 }, { @@ -739,10 +733,10 @@ 161.75 ], "projected_center_px": [ - 1070.374267578125, - 162.5407257080078 + 1059.4134521484375, + 161.7484588623047 ], - "reprojection_error_px": 11.152335015369092, + "reprojection_error_px": 0.163459413721665, "confidence": 0.17612778902053833 } ] diff --git a/data/evaluations/Scene5/render_c_aruco_detection.json b/data/evaluations/Scene5/render_c_aruco_detection.json index 0cbbdb8..27edd28 100644 --- a/data/evaluations/Scene5/render_c_aruco_detection.json +++ b/data/evaluations/Scene5/render_c_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:44Z", + "created_utc": "2026-06-01T19:02:34Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,7 +35,7 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_c.png", - "image_sha256": "cdf7e47d6ac5ccaa9cf6f3fa1fad3c2b99020ff6c75e70909761b0ac9eed5617", + "image_sha256": "e83434c14279368808c2fc35b0045713f8d5fdd10798c56d015642ff0ffa8360", "width_px": 1280, "height_px": 720 }, @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "84d3c4bf-348d-4dde-ab3b-ba6d271c0c8d", + "observation_id": "f3707ba8-05a8-4e1c-8000-4481c8854c51", "type": "aruco", "marker_id": 42, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.9034560154563519 }, { - "observation_id": "dfac5e00-c922-4acf-9803-e61f35c1eaa1", + "observation_id": "dcfec6db-e399-49f4-833f-2716c85c7cd6", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -130,14 +130,14 @@ "area_px": 2709.5, "perimeter_px": 209.03179168701172, "sharpness": { - "laplacian_var": 1928.7278686380791 + "laplacian_var": 1928.938992361121 }, "contrast": { "p05": 48.0, "p95": 190.0, "dynamic_range": 142.0, - "mean_gray": 98.50624290578888, - "std_gray": 63.18894262083502 + "mean_gray": 98.50681044267877, + "std_gray": 63.18940062141509 }, "geometry": { "distance_to_center_norm": 0.365061491727829, @@ -154,7 +154,7 @@ "confidence": 0.9035563368771673 }, { - "observation_id": "954c6ed2-4b69-4a90-8b7b-8a0a8f1cc371", + "observation_id": "8f66d42a-0476-4c73-8120-938a7c870ef1", "type": "aruco", "marker_id": 41, "marker_size_m": 0.025, @@ -184,14 +184,14 @@ "area_px": 2205.0, "perimeter_px": 195.77733612060547, "sharpness": { - "laplacian_var": 1412.4774141177509 + "laplacian_var": 1412.5734781604458 }, "contrast": { "p05": 23.0, "p95": 174.0, "dynamic_range": 151.0, - "mean_gray": 61.47698465643762, - "std_gray": 59.52796280923706 + "mean_gray": 61.47631754503002, + "std_gray": 59.52670738508869 }, "geometry": { "distance_to_center_norm": 0.47317519783973694, @@ -208,7 +208,7 @@ "confidence": 0.9539329593288292 }, { - "observation_id": "400fd45a-ce58-4132-b1b6-ea6a6bdbf3cc", + "observation_id": "59d42771-0e0e-43c3-8e3c-48c8f667ebd6", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.7440653293809782 }, { - "observation_id": "cf08dc4f-e93e-44b2-8221-e2e19dd752f2", + "observation_id": "9348c8e6-c992-43c8-8414-b110e8ac00e4", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.663361454729631 }, { - "observation_id": "3bef45f1-d79d-4998-b3b0-aa48b9d5a75c", + "observation_id": "b0b023b3-0f28-4873-8b0b-d6ea12c83403", "type": "aruco", "marker_id": 115, "marker_size_m": 0.025, @@ -346,14 +346,14 @@ "area_px": 600.0, "perimeter_px": 149.25082778930664, "sharpness": { - "laplacian_var": 3710.282790064511 + "laplacian_var": 3710.5825663508645 }, "contrast": { "p05": 28.3, "p95": 178.0, "dynamic_range": 149.7, - "mean_gray": 63.702460850111855, - "std_gray": 53.00131751545189 + "mean_gray": 63.70022371364653, + "std_gray": 53.002718894796146 }, "geometry": { "distance_to_center_norm": 0.4459637403488159, @@ -370,7 +370,7 @@ "confidence": 0.386044632761102 }, { - "observation_id": "a39ae8a0-dd0b-4cc0-999d-2bbe7834afc9", + "observation_id": "3ce40fbb-63e5-400c-9365-4b5e53c31969", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -400,14 +400,14 @@ "area_px": 1070.0, "perimeter_px": 143.36686897277832, "sharpness": { - "laplacian_var": 2552.600911963899 + "laplacian_var": 2552.101384000321 }, "contrast": { "p05": 15.0, "p95": 169.0, "dynamic_range": 154.0, - "mean_gray": 67.74240422721269, - "std_gray": 65.24769155610541 + "mean_gray": 67.74636723910172, + "std_gray": 65.24625947775638 }, "geometry": { "distance_to_center_norm": 0.5515881180763245, @@ -424,7 +424,7 @@ "confidence": 0.2964796698261984 }, { - "observation_id": "c13ca70d-141d-45c4-abd2-1612e155990f", + "observation_id": "04c888f4-c7db-4ed5-a2e2-d47a2eb0adc6", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.2743742952602821 }, { - "observation_id": "146e68ea-d15b-41c5-8843-bd09bfbbbf22", + "observation_id": "1affa52b-859c-4cb0-9a69-9208f41541a9", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -508,14 +508,14 @@ "area_px": 819.5, "perimeter_px": 126.40194129943848, "sharpness": { - "laplacian_var": 2322.1822129926145 + "laplacian_var": 2323.8092492912388 }, "contrast": { "p05": 19.0, "p95": 170.0, "dynamic_range": 151.0, - "mean_gray": 93.32013769363166, - "std_gray": 65.52749622430895 + "mean_gray": 93.31669535283993, + "std_gray": 65.53494591488773 }, "geometry": { "distance_to_center_norm": 0.4841289222240448, @@ -532,7 +532,7 @@ "confidence": 0.21966133686197709 }, { - "observation_id": "42d7bd53-d94e-4084-a638-c6e112c091f4", + "observation_id": "b8e67d0c-b9c1-4f85-9400-93b58034fab0", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -586,7 +586,7 @@ "confidence": 0.233781757000696 }, { - "observation_id": "3e328dfd-91c0-4592-b6c2-b8b40473ab9e", + "observation_id": "2ab998aa-191e-4edd-a4d3-29384e453e58", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -616,14 +616,14 @@ "area_px": 806.0, "perimeter_px": 125.44890975952148, "sharpness": { - "laplacian_var": 1808.7900580984121 + "laplacian_var": 1808.600850627469 }, "contrast": { "p05": 21.0, "p95": 175.0, "dynamic_range": 154.0, - "mean_gray": 84.66959578207381, - "std_gray": 64.89350318578995 + "mean_gray": 84.6713532513181, + "std_gray": 64.89176527459722 }, "geometry": { "distance_to_center_norm": 0.31780895590782166, @@ -640,7 +640,7 @@ "confidence": 0.21604275474161502 }, { - "observation_id": "2da6b99b-6c71-420d-b0ca-e633f9f7c37e", + "observation_id": "08f2d0f6-1b83-44d8-818d-91b1528f0b19", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -670,14 +670,14 @@ "area_px": 462.0, "perimeter_px": 100.66341400146484, "sharpness": { - "laplacian_var": 981.0223756799505 + "laplacian_var": 980.0957138999267 }, "contrast": { - "p05": 16.0, + "p05": 16.05, "p95": 132.0, - "dynamic_range": 116.0, - "mean_gray": 84.67701863354037, - "std_gray": 38.995795677899025 + "dynamic_range": 115.95, + "mean_gray": 84.66459627329192, + "std_gray": 38.97665236787209 }, "geometry": { "distance_to_center_norm": 0.6683969497680664, diff --git a/data/evaluations/Scene5/render_c_camera_pose.json b/data/evaluations/Scene5/render_c_camera_pose.json index 2247fa3..5aa5b16 100644 --- a/data/evaluations/Scene5/render_c_camera_pose.json +++ b/data/evaluations/Scene5/render_c_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:47Z", + "created_utc": "2026-06-01T19:02:39Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_c_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -53,10 +53,10 @@ 3 ], "rms": [ - 0.007136348484444265, - 0.000574270707077874, - 0.0004752390212971235, - 0.0004752377585920085 + 0.00671761430914656, + 0.00033824227612189905, + 9.052017389733679e-05, + 9.051207538158261e-05 ], "lambda": [ 0.001, @@ -65,135 +65,135 @@ 0.000125 ] }, - "residual_rms_px": 1.0194062627410236, - "residual_median_px": 0.9745791310404839, - "residual_max_px": 1.4098404771186985, - "sigma2_normalized": 4.517018543311238e-07 + "residual_rms_px": 0.22756684424285512, + "residual_median_px": 0.2188892421848152, + "residual_max_px": 0.35500646231034766, + "sigma2_normalized": 1.6384871481043506e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.993823230266571, - 0.11085701733827591, - 0.005108235403895378 + 0.993744969367981, + 0.11167240887880325, + -0.00048105508903972805 ], [ - 0.042300548404455185, - -0.3358616232872009, - -0.9409610033035278 + 0.03271167725324631, + -0.2952064275741577, + -0.9548733234405518 ], [ - -0.1025964692234993, - 0.9353650212287903, - -0.33847641944885254 + -0.10677501559257507, + 0.9488848447799683, + -0.29701289534568787 ] ], "translation_m": [ - -0.19779200851917267, - 0.12584926187992096, - 1.0029830932617188 + -0.19782666862010956, + 0.106293223798275, + 1.0042906999588013 ], "rvec_rad": [ - 1.9135621913588212, - 0.10984213132718346, - -0.0699169862220375 + 1.8701712260845833, + 0.10441867416551628, + -0.07756766809896094 ] }, "camera_in_world": { "position_m": [ - 0.2941493093967438, - -0.8739607334136963, - 0.45891574025154114 + 0.30034536123275757, + -0.8994859457015991, + 0.3996886909008026 ], "position_mm": [ - 294.1493225097656, - -873.9607543945312, - 458.9157409667969 + 300.3453674316406, + -899.4859619140625, + 399.6886901855469 ], "orientation_deg": { - "roll": 109.89344024658203, - "pitch": 5.888706207275391, - "yaw": 2.437235116958618 + "roll": 107.38077545166016, + "pitch": 6.12944221496582, + "yaw": 1.8853574991226196 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 1.3155165639295862e-05, - 2.4841157199164833e-06, - 3.247518519811361e-06, - 1.6294825762422905e-07, - -9.888383290409324e-07, - 1.2866035268486294e-06 + 4.484539727126045e-07, + 8.482297909625752e-08, + 1.0510713805946576e-07, + 4.718812194772898e-09, + -3.669679946430438e-08, + 3.8652859810689e-08 ], [ - 2.4841157199164427e-06, - 5.4177922274212124e-06, - -7.747646726434947e-07, - 2.0181641470955728e-07, - -8.935675988619281e-07, - 1.5292790201370987e-06 + 8.482297909625899e-08, + 2.0260653910296792e-07, + -3.501671569627934e-08, + 7.367798601628585e-09, + -3.2908410696996424e-08, + 5.819447513700382e-08 ], [ - 3.2475185198113184e-06, - -7.74764672643535e-07, - 1.1973446381502139e-05, - -1.735191290191235e-07, - -1.6698805779053508e-06, - -3.1484806264017454e-06 + 1.0510713805946685e-07, + -3.5016715696277904e-08, + 3.944449679155422e-07, + -7.004331778451695e-09, + -5.507853957671965e-08, + -1.0651630051707764e-07 ], [ - 1.6294825762423791e-07, - 2.0181641470956162e-07, - -1.7351912901912648e-07, - 1.0181092276685681e-07, - 3.2260311451521304e-08, - 3.9164996286703744e-07 + 4.718812194773103e-09, + 7.367798601628739e-09, + -7.004331778452245e-09, + 3.7110916979334724e-09, + 1.0348384960478576e-09, + 1.4423634366716965e-08 ], [ - -9.888383290409138e-07, - -8.93567598861923e-07, - -1.6698805779053514e-06, - 3.226031145152658e-08, - 5.793607225296459e-07, - 7.655553380895131e-07 + -3.6696799464304895e-08, + -3.290841069699665e-08, + -5.5078539576719463e-08, + 1.0348384960479337e-09, + 1.978899355514534e-08, + 2.3181165970700254e-08 ], [ - 1.286603526848647e-06, - 1.5292790201371059e-06, - -3.148480626401695e-06, - 3.9164996286706465e-07, - 7.655553380895042e-07, - 5.083013214260468e-06 + 3.8652859810688855e-08, + 5.8194475137003656e-08, + -1.065163005170788e-07, + 1.4423634366717718e-08, + 2.3181165970700393e-08, + 1.835630667294324e-07 ] ], "parameter_std": { "rvec_std_deg": [ - 0.20781208168953208, - 0.13336252369846122, - 0.19825868407895872 + 0.038369096279544185, + 0.02578988237897036, + 0.03598453064030877 ], "tvec_std_m": [ - 0.00031907823925623135, - 0.0007611574886510977, - 0.0022545538836453807 + 6.0918730271842274e-05, + 0.00014067335765931423, + 0.0004284426061089541 ] }, "camera_center_std_m": [ - 0.002884279741017541, - 0.002327100660658953, - 0.0034121479595774318 + 0.0005273966759023264, + 0.0004267241934142766, + 0.0006492834900289064 ], "camera_center_std_mm": [ - 2.8842797410175414, - 2.3271006606589526, - 3.4121479595774318 + 0.5273966759023264, + 0.4267241934142766, + 0.6492834900289064 ], "orientation_std_deg": { - "roll": 0.19965099686362262, - "pitch": 0.16001748946950245, - "yaw": 0.13193801857548795 + "roll": 0.03576407949561515, + "pitch": 0.029402381229182255, + "yaw": 0.02483304213601616 } } }, @@ -206,10 +206,10 @@ 650.25 ], "projected_center_px": [ - 922.0765380859375, - 649.8759765625 + 922.2349243164062, + 650.4861450195312 ], - "reprojection_error_px": 0.5649898445643006, + "reprojection_error_px": 0.35500646231034766, "confidence": 0.2964796698261984 }, { @@ -219,10 +219,10 @@ 640.75 ], "projected_center_px": [ - 720.9972534179688, - 639.4407958984375 + 720.8250732421875, + 640.4906616210938 ], - "reprojection_error_px": 1.3323474142449867, + "reprojection_error_px": 0.2699859004953124, "confidence": 0.2743742952602821 }, { @@ -232,10 +232,10 @@ 583.75 ], "projected_center_px": [ - 916.4989013671875, - 585.1376953125 + 916.4456176757812, + 583.5968017578125 ], - "reprojection_error_px": 1.4098404771186985, + "reprojection_error_px": 0.24846725435638023, "confidence": 0.21966133686197709 }, { @@ -245,10 +245,10 @@ 563.5 ], "projected_center_px": [ - 313.9375915527344, - 563.3303833007812 + 314.15997314453125, + 563.5582885742188 ], - "reprojection_error_px": 0.3554839835727943, + "reprojection_error_px": 0.10724920787607678, "confidence": 0.233781757000696 }, { @@ -258,10 +258,10 @@ 575.0 ], "projected_center_px": [ - 731.0247192382812, - 576.195556640625 + 730.8939208984375, + 575.1229858398438 ], - "reprojection_error_px": 1.2267136344006149, + "reprojection_error_px": 0.18931123001325018, "confidence": 0.21604275474161502 }, { @@ -271,10 +271,10 @@ 491.0 ], "projected_center_px": [ - 1112.973388671875, - 490.2780456542969 + 1112.947998046875, + 490.99591064453125 ], - "reprojection_error_px": 0.7224446276803529, + "reprojection_error_px": 0.052162495693404975, "confidence": 0.12244968744253681 } ] diff --git a/data/evaluations/Scene5/render_d_aruco_detection.json b/data/evaluations/Scene5/render_d_aruco_detection.json index 2cda55b..842385f 100644 --- a/data/evaluations/Scene5/render_d_aruco_detection.json +++ b/data/evaluations/Scene5/render_d_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:44Z", + "created_utc": "2026-06-01T19:02:35Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,7 +35,7 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_d.png", - "image_sha256": "101d905910946ce0dccee5a8bf29ff8377bca5b07f3bb962048a8bc628131250", + "image_sha256": "3befb7d1ef4e98de25a2e6cd2b3ebcff29bfcadf94e251cbac1a0cddc7fc8a14", "width_px": 1280, "height_px": 720 }, @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "8794ca46-4f25-467d-8806-a8d0eaf97c3d", + "observation_id": "354f756e-945a-4abb-9028-0c6dc23719a3", "type": "aruco", "marker_id": 42, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.9823660345732603 }, { - "observation_id": "57f8ff84-d709-45fd-b5ba-4375cd358f22", + "observation_id": "c989f6a4-b6be-42e7-87ae-f231ef72c130", "type": "aruco", "marker_id": 113, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.8483779676539408 }, { - "observation_id": "582e4cae-b349-46dd-a590-c9ca8c9a18fd", + "observation_id": "ab0d1a85-ae05-4a3a-83f1-4180c59a2eba", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -184,14 +184,14 @@ "area_px": 2155.0, "perimeter_px": 188.6209716796875, "sharpness": { - "laplacian_var": 2429.630182897635 + "laplacian_var": 2429.56803600498 }, "contrast": { "p05": 63.0, "p95": 191.0, "dynamic_range": 128.0, - "mean_gray": 110.3524011299435, - "std_gray": 56.77605646269309 + "mean_gray": 110.35169491525424, + "std_gray": 56.776639233614254 }, "geometry": { "distance_to_center_norm": 0.2528878450393677, @@ -208,7 +208,7 @@ "confidence": 0.773184725081227 }, { - "observation_id": "1db548fa-3725-4e39-8e0c-ce552c942477", + "observation_id": "2c39803a-938d-44d4-ac2c-bd2bdfd7868a", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.6280285196076234 }, { - "observation_id": "a7ea4401-253f-401a-b951-a64fc67917e5", + "observation_id": "f03d5110-966e-4303-9edb-e1cead599df9", "type": "aruco", "marker_id": 41, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.3116200930635104 }, { - "observation_id": "41541d46-c85c-4dc7-aeb0-f3c9b7bbad0c", + "observation_id": "7ad68aaf-c8d3-49c4-ac07-8eb379c1237c", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -346,14 +346,14 @@ "area_px": 914.5, "perimeter_px": 155.47371673583984, "sharpness": { - "laplacian_var": 3430.9693227890393 + "laplacian_var": 3429.6678302517257 }, "contrast": { "p05": 28.0, "p95": 189.0, "dynamic_range": 161.0, - "mean_gray": 80.38059701492537, - "std_gray": 65.68220581586463 + "mean_gray": 80.37761194029851, + "std_gray": 65.6800415421895 }, "geometry": { "distance_to_center_norm": 0.5931019186973572, @@ -370,7 +370,7 @@ "confidence": 0.5885341085448238 }, { - "observation_id": "2b77bcde-9e81-4d77-898f-22df89bde662", + "observation_id": "67f0de2c-1021-42f6-9a3b-ff9885637a01", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -400,14 +400,14 @@ "area_px": 1114.0, "perimeter_px": 152.46969032287598, "sharpness": { - "laplacian_var": 2986.67501600807 + "laplacian_var": 2986.3174001140305 }, "contrast": { "p05": 20.0, "p95": 169.0, "dynamic_range": 149.0, - "mean_gray": 73.51258278145696, - "std_gray": 64.1976318440863 + "mean_gray": 73.50993377483444, + "std_gray": 64.19979859571768 }, "geometry": { "distance_to_center_norm": 0.5688640475273132, @@ -424,7 +424,7 @@ "confidence": 0.06739671544456982 }, { - "observation_id": "0d6e296d-05c6-4ddb-b18b-66bf75813e60", + "observation_id": "8009ea43-67e3-4327-8e7d-87b0440cb6ad", "type": "aruco", "marker_id": 103, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.17416420855033052 }, { - "observation_id": "ff7a8a79-ff09-444e-af95-95c99540721b", + "observation_id": "2335011e-8a1a-4ef4-9fcb-3d49a1d31565", "type": "aruco", "marker_id": 58, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.24540823915500745 }, { - "observation_id": "d2135a4c-4e4e-4954-b7e4-357c77e784d2", + "observation_id": "69359ff2-4120-4ed8-ab59-c05b317e9cd5", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -562,14 +562,14 @@ "area_px": 933.5, "perimeter_px": 141.37535285949707, "sharpness": { - "laplacian_var": 2671.0708160056392 + "laplacian_var": 2671.279590589603 }, "contrast": { "p05": 37.0, "p95": 176.0, "dynamic_range": 139.0, "mean_gray": 92.46898638426626, - "std_gray": 60.231080660154035 + "std_gray": 60.227739928666544 }, "geometry": { "distance_to_center_norm": 0.400749534368515, @@ -586,7 +586,7 @@ "confidence": 0.43828628344822296 }, { - "observation_id": "1e50399a-c642-429e-8925-f8ba4336d21e", + "observation_id": "c7d1f9ce-ce15-44dc-8cff-e9f3ec0973e8", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -616,14 +616,14 @@ "area_px": 898.5, "perimeter_px": 139.83118438720703, "sharpness": { - "laplacian_var": 3336.7094202604567 + "laplacian_var": 3335.2062355470807 }, "contrast": { "p05": 23.0, "p95": 171.0, "dynamic_range": 148.0, "mean_gray": 99.98407643312102, - "std_gray": 61.08404777793326 + "std_gray": 61.08206655574345 }, "geometry": { "distance_to_center_norm": 0.5762108564376831, @@ -640,7 +640,7 @@ "confidence": 0.32624039952470835 }, { - "observation_id": "470a817f-3fb6-4d24-b213-c0b3c74d831d", + "observation_id": "e3c9cad3-2d15-4a47-9fb9-2800c3afa5bb", "type": "aruco", "marker_id": 64, "marker_size_m": 0.025, @@ -694,7 +694,7 @@ "confidence": 0.4432762787121197 }, { - "observation_id": "9d07062c-fdbb-4d10-8d57-aa7972229a43", + "observation_id": "fd0db7a0-dc0a-4ea3-92c6-44244e92fad5", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -724,14 +724,14 @@ "area_px": 756.0, "perimeter_px": 131.0517463684082, "sharpness": { - "laplacian_var": 2582.9103118507605 + "laplacian_var": 2583.6427596685976 }, "contrast": { "p05": 28.0, "p95": 175.0, "dynamic_range": 147.0, - "mean_gray": 91.74003795066413, - "std_gray": 61.34673571837598 + "mean_gray": 91.74193548387096, + "std_gray": 61.34774898829884 }, "geometry": { "distance_to_center_norm": 0.3794279992580414, @@ -748,7 +748,7 @@ "confidence": 0.3071912693949274 }, { - "observation_id": "1ed8b283-8343-42b6-8414-ac77750675bc", + "observation_id": "839100c6-8b84-485b-8254-222a02ce4f78", "type": "aruco", "marker_id": 72, "marker_size_m": 0.025, @@ -778,14 +778,14 @@ "area_px": 656.0, "perimeter_px": 118.69819641113281, "sharpness": { - "laplacian_var": 1528.4792888888887 + "laplacian_var": 1525.9776839506173 }, "contrast": { "p05": 11.0, "p95": 131.0, "dynamic_range": 120.0, - "mean_gray": 48.45777777777778, - "std_gray": 47.167307363794016 + "mean_gray": 48.44888888888889, + "std_gray": 47.16065508084383 }, "geometry": { "distance_to_center_norm": 0.8898950815200806, @@ -802,7 +802,7 @@ "confidence": 0.018333813047618722 }, { - "observation_id": "abe4fe3f-b920-4b60-ac6f-9be70a900070", + "observation_id": "e36a1ab6-9293-4063-85c5-74b0c177233e", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -856,7 +856,7 @@ "confidence": 0.2483175954884472 }, { - "observation_id": "f3e7de1f-21cd-4564-a230-6b4796bc01d8", + "observation_id": "18de463c-fb33-4876-b400-8f0448d4df24", "type": "aruco", "marker_id": 84, "marker_size_m": 0.025, @@ -886,14 +886,14 @@ "area_px": 517.0, "perimeter_px": 110.77002239227295, "sharpness": { - "laplacian_var": 1402.6853773328992 + "laplacian_var": 1398.7281901041667 }, "contrast": { "p05": 12.0, "p95": 125.0, "dynamic_range": 113.0, - "mean_gray": 64.00520833333333, - "std_gray": 42.57750254387009 + "mean_gray": 63.989583333333336, + "std_gray": 42.557251828092966 }, "geometry": { "distance_to_center_norm": 0.8393738269805908, @@ -910,7 +910,7 @@ "confidence": 0.07285288505606423 }, { - "observation_id": "7fd80950-5c71-4e32-9ec7-6ead0dea1c14", + "observation_id": "eb16ec5e-ce70-477f-9a50-8072fba874f8", "type": "aruco", "marker_id": 86, "marker_size_m": 0.025, @@ -940,14 +940,14 @@ "area_px": 460.5, "perimeter_px": 103.97994232177734, "sharpness": { - "laplacian_var": 1916.6626913270604 + "laplacian_var": 1916.4206163991064 }, "contrast": { "p05": 13.0, "p95": 131.0, "dynamic_range": 118.0, - "mean_gray": 67.10374639769452, - "std_gray": 45.365892084680276 + "mean_gray": 67.08933717579251, + "std_gray": 45.353629105593036 }, "geometry": { "distance_to_center_norm": 0.7597878575325012, diff --git a/data/evaluations/Scene5/render_d_camera_pose.json b/data/evaluations/Scene5/render_d_camera_pose.json index 8d3d7f8..6300601 100644 --- a/data/evaluations/Scene5/render_d_camera_pose.json +++ b/data/evaluations/Scene5/render_d_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:47Z", + "created_utc": "2026-06-01T19:02:40Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_d_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -58,10 +58,10 @@ 3 ], "rms": [ - 0.006387764264836196, - 0.001754921973696052, - 0.0017375579483325315, - 0.001737557761197728 + 0.00597403274948069, + 0.0002663955030939687, + 0.00011532841963318679, + 0.00011532606603497566 ], "lambda": [ 0.001, @@ -70,135 +70,135 @@ 0.000125 ] }, - "residual_rms_px": 3.700514784606953, - "residual_median_px": 3.253961141336258, - "residual_max_px": 7.397507902002598, - "sigma2_normalized": 4.151272088536948e-06 + "residual_rms_px": 0.2899517961993663, + "residual_median_px": 0.2027191362184715, + "residual_max_px": 0.497382094324975, + "sigma2_normalized": 1.828763956789184e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.8207981586456299, - 0.5712116956710815, - -0.0027628852985799313 + 0.8189771175384521, + 0.5738260746002197, + -0.0003554785216692835 ], [ - 0.18008773028850555, - -0.26335975527763367, - -0.9477394223213196 + 0.16141317784786224, + -0.23096679151058197, + -0.9594790935516357 ], [ - -0.5420874357223511, - 0.7774052023887634, - -0.3190334141254425 + -0.5506561994552612, + 0.7857340574264526, + -0.28177961707115173 ] ], "translation_m": [ - -0.11553256958723068, - 0.10751371830701828, - 1.1219974756240845 + -0.11494141817092896, + 0.08626127988100052, + 1.1260441541671753 ], "rvec_rad": [ - 1.8297532153343, - 0.5720279051730511, - -0.41484074474567295 + 1.791013830205648, + 0.5647426184377776, + -0.4232360985411301 ] }, "camera_in_world": { "position_m": [ - 0.6836878061294556, - -0.7779383659362793, - 0.45953047275543213 + 0.700273871421814, + -0.7988913655281067, + 0.4000213146209717 ], "position_mm": [ - 683.6878051757812, - -777.9383544921875, - 459.5304870605469 + 700.2738647460938, + -798.891357421875, + 400.02130126953125 ], "orientation_deg": { - "roll": 112.3123779296875, - "pitch": 32.82585144042969, - "yaw": 12.374931335449219 + "roll": 109.72882080078125, + "pitch": 33.41204071044922, + "yaw": 11.149589538574219 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 5.2680853440925e-05, - 2.0559390704906542e-05, - 1.9219835927002637e-05, - 1.4365373980988457e-07, - -8.431796713006179e-06, - -1.6520219451496892e-07 + 2.216412630274248e-07, + 8.568442605284599e-08, + 8.101192481658667e-08, + 3.1247261296675916e-10, + -3.7078996943441625e-08, + -2.4533252340871167e-09 ], [ - 2.0559390704906498e-05, - 2.5838798932847707e-05, - -3.1539081732129495e-06, - 2.255118697737282e-06, - -4.286643796033424e-06, - 5.604723999567079e-06 + 8.568442605284535e-08, + 1.1750858828590586e-07, + -1.8303004445813296e-08, + 1.0641294472233925e-08, + -1.9333729742684046e-08, + 2.6499440484781956e-08 ], [ - 1.9219835927002535e-05, - -3.1539081732129533e-06, - 5.039965848093247e-05, - -2.9847330000926216e-06, - -7.100483973513712e-06, - -1.2796602134583326e-05 + 8.101192481658637e-08, + -1.8303004445812928e-08, + 2.0373994178419427e-07, + -1.32545281474916e-08, + -2.8621231041176948e-08, + -5.377275093167535e-08 ], [ - 1.436537398099132e-07, - 2.2551186977372903e-06, - -2.9847330000926047e-06, - 7.417640831674544e-07, - 1.5170503958267706e-07, - 1.6033340484152268e-06 + 3.12472612966749e-10, + 1.0641294472233915e-08, + -1.3254528147491639e-08, + 3.391035530149094e-09, + 5.287586629706987e-10, + 7.335738875543778e-09 ], [ - -8.431796713006157e-06, - -4.286643796033425e-06, - -7.1004839735137215e-06, - 1.5170503958268215e-07, - 2.6227146496793776e-06, - 2.440622619006014e-06 + -3.7078996943441446e-08, + -1.9333729742684082e-08, + -2.8621231041176908e-08, + 5.287586629706958e-10, + 1.1226749971115917e-08, + 9.248783970053307e-09 ], [ - -1.652021945149039e-07, - 5.604723999567105e-06, - -1.2796602134583316e-05, - 1.60333404841523e-06, - 2.4406226190060046e-06, - 1.3039593435537423e-05 + -2.4533252340870186e-09, + 2.6499440484781966e-08, + -5.377275093167542e-08, + 7.335738875543783e-09, + 9.248783970053305e-09, + 5.7920602181622285e-08 ] ], "parameter_std": { "rvec_std_deg": [ - 0.4158618042089302, - 0.29124521148583565, - 0.40675830526201723 + 0.02697416070410817, + 0.019640721468568496, + 0.025861917458691572 ], "tvec_std_m": [ - 0.0008612572688618973, - 0.001619479746609811, - 0.003611037722807313 + 5.8232598517918584e-05, + 0.00010595635880453762, + 0.00024066699437526177 ] }, "camera_center_std_m": [ - 0.005929807706471161, - 0.004427300895282475, - 0.007495690299271117 + 0.0003660062386654915, + 0.00027413989856711054, + 0.0004968469197846795 ], "camera_center_std_mm": [ - 5.929807706471161, - 4.4273008952824755, - 7.495690299271117 + 0.3660062386654915, + 0.2741398985671105, + 0.49684691978467954 ], "orientation_std_deg": { - "roll": 0.5033539108486794, - "pitch": 0.3060080445003732, - "yaw": 0.38391326309389906 + "roll": 0.035416321223141096, + "pitch": 0.021649260634721324, + "yaw": 0.026848844179046608 } } }, @@ -211,10 +211,10 @@ 696.5 ], "projected_center_px": [ - 888.1224365234375, - 697.4415893554688 + 887.4547119140625, + 696.4945678710938 ], - "reprojection_error_px": 1.128723943239009, + "reprojection_error_px": 0.0456127038481222, "confidence": 0.06739671544456982 }, { @@ -224,10 +224,10 @@ 691.25 ], "projected_center_px": [ - 379.4837646484375, - 686.4655151367188 + 379.3387756347656, + 691.160888671875 ], - "reprojection_error_px": 4.784512409181082, + "reprojection_error_px": 0.1842121731738393, "confidence": 0.17416420855033052 }, { @@ -237,10 +237,10 @@ 685.0 ], "projected_center_px": [ - 261.35308837890625, - 680.9586791992188 + 261.41192626953125, + 685.052001953125 ], - "reprojection_error_px": 4.0439902125548715, + "reprojection_error_px": 0.10227993511679952, "confidence": 0.24540823915500745 }, { @@ -250,10 +250,10 @@ 644.75 ], "projected_center_px": [ - 714.216064453125, - 648.0037841796875 + 713.9305419921875, + 645.0276489257812 ], - "reprojection_error_px": 3.253961141336258, + "reprojection_error_px": 0.42325210542065045, "confidence": 0.43828628344822296 }, { @@ -263,10 +263,10 @@ 638.25 ], "projected_center_px": [ - 959.312255859375, - 640.551025390625 + 958.8380126953125, + 638.1394653320312 ], - "reprojection_error_px": 2.3687231792048755, + "reprojection_error_px": 0.14129454115121634, "confidence": 0.32624039952470835 }, { @@ -276,10 +276,10 @@ 631.75 ], "projected_center_px": [ - 210.8035125732422, - 629.797607421875 + 211.63934326171875, + 631.7709350585938 ], - "reprojection_error_px": 2.0027949973400667, + "reprojection_error_px": 0.38990569644994777, "confidence": 0.4432762787121197 }, { @@ -289,10 +289,10 @@ 593.5 ], "projected_center_px": [ - 792.5145263671875, - 597.406494140625 + 792.4298095703125, + 593.2496948242188 ], - "reprojection_error_px": 3.9402327156233583, + "reprojection_error_px": 0.497382094324975, "confidence": 0.3071912693949274 }, { @@ -302,10 +302,10 @@ 596.25 ], "projected_center_px": [ - 1249.5262451171875, - 592.509521484375 + 1249.4110107421875, + 596.3731689453125 ], - "reprojection_error_px": 3.750665393049897, + "reprojection_error_px": 0.2027191362184715, "confidence": 0.018333813047618722 }, { @@ -315,10 +315,10 @@ 511.75 ], "projected_center_px": [ - 460.6148986816406, - 518.9645385742188 + 462.03570556640625, + 511.7359313964844 ], - "reprojection_error_px": 7.397507902002598, + "reprojection_error_px": 0.21475574468252528, "confidence": 0.2483175954884472 }, { @@ -328,10 +328,10 @@ 549.5 ], "projected_center_px": [ - 1226.808349609375, - 547.3310546875 + 1226.650146484375, + 549.448974609375 ], - "reprojection_error_px": 2.19075403690543, + "reprojection_error_px": 0.1585798135280968, "confidence": 0.07285288505606423 }, { @@ -341,10 +341,10 @@ 518.25 ], "projected_center_px": [ - 1174.7147216796875, - 517.41015625 + 1174.59326171875, + 518.294677734375 ], - "reprojection_error_px": 0.8869730798927236, + "reprojection_error_px": 0.4091847130368963, "confidence": 0.1152962676763461 } ] diff --git a/data/evaluations/Scene5/render_e_aruco_detection.json b/data/evaluations/Scene5/render_e_aruco_detection.json index 2b4ad00..6fcbce2 100644 --- a/data/evaluations/Scene5/render_e_aruco_detection.json +++ b/data/evaluations/Scene5/render_e_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:45Z", + "created_utc": "2026-06-01T19:02:35Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,7 +35,7 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_e.png", - "image_sha256": "00b84cdacbaffcefc654dcf49fe4d16039ab71139526a076f30b1a91f44adf5b", + "image_sha256": "d6f83f4562ad8837bd428cad6554d036f8a958fb3d2ebc0dff05e55e21b74d79", "width_px": 1280, "height_px": 720 }, @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "0560b2a5-8ef9-41fa-9ac0-454b73f9841c", + "observation_id": "1c9e6116-fe1c-44db-8e76-6a127c8114cd", "type": "aruco", "marker_id": 42, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.8333996992934779 }, { - "observation_id": "6911feae-cce2-4899-8dbf-e5e6e359fca7", + "observation_id": "55c722d1-6740-4e40-a4da-82f183ac0e7d", "type": "aruco", "marker_id": 113, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.7377098688391879 }, { - "observation_id": "3086c23f-bc27-4917-9f2d-19f60d4de959", + "observation_id": "3677f895-43ef-4d13-95be-05c3235445d8", "type": "aruco", "marker_id": 92, "marker_size_m": 0.025, @@ -184,14 +184,14 @@ "area_px": 809.0, "perimeter_px": 136.41653060913086, "sharpness": { - "laplacian_var": 1178.6617420744844 + "laplacian_var": 1178.5670052323792 }, "contrast": { "p05": 21.0, "p95": 165.0, "dynamic_range": 144.0, - "mean_gray": 72.07543859649122, - "std_gray": 57.451333426883416 + "mean_gray": 72.07368421052631, + "std_gray": 57.4528472606573 }, "geometry": { "distance_to_center_norm": 0.6871559619903564, @@ -208,7 +208,7 @@ "confidence": 0.15369374989294518 }, { - "observation_id": "16ac011b-74d5-4cb5-9386-651052cbdbe1", + "observation_id": "9d35b7bc-f4a1-47ba-9164-9f5a82922920", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -238,14 +238,14 @@ "area_px": 689.5, "perimeter_px": 130.40157508850098, "sharpness": { - "laplacian_var": 1858.6921786421694 + "laplacian_var": 1858.9313016528927 }, "contrast": { "p05": 16.150000000000002, "p95": 163.0, "dynamic_range": 146.85, - "mean_gray": 74.36157024793388, - "std_gray": 57.157165613817796 + "mean_gray": 74.35950413223141, + "std_gray": 57.158787208320085 }, "geometry": { "distance_to_center_norm": 0.7571271657943726, @@ -262,7 +262,7 @@ "confidence": 0.3233651345714012 }, { - "observation_id": "4d6714b0-7acc-4fbc-8ae6-1a97cd36c5a4", + "observation_id": "80cd594b-b77a-4e91-9ebb-d6f307e971f9", "type": "aruco", "marker_id": 105, "marker_size_m": 0.025, @@ -292,14 +292,14 @@ "area_px": 726.0, "perimeter_px": 129.54478073120117, "sharpness": { - "laplacian_var": 1536.1344588939176 + "laplacian_var": 1534.6420422840845 }, "contrast": { "p05": 25.0, "p95": 164.64999999999998, "dynamic_range": 139.64999999999998, - "mean_gray": 51.12795275590551, - "std_gray": 46.80396971249513 + "mean_gray": 51.125984251968504, + "std_gray": 46.79974798471486 }, "geometry": { "distance_to_center_norm": 0.43365001678466797, @@ -316,7 +316,7 @@ "confidence": 0.420622587927407 }, { - "observation_id": "22bdddbc-79ff-455c-a144-26e18c3a1b1c", + "observation_id": "f6517f80-7320-4ae9-8f72-49df2f61085d", "type": "aruco", "marker_id": 85, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.3128949822399185 }, { - "observation_id": "ef8479f3-6c0f-49a9-a433-720daab97167", + "observation_id": "ca588b82-9c92-4e63-aa4d-ae433e33c12c", "type": "aruco", "marker_id": 206, "marker_size_m": 0.025, @@ -400,14 +400,14 @@ "area_px": 620.0, "perimeter_px": 124.12893295288086, "sharpness": { - "laplacian_var": 2150.9912897979607 + "laplacian_var": 2152.256129980609 }, "contrast": { "p05": 22.0, "p95": 159.0, "dynamic_range": 137.0, "mean_gray": 79.1986301369863, - "std_gray": 50.58655314264917 + "std_gray": 50.5885389401204 }, "geometry": { "distance_to_center_norm": 0.8417559862136841, @@ -424,7 +424,7 @@ "confidence": 0.15136171428561934 }, { - "observation_id": "8dc2a83d-17de-47d0-b389-af9dce053f85", + "observation_id": "f3d0a797-25d9-4f8b-87aa-464f7ff42c6f", "type": "aruco", "marker_id": 97, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.22596816505744277 }, { - "observation_id": "5e3256bb-f2d6-4e66-a115-23507a477416", + "observation_id": "0707701b-b539-4fa7-bfaa-7d98f15e3890", "type": "aruco", "marker_id": 47, "marker_size_m": 0.025, @@ -508,14 +508,14 @@ "area_px": 503.0, "perimeter_px": 111.20100593566895, "sharpness": { - "laplacian_var": 3537.0669091275004 + "laplacian_var": 3537.3993488057845 }, "contrast": { "p05": 22.0, "p95": 174.0, "dynamic_range": 152.0, - "mean_gray": 80.39946380697052, - "std_gray": 62.68225929032318 + "mean_gray": 80.39678284182305, + "std_gray": 62.682083849872875 }, "geometry": { "distance_to_center_norm": 0.31366512179374695, @@ -532,7 +532,7 @@ "confidence": 0.24626971873720385 }, { - "observation_id": "af011a41-b969-47df-bb30-3fe5331c5a7d", + "observation_id": "b7e9216c-b3a0-4197-8006-9ea8d772fd60", "type": "aruco", "marker_id": 96, "marker_size_m": 0.025, @@ -562,14 +562,14 @@ "area_px": 432.0, "perimeter_px": 105.96671867370605, "sharpness": { - "laplacian_var": 4103.194444444444 + "laplacian_var": 4102.720498018595 }, "contrast": { "p05": 29.0, "p95": 173.0, "dynamic_range": 144.0, "mean_gray": 97.17592592592592, - "std_gray": 61.54514984807229 + "std_gray": 61.54550088916505 }, "geometry": { "distance_to_center_norm": 0.26008275151252747, @@ -586,7 +586,7 @@ "confidence": 0.2205630261207473 }, { - "observation_id": "13bc6144-af72-4682-9b48-6d15714e4971", + "observation_id": "9c4aeded-a42a-4ceb-a95b-9565eaa72098", "type": "aruco", "marker_id": 62, "marker_size_m": 0.025, @@ -616,14 +616,14 @@ "area_px": 464.0, "perimeter_px": 108.4006233215332, "sharpness": { - "laplacian_var": 2450.1224999787505 + "laplacian_var": 2450.396552456885 }, "contrast": { "p05": 33.0, "p95": 168.0, "dynamic_range": 135.0, - "mean_gray": 60.33819241982507, - "std_gray": 44.442342169272216 + "mean_gray": 60.332361516034986, + "std_gray": 44.44546928432966 }, "geometry": { "distance_to_center_norm": 0.2987307906150818, @@ -640,7 +640,7 @@ "confidence": 0.2664122029520185 }, { - "observation_id": "8b5d29c8-6044-4d33-9a69-bc80b8e584c7", + "observation_id": "c0986cbd-91a7-49a4-886d-4296534d24db", "type": "aruco", "marker_id": 79, "marker_size_m": 0.025, @@ -670,14 +670,14 @@ "area_px": 443.5, "perimeter_px": 108.12868309020996, "sharpness": { - "laplacian_var": 5483.398943985308 + "laplacian_var": 5486.592883379247 }, "contrast": { "p05": 33.0, "p95": 176.0, "dynamic_range": 143.0, - "mean_gray": 101.83333333333333, - "std_gray": 57.09943037802522 + "mean_gray": 101.82727272727273, + "std_gray": 57.09559115138068 }, "geometry": { "distance_to_center_norm": 0.20990434288978577, @@ -694,7 +694,7 @@ "confidence": 0.2093822185726055 }, { - "observation_id": "3adf62da-cfee-41dd-97d0-6680a58e6afd", + "observation_id": "0487d851-772a-43bf-a2ff-a1e2463d1309", "type": "aruco", "marker_id": 66, "marker_size_m": 0.025, @@ -748,7 +748,7 @@ "confidence": 0.16725963004706537 }, { - "observation_id": "503d318f-9f46-4d8f-8d44-601728b0ed16", + "observation_id": "eddce12f-e51d-444b-9468-799d8acf382d", "type": "aruco", "marker_id": 55, "marker_size_m": 0.025, @@ -778,14 +778,14 @@ "area_px": 450.0, "perimeter_px": 104.8877944946289, "sharpness": { - "laplacian_var": 4273.137861793742 + "laplacian_var": 4272.807427011133 }, "contrast": { "p05": 22.0, "p95": 176.0, "dynamic_range": 154.0, - "mean_gray": 84.86086956521739, - "std_gray": 63.55938274932931 + "mean_gray": 84.85797101449275, + "std_gray": 63.56218091176568 }, "geometry": { "distance_to_center_norm": 0.2882344722747803, @@ -802,7 +802,7 @@ "confidence": 0.22298824455832925 }, { - "observation_id": "2f72821e-062d-499c-8ec7-26d0ddb5da1e", + "observation_id": "4dad3e32-203b-4d2f-88c5-1face665cb8b", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -856,7 +856,7 @@ "confidence": 0.16812950449251388 }, { - "observation_id": "3b4b8dd6-3d0c-4add-82bd-a728c455f6eb", + "observation_id": "f0211f9b-e76f-4271-8747-9002d73bbfb5", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -886,14 +886,14 @@ "area_px": 307.0, "perimeter_px": 97.59953689575195, "sharpness": { - "laplacian_var": 7286.775995881085 + "laplacian_var": 7287.900040045003 }, "contrast": { "p05": 32.4, "p95": 170.0, "dynamic_range": 137.6, - "mean_gray": 105.21397379912663, - "std_gray": 52.584243712627526 + "mean_gray": 105.1877729257642, + "std_gray": 52.613816147712505 }, "geometry": { "distance_to_center_norm": 0.3184027075767517, @@ -910,7 +910,7 @@ "confidence": 0.1697872859143744 }, { - "observation_id": "b827a9f8-f4f2-4f3b-b18c-e311d9d1f998", + "observation_id": "6a7bdfba-d6d8-40ad-be9b-035f8d04d32e", "type": "aruco", "marker_id": 51, "marker_size_m": 0.025, @@ -964,7 +964,7 @@ "confidence": 0.12157403976480062 }, { - "observation_id": "0619d55f-f80b-4ab0-b321-d85489c60901", + "observation_id": "7aefd025-f8c1-4a0b-91fc-a28d8a475273", "type": "aruco", "marker_id": 95, "marker_size_m": 0.025, @@ -1018,7 +1018,7 @@ "confidence": 0.14922985097126407 }, { - "observation_id": "fde38de1-33bc-4a4c-9ad6-2f68998a4665", + "observation_id": "69d4e29b-54cb-4122-abf1-080f5f4b8f01", "type": "aruco", "marker_id": 103, "marker_size_m": 0.025, @@ -1072,7 +1072,7 @@ "confidence": 0.12136831092318832 }, { - "observation_id": "b520c887-a82c-47aa-a811-922c306ed643", + "observation_id": "dd1957f4-068f-44c7-846c-7179f4c35a1a", "type": "aruco", "marker_id": 72, "marker_size_m": 0.025, @@ -1102,14 +1102,14 @@ "area_px": 301.5, "perimeter_px": 97.56580924987793, "sharpness": { - "laplacian_var": 3630.253005671078 + "laplacian_var": 3632.6220037807184 }, "contrast": { "p05": 13.0, "p95": 129.54999999999998, "dynamic_range": 116.54999999999998, - "mean_gray": 48.95652173913044, - "std_gray": 41.75547687155861 + "mean_gray": 48.93043478260869, + "std_gray": 41.75950227488047 }, "geometry": { "distance_to_center_norm": 0.6834672689437866, @@ -1126,7 +1126,7 @@ "confidence": 0.16137616188441373 }, { - "observation_id": "d5e14ff1-73f6-44fd-b09a-0e6df54f7aa3", + "observation_id": "52368e2b-efe1-4053-b783-db120b603b54", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -1156,14 +1156,14 @@ "area_px": 313.0, "perimeter_px": 96.17921829223633, "sharpness": { - "laplacian_var": 3267.0961973024505 + "laplacian_var": 3263.0709872184166 }, "contrast": { "p05": 14.0, "p95": 133.0, "dynamic_range": 119.0, - "mean_gray": 76.50840336134453, - "std_gray": 45.49270341315516 + "mean_gray": 76.5, + "std_gray": 45.483005414249014 }, "geometry": { "distance_to_center_norm": 0.7751669883728027, @@ -1180,7 +1180,7 @@ "confidence": 0.13595850692924102 }, { - "observation_id": "831ac4df-c7c6-450d-bfa4-3bde9e893fab", + "observation_id": "37c65bcf-37af-47d5-a069-13d7af09ffa5", "type": "aruco", "marker_id": 69, "marker_size_m": 0.025, @@ -1234,7 +1234,7 @@ "confidence": 0.09610181165120435 }, { - "observation_id": "3fd6f467-4e76-4716-8772-de9e96cbd9a4", + "observation_id": "976c8f0a-d2cc-4616-80df-78ccf79ad223", "type": "aruco", "marker_id": 84, "marker_size_m": 0.025, @@ -1264,14 +1264,14 @@ "area_px": 254.0, "perimeter_px": 89.30404090881348, "sharpness": { - "laplacian_var": 3635.3120818115412 + "laplacian_var": 3637.4122425127825 }, "contrast": { "p05": 15.0, "p95": 124.79999999999998, "dynamic_range": 109.79999999999998, - "mean_gray": 66.0, - "std_gray": 40.06670114372458 + "mean_gray": 65.97837837837838, + "std_gray": 40.05859988064199 }, "geometry": { "distance_to_center_norm": 0.6978281736373901, @@ -1288,7 +1288,7 @@ "confidence": 0.13307488759358727 }, { - "observation_id": "9d250265-fac3-4cd1-9502-bfcac1f4c76d", + "observation_id": "673e02e7-a9ab-452d-9275-4bd6d7b2e46d", "type": "aruco", "marker_id": 64, "marker_size_m": 0.025, @@ -1342,7 +1342,7 @@ "confidence": 0.09071710124676984 }, { - "observation_id": "93069c05-9e48-436f-a65c-a1e1f631cedf", + "observation_id": "b207aa5c-86dd-4ad3-92af-ee490f1b9815", "type": "aruco", "marker_id": 86, "marker_size_m": 0.025, @@ -1372,14 +1372,14 @@ "area_px": 224.5, "perimeter_px": 84.99184608459473, "sharpness": { - "laplacian_var": 5259.849861591695 + "laplacian_var": 5267.685155709342 }, "contrast": { "p05": 15.0, "p95": 131.0, "dynamic_range": 116.0, - "mean_gray": 68.71176470588236, - "std_gray": 44.636365843439165 + "mean_gray": 68.68823529411765, + "std_gray": 44.63278117829252 }, "geometry": { "distance_to_center_norm": 0.6664616465568542, @@ -1396,7 +1396,7 @@ "confidence": 0.1273664826027396 }, { - "observation_id": "ce65c581-87b0-488d-9f43-30f1e022dc3e", + "observation_id": "5c5a1717-e366-4b69-8aee-32c19162d55c", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -1450,7 +1450,7 @@ "confidence": 0.09857192946593334 }, { - "observation_id": "582b3c33-526b-4d81-a560-caf25ffa2acf", + "observation_id": "b9875f7e-a878-49d4-a250-c3acee639497", "type": "aruco", "marker_id": 73, "marker_size_m": 0.025, @@ -1480,14 +1480,14 @@ "area_px": 171.0, "perimeter_px": 78.2249927520752, "sharpness": { - "laplacian_var": 5644.682206035381 + "laplacian_var": 5641.032507804372 }, "contrast": { "p05": 22.0, "p95": 156.0, "dynamic_range": 134.0, - "mean_gray": 91.03225806451613, - "std_gray": 45.415844805720326 + "mean_gray": 91.01935483870967, + "std_gray": 45.418124983349124 }, "geometry": { "distance_to_center_norm": 0.5222964882850647, @@ -1504,7 +1504,7 @@ "confidence": 0.1006702290166984 }, { - "observation_id": "e3335908-fc50-461c-a159-cacfddfc967b", + "observation_id": "b6cbaada-20d5-49b2-bdd1-49cb4a82665c", "type": "aruco", "marker_id": 116, "marker_size_m": 0.025, diff --git a/data/evaluations/Scene5/render_e_camera_pose.json b/data/evaluations/Scene5/render_e_camera_pose.json index 253b035..d2eaf94 100644 --- a/data/evaluations/Scene5/render_e_camera_pose.json +++ b/data/evaluations/Scene5/render_e_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:48Z", + "created_utc": "2026-06-01T19:02:40Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_e_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -71,10 +71,10 @@ 3 ], "rms": [ - 0.0072003552735133555, - 0.0012414338328973265, - 0.00118808662938169, - 0.001188086530193157 + 0.007161045108169848, + 0.0004356737901107782, + 0.00021549078393148574, + 0.00021548942910183414 ], "lambda": [ 0.001, @@ -83,135 +83,135 @@ 0.000125 ] }, - "residual_rms_px": 2.569892316129867, - "residual_median_px": 1.6344934863715084, - "residual_max_px": 5.361386988182938, - "sigma2_normalized": 1.6131995465441165e-06 + "residual_rms_px": 0.5417715991603563, + "residual_median_px": 0.3387486243353578, + "residual_max_px": 1.2319051880647929, + "sigma2_normalized": 5.306936463349104e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.6300063133239746, - 0.7765849232673645, - -0.0028124868404120207 + 0.6286182999610901, + 0.7777140140533447, + -6.370520713971928e-05 ], [ - 0.24270905554294586, - -0.20033587515354156, - -0.9491879940032959 + 0.2064637690782547, + -0.16696152091026306, + -0.9641039967536926 ], [ - -0.7376884818077087, - 0.5973118543624878, - -0.3146970570087433 + -0.7498078346252441, + 0.6060402393341064, + -0.26552483439445496 ] ], "translation_m": [ - -0.05519125610589981, - -0.01003957912325859, - 1.5442365407943726 + -0.0545007698237896, + -0.012582545168697834, + 1.551172137260437 ], "rvec_rad": [ - 1.7497123124784237, - 0.8314398666332036, - -0.6040279631375574 + 1.7013974581410134, + 0.8124175288834367, + -0.619002788431512 ] }, "camera_in_world": { "position_m": [ - 1.17637300491333, - -0.8815414309501648, - 0.476282000541687 + 1.1999390125274658, + -0.8997874855995178, + 0.3997403681278229 ], "position_mm": [ - 1176.373046875, - -881.5414428710938, - 476.2820129394531 + 1199.93896484375, + -899.7874755859375, + 399.7403564453125 ], "orientation_deg": { - "roll": 117.7827377319336, - "pitch": 47.534881591796875, - "yaw": 21.069108963012695 + "roll": 113.65969848632812, + "pitch": 48.57373046875, + "yaw": 18.18227767944336 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 4.199075215947676e-06, - 5.542339300592226e-07, - 7.173659947617174e-07, - -1.5911864396182805e-07, - -1.0546559084274734e-06, - 6.638177890640563e-07 + 1.2907424281436642e-07, + 1.3742818510042718e-08, + 2.0862770184442558e-08, + -5.719374886605724e-09, + -3.377881615216895e-08, + 1.8070487188077712e-08 ], [ - 5.542339300592145e-07, - 2.8000973945557398e-06, - 7.50146350682767e-08, - 6.64133729621814e-07, - -6.729633244574633e-07, - 4.469975091555593e-07 + 1.3742818510042341e-08, + 9.300698745970703e-08, + 3.614148949557751e-10, + 2.2371170296212934e-08, + -2.191327397717243e-08, + 1.3441533369507394e-08 ], [ - 7.173659947617168e-07, - 7.501463506827026e-08, - 5.685832722945724e-06, - -8.199697404182767e-07, - -7.770853392310753e-07, - -2.1158516668988723e-07 + 2.086277018444376e-08, + 3.61414894956424e-10, + 1.680251292985586e-07, + -2.618725249518748e-08, + -2.3509030582341668e-08, + -6.516556009119063e-09 ], [ - -1.5911864396182916e-07, - 6.641337296218143e-07, - -8.199697404182717e-07, - 4.010777941633311e-07, - 1.4121169499313509e-08, - 3.124426895471228e-07 + -5.719374886606396e-09, + 2.237117029621341e-08, + -2.6187252495187504e-08, + 1.3434880074027368e-08, + 3.418686123670527e-10, + 1.0350642771066223e-08 ], [ - -1.0546559084274693e-06, - -6.729633244574649e-07, - -7.77085339231076e-07, - 1.412116949931361e-08, - 5.740846005122716e-07, - 1.5842042895593044e-07 + -3.377881615216902e-08, + -2.1913273977172562e-08, + -2.3509030582341284e-08, + 3.418686123670007e-10, + 1.8811134671822682e-08, + 4.37884283901151e-09 ], [ - 6.638177890640641e-07, - 4.469975091555607e-07, - -2.1158516668988294e-07, - 3.1244268954712264e-07, - 1.5842042895592782e-07, - 3.3081513939030605e-06 + 1.8070487188077355e-08, + 1.3441533369507334e-08, + -6.51655600911964e-09, + 1.0350642771066225e-08, + 4.378842839011655e-09, + 1.112771125868836e-07 ] ], "parameter_std": { "rvec_std_deg": [ - 0.11740847832712069, - 0.09587584423356554, - 0.13662169581728514 + 0.020584599678739438, + 0.017473520796570705, + 0.02348603758454909 ], "tvec_std_m": [ - 0.0006333070299336105, - 0.0007576837074348845, - 0.0018188324260093509 + 0.00011590893008749312, + 0.0001371536899679432, + 0.00033358224261324765 ] }, "camera_center_std_m": [ - 0.0016237369568377967, - 0.0020303540152387307, - 0.002716550009474696 + 0.0003284981964607143, + 0.00039669810676109656, + 0.000446407709875896 ], "camera_center_std_mm": [ - 1.6237369568377966, - 2.0303540152387307, - 2.716550009474696 + 0.3284981964607143, + 0.39669810676109657, + 0.44640770987589595 ], "orientation_std_deg": { - "roll": 0.178463156308873, - "pitch": 0.11481617931693036, - "yaw": 0.13997603274593634 + "roll": 0.0296229337031151, + "pitch": 0.019329434660629058, + "yaw": 0.026577614233305378 } } }, @@ -224,10 +224,10 @@ 688.5 ], "projected_center_px": [ - 1022.1213989257812, - 685.08447265625 + 1022.7424926757812, + 688.3082885742188 ], - "reprojection_error_px": 3.526721832456066, + "reprojection_error_px": 0.3210347221117681, "confidence": 0.15369374989294518 }, { @@ -237,10 +237,10 @@ 600.5 ], "projected_center_px": [ - 1140.189208984375, - 605.5272216796875 + 1140.487548828125, + 600.2074584960938 ], - "reprojection_error_px": 5.1379213107589266, + "reprojection_error_px": 0.8166469990156648, "confidence": 0.3233651345714012 }, { @@ -250,10 +250,10 @@ 654.75 ], "projected_center_px": [ - 761.457275390625, - 652.953369140625 + 761.0986328125, + 655.0488891601562 ], - "reprojection_error_px": 2.03574522432322, + "reprojection_error_px": 0.6691008700192883, "confidence": 0.420622587927407 }, { @@ -263,10 +263,10 @@ 665.5 ], "projected_center_px": [ - 675.5936279296875, - 663.3739013671875 + 674.92431640625, + 665.3446044921875 ], - "reprojection_error_px": 2.2074169328317317, + "reprojection_error_px": 0.17284608821497752, "confidence": 0.3128949822399185 }, { @@ -276,10 +276,10 @@ 566.75 ], "projected_center_px": [ - 1221.93896484375, - 571.7369384765625 + 1222.1236572265625, + 566.7451171875 ], - "reprojection_error_px": 5.018397733895548, + "reprojection_error_px": 0.37637444782628326, "confidence": 0.15136171428561934 }, { @@ -289,10 +289,10 @@ 578.0 ], "projected_center_px": [ - 412.1869201660156, - 577.9612426757812 + 411.5934143066406, + 578.37890625 ], - "reprojection_error_px": 1.1875527822691319, + "reprojection_error_px": 0.7040671030625109, "confidence": 0.22596816505744277 }, { @@ -302,10 +302,10 @@ 569.25 ], "projected_center_px": [ - 544.2015991210938, - 568.5924072265625 + 543.8164672851562, + 569.3104248046875 ], - "reprojection_error_px": 0.7977280375227328, + "reprojection_error_px": 0.08982793005276685, "confidence": 0.24626971873720385 }, { @@ -315,10 +315,10 @@ 544.25 ], "projected_center_px": [ - 690.226806640625, - 543.5184326171875 + 690.0840454101562, + 544.4799194335938 ], - "reprojection_error_px": 0.7319349475972772, + "reprojection_error_px": 0.2835557649462943, "confidence": 0.2205630261207473 }, { @@ -328,10 +328,10 @@ 556.0 ], "projected_center_px": [ - 738.7609252929688, - 554.6294555664062 + 738.6102905273438, + 555.7941284179688 ], - "reprojection_error_px": 1.3951609415998, + "reprojection_error_px": 0.23355322457592437, "confidence": 0.2664122029520185 }, { @@ -341,10 +341,10 @@ 511.75 ], "projected_center_px": [ - 666.178466796875, - 510.9847717285156 + 666.1728515625, + 511.71331787109375 ], - "reprojection_error_px": 1.1227159530868824, + "reprojection_error_px": 0.8279614219514012, "confidence": 0.2093822185726055 }, { @@ -354,10 +354,10 @@ 537.25 ], "projected_center_px": [ - 331.3711853027344, - 537.2228393554688 + 331.2108459472656, + 537.1561279296875 ], - "reprojection_error_px": 0.12419169944152884, + "reprojection_error_px": 0.10171039981379074, "confidence": 0.16725963004706537 }, { @@ -367,10 +367,10 @@ 534.0 ], "projected_center_px": [ - 519.7254638671875, - 533.5993041992188 + 519.5994262695312, + 534.0335693359375 ], - "reprojection_error_px": 0.45977285714890764, + "reprojection_error_px": 0.10494038016028673, "confidence": 0.22298824455832925 }, { @@ -380,10 +380,10 @@ 444.5 ], "projected_center_px": [ - 858.8152465820312, - 449.7990417480469 + 858.6372680664062, + 444.6339111328125 ], - "reprojection_error_px": 5.361386988182938, + "reprojection_error_px": 0.6511856724101719, "confidence": 0.1697872859143744 }, { @@ -393,10 +393,10 @@ 463.25 ], "projected_center_px": [ - 528.6972045898438, - 463.0044250488281 + 529.1215209960938, + 463.20550537109375 ], - "reprojection_error_px": 0.6048882724378821, + "reprojection_error_px": 0.1359655340380315, "confidence": 0.12157403976480062 }, { @@ -406,10 +406,10 @@ 498.75 ], "projected_center_px": [ - 425.9270935058594, - 498.9102478027344 + 426.1565856933594, + 498.9312744140625 ], - "reprojection_error_px": 0.6957980841868815, + "reprojection_error_px": 0.9245312502006633, "confidence": 0.14922985097126407 }, { @@ -419,10 +419,10 @@ 447.5 ], "projected_center_px": [ - 464.8095397949219, - 447.1067810058594 + 465.4869079589844, + 447.1092529296875 ], - "reprojection_error_px": 1.253721132161222, + "reprojection_error_px": 0.6449393114947961, "confidence": 0.12136831092318832 }, { @@ -432,10 +432,10 @@ 455.25 ], "projected_center_px": [ - 1134.356689453125, - 453.7524719238281 + 1133.9364013671875, + 455.58172607421875 ], - "reprojection_error_px": 2.1963700366072536, + "reprojection_error_px": 1.2319051880647929, "confidence": 0.16137616188441373 }, { @@ -445,10 +445,10 @@ 466.0 ], "projected_center_px": [ - 1199.952880859375, - 463.76019287109375 + 1199.53759765625, + 465.7893981933594 ], - "reprojection_error_px": 2.3475045212256775, + "reprojection_error_px": 0.3564625265589475, "confidence": 0.13595850692924102 }, { @@ -458,10 +458,10 @@ 440.25 ], "projected_center_px": [ - 293.6542663574219, - 440.54058837890625 + 294.78717041015625, + 440.0731201171875 ], - "reprojection_error_px": 1.3767500291345378, + "reprojection_error_px": 0.27673620517890785, "confidence": 0.09610181165120435 }, { @@ -471,10 +471,10 @@ 429.0 ], "projected_center_px": [ - 1148.45556640625, - 427.188232421875 + 1147.8365478515625, + 429.0216979980469 ], - "reprojection_error_px": 1.9443059714904616, + "reprojection_error_px": 0.08922630626293304, "confidence": 0.13307488759358727 }, { @@ -484,10 +484,10 @@ 409.5 ], "projected_center_px": [ - 377.8772277832031, - 409.8803405761719 + 379.1590270996094, + 409.6376953125 ], - "reprojection_error_px": 1.9110035923276114, + "reprojection_error_px": 0.6068022479198476, "confidence": 0.09071710124676984 }, { @@ -497,10 +497,10 @@ 408.25 ], "projected_center_px": [ - 1127.5528564453125, - 406.70947265625 + 1126.841796875, + 408.4832763671875 ], - "reprojection_error_px": 1.6367268391411574, + "reprojection_error_px": 0.2818618318395787, "confidence": 0.1273664826027396 }, { @@ -510,10 +510,10 @@ 354.0 ], "projected_center_px": [ - 571.9044799804688, - 358.5533752441406 + 572.9441528320312, + 353.6968688964844 ], - "reprojection_error_px": 4.82482230208302, + "reprojection_error_px": 0.6331307448367046, "confidence": 0.09857192946593334 }, { @@ -523,10 +523,10 @@ 364.25 ], "projected_center_px": [ - 1024.23193359375, - 362.7910461425781 + 1023.59326171875, + 364.3497009277344 ], - "reprojection_error_px": 1.6322601336018592, + "reprojection_error_px": 0.13652114552441746, "confidence": 0.1006702290166984 } ] diff --git a/data/evaluations/Scene5/render_f_aruco_detection.json b/data/evaluations/Scene5/render_f_aruco_detection.json index 1c6bffc..bfe29a0 100644 --- a/data/evaluations/Scene5/render_f_aruco_detection.json +++ b/data/evaluations/Scene5/render_f_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:45Z", + "created_utc": "2026-06-01T19:02:36Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,18 +35,18 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_f.png", - "image_sha256": "e2776914a789f8fe85a5cfd278ee5913382dfd9841118b653b7c6b2dbf49c853", + "image_sha256": "e393c7badc57b6d872d9556881c53b6d46a0a03a175ceb2a31399e43957ec585", "width_px": 1280, "height_px": 720 }, "aruco": { "dictionary": "DICT_4X4_250", - "num_detected_markers": 34, + "num_detected_markers": 35, "num_rejected_candidates": 10 }, "detections": [ { - "observation_id": "c18cec63-a094-4791-a70a-20031af5cf70", + "observation_id": "47bfc303-e1a6-454d-8eba-ec2a93b73cd9", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -76,14 +76,14 @@ "area_px": 1568.0, "perimeter_px": 158.40994262695312, "sharpness": { - "laplacian_var": 2010.8882181000238 + "laplacian_var": 2004.6909526635193 }, "contrast": { "p05": 55.0, "p95": 186.0, "dynamic_range": 131.0, - "mean_gray": 96.9208211143695, - "std_gray": 55.19093833237553 + "mean_gray": 96.92570869990224, + "std_gray": 55.215850801445235 }, "geometry": { "distance_to_center_norm": 0.706217885017395, @@ -100,7 +100,7 @@ "confidence": 0.9768332578354781 }, { - "observation_id": "dc78f01c-8180-4506-9e4c-b7a4f66ac6b0", + "observation_id": "bfc032b2-3e95-4403-8f23-df604b306938", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -130,14 +130,14 @@ "area_px": 1521.0, "perimeter_px": 156.0, "sharpness": { - "laplacian_var": 2466.71968460924 + "laplacian_var": 2476.50851709655 }, "contrast": { "p05": 60.0, "p95": 187.0, "dynamic_range": 127.0, - "mean_gray": 125.46802030456853, - "std_gray": 57.384492171370525 + "mean_gray": 125.46598984771573, + "std_gray": 57.39823579824702 }, "geometry": { "distance_to_center_norm": 0.6681978106498718, @@ -154,7 +154,7 @@ "confidence": 1.0 }, { - "observation_id": "62075a0a-1f58-4270-b029-028a08b639f1", + "observation_id": "175c6b4d-63bc-4587-a3fb-fe4e1672dae4", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -208,7 +208,61 @@ "confidence": 0.9517473802485018 }, { - "observation_id": "694e007e-304b-4b69-8242-c48ab5cbaad8", + "observation_id": "e885ee71-12a5-4156-a121-9f017dd90fd3", + "type": "aruco", + "marker_id": 231, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1206.0, + 390.0 + ], + [ + 1221.0, + 427.0 + ], + [ + 1188.0, + 437.0 + ], + [ + 1172.0, + 400.0 + ] + ], + "center_px": [ + 1196.75, + 413.5 + ], + "quality": { + "area_px": 1394.5, + "perimeter_px": 150.15818786621094, + "sharpness": { + "laplacian_var": 1909.2503428845264 + }, + "contrast": { + "p05": 7.0, + "p95": 157.0, + "dynamic_range": 150.0, + "mean_gray": 70.91565040650407, + "std_gray": 66.15759393100366 + }, + "geometry": { + "distance_to_center_norm": 0.7616952061653137, + "distance_to_border_px": 59.0 + }, + "edge_ratio": 1.169057102063475, + "edge_lengths_px": [ + 39.924930572509766, + 34.48188018798828, + 40.31128692626953, + 35.44009017944336 + ] + }, + "confidence": 0.7952277652013182 + }, + { + "observation_id": "123ac3b1-2ce5-49fa-8e86-ec99a775e78d", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -238,14 +292,14 @@ "area_px": 1060.0, "perimeter_px": 132.52141952514648, "sharpness": { - "laplacian_var": 2261.5099427349937 + "laplacian_var": 2260.684640324287 }, "contrast": { "p05": 52.0, "p95": 192.0, "dynamic_range": 140.0, - "mean_gray": 93.90374331550802, - "std_gray": 58.882088620557106 + "mean_gray": 93.90106951871658, + "std_gray": 58.880835418706425 }, "geometry": { "distance_to_center_norm": 0.49272531270980835, @@ -262,7 +316,7 @@ "confidence": 0.5995617283681293 }, { - "observation_id": "a6bb6030-d055-41a2-948e-95347c1951b3", + "observation_id": "bb81b7fb-8971-4a4e-9a24-bee041b73ac2", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -316,7 +370,7 @@ "confidence": 0.569827819836196 }, { - "observation_id": "fe289c19-f3b8-49a6-9ddc-f2f41456d9a7", + "observation_id": "f16a091e-3b99-4fc4-b708-f89376c85e50", "type": "aruco", "marker_id": 46, "marker_size_m": 0.025, @@ -346,14 +400,14 @@ "area_px": 920.0, "perimeter_px": 121.5911865234375, "sharpness": { - "laplacian_var": 2341.7190191091295 + "laplacian_var": 2342.6387721955493 }, "contrast": { "p05": 8.0, "p95": 146.0, "dynamic_range": 138.0, - "mean_gray": 72.82098765432099, - "std_gray": 60.542216096610936 + "mean_gray": 72.81018518518519, + "std_gray": 60.53549174211385 }, "geometry": { "distance_to_center_norm": 0.9099597334861755, @@ -370,7 +424,7 @@ "confidence": 0.2988751797371847 }, { - "observation_id": "9ba72aa4-9e67-4e44-aab8-c82d3e9236da", + "observation_id": "1d406025-a867-4986-8d04-8279fca630d3", "type": "aruco", "marker_id": 56, "marker_size_m": 0.025, @@ -400,14 +454,14 @@ "area_px": 912.0, "perimeter_px": 120.99082374572754, "sharpness": { - "laplacian_var": 1732.0757863702179 + "laplacian_var": 1733.2381472908094 }, "contrast": { "p05": 8.0, "p95": 142.0, "dynamic_range": 134.0, - "mean_gray": 40.398148148148145, - "std_gray": 50.751501798885215 + "mean_gray": 40.39043209876543, + "std_gray": 50.74065961420777 }, "geometry": { "distance_to_center_norm": 0.8398146033287048, @@ -424,7 +478,7 @@ "confidence": 0.5697620483284124 }, { - "observation_id": "7a0f80a2-ba38-4c47-a5ac-7cf04100cc93", + "observation_id": "c789674e-2ef1-47bb-9c56-b722b16eb8c9", "type": "aruco", "marker_id": 47, "marker_size_m": 0.025, @@ -454,14 +508,14 @@ "area_px": 902.5, "perimeter_px": 120.18319702148438, "sharpness": { - "laplacian_var": 2728.1647078992423 + "laplacian_var": 2728.7004765446 }, "contrast": { "p05": 32.0, "p95": 177.0, "dynamic_range": 145.0, "mean_gray": 80.51293759512937, - "std_gray": 61.62574404267633 + "std_gray": 61.62915235615088 }, "geometry": { "distance_to_center_norm": 0.3646650016307831, @@ -478,7 +532,7 @@ "confidence": 0.5768583617164568 }, { - "observation_id": "16847af8-d13b-4d36-a410-c869021b102d", + "observation_id": "c446717f-90d1-4075-a6ce-41107213cfa2", "type": "aruco", "marker_id": 62, "marker_size_m": 0.025, @@ -532,7 +586,7 @@ "confidence": 0.5593704450665263 }, { - "observation_id": "7f5916a3-afe2-4090-944d-fe50b32f3a14", + "observation_id": "ac7cc8ca-0894-48a2-b6b6-24da9163ff68", "type": "aruco", "marker_id": 54, "marker_size_m": 0.025, @@ -562,14 +616,14 @@ "area_px": 893.0, "perimeter_px": 119.5506706237793, "sharpness": { - "laplacian_var": 2055.512491451296 + "laplacian_var": 2056.1583572859295 }, "contrast": { "p05": 35.0, "p95": 177.0, "dynamic_range": 142.0, - "mean_gray": 64.54758190327613, - "std_gray": 51.93757201206563 + "mean_gray": 64.54602184087364, + "std_gray": 51.93769356676714 }, "geometry": { "distance_to_center_norm": 0.4033917188644409, @@ -586,7 +640,7 @@ "confidence": 0.5766374039623903 }, { - "observation_id": "6a8bfd89-66d3-47ce-8545-901f04d04a8c", + "observation_id": "9194577e-ffbb-4db2-a18d-184bff2362cd", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -616,14 +670,14 @@ "area_px": 883.5, "perimeter_px": 119.10066223144531, "sharpness": { - "laplacian_var": 2015.329409949525 + "laplacian_var": 2017.7684517818086 }, "contrast": { "p05": 7.0, "p95": 136.0, "dynamic_range": 129.0, - "mean_gray": 71.0829420970266, - "std_gray": 56.46875968302347 + "mean_gray": 71.0453834115806, + "std_gray": 56.470271152797935 }, "geometry": { "distance_to_center_norm": 0.8780498504638672, @@ -640,7 +694,7 @@ "confidence": 0.21364841201201337 }, { - "observation_id": "7d4224fd-b358-4131-9223-016886ea9f8e", + "observation_id": "012bf26d-c557-45ce-99e6-96f1dd2fea4c", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -694,7 +748,7 @@ "confidence": 0.44403921568627447 }, { - "observation_id": "70940107-9231-4606-814c-b40e29869a3f", + "observation_id": "18c8df14-ca0f-4667-9105-ddab66ea870f", "type": "aruco", "marker_id": 97, "marker_size_m": 0.025, @@ -748,7 +802,7 @@ "confidence": 0.5705029634947052 }, { - "observation_id": "cf8f995e-abee-4f4d-a5f4-1f3f2b94c8d2", + "observation_id": "24bb3da7-0f2f-4fc6-9d47-9b1a8762bcc6", "type": "aruco", "marker_id": 72, "marker_size_m": 0.025, @@ -778,14 +832,14 @@ "area_px": 873.5, "perimeter_px": 118.41769218444824, "sharpness": { - "laplacian_var": 1477.045386162884 + "laplacian_var": 1474.598476495689 }, "contrast": { "p05": 6.0, "p95": 134.5, "dynamic_range": 128.5, - "mean_gray": 42.353407290015845, - "std_gray": 50.5564627656654 + "mean_gray": 42.34548335974643, + "std_gray": 50.542487887110006 }, "geometry": { "distance_to_center_norm": 0.8017706871032715, @@ -802,7 +856,7 @@ "confidence": 0.5440516905787338 }, { - "observation_id": "f1df1cdb-1bea-4acb-9e20-f93319a963ca", + "observation_id": "4a40aee1-0a4d-4589-aa41-fb53912b09c1", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -832,14 +886,14 @@ "area_px": 855.0, "perimeter_px": 117.05582046508789, "sharpness": { - "laplacian_var": 2485.4410919843144 + "laplacian_var": 2485.76576730899 }, "contrast": { "p05": 25.0, "p95": 178.0, "dynamic_range": 153.0, - "mean_gray": 84.50324675324676, - "std_gray": 67.1883859773236 + "mean_gray": 84.50162337662337, + "std_gray": 67.18937665306166 }, "geometry": { "distance_to_center_norm": 0.22462697327136993, @@ -856,7 +910,7 @@ "confidence": 0.551983363957988 }, { - "observation_id": "26d1092b-3ffa-44af-833b-2296cf3e9c34", + "observation_id": "25906109-5c6c-4105-abee-c5ec1a4a1fb8", "type": "aruco", "marker_id": 55, "marker_size_m": 0.025, @@ -910,7 +964,7 @@ "confidence": 0.5459402660246769 }, { - "observation_id": "a0f8200c-6831-4ce6-b86a-c7def9956675", + "observation_id": "68f6029c-6c3b-48d0-b6e3-d00856725e67", "type": "aruco", "marker_id": 84, "marker_size_m": 0.025, @@ -940,14 +994,14 @@ "area_px": 846.0, "perimeter_px": 116.57271575927734, "sharpness": { - "laplacian_var": 1938.4282003750861 + "laplacian_var": 1932.498028221002 }, "contrast": { "p05": 6.0, "p95": 128.69999999999993, "dynamic_range": 122.69999999999993, - "mean_gray": 57.75617792421746, - "std_gray": 51.70646326347517 + "mean_gray": 57.73970345963756, + "std_gray": 51.689397947824894 }, "geometry": { "distance_to_center_norm": 0.8536534309387207, @@ -964,7 +1018,7 @@ "confidence": 0.06519221426443914 }, { - "observation_id": "aab66f46-28ae-47f3-8afd-d568b7bb8405", + "observation_id": "cf4be45a-ab31-4572-ad20-bda77927d4b7", "type": "aruco", "marker_id": 66, "marker_size_m": 0.025, @@ -1018,7 +1072,7 @@ "confidence": 0.5349107016469481 }, { - "observation_id": "2edd0ed2-186a-4dd2-9d4a-6b1ce173d0bc", + "observation_id": "27a7fb6e-5a06-44eb-8139-bd5ca7f136c4", "type": "aruco", "marker_id": 113, "marker_size_m": 0.025, @@ -1048,14 +1102,14 @@ "area_px": 696.0, "perimeter_px": 115.21352767944336, "sharpness": { - "laplacian_var": 835.1728592438365 + "laplacian_var": 835.4126966422103 }, "contrast": { "p05": 15.0, "p95": 103.0, "dynamic_range": 88.0, - "mean_gray": 35.666666666666664, - "std_gray": 32.54506985421476 + "mean_gray": 35.66260162601626, + "std_gray": 32.5407184533345 }, "geometry": { "distance_to_center_norm": 0.48089858889579773, @@ -1072,7 +1126,7 @@ "confidence": 0.31811398390251094 }, { - "observation_id": "9f1aac2d-1482-4410-a05d-235c5aaa3b5a", + "observation_id": "1823652c-943f-43bd-9853-ec990a828a6a", "type": "aruco", "marker_id": 95, "marker_size_m": 0.025, @@ -1126,7 +1180,7 @@ "confidence": 0.5227826547122322 }, { - "observation_id": "ef377148-e90e-4feb-be16-e092bf11cac6", + "observation_id": "eed4751d-d197-4f3f-adc2-79925c287432", "type": "aruco", "marker_id": 51, "marker_size_m": 0.025, @@ -1180,7 +1234,7 @@ "confidence": 0.5111500432161571 }, { - "observation_id": "c3b5ff89-5183-4afb-8636-99b2fe696748", + "observation_id": "a0b85cfa-87b8-4ee0-a200-d0d5b20bf810", "type": "aruco", "marker_id": 103, "marker_size_m": 0.025, @@ -1210,14 +1264,14 @@ "area_px": 783.0, "perimeter_px": 111.9482650756836, "sharpness": { - "laplacian_var": 2565.4273062251436 + "laplacian_var": 2564.432283093905 }, "contrast": { "p05": 33.0, "p95": 181.0, "dynamic_range": 148.0, - "mean_gray": 117.67387387387387, - "std_gray": 65.11043938897613 + "mean_gray": 117.67207207207207, + "std_gray": 65.11451198067365 }, "geometry": { "distance_to_center_norm": 0.07005522400140762, @@ -1234,7 +1288,7 @@ "confidence": 0.5046333482067283 }, { - "observation_id": "915f6c2f-bbf2-4816-9aa9-270d271d58f5", + "observation_id": "1724477a-81db-4041-b84d-4806eda85bda", "type": "aruco", "marker_id": 73, "marker_size_m": 0.025, @@ -1264,14 +1318,14 @@ "area_px": 756.5, "perimeter_px": 110.26076316833496, "sharpness": { - "laplacian_var": 3113.9513362824355 + "laplacian_var": 3111.9663738764198 }, "contrast": { "p05": 11.0, "p95": 163.0, "dynamic_range": 152.0, - "mean_gray": 88.71052631578948, - "std_gray": 63.80417381303196 + "mean_gray": 88.69924812030075, + "std_gray": 63.80091037632779 }, "geometry": { "distance_to_center_norm": 0.8404671549797058, @@ -1288,7 +1342,7 @@ "confidence": 0.13607001327160623 }, { - "observation_id": "4d729cfb-9bf3-4304-8959-63919bdffd88", + "observation_id": "2413b0f3-fd46-4d0b-8219-6fe63c47af79", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -1318,14 +1372,14 @@ "area_px": 747.0, "perimeter_px": 109.46183013916016, "sharpness": { - "laplacian_var": 2996.099050875392 + "laplacian_var": 2995.2321307233005 }, "contrast": { "p05": 25.0, "p95": 179.0, "dynamic_range": 154.0, - "mean_gray": 81.39923954372624, - "std_gray": 65.10042198317524 + "mean_gray": 81.40114068441065, + "std_gray": 65.10319914276712 }, "geometry": { "distance_to_center_norm": 0.33940964937210083, @@ -1342,7 +1396,7 @@ "confidence": 0.46988879526830113 }, { - "observation_id": "71997848-bcbf-4cf2-a6d4-d96c9d7e42ba", + "observation_id": "07728bc7-aaac-4342-8d9d-beaac7818b95", "type": "aruco", "marker_id": 58, "marker_size_m": 0.025, @@ -1396,7 +1450,7 @@ "confidence": 0.4655541127751829 }, { - "observation_id": "7435797c-2233-48c7-b35e-186faf659d40", + "observation_id": "7875ce9f-65c5-4311-86ee-87e57bfa6841", "type": "aruco", "marker_id": 69, "marker_size_m": 0.025, @@ -1450,7 +1504,7 @@ "confidence": 0.4655541127751829 }, { - "observation_id": "df7e2358-01d3-4ab0-ad95-17492c02cf94", + "observation_id": "a0d976b3-0d88-4d7a-8797-0a00cf2a4114", "type": "aruco", "marker_id": 82, "marker_size_m": 0.025, @@ -1480,14 +1534,14 @@ "area_px": 738.0, "perimeter_px": 109.0318832397461, "sharpness": { - "laplacian_var": 2321.1104500931433 + "laplacian_var": 2323.109169370831 }, "contrast": { "p05": 11.0, "p95": 161.0, "dynamic_range": 150.0, - "mean_gray": 79.95348837209302, - "std_gray": 65.721294375133 + "mean_gray": 79.9515503875969, + "std_gray": 65.7226346618775 }, "geometry": { "distance_to_center_norm": 0.784397304058075, @@ -1504,7 +1558,7 @@ "confidence": 0.49001748422717006 }, { - "observation_id": "1e81fe90-ec7c-4d87-9665-d51c5340f873", + "observation_id": "68b3c0e8-b738-46c6-b216-2bc1dab7ce8a", "type": "aruco", "marker_id": 101, "marker_size_m": 0.025, @@ -1534,14 +1588,14 @@ "area_px": 721.5, "perimeter_px": 107.6905746459961, "sharpness": { - "laplacian_var": 3080.2482835726887 + "laplacian_var": 3081.4937011841776 }, "contrast": { "p05": 12.0, "p95": 168.0, "dynamic_range": 156.0, "mean_gray": 85.53373015873017, - "std_gray": 66.70474249856753 + "std_gray": 66.70608100637281 }, "geometry": { "distance_to_center_norm": 0.7647988200187683, @@ -1558,7 +1612,7 @@ "confidence": 0.46225891142368675 }, { - "observation_id": "59e9f6c4-1345-4730-95d6-c047a79976fe", + "observation_id": "5ae7bd2d-f236-4475-92e7-5f0034e28255", "type": "aruco", "marker_id": 74, "marker_size_m": 0.025, @@ -1612,7 +1666,7 @@ "confidence": 0.4548532843889077 }, { - "observation_id": "e0d31f97-08f9-47c0-a926-606c29069161", + "observation_id": "69b381a0-7ace-4047-b691-74a7573ab8c2", "type": "aruco", "marker_id": 64, "marker_size_m": 0.025, @@ -1666,7 +1720,7 @@ "confidence": 0.43211414091114625 }, { - "observation_id": "1dc06cab-7395-47e6-a8d1-86788068cb33", + "observation_id": "2285ed27-0713-4fd4-a30a-f8c124ddc41d", "type": "aruco", "marker_id": 52, "marker_size_m": 0.025, @@ -1720,7 +1774,7 @@ "confidence": 0.45818248585417487 }, { - "observation_id": "139aa570-7cef-4ee1-90be-54cd72ca05af", + "observation_id": "0b2d1922-8202-4481-af4a-8792e4efbdb1", "type": "aruco", "marker_id": 77, "marker_size_m": 0.025, @@ -1774,7 +1828,7 @@ "confidence": 0.422956152719696 }, { - "observation_id": "8201b8e1-9cbc-47dc-af62-5a877ba4c381", + "observation_id": "da819b13-2f74-4c56-b8fe-29f883d47e0e", "type": "aruco", "marker_id": 83, "marker_size_m": 0.025, @@ -1804,14 +1858,14 @@ "area_px": 688.0, "perimeter_px": 105.29913330078125, "sharpness": { - "laplacian_var": 3405.7621463796754 + "laplacian_var": 3406.711513468283 }, "contrast": { "p05": 12.0, "p95": 169.0, "dynamic_range": 157.0, - "mean_gray": 95.19409282700423, - "std_gray": 65.43789762911065 + "mean_gray": 95.19620253164557, + "std_gray": 65.43964838319306 }, "geometry": { "distance_to_center_norm": 0.8302794098854065, @@ -1828,7 +1882,7 @@ "confidence": 0.4377857805109236 }, { - "observation_id": "052e70d7-fd4b-4d2a-bb4f-718b21000a90", + "observation_id": "4d0787d2-2463-460b-baf2-05a46306c9f0", "type": "aruco", "marker_id": 75, "marker_size_m": 0.025, @@ -1858,14 +1912,14 @@ "area_px": 688.0, "perimeter_px": 105.0837631225586, "sharpness": { - "laplacian_var": 3444.3560129934326 + "laplacian_var": 3444.4820634136004 }, "contrast": { "p05": 16.0, "p95": 174.0, "dynamic_range": 158.0, - "mean_gray": 106.5126050420168, - "std_gray": 65.25848610855252 + "mean_gray": 106.51050420168067, + "std_gray": 65.25639392799204 }, "geometry": { "distance_to_center_norm": 0.6417331099510193, @@ -1958,6 +2012,31 @@ ], "area_px": 149.0 }, + { + "image_points_px": [ + [ + 1217.0, + 386.0 + ], + [ + 1223.0, + 396.0 + ], + [ + 1227.0, + 424.0 + ], + [ + 1217.0, + 406.0 + ] + ], + "center_px": [ + 1221.0, + 403.0 + ], + "area_px": 164.0 + }, { "image_points_px": [ [ @@ -2008,31 +2087,6 @@ ], "area_px": 121.5 }, - { - "image_points_px": [ - [ - 1199.0, - 436.0 - ], - [ - 1192.0, - 441.0 - ], - [ - 1176.0, - 445.0 - ], - [ - 1190.0, - 438.0 - ] - ], - "center_px": [ - 1189.25, - 440.0 - ], - "area_px": 43.5 - }, { "image_points_px": [ [ diff --git a/data/evaluations/Scene5/render_f_camera_pose.json b/data/evaluations/Scene5/render_f_camera_pose.json index c262b67..e1103a1 100644 --- a/data/evaluations/Scene5/render_f_camera_pose.json +++ b/data/evaluations/Scene5/render_f_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:48Z", + "created_utc": "2026-06-01T19:02:41Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_f_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -72,167 +72,152 @@ 1, 2, 3, - 4, - 5, - 6, - 7, - 8, - 9 + 4 ], "rms": [ - 0.016671599234626203, - 0.014984525837317951, - 0.010143432360838499, - 0.008145351589166076, - 0.00780621236938807, - 0.007787122784044085, - 0.007786462376148913, - 0.007786439172737221, - 0.007786438374282249, - 0.007786438346865697 + 0.007361242886604368, + 0.0003653993942358196, + 9.164489402431082e-05, + 9.16054830078819e-05, + 9.160546620843857e-05 ], "lambda": [ 0.001, 0.0005, 0.00025, 0.000125, - 6.25e-05, - 3.125e-05, - 1.5625e-05, - 7.8125e-06, - 3.90625e-06, - 1.953125e-06 + 6.25e-05 ] }, - "residual_rms_px": 17.928049096967193, - "residual_median_px": 16.279581202158823, - "residual_max_px": 33.761537780934475, - "sigma2_normalized": 6.820719987909698e-05 + "residual_rms_px": 0.2303117349044767, + "residual_median_px": 0.17648425193417577, + "residual_max_px": 0.3976393379524452, + "sigma2_normalized": 9.440506618742194e-09 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - 0.3300142288208008, - 0.8931987881660461, - 0.30542847514152527 + 0.3165043294429779, + 0.9485899209976196, + 0.0014882172690704465 ], [ - 0.9438925385475159, - -0.307933509349823, - -0.119347482919693 + 0.9183610677719116, + -0.30602461099624634, + -0.25092199444770813 ], [ - -0.01254936121404171, - 0.32767802476882935, - -0.9447060823440552 + -0.23756663501262665, + 0.0807846263051033, + -0.9680061936378479 ] ], "translation_m": [ - 0.1218881607055664, - -0.20107944309711456, - 1.2891619205474854 + 0.1261143833398819, + -0.20017947256565094, + 1.4975119829177856 ], "rvec_rad": [ - 2.322704613442351, - 1.652184434557161, - 0.26340024880479 + 2.374711802356422, + 1.7114110939780351, + -0.21641019802521885 ] }, "camera_in_world": { "position_m": [ - 0.16575071215629578, - -0.593219518661499, - 1.156652569770813 + 0.49968016147613525, + -0.3018666207790375, + 1.399183750152588 ], "position_mm": [ - 165.75071716308594, - -593.2195434570312, - 1156.652587890625 + 499.68017578125, + -301.8666076660156, + 1399.1837158203125 ], "orientation_deg": { - "roll": 160.87051391601562, - "pitch": 0.7190442681312561, - "yaw": 70.72877502441406 + "roll": 175.2294464111328, + "pitch": 13.742963790893555, + "yaw": 70.98397064208984 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 0.0006092507461230473, - 0.0003526259972047522, - -0.00014148169414567735, - 1.1290047064735734e-06, - 2.1531805909252623e-05, - 0.0001662744717226349 + 1.7821255499500834e-07, + 1.1378656398482221e-07, + -1.4737142148217561e-08, + -1.8533236538334094e-09, + 6.738689930879477e-10, + 1.0833345422934384e-08 ], [ - 0.0003526259972047535, - 0.0003582526715943927, - -2.191753014940007e-05, - 2.2388696074135468e-05, - 1.249716779022916e-05, - 9.801057630670168e-05 + 1.1378656398482218e-07, + 1.0106730226754071e-07, + -4.0916354766287084e-08, + 1.7737988062902355e-09, + -1.0777386533119191e-10, + 1.3347903204217209e-08 ], [ - -0.00014148169414567198, - -2.1917530149394752e-05, - 0.0015247128329893805, - 4.612731251766003e-05, - 3.853860759149674e-06, - -0.0004596553107967692 + -1.4737142148209665e-08, + -4.091635476627995e-08, + 7.991758315646605e-07, + 6.197428924044788e-09, + -8.224093362206842e-09, + -1.4232193526454197e-07 ], [ - 1.1290047064741053e-06, - 2.2388696074135834e-05, - 4.61273125176595e-05, - 9.421718322597816e-06, - 4.303949547339506e-07, - -6.403632417071608e-08 + -1.8533236538332181e-09, + 1.7737988062903513e-09, + 6.197428924044598e-09, + 1.4884957612538316e-09, + -1.3736224299157495e-10, + 1.2595150626417418e-09 ], [ - 2.15318059092526e-05, - 1.2497167790229121e-05, - 3.853860759149121e-06, - 4.3039495473392456e-07, - 5.110125406719875e-06, - 4.803799556267123e-06 + 6.738689930879671e-10, + -1.0777386533138668e-10, + -8.224093362206965e-09, + -1.373622429915981e-10, + 8.709491101888092e-10, + 1.7230680269593937e-09 ], [ - 0.0001662744717226335, - 9.801057630669992e-05, - -0.0004596553107967708, - -6.403632417099117e-08, - 4.803799556266998e-06, - 0.00026228123733787814 + 1.0833345422933693e-08, + 1.3347903204216446e-08, + -1.423219352645422e-07, + 1.2595150626416901e-09, + 1.7230680269593344e-09, + 4.445551447804239e-08 ] ], "parameter_std": { "rvec_std_deg": [ - 1.4142320241467214, - 1.0844695224941754, - 2.2372610420069297 + 0.02418754446382333, + 0.018214949400490767, + 0.051220498773795475 ], "tvec_std_m": [ - 0.0030694817677578436, - 0.0022605586492546207, - 0.01619509917653727 + 3.8581028514722513e-05, + 2.9511846946418132e-05, + 0.00021084476393318946 ] }, "camera_center_std_m": [ - 0.03388169979028178, - 0.03194726625752425, - 0.03151342140570509 + 0.0007626874807798689, + 0.0008489790763477742, + 0.00035025922532159716 ], "camera_center_std_mm": [ - 33.88169979028178, - 31.947266257524248, - 31.51342140570509 + 0.7626874807798689, + 0.8489790763477741, + 0.35025922532159715 ], "orientation_std_deg": { - "roll": 1.611069410531176, - "pitch": 1.521103418689839, - "yaw": 0.7115695613005444 + "roll": 0.036331760709423115, + "pitch": 0.02896018768320413, + "yaw": 0.011944807429600208 } } }, @@ -245,10 +230,10 @@ 666.0 ], "projected_center_px": [ - 1232.56591796875, - 635.7584228515625 + 1234.3304443359375, + 665.8429565429688 ], - "reprojection_error_px": 30.275560766024654, + "reprojection_error_px": 0.36586350808669266, "confidence": 0.2988751797371847 }, { @@ -258,10 +243,10 @@ 626.75 ], "projected_center_px": [ - 1198.8643798828125, - 602.9756469726562 + 1196.1064453125, + 626.8641967773438 ], - "reprojection_error_px": 23.94628434604897, + "reprojection_error_px": 0.15611376783910083, "confidence": 0.5697620483284124 }, { @@ -271,10 +256,10 @@ 623.75 ], "projected_center_px": [ - 597.9401245117188, - 625.4595947265625 + 593.9148559570312, + 623.703125 ], - "reprojection_error_px": 4.525467661225368, + "reprojection_error_px": 0.17139064208319352, "confidence": 0.5768583617164568 }, { @@ -284,10 +269,10 @@ 651.75 ], "projected_center_px": [ - 768.7491455078125, - 645.1398315429688 + 750.7487182617188, + 651.6533813476562 ], - "reprojection_error_px": 18.94007638020057, + "reprojection_error_px": 0.2692167824901877, "confidence": 0.5593704450665263 }, { @@ -297,10 +282,10 @@ 639.0 ], "projected_center_px": [ - 538.3031005859375, - 643.2557373046875 + 540.5711059570312, + 638.9446411132812 ], - "reprojection_error_px": 4.789328454179874, + "reprojection_error_px": 0.0901147239027528, "confidence": 0.5766374039623903 }, { @@ -310,10 +295,10 @@ 594.75 ], "projected_center_px": [ - 1237.91455078125, - 573.0635375976562 + 1240.216552734375, + 594.7891845703125 ], - "reprojection_error_px": 21.840036611484972, + "reprojection_error_px": 0.28614294144861335, "confidence": 0.21364841201201337 }, { @@ -323,10 +308,10 @@ 605.25 ], "projected_center_px": [ - 480.19049072265625, - 611.6685791015625 + 491.56536865234375, + 605.2406616210938 ], - "reprojection_error_px": 13.003967001547613, + "reprojection_error_px": 0.0660323104989879, "confidence": 0.5705029634947052 }, { @@ -336,10 +321,10 @@ 548.5 ], "projected_center_px": [ - 1200.1619873046875, - 533.2457275390625 + 1197.5150146484375, + 548.5629272460938 ], - "reprojection_error_px": 15.443785516203269, + "reprojection_error_px": 0.24326519222834797, "confidence": 0.5440516905787338 }, { @@ -349,10 +334,10 @@ 430.75 ], "projected_center_px": [ - 815.6132202148438, - 434.71270751953125 + 788.9615478515625, + 430.6828308105469 ], - "reprojection_error_px": 26.906626341648956, + "reprojection_error_px": 0.07739681990398141, "confidence": 0.551983363957988 }, { @@ -362,10 +347,10 @@ 542.75 ], "projected_center_px": [ - 600.3131103515625, - 544.645751953125 + 598.868408203125, + 542.796142578125 ], - "reprojection_error_px": 2.6232126514486667, + "reprojection_error_px": 0.37128660310575845, "confidence": 0.5459402660246769 }, { @@ -375,10 +360,10 @@ 485.0 ], "projected_center_px": [ - 1250.4515380859375, - 475.3403015136719 + 1254.0916748046875, + 484.9971618652344 ], - "reprojection_error_px": 10.379695937711915, + "reprojection_error_px": 0.1583506314470805, "confidence": 0.06519221426443914 }, { @@ -388,10 +373,10 @@ 495.75 ], "projected_center_px": [ - 428.94537353515625, - 500.8000183105469 + 452.8467712402344, + 495.9134826660156 ], - "reprojection_error_px": 24.57901013670038, + "reprojection_error_px": 0.22406613958134775, "confidence": 0.5349107016469481 }, { @@ -401,10 +386,10 @@ 435.0 ], "projected_center_px": [ - 538.4442138671875, - 436.2699890136719 + 548.4963989257812, + 434.8807373046875 ], - "reprojection_error_px": 10.383742095705077, + "reprojection_error_px": 0.2802447061732053, "confidence": 0.5227826547122322 }, { @@ -414,10 +399,10 @@ 376.25 ], "projected_center_px": [ - 661.5415649414062, - 376.18011474609375 + 659.2869873046875, + 376.24285888671875 ], - "reprojection_error_px": 2.2926303298603923, + "reprojection_error_px": 0.03767036244770688, "confidence": 0.5111500432161571 }, { @@ -427,10 +412,10 @@ 313.5 ], "projected_center_px": [ - 612.7017211914062, - 311.79345703125 + 617.798583984375, + 313.5018615722656 ], - "reprojection_error_px": 5.566331578138664, + "reprojection_error_px": 0.20142461816161, "confidence": 0.5046333482067283 }, { @@ -440,10 +425,10 @@ 251.25 ], "projected_center_px": [ - 1245.7049560546875, - 263.84906005859375 + 1247.8360595703125, + 251.25607299804688 ], - "reprojection_error_px": 12.72629157003938, + "reprojection_error_px": 0.33611443899942695, "confidence": 0.13607001327160623 }, { @@ -453,10 +438,10 @@ 150.5 ], "projected_center_px": [ - 793.5236206054688, - 153.9915313720703 + 775.3116455078125, + 150.40562438964844 ], - "reprojection_error_px": 18.849809326820726, + "reprojection_error_px": 0.32562198692493255, "confidence": 0.46988879526830113 }, { @@ -466,10 +451,10 @@ 264.25 ], "projected_center_px": [ - 547.4027709960938, - 259.3707580566406 + 562.7115478515625, + 264.1392517089844 ], - "reprojection_error_px": 16.104174615303283, + "reprojection_error_px": 0.11723374805209077, "confidence": 0.4655541127751829 }, { @@ -479,10 +464,10 @@ 240.75 ], "projected_center_px": [ - 443.5474853515625, - 232.3603057861328 + 476.0595703125, + 241.0990753173828 ], - "reprojection_error_px": 33.761537780934475, + "reprojection_error_px": 0.3976393379524452, "confidence": 0.4655541127751829 }, { @@ -492,10 +477,10 @@ 261.5 ], "projected_center_px": [ - 1209.2646484375, - 272.2220764160156 + 1207.36083984375, + 261.3305358886719 ], - "reprojection_error_px": 10.866319836027728, + "reprojection_error_px": 0.21927980781584874, "confidence": 0.49001748422717006 }, { @@ -505,10 +490,10 @@ 153.5 ], "projected_center_px": [ - 1167.9842529296875, - 170.08203125 + 1162.341064453125, + 153.42291259765625 ], - "reprojection_error_px": 17.545524131173917, + "reprojection_error_px": 0.11931136669681776, "confidence": 0.46225891142368675 }, { @@ -518,10 +503,10 @@ 182.25 ], "projected_center_px": [ - 997.3069458007812, - 190.50851440429688 + 983.996337890625, + 182.11337280273438 ], - "reprojection_error_px": 15.661349453699982, + "reprojection_error_px": 0.13667626742684508, "confidence": 0.4548532843889077 }, { @@ -531,10 +516,10 @@ 177.75 ], "projected_center_px": [ - 552.6438598632812, - 168.61941528320312 + 570.462646484375, + 177.6640625 ], - "reprojection_error_px": 20.05515688925776, + "reprojection_error_px": 0.09370453049771457, "confidence": 0.43211414091114625 }, { @@ -544,10 +529,10 @@ 160.5 ], "projected_center_px": [ - 1065.968994140625, - 172.5654296875 + 1054.4666748046875, + 160.67330932617188 ], - "reprojection_error_px": 16.646693970326268, + "reprojection_error_px": 0.17648425193417577, "confidence": 0.45818248585417487 }, { @@ -557,10 +542,10 @@ 87.25 ], "projected_center_px": [ - 1015.1254272460938, - 99.04560852050781 + 1003.1221923828125, + 87.5596923828125 ], - "reprojection_error_px": 16.916334303547835, + "reprojection_error_px": 0.3329269445230899, "confidence": 0.422956152719696 }, { @@ -570,10 +555,10 @@ 64.0 ], "projected_center_px": [ - 1177.6336669921875, - 85.7947006225586 + 1172.843994140625, + 63.96263122558594 ], - "reprojection_error_px": 22.281827685839506, + "reprojection_error_px": 0.16041899345321103, "confidence": 0.4377857805109236 }, { @@ -583,10 +568,10 @@ 42.0 ], "projected_center_px": [ - 999.5007934570312, - 53.26692581176758 + 987.923095703125, + 42.024051666259766 ], - "reprojection_error_px": 16.279581202158823, + "reprojection_error_px": 0.17475870533455345, "confidence": 0.22473325223116958 } ] diff --git a/data/evaluations/Scene5/render_g_aruco_detection.json b/data/evaluations/Scene5/render_g_aruco_detection.json index 4b392ec..af90a66 100644 --- a/data/evaluations/Scene5/render_g_aruco_detection.json +++ b/data/evaluations/Scene5/render_g_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:46Z", + "created_utc": "2026-06-01T19:02:37Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -16,7 +16,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -35,18 +35,18 @@ }, "image": { "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene5\\render_g.png", - "image_sha256": "338a477d85dcc67bddd5cb04a10dbbc096fb5bed49ea1af5d5f9f91479510bc8", + "image_sha256": "7ccb199168bbed0cf15b6138a2fb15b34229947f1dfbc8652b78037d34b23e94", "width_px": 1280, "height_px": 720 }, "aruco": { "dictionary": "DICT_4X4_250", - "num_detected_markers": 38, + "num_detected_markers": 39, "num_rejected_candidates": 10 }, "detections": [ { - "observation_id": "49b8d799-5520-486c-9559-da08558b6b1c", + "observation_id": "c8b67f2c-77e2-4235-929f-5021d49ebf5c", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -76,14 +76,14 @@ "area_px": 1299.5, "perimeter_px": 144.9162483215332, "sharpness": { - "laplacian_var": 2059.6506781453845 + "laplacian_var": 2063.31696903091 }, "contrast": { "p05": 15.0, "p95": 174.0, "dynamic_range": 159.0, - "mean_gray": 70.93757094211124, - "std_gray": 69.52079826970159 + "mean_gray": 70.93416572077184, + "std_gray": 69.52287680400848 }, "geometry": { "distance_to_center_norm": 0.5837439298629761, @@ -100,7 +100,61 @@ "confidence": 0.7460587402140983 }, { - "observation_id": "48790d3a-1f5f-4eb9-81cb-023e5f5f3457", + "observation_id": "6a411337-36b3-45d8-a9fa-a480270e702d", + "type": "aruco", + "marker_id": 231, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 120.0, + 393.0 + ], + [ + 97.0, + 370.0 + ], + [ + 124.0, + 343.0 + ], + [ + 147.0, + 367.0 + ] + ], + "center_px": [ + 122.0, + 368.25 + ], + "quality": { + "area_px": 1244.0, + "perimeter_px": 141.435546875, + "sharpness": { + "laplacian_var": 2583.2339197154224 + }, + "contrast": { + "p05": 7.0, + "p95": 158.0, + "dynamic_range": 151.0, + "mean_gray": 73.7938021454112, + "std_gray": 66.25548600103842 + }, + "geometry": { + "distance_to_center_norm": 0.7055209279060364, + "distance_to_border_px": 97.0 + }, + "edge_ratio": 1.1739129924877458, + "edge_lengths_px": [ + 32.526912689208984, + 38.18376541137695, + 33.241539001464844, + 37.48332977294922 + ] + }, + "confidence": 0.7064691664889216 + }, + { + "observation_id": "3f4b274a-06d9-4efb-8418-e3c3c0c6f450", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -130,14 +184,14 @@ "area_px": 949.0, "perimeter_px": 128.51532745361328, "sharpness": { - "laplacian_var": 3938.169818324745 + "laplacian_var": 3948.550994264419 }, "contrast": { "p05": 20.0, "p95": 185.0, "dynamic_range": 165.0, - "mean_gray": 104.21495327102804, - "std_gray": 72.61038794026528 + "mean_gray": 104.20716510903426, + "std_gray": 72.63054041086717 }, "geometry": { "distance_to_center_norm": 0.6108718514442444, @@ -154,7 +208,7 @@ "confidence": 0.5903116652341175 }, { - "observation_id": "492ca12a-9320-404a-979c-797dcf8f91e2", + "observation_id": "650946c3-7952-4677-9410-10bd0304ebab", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -184,14 +238,14 @@ "area_px": 887.0, "perimeter_px": 125.0509147644043, "sharpness": { - "laplacian_var": 3211.3021565695763 + "laplacian_var": 3174.423778191198 }, "contrast": { "p05": 18.0, "p95": 183.0, "dynamic_range": 165.0, - "mean_gray": 73.91722972972973, - "std_gray": 69.91359223221254 + "mean_gray": 73.9391891891892, + "std_gray": 69.89932203508278 }, "geometry": { "distance_to_center_norm": 0.6587240695953369, @@ -208,7 +262,7 @@ "confidence": 0.5514992115017867 }, { - "observation_id": "860e8c95-a0f1-42e0-933d-36ae5f0286d1", + "observation_id": "ef6db564-921d-4406-8c76-b78735320619", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -262,7 +316,7 @@ "confidence": 0.4449530931867355 }, { - "observation_id": "a62ee2ed-da3b-4355-9441-d669c3d5fe70", + "observation_id": "6562dc2c-802e-4bb0-8e79-ba0c762f209f", "type": "aruco", "marker_id": 84, "marker_size_m": 0.025, @@ -292,14 +346,14 @@ "area_px": 820.0, "perimeter_px": 114.87655830383301, "sharpness": { - "laplacian_var": 2935.293917405715 + "laplacian_var": 2935.1226970049865 }, "contrast": { "p05": 6.0, "p95": 130.0, "dynamic_range": 124.0, - "mean_gray": 62.15664845173042, - "std_gray": 52.903777798402224 + "mean_gray": 62.13661202185792, + "std_gray": 52.87595467750084 }, "geometry": { "distance_to_center_norm": 0.8841893672943115, @@ -316,7 +370,7 @@ "confidence": 0.3490767193505014 }, { - "observation_id": "7213fcd0-8e6b-47f2-8fb0-854dce5ea522", + "observation_id": "72b30a81-f94a-4c86-b6e0-7f3a0b37866d", "type": "aruco", "marker_id": 64, "marker_size_m": 0.025, @@ -346,14 +400,14 @@ "area_px": 820.0, "perimeter_px": 114.6026382446289, "sharpness": { - "laplacian_var": 3802.883790202471 + "laplacian_var": 3800.909431228112 }, "contrast": { "p05": 41.0, "p95": 183.0, "dynamic_range": 142.0, - "mean_gray": 93.93772893772893, - "std_gray": 61.638938664430626 + "mean_gray": 93.93956043956044, + "std_gray": 61.63824221890246 }, "geometry": { "distance_to_center_norm": 0.46117648482322693, @@ -370,7 +424,7 @@ "confidence": 0.5072111596185911 }, { - "observation_id": "0e91518d-b330-4b19-a3ea-19e145304b26", + "observation_id": "14bb0583-ed5a-4b71-b0bc-5bdd796e78dc", "type": "aruco", "marker_id": 72, "marker_size_m": 0.025, @@ -400,14 +454,14 @@ "area_px": 779.0, "perimeter_px": 112.11092758178711, "sharpness": { - "laplacian_var": 2042.5335059924248 + "laplacian_var": 2041.9719140426255 }, "contrast": { "p05": 6.0, "p95": 135.0, "dynamic_range": 129.0, - "mean_gray": 44.31954887218045, - "std_gray": 51.63065907179048 + "mean_gray": 44.29887218045113, + "std_gray": 51.611866228321254 }, "geometry": { "distance_to_center_norm": 0.7917603254318237, @@ -424,7 +478,7 @@ "confidence": 0.43254677700170213 }, { - "observation_id": "7e0126e0-c581-4044-9a57-4c98701b6f29", + "observation_id": "0f04ad07-f789-44e2-8238-364f8cc73d71", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -478,7 +532,7 @@ "confidence": 0.36252498796515575 }, { - "observation_id": "d102027e-9b3b-4ed5-84f4-7e5e9242b0a0", + "observation_id": "19a345f3-14b3-4386-ab04-c1ffb3e41a76", "type": "aruco", "marker_id": 53, "marker_size_m": 0.025, @@ -508,14 +562,14 @@ "area_px": 760.0, "perimeter_px": 110.65593338012695, "sharpness": { - "laplacian_var": 2844.89490643903 + "laplacian_var": 2844.6279891457966 }, "contrast": { "p05": 7.0, "p95": 137.0, "dynamic_range": 130.0, - "mean_gray": 74.52255639097744, - "std_gray": 56.11221184623625 + "mean_gray": 74.5187969924812, + "std_gray": 56.109399250634105 }, "geometry": { "distance_to_center_norm": 0.8453760743141174, @@ -532,7 +586,7 @@ "confidence": 0.27711751756945874 }, { - "observation_id": "7f238daa-256c-487a-ba2e-1f7090a25f82", + "observation_id": "8c075a1b-bf77-410a-b26e-0ae784f59094", "type": "aruco", "marker_id": 58, "marker_size_m": 0.025, @@ -562,14 +616,14 @@ "area_px": 760.0, "perimeter_px": 110.37932586669922, "sharpness": { - "laplacian_var": 4214.154503381986 + "laplacian_var": 4210.72431470274 }, "contrast": { "p05": 38.0, "p95": 182.0, "dynamic_range": 144.0, - "mean_gray": 90.56792452830189, - "std_gray": 62.293463340367424 + "mean_gray": 90.56981132075472, + "std_gray": 62.292704030537145 }, "geometry": { "distance_to_center_norm": 0.33771631121635437, @@ -586,7 +640,7 @@ "confidence": 0.48073279309443956 }, { - "observation_id": "82968e11-94e3-4621-b381-a3cdc974190f", + "observation_id": "0fad80ec-0ae6-437d-9dc0-5d7e49e16d2f", "type": "aruco", "marker_id": 69, "marker_size_m": 0.025, @@ -640,7 +694,7 @@ "confidence": 0.45546210617301425 }, { - "observation_id": "35449c11-ef4c-4d9e-ad8f-d9953b1f6d84", + "observation_id": "170c8228-0591-439a-81f7-80d0b2a53fe1", "type": "aruco", "marker_id": 103, "marker_size_m": 0.025, @@ -694,7 +748,7 @@ "confidence": 0.4795917219326271 }, { - "observation_id": "fe5d7871-0f7a-474d-8b0c-6469210c184c", + "observation_id": "c90d9c89-bd9c-4e01-9be4-268bf636fa09", "type": "aruco", "marker_id": 51, "marker_size_m": 0.025, @@ -724,14 +778,14 @@ "area_px": 740.0, "perimeter_px": 109.00359725952148, "sharpness": { - "laplacian_var": 4068.301502076613 + "laplacian_var": 4067.7634903807066 }, "contrast": { "p05": 28.0, "p95": 180.0, "dynamic_range": 152.0, - "mean_gray": 83.06432748538012, - "std_gray": 64.65579695818629 + "mean_gray": 83.06627680311891, + "std_gray": 64.65876461318679 }, "geometry": { "distance_to_center_norm": 0.20057930052280426, @@ -748,7 +802,7 @@ "confidence": 0.4668259742313624 }, { - "observation_id": "bfa68a7d-cce8-4397-97ea-df7e4a8ec5a2", + "observation_id": "e4ab776c-6bd8-4310-bd00-8f26cdec6b8a", "type": "aruco", "marker_id": 56, "marker_size_m": 0.025, @@ -778,14 +832,14 @@ "area_px": 721.5, "perimeter_px": 107.85333442687988, "sharpness": { - "laplacian_var": 2408.8424776474435 + "laplacian_var": 2407.969183300465 }, "contrast": { "p05": 7.0, "p95": 142.0, "dynamic_range": 135.0, - "mean_gray": 41.96491228070175, - "std_gray": 51.652070536274856 + "mean_gray": 41.96296296296296, + "std_gray": 51.63936830802677 }, "geometry": { "distance_to_center_norm": 0.7856342196464539, @@ -802,7 +856,7 @@ "confidence": 0.39662908657084783 }, { - "observation_id": "dffa60a0-4146-47fd-8d9f-cc49052b0990", + "observation_id": "0e703621-9303-4563-beba-91b826ff908e", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -856,7 +910,7 @@ "confidence": 0.4561015937422635 }, { - "observation_id": "aa1c19f6-7bba-413e-bfe9-8505e17a679f", + "observation_id": "e49b8e7f-2090-4949-816f-aca3abdd5cd6", "type": "aruco", "marker_id": 46, "marker_size_m": 0.025, @@ -886,14 +940,14 @@ "area_px": 702.0, "perimeter_px": 106.57870483398438, "sharpness": { - "laplacian_var": 3386.5467849526713 + "laplacian_var": 3383.0678270368394 }, "contrast": { "p05": 8.0, "p95": 146.09999999999997, "dynamic_range": 138.09999999999997, - "mean_gray": 76.37675350701403, - "std_gray": 59.820794005699284 + "mean_gray": 76.37074148296593, + "std_gray": 59.82074781704156 }, "geometry": { "distance_to_center_norm": 0.8364452719688416, @@ -910,7 +964,7 @@ "confidence": 0.1698001278724927 }, { - "observation_id": "0e99b62e-8d91-4ffc-9781-9337d4c1110c", + "observation_id": "b6caf319-c90f-4cf4-9fdd-32fce45a3f14", "type": "aruco", "marker_id": 68, "marker_size_m": 0.025, @@ -940,14 +994,14 @@ "area_px": 702.0, "perimeter_px": 106.47352981567383, "sharpness": { - "laplacian_var": 3078.0648640332943 + "laplacian_var": 3080.523616548385 }, "contrast": { "p05": 7.0, "p95": 146.0, "dynamic_range": 139.0, - "mean_gray": 55.88933601609658, - "std_gray": 57.114360083328776 + "mean_gray": 55.88732394366197, + "std_gray": 57.11782608451952 }, "geometry": { "distance_to_center_norm": 0.8423811793327332, @@ -964,7 +1018,7 @@ "confidence": 0.07718187630567852 }, { - "observation_id": "a5fb70f5-d3f0-430c-a099-fcdf2631833b", + "observation_id": "e4fd266d-87d7-43c7-a87f-88916c80ad15", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -994,14 +1048,14 @@ "area_px": 703.5, "perimeter_px": 106.30549621582031, "sharpness": { - "laplacian_var": 3718.766854649021 + "laplacian_var": 3717.145124266727 }, "contrast": { "p05": 15.0, "p95": 171.0, "dynamic_range": 156.0, - "mean_gray": 71.81287726358148, - "std_gray": 66.0538405718911 + "mean_gray": 71.8148893360161, + "std_gray": 66.05346547643435 }, "geometry": { "distance_to_center_norm": 0.3038310110569, @@ -1018,7 +1072,7 @@ "confidence": 0.4316478958478293 }, { - "observation_id": "1b175bc7-145b-4aee-9f70-67e4ef1be3f3", + "observation_id": "0c227523-c3bf-4f57-a1be-f85ec8f0ddb3", "type": "aruco", "marker_id": 115, "marker_size_m": 0.025, @@ -1072,7 +1126,7 @@ "confidence": 0.34608319473201704 }, { - "observation_id": "c8f7c863-be70-466f-b10b-39036bb11a6f", + "observation_id": "bafc12bb-d297-484a-8e2c-13a2dfa7907b", "type": "aruco", "marker_id": 79, "marker_size_m": 0.025, @@ -1126,7 +1180,7 @@ "confidence": 0.40793535669071385 }, { - "observation_id": "33d594d7-1868-4076-b5ff-7c250935b0b7", + "observation_id": "6b4332b8-f05c-4b32-a8fa-b2c7fbc4b727", "type": "aruco", "marker_id": 95, "marker_size_m": 0.025, @@ -1156,14 +1210,14 @@ "area_px": 665.0, "perimeter_px": 103.3526554107666, "sharpness": { - "laplacian_var": 3868.6829753816933 + "laplacian_var": 3869.554770253488 }, "contrast": { "p05": 30.0, "p95": 180.0, "dynamic_range": 150.0, - "mean_gray": 92.6431623931624, - "std_gray": 66.38941399691649 + "mean_gray": 92.64102564102564, + "std_gray": 66.39604837619255 }, "geometry": { "distance_to_center_norm": 0.1222480833530426, @@ -1180,7 +1234,7 @@ "confidence": 0.4181682027393045 }, { - "observation_id": "dd642fc0-076b-4d38-a65c-b989b7f7e3af", + "observation_id": "45993dcf-5fd1-4cf6-b1dc-2d2edeb49e45", "type": "aruco", "marker_id": 55, "marker_size_m": 0.025, @@ -1210,14 +1264,14 @@ "area_px": 629.0, "perimeter_px": 100.5296630859375, "sharpness": { - "laplacian_var": 4389.915474286676 + "laplacian_var": 4389.287033919703 }, "contrast": { "p05": 24.0, "p95": 178.0, "dynamic_range": 154.0, - "mean_gray": 89.67660550458716, - "std_gray": 67.20496857615096 + "mean_gray": 89.6788990825688, + "std_gray": 67.2079657158935 }, "geometry": { "distance_to_center_norm": 0.026040121912956238, @@ -1234,7 +1288,7 @@ "confidence": 0.39668368657567366 }, { - "observation_id": "275d5708-f277-4063-94e2-d3f95e315f1f", + "observation_id": "780b876c-8d94-4614-8251-c2d34d063c4a", "type": "aruco", "marker_id": 96, "marker_size_m": 0.025, @@ -1288,7 +1342,7 @@ "confidence": 0.3577321830843512 }, { - "observation_id": "daeae7dd-8029-47f0-86a9-28fa078f88b2", + "observation_id": "dc3d0bf6-d2a3-48c8-908d-50f1d4db511a", "type": "aruco", "marker_id": 66, "marker_size_m": 0.025, @@ -1342,7 +1396,7 @@ "confidence": 0.3829765144945479 }, { - "observation_id": "e6a252f1-f603-4956-b0e5-38657db6fc54", + "observation_id": "3b2d7ba5-2335-43a7-9022-bf7387788763", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -1396,7 +1450,7 @@ "confidence": 0.3382587531306593 }, { - "observation_id": "9d3d5995-3496-40f8-9278-fad09371401e", + "observation_id": "9a5f12f9-02b5-437f-aa95-f6783202a17e", "type": "aruco", "marker_id": 97, "marker_size_m": 0.025, @@ -1450,7 +1504,7 @@ "confidence": 0.3623898971459892 }, { - "observation_id": "cf05eaea-ba81-40e2-9796-9ee8ea44a111", + "observation_id": "8873a268-a991-4b71-adcc-7c343cc6ceda", "type": "aruco", "marker_id": 54, "marker_size_m": 0.025, @@ -1480,14 +1534,14 @@ "area_px": 558.5, "perimeter_px": 95.06661224365234, "sharpness": { - "laplacian_var": 3963.855855099241 + "laplacian_var": 3964.3002995436855 }, "contrast": { "p05": 22.0, "p95": 177.0, "dynamic_range": 155.0, "mean_gray": 59.804232804232804, - "std_gray": 58.9601585780066 + "std_gray": 58.96033805504213 }, "geometry": { "distance_to_center_norm": 0.13344134390354156, @@ -1504,7 +1558,7 @@ "confidence": 0.3590718541167963 }, { - "observation_id": "ec1b8420-44aa-49b9-a3ae-f92fad856427", + "observation_id": "f3b1c533-6f71-4f51-ac64-44b8365df01b", "type": "aruco", "marker_id": 43, "marker_size_m": 0.025, @@ -1558,7 +1612,7 @@ "confidence": 0.2738204676258435 }, { - "observation_id": "9e300eda-8c7d-4140-b167-b005eedc74d6", + "observation_id": "d2e831fc-101c-489c-9ffd-d521063366bc", "type": "aruco", "marker_id": 205, "marker_size_m": 0.025, @@ -1612,7 +1666,7 @@ "confidence": 0.29591817114314195 }, { - "observation_id": "fefea44f-1025-4cd4-ac20-2ecde8dd01c8", + "observation_id": "3fbbe428-cdac-47c2-831c-02cfced6aeda", "type": "aruco", "marker_id": 92, "marker_size_m": 0.025, @@ -1666,7 +1720,7 @@ "confidence": 0.3158166687011719 }, { - "observation_id": "2c54fdb5-febc-48d7-982a-21a45dcafd6a", + "observation_id": "08090d85-7ebb-4abb-9c24-7c121fd96cc7", "type": "aruco", "marker_id": 105, "marker_size_m": 0.025, @@ -1720,7 +1774,7 @@ "confidence": 0.31800273344664126 }, { - "observation_id": "4c625f42-36a4-4e41-bcd0-dc2325db34f4", + "observation_id": "2060ada4-c465-41dd-a763-068156e28d56", "type": "aruco", "marker_id": 85, "marker_size_m": 0.025, @@ -1750,14 +1804,14 @@ "area_px": 525.0, "perimeter_px": 92.31552124023438, "sharpness": { - "laplacian_var": 4208.821346447191 + "laplacian_var": 4208.793798237824 }, "contrast": { "p05": 16.0, "p95": 173.0, "dynamic_range": 157.0, - "mean_gray": 125.23691460055096, - "std_gray": 59.01957524971371 + "mean_gray": 125.2396694214876, + "std_gray": 59.02080103880851 }, "geometry": { "distance_to_center_norm": 0.33065441250801086, @@ -1774,7 +1828,7 @@ "confidence": 0.2969848480224609 }, { - "observation_id": "397d2732-8d26-4988-8b07-ac19b226b192", + "observation_id": "08ea919e-c408-4140-81ee-cd9bb43150ff", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -1804,14 +1858,14 @@ "area_px": 525.0, "perimeter_px": 92.27830123901367, "sharpness": { - "laplacian_var": 4066.0537136423345 + "laplacian_var": 4065.829056108088 }, "contrast": { "p05": 12.0, "p95": 168.0, "dynamic_range": 156.0, - "mean_gray": 102.85753424657534, - "std_gray": 63.5566534413179 + "mean_gray": 102.86027397260274, + "std_gray": 63.559396748186906 }, "geometry": { "distance_to_center_norm": 0.5383343696594238, @@ -1828,7 +1882,7 @@ "confidence": 0.3170967427530611 }, { - "observation_id": "958c396b-a150-45bd-97bc-48f6e23d340a", + "observation_id": "759cba9c-5500-4e55-9f93-db1ddf41d22a", "type": "aruco", "marker_id": 59, "marker_size_m": 0.025, @@ -1882,7 +1936,7 @@ "confidence": 0.3170967427530611 }, { - "observation_id": "2774c487-6eea-40f7-982b-5144dc470505", + "observation_id": "bc77d3b5-8da6-4175-b693-979d2b5d9054", "type": "aruco", "marker_id": 48, "marker_size_m": 0.025, @@ -1912,14 +1966,14 @@ "area_px": 507.5, "perimeter_px": 91.00028991699219, "sharpness": { - "laplacian_var": 3199.9650666166262 + "laplacian_var": 3197.0554775755304 }, "contrast": { "p05": 11.0, "p95": 167.0, "dynamic_range": 156.0, - "mean_gray": 62.14794520547945, - "std_gray": 61.99133856775198 + "mean_gray": 62.153424657534245, + "std_gray": 61.99260689944833 }, "geometry": { "distance_to_center_norm": 0.5662168264389038, @@ -1936,7 +1990,7 @@ "confidence": 0.17828567290874034 }, { - "observation_id": "193bc817-0696-4aff-9a28-4d1190d20f7c", + "observation_id": "34435999-494e-4b1e-8c3b-9e5379ce2097", "type": "aruco", "marker_id": 57, "marker_size_m": 0.025, @@ -1966,14 +2020,14 @@ "area_px": 494.0, "perimeter_px": 89.47044372558594, "sharpness": { - "laplacian_var": 4679.898986311983 + "laplacian_var": 4680.989895402892 }, "contrast": { "p05": 13.0, "p95": 171.0, "dynamic_range": 158.0, - "mean_gray": 84.4659090909091, - "std_gray": 65.0342914552211 + "mean_gray": 84.46875, + "std_gray": 65.03752536232972 }, "geometry": { "distance_to_center_norm": 0.4621008336544037, @@ -1990,7 +2044,7 @@ "confidence": 0.3167426670523156 }, { - "observation_id": "0bb777e3-4efa-47ec-8572-15d8a4230a72", + "observation_id": "99b4197b-d20a-41e9-8471-4f92416012c3", "type": "aruco", "marker_id": 63, "marker_size_m": 0.025, @@ -2020,14 +2074,14 @@ "area_px": 476.0, "perimeter_px": 88.23826217651367, "sharpness": { - "laplacian_var": 3117.856876509926 + "laplacian_var": 3118.821373551347 }, "contrast": { "p05": 9.0, "p95": 163.0, "dynamic_range": 154.0, - "mean_gray": 54.18639053254438, - "std_gray": 59.916886650648465 + "mean_gray": 54.18343195266272, + "std_gray": 59.9167723359379 }, "geometry": { "distance_to_center_norm": 0.6927092671394348, @@ -2044,7 +2098,7 @@ "confidence": 0.15449597168691093 }, { - "observation_id": "f1548dcd-6fa7-49cd-8352-3f3a5d756999", + "observation_id": "70eb2ee6-c957-498d-adaa-714779a77ad9", "type": "aruco", "marker_id": 71, "marker_size_m": 0.025, @@ -2074,14 +2128,14 @@ "area_px": 461.5, "perimeter_px": 87.19272422790527, "sharpness": { - "laplacian_var": 4511.57120675202 + "laplacian_var": 4512.879848727328 }, "contrast": { "p05": 10.0, "p95": 165.0, "dynamic_range": 155.0, - "mean_gray": 102.75, - "std_gray": 63.562129370588714 + "mean_gray": 102.74691358024691, + "std_gray": 63.564375041564205 }, "geometry": { "distance_to_center_norm": 0.646465003490448, diff --git a/data/evaluations/Scene5/render_g_camera_pose.json b/data/evaluations/Scene5/render_g_camera_pose.json index dfb1cbe..280b94a 100644 --- a/data/evaluations/Scene5/render_g_camera_pose.json +++ b/data/evaluations/Scene5/render_g_camera_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-31T08:42:48Z", + "created_utc": "2026-06-01T19:02:41Z", "source": { "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene5\\render_g_aruco_detection.json", "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" @@ -15,7 +15,7 @@ ], [ 0.0, - 1500.0, + 1777.77783203125, 360.0 ], [ @@ -75,171 +75,150 @@ 0, 1, 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 + 3 ], "rms": [ - 0.02141012113176351, - 0.012242069871904479, - 0.005818181909010562, - 0.005271298628209365, - 0.004955230773062616, - 0.004942208285188564, - 0.004941449563855756, - 0.0049414026245480445, - 0.004941399598487348, - 0.0049413994027549465, - 0.0049413993901557375 + 0.008152437731107097, + 0.0005414131999906976, + 0.0001027878276569163, + 0.0001027512794194728 ], "lambda": [ 0.001, 0.0005, 0.00025, - 0.000125, - 6.25e-05, - 3.125e-05, - 1.5625e-05, - 7.8125e-06, - 3.90625e-06, - 1.953125e-06, - 9.765625e-07 + 0.000125 ] }, - "residual_rms_px": 11.460219464378476, - "residual_median_px": 7.33113924377959, - "residual_max_px": 23.540294007868717, - "sigma2_normalized": 2.7033580917154224e-05 + "residual_rms_px": 0.25833393156582685, + "residual_median_px": 0.18962870716590038, + "residual_max_px": 0.5863280242637736, + "sigma2_normalized": 1.1689020813485004e-08 }, "camera_pose": { "world_to_camera": { "rotation_matrix": [ [ - -0.6582339406013489, - -0.7193996906280518, - -0.221793070435524 + -0.7072156071662903, + -0.7069976329803467, + 0.0006956866127438843 ], [ - -0.6823316812515259, - 0.6945951581001282, - -0.22794970870018005 + -0.6415573954582214, + 0.6413410902023315, + -0.4208155572414398 ], [ - 0.3180433511734009, - 0.0012921970337629318, - -0.9480752944946289 + 0.2970694303512573, + -0.29805365204811096, + -0.9071459770202637 ] ], "translation_m": [ - -0.01946926862001419, - 0.36232972145080566, - 1.297710657119751 + -0.00032427720725536346, + 0.3317517042160034, + 1.3885083198547363 ], "rvec_rad": [ - 1.1091658298923934, - -2.6119487228648834, - 0.1793501804857314 + 1.1163157128428653, + -2.6950269250018177, + 0.5950702602449643 ] }, "camera_in_world": { "position_m": [ - -0.17831452190876007, - -0.2673555612564087, - 1.308602213859558 + -0.19987493753433228, + 0.20085470378398895, + 1.3991862535476685 ], "position_mm": [ - -178.3145294189453, - -267.3555603027344, - 1308.6021728515625 + -199.87493896484375, + 200.85470581054688, + 1399.186279296875 ], "orientation_deg": { - "roll": 179.92190551757812, - "pitch": -18.544635772705078, - "yaw": -133.9701690673828 + "roll": -161.81143188476562, + "pitch": -17.28166961669922, + "yaw": -137.7869415283203 } }, "uncertainty": { "pose_covariance_6x6": [ [ - 0.00015201025689186003, - -0.00023266947358065447, - 1.9568423485768882e-05, - 1.5200683164421799e-05, - 2.7399730544810097e-05, - 0.00017864685821738447 + 5.1723742158630296e-08, + -7.36704690121804e-08, + 2.528395112885948e-08, + 4.479887454949863e-09, + 1.2242940701135423e-08, + 4.6704743268780886e-08 ], [ - -0.0002326694735806551, - 0.0005538685816470119, - -3.4838166910056097e-05, - -6.283459096534517e-05, - -4.8306938076108445e-05, - -0.00039194092821731575 + -7.367046901218092e-08, + 2.3148576747107667e-07, + -1.0778497213258498e-07, + -3.34747863427116e-08, + -2.122276666687905e-08, + -1.2559139275020906e-07 ], [ - 1.9568423485774483e-05, - -3.483816691006327e-05, - 0.0005641734192694169, - 1.0639256112115874e-05, - -4.557158269578928e-05, - -6.512169327188988e-05 + 2.528395112886197e-08, + -1.0778497213258615e-07, + 4.3459429345645545e-07, + 4.161852752718015e-08, + -2.5589489348967574e-08, + 1.8615206041444948e-09 ], [ - 1.5200683164422021e-05, - -6.283459096534545e-05, - 1.0639256112115449e-05, - 1.1964467817222734e-05, - 3.3482462186625764e-06, - 3.494545362114314e-05 + 4.479887454950086e-09, + -3.347478634271171e-08, + 4.161852752718031e-08, + 9.039769213191284e-09, + -2.617742708489594e-10, + 9.90627778280772e-09 ], [ - 2.739973054480962e-05, - -4.8306938076107707e-05, - -4.55715826957906e-05, - 3.3482462186625044e-06, - 1.1294193755485535e-05, - 4.3914357503632526e-05 + 1.2242940701135246e-08, + -2.1222766666878845e-08, + -2.5589489348968246e-08, + -2.61774270849004e-10, + 6.92468118389542e-09, + 1.768365167286118e-08 ], [ - 0.0001786468582173838, - -0.0003919409282173141, - -6.512169327189581e-05, - 3.494545362114284e-05, - 4.391435750363295e-05, - 0.000344690990195831 + 4.670474326878086e-08, + -1.2559139275020882e-07, + 1.8615206041437654e-09, + 9.906277782807667e-09, + 1.7683651672861224e-08, + 1.0553629182167797e-07 ] ], "parameter_std": { "rvec_std_deg": [ - 0.7064136441147739, - 1.3484225216536576, - 1.3609085506695444 + 0.013030695653138465, + 0.027566699972818517, + 0.03777153566162911 ], "tvec_std_m": [ - 0.0034589691841967504, - 0.0033606835250415256, - 0.018565855493238952 + 9.507770092503965e-05, + 8.321466928309828e-05, + 0.00032486349721333414 ] }, "camera_center_std_m": [ - 0.030003957270613123, - 0.026109055888373457, - 0.025207066752452472 + 0.0006735549485767408, + 0.0008065029463770363, + 0.00039960072418777855 ], "camera_center_std_mm": [ - 30.003957270613125, - 26.109055888373458, - 25.207066752452473 + 0.6735549485767408, + 0.8065029463770362, + 0.39960072418777853 ], "orientation_std_deg": { - "roll": 1.0517361348859564, - "pitch": 1.41209931182657, - "yaw": 0.4280104677005011 + "roll": 0.03339390166674079, + "pitch": 0.02847029358668595, + "yaw": 0.013200433591057438 } } }, @@ -252,10 +231,10 @@ 662.0 ], "projected_center_px": [ - 68.15506744384766, - 638.6396484375 + 65.14346313476562, + 661.9850463867188 ], - "reprojection_error_px": 23.540294007868717, + "reprojection_error_px": 0.1075811981906344, "confidence": 0.3490767193505014 }, { @@ -265,10 +244,10 @@ 647.0 ], "projected_center_px": [ - 823.6386108398438, - 647.4735717773438 + 819.5659790039062, + 646.9683227539062 ], - "reprojection_error_px": 3.917341508222998, + "reprojection_error_px": 0.18672754195195723, "confidence": 0.5072111596185911 }, { @@ -278,10 +257,10 @@ 581.0 ], "projected_center_px": [ - 101.5021743774414, - 567.59375 + 102.24842834472656, + 581.2055053710938 ], - "reprojection_error_px": 13.427091353835914, + "reprojection_error_px": 0.20551138082519524, "confidence": 0.43254677700170213 }, { @@ -291,10 +270,10 @@ 559.0 ], "projected_center_px": [ - 55.43064880371094, - 546.8662719726562 + 52.01676559448242, + 559.135986328125 ], - "reprojection_error_px": 12.609389638517422, + "reprojection_error_px": 0.1370159355522896, "confidence": 0.27711751756945874 }, { @@ -304,10 +283,10 @@ 564.0 ], "projected_center_px": [ - 786.7138671875, - 564.8284301757812 + 781.0108642578125, + 563.8584594726562 ], - "reprojection_error_px": 5.773610204415788, + "reprojection_error_px": 0.14195687013513403, "confidence": 0.48073279309443956 }, { @@ -317,10 +296,10 @@ 547.5 ], "projected_center_px": [ - 886.5928344726562, - 550.1328735351562 + 868.9462280273438, + 547.3478393554688 ], - "reprojection_error_px": 17.788756219432777, + "reprojection_error_px": 0.16138242403530167, "confidence": 0.45546210617301425 }, { @@ -330,10 +309,10 @@ 543.5 ], "projected_center_px": [ - 708.1809692382812, - 543.542236328125 + 708.2471923828125, + 543.6685180664062 ], - "reprojection_error_px": 0.08092684027535924, + "reprojection_error_px": 0.16854145311932264, "confidence": 0.4795917219326271 }, { @@ -343,10 +322,10 @@ 507.25 ], "projected_center_px": [ - 639.9074096679688, - 506.57635498046875 + 643.1062622070312, + 507.00213623046875 ], - "reprojection_error_px": 3.409795850212743, + "reprojection_error_px": 0.2865257429512536, "confidence": 0.4668259742313624 }, { @@ -356,10 +335,10 @@ 514.75 ], "projected_center_px": [ - 84.74476623535156, - 507.1705017089844 + 84.40376281738281, + 514.6827392578125 ], - "reprojection_error_px": 7.595629530931109, + "reprojection_error_px": 0.16783030551456876, "confidence": 0.39662908657084783 }, { @@ -369,10 +348,10 @@ 495.5 ], "projected_center_px": [ - 485.8951110839844, - 500.72076416015625 + 504.519775390625, + 495.50079345703125 ], - "reprojection_error_px": 19.323515984241922, + "reprojection_error_px": 0.01979130234299345, "confidence": 0.4561015937422635 }, { @@ -382,10 +361,10 @@ 498.0 ], "projected_center_px": [ - 45.11878967285156, - 491.624267578125 + 41.31007385253906, + 498.05682373046875 ], - "reprojection_error_px": 7.33113924377959, + "reprojection_error_px": 0.19824449004635394, "confidence": 0.1698001278724927 }, { @@ -395,10 +374,10 @@ 458.0 ], "projected_center_px": [ - 33.567447662353516, - 455.2054748535156 + 29.09933090209961, + 458.1151428222656 ], - "reprojection_error_px": 5.142929623424314, + "reprojection_error_px": 0.18962870716590038, "confidence": 0.07718187630567852 }, { @@ -408,10 +387,10 @@ 417.75 ], "projected_center_px": [ - 406.3010559082031, - 424.88421630859375 + 424.4014587402344, + 417.76727294921875 ], - "reprojection_error_px": 19.547342745093346, + "reprojection_error_px": 0.10004366372194644, "confidence": 0.4316478958478293 }, { @@ -421,10 +400,10 @@ 406.75 ], "projected_center_px": [ - 509.3986511230469, - 407.3850402832031 + 515.5861206054688, + 406.7344055175781 ], - "reprojection_error_px": 5.637232069254798, + "reprojection_error_px": 0.5863280242637736, "confidence": 0.40793535669071385 }, { @@ -434,10 +413,10 @@ 415.25 ], "projected_center_px": [ - 718.8237915039062, - 415.6030578613281 + 710.9323120117188, + 415.1744079589844 ], - "reprojection_error_px": 8.081507229594882, + "reprojection_error_px": 0.1973621703413437, "confidence": 0.4181682027393045 }, { @@ -447,10 +426,10 @@ 351.75 ], "projected_center_px": [ - 625.8273315429688, - 352.120361328125 + 622.6815795898438, + 351.8929748535156 ], - "reprojection_error_px": 3.0995381815233283, + "reprojection_error_px": 0.1585028746230298, "confidence": 0.39668368657567366 }, { @@ -460,10 +439,10 @@ 345.0 ], "projected_center_px": [ - 488.6822509765625, - 346.1673889160156 + 493.6044616699219, + 344.6935729980469 ], - "reprojection_error_px": 5.444377977097716, + "reprojection_error_px": 0.5003479570128894, "confidence": 0.3577321830843512 }, { @@ -473,10 +452,10 @@ 332.5 ], "projected_center_px": [ - 780.4851684570312, - 331.0064392089844 + 761.3597412109375, + 332.74591064453125 ], - "reprojection_error_px": 19.043826957266585, + "reprojection_error_px": 0.28309816849116787, "confidence": 0.3829765144945479 }, { @@ -486,10 +465,10 @@ 202.0 ], "projected_center_px": [ - 187.7160186767578, - 216.61817932128906 + 201.80657958984375, + 201.7980499267578 ], - "reprojection_error_px": 20.092020998118944, + "reprojection_error_px": 0.3671169799822488, "confidence": 0.3382587531306593 }, { @@ -499,10 +478,10 @@ 268.75 ], "projected_center_px": [ - 696.33935546875, - 266.0443420410156 + 682.7110595703125, + 268.74407958984375 ], - "reprojection_error_px": 13.856087725150308, + "reprojection_error_px": 0.03938792099953182, "confidence": 0.3623898971459892 }, { @@ -512,10 +491,10 @@ 262.5 ], "projected_center_px": [ - 638.9053955078125, - 260.8935241699219 + 630.4410400390625, + 262.6352233886719 ], - "reprojection_error_px": 8.803217365786557, + "reprojection_error_px": 0.23405482556210308, "confidence": 0.3590718541167963 }, { @@ -525,10 +504,10 @@ 135.0 ], "projected_center_px": [ - 120.8896255493164, - 152.946533203125 + 132.99139404296875, + 135.03118896484375 ], - "reprojection_error_px": 21.65038621703174, + "reprojection_error_px": 0.03235450547371099, "confidence": 0.29591817114314195 }, { @@ -538,10 +517,10 @@ 157.0 ], "projected_center_px": [ - 285.19287109375, - 163.7302703857422 + 290.9996032714844, + 157.41091918945312 ], - "reprojection_error_px": 8.889279250816829, + "reprojection_error_px": 0.41091938096703146, "confidence": 0.3158166687011719 }, { @@ -551,10 +530,10 @@ 182.75 ], "projected_center_px": [ - 440.36090087890625, - 184.35081481933594 + 442.35198974609375, + 182.89329528808594 ], - "reprojection_error_px": 2.6717696636629444, + "reprojection_error_px": 0.20601110370323347, "confidence": 0.31800273344664126 }, { @@ -564,10 +543,10 @@ 166.0 ], "projected_center_px": [ - 495.548583984375, - 164.9028778076172 + 493.9506530761719, + 165.6742706298828 ], - "reprojection_error_px": 1.8978381020734143, + "reprojection_error_px": 0.329446113117515, "confidence": 0.2969848480224609 }, { @@ -577,10 +556,10 @@ 130.0 ], "projected_center_px": [ - 313.9018249511719, - 134.84718322753906 + 318.87335205078125, + 129.80711364746094 ], - "reprojection_error_px": 6.681197424189883, + "reprojection_error_px": 0.42023433798107046, "confidence": 0.3170967427530611 }, { @@ -590,10 +569,10 @@ 109.0 ], "projected_center_px": [ - 377.1692199707031, - 111.36354064941406 + 379.91064453125, + 109.26207733154297 ], - "reprojection_error_px": 3.4995356779221765, + "reprojection_error_px": 0.30739419826863257, "confidence": 0.3170967427530611 }, { @@ -603,10 +582,10 @@ 44.25 ], "projected_center_px": [ - 367.94329833984375, - 44.739044189453125 + 369.5679016113281, + 44.291873931884766 ], - "reprojection_error_px": 1.631712069567143, + "reprojection_error_px": 0.07977502737351924, "confidence": 0.17828567290874034 }, { @@ -616,10 +595,10 @@ 70.5 ], "projected_center_px": [ - 465.91424560546875, - 67.23489379882812 + 463.03155517578125, + 70.46515655517578 ], - "reprojection_error_px": 4.376499280695126, + "reprojection_error_px": 0.04700845419500585, "confidence": 0.3167426670523156 }, { @@ -629,10 +608,10 @@ 42.0 ], "projected_center_px": [ - 237.88450622558594, - 48.71696472167969 + 242.70608520507812, + 41.73008346557617 ], - "reprojection_error_px": 8.443097276968832, + "reprojection_error_px": 0.39904992448231014, "confidence": 0.15449597168691093 }, { @@ -642,10 +621,10 @@ 29.5 ], "projected_center_px": [ - 295.5177307128906, - 33.14277648925781 + 299.2673034667969, + 29.463695526123047 ], - "reprojection_error_px": 5.215328808636077, + "reprojection_error_px": 0.0402172200266618, "confidence": 0.08171792300897739 } ] diff --git a/data/evaluations/Scene5/robot_state.json b/data/evaluations/Scene5/robot_state.json index fa4e74d..0d90b79 100644 --- a/data/evaluations/Scene5/robot_state.json +++ b/data/evaluations/Scene5/robot_state.json @@ -1,58 +1,58 @@ { "schema_version": "1.0", "method": "deterministic_geometric_sequential_prefix", - "created_utc": "2026-05-31T08:42:59Z", + "created_utc": "2026-06-01T19:02:44Z", "root_pose": { "translation_m": [ - 0.0010717433490066708, - 0.002672965009129998, - -0.0023728043812698517 + 3.509966383380414e-05, + 3.99371701941334e-05, + 3.730886178373444e-05 ], "rotation_matrix": [ [ - 0.9999894046982626, - 0.0043895703201625455, - -0.0013864211549890536 + 0.9999999739678707, + 5.032874209020971e-05, + 0.00022255623089902405 ], [ - -0.004374191049197013, - 0.9999309432865576, - 0.010907571256674815 + -5.03358357270102e-05, + 0.9999999982253688, + 3.1867974001596084e-05 ], [ - 0.0014342049643540089, - -0.01090139121665954, - 0.9999395495357014 + -0.00022255462662902414, + -3.1879175725885257e-05, + 0.9999999747265779 ] ], "euler_xyz_deg": [ - -0.624616721975608, - -0.08217391958540195, - -0.2506237428878726 + -0.001826542268993341, + 0.012751440922217267, + -0.0028840310180632232 ] }, "movements": { "x": { - "value_m": 0.1351925879586392, - "value_mm": 135.1925879586392, + "value_m": 0.17643663775809057, + "value_mm": 176.43663775809057, "joint_type": "linear", "link": "Base" }, "y": { - "value_rad": 1.9173933260573035, - "value_deg": 109.85854524963483, + "value_rad": 1.8458890434692918, + "value_deg": 105.76165164023098, "joint_type": "revolute", "link": "Arm1" }, "z": { - "value_rad": -1.2116399322589189, - "value_deg": -69.42185440795302, + "value_rad": -1.0733099865513207, + "value_deg": -61.49613233863382, "joint_type": "revolute", "link": "Ellbow" }, "a": { - "value_rad": 1.4724732652135906, - "value_deg": 84.36650354258627, + "value_rad": 1.656255078355672, + "value_deg": 94.89642578688947, "joint_type": "revolute", "link": "Arm2" }, @@ -78,217 +78,217 @@ "link_poses": { "Board": { "translation_m": [ - 0.0010717433490066708, - 0.002672965009129998, - -0.0023728043812698517 + 3.509966383380414e-05, + 3.99371701941334e-05, + 3.730886178373444e-05 ], "rotation_matrix": [ [ - 0.9999894046982626, - 0.0043895703201625455, - -0.0013864211549890536 + 0.9999999739678707, + 5.032874209020971e-05, + 0.00022255623089902405 ], [ - -0.004374191049197013, - 0.9999309432865576, - 0.010907571256674815 + -5.03358357270102e-05, + 0.9999999982253688, + 3.1867974001596084e-05 ], [ - 0.0014342049643540089, - -0.01090139121665954, - 0.9999395495357014 + -0.00022255462662902414, + -3.1879175725885257e-05, + 0.9999999747265779 ] ] }, "Base": { "translation_m": [ - 0.13624071616276878, - 0.0022561279410709275, - 0.013820122292095324 + 0.17647529372842094, + 3.156597216375056e-05, + 0.015998041667369088 ], "rotation_matrix": [ [ - 0.9999894046982626, - 0.0043895703201625455, - -0.0013864211549890536 + 0.9999999739678707, + 5.032874209020971e-05, + 0.00022255623089902405 ], [ - -0.004374191049197013, - 0.9999309432865576, - 0.010907571256674815 + -5.03358357270102e-05, + 0.9999999982253688, + 3.1867974001596084e-05 ], [ - 0.0014342049643540089, - -0.01090139121665954, - 0.9999395495357014 + -0.00022255462662902414, + -3.1879175725885257e-05, + 0.9999999747265779 ] ] }, "Arm1": { "translation_m": [ - 0.24665123532218072, - 0.11025834950715785, - 0.057797814315881595 + 0.2864907413994229, + 0.10802746289740368, + 0.0609701165701575 ], "rotation_matrix": [ [ - 0.9999894046955833, - -0.00018715682552636407, - 0.0045995068797942355 + 0.9999999739653274, + -0.00022785922697761207, + -1.2017939650005888e-05 ], [ - -0.004374191049185293, - -0.34993462692929655, - 0.9367639101325101 + -5.033583572688218e-05, + -0.2716668379091556, + 0.962391358359422 ], [ - 0.0014342049643501662, - -0.93677410395805, - -0.3499317379260469 + -0.0002225546266284581, + -0.9623913327013919, + -0.2716668423065737 ] ] }, "Ellbow": { "translation_m": [ - 0.24669802452856232, - 0.197742006239482, - 0.2919913403053941 + 0.28654770620616726, + 0.17594417237469256, + 0.3015679497455055 ], "rotation_matrix": [ [ - 0.9999894046942863, - 0.004240246492696194, - 0.001791870780987314 + 0.9999999739642819, + -0.00011929972724444389, + 0.00019450407006432283 ], [ - -0.00437419104917962, - 0.7539958184730403, - 0.6568646528580395 + -5.0335835726829556e-05, + 0.7160906669727896, + 0.6980072736994751 ], [ - 0.0014342049643483062, - -0.6568655311639735, - 0.7540063773080897 + -0.00022255462662822543, + -0.6980072653193837, + 0.7160906423263725 ] ] }, "Arm2": { "translation_m": [ - 0.33669707095104806, - 0.1973483290450558, - 0.2921204187521854 + 0.3765477038629526, + 0.17593964214947716, + 0.30154791982910895 ], "rotation_matrix": [ [ - 0.09994689262912566, - 0.004240246492688546, - -0.9949837380347131 + -0.08516097269761469, + -0.00011929972724418493, + -0.9963671986208741 ], [ - 0.6532627240263507, - 0.7539958184716804, - 0.06883399682180992 + 0.6954642782113203, + 0.7160906669712351, + -0.059528097585177304 ], [ - 0.7505054510434342, - -0.6568655311627888, - 0.07258954413766776 + 0.7134963534985967, + -0.6980072653178686, + -0.0609000090406069 ] ] }, "Hand": { "translation_m": [ - 0.33563700932787593, - 0.008849374427135709, - 0.4563368015428826 + 0.37657752879476364, + -0.0030830245933316236, + 0.4760497361585761 ], "rotation_matrix": [ [ - 0.09994689262912566, - 0.004240246492688546, - -0.9949837380347131 + -0.08516097269761469, + -0.00011929972724418493, + -0.9963671986208741 ], [ - 0.6532627240263507, - 0.7539958184716804, - 0.06883399682180992 + 0.6954642782113203, + 0.7160906669712351, + -0.059528097585177304 ], [ - 0.7505054510434342, - -0.6568655311627888, - 0.07258954413766776 + 0.7134963534985967, + -0.6980072653178686, + -0.0609000090406069 ] ] }, "Palm": { "translation_m": [ - 0.33563700932787593, - 0.008849374427135709, - 0.4563368015428826 + 0.37657752879476364, + -0.0030830245933316236, + 0.4760497361585761 ], "rotation_matrix": [ [ - 0.09994689262912566, - 0.004240246492688546, - -0.9949837380347131 + -0.08516097269761469, + -0.00011929972724418493, + -0.9963671986208741 ], [ - 0.6532627240263507, - 0.7539958184716804, - 0.06883399682180992 + 0.6954642782113203, + 0.7160906669712351, + -0.059528097585177304 ], [ - 0.7505054510434342, - -0.6568655311627888, - 0.07258954413766776 + 0.7134963534985967, + -0.6980072653178686, + -0.0609000090406069 ] ] }, "FingerA": { "translation_m": [ - 0.33588838827114836, - -0.014927428323267704, - 0.48232911693775393 + 0.37624106039442673, + -0.025364340824479574, + 0.5033339758586959 ], "rotation_matrix": [ [ - 0.09994689262912566, - 0.004240246492688546, - -0.9949837380347131 + -0.08516097269761469, + -0.00011929972724418493, + -0.9963671986208741 ], [ - 0.6532627240263507, - 0.7539958184716804, - 0.06883399682180992 + 0.6954642782113203, + 0.7160906669712351, + -0.059528097585177304 ], [ - 0.7505054510434342, - -0.6568655311627888, - 0.07258954413766776 + 0.7134963534985967, + -0.6980072653178686, + -0.0609000090406069 ] ] }, "FingerB": { "translation_m": [ - 0.33508881313011535, - -0.02015353011547851, - 0.47632507332940643 + 0.37692234817600767, + -0.03092805505017014, + 0.4976260050307071 ], "rotation_matrix": [ [ - 0.09994689262912566, - 0.004240246492688546, - -0.9949837380347131 + -0.08516097269761469, + -0.00011929972724418493, + -0.9963671986208741 ], [ - 0.6532627240263507, - 0.7539958184716804, - 0.06883399682180992 + 0.6954642782113203, + 0.7160906669712351, + -0.059528097585177304 ], [ - 0.7505054510434342, - -0.6568655311627888, - 0.07258954413766776 + 0.7134963534985967, + -0.6980072653178686, + -0.0609000090406069 ] ] } @@ -311,24 +311,24 @@ "joint_variable": "x", "joint_type": "linear", "old": 0.0, - "new": 0.12522792773936703, + "new": 0.1798550866196677, "info": { "reason": "weighted_projection", "used_markers": 2, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.13756104549696957, + "q_i": 0.17978712219210513, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176449, + "q_i": 0.1799230510472303, "weight": 1.0 } ] @@ -339,21 +339,21 @@ "joint_variable": "y", "joint_type": "revolute", "old": 0.0, - "new": 1.868759813799059, + "new": 1.641248000650461, "info": { "reason": "2d_alignment+normal_tiebreak", "used_markers": 2, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.2728328397907345, - "theta_alt_rad": 1.868759813799059, - "score_theta": 0.8426367967209734, - "score_theta_alt": 0.17448908416837544, - "best_score": 0.17448908416837544, + "theta_rad": -1.5003446529393318, + "theta_alt_rad": 1.641248000650461, + "score_theta": 0.6229699085533049, + "score_theta_alt": 0.056392410616870975, + "best_score": 0.056392410616870975, "per_marker": [ { "marker_id": 242, @@ -375,25 +375,25 @@ "link": "Base", "joint_variable": "x", "joint_type": "linear", - "old": 0.12522792773936703, - "new": 0.12522792773936703, + "old": 0.1798550866196677, + "new": 0.1798550866196676, "info": { "reason": "weighted_projection", "used_markers": 2, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.13756104549696957, + "q_i": 0.17978712219210502, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176446, + "q_i": 0.1799230510472302, "weight": 1.0 } ] @@ -403,22 +403,22 @@ "link": "Arm1", "joint_variable": "y", "joint_type": "revolute", - "old": 1.868759813799059, - "new": 1.868759813799059, + "old": 1.641248000650461, + "new": 1.641248000650461, "info": { "reason": "2d_alignment+normal_tiebreak", "used_markers": 2, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.2728328397907345, - "theta_alt_rad": 1.868759813799059, - "score_theta": 0.8426367967209734, - "score_theta_alt": 0.17448908416837544, - "best_score": 0.17448908416837544, + "theta_rad": -1.5003446529393318, + "theta_alt_rad": 1.641248000650461, + "score_theta": 0.6229699085533049, + "score_theta_alt": 0.056392410616870975, + "best_score": 0.056392410616870975, "per_marker": [ { "marker_id": 242, @@ -486,930 +486,930 @@ }, "marker_stats": { "num_markers_used": 46, - "mean_error_m": 0.01865909987290219, - "rms_error_m": 0.05004373345083631, - "median_error_m": 0.006973658433458528, - "worst_error_m": 0.2575444239885687 + "mean_error_m": 0.0019494110853473313, + "rms_error_m": 0.007908622811100375, + "median_error_m": 0.00027148753471114943, + "worst_error_m": 0.03982517803847654 }, "marker_reports": [ { "marker_id": 46, "link": "Board", "error_m": [ - -0.012478505921281857, - -0.010855570675412096, - 0.015431805042300826 + -6.940884010531168e-05, + 0.00013607725429981565, + 6.0563275850050724e-05 ], - "error_norm_m": 0.022620723498153514, + "error_norm_m": 0.00016432442485592565, "predicted_m": [ - 0.5386279079623134, - 0.18545471035886749, - -0.030922955924393408 + 0.5367483428689593, + 0.1854520510990232, + -0.027388049416256513 ], "observed_m": [ - 0.5511064138835953, - 0.19631028103427958, - -0.04635476096669423 + 0.5368177517090647, + 0.1853159738447234, + -0.027448612692106564 ] }, { "marker_id": 47, "link": "Board", "error_m": [ - 0.0012894100573633827, - 0.0035370275060585543, - 0.0031619288386499876 + -0.00013697226551262487, + 0.00020230898875445158, + -0.000147923646617424 ], - "error_norm_m": 0.004916394599229307, + "error_norm_m": 0.0002856076568985964, "predicted_m": [ - 0.3440781579462815, - -0.28565075196037254, - -0.026053773069493295 + 0.3442445937199319, + -0.2865182594217256, + -0.027330165768363855 ], "observed_m": [ - 0.3427887478889181, - -0.2891877794664311, - -0.029215701908143283 + 0.3443815659854445, + -0.28672056841048005, + -0.02718224212174643 ] }, { "marker_id": 51, "link": "Board", "error_m": [ - 0.0006393804310136086, - -0.002216989008116732, - 0.007263083653009289 + 0.0001862196521308368, + -9.067416213653923e-05, + 0.00010579994865413458 ], - "error_norm_m": 0.0076207763218903305, + "error_norm_m": 0.0002325794308491419, "predicted_m": [ - 0.1681524574942128, - -0.17042691766498333, - -0.027554583090013123 + 0.16782035894060007, + -0.1720493788733526, + -0.02729454934604128 ], "observed_m": [ - 0.16751307706319918, - -0.1682099286568666, - -0.03481766674302241 + 0.16763413928846924, + -0.17195870471121605, + -0.027400349294695415 ] }, { "marker_id": 52, "link": "Board", "error_m": [ - 0.004666151510545544, - 0.005181477505273063, - -0.00629168062763949 + -0.00023726174153268498, + 0.00036031761699248377, + -0.0004126150008007222 ], - "error_norm_m": 0.009391800901703105, + "error_norm_m": 0.0005969698970601825, "predicted_m": [ - 0.0967045172263745, - 0.21060663053145795, - -0.03181004784883765 + 0.09471952300933281, + 0.20869430100728273, + -0.027290413829108042 ], "observed_m": [ - 0.09203836571582896, - 0.2054251530261849, - -0.025518367221198157 + 0.0949567847508655, + 0.20833398339029024, + -0.02687779882830732 ] }, { "marker_id": 53, "link": "Board", "error_m": [ - -3.317190337703835e-05, - -0.0015594683105253082, - -0.0018456195432597217 + 2.2149115954217535e-05, + 0.00015507791547791916, + 6.330867188906325e-06 ], - "error_norm_m": 0.0024164753847636306, + "error_norm_m": 0.00015677953656613986, "predicted_m": [ - 0.4882860830858194, - 0.21247358131928973, - -0.03128748319150119 + 0.48628969299282865, + 0.2122545909977339, + -0.027377673671706265 ], "observed_m": [ - 0.4883192549891964, - 0.21403304962981504, - -0.029441863648241466 + 0.48626754387687443, + 0.21209951308225597, + -0.02738400453889517 ] }, { "marker_id": 54, "link": "Board", "error_m": [ - 0.0026534508624109776, - -0.001974613316610141, - -0.01751634125579668 + -8.733483979123102e-05, + 8.632832888988418e-06, + -0.00021030112527834627 ], - "error_norm_m": 0.017825883153967114, + "error_norm_m": 0.00022787817652945155, "predicted_m": [ - 0.34192481814046966, - -0.32968913659768895, - -0.025576377828129576 + 0.3422823767898657, + -0.3305681606853151, + -0.02732832528360494 ], "observed_m": [ - 0.3392713672780587, - -0.3277145232810788, - -0.008060036572332898 + 0.34236971162965696, + -0.33057679351820407, + -0.027118024158326592 ] }, { "marker_id": 55, "link": "Board", "error_m": [ - 0.00018433889811364512, - 0.0009926811546970282, - 0.001181428741732115 + -2.2999180413041387e-05, + 0.00014003997662043188, + -8.108547781068148e-05 ], - "error_norm_m": 0.0015540819077639076, + "error_norm_m": 0.00016344727609632792, "predicted_m": [ - 0.2836739731728607, - -0.2614277242588397, - -0.02640175414543752 + 0.28373580117179653, + -0.2625552136428259, + -0.027317462812956925 ], "observed_m": [ - 0.28348963427474705, - -0.26242040541353673, - -0.027583182887169634 + 0.2837588003522096, + -0.26269525361944635, + -0.027236377335146243 ] }, { "marker_id": 56, "link": "Board", "error_m": [ - -0.011824545626797911, - -0.013006697593242023, - 0.019629017070593897 + 2.191274963525558e-05, + -9.199260231848583e-05, + 4.1904291834076596e-05 ], - "error_norm_m": 0.026349428318655038, + "error_norm_m": 0.00010343489330018152, "predicted_m": [ - 0.5005246978073693, - 0.16885221892555288, - -0.03079468240848441 + 0.49871749984595637, + 0.16868396540061648, + -0.02737905105002889 ], "observed_m": [ - 0.5123492434341672, - 0.1818589165187949, - -0.05042369947907831 + 0.4986955870963211, + 0.16877595800293496, + -0.027420955341862965 ] }, { "marker_id": 58, "link": "Board", "error_m": [ - 0.00034420454425852787, - -0.0020669933721501332, - 0.009394976053304773 + 8.141076965966637e-05, + -6.357932080286455e-05, + 6.209061089882881e-05 ], - "error_norm_m": 0.009625825336612489, + "error_norm_m": 0.00012052090031244613, "predicted_m": [ - 0.050241652745343195, - -0.2159388529560626, - -0.027221612318664396 + 0.05010804537284361, + -0.21807345376044288, + -0.027266885042482116 ], "observed_m": [ - 0.04989744820108467, - -0.21387185958391247, - -0.03661658837196917 + 0.05002663460318394, + -0.21800987443964, + -0.027328975653380945 ] }, { "marker_id": 61, "link": "Board", "error_m": [ - -0.007660831442683407, - -0.022627013404865726, - 0.022663898296534882 + 8.542837521268928e-05, + -0.00043567400799732203, + 0.0003083482780012886 ], - "error_norm_m": 0.03292905039646386, + "error_norm_m": 0.0005405446411558351, "predicted_m": [ - -0.01983602040617699, - 0.33828006636107044, - -0.033364323171186094 + -0.022374073636173244, + 0.3358701951079665, + -0.02726840675710684 ], "observed_m": [ - -0.012175188963493584, - 0.36090707976593617, - -0.056028221467720976 + -0.022459502011385933, + 0.33630586911596383, + -0.02757675503510813 ] }, { "marker_id": 62, "link": "Board", "error_m": [ - 0.0009537340103471514, - 0.00650041553030517, - 0.0015267612871886875 + 4.5407920364837207e-05, + 4.895657102457762e-05, + 5.931060585763481e-05 ], - "error_norm_m": 0.006745073065370275, + "error_norm_m": 8.931054274576779e-05, "predicted_m": [ - 0.4050366909648643, - -0.1744829549732635, - -0.02718189773248335 + 0.4047202007807875, + -0.1750813034274769, + -0.027347176261979005 ], "observed_m": [ - 0.4040829569545171, - -0.18098337050356866, - -0.028708659019672036 + 0.4046747928604227, + -0.1751302599985015, + -0.02740648686783664 ] }, { "marker_id": 63, "link": "Board", "error_m": [ - -0.019032396821023534, - 0.007925666720220437, - 0.026434405409499418 + 3.6704777281126866e-05, + 7.941394034063909e-05, + 0.0002109390199994711 ], - "error_norm_m": 0.033523515792152354, + "error_norm_m": 0.00022836174100321834, "predicted_m": [ - 0.7774647588278608, - -0.23715900006494356, - -0.025981839608491545 + 0.7774171185089083, + -0.23615006348511114, + -0.027428176147645575 ], "observed_m": [ - 0.7964971556488843, - -0.245084666785164, - -0.05241624501799096 + 0.7773804137316271, + -0.23622947742545178, + -0.027639115167645046 ] }, { "marker_id": 64, "link": "Board", "error_m": [ - 0.0009286987403320582, - 0.00046365609303483657, - 0.0010329538980963227 + 5.157993376796177e-06, + -0.0001716649447987273, + -7.291639587968246e-05 ], - "error_norm_m": 0.0014643947823230828, + "error_norm_m": 0.00018658043562096141, "predicted_m": [ - -0.02098643081275837, - -0.18574877409738952, - -0.027649690754474484 + -0.02125044894668999, + -0.18818986184823136, + -0.027251956094096558 ], "observed_m": [ - -0.02191512955309043, - -0.18621243019042436, - -0.028682644652570807 + -0.021255606940066785, + -0.18801819690343263, + -0.027179039698216875 ] }, { "marker_id": 66, "link": "Board", "error_m": [ - -0.001968755420576007, - -0.0032339758744434066, - -0.002580283829774429 + -0.00011202599842652372, + 0.00018688635795727215, + -2.279822345346849e-05 ], - "error_norm_m": 0.004581753212987884, + "error_norm_m": 0.00021908010887944034, "predicted_m": [ - 0.2092629466546058, - -0.3617472147887227, - -0.025410617260694005 + 0.20976073750950172, + -0.3632014901224406, + -0.027297791808188365 ], "observed_m": [ - 0.2112317020751818, - -0.3585132389142793, - -0.022830333430919576 + 0.20987276350792824, + -0.36338837648039785, + -0.027274993584734897 ] }, { "marker_id": 68, "link": "Board", "error_m": [ - 0.005577012100406398, - -0.0016224593388955988, - -0.00978981248809814 + 2.4393455366644723e-05, + 0.00016909732600073335, + -4.854754762518426e-05 ], - "error_norm_m": 0.01138313958565787, + "error_norm_m": 0.0001776114036478016, "predicted_m": [ - 0.5755825500835047, - 0.17049379984558516, - -0.03070852106660646 + 0.573767597039867, + 0.17065018769264914, + -0.027395816576733574 ], "observed_m": [ - 0.5700055379830983, - 0.17211625918448076, - -0.02091870857850832 + 0.5737432035845004, + 0.1704810903666484, + -0.02734726902910839 ] }, { "marker_id": 69, "link": "Board", "error_m": [ - -0.009125173416002153, - -0.00021957594710153572, - -0.01199125386000344 + 6.912932255235919e-05, + -6.206971020650265e-05, + 0.00020648215640911571 ], - "error_norm_m": 0.01507007540139416, + "error_norm_m": 0.00022642083180888164, "predicted_m": [ - 0.007485120946558742, - -0.27884867984167444, - -0.026594659559778938 + 0.00762487073506257, + -0.28117131538216195, + -0.02725541934595461 ], "observed_m": [ - 0.016610294362560896, - -0.2786291038945729, - -0.014603405699775498 + 0.00755574141251021, + -0.28110924567195544, + -0.027461901502363727 ] }, { "marker_id": 72, "link": "Board", "error_m": [ - 0.001277341753475325, - -0.005948681266275818, - 0.002255876470510218 + 0.0004142921738053973, + 0.00035997634678844315, + -0.0004249132479705875 ], - "error_norm_m": 0.006489020682130234, + "error_norm_m": 0.0006940981514342688, "predicted_m": [ - 0.4429479015290387, - 0.19475279470248125, - -0.031157042377585306 + 0.4410287922799845, + 0.19433686922946028, + -0.02736702957447603 ], "observed_m": [ - 0.44167055977556335, - 0.20070147596875706, - -0.033412918848095524 + 0.4406145001061791, + 0.19397689288267184, + -0.026942116326505443 ] }, { "marker_id": 73, "link": "Board", "error_m": [ - 0.0030499756453227778, - 0.0012135178153790949, - -0.006410720618745952 + 1.2637196091569436e-05, + 0.00013394327410032325, + -0.00022530555666035526 ], - "error_norm_m": 0.007202243801546781, + "error_norm_m": 0.00026241778381772007, "predicted_m": [ - 0.22429945311963298, - 0.33449229545066955, - -0.03298451024502975 + 0.2217757831139039, + 0.33313790561850076, + -0.027322656757840347 ], "observed_m": [ - 0.2212494774743102, - 0.33327877763529046, - -0.026573789626283796 + 0.22176314591781232, + 0.33300396234440044, + -0.02709735120117999 ] }, { "marker_id": 74, "link": "Board", "error_m": [ - 0.0039247497668962045, - 0.002192416594049007, - -0.0007291866926943599 + -3.9146421010188837e-05, + 4.586103983236778e-05, + -0.00010551528520611614 ], - "error_norm_m": 0.00455434567061129, + "error_norm_m": 0.00012152840270710798, "predicted_m": [ - 0.09552289193040443, - 0.14645499798213665, - -0.031111905372844688 + 0.09381629394066922, + 0.1445343464233952, + -0.027288168162029502 ], "observed_m": [ - 0.09159814216350823, - 0.14426258138808765, - -0.030382718680150328 + 0.09385544036167941, + 0.14448848538356282, + -0.027182652876823386 ] }, { "marker_id": 75, "link": "Board", "error_m": [ - 0.003855910591340845, - -0.0011095512661584983, - 0.002120275838652326 + 0.00010281631501389901, + 0.00017859617242993453, + 3.8758262874045296e-05 ], - "error_norm_m": 0.00453814060300265, + "error_norm_m": 0.00020969022480953617, "predicted_m": [ - -0.02373601246131025, - 0.19705416796848552, - -0.03182920585411601 + -0.025661182485608103, + 0.1946203604601743, + -0.02726317384436022 ], "observed_m": [ - -0.027591923052651096, - 0.19816371923464401, - -0.03394948169276834 + -0.025763998800622002, + 0.19444176428774437, + -0.027301932107234264 ] }, { "marker_id": 77, "link": "Board", "error_m": [ - 0.004508874901278628, - -0.005823130739014276, - 0.010268814529689911 + 5.945643794059985e-05, + 0.00016824192554207307, + -0.00020451492108272337 ], - "error_norm_m": 0.012636746271260017, + "error_norm_m": 0.0002714162236642486, "predicted_m": [ - 0.02014030990423281, - 0.19385239258404371, - -0.031733445410668366 + 0.018228664882328053, + 0.1916081512256859, + -0.027272845810604032 ], "observed_m": [ - 0.01563143500295418, - 0.199675523323058, - -0.04200225994035828 + 0.018169208444387453, + 0.19143990930014382, + -0.02706833088952131 ] }, { "marker_id": 79, "link": "Board", "error_m": [ - 0.0014635800360718876, - 0.0027178884442404794, - 0.0008967106274701299 + -0.0003535975388652135, + -0.0003690267557460991, + -1.5750856311263356e-05 ], - "error_norm_m": 0.0032145099263716694, + "error_norm_m": 0.0005113316491501043, "predicted_m": [ - 0.31270785920016425, - -0.15808988393716567, - -0.027488731516744042 + 0.31232100794274237, + -0.1590866524246321, + -0.02732712196249834 ], "observed_m": [ - 0.31124427916409236, - -0.16080777238140614, - -0.028385442144214172 + 0.3126746054816076, + -0.158717625668886, + -0.027311371106187077 ] }, { "marker_id": 81, "link": "Board", "error_m": [ - 0.003281170450211618, - 0.003838011021844695, - -0.006194709628771014 + 0.00013539796217862388, + -8.149109815261402e-05, + 0.00018254475267341988 ], - "error_norm_m": 0.007991923142268799, + "error_norm_m": 0.00024144563356756543, "predicted_m": [ - 0.13399016165458333, - 0.17081551005230874, - -0.031324300396956724 + 0.1321775275061202, + 0.16906241549720502, + -0.027297487353687547 ], "observed_m": [ - 0.1307089912043717, - 0.16697749903046405, - -0.02512959076818571 + 0.13204212954394157, + 0.16914390659535763, + -0.027480032106360967 ] }, { "marker_id": 82, "link": "Board", "error_m": [ - 0.0047900391613853455, - 0.0010389973728097135, - -0.005681546707435224 + -5.415094073515925e-05, + -0.00019778252975627408, + 0.00040883282032982277 ], - "error_norm_m": 0.007503596717380189, + "error_norm_m": 0.00045737788363467175, "predicted_m": [ - 0.2215720264621742, - 0.2986360141859772, - -0.03259716324884656 + 0.21920397788882767, + 0.29726803504525456, + -0.02732094128641662 ], "observed_m": [ - 0.21678198730078885, - 0.29759701681316747, - -0.026915616541411336 + 0.21925812882956283, + 0.29746581757501084, + -0.027729774106746444 ] }, { "marker_id": 83, "link": "Board", "error_m": [ - 0.004424510203184524, - 0.003119044288465822, - -0.008265723830355537 + -7.235981519165824e-06, + -0.00011949652591858317, + 0.00014255053952747995 ], - "error_norm_m": 0.009880633494427502, + "error_norm_m": 0.0001861516463927514, "predicted_m": [ - 0.046758154802018684, - 0.3413785986187563, - -0.03330578952088388 + 0.044206095245043264, + 0.3392568437420078, + -0.02728333251455351 ], "observed_m": [ - 0.04233364459883416, - 0.3382595543302905, - -0.025040065690528343 + 0.04421333122656243, + 0.3393763402679264, + -0.02742588305408099 ] }, { "marker_id": 84, "link": "Board", "error_m": [ - 0.0031252656910716325, - -0.0049313796280109345, - -0.0005075227770663035 + 0.00010561019811033967, + 6.554271453151905e-05, + -6.939417906787551e-05 ], - "error_norm_m": 0.005860321667331223, + "error_norm_m": 0.0001423548856259235, "predicted_m": [ - 0.40972962792916934, - 0.2589949035672977, - -0.03190386742087904 + 0.40753201922442883, + 0.2584385553662033, + -0.027361617449647983 ], "observed_m": [ - 0.4066043622380977, - 0.26392628319530864, - -0.03139634464381274 + 0.4074264090263185, + 0.2583730126516718, + -0.027292223270580108 ] }, { "marker_id": 85, "link": "Board", "error_m": [ - -0.0008523340649130295, - 0.0022081562529003285, - 0.0033066461503104827 + 0.0001829567481470562, + -0.00014475142311420885, + 0.00013898942594064642 ], - "error_norm_m": 0.004066489414568434, + "error_norm_m": 0.0002715588457580502, "predicted_m": [ - 0.5043114083515564, - -0.312560343518652, - -0.025538072839670484 + 0.5045932704293496, + -0.31273633072647133, + -0.027365016849548045 ], "observed_m": [ - 0.5051637424164694, - -0.3147684997715523, - -0.028844718989980967 + 0.5044103136812026, + -0.3125915793033571, + -0.027504006275488692 ] }, { "marker_id": 86, "link": "Board", "error_m": [ - 0.004719072619259745, - -0.0026964618772751803, - -0.0023372780131934133 + -0.0003553165299956529, + 0.00042361775325344686, + -0.0003659103276084791 ], - "error_norm_m": 0.0059163689499897466, + "error_norm_m": 0.0006630174999275617, "predicted_m": [ - 0.36527754614668106, - 0.29277767287308737, - -0.03233401069325683 + 0.3629337109279086, + 0.29203080028486683, + -0.027352762334812965 ], "observed_m": [ - 0.3605584735274213, - 0.29547413475036255, - -0.029996732680063417 + 0.36328902745790426, + 0.2916071825316134, + -0.026986852007204486 ] }, { "marker_id": 92, "link": "Board", "error_m": [ - -0.0024844326991102506, - 0.002232685648766719, - 0.00020813282433403135 + -0.0003063712452819889, + 0.00025284694788885176, + -0.0001769888547842914 ], - "error_norm_m": 0.0033467312881649714, + "error_norm_m": 0.00043487926337111007, "predicted_m": [ - 0.6453813895453614, - -0.18527379414719106, - -0.026730949650652026 + 0.645109704320976, + -0.18483340364174242, + -0.027400365665502784 ], "observed_m": [ - 0.6478658222444716, - -0.18750647979595778, - -0.026939082474986057 + 0.645416075566258, + -0.18508625058963127, + -0.027223376810718493 ] }, { "marker_id": 95, "link": "Board", "error_m": [ - -0.000896068147079293, - -0.002909389033114884, - -0.000824667693506486 + 0.00018881189493683004, + 0.00019160803643775148, + -7.704586943438341e-05 ], - "error_norm_m": 0.003153975186163104, + "error_norm_m": 0.00027982072348928575, "predicted_m": [ - 0.1859445719589557, - -0.2724896598155167, - -0.026416590301276202 + 0.18605522543736824, + -0.27404029681800157, + -0.027295357385298712 ], "observed_m": [ - 0.186840640106035, - -0.2695802707824018, - -0.025591922607769716 + 0.1858664135424314, + -0.2742319048544393, + -0.02721831151586433 ] }, { "marker_id": 96, "link": "Board", "error_m": [ - 0.001800159336106999, - 0.0034001926017188933, - 0.0019684926806817077 + 0.0003500080736829059, + -0.00011060413867314267, + -5.8197357783524445e-05 ], - "error_norm_m": 0.004321671759638224, + "error_norm_m": 0.00037165287512385775, "predicted_m": [ - 0.37005706385280734, - -0.18571937792394896, - -0.02710782766593048 + 0.3697896284457174, + -0.18646954517652192, + -0.027339039325059333 ], "observed_m": [ - 0.36825690451670035, - -0.18911957052566786, - -0.029076320346612186 + 0.3694396203720345, + -0.18635894103784878, + -0.027280841967275808 ] }, { "marker_id": 97, "link": "Board", "error_m": [ - -0.0017300615151869536, - -0.004204917755138593, - 0.003684240889677899 + 0.0002026478605312021, + 0.00012255060958155095, + -0.00021837867758689108 ], - "error_norm_m": 0.005852185669216703, + "error_norm_m": 0.0003221398052263685, "predicted_m": [ - 0.30387757120940123, - -0.3586012591038765, - -0.02531375042379742 + 0.30436091421718414, + -0.3596462518988181, + -0.027318958965733053 ], "observed_m": [ - 0.3056076327245882, - -0.35439634134873793, - -0.02899799131347532 + 0.30415826635665294, + -0.35976880250839965, + -0.027100580288146162 ] }, { "marker_id": 102, "link": "Board", "error_m": [ - -0.004121672035329538, - 0.0015857378449768145, - 0.0062854046689448766 + -0.00014814168053312038, + -0.00019855261424012172, + 0.00039011536098369076 ], - "error_norm_m": 0.007681735268297346, + "error_norm_m": 0.0004621245427459994, "predicted_m": [ - 0.649813834803556, - -0.2234512802218324, - -0.026308355218988267 + 0.64970778365643, + -0.22299363511886683, + -0.02740017290743958 ], "observed_m": [ - 0.6539355068388856, - -0.2250370180668092, - -0.032593759887933144 + 0.6498559253369631, + -0.2227950825046267, + -0.02779028826842327 ] }, { "marker_id": 103, "link": "Board", "error_m": [ - -0.0012035043095391662, - 0.0025960622698794067, - -5.100801903175703e-05 + -0.00025452271371115276, + 1.7149589082499084e-05, + 0.00025028408677256475 ], - "error_norm_m": 0.0028619160976828635, + "error_norm_m": 0.00035737661408123043, "predicted_m": [ - 0.10599450637239351, - -0.1857842447863076, - -0.02747324413153348 + 0.10572957391869611, + -0.1876762534935748, + -0.027280232657757288 ], "observed_m": [ - 0.10719801068193267, - -0.188380307056187, - -0.027422236112501722 + 0.10598409663240727, + -0.1876934030826573, + -0.027530516744529852 ] }, { "marker_id": 105, "link": "Board", "error_m": [ - -0.0018827308133309018, - 0.0026779310685563495, - 0.002216807530138129 + 0.00016192678684168182, + 0.0002159004590787661, + -0.00026817234655795996 ], - "error_norm_m": 0.003953508030734489, + "error_norm_m": 0.00038045985331660947, "predicted_m": [ - 0.5247753087106309, - -0.2661521757664837, - -0.02601593053866734 + 0.5248556101884461, + -0.2662373506130235, + -0.027371008187954803 ], "observed_m": [ - 0.5266580395239618, - -0.26883010683504005, - -0.02823273806880547 + 0.5246936834016044, + -0.26645325107210227, + -0.027102835841396843 ] }, { "marker_id": 205, "link": "Board", "error_m": [ - 0.0018409217778909692, - 0.003616551038592347, - -0.01165031768467827 + -5.4261058908045e-05, + -5.994991647745307e-06, + -0.00021311120901503319 ], - "error_norm_m": 0.012336868993427137, + "error_norm_m": 0.00021999224951467727, "predicted_m": [ - 0.7506683196175424, - -0.09059819090218094, - -1.604358364427601e-05 + 0.7500306173198179, + -0.08999780498649211, + 0.00017326201004526934 ], "observed_m": [ - 0.7488273978396515, - -0.09421474194077328, - 0.011634274101033994 + 0.750084878378726, + -0.08999180999484437, + 0.0003863732190603025 ] }, { "marker_id": 206, "link": "Board", "error_m": [ - 0.003984668110273981, - 0.0036049730853108617, - -0.008478559597256689 + 4.8733105621590056e-05, + -0.000346425969343863, + 6.245750766234852e-05 ], - "error_norm_m": 0.010037897376397292, + "error_norm_m": 0.000355368552467368, "predicted_m": [ - 0.6510205447733293, - -0.010166296334336635, - -0.00103157537741244 + 0.6500346462223981, + -0.009992771544889912, + 0.00019296713865010095 ], "observed_m": [ - 0.6470358766630553, - -0.013771269419647496, - 0.007446984219844249 + 0.6499859131167766, + -0.009646345575546049, + 0.00013050963098775242 ] }, { "marker_id": 207, "link": "Board", "error_m": [ - 0.004130120219313804, - 0.0036433613488552428, - -0.013723457012830675 + -0.0006786351101717436, + -0.00046269102430987474, + 0.0005487680821694244 ], - "error_norm_m": 0.014787334016898666, + "error_norm_m": 0.0009878132438586981, "predicted_m": [ - 0.7510194852431554, - -0.010603715439256336, - -0.0008881548809770391 + 0.7500346436191851, + -0.009997805128462612, + 0.0001707116759871985 ], "observed_m": [ - 0.7468893650238416, - -0.014247076788111579, - 0.012835302131853635 + 0.7507132787293569, + -0.009535114104152738, + -0.0003780564061822259 ] }, { "marker_id": 208, "link": "Board", "error_m": [ - 0.0011444716795504517, - 0.004545724821286026, - -0.003010349767345397 + 3.578432393419595e-05, + 6.858149437825867e-05, + -4.216329862436521e-05 ], - "error_norm_m": 0.005570963587917748, + "error_norm_m": 8.810041408228449e-05, "predicted_m": [ - 0.3506725577382375, - -0.08884851448250214, - -0.0005897255693858795 + 0.35003062773266974, + -0.0899776706522013, + 0.000262283860696879 ], "observed_m": [ - 0.34952808605868707, - -0.09339423930378817, - 0.0024206241979595174 + 0.34999484340873555, + -0.09004625214657956, + 0.0003044471593212442 ] }, { "marker_id": 210, "link": "Board", "error_m": [ - 0.0025927718633455346, - 0.0007896133372580043, - -0.0033657371257313244 + -0.00016294155071762406, + -0.00028882604521902194, + 0.00042781753114565593 ], - "error_norm_m": 0.00432135876284973, + "error_norm_m": 0.0005412931491370354, "predicted_m": [ - 0.020983324110222176, - -0.01740986540620809, - -0.0018261105927888704 + 0.020034159335218682, + -0.019961059950635584, + 0.00033349534518364496 ], "observed_m": [ - 0.01839055224687664, - -0.018199478743466096, - 0.0015396265329424537 + 0.020197100885936306, + -0.019672233905416562, + -9.432218596201098e-05 ] }, { "marker_id": 211, "link": "Board", "error_m": [ - 0.0007327014709433421, - 0.004726209041216442, - -0.007145936188904495 + 0.00032815605053518326, + -0.00023886690394715054, + 0.00012606118144269305 ], - "error_norm_m": 0.008598738707664833, + "error_norm_m": 0.0004250120148547269, "predicted_m": [ - 0.2510247828940242, - -0.008416619914657829, - -0.0016052573631540434 + 0.2500346566352498, + -0.009972637210599107, + 0.0002819889893017106 ], "observed_m": [ - 0.25029208142308085, - -0.01314282895587427, - 0.005540678825750451 + 0.24970650058471464, + -0.009733770306651957, + 0.00015592780785901754 ] }, { "marker_id": 214, "link": "Board", "error_m": [ - 0.0006422741367612117, - 0.004579506963093727, - -0.006243176318695863 + 0.0003750371854425172, + 0.00012105786845340027, + -0.00028565269282148677 ], - "error_norm_m": 0.00776927606911359, + "error_norm_m": 0.0004867292459831158, "predicted_m": [ - 0.3510237233638505, - -0.00885403901957753, - -0.0014618368667186426 + 0.35003465403203693, + -0.00997767079417181, + 0.00025973352663880814 ], "observed_m": [ - 0.3503814492270893, - -0.013433545982671257, - 0.00478133945197722 + 0.3496596168465944, + -0.01009872866262521, + 0.0005453862194602949 ] }, { "marker_id": 215, "link": "Board", "error_m": [ - 0.0022197584933872916, - 0.004597038109235202, - -0.002009676866031459 + -1.2202406234340657e-05, + -5.542088899646025e-05, + -0.00013917581797249617 ], - "error_norm_m": 0.00548624536933847, + "error_norm_m": 0.00015030063859937268, "predicted_m": [ - 0.2506736172684112, - -0.08841109537758243, - -0.0007331460658212805 + 0.25003063033588263, + -0.0899726370686286, + 0.00028453932335978144 ], "observed_m": [ - 0.2484538587750239, - -0.09300813348681763, - 0.0012765308002101786 + 0.25004283274211697, + -0.08991721617963214, + 0.0004237151413322776 ] }, { "marker_id": 217, "link": "Board", "error_m": [ - 0.0005494650743690377, - 0.0034823249283269797, - -0.004287094354473672 + -0.00018966040088486125, + -0.0003166973544106999, + 0.0001074293097384231 ], - "error_norm_m": 0.005550466356853171, + "error_norm_m": 0.00038445980094857355, "predicted_m": [ - 0.6506693791477163, - -0.09016077179726124, - -0.00015946408007967683 + 0.6500306199230309, + -0.0899927714029194, + 0.00019551747270817174 ], "observed_m": [ - 0.6501199140733472, - -0.09364309672558822, - 0.004127630274393995 + 0.6502202803239158, + -0.0896760740485087, + 8.808816296974863e-05 ] }, { "marker_id": 242, "link": "Arm1", "error_m": [ - -0.0114476458067099, - 0.15903911345726549, - -0.13242582516469986 + 7.090682397897785e-05, + 0.035469324181482485, + 0.005198799379627139 ], - "error_norm_m": 0.2072705656245973, + "error_norm_m": 0.03584836817288057, "predicted_m": [ - 0.23651640321776726, - 0.15295372938743684, - 0.3065922760071799 + 0.2899643681002224, + 0.09072049282634856, + 0.31281349745795345 ], "observed_m": [ - 0.24796404902447716, - -0.006085384069828635, - 0.4390181011718798 + 0.28989346127624344, + 0.055251168644866074, + 0.3076146980783263 ] }, { "marker_id": 243, "link": "Arm1", "error_m": [ - 0.013516232382957322, - 0.2409783165580659, - -0.08986597097129762 + -6.592048911135961e-05, + 0.03982473139977476, + 0.00017671791438311768 ], - "error_norm_m": 0.2575444239885687, + "error_norm_m": 0.03982517803847654, "predicted_m": [ - 0.23667623073768207, - 0.19693643932210864, - 0.3292968059948701 + 0.2899734710524485, + 0.1280984718831597, + 0.3452617115653582 ], "observed_m": [ - 0.22315999835472475, - -0.04404187723595726, - 0.4191627769661677 + 0.29003939154155983, + 0.08827374048338495, + 0.34508499365097506 ] } ], @@ -1424,7 +1424,7 @@ "Arm1", "Ellbow" ], - "active_observations": 48, + "active_observations": 49, "joint_updates": [ { "pass": 0, @@ -1433,35 +1433,40 @@ "link": "Base", "joint_variable": "x", "joint_type": "linear", - "old": 0.12522792773936703, - "new": 0.11612162326873635, + "old": 0.1798550866196676, + "new": 0.17986115893120908, "info": { "reason": "weighted_projection", - "used_markers": 4, + "used_markers": 5, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.13756104549696957, + "q_i": 0.17978712219210502, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176446, + "q_i": 0.1799230510472302, "weight": 1.0 }, { "marker_id": 246, - "q_i": 0.10644157245547092, + "q_i": 0.17979985946534174, "weight": 1.0 }, { "marker_id": 247, - "q_i": 0.10758906514074038, + "q_i": 0.1798857068480513, + "weight": 1.0 + }, + { + "marker_id": 231, + "q_i": 0.1799100551033173, "weight": 1.0 } ] @@ -1471,22 +1476,22 @@ "link": "Arm1", "joint_variable": "y", "joint_type": "revolute", - "old": 1.868759813799059, - "new": 2.0036930674857842, + "old": 1.641248000650461, + "new": 1.7365981804643082, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 4, + "used_markers": 5, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.1378995861040084, - "theta_alt_rad": 2.0036930674857842, - "score_theta": 1.4166279681790321, - "score_theta_alt": 0.42817463976478887, - "best_score": 0.42817463976478887, + "theta_rad": -1.404994473125485, + "theta_alt_rad": 1.7365981804643082, + "score_theta": 1.408958810317129, + "score_theta_alt": 0.10409657987591506, + "best_score": 0.10409657987591506, "per_marker": [ { "marker_id": 242, @@ -1503,6 +1508,10 @@ { "marker_id": 247, "weight": 1.0 + }, + { + "marker_id": 231, + "weight": 1.0 } ] } @@ -1512,21 +1521,21 @@ "joint_variable": "z", "joint_type": "revolute", "old": 0.0, - "new": -3.114505756675506, + "new": 3.072312926839464, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 2, + "used_markers": 3, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -3.114505756675506, - "theta_alt_rad": 0.027086896914287006, - "score_theta": 0.18555237475394312, - "score_theta_alt": 0.3575328653676317, - "best_score": 0.18555237475394312, + "theta_rad": 3.0723129268394636, + "theta_alt_rad": -0.06927972675032912, + "score_theta": 0.1081326626911601, + "score_theta_alt": 0.23592162012276952, + "best_score": 0.1081326626911601, "per_marker": [ { "marker_id": 246, @@ -1535,6 +1544,10 @@ { "marker_id": 247, "weight": 1.0 + }, + { + "marker_id": 231, + "weight": 1.0 } ] } @@ -1548,35 +1561,40 @@ "link": "Base", "joint_variable": "x", "joint_type": "linear", - "old": 0.11612162326873635, - "new": 0.11612162326888778, + "old": 0.17986115893120908, + "new": 0.1798611589314037, "info": { "reason": "weighted_projection", - "used_markers": 4, + "used_markers": 5, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.13756104549696957, + "q_i": 0.179787122192105, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176446, + "q_i": 0.17992305104723014, "weight": 1.0 }, { "marker_id": 246, - "q_i": 0.1064415724558535, + "q_i": 0.1797998594657184, "weight": 1.0 }, { "marker_id": 247, - "q_i": 0.10758906514096356, + "q_i": 0.179885706848271, + "weight": 1.0 + }, + { + "marker_id": 231, + "q_i": 0.17991005510369396, "weight": 1.0 } ] @@ -1586,22 +1604,22 @@ "link": "Arm1", "joint_variable": "y", "joint_type": "revolute", - "old": 2.0036930674857842, - "new": 1.871870899165117, + "old": 1.7365981804643082, + "new": 1.5834624463111622, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 4, + "used_markers": 5, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.2697217544246762, - "theta_alt_rad": 1.871870899165117, - "score_theta": 1.5716475435240311, - "score_theta_alt": 0.27505091535285564, - "best_score": 0.27505091535285564, + "theta_rad": -1.5581302072786307, + "theta_alt_rad": 1.5834624463111622, + "score_theta": 1.5021665979130625, + "score_theta_alt": 0.05377041567040371, + "best_score": 0.05377041567040371, "per_marker": [ { "marker_id": 242, @@ -1618,6 +1636,10 @@ { "marker_id": 247, "weight": 1.0 + }, + { + "marker_id": 231, + "weight": 1.0 } ] } @@ -1626,22 +1648,22 @@ "link": "Ellbow", "joint_variable": "z", "joint_type": "revolute", - "old": -3.114505756675506, - "new": 3.0318954790743, + "old": 3.072312926839464, + "new": -0.5397287231465722, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 2, + "used_markers": 3, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": 3.0318954790743, - "theta_alt_rad": -0.10969717451549243, - "score_theta": 0.1801607492166575, - "score_theta_alt": 0.29076352402843264, - "best_score": 0.1801607492166575, + "theta_rad": 2.6018639304432214, + "theta_alt_rad": -0.5397287231465722, + "score_theta": 0.19292474677213567, + "score_theta_alt": 0.12673141088594667, + "best_score": 0.12673141088594667, "per_marker": [ { "marker_id": 246, @@ -1650,6 +1672,10 @@ { "marker_id": 247, "weight": 1.0 + }, + { + "marker_id": 231, + "weight": 1.0 } ] } @@ -1708,971 +1734,991 @@ ] }, "marker_stats": { - "num_markers_used": 48, - "mean_error_m": 0.027251035154319994, - "rms_error_m": 0.06713740553783829, - "median_error_m": 0.007352920259463484, - "worst_error_m": 0.2581548252658183 + "num_markers_used": 49, + "mean_error_m": 0.005412240808224538, + "rms_error_m": 0.01764706566328229, + "median_error_m": 0.00027982072348928575, + "worst_error_m": 0.07133518163109034 }, "marker_reports": [ { "marker_id": 46, "link": "Board", "error_m": [ - -0.012478505921281857, - -0.010855570675412096, - 0.015431805042300826 + -6.940884010531168e-05, + 0.00013607725429981565, + 6.0563275850050724e-05 ], - "error_norm_m": 0.022620723498153514, + "error_norm_m": 0.00016432442485592565, "predicted_m": [ - 0.5386279079623134, - 0.18545471035886749, - -0.030922955924393408 + 0.5367483428689593, + 0.1854520510990232, + -0.027388049416256513 ], "observed_m": [ - 0.5511064138835953, - 0.19631028103427958, - -0.04635476096669423 + 0.5368177517090647, + 0.1853159738447234, + -0.027448612692106564 ] }, { "marker_id": 47, "link": "Board", "error_m": [ - 0.0012894100573633827, - 0.0035370275060585543, - 0.0031619288386499876 + -0.00013697226551262487, + 0.00020230898875445158, + -0.000147923646617424 ], - "error_norm_m": 0.004916394599229307, + "error_norm_m": 0.0002856076568985964, "predicted_m": [ - 0.3440781579462815, - -0.28565075196037254, - -0.026053773069493295 + 0.3442445937199319, + -0.2865182594217256, + -0.027330165768363855 ], "observed_m": [ - 0.3427887478889181, - -0.2891877794664311, - -0.029215701908143283 + 0.3443815659854445, + -0.28672056841048005, + -0.02718224212174643 ] }, { "marker_id": 51, "link": "Board", "error_m": [ - 0.0006393804310136086, - -0.002216989008116732, - 0.007263083653009289 + 0.0001862196521308368, + -9.067416213653923e-05, + 0.00010579994865413458 ], - "error_norm_m": 0.0076207763218903305, + "error_norm_m": 0.0002325794308491419, "predicted_m": [ - 0.1681524574942128, - -0.17042691766498333, - -0.027554583090013123 + 0.16782035894060007, + -0.1720493788733526, + -0.02729454934604128 ], "observed_m": [ - 0.16751307706319918, - -0.1682099286568666, - -0.03481766674302241 + 0.16763413928846924, + -0.17195870471121605, + -0.027400349294695415 ] }, { "marker_id": 52, "link": "Board", "error_m": [ - 0.004666151510545544, - 0.005181477505273063, - -0.00629168062763949 + -0.00023726174153268498, + 0.00036031761699248377, + -0.0004126150008007222 ], - "error_norm_m": 0.009391800901703105, + "error_norm_m": 0.0005969698970601825, "predicted_m": [ - 0.0967045172263745, - 0.21060663053145795, - -0.03181004784883765 + 0.09471952300933281, + 0.20869430100728273, + -0.027290413829108042 ], "observed_m": [ - 0.09203836571582896, - 0.2054251530261849, - -0.025518367221198157 + 0.0949567847508655, + 0.20833398339029024, + -0.02687779882830732 ] }, { "marker_id": 53, "link": "Board", "error_m": [ - -3.317190337703835e-05, - -0.0015594683105253082, - -0.0018456195432597217 + 2.2149115954217535e-05, + 0.00015507791547791916, + 6.330867188906325e-06 ], - "error_norm_m": 0.0024164753847636306, + "error_norm_m": 0.00015677953656613986, "predicted_m": [ - 0.4882860830858194, - 0.21247358131928973, - -0.03128748319150119 + 0.48628969299282865, + 0.2122545909977339, + -0.027377673671706265 ], "observed_m": [ - 0.4883192549891964, - 0.21403304962981504, - -0.029441863648241466 + 0.48626754387687443, + 0.21209951308225597, + -0.02738400453889517 ] }, { "marker_id": 54, "link": "Board", "error_m": [ - 0.0026534508624109776, - -0.001974613316610141, - -0.01751634125579668 + -8.733483979123102e-05, + 8.632832888988418e-06, + -0.00021030112527834627 ], - "error_norm_m": 0.017825883153967114, + "error_norm_m": 0.00022787817652945155, "predicted_m": [ - 0.34192481814046966, - -0.32968913659768895, - -0.025576377828129576 + 0.3422823767898657, + -0.3305681606853151, + -0.02732832528360494 ], "observed_m": [ - 0.3392713672780587, - -0.3277145232810788, - -0.008060036572332898 + 0.34236971162965696, + -0.33057679351820407, + -0.027118024158326592 ] }, { "marker_id": 55, "link": "Board", "error_m": [ - 0.00018433889811364512, - 0.0009926811546970282, - 0.001181428741732115 + -2.2999180413041387e-05, + 0.00014003997662043188, + -8.108547781068148e-05 ], - "error_norm_m": 0.0015540819077639076, + "error_norm_m": 0.00016344727609632792, "predicted_m": [ - 0.2836739731728607, - -0.2614277242588397, - -0.02640175414543752 + 0.28373580117179653, + -0.2625552136428259, + -0.027317462812956925 ], "observed_m": [ - 0.28348963427474705, - -0.26242040541353673, - -0.027583182887169634 + 0.2837588003522096, + -0.26269525361944635, + -0.027236377335146243 ] }, { "marker_id": 56, "link": "Board", "error_m": [ - -0.011824545626797911, - -0.013006697593242023, - 0.019629017070593897 + 2.191274963525558e-05, + -9.199260231848583e-05, + 4.1904291834076596e-05 ], - "error_norm_m": 0.026349428318655038, + "error_norm_m": 0.00010343489330018152, "predicted_m": [ - 0.5005246978073693, - 0.16885221892555288, - -0.03079468240848441 + 0.49871749984595637, + 0.16868396540061648, + -0.02737905105002889 ], "observed_m": [ - 0.5123492434341672, - 0.1818589165187949, - -0.05042369947907831 + 0.4986955870963211, + 0.16877595800293496, + -0.027420955341862965 ] }, { "marker_id": 58, "link": "Board", "error_m": [ - 0.00034420454425852787, - -0.0020669933721501332, - 0.009394976053304773 + 8.141076965966637e-05, + -6.357932080286455e-05, + 6.209061089882881e-05 ], - "error_norm_m": 0.009625825336612489, + "error_norm_m": 0.00012052090031244613, "predicted_m": [ - 0.050241652745343195, - -0.2159388529560626, - -0.027221612318664396 + 0.05010804537284361, + -0.21807345376044288, + -0.027266885042482116 ], "observed_m": [ - 0.04989744820108467, - -0.21387185958391247, - -0.03661658837196917 + 0.05002663460318394, + -0.21800987443964, + -0.027328975653380945 ] }, { "marker_id": 61, "link": "Board", "error_m": [ - -0.007660831442683407, - -0.022627013404865726, - 0.022663898296534882 + 8.542837521268928e-05, + -0.00043567400799732203, + 0.0003083482780012886 ], - "error_norm_m": 0.03292905039646386, + "error_norm_m": 0.0005405446411558351, "predicted_m": [ - -0.01983602040617699, - 0.33828006636107044, - -0.033364323171186094 + -0.022374073636173244, + 0.3358701951079665, + -0.02726840675710684 ], "observed_m": [ - -0.012175188963493584, - 0.36090707976593617, - -0.056028221467720976 + -0.022459502011385933, + 0.33630586911596383, + -0.02757675503510813 ] }, { "marker_id": 62, "link": "Board", "error_m": [ - 0.0009537340103471514, - 0.00650041553030517, - 0.0015267612871886875 + 4.5407920364837207e-05, + 4.895657102457762e-05, + 5.931060585763481e-05 ], - "error_norm_m": 0.006745073065370275, + "error_norm_m": 8.931054274576779e-05, "predicted_m": [ - 0.4050366909648643, - -0.1744829549732635, - -0.02718189773248335 + 0.4047202007807875, + -0.1750813034274769, + -0.027347176261979005 ], "observed_m": [ - 0.4040829569545171, - -0.18098337050356866, - -0.028708659019672036 + 0.4046747928604227, + -0.1751302599985015, + -0.02740648686783664 ] }, { "marker_id": 63, "link": "Board", "error_m": [ - -0.019032396821023534, - 0.007925666720220437, - 0.026434405409499418 + 3.6704777281126866e-05, + 7.941394034063909e-05, + 0.0002109390199994711 ], - "error_norm_m": 0.033523515792152354, + "error_norm_m": 0.00022836174100321834, "predicted_m": [ - 0.7774647588278608, - -0.23715900006494356, - -0.025981839608491545 + 0.7774171185089083, + -0.23615006348511114, + -0.027428176147645575 ], "observed_m": [ - 0.7964971556488843, - -0.245084666785164, - -0.05241624501799096 + 0.7773804137316271, + -0.23622947742545178, + -0.027639115167645046 ] }, { "marker_id": 64, "link": "Board", "error_m": [ - 0.0009286987403320582, - 0.00046365609303483657, - 0.0010329538980963227 + 5.157993376796177e-06, + -0.0001716649447987273, + -7.291639587968246e-05 ], - "error_norm_m": 0.0014643947823230828, + "error_norm_m": 0.00018658043562096141, "predicted_m": [ - -0.02098643081275837, - -0.18574877409738952, - -0.027649690754474484 + -0.02125044894668999, + -0.18818986184823136, + -0.027251956094096558 ], "observed_m": [ - -0.02191512955309043, - -0.18621243019042436, - -0.028682644652570807 + -0.021255606940066785, + -0.18801819690343263, + -0.027179039698216875 ] }, { "marker_id": 66, "link": "Board", "error_m": [ - -0.001968755420576007, - -0.0032339758744434066, - -0.002580283829774429 + -0.00011202599842652372, + 0.00018688635795727215, + -2.279822345346849e-05 ], - "error_norm_m": 0.004581753212987884, + "error_norm_m": 0.00021908010887944034, "predicted_m": [ - 0.2092629466546058, - -0.3617472147887227, - -0.025410617260694005 + 0.20976073750950172, + -0.3632014901224406, + -0.027297791808188365 ], "observed_m": [ - 0.2112317020751818, - -0.3585132389142793, - -0.022830333430919576 + 0.20987276350792824, + -0.36338837648039785, + -0.027274993584734897 ] }, { "marker_id": 68, "link": "Board", "error_m": [ - 0.005577012100406398, - -0.0016224593388955988, - -0.00978981248809814 + 2.4393455366644723e-05, + 0.00016909732600073335, + -4.854754762518426e-05 ], - "error_norm_m": 0.01138313958565787, + "error_norm_m": 0.0001776114036478016, "predicted_m": [ - 0.5755825500835047, - 0.17049379984558516, - -0.03070852106660646 + 0.573767597039867, + 0.17065018769264914, + -0.027395816576733574 ], "observed_m": [ - 0.5700055379830983, - 0.17211625918448076, - -0.02091870857850832 + 0.5737432035845004, + 0.1704810903666484, + -0.02734726902910839 ] }, { "marker_id": 69, "link": "Board", "error_m": [ - -0.009125173416002153, - -0.00021957594710153572, - -0.01199125386000344 + 6.912932255235919e-05, + -6.206971020650265e-05, + 0.00020648215640911571 ], - "error_norm_m": 0.01507007540139416, + "error_norm_m": 0.00022642083180888164, "predicted_m": [ - 0.007485120946558742, - -0.27884867984167444, - -0.026594659559778938 + 0.00762487073506257, + -0.28117131538216195, + -0.02725541934595461 ], "observed_m": [ - 0.016610294362560896, - -0.2786291038945729, - -0.014603405699775498 + 0.00755574141251021, + -0.28110924567195544, + -0.027461901502363727 ] }, { "marker_id": 72, "link": "Board", "error_m": [ - 0.001277341753475325, - -0.005948681266275818, - 0.002255876470510218 + 0.0004142921738053973, + 0.00035997634678844315, + -0.0004249132479705875 ], - "error_norm_m": 0.006489020682130234, + "error_norm_m": 0.0006940981514342688, "predicted_m": [ - 0.4429479015290387, - 0.19475279470248125, - -0.031157042377585306 + 0.4410287922799845, + 0.19433686922946028, + -0.02736702957447603 ], "observed_m": [ - 0.44167055977556335, - 0.20070147596875706, - -0.033412918848095524 + 0.4406145001061791, + 0.19397689288267184, + -0.026942116326505443 ] }, { "marker_id": 73, "link": "Board", "error_m": [ - 0.0030499756453227778, - 0.0012135178153790949, - -0.006410720618745952 + 1.2637196091569436e-05, + 0.00013394327410032325, + -0.00022530555666035526 ], - "error_norm_m": 0.007202243801546781, + "error_norm_m": 0.00026241778381772007, "predicted_m": [ - 0.22429945311963298, - 0.33449229545066955, - -0.03298451024502975 + 0.2217757831139039, + 0.33313790561850076, + -0.027322656757840347 ], "observed_m": [ - 0.2212494774743102, - 0.33327877763529046, - -0.026573789626283796 + 0.22176314591781232, + 0.33300396234440044, + -0.02709735120117999 ] }, { "marker_id": 74, "link": "Board", "error_m": [ - 0.0039247497668962045, - 0.002192416594049007, - -0.0007291866926943599 + -3.9146421010188837e-05, + 4.586103983236778e-05, + -0.00010551528520611614 ], - "error_norm_m": 0.00455434567061129, + "error_norm_m": 0.00012152840270710798, "predicted_m": [ - 0.09552289193040443, - 0.14645499798213665, - -0.031111905372844688 + 0.09381629394066922, + 0.1445343464233952, + -0.027288168162029502 ], "observed_m": [ - 0.09159814216350823, - 0.14426258138808765, - -0.030382718680150328 + 0.09385544036167941, + 0.14448848538356282, + -0.027182652876823386 ] }, { "marker_id": 75, "link": "Board", "error_m": [ - 0.003855910591340845, - -0.0011095512661584983, - 0.002120275838652326 + 0.00010281631501389901, + 0.00017859617242993453, + 3.8758262874045296e-05 ], - "error_norm_m": 0.00453814060300265, + "error_norm_m": 0.00020969022480953617, "predicted_m": [ - -0.02373601246131025, - 0.19705416796848552, - -0.03182920585411601 + -0.025661182485608103, + 0.1946203604601743, + -0.02726317384436022 ], "observed_m": [ - -0.027591923052651096, - 0.19816371923464401, - -0.03394948169276834 + -0.025763998800622002, + 0.19444176428774437, + -0.027301932107234264 ] }, { "marker_id": 77, "link": "Board", "error_m": [ - 0.004508874901278628, - -0.005823130739014276, - 0.010268814529689911 + 5.945643794059985e-05, + 0.00016824192554207307, + -0.00020451492108272337 ], - "error_norm_m": 0.012636746271260017, + "error_norm_m": 0.0002714162236642486, "predicted_m": [ - 0.02014030990423281, - 0.19385239258404371, - -0.031733445410668366 + 0.018228664882328053, + 0.1916081512256859, + -0.027272845810604032 ], "observed_m": [ - 0.01563143500295418, - 0.199675523323058, - -0.04200225994035828 + 0.018169208444387453, + 0.19143990930014382, + -0.02706833088952131 ] }, { "marker_id": 79, "link": "Board", "error_m": [ - 0.0014635800360718876, - 0.0027178884442404794, - 0.0008967106274701299 + -0.0003535975388652135, + -0.0003690267557460991, + -1.5750856311263356e-05 ], - "error_norm_m": 0.0032145099263716694, + "error_norm_m": 0.0005113316491501043, "predicted_m": [ - 0.31270785920016425, - -0.15808988393716567, - -0.027488731516744042 + 0.31232100794274237, + -0.1590866524246321, + -0.02732712196249834 ], "observed_m": [ - 0.31124427916409236, - -0.16080777238140614, - -0.028385442144214172 + 0.3126746054816076, + -0.158717625668886, + -0.027311371106187077 ] }, { "marker_id": 81, "link": "Board", "error_m": [ - 0.003281170450211618, - 0.003838011021844695, - -0.006194709628771014 + 0.00013539796217862388, + -8.149109815261402e-05, + 0.00018254475267341988 ], - "error_norm_m": 0.007991923142268799, + "error_norm_m": 0.00024144563356756543, "predicted_m": [ - 0.13399016165458333, - 0.17081551005230874, - -0.031324300396956724 + 0.1321775275061202, + 0.16906241549720502, + -0.027297487353687547 ], "observed_m": [ - 0.1307089912043717, - 0.16697749903046405, - -0.02512959076818571 + 0.13204212954394157, + 0.16914390659535763, + -0.027480032106360967 ] }, { "marker_id": 82, "link": "Board", "error_m": [ - 0.0047900391613853455, - 0.0010389973728097135, - -0.005681546707435224 + -5.415094073515925e-05, + -0.00019778252975627408, + 0.00040883282032982277 ], - "error_norm_m": 0.007503596717380189, + "error_norm_m": 0.00045737788363467175, "predicted_m": [ - 0.2215720264621742, - 0.2986360141859772, - -0.03259716324884656 + 0.21920397788882767, + 0.29726803504525456, + -0.02732094128641662 ], "observed_m": [ - 0.21678198730078885, - 0.29759701681316747, - -0.026915616541411336 + 0.21925812882956283, + 0.29746581757501084, + -0.027729774106746444 ] }, { "marker_id": 83, "link": "Board", "error_m": [ - 0.004424510203184524, - 0.003119044288465822, - -0.008265723830355537 + -7.235981519165824e-06, + -0.00011949652591858317, + 0.00014255053952747995 ], - "error_norm_m": 0.009880633494427502, + "error_norm_m": 0.0001861516463927514, "predicted_m": [ - 0.046758154802018684, - 0.3413785986187563, - -0.03330578952088388 + 0.044206095245043264, + 0.3392568437420078, + -0.02728333251455351 ], "observed_m": [ - 0.04233364459883416, - 0.3382595543302905, - -0.025040065690528343 + 0.04421333122656243, + 0.3393763402679264, + -0.02742588305408099 ] }, { "marker_id": 84, "link": "Board", "error_m": [ - 0.0031252656910716325, - -0.0049313796280109345, - -0.0005075227770663035 + 0.00010561019811033967, + 6.554271453151905e-05, + -6.939417906787551e-05 ], - "error_norm_m": 0.005860321667331223, + "error_norm_m": 0.0001423548856259235, "predicted_m": [ - 0.40972962792916934, - 0.2589949035672977, - -0.03190386742087904 + 0.40753201922442883, + 0.2584385553662033, + -0.027361617449647983 ], "observed_m": [ - 0.4066043622380977, - 0.26392628319530864, - -0.03139634464381274 + 0.4074264090263185, + 0.2583730126516718, + -0.027292223270580108 ] }, { "marker_id": 85, "link": "Board", "error_m": [ - -0.0008523340649130295, - 0.0022081562529003285, - 0.0033066461503104827 + 0.0001829567481470562, + -0.00014475142311420885, + 0.00013898942594064642 ], - "error_norm_m": 0.004066489414568434, + "error_norm_m": 0.0002715588457580502, "predicted_m": [ - 0.5043114083515564, - -0.312560343518652, - -0.025538072839670484 + 0.5045932704293496, + -0.31273633072647133, + -0.027365016849548045 ], "observed_m": [ - 0.5051637424164694, - -0.3147684997715523, - -0.028844718989980967 + 0.5044103136812026, + -0.3125915793033571, + -0.027504006275488692 ] }, { "marker_id": 86, "link": "Board", "error_m": [ - 0.004719072619259745, - -0.0026964618772751803, - -0.0023372780131934133 + -0.0003553165299956529, + 0.00042361775325344686, + -0.0003659103276084791 ], - "error_norm_m": 0.0059163689499897466, + "error_norm_m": 0.0006630174999275617, "predicted_m": [ - 0.36527754614668106, - 0.29277767287308737, - -0.03233401069325683 + 0.3629337109279086, + 0.29203080028486683, + -0.027352762334812965 ], "observed_m": [ - 0.3605584735274213, - 0.29547413475036255, - -0.029996732680063417 + 0.36328902745790426, + 0.2916071825316134, + -0.026986852007204486 ] }, { "marker_id": 92, "link": "Board", "error_m": [ - -0.0024844326991102506, - 0.002232685648766719, - 0.00020813282433403135 + -0.0003063712452819889, + 0.00025284694788885176, + -0.0001769888547842914 ], - "error_norm_m": 0.0033467312881649714, + "error_norm_m": 0.00043487926337111007, "predicted_m": [ - 0.6453813895453614, - -0.18527379414719106, - -0.026730949650652026 + 0.645109704320976, + -0.18483340364174242, + -0.027400365665502784 ], "observed_m": [ - 0.6478658222444716, - -0.18750647979595778, - -0.026939082474986057 + 0.645416075566258, + -0.18508625058963127, + -0.027223376810718493 ] }, { "marker_id": 95, "link": "Board", "error_m": [ - -0.000896068147079293, - -0.002909389033114884, - -0.000824667693506486 + 0.00018881189493683004, + 0.00019160803643775148, + -7.704586943438341e-05 ], - "error_norm_m": 0.003153975186163104, + "error_norm_m": 0.00027982072348928575, "predicted_m": [ - 0.1859445719589557, - -0.2724896598155167, - -0.026416590301276202 + 0.18605522543736824, + -0.27404029681800157, + -0.027295357385298712 ], "observed_m": [ - 0.186840640106035, - -0.2695802707824018, - -0.025591922607769716 + 0.1858664135424314, + -0.2742319048544393, + -0.02721831151586433 ] }, { "marker_id": 96, "link": "Board", "error_m": [ - 0.001800159336106999, - 0.0034001926017188933, - 0.0019684926806817077 + 0.0003500080736829059, + -0.00011060413867314267, + -5.8197357783524445e-05 ], - "error_norm_m": 0.004321671759638224, + "error_norm_m": 0.00037165287512385775, "predicted_m": [ - 0.37005706385280734, - -0.18571937792394896, - -0.02710782766593048 + 0.3697896284457174, + -0.18646954517652192, + -0.027339039325059333 ], "observed_m": [ - 0.36825690451670035, - -0.18911957052566786, - -0.029076320346612186 + 0.3694396203720345, + -0.18635894103784878, + -0.027280841967275808 ] }, { "marker_id": 97, "link": "Board", "error_m": [ - -0.0017300615151869536, - -0.004204917755138593, - 0.003684240889677899 + 0.0002026478605312021, + 0.00012255060958155095, + -0.00021837867758689108 ], - "error_norm_m": 0.005852185669216703, + "error_norm_m": 0.0003221398052263685, "predicted_m": [ - 0.30387757120940123, - -0.3586012591038765, - -0.02531375042379742 + 0.30436091421718414, + -0.3596462518988181, + -0.027318958965733053 ], "observed_m": [ - 0.3056076327245882, - -0.35439634134873793, - -0.02899799131347532 + 0.30415826635665294, + -0.35976880250839965, + -0.027100580288146162 ] }, { "marker_id": 102, "link": "Board", "error_m": [ - -0.004121672035329538, - 0.0015857378449768145, - 0.0062854046689448766 + -0.00014814168053312038, + -0.00019855261424012172, + 0.00039011536098369076 ], - "error_norm_m": 0.007681735268297346, + "error_norm_m": 0.0004621245427459994, "predicted_m": [ - 0.649813834803556, - -0.2234512802218324, - -0.026308355218988267 + 0.64970778365643, + -0.22299363511886683, + -0.02740017290743958 ], "observed_m": [ - 0.6539355068388856, - -0.2250370180668092, - -0.032593759887933144 + 0.6498559253369631, + -0.2227950825046267, + -0.02779028826842327 ] }, { "marker_id": 103, "link": "Board", "error_m": [ - -0.0012035043095391662, - 0.0025960622698794067, - -5.100801903175703e-05 + -0.00025452271371115276, + 1.7149589082499084e-05, + 0.00025028408677256475 ], - "error_norm_m": 0.0028619160976828635, + "error_norm_m": 0.00035737661408123043, "predicted_m": [ - 0.10599450637239351, - -0.1857842447863076, - -0.02747324413153348 + 0.10572957391869611, + -0.1876762534935748, + -0.027280232657757288 ], "observed_m": [ - 0.10719801068193267, - -0.188380307056187, - -0.027422236112501722 + 0.10598409663240727, + -0.1876934030826573, + -0.027530516744529852 ] }, { "marker_id": 105, "link": "Board", "error_m": [ - -0.0018827308133309018, - 0.0026779310685563495, - 0.002216807530138129 + 0.00016192678684168182, + 0.0002159004590787661, + -0.00026817234655795996 ], - "error_norm_m": 0.003953508030734489, + "error_norm_m": 0.00038045985331660947, "predicted_m": [ - 0.5247753087106309, - -0.2661521757664837, - -0.02601593053866734 + 0.5248556101884461, + -0.2662373506130235, + -0.027371008187954803 ], "observed_m": [ - 0.5266580395239618, - -0.26883010683504005, - -0.02823273806880547 + 0.5246936834016044, + -0.26645325107210227, + -0.027102835841396843 ] }, { "marker_id": 205, "link": "Board", "error_m": [ - 0.0018409217778909692, - 0.003616551038592347, - -0.01165031768467827 + -5.4261058908045e-05, + -5.994991647745307e-06, + -0.00021311120901503319 ], - "error_norm_m": 0.012336868993427137, + "error_norm_m": 0.00021999224951467727, "predicted_m": [ - 0.7506683196175424, - -0.09059819090218094, - -1.604358364427601e-05 + 0.7500306173198179, + -0.08999780498649211, + 0.00017326201004526934 ], "observed_m": [ - 0.7488273978396515, - -0.09421474194077328, - 0.011634274101033994 + 0.750084878378726, + -0.08999180999484437, + 0.0003863732190603025 ] }, { "marker_id": 206, "link": "Board", "error_m": [ - 0.003984668110273981, - 0.0036049730853108617, - -0.008478559597256689 + 4.8733105621590056e-05, + -0.000346425969343863, + 6.245750766234852e-05 ], - "error_norm_m": 0.010037897376397292, + "error_norm_m": 0.000355368552467368, "predicted_m": [ - 0.6510205447733293, - -0.010166296334336635, - -0.00103157537741244 + 0.6500346462223981, + -0.009992771544889912, + 0.00019296713865010095 ], "observed_m": [ - 0.6470358766630553, - -0.013771269419647496, - 0.007446984219844249 + 0.6499859131167766, + -0.009646345575546049, + 0.00013050963098775242 ] }, { "marker_id": 207, "link": "Board", "error_m": [ - 0.004130120219313804, - 0.0036433613488552428, - -0.013723457012830675 + -0.0006786351101717436, + -0.00046269102430987474, + 0.0005487680821694244 ], - "error_norm_m": 0.014787334016898666, + "error_norm_m": 0.0009878132438586981, "predicted_m": [ - 0.7510194852431554, - -0.010603715439256336, - -0.0008881548809770391 + 0.7500346436191851, + -0.009997805128462612, + 0.0001707116759871985 ], "observed_m": [ - 0.7468893650238416, - -0.014247076788111579, - 0.012835302131853635 + 0.7507132787293569, + -0.009535114104152738, + -0.0003780564061822259 ] }, { "marker_id": 208, "link": "Board", "error_m": [ - 0.0011444716795504517, - 0.004545724821286026, - -0.003010349767345397 + 3.578432393419595e-05, + 6.858149437825867e-05, + -4.216329862436521e-05 ], - "error_norm_m": 0.005570963587917748, + "error_norm_m": 8.810041408228449e-05, "predicted_m": [ - 0.3506725577382375, - -0.08884851448250214, - -0.0005897255693858795 + 0.35003062773266974, + -0.0899776706522013, + 0.000262283860696879 ], "observed_m": [ - 0.34952808605868707, - -0.09339423930378817, - 0.0024206241979595174 + 0.34999484340873555, + -0.09004625214657956, + 0.0003044471593212442 ] }, { "marker_id": 210, "link": "Board", "error_m": [ - 0.0025927718633455346, - 0.0007896133372580043, - -0.0033657371257313244 + -0.00016294155071762406, + -0.00028882604521902194, + 0.00042781753114565593 ], - "error_norm_m": 0.00432135876284973, + "error_norm_m": 0.0005412931491370354, "predicted_m": [ - 0.020983324110222176, - -0.01740986540620809, - -0.0018261105927888704 + 0.020034159335218682, + -0.019961059950635584, + 0.00033349534518364496 ], "observed_m": [ - 0.01839055224687664, - -0.018199478743466096, - 0.0015396265329424537 + 0.020197100885936306, + -0.019672233905416562, + -9.432218596201098e-05 ] }, { "marker_id": 211, "link": "Board", "error_m": [ - 0.0007327014709433421, - 0.004726209041216442, - -0.007145936188904495 + 0.00032815605053518326, + -0.00023886690394715054, + 0.00012606118144269305 ], - "error_norm_m": 0.008598738707664833, + "error_norm_m": 0.0004250120148547269, "predicted_m": [ - 0.2510247828940242, - -0.008416619914657829, - -0.0016052573631540434 + 0.2500346566352498, + -0.009972637210599107, + 0.0002819889893017106 ], "observed_m": [ - 0.25029208142308085, - -0.01314282895587427, - 0.005540678825750451 + 0.24970650058471464, + -0.009733770306651957, + 0.00015592780785901754 ] }, { "marker_id": 214, "link": "Board", "error_m": [ - 0.0006422741367612117, - 0.004579506963093727, - -0.006243176318695863 + 0.0003750371854425172, + 0.00012105786845340027, + -0.00028565269282148677 ], - "error_norm_m": 0.00776927606911359, + "error_norm_m": 0.0004867292459831158, "predicted_m": [ - 0.3510237233638505, - -0.00885403901957753, - -0.0014618368667186426 + 0.35003465403203693, + -0.00997767079417181, + 0.00025973352663880814 ], "observed_m": [ - 0.3503814492270893, - -0.013433545982671257, - 0.00478133945197722 + 0.3496596168465944, + -0.01009872866262521, + 0.0005453862194602949 ] }, { "marker_id": 215, "link": "Board", "error_m": [ - 0.0022197584933872916, - 0.004597038109235202, - -0.002009676866031459 + -1.2202406234340657e-05, + -5.542088899646025e-05, + -0.00013917581797249617 ], - "error_norm_m": 0.00548624536933847, + "error_norm_m": 0.00015030063859937268, "predicted_m": [ - 0.2506736172684112, - -0.08841109537758243, - -0.0007331460658212805 + 0.25003063033588263, + -0.0899726370686286, + 0.00028453932335978144 ], "observed_m": [ - 0.2484538587750239, - -0.09300813348681763, - 0.0012765308002101786 + 0.25004283274211697, + -0.08991721617963214, + 0.0004237151413322776 ] }, { "marker_id": 217, "link": "Board", "error_m": [ - 0.0005494650743690377, - 0.0034823249283269797, - -0.004287094354473672 + -0.00018966040088486125, + -0.0003166973544106999, + 0.0001074293097384231 ], - "error_norm_m": 0.005550466356853171, + "error_norm_m": 0.00038445980094857355, "predicted_m": [ - 0.6506693791477163, - -0.09016077179726124, - -0.00015946408007967683 + 0.6500306199230309, + -0.0899927714029194, + 0.00019551747270817174 ], "observed_m": [ - 0.6501199140733472, - -0.09364309672558822, - 0.004127630274393995 + 0.6502202803239158, + -0.0896760740485087, + 8.808816296974863e-05 + ] + }, + { + "marker_id": 231, + "link": "Ellbow", + "error_m": [ + -5.593405018455844e-05, + 0.047804392941404, + -0.04243520187825328 + ], + "error_norm_m": 0.06392190134501818, + "predicted_m": [ + 0.37997076714819367, + 0.14503719195662002, + 0.30198611949524384 + ], + "observed_m": [ + 0.3800267011983782, + 0.09723279901521602, + 0.3444213213734971 ] }, { "marker_id": 242, "link": "Arm1", "error_m": [ - -0.020550276755996216, - 0.15985279634296964, - -0.1325727789928305 + 7.593246024739653e-05, + 0.020953355123891355, + 0.0037789135322752188 ], - "error_norm_m": 0.20868821745200863, + "error_norm_m": 0.02129152517249143, "predicted_m": [ - 0.22741377226848095, - 0.153767412273141, - 0.3064453221790493 + 0.28996939373649083, + 0.07620452376875743, + 0.31139361161060153 ], "observed_m": [ - 0.24796404902447716, - -0.006085384069828635, - 0.4390181011718798 + 0.28989346127624344, + 0.055251168644866074, + 0.3076146980783263 ] }, { "marker_id": 243, "link": "Arm1", "error_m": [ - 0.004414105881517638, - 0.2418624207483666, - -0.09014986914595058 + -6.052394598532462e-05, + 0.023372379216877556, + 0.0008613774452164713 ], - "error_norm_m": 0.2581548252658183, + "error_norm_m": 0.023388324961584897, "predicted_m": [ - 0.22757410423624239, - 0.19782054351240935, - 0.32901290782021714 + 0.2899788675955745, + 0.1116461197002625, + 0.34594637109619153 ], "observed_m": [ - 0.22315999835472475, - -0.04404187723595726, - 0.4191627769661677 + 0.29003939154155983, + 0.08827374048338495, + 0.34508499365097506 ] }, { "marker_id": 246, "link": "Ellbow", "error_m": [ - 0.01068265604262203, - 0.19815141855402293, - -0.09464468871049103 + 6.248040526990462e-05, + 0.0705361181362571, + -0.010647078134755517 ], - "error_norm_m": 0.21985386263653023, + "error_norm_m": 0.07133518163109034, "predicted_m": [ - 0.31741387272090366, - 0.15239783692975775, - 0.30286308733103084 + 0.3799764946245583, + 0.14144782326160893, + 0.32853308541539145 ], "observed_m": [ - 0.3067312166782816, - -0.04575358162426518, - 0.3975077760415219 + 0.3799140142192884, + 0.07091170512535183, + 0.33918016355014696 ] }, { "marker_id": 247, "link": "Ellbow", "error_m": [ - 0.009569023976522095, - 0.20341787453691823, - -0.10220004790712467 + -2.337050399209284e-05, + 0.07046373128356116, + -0.010646541956699895 ], - "error_norm_m": 0.22784917751266787, + "error_norm_m": 0.07126350277819737, "predicted_m": [ - 0.2799142700449656, - 0.15256186909410155, - 0.30280930464486794 + 0.34247649560084975, + 0.1414497108554487, + 0.32854143121389 ], "observed_m": [ - 0.2703452460684435, - -0.05085600544281668, - 0.4050093525519926 + 0.34249986610484184, + 0.07098597957188753, + 0.3391879731705899 ] } ], @@ -2688,7 +2734,7 @@ "Ellbow", "Arm2" ], - "active_observations": 52, + "active_observations": 53, "joint_updates": [ { "pass": 0, @@ -2697,55 +2743,60 @@ "link": "Base", "joint_variable": "x", "joint_type": "linear", - "old": 0.11612162326888778, - "new": 0.14660070398173597, + "old": 0.1798611589314037, + "new": 0.18562496359663083, "info": { "reason": "weighted_projection", - "used_markers": 8, + "used_markers": 9, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.1375610454969696, + "q_i": 0.17978712219210502, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176447, + "q_i": 0.1799230510472302, "weight": 1.0 }, { "marker_id": 246, - "q_i": 0.10644157245583034, + "q_i": 0.17979985946535698, "weight": 1.0 }, { "marker_id": 247, - "q_i": 0.10758906514095005, + "q_i": 0.1798857068480602, + "weight": 1.0 + }, + { + "marker_id": 231, + "q_i": 0.17991005510333252, "weight": 1.0 }, { "marker_id": 122, - "q_i": 0.1794540887254528, + "q_i": 0.19727156652060449, "weight": 1.0 }, { "marker_id": 113, - "q_i": 0.19264265029171468, + "q_i": 0.2062254798814067, "weight": 1.0 }, { "marker_id": 115, - "q_i": 0.1475702527783698, + "q_i": 0.17060212079478254, "weight": 1.0 }, { "marker_id": 124, - "q_i": 0.18865214698283614, + "q_i": 0.1972197105167988, "weight": 1.0 } ] @@ -2755,22 +2806,22 @@ "link": "Arm1", "joint_variable": "y", "joint_type": "revolute", - "old": 1.871870899165117, - "new": 1.988225134886755, + "old": 1.5834624463111622, + "new": 1.9590002478929653, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 8, + "used_markers": 9, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.1533675187030383, - "theta_alt_rad": 1.988225134886755, - "score_theta": 1.9566133785530386, - "score_theta_alt": 0.7113235430505226, - "best_score": 0.7113235430505226, + "theta_rad": -1.182592405696828, + "theta_alt_rad": 1.9590002478929653, + "score_theta": 2.749173120478282, + "score_theta_alt": 0.6567791671139679, + "best_score": 0.6567791671139679, "per_marker": [ { "marker_id": 242, @@ -2788,6 +2839,10 @@ "marker_id": 247, "weight": 1.0 }, + { + "marker_id": 231, + "weight": 1.0 + }, { "marker_id": 122, "weight": 1.0 @@ -2811,22 +2866,22 @@ "link": "Ellbow", "joint_variable": "z", "joint_type": "revolute", - "old": 3.0318954790743, - "new": -1.0298900575339758, + "old": -0.5397287231465722, + "new": -0.8748776410603316, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 6, + "used_markers": 7, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": 2.1117025960558173, - "theta_alt_rad": -1.0298900575339758, - "score_theta": 1.05827396562574, - "score_theta_alt": 0.5195956179375316, - "best_score": 0.5195956179375316, + "theta_rad": 2.2667150125294615, + "theta_alt_rad": -0.8748776410603316, + "score_theta": 0.7489777483648864, + "score_theta_alt": 0.5408422798254753, + "best_score": 0.5408422798254753, "per_marker": [ { "marker_id": 246, @@ -2836,6 +2891,10 @@ "marker_id": 247, "weight": 1.0 }, + { + "marker_id": 231, + "weight": 1.0 + }, { "marker_id": 122, "weight": 1.0 @@ -2860,21 +2919,21 @@ "joint_variable": "a", "joint_type": "revolute", "old": 0.0, - "new": 1.5894150092427886, + "new": 1.4987691054474812, "info": { "reason": "2d_alignment+normal_tiebreak", "used_markers": 4, "axis_world": [ - -0.0036579088103373325, - -0.5659184188590414, - 0.8244531295939254 + 0.0001731778163655446, + -0.4676602351528872, + 0.8839082952796575 ], "axis_id": 2, - "theta_rad": 1.5894150092427881, - "theta_alt_rad": -1.5521776443470046, - "score_theta": 0.3206443525499062, - "score_theta_alt": 0.4468325644880361, - "best_score": 0.3206443525499062, + "theta_rad": 1.4987691054474808, + "theta_alt_rad": -1.642823548142312, + "score_theta": 0.3812471568959373, + "score_theta_alt": 0.513086299109796, + "best_score": 0.3812471568959373, "per_marker": [ { "marker_id": 122, @@ -2904,55 +2963,60 @@ "link": "Base", "joint_variable": "x", "joint_type": "linear", - "old": 0.14660070398173597, - "new": 0.1351925879586392, + "old": 0.18562496359663083, + "new": 0.17643663775809057, "info": { "reason": "weighted_projection", - "used_markers": 8, + "used_markers": 9, "axis_world": [ - 0.9999894046972625, - -0.004374191049192638, - 0.0014342049643525745 + 0.9999999739668706, + -5.0335835726959856e-05, + -0.00022255462662880155 ], "per_marker": [ { "marker_id": 242, - "q_i": 0.13756104549696954, + "q_i": 0.179787122192105, "weight": 1.0 }, { "marker_id": 243, - "q_i": 0.11289480998176447, + "q_i": 0.17992305104723014, "weight": 1.0 }, { "marker_id": 246, - "q_i": 0.10644157245557836, + "q_i": 0.1797998594654618, "weight": 1.0 }, { "marker_id": 247, - "q_i": 0.10758906514080306, + "q_i": 0.17988570684812133, + "weight": 1.0 + }, + { + "marker_id": 231, + "q_i": 0.1799100551034374, "weight": 1.0 }, { "marker_id": 122, - "q_i": 0.14380247248902317, + "q_i": 0.16479034008286778, "weight": 1.0 }, { "marker_id": 113, - "q_i": 0.22263745061145854, + "q_i": 0.23614769470945524, "weight": 1.0 }, { "marker_id": 115, - "q_i": 0.09761375674710997, + "q_i": 0.1229474262950744, "weight": 1.0 }, { "marker_id": 124, - "q_i": 0.15300053074640657, + "q_i": 0.16473848407906208, "weight": 1.0 } ] @@ -2962,22 +3026,22 @@ "link": "Arm1", "joint_variable": "y", "joint_type": "revolute", - "old": 1.988225134886755, - "new": 1.9173933260573035, + "old": 1.9590002478929653, + "new": 1.8458890434692918, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 8, + "used_markers": 9, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": -1.2241993275324898, - "theta_alt_rad": 1.9173933260573035, - "score_theta": 3.1535845583646394, - "score_theta_alt": 0.5574854782186398, - "best_score": 0.5574854782186398, + "theta_rad": -1.2957036101205015, + "theta_alt_rad": 1.8458890434692918, + "score_theta": 2.8472829686836856, + "score_theta_alt": 0.37707843801799457, + "best_score": 0.37707843801799457, "per_marker": [ { "marker_id": 242, @@ -2995,6 +3059,10 @@ "marker_id": 247, "weight": 1.0 }, + { + "marker_id": 231, + "weight": 1.0 + }, { "marker_id": 122, "weight": 1.0 @@ -3018,22 +3086,22 @@ "link": "Ellbow", "joint_variable": "z", "joint_type": "revolute", - "old": -1.0298900575339758, - "new": -1.2116399322589189, + "old": -0.8748776410603316, + "new": -1.0733099865513207, "info": { "reason": "2d_alignment+normal_tiebreak", - "used_markers": 6, + "used_markers": 7, "axis_world": [ - -0.9999894046972625, - 0.004374191049192638, - -0.0014342049643525745 + -0.9999999739668706, + 5.0335835726959856e-05, + 0.00022255462662880155 ], "axis_id": 0, - "theta_rad": 1.9299527213308736, - "theta_alt_rad": -1.2116399322589189, - "score_theta": 1.1328023220142964, - "score_theta_alt": 0.3368981036146866, - "best_score": 0.3368981036146866, + "theta_rad": 2.068282667038472, + "theta_alt_rad": -1.0733099865513207, + "score_theta": 0.8564637061643594, + "score_theta_alt": 0.3089602416039502, + "best_score": 0.3089602416039502, "per_marker": [ { "marker_id": 246, @@ -3043,6 +3111,10 @@ "marker_id": 247, "weight": 1.0 }, + { + "marker_id": 231, + "weight": 1.0 + }, { "marker_id": 122, "weight": 1.0 @@ -3066,22 +3138,22 @@ "link": "Arm2", "joint_variable": "a", "joint_type": "revolute", - "old": 1.5894150092427886, - "new": 1.4724732652135906, + "old": 1.4987691054474812, + "new": 1.656255078355672, "info": { "reason": "2d_alignment+normal_tiebreak", "used_markers": 4, "axis_world": [ - -0.004240246492699422, - -0.7539958184736142, - 0.6568655311644735 + 0.00011929972724452717, + -0.7160906669732894, + 0.698007265319871 ], "axis_id": 1, - "theta_rad": -1.669119388376203, - "theta_alt_rad": 1.4724732652135906, - "score_theta": 0.35038631876819637, - "score_theta_alt": 0.22021965730419296, - "best_score": 0.22021965730419296, + "theta_rad": -1.485337575234121, + "theta_alt_rad": 1.656255078355672, + "score_theta": 0.37717150331804883, + "score_theta_alt": 0.26281993264967785, + "best_score": 0.26281993264967785, "per_marker": [ { "marker_id": 122, @@ -3156,1051 +3228,1071 @@ ] }, "marker_stats": { - "num_markers_used": 52, - "mean_error_m": 0.042736780594983016, - "rms_error_m": 0.09200630887191807, - "median_error_m": 0.007651255795093838, - "worst_error_m": 0.2862916581383733 + "num_markers_used": 53, + "mean_error_m": 0.02665296397558117, + "rms_error_m": 0.06848499009853817, + "median_error_m": 0.0003221398052263685, + "worst_error_m": 0.24240188772898802 }, "marker_reports": [ { "marker_id": 46, "link": "Board", "error_m": [ - -0.012478505921281857, - -0.010855570675412096, - 0.015431805042300826 + -6.940884010531168e-05, + 0.00013607725429981565, + 6.0563275850050724e-05 ], - "error_norm_m": 0.022620723498153514, + "error_norm_m": 0.00016432442485592565, "predicted_m": [ - 0.5386279079623134, - 0.18545471035886749, - -0.030922955924393408 + 0.5367483428689593, + 0.1854520510990232, + -0.027388049416256513 ], "observed_m": [ - 0.5511064138835953, - 0.19631028103427958, - -0.04635476096669423 + 0.5368177517090647, + 0.1853159738447234, + -0.027448612692106564 ] }, { "marker_id": 47, "link": "Board", "error_m": [ - 0.0012894100573633827, - 0.0035370275060585543, - 0.0031619288386499876 + -0.00013697226551262487, + 0.00020230898875445158, + -0.000147923646617424 ], - "error_norm_m": 0.004916394599229307, + "error_norm_m": 0.0002856076568985964, "predicted_m": [ - 0.3440781579462815, - -0.28565075196037254, - -0.026053773069493295 + 0.3442445937199319, + -0.2865182594217256, + -0.027330165768363855 ], "observed_m": [ - 0.3427887478889181, - -0.2891877794664311, - -0.029215701908143283 + 0.3443815659854445, + -0.28672056841048005, + -0.02718224212174643 ] }, { "marker_id": 51, "link": "Board", "error_m": [ - 0.0006393804310136086, - -0.002216989008116732, - 0.007263083653009289 + 0.0001862196521308368, + -9.067416213653923e-05, + 0.00010579994865413458 ], - "error_norm_m": 0.0076207763218903305, + "error_norm_m": 0.0002325794308491419, "predicted_m": [ - 0.1681524574942128, - -0.17042691766498333, - -0.027554583090013123 + 0.16782035894060007, + -0.1720493788733526, + -0.02729454934604128 ], "observed_m": [ - 0.16751307706319918, - -0.1682099286568666, - -0.03481766674302241 + 0.16763413928846924, + -0.17195870471121605, + -0.027400349294695415 ] }, { "marker_id": 52, "link": "Board", "error_m": [ - 0.004666151510545544, - 0.005181477505273063, - -0.00629168062763949 + -0.00023726174153268498, + 0.00036031761699248377, + -0.0004126150008007222 ], - "error_norm_m": 0.009391800901703105, + "error_norm_m": 0.0005969698970601825, "predicted_m": [ - 0.0967045172263745, - 0.21060663053145795, - -0.03181004784883765 + 0.09471952300933281, + 0.20869430100728273, + -0.027290413829108042 ], "observed_m": [ - 0.09203836571582896, - 0.2054251530261849, - -0.025518367221198157 + 0.0949567847508655, + 0.20833398339029024, + -0.02687779882830732 ] }, { "marker_id": 53, "link": "Board", "error_m": [ - -3.317190337703835e-05, - -0.0015594683105253082, - -0.0018456195432597217 + 2.2149115954217535e-05, + 0.00015507791547791916, + 6.330867188906325e-06 ], - "error_norm_m": 0.0024164753847636306, + "error_norm_m": 0.00015677953656613986, "predicted_m": [ - 0.4882860830858194, - 0.21247358131928973, - -0.03128748319150119 + 0.48628969299282865, + 0.2122545909977339, + -0.027377673671706265 ], "observed_m": [ - 0.4883192549891964, - 0.21403304962981504, - -0.029441863648241466 + 0.48626754387687443, + 0.21209951308225597, + -0.02738400453889517 ] }, { "marker_id": 54, "link": "Board", "error_m": [ - 0.0026534508624109776, - -0.001974613316610141, - -0.01751634125579668 + -8.733483979123102e-05, + 8.632832888988418e-06, + -0.00021030112527834627 ], - "error_norm_m": 0.017825883153967114, + "error_norm_m": 0.00022787817652945155, "predicted_m": [ - 0.34192481814046966, - -0.32968913659768895, - -0.025576377828129576 + 0.3422823767898657, + -0.3305681606853151, + -0.02732832528360494 ], "observed_m": [ - 0.3392713672780587, - -0.3277145232810788, - -0.008060036572332898 + 0.34236971162965696, + -0.33057679351820407, + -0.027118024158326592 ] }, { "marker_id": 55, "link": "Board", "error_m": [ - 0.00018433889811364512, - 0.0009926811546970282, - 0.001181428741732115 + -2.2999180413041387e-05, + 0.00014003997662043188, + -8.108547781068148e-05 ], - "error_norm_m": 0.0015540819077639076, + "error_norm_m": 0.00016344727609632792, "predicted_m": [ - 0.2836739731728607, - -0.2614277242588397, - -0.02640175414543752 + 0.28373580117179653, + -0.2625552136428259, + -0.027317462812956925 ], "observed_m": [ - 0.28348963427474705, - -0.26242040541353673, - -0.027583182887169634 + 0.2837588003522096, + -0.26269525361944635, + -0.027236377335146243 ] }, { "marker_id": 56, "link": "Board", "error_m": [ - -0.011824545626797911, - -0.013006697593242023, - 0.019629017070593897 + 2.191274963525558e-05, + -9.199260231848583e-05, + 4.1904291834076596e-05 ], - "error_norm_m": 0.026349428318655038, + "error_norm_m": 0.00010343489330018152, "predicted_m": [ - 0.5005246978073693, - 0.16885221892555288, - -0.03079468240848441 + 0.49871749984595637, + 0.16868396540061648, + -0.02737905105002889 ], "observed_m": [ - 0.5123492434341672, - 0.1818589165187949, - -0.05042369947907831 + 0.4986955870963211, + 0.16877595800293496, + -0.027420955341862965 ] }, { "marker_id": 58, "link": "Board", "error_m": [ - 0.00034420454425852787, - -0.0020669933721501332, - 0.009394976053304773 + 8.141076965966637e-05, + -6.357932080286455e-05, + 6.209061089882881e-05 ], - "error_norm_m": 0.009625825336612489, + "error_norm_m": 0.00012052090031244613, "predicted_m": [ - 0.050241652745343195, - -0.2159388529560626, - -0.027221612318664396 + 0.05010804537284361, + -0.21807345376044288, + -0.027266885042482116 ], "observed_m": [ - 0.04989744820108467, - -0.21387185958391247, - -0.03661658837196917 + 0.05002663460318394, + -0.21800987443964, + -0.027328975653380945 ] }, { "marker_id": 61, "link": "Board", "error_m": [ - -0.007660831442683407, - -0.022627013404865726, - 0.022663898296534882 + 8.542837521268928e-05, + -0.00043567400799732203, + 0.0003083482780012886 ], - "error_norm_m": 0.03292905039646386, + "error_norm_m": 0.0005405446411558351, "predicted_m": [ - -0.01983602040617699, - 0.33828006636107044, - -0.033364323171186094 + -0.022374073636173244, + 0.3358701951079665, + -0.02726840675710684 ], "observed_m": [ - -0.012175188963493584, - 0.36090707976593617, - -0.056028221467720976 + -0.022459502011385933, + 0.33630586911596383, + -0.02757675503510813 ] }, { "marker_id": 62, "link": "Board", "error_m": [ - 0.0009537340103471514, - 0.00650041553030517, - 0.0015267612871886875 + 4.5407920364837207e-05, + 4.895657102457762e-05, + 5.931060585763481e-05 ], - "error_norm_m": 0.006745073065370275, + "error_norm_m": 8.931054274576779e-05, "predicted_m": [ - 0.4050366909648643, - -0.1744829549732635, - -0.02718189773248335 + 0.4047202007807875, + -0.1750813034274769, + -0.027347176261979005 ], "observed_m": [ - 0.4040829569545171, - -0.18098337050356866, - -0.028708659019672036 + 0.4046747928604227, + -0.1751302599985015, + -0.02740648686783664 ] }, { "marker_id": 63, "link": "Board", "error_m": [ - -0.019032396821023534, - 0.007925666720220437, - 0.026434405409499418 + 3.6704777281126866e-05, + 7.941394034063909e-05, + 0.0002109390199994711 ], - "error_norm_m": 0.033523515792152354, + "error_norm_m": 0.00022836174100321834, "predicted_m": [ - 0.7774647588278608, - -0.23715900006494356, - -0.025981839608491545 + 0.7774171185089083, + -0.23615006348511114, + -0.027428176147645575 ], "observed_m": [ - 0.7964971556488843, - -0.245084666785164, - -0.05241624501799096 + 0.7773804137316271, + -0.23622947742545178, + -0.027639115167645046 ] }, { "marker_id": 64, "link": "Board", "error_m": [ - 0.0009286987403320582, - 0.00046365609303483657, - 0.0010329538980963227 + 5.157993376796177e-06, + -0.0001716649447987273, + -7.291639587968246e-05 ], - "error_norm_m": 0.0014643947823230828, + "error_norm_m": 0.00018658043562096141, "predicted_m": [ - -0.02098643081275837, - -0.18574877409738952, - -0.027649690754474484 + -0.02125044894668999, + -0.18818986184823136, + -0.027251956094096558 ], "observed_m": [ - -0.02191512955309043, - -0.18621243019042436, - -0.028682644652570807 + -0.021255606940066785, + -0.18801819690343263, + -0.027179039698216875 ] }, { "marker_id": 66, "link": "Board", "error_m": [ - -0.001968755420576007, - -0.0032339758744434066, - -0.002580283829774429 + -0.00011202599842652372, + 0.00018688635795727215, + -2.279822345346849e-05 ], - "error_norm_m": 0.004581753212987884, + "error_norm_m": 0.00021908010887944034, "predicted_m": [ - 0.2092629466546058, - -0.3617472147887227, - -0.025410617260694005 + 0.20976073750950172, + -0.3632014901224406, + -0.027297791808188365 ], "observed_m": [ - 0.2112317020751818, - -0.3585132389142793, - -0.022830333430919576 + 0.20987276350792824, + -0.36338837648039785, + -0.027274993584734897 ] }, { "marker_id": 68, "link": "Board", "error_m": [ - 0.005577012100406398, - -0.0016224593388955988, - -0.00978981248809814 + 2.4393455366644723e-05, + 0.00016909732600073335, + -4.854754762518426e-05 ], - "error_norm_m": 0.01138313958565787, + "error_norm_m": 0.0001776114036478016, "predicted_m": [ - 0.5755825500835047, - 0.17049379984558516, - -0.03070852106660646 + 0.573767597039867, + 0.17065018769264914, + -0.027395816576733574 ], "observed_m": [ - 0.5700055379830983, - 0.17211625918448076, - -0.02091870857850832 + 0.5737432035845004, + 0.1704810903666484, + -0.02734726902910839 ] }, { "marker_id": 69, "link": "Board", "error_m": [ - -0.009125173416002153, - -0.00021957594710153572, - -0.01199125386000344 + 6.912932255235919e-05, + -6.206971020650265e-05, + 0.00020648215640911571 ], - "error_norm_m": 0.01507007540139416, + "error_norm_m": 0.00022642083180888164, "predicted_m": [ - 0.007485120946558742, - -0.27884867984167444, - -0.026594659559778938 + 0.00762487073506257, + -0.28117131538216195, + -0.02725541934595461 ], "observed_m": [ - 0.016610294362560896, - -0.2786291038945729, - -0.014603405699775498 + 0.00755574141251021, + -0.28110924567195544, + -0.027461901502363727 ] }, { "marker_id": 72, "link": "Board", "error_m": [ - 0.001277341753475325, - -0.005948681266275818, - 0.002255876470510218 + 0.0004142921738053973, + 0.00035997634678844315, + -0.0004249132479705875 ], - "error_norm_m": 0.006489020682130234, + "error_norm_m": 0.0006940981514342688, "predicted_m": [ - 0.4429479015290387, - 0.19475279470248125, - -0.031157042377585306 + 0.4410287922799845, + 0.19433686922946028, + -0.02736702957447603 ], "observed_m": [ - 0.44167055977556335, - 0.20070147596875706, - -0.033412918848095524 + 0.4406145001061791, + 0.19397689288267184, + -0.026942116326505443 ] }, { "marker_id": 73, "link": "Board", "error_m": [ - 0.0030499756453227778, - 0.0012135178153790949, - -0.006410720618745952 + 1.2637196091569436e-05, + 0.00013394327410032325, + -0.00022530555666035526 ], - "error_norm_m": 0.007202243801546781, + "error_norm_m": 0.00026241778381772007, "predicted_m": [ - 0.22429945311963298, - 0.33449229545066955, - -0.03298451024502975 + 0.2217757831139039, + 0.33313790561850076, + -0.027322656757840347 ], "observed_m": [ - 0.2212494774743102, - 0.33327877763529046, - -0.026573789626283796 + 0.22176314591781232, + 0.33300396234440044, + -0.02709735120117999 ] }, { "marker_id": 74, "link": "Board", "error_m": [ - 0.0039247497668962045, - 0.002192416594049007, - -0.0007291866926943599 + -3.9146421010188837e-05, + 4.586103983236778e-05, + -0.00010551528520611614 ], - "error_norm_m": 0.00455434567061129, + "error_norm_m": 0.00012152840270710798, "predicted_m": [ - 0.09552289193040443, - 0.14645499798213665, - -0.031111905372844688 + 0.09381629394066922, + 0.1445343464233952, + -0.027288168162029502 ], "observed_m": [ - 0.09159814216350823, - 0.14426258138808765, - -0.030382718680150328 + 0.09385544036167941, + 0.14448848538356282, + -0.027182652876823386 ] }, { "marker_id": 75, "link": "Board", "error_m": [ - 0.003855910591340845, - -0.0011095512661584983, - 0.002120275838652326 + 0.00010281631501389901, + 0.00017859617242993453, + 3.8758262874045296e-05 ], - "error_norm_m": 0.00453814060300265, + "error_norm_m": 0.00020969022480953617, "predicted_m": [ - -0.02373601246131025, - 0.19705416796848552, - -0.03182920585411601 + -0.025661182485608103, + 0.1946203604601743, + -0.02726317384436022 ], "observed_m": [ - -0.027591923052651096, - 0.19816371923464401, - -0.03394948169276834 + -0.025763998800622002, + 0.19444176428774437, + -0.027301932107234264 ] }, { "marker_id": 77, "link": "Board", "error_m": [ - 0.004508874901278628, - -0.005823130739014276, - 0.010268814529689911 + 5.945643794059985e-05, + 0.00016824192554207307, + -0.00020451492108272337 ], - "error_norm_m": 0.012636746271260017, + "error_norm_m": 0.0002714162236642486, "predicted_m": [ - 0.02014030990423281, - 0.19385239258404371, - -0.031733445410668366 + 0.018228664882328053, + 0.1916081512256859, + -0.027272845810604032 ], "observed_m": [ - 0.01563143500295418, - 0.199675523323058, - -0.04200225994035828 + 0.018169208444387453, + 0.19143990930014382, + -0.02706833088952131 ] }, { "marker_id": 79, "link": "Board", "error_m": [ - 0.0014635800360718876, - 0.0027178884442404794, - 0.0008967106274701299 + -0.0003535975388652135, + -0.0003690267557460991, + -1.5750856311263356e-05 ], - "error_norm_m": 0.0032145099263716694, + "error_norm_m": 0.0005113316491501043, "predicted_m": [ - 0.31270785920016425, - -0.15808988393716567, - -0.027488731516744042 + 0.31232100794274237, + -0.1590866524246321, + -0.02732712196249834 ], "observed_m": [ - 0.31124427916409236, - -0.16080777238140614, - -0.028385442144214172 + 0.3126746054816076, + -0.158717625668886, + -0.027311371106187077 ] }, { "marker_id": 81, "link": "Board", "error_m": [ - 0.003281170450211618, - 0.003838011021844695, - -0.006194709628771014 + 0.00013539796217862388, + -8.149109815261402e-05, + 0.00018254475267341988 ], - "error_norm_m": 0.007991923142268799, + "error_norm_m": 0.00024144563356756543, "predicted_m": [ - 0.13399016165458333, - 0.17081551005230874, - -0.031324300396956724 + 0.1321775275061202, + 0.16906241549720502, + -0.027297487353687547 ], "observed_m": [ - 0.1307089912043717, - 0.16697749903046405, - -0.02512959076818571 + 0.13204212954394157, + 0.16914390659535763, + -0.027480032106360967 ] }, { "marker_id": 82, "link": "Board", "error_m": [ - 0.0047900391613853455, - 0.0010389973728097135, - -0.005681546707435224 + -5.415094073515925e-05, + -0.00019778252975627408, + 0.00040883282032982277 ], - "error_norm_m": 0.007503596717380189, + "error_norm_m": 0.00045737788363467175, "predicted_m": [ - 0.2215720264621742, - 0.2986360141859772, - -0.03259716324884656 + 0.21920397788882767, + 0.29726803504525456, + -0.02732094128641662 ], "observed_m": [ - 0.21678198730078885, - 0.29759701681316747, - -0.026915616541411336 + 0.21925812882956283, + 0.29746581757501084, + -0.027729774106746444 ] }, { "marker_id": 83, "link": "Board", "error_m": [ - 0.004424510203184524, - 0.003119044288465822, - -0.008265723830355537 + -7.235981519165824e-06, + -0.00011949652591858317, + 0.00014255053952747995 ], - "error_norm_m": 0.009880633494427502, + "error_norm_m": 0.0001861516463927514, "predicted_m": [ - 0.046758154802018684, - 0.3413785986187563, - -0.03330578952088388 + 0.044206095245043264, + 0.3392568437420078, + -0.02728333251455351 ], "observed_m": [ - 0.04233364459883416, - 0.3382595543302905, - -0.025040065690528343 + 0.04421333122656243, + 0.3393763402679264, + -0.02742588305408099 ] }, { "marker_id": 84, "link": "Board", "error_m": [ - 0.0031252656910716325, - -0.0049313796280109345, - -0.0005075227770663035 + 0.00010561019811033967, + 6.554271453151905e-05, + -6.939417906787551e-05 ], - "error_norm_m": 0.005860321667331223, + "error_norm_m": 0.0001423548856259235, "predicted_m": [ - 0.40972962792916934, - 0.2589949035672977, - -0.03190386742087904 + 0.40753201922442883, + 0.2584385553662033, + -0.027361617449647983 ], "observed_m": [ - 0.4066043622380977, - 0.26392628319530864, - -0.03139634464381274 + 0.4074264090263185, + 0.2583730126516718, + -0.027292223270580108 ] }, { "marker_id": 85, "link": "Board", "error_m": [ - -0.0008523340649130295, - 0.0022081562529003285, - 0.0033066461503104827 + 0.0001829567481470562, + -0.00014475142311420885, + 0.00013898942594064642 ], - "error_norm_m": 0.004066489414568434, + "error_norm_m": 0.0002715588457580502, "predicted_m": [ - 0.5043114083515564, - -0.312560343518652, - -0.025538072839670484 + 0.5045932704293496, + -0.31273633072647133, + -0.027365016849548045 ], "observed_m": [ - 0.5051637424164694, - -0.3147684997715523, - -0.028844718989980967 + 0.5044103136812026, + -0.3125915793033571, + -0.027504006275488692 ] }, { "marker_id": 86, "link": "Board", "error_m": [ - 0.004719072619259745, - -0.0026964618772751803, - -0.0023372780131934133 + -0.0003553165299956529, + 0.00042361775325344686, + -0.0003659103276084791 ], - "error_norm_m": 0.0059163689499897466, + "error_norm_m": 0.0006630174999275617, "predicted_m": [ - 0.36527754614668106, - 0.29277767287308737, - -0.03233401069325683 + 0.3629337109279086, + 0.29203080028486683, + -0.027352762334812965 ], "observed_m": [ - 0.3605584735274213, - 0.29547413475036255, - -0.029996732680063417 + 0.36328902745790426, + 0.2916071825316134, + -0.026986852007204486 ] }, { "marker_id": 92, "link": "Board", "error_m": [ - -0.0024844326991102506, - 0.002232685648766719, - 0.00020813282433403135 + -0.0003063712452819889, + 0.00025284694788885176, + -0.0001769888547842914 ], - "error_norm_m": 0.0033467312881649714, + "error_norm_m": 0.00043487926337111007, "predicted_m": [ - 0.6453813895453614, - -0.18527379414719106, - -0.026730949650652026 + 0.645109704320976, + -0.18483340364174242, + -0.027400365665502784 ], "observed_m": [ - 0.6478658222444716, - -0.18750647979595778, - -0.026939082474986057 + 0.645416075566258, + -0.18508625058963127, + -0.027223376810718493 ] }, { "marker_id": 95, "link": "Board", "error_m": [ - -0.000896068147079293, - -0.002909389033114884, - -0.000824667693506486 + 0.00018881189493683004, + 0.00019160803643775148, + -7.704586943438341e-05 ], - "error_norm_m": 0.003153975186163104, + "error_norm_m": 0.00027982072348928575, "predicted_m": [ - 0.1859445719589557, - -0.2724896598155167, - -0.026416590301276202 + 0.18605522543736824, + -0.27404029681800157, + -0.027295357385298712 ], "observed_m": [ - 0.186840640106035, - -0.2695802707824018, - -0.025591922607769716 + 0.1858664135424314, + -0.2742319048544393, + -0.02721831151586433 ] }, { "marker_id": 96, "link": "Board", "error_m": [ - 0.001800159336106999, - 0.0034001926017188933, - 0.0019684926806817077 + 0.0003500080736829059, + -0.00011060413867314267, + -5.8197357783524445e-05 ], - "error_norm_m": 0.004321671759638224, + "error_norm_m": 0.00037165287512385775, "predicted_m": [ - 0.37005706385280734, - -0.18571937792394896, - -0.02710782766593048 + 0.3697896284457174, + -0.18646954517652192, + -0.027339039325059333 ], "observed_m": [ - 0.36825690451670035, - -0.18911957052566786, - -0.029076320346612186 + 0.3694396203720345, + -0.18635894103784878, + -0.027280841967275808 ] }, { "marker_id": 97, "link": "Board", "error_m": [ - -0.0017300615151869536, - -0.004204917755138593, - 0.003684240889677899 + 0.0002026478605312021, + 0.00012255060958155095, + -0.00021837867758689108 ], - "error_norm_m": 0.005852185669216703, + "error_norm_m": 0.0003221398052263685, "predicted_m": [ - 0.30387757120940123, - -0.3586012591038765, - -0.02531375042379742 + 0.30436091421718414, + -0.3596462518988181, + -0.027318958965733053 ], "observed_m": [ - 0.3056076327245882, - -0.35439634134873793, - -0.02899799131347532 + 0.30415826635665294, + -0.35976880250839965, + -0.027100580288146162 ] }, { "marker_id": 102, "link": "Board", "error_m": [ - -0.004121672035329538, - 0.0015857378449768145, - 0.0062854046689448766 + -0.00014814168053312038, + -0.00019855261424012172, + 0.00039011536098369076 ], - "error_norm_m": 0.007681735268297346, + "error_norm_m": 0.0004621245427459994, "predicted_m": [ - 0.649813834803556, - -0.2234512802218324, - -0.026308355218988267 + 0.64970778365643, + -0.22299363511886683, + -0.02740017290743958 ], "observed_m": [ - 0.6539355068388856, - -0.2250370180668092, - -0.032593759887933144 + 0.6498559253369631, + -0.2227950825046267, + -0.02779028826842327 ] }, { "marker_id": 103, "link": "Board", "error_m": [ - -0.0012035043095391662, - 0.0025960622698794067, - -5.100801903175703e-05 + -0.00025452271371115276, + 1.7149589082499084e-05, + 0.00025028408677256475 ], - "error_norm_m": 0.0028619160976828635, + "error_norm_m": 0.00035737661408123043, "predicted_m": [ - 0.10599450637239351, - -0.1857842447863076, - -0.02747324413153348 + 0.10572957391869611, + -0.1876762534935748, + -0.027280232657757288 ], "observed_m": [ - 0.10719801068193267, - -0.188380307056187, - -0.027422236112501722 + 0.10598409663240727, + -0.1876934030826573, + -0.027530516744529852 ] }, { "marker_id": 105, "link": "Board", "error_m": [ - -0.0018827308133309018, - 0.0026779310685563495, - 0.002216807530138129 + 0.00016192678684168182, + 0.0002159004590787661, + -0.00026817234655795996 ], - "error_norm_m": 0.003953508030734489, + "error_norm_m": 0.00038045985331660947, "predicted_m": [ - 0.5247753087106309, - -0.2661521757664837, - -0.02601593053866734 + 0.5248556101884461, + -0.2662373506130235, + -0.027371008187954803 ], "observed_m": [ - 0.5266580395239618, - -0.26883010683504005, - -0.02823273806880547 + 0.5246936834016044, + -0.26645325107210227, + -0.027102835841396843 ] }, { "marker_id": 113, "link": "Arm2", "error_m": [ - -0.08690193682510394, - 0.14320001534175297, - 0.15495173358690334 + -0.05962781252050614, + 0.11276800844106168, + 0.2061227193223322 ], - "error_norm_m": 0.22818464181320203, + "error_norm_m": 0.24240188772898802, "predicted_m": [ - 0.3060758339483374, - 0.06218610998786428, - 0.413847631747943 + 0.34667840045468484, + 0.043825297833157056, + 0.42675824184574285 ], "observed_m": [ - 0.3929777707734413, - -0.08101390535388868, - 0.25889589816103964 + 0.406306212975191, + -0.06894271060790462, + 0.22063552252341065 ] }, { "marker_id": 115, "link": "Arm2", "error_m": [ - 0.03510492825225581, - 0.15567930453195877, - 0.10433316074350929 + 0.05740528195180067, + 0.09512665942292654, + 0.1966562833953476 ], - "error_norm_m": 0.1906667518941919, + "error_norm_m": 0.22587195825910408, "predicted_m": [ - 0.358077508013167, - 0.04224919624221801, - 0.3912983442930807 + 0.4033372386534436, + 0.02987172029021534, + 0.41243348259162577 ], "observed_m": [ - 0.3229725797609112, - -0.11343010828974076, - 0.2869651835495714 + 0.34593195670164295, + -0.0652549391327112, + 0.21577719919627816 ] }, { "marker_id": 122, "link": "Arm2", "error_m": [ - -0.012067162369545192, - 0.14788766667940303, - 0.011614506577626804 + 0.017175313745953602, + 0.09046894916432408, + 0.08209809456037132 ], - "error_norm_m": 0.1488330444712226, + "error_norm_m": 0.12336822644268121, "predicted_m": [ - 0.33272402210184754, - 0.09003660203530532, - 0.3394216674558976 + 0.3795416994768205, + 0.07139623771130262, + 0.3547523611722594 ], "observed_m": [ - 0.34479118447139273, - -0.05785106464409772, - 0.3278071608782708 + 0.3623663857308669, + -0.019072711453021453, + 0.2726542666118881 ] }, { "marker_id": 124, "link": "Arm2", "error_m": [ - -0.021528629932936194, - 0.13449258609742476, - 0.15435311256335194 + 0.017257754739211983, + 0.10290205591387569, + 0.21671293920058812 ], - "error_norm_m": 0.20585582571294242, + "error_norm_m": 0.24052268339368535, "predicted_m": [ - 0.33227031572712984, - 0.009359049458835523, - 0.40970627929031594 + 0.3795544645476356, + -0.005225463654619542, + 0.4294391385612713 ], "observed_m": [ - 0.35379894566006603, - -0.12513353663858923, - 0.255353166726964 + 0.3622967098084236, + -0.10812751956849523, + 0.21272619936068318 ] }, { "marker_id": 205, "link": "Board", "error_m": [ - 0.0018409217778909692, - 0.003616551038592347, - -0.01165031768467827 + -5.4261058908045e-05, + -5.994991647745307e-06, + -0.00021311120901503319 ], - "error_norm_m": 0.012336868993427137, + "error_norm_m": 0.00021999224951467727, "predicted_m": [ - 0.7506683196175424, - -0.09059819090218094, - -1.604358364427601e-05 + 0.7500306173198179, + -0.08999780498649211, + 0.00017326201004526934 ], "observed_m": [ - 0.7488273978396515, - -0.09421474194077328, - 0.011634274101033994 + 0.750084878378726, + -0.08999180999484437, + 0.0003863732190603025 ] }, { "marker_id": 206, "link": "Board", "error_m": [ - 0.003984668110273981, - 0.0036049730853108617, - -0.008478559597256689 + 4.8733105621590056e-05, + -0.000346425969343863, + 6.245750766234852e-05 ], - "error_norm_m": 0.010037897376397292, + "error_norm_m": 0.000355368552467368, "predicted_m": [ - 0.6510205447733293, - -0.010166296334336635, - -0.00103157537741244 + 0.6500346462223981, + -0.009992771544889912, + 0.00019296713865010095 ], "observed_m": [ - 0.6470358766630553, - -0.013771269419647496, - 0.007446984219844249 + 0.6499859131167766, + -0.009646345575546049, + 0.00013050963098775242 ] }, { "marker_id": 207, "link": "Board", "error_m": [ - 0.004130120219313804, - 0.0036433613488552428, - -0.013723457012830675 + -0.0006786351101717436, + -0.00046269102430987474, + 0.0005487680821694244 ], - "error_norm_m": 0.014787334016898666, + "error_norm_m": 0.0009878132438586981, "predicted_m": [ - 0.7510194852431554, - -0.010603715439256336, - -0.0008881548809770391 + 0.7500346436191851, + -0.009997805128462612, + 0.0001707116759871985 ], "observed_m": [ - 0.7468893650238416, - -0.014247076788111579, - 0.012835302131853635 + 0.7507132787293569, + -0.009535114104152738, + -0.0003780564061822259 ] }, { "marker_id": 208, "link": "Board", "error_m": [ - 0.0011444716795504517, - 0.004545724821286026, - -0.003010349767345397 + 3.578432393419595e-05, + 6.858149437825867e-05, + -4.216329862436521e-05 ], - "error_norm_m": 0.005570963587917748, + "error_norm_m": 8.810041408228449e-05, "predicted_m": [ - 0.3506725577382375, - -0.08884851448250214, - -0.0005897255693858795 + 0.35003062773266974, + -0.0899776706522013, + 0.000262283860696879 ], "observed_m": [ - 0.34952808605868707, - -0.09339423930378817, - 0.0024206241979595174 + 0.34999484340873555, + -0.09004625214657956, + 0.0003044471593212442 ] }, { "marker_id": 210, "link": "Board", "error_m": [ - 0.0025927718633455346, - 0.0007896133372580043, - -0.0033657371257313244 + -0.00016294155071762406, + -0.00028882604521902194, + 0.00042781753114565593 ], - "error_norm_m": 0.00432135876284973, + "error_norm_m": 0.0005412931491370354, "predicted_m": [ - 0.020983324110222176, - -0.01740986540620809, - -0.0018261105927888704 + 0.020034159335218682, + -0.019961059950635584, + 0.00033349534518364496 ], "observed_m": [ - 0.01839055224687664, - -0.018199478743466096, - 0.0015396265329424537 + 0.020197100885936306, + -0.019672233905416562, + -9.432218596201098e-05 ] }, { "marker_id": 211, "link": "Board", "error_m": [ - 0.0007327014709433421, - 0.004726209041216442, - -0.007145936188904495 + 0.00032815605053518326, + -0.00023886690394715054, + 0.00012606118144269305 ], - "error_norm_m": 0.008598738707664833, + "error_norm_m": 0.0004250120148547269, "predicted_m": [ - 0.2510247828940242, - -0.008416619914657829, - -0.0016052573631540434 + 0.2500346566352498, + -0.009972637210599107, + 0.0002819889893017106 ], "observed_m": [ - 0.25029208142308085, - -0.01314282895587427, - 0.005540678825750451 + 0.24970650058471464, + -0.009733770306651957, + 0.00015592780785901754 ] }, { "marker_id": 214, "link": "Board", "error_m": [ - 0.0006422741367612117, - 0.004579506963093727, - -0.006243176318695863 + 0.0003750371854425172, + 0.00012105786845340027, + -0.00028565269282148677 ], - "error_norm_m": 0.00776927606911359, + "error_norm_m": 0.0004867292459831158, "predicted_m": [ - 0.3510237233638505, - -0.00885403901957753, - -0.0014618368667186426 + 0.35003465403203693, + -0.00997767079417181, + 0.00025973352663880814 ], "observed_m": [ - 0.3503814492270893, - -0.013433545982671257, - 0.00478133945197722 + 0.3496596168465944, + -0.01009872866262521, + 0.0005453862194602949 ] }, { "marker_id": 215, "link": "Board", "error_m": [ - 0.0022197584933872916, - 0.004597038109235202, - -0.002009676866031459 + -1.2202406234340657e-05, + -5.542088899646025e-05, + -0.00013917581797249617 ], - "error_norm_m": 0.00548624536933847, + "error_norm_m": 0.00015030063859937268, "predicted_m": [ - 0.2506736172684112, - -0.08841109537758243, - -0.0007331460658212805 + 0.25003063033588263, + -0.0899726370686286, + 0.00028453932335978144 ], "observed_m": [ - 0.2484538587750239, - -0.09300813348681763, - 0.0012765308002101786 + 0.25004283274211697, + -0.08991721617963214, + 0.0004237151413322776 ] }, { "marker_id": 217, "link": "Board", "error_m": [ - 0.0005494650743690377, - 0.0034823249283269797, - -0.004287094354473672 + -0.00018966040088486125, + -0.0003166973544106999, + 0.0001074293097384231 ], - "error_norm_m": 0.005550466356853171, + "error_norm_m": 0.00038445980094857355, "predicted_m": [ - 0.6506693791477163, - -0.09016077179726124, - -0.00015946408007967683 + 0.6500306199230309, + -0.0899927714029194, + 0.00019551747270817174 ], "observed_m": [ - 0.6501199140733472, - -0.09364309672558822, - 0.004127630274393995 + 0.6502202803239158, + -0.0896760740485087, + 8.808816296974863e-05 + ] + }, + { + "marker_id": 231, + "link": "Ellbow", + "error_m": [ + -0.003477136027940808, + 0.11370576716589968, + -0.04242583796346516 + ], + "error_norm_m": 0.121412699865561, + "predicted_m": [ + 0.3765495651704374, + 0.2109385661811157, + 0.30199548341003196 + ], + "observed_m": [ + 0.3800267011983782, + 0.09723279901521602, + 0.3444213213734971 ] }, { "marker_id": 242, "link": "Arm1", "error_m": [ - -0.0014270072367076336, - 0.17104065345467276, - -0.13477915003907404 + -0.00334533444218843, + 0.08700930618724673, + 0.003461591147909282 ], - "error_norm_m": 0.2177667577228221, + "error_norm_m": 0.08714237338397106, "predicted_m": [ - 0.24653704178776953, - 0.16495526938484412, - 0.30423895113280575 + 0.286548126834055, + 0.1422604748321128, + 0.3110762892262356 ], "observed_m": [ - 0.24796404902447716, - -0.006085384069828635, - 0.4390181011718798 + 0.28989346127624344, + 0.055251168644866074, + 0.3076146980783263 ] }, { "marker_id": 243, "link": "Arm1", "error_m": [ - 0.023544576662730993, - 0.2540315954179646, - -0.0943843430222418 + -0.003483710262448314, + 0.09717877121812808, + -0.009833347260920833 ], - "error_norm_m": 0.272019857305609, + "error_norm_m": 0.09773711951460318, "predicted_m": [ - 0.24670457501745574, - 0.20998971818200737, - 0.3247784339439259 + 0.2865556812791115, + 0.18545251170151303, + 0.3352516463900542 ], "observed_m": [ - 0.22315999835472475, - -0.04404187723595726, - 0.4191627769661677 + 0.29003939154155983, + 0.08827374048338495, + 0.34508499365097506 ] }, { "marker_id": 246, "link": "Ellbow", "error_m": [ - 0.030028569750101042, - 0.2660921735193524, - -0.0789971340835533 + -0.003359502713883522, + 0.12945819160360694, + -0.012569071239614982 ], - "error_norm_m": 0.27919044934041837, + "error_norm_m": 0.13011030391013356, "predicted_m": [ - 0.33675978642838267, - 0.2203385918950872, - 0.3185106419579686 + 0.37655451150540487, + 0.20036989672895877, + 0.326611092310532 ], "observed_m": [ - 0.3067312166782816, - -0.04575358162426518, - 0.3975077760415219 + 0.3799140142192884, + 0.07091170512535183, + 0.33918016355014696 ] }, { "marker_id": 247, "link": "Ellbow", "error_m": [ - 0.028914937683903408, - 0.2713586295022481, - -0.0865524932801871 + -0.003445353623097558, + 0.129385804750911, + -0.01256853506155936 ], - "error_norm_m": 0.2862916581383733, + "error_norm_m": 0.13004047449245446, "predicted_m": [ - 0.2992601837523469, - 0.22050262405943144, - 0.3184568592718055 + 0.3390545124817443, + 0.20037178432279854, + 0.32661943810903055 ], "observed_m": [ - 0.2703452460684435, - -0.05085600544281668, - 0.4050093525519926 + 0.34249986610484184, + 0.07098597957188753, + 0.3391879731705899 ] } ], @@ -4213,1101 +4305,1121 @@ "marker_id": 41, "link": "FingerA", "observed_position_m": [ - 0.3648011321705721, - -0.14643841809454972, - 0.18972937633293152 + 0.36687279654649646, + -0.16269108332749885, + 0.16630561261260557 ], "predicted_position_m": [ - 0.3103583996265125, - -0.013830407919863178, - 0.48677278952162906 + 0.3504073076703617, + -0.027432368792196883, + 0.5043686161393954 ], "error_m": [ - -0.05444273254405957, - 0.13260801017468654, - 0.29704341318869754 + -0.01646548887613475, + 0.13525871453530197, + 0.33806300352678986 ], - "error_norm_m": 0.3298237177768528 + "error_norm_m": 0.3644895424223125 }, { "marker_id": 42, "link": "FingerA", "observed_position_m": [ - 0.3731845692625049, - -0.17078928092159862, - 0.14991572151544888 + 0.3782391436170156, + -0.18286261422073177, + 0.12502205960840154 ], "predicted_position_m": [ - 0.33710804021898566, - -0.03600690919816865, - 0.5190357639537693 + 0.37506209486301967, + -0.04434101403619163, + 0.5411718657850411 ], "error_m": [ - -0.03607652904351921, - 0.13478237172342997, - 0.3691200424383204 + -0.003177048753995937, + 0.13852160018454013, + 0.41614980617663955 ], - "error_norm_m": 0.3946104527314098 + "error_norm_m": 0.43861029232944987 }, { "marker_id": 43, "link": "FingerB", "observed_position_m": [ - 0.326865876249431, - -0.1572287874985, - 0.16914575382028169 + 0.33126928798298777, + -0.14924650220821273, + 0.13810406767612168 ], "predicted_position_m": [ - 0.31677346258234773, - -0.044911521101462105, - 0.48432506186954627 + 0.360909263945416, + -0.05747773286472215, + 0.5047748330017584 ], "error_m": [ - -0.010092413667083244, - 0.1123172663970379, - 0.3151793080492646 + 0.029639975962428233, + 0.09176876934349057, + 0.3666707653256367 ], - "error_norm_m": 0.33474620441006336 + "error_norm_m": 0.37914045596105966 }, { "marker_id": 46, "link": "Board", "observed_position_m": [ - 0.5511064138835953, - 0.19631028103427958, - -0.04635476096669423 + 0.5368177517090647, + 0.1853159738447234, + -0.027448612692106564 ], "predicted_position_m": [ - 0.5386279079623134, - 0.18545471035886749, - -0.030922955924393408 + 0.5367483428689593, + 0.1854520510990232, + -0.027388049416256513 ], "error_m": [ - -0.012478505921281857, - -0.010855570675412096, - 0.015431805042300826 + -6.940884010531168e-05, + 0.00013607725429981565, + 6.0563275850050724e-05 ], - "error_norm_m": 0.022620723498153514 + "error_norm_m": 0.00016432442485592565 }, { "marker_id": 47, "link": "Board", "observed_position_m": [ - 0.3427887478889181, - -0.2891877794664311, - -0.029215701908143283 + 0.3443815659854445, + -0.28672056841048005, + -0.02718224212174643 ], "predicted_position_m": [ - 0.3440781579462815, - -0.28565075196037254, - -0.026053773069493295 + 0.3442445937199319, + -0.2865182594217256, + -0.027330165768363855 ], "error_m": [ - 0.0012894100573633827, - 0.0035370275060585543, - 0.0031619288386499876 + -0.00013697226551262487, + 0.00020230898875445158, + -0.000147923646617424 ], - "error_norm_m": 0.004916394599229307 + "error_norm_m": 0.0002856076568985964 }, { "marker_id": 51, "link": "Board", "observed_position_m": [ - 0.16751307706319918, - -0.1682099286568666, - -0.03481766674302241 + 0.16763413928846924, + -0.17195870471121605, + -0.027400349294695415 ], "predicted_position_m": [ - 0.1681524574942128, - -0.17042691766498333, - -0.027554583090013123 + 0.16782035894060007, + -0.1720493788733526, + -0.02729454934604128 ], "error_m": [ - 0.0006393804310136086, - -0.002216989008116732, - 0.007263083653009289 + 0.0001862196521308368, + -9.067416213653923e-05, + 0.00010579994865413458 ], - "error_norm_m": 0.0076207763218903305 + "error_norm_m": 0.0002325794308491419 }, { "marker_id": 52, "link": "Board", "observed_position_m": [ - 0.09203836571582896, - 0.2054251530261849, - -0.025518367221198157 + 0.0949567847508655, + 0.20833398339029024, + -0.02687779882830732 ], "predicted_position_m": [ - 0.0967045172263745, - 0.21060663053145795, - -0.03181004784883765 + 0.09471952300933281, + 0.20869430100728273, + -0.027290413829108042 ], "error_m": [ - 0.004666151510545544, - 0.005181477505273063, - -0.00629168062763949 + -0.00023726174153268498, + 0.00036031761699248377, + -0.0004126150008007222 ], - "error_norm_m": 0.009391800901703105 + "error_norm_m": 0.0005969698970601825 }, { "marker_id": 53, "link": "Board", "observed_position_m": [ - 0.4883192549891964, - 0.21403304962981504, - -0.029441863648241466 + 0.48626754387687443, + 0.21209951308225597, + -0.02738400453889517 ], "predicted_position_m": [ - 0.4882860830858194, - 0.21247358131928973, - -0.03128748319150119 + 0.48628969299282865, + 0.2122545909977339, + -0.027377673671706265 ], "error_m": [ - -3.317190337703835e-05, - -0.0015594683105253082, - -0.0018456195432597217 + 2.2149115954217535e-05, + 0.00015507791547791916, + 6.330867188906325e-06 ], - "error_norm_m": 0.0024164753847636306 + "error_norm_m": 0.00015677953656613986 }, { "marker_id": 54, "link": "Board", "observed_position_m": [ - 0.3392713672780587, - -0.3277145232810788, - -0.008060036572332898 + 0.34236971162965696, + -0.33057679351820407, + -0.027118024158326592 ], "predicted_position_m": [ - 0.34192481814046966, - -0.32968913659768895, - -0.025576377828129576 + 0.3422823767898657, + -0.3305681606853151, + -0.02732832528360494 ], "error_m": [ - 0.0026534508624109776, - -0.001974613316610141, - -0.01751634125579668 + -8.733483979123102e-05, + 8.632832888988418e-06, + -0.00021030112527834627 ], - "error_norm_m": 0.017825883153967114 + "error_norm_m": 0.00022787817652945155 }, { "marker_id": 55, "link": "Board", "observed_position_m": [ - 0.28348963427474705, - -0.26242040541353673, - -0.027583182887169634 + 0.2837588003522096, + -0.26269525361944635, + -0.027236377335146243 ], "predicted_position_m": [ - 0.2836739731728607, - -0.2614277242588397, - -0.02640175414543752 + 0.28373580117179653, + -0.2625552136428259, + -0.027317462812956925 ], "error_m": [ - 0.00018433889811364512, - 0.0009926811546970282, - 0.001181428741732115 + -2.2999180413041387e-05, + 0.00014003997662043188, + -8.108547781068148e-05 ], - "error_norm_m": 0.0015540819077639076 + "error_norm_m": 0.00016344727609632792 }, { "marker_id": 56, "link": "Board", "observed_position_m": [ - 0.5123492434341672, - 0.1818589165187949, - -0.05042369947907831 + 0.4986955870963211, + 0.16877595800293496, + -0.027420955341862965 ], "predicted_position_m": [ - 0.5005246978073693, - 0.16885221892555288, - -0.03079468240848441 + 0.49871749984595637, + 0.16868396540061648, + -0.02737905105002889 ], "error_m": [ - -0.011824545626797911, - -0.013006697593242023, - 0.019629017070593897 + 2.191274963525558e-05, + -9.199260231848583e-05, + 4.1904291834076596e-05 ], - "error_norm_m": 0.026349428318655038 + "error_norm_m": 0.00010343489330018152 }, { "marker_id": 58, "link": "Board", "observed_position_m": [ - 0.04989744820108467, - -0.21387185958391247, - -0.03661658837196917 + 0.05002663460318394, + -0.21800987443964, + -0.027328975653380945 ], "predicted_position_m": [ - 0.050241652745343195, - -0.2159388529560626, - -0.027221612318664396 + 0.05010804537284361, + -0.21807345376044288, + -0.027266885042482116 ], "error_m": [ - 0.00034420454425852787, - -0.0020669933721501332, - 0.009394976053304773 + 8.141076965966637e-05, + -6.357932080286455e-05, + 6.209061089882881e-05 ], - "error_norm_m": 0.009625825336612489 + "error_norm_m": 0.00012052090031244613 }, { "marker_id": 61, "link": "Board", "observed_position_m": [ - -0.012175188963493584, - 0.36090707976593617, - -0.056028221467720976 + -0.022459502011385933, + 0.33630586911596383, + -0.02757675503510813 ], "predicted_position_m": [ - -0.01983602040617699, - 0.33828006636107044, - -0.033364323171186094 + -0.022374073636173244, + 0.3358701951079665, + -0.02726840675710684 ], "error_m": [ - -0.007660831442683407, - -0.022627013404865726, - 0.022663898296534882 + 8.542837521268928e-05, + -0.00043567400799732203, + 0.0003083482780012886 ], - "error_norm_m": 0.03292905039646386 + "error_norm_m": 0.0005405446411558351 }, { "marker_id": 62, "link": "Board", "observed_position_m": [ - 0.4040829569545171, - -0.18098337050356866, - -0.028708659019672036 + 0.4046747928604227, + -0.1751302599985015, + -0.02740648686783664 ], "predicted_position_m": [ - 0.4050366909648643, - -0.1744829549732635, - -0.02718189773248335 + 0.4047202007807875, + -0.1750813034274769, + -0.027347176261979005 ], "error_m": [ - 0.0009537340103471514, - 0.00650041553030517, - 0.0015267612871886875 + 4.5407920364837207e-05, + 4.895657102457762e-05, + 5.931060585763481e-05 ], - "error_norm_m": 0.006745073065370275 + "error_norm_m": 8.931054274576779e-05 }, { "marker_id": 63, "link": "Board", "observed_position_m": [ - 0.7964971556488843, - -0.245084666785164, - -0.05241624501799096 + 0.7773804137316271, + -0.23622947742545178, + -0.027639115167645046 ], "predicted_position_m": [ - 0.7774647588278608, - -0.23715900006494356, - -0.025981839608491545 + 0.7774171185089083, + -0.23615006348511114, + -0.027428176147645575 ], "error_m": [ - -0.019032396821023534, - 0.007925666720220437, - 0.026434405409499418 + 3.6704777281126866e-05, + 7.941394034063909e-05, + 0.0002109390199994711 ], - "error_norm_m": 0.033523515792152354 + "error_norm_m": 0.00022836174100321834 }, { "marker_id": 64, "link": "Board", "observed_position_m": [ - -0.02191512955309043, - -0.18621243019042436, - -0.028682644652570807 + -0.021255606940066785, + -0.18801819690343263, + -0.027179039698216875 ], "predicted_position_m": [ - -0.02098643081275837, - -0.18574877409738952, - -0.027649690754474484 + -0.02125044894668999, + -0.18818986184823136, + -0.027251956094096558 ], "error_m": [ - 0.0009286987403320582, - 0.00046365609303483657, - 0.0010329538980963227 + 5.157993376796177e-06, + -0.0001716649447987273, + -7.291639587968246e-05 ], - "error_norm_m": 0.0014643947823230828 + "error_norm_m": 0.00018658043562096141 }, { "marker_id": 66, "link": "Board", "observed_position_m": [ - 0.2112317020751818, - -0.3585132389142793, - -0.022830333430919576 + 0.20987276350792824, + -0.36338837648039785, + -0.027274993584734897 ], "predicted_position_m": [ - 0.2092629466546058, - -0.3617472147887227, - -0.025410617260694005 + 0.20976073750950172, + -0.3632014901224406, + -0.027297791808188365 ], "error_m": [ - -0.001968755420576007, - -0.0032339758744434066, - -0.002580283829774429 + -0.00011202599842652372, + 0.00018688635795727215, + -2.279822345346849e-05 ], - "error_norm_m": 0.004581753212987884 + "error_norm_m": 0.00021908010887944034 }, { "marker_id": 68, "link": "Board", "observed_position_m": [ - 0.5700055379830983, - 0.17211625918448076, - -0.02091870857850832 + 0.5737432035845004, + 0.1704810903666484, + -0.02734726902910839 ], "predicted_position_m": [ - 0.5755825500835047, - 0.17049379984558516, - -0.03070852106660646 + 0.573767597039867, + 0.17065018769264914, + -0.027395816576733574 ], "error_m": [ - 0.005577012100406398, - -0.0016224593388955988, - -0.00978981248809814 + 2.4393455366644723e-05, + 0.00016909732600073335, + -4.854754762518426e-05 ], - "error_norm_m": 0.01138313958565787 + "error_norm_m": 0.0001776114036478016 }, { "marker_id": 69, "link": "Board", "observed_position_m": [ - 0.016610294362560896, - -0.2786291038945729, - -0.014603405699775498 + 0.00755574141251021, + -0.28110924567195544, + -0.027461901502363727 ], "predicted_position_m": [ - 0.007485120946558742, - -0.27884867984167444, - -0.026594659559778938 + 0.00762487073506257, + -0.28117131538216195, + -0.02725541934595461 ], "error_m": [ - -0.009125173416002153, - -0.00021957594710153572, - -0.01199125386000344 + 6.912932255235919e-05, + -6.206971020650265e-05, + 0.00020648215640911571 ], - "error_norm_m": 0.01507007540139416 + "error_norm_m": 0.00022642083180888164 }, { "marker_id": 72, "link": "Board", "observed_position_m": [ - 0.44167055977556335, - 0.20070147596875706, - -0.033412918848095524 + 0.4406145001061791, + 0.19397689288267184, + -0.026942116326505443 ], "predicted_position_m": [ - 0.4429479015290387, - 0.19475279470248125, - -0.031157042377585306 + 0.4410287922799845, + 0.19433686922946028, + -0.02736702957447603 ], "error_m": [ - 0.001277341753475325, - -0.005948681266275818, - 0.002255876470510218 + 0.0004142921738053973, + 0.00035997634678844315, + -0.0004249132479705875 ], - "error_norm_m": 0.006489020682130234 + "error_norm_m": 0.0006940981514342688 }, { "marker_id": 73, "link": "Board", "observed_position_m": [ - 0.2212494774743102, - 0.33327877763529046, - -0.026573789626283796 + 0.22176314591781232, + 0.33300396234440044, + -0.02709735120117999 ], "predicted_position_m": [ - 0.22429945311963298, - 0.33449229545066955, - -0.03298451024502975 + 0.2217757831139039, + 0.33313790561850076, + -0.027322656757840347 ], "error_m": [ - 0.0030499756453227778, - 0.0012135178153790949, - -0.006410720618745952 + 1.2637196091569436e-05, + 0.00013394327410032325, + -0.00022530555666035526 ], - "error_norm_m": 0.007202243801546781 + "error_norm_m": 0.00026241778381772007 }, { "marker_id": 74, "link": "Board", "observed_position_m": [ - 0.09159814216350823, - 0.14426258138808765, - -0.030382718680150328 + 0.09385544036167941, + 0.14448848538356282, + -0.027182652876823386 ], "predicted_position_m": [ - 0.09552289193040443, - 0.14645499798213665, - -0.031111905372844688 + 0.09381629394066922, + 0.1445343464233952, + -0.027288168162029502 ], "error_m": [ - 0.0039247497668962045, - 0.002192416594049007, - -0.0007291866926943599 + -3.9146421010188837e-05, + 4.586103983236778e-05, + -0.00010551528520611614 ], - "error_norm_m": 0.00455434567061129 + "error_norm_m": 0.00012152840270710798 }, { "marker_id": 75, "link": "Board", "observed_position_m": [ - -0.027591923052651096, - 0.19816371923464401, - -0.03394948169276834 + -0.025763998800622002, + 0.19444176428774437, + -0.027301932107234264 ], "predicted_position_m": [ - -0.02373601246131025, - 0.19705416796848552, - -0.03182920585411601 + -0.025661182485608103, + 0.1946203604601743, + -0.02726317384436022 ], "error_m": [ - 0.003855910591340845, - -0.0011095512661584983, - 0.002120275838652326 + 0.00010281631501389901, + 0.00017859617242993453, + 3.8758262874045296e-05 ], - "error_norm_m": 0.00453814060300265 + "error_norm_m": 0.00020969022480953617 }, { "marker_id": 77, "link": "Board", "observed_position_m": [ - 0.01563143500295418, - 0.199675523323058, - -0.04200225994035828 + 0.018169208444387453, + 0.19143990930014382, + -0.02706833088952131 ], "predicted_position_m": [ - 0.02014030990423281, - 0.19385239258404371, - -0.031733445410668366 + 0.018228664882328053, + 0.1916081512256859, + -0.027272845810604032 ], "error_m": [ - 0.004508874901278628, - -0.005823130739014276, - 0.010268814529689911 + 5.945643794059985e-05, + 0.00016824192554207307, + -0.00020451492108272337 ], - "error_norm_m": 0.012636746271260017 + "error_norm_m": 0.0002714162236642486 }, { "marker_id": 79, "link": "Board", "observed_position_m": [ - 0.31124427916409236, - -0.16080777238140614, - -0.028385442144214172 + 0.3126746054816076, + -0.158717625668886, + -0.027311371106187077 ], "predicted_position_m": [ - 0.31270785920016425, - -0.15808988393716567, - -0.027488731516744042 + 0.31232100794274237, + -0.1590866524246321, + -0.02732712196249834 ], "error_m": [ - 0.0014635800360718876, - 0.0027178884442404794, - 0.0008967106274701299 + -0.0003535975388652135, + -0.0003690267557460991, + -1.5750856311263356e-05 ], - "error_norm_m": 0.0032145099263716694 + "error_norm_m": 0.0005113316491501043 }, { "marker_id": 81, "link": "Board", "observed_position_m": [ - 0.1307089912043717, - 0.16697749903046405, - -0.02512959076818571 + 0.13204212954394157, + 0.16914390659535763, + -0.027480032106360967 ], "predicted_position_m": [ - 0.13399016165458333, - 0.17081551005230874, - -0.031324300396956724 + 0.1321775275061202, + 0.16906241549720502, + -0.027297487353687547 ], "error_m": [ - 0.003281170450211618, - 0.003838011021844695, - -0.006194709628771014 + 0.00013539796217862388, + -8.149109815261402e-05, + 0.00018254475267341988 ], - "error_norm_m": 0.007991923142268799 + "error_norm_m": 0.00024144563356756543 }, { "marker_id": 82, "link": "Board", "observed_position_m": [ - 0.21678198730078885, - 0.29759701681316747, - -0.026915616541411336 + 0.21925812882956283, + 0.29746581757501084, + -0.027729774106746444 ], "predicted_position_m": [ - 0.2215720264621742, - 0.2986360141859772, - -0.03259716324884656 + 0.21920397788882767, + 0.29726803504525456, + -0.02732094128641662 ], "error_m": [ - 0.0047900391613853455, - 0.0010389973728097135, - -0.005681546707435224 + -5.415094073515925e-05, + -0.00019778252975627408, + 0.00040883282032982277 ], - "error_norm_m": 0.007503596717380189 + "error_norm_m": 0.00045737788363467175 }, { "marker_id": 83, "link": "Board", "observed_position_m": [ - 0.04233364459883416, - 0.3382595543302905, - -0.025040065690528343 + 0.04421333122656243, + 0.3393763402679264, + -0.02742588305408099 ], "predicted_position_m": [ - 0.046758154802018684, - 0.3413785986187563, - -0.03330578952088388 + 0.044206095245043264, + 0.3392568437420078, + -0.02728333251455351 ], "error_m": [ - 0.004424510203184524, - 0.003119044288465822, - -0.008265723830355537 + -7.235981519165824e-06, + -0.00011949652591858317, + 0.00014255053952747995 ], - "error_norm_m": 0.009880633494427502 + "error_norm_m": 0.0001861516463927514 }, { "marker_id": 84, "link": "Board", "observed_position_m": [ - 0.4066043622380977, - 0.26392628319530864, - -0.03139634464381274 + 0.4074264090263185, + 0.2583730126516718, + -0.027292223270580108 ], "predicted_position_m": [ - 0.40972962792916934, - 0.2589949035672977, - -0.03190386742087904 + 0.40753201922442883, + 0.2584385553662033, + -0.027361617449647983 ], "error_m": [ - 0.0031252656910716325, - -0.0049313796280109345, - -0.0005075227770663035 + 0.00010561019811033967, + 6.554271453151905e-05, + -6.939417906787551e-05 ], - "error_norm_m": 0.005860321667331223 + "error_norm_m": 0.0001423548856259235 }, { "marker_id": 85, "link": "Board", "observed_position_m": [ - 0.5051637424164694, - -0.3147684997715523, - -0.028844718989980967 + 0.5044103136812026, + -0.3125915793033571, + -0.027504006275488692 ], "predicted_position_m": [ - 0.5043114083515564, - -0.312560343518652, - -0.025538072839670484 + 0.5045932704293496, + -0.31273633072647133, + -0.027365016849548045 ], "error_m": [ - -0.0008523340649130295, - 0.0022081562529003285, - 0.0033066461503104827 + 0.0001829567481470562, + -0.00014475142311420885, + 0.00013898942594064642 ], - "error_norm_m": 0.004066489414568434 + "error_norm_m": 0.0002715588457580502 }, { "marker_id": 86, "link": "Board", "observed_position_m": [ - 0.3605584735274213, - 0.29547413475036255, - -0.029996732680063417 + 0.36328902745790426, + 0.2916071825316134, + -0.026986852007204486 ], "predicted_position_m": [ - 0.36527754614668106, - 0.29277767287308737, - -0.03233401069325683 + 0.3629337109279086, + 0.29203080028486683, + -0.027352762334812965 ], "error_m": [ - 0.004719072619259745, - -0.0026964618772751803, - -0.0023372780131934133 + -0.0003553165299956529, + 0.00042361775325344686, + -0.0003659103276084791 ], - "error_norm_m": 0.0059163689499897466 + "error_norm_m": 0.0006630174999275617 }, { "marker_id": 92, "link": "Board", "observed_position_m": [ - 0.6478658222444716, - -0.18750647979595778, - -0.026939082474986057 + 0.645416075566258, + -0.18508625058963127, + -0.027223376810718493 ], "predicted_position_m": [ - 0.6453813895453614, - -0.18527379414719106, - -0.026730949650652026 + 0.645109704320976, + -0.18483340364174242, + -0.027400365665502784 ], "error_m": [ - -0.0024844326991102506, - 0.002232685648766719, - 0.00020813282433403135 + -0.0003063712452819889, + 0.00025284694788885176, + -0.0001769888547842914 ], - "error_norm_m": 0.0033467312881649714 + "error_norm_m": 0.00043487926337111007 }, { "marker_id": 95, "link": "Board", "observed_position_m": [ - 0.186840640106035, - -0.2695802707824018, - -0.025591922607769716 + 0.1858664135424314, + -0.2742319048544393, + -0.02721831151586433 ], "predicted_position_m": [ - 0.1859445719589557, - -0.2724896598155167, - -0.026416590301276202 + 0.18605522543736824, + -0.27404029681800157, + -0.027295357385298712 ], "error_m": [ - -0.000896068147079293, - -0.002909389033114884, - -0.000824667693506486 + 0.00018881189493683004, + 0.00019160803643775148, + -7.704586943438341e-05 ], - "error_norm_m": 0.003153975186163104 + "error_norm_m": 0.00027982072348928575 }, { "marker_id": 96, "link": "Board", "observed_position_m": [ - 0.36825690451670035, - -0.18911957052566786, - -0.029076320346612186 + 0.3694396203720345, + -0.18635894103784878, + -0.027280841967275808 ], "predicted_position_m": [ - 0.37005706385280734, - -0.18571937792394896, - -0.02710782766593048 + 0.3697896284457174, + -0.18646954517652192, + -0.027339039325059333 ], "error_m": [ - 0.001800159336106999, - 0.0034001926017188933, - 0.0019684926806817077 + 0.0003500080736829059, + -0.00011060413867314267, + -5.8197357783524445e-05 ], - "error_norm_m": 0.004321671759638224 + "error_norm_m": 0.00037165287512385775 }, { "marker_id": 97, "link": "Board", "observed_position_m": [ - 0.3056076327245882, - -0.35439634134873793, - -0.02899799131347532 + 0.30415826635665294, + -0.35976880250839965, + -0.027100580288146162 ], "predicted_position_m": [ - 0.30387757120940123, - -0.3586012591038765, - -0.02531375042379742 + 0.30436091421718414, + -0.3596462518988181, + -0.027318958965733053 ], "error_m": [ - -0.0017300615151869536, - -0.004204917755138593, - 0.003684240889677899 + 0.0002026478605312021, + 0.00012255060958155095, + -0.00021837867758689108 ], - "error_norm_m": 0.005852185669216703 + "error_norm_m": 0.0003221398052263685 }, { "marker_id": 102, "link": "Board", "observed_position_m": [ - 0.6539355068388856, - -0.2250370180668092, - -0.032593759887933144 + 0.6498559253369631, + -0.2227950825046267, + -0.02779028826842327 ], "predicted_position_m": [ - 0.649813834803556, - -0.2234512802218324, - -0.026308355218988267 + 0.64970778365643, + -0.22299363511886683, + -0.02740017290743958 ], "error_m": [ - -0.004121672035329538, - 0.0015857378449768145, - 0.0062854046689448766 + -0.00014814168053312038, + -0.00019855261424012172, + 0.00039011536098369076 ], - "error_norm_m": 0.007681735268297346 + "error_norm_m": 0.0004621245427459994 }, { "marker_id": 103, "link": "Board", "observed_position_m": [ - 0.10719801068193267, - -0.188380307056187, - -0.027422236112501722 + 0.10598409663240727, + -0.1876934030826573, + -0.027530516744529852 ], "predicted_position_m": [ - 0.10599450637239351, - -0.1857842447863076, - -0.02747324413153348 + 0.10572957391869611, + -0.1876762534935748, + -0.027280232657757288 ], "error_m": [ - -0.0012035043095391662, - 0.0025960622698794067, - -5.100801903175703e-05 + -0.00025452271371115276, + 1.7149589082499084e-05, + 0.00025028408677256475 ], - "error_norm_m": 0.0028619160976828635 + "error_norm_m": 0.00035737661408123043 }, { "marker_id": 105, "link": "Board", "observed_position_m": [ - 0.5266580395239618, - -0.26883010683504005, - -0.02823273806880547 + 0.5246936834016044, + -0.26645325107210227, + -0.027102835841396843 ], "predicted_position_m": [ - 0.5247753087106309, - -0.2661521757664837, - -0.02601593053866734 + 0.5248556101884461, + -0.2662373506130235, + -0.027371008187954803 ], "error_m": [ - -0.0018827308133309018, - 0.0026779310685563495, - 0.002216807530138129 + 0.00016192678684168182, + 0.0002159004590787661, + -0.00026817234655795996 ], - "error_norm_m": 0.003953508030734489 + "error_norm_m": 0.00038045985331660947 }, { "marker_id": 113, "link": "Arm2", "observed_position_m": [ - 0.3929777707734413, - -0.08101390535388868, - 0.25889589816103964 + 0.406306212975191, + -0.06894271060790462, + 0.22063552252341065 ], "predicted_position_m": [ - 0.3060758339483374, - 0.06218610998786428, - 0.413847631747943 + 0.34667840045468484, + 0.043825297833157056, + 0.42675824184574285 ], "error_m": [ - -0.08690193682510394, - 0.14320001534175297, - 0.15495173358690334 + -0.05962781252050614, + 0.11276800844106168, + 0.2061227193223322 ], - "error_norm_m": 0.22818464181320203 + "error_norm_m": 0.24240188772898802 }, { "marker_id": 115, "link": "Arm2", "observed_position_m": [ - 0.3229725797609112, - -0.11343010828974076, - 0.2869651835495714 + 0.34593195670164295, + -0.0652549391327112, + 0.21577719919627816 ], "predicted_position_m": [ - 0.358077508013167, - 0.04224919624221801, - 0.3912983442930807 + 0.4033372386534436, + 0.02987172029021534, + 0.41243348259162577 ], "error_m": [ - 0.03510492825225581, - 0.15567930453195877, - 0.10433316074350929 + 0.05740528195180067, + 0.09512665942292654, + 0.1966562833953476 ], - "error_norm_m": 0.1906667518941919 + "error_norm_m": 0.22587195825910408 }, { "marker_id": 122, "link": "Arm2", "observed_position_m": [ - 0.34479118447139273, - -0.05785106464409772, - 0.3278071608782708 + 0.3623663857308669, + -0.019072711453021453, + 0.2726542666118881 ], "predicted_position_m": [ - 0.33272402210184754, - 0.09003660203530532, - 0.3394216674558976 + 0.3795416994768205, + 0.07139623771130262, + 0.3547523611722594 ], "error_m": [ - -0.012067162369545192, - 0.14788766667940303, - 0.011614506577626804 + 0.017175313745953602, + 0.09046894916432408, + 0.08209809456037132 ], - "error_norm_m": 0.1488330444712226 + "error_norm_m": 0.12336822644268121 }, { "marker_id": 124, "link": "Arm2", "observed_position_m": [ - 0.35379894566006603, - -0.12513353663858923, - 0.255353166726964 + 0.3622967098084236, + -0.10812751956849523, + 0.21272619936068318 ], "predicted_position_m": [ - 0.33227031572712984, - 0.009359049458835523, - 0.40970627929031594 + 0.3795544645476356, + -0.005225463654619542, + 0.4294391385612713 ], "error_m": [ - -0.021528629932936194, - 0.13449258609742476, - 0.15435311256335194 + 0.017257754739211983, + 0.10290205591387569, + 0.21671293920058812 ], - "error_norm_m": 0.20585582571294242 + "error_norm_m": 0.24052268339368535 }, { "marker_id": 205, "link": "Board", "observed_position_m": [ - 0.7488273978396515, - -0.09421474194077328, - 0.011634274101033994 + 0.750084878378726, + -0.08999180999484437, + 0.0003863732190603025 ], "predicted_position_m": [ - 0.7506683196175424, - -0.09059819090218094, - -1.604358364427601e-05 + 0.7500306173198179, + -0.08999780498649211, + 0.00017326201004526934 ], "error_m": [ - 0.0018409217778909692, - 0.003616551038592347, - -0.01165031768467827 + -5.4261058908045e-05, + -5.994991647745307e-06, + -0.00021311120901503319 ], - "error_norm_m": 0.012336868993427137 + "error_norm_m": 0.00021999224951467727 }, { "marker_id": 206, "link": "Board", "observed_position_m": [ - 0.6470358766630553, - -0.013771269419647496, - 0.007446984219844249 + 0.6499859131167766, + -0.009646345575546049, + 0.00013050963098775242 ], "predicted_position_m": [ - 0.6510205447733293, - -0.010166296334336635, - -0.00103157537741244 + 0.6500346462223981, + -0.009992771544889912, + 0.00019296713865010095 ], "error_m": [ - 0.003984668110273981, - 0.0036049730853108617, - -0.008478559597256689 + 4.8733105621590056e-05, + -0.000346425969343863, + 6.245750766234852e-05 ], - "error_norm_m": 0.010037897376397292 + "error_norm_m": 0.000355368552467368 }, { "marker_id": 207, "link": "Board", "observed_position_m": [ - 0.7468893650238416, - -0.014247076788111579, - 0.012835302131853635 + 0.7507132787293569, + -0.009535114104152738, + -0.0003780564061822259 ], "predicted_position_m": [ - 0.7510194852431554, - -0.010603715439256336, - -0.0008881548809770391 + 0.7500346436191851, + -0.009997805128462612, + 0.0001707116759871985 ], "error_m": [ - 0.004130120219313804, - 0.0036433613488552428, - -0.013723457012830675 + -0.0006786351101717436, + -0.00046269102430987474, + 0.0005487680821694244 ], - "error_norm_m": 0.014787334016898666 + "error_norm_m": 0.0009878132438586981 }, { "marker_id": 208, "link": "Board", "observed_position_m": [ - 0.34952808605868707, - -0.09339423930378817, - 0.0024206241979595174 + 0.34999484340873555, + -0.09004625214657956, + 0.0003044471593212442 ], "predicted_position_m": [ - 0.3506725577382375, - -0.08884851448250214, - -0.0005897255693858795 + 0.35003062773266974, + -0.0899776706522013, + 0.000262283860696879 ], "error_m": [ - 0.0011444716795504517, - 0.004545724821286026, - -0.003010349767345397 + 3.578432393419595e-05, + 6.858149437825867e-05, + -4.216329862436521e-05 ], - "error_norm_m": 0.005570963587917748 + "error_norm_m": 8.810041408228449e-05 }, { "marker_id": 210, "link": "Board", "observed_position_m": [ - 0.01839055224687664, - -0.018199478743466096, - 0.0015396265329424537 + 0.020197100885936306, + -0.019672233905416562, + -9.432218596201098e-05 ], "predicted_position_m": [ - 0.020983324110222176, - -0.01740986540620809, - -0.0018261105927888704 + 0.020034159335218682, + -0.019961059950635584, + 0.00033349534518364496 ], "error_m": [ - 0.0025927718633455346, - 0.0007896133372580043, - -0.0033657371257313244 + -0.00016294155071762406, + -0.00028882604521902194, + 0.00042781753114565593 ], - "error_norm_m": 0.00432135876284973 + "error_norm_m": 0.0005412931491370354 }, { "marker_id": 211, "link": "Board", "observed_position_m": [ - 0.25029208142308085, - -0.01314282895587427, - 0.005540678825750451 + 0.24970650058471464, + -0.009733770306651957, + 0.00015592780785901754 ], "predicted_position_m": [ - 0.2510247828940242, - -0.008416619914657829, - -0.0016052573631540434 + 0.2500346566352498, + -0.009972637210599107, + 0.0002819889893017106 ], "error_m": [ - 0.0007327014709433421, - 0.004726209041216442, - -0.007145936188904495 + 0.00032815605053518326, + -0.00023886690394715054, + 0.00012606118144269305 ], - "error_norm_m": 0.008598738707664833 + "error_norm_m": 0.0004250120148547269 }, { "marker_id": 214, "link": "Board", "observed_position_m": [ - 0.3503814492270893, - -0.013433545982671257, - 0.00478133945197722 + 0.3496596168465944, + -0.01009872866262521, + 0.0005453862194602949 ], "predicted_position_m": [ - 0.3510237233638505, - -0.00885403901957753, - -0.0014618368667186426 + 0.35003465403203693, + -0.00997767079417181, + 0.00025973352663880814 ], "error_m": [ - 0.0006422741367612117, - 0.004579506963093727, - -0.006243176318695863 + 0.0003750371854425172, + 0.00012105786845340027, + -0.00028565269282148677 ], - "error_norm_m": 0.00776927606911359 + "error_norm_m": 0.0004867292459831158 }, { "marker_id": 215, "link": "Board", "observed_position_m": [ - 0.2484538587750239, - -0.09300813348681763, - 0.0012765308002101786 + 0.25004283274211697, + -0.08991721617963214, + 0.0004237151413322776 ], "predicted_position_m": [ - 0.2506736172684112, - -0.08841109537758243, - -0.0007331460658212805 + 0.25003063033588263, + -0.0899726370686286, + 0.00028453932335978144 ], "error_m": [ - 0.0022197584933872916, - 0.004597038109235202, - -0.002009676866031459 + -1.2202406234340657e-05, + -5.542088899646025e-05, + -0.00013917581797249617 ], - "error_norm_m": 0.00548624536933847 + "error_norm_m": 0.00015030063859937268 }, { "marker_id": 217, "link": "Board", "observed_position_m": [ - 0.6501199140733472, - -0.09364309672558822, - 0.004127630274393995 + 0.6502202803239158, + -0.0896760740485087, + 8.808816296974863e-05 ], "predicted_position_m": [ - 0.6506693791477163, - -0.09016077179726124, - -0.00015946408007967683 + 0.6500306199230309, + -0.0899927714029194, + 0.00019551747270817174 ], "error_m": [ - 0.0005494650743690377, - 0.0034823249283269797, - -0.004287094354473672 + -0.00018966040088486125, + -0.0003166973544106999, + 0.0001074293097384231 ], - "error_norm_m": 0.005550466356853171 + "error_norm_m": 0.00038445980094857355 + }, + { + "marker_id": 231, + "link": "Ellbow", + "observed_position_m": [ + 0.3800267011983782, + 0.09723279901521602, + 0.3444213213734971 + ], + "predicted_position_m": [ + 0.3765495651704374, + 0.2109385661811157, + 0.30199548341003196 + ], + "error_m": [ + -0.003477136027940808, + 0.11370576716589968, + -0.04242583796346516 + ], + "error_norm_m": 0.121412699865561 }, { "marker_id": 242, "link": "Arm1", "observed_position_m": [ - 0.24796404902447716, - -0.006085384069828635, - 0.4390181011718798 + 0.28989346127624344, + 0.055251168644866074, + 0.3076146980783263 ], "predicted_position_m": [ - 0.24653704178776953, - 0.16495526938484412, - 0.30423895113280575 + 0.286548126834055, + 0.1422604748321128, + 0.3110762892262356 ], "error_m": [ - -0.0014270072367076336, - 0.17104065345467276, - -0.13477915003907404 + -0.00334533444218843, + 0.08700930618724673, + 0.003461591147909282 ], - "error_norm_m": 0.2177667577228221 + "error_norm_m": 0.08714237338397106 }, { "marker_id": 243, "link": "Arm1", "observed_position_m": [ - 0.22315999835472475, - -0.04404187723595726, - 0.4191627769661677 + 0.29003939154155983, + 0.08827374048338495, + 0.34508499365097506 ], "predicted_position_m": [ - 0.24670457501745574, - 0.20998971818200737, - 0.3247784339439259 + 0.2865556812791115, + 0.18545251170151303, + 0.3352516463900542 ], "error_m": [ - 0.023544576662730993, - 0.2540315954179646, - -0.0943843430222418 + -0.003483710262448314, + 0.09717877121812808, + -0.009833347260920833 ], - "error_norm_m": 0.272019857305609 + "error_norm_m": 0.09773711951460318 }, { "marker_id": 246, "link": "Ellbow", "observed_position_m": [ - 0.3067312166782816, - -0.04575358162426518, - 0.3975077760415219 + 0.3799140142192884, + 0.07091170512535183, + 0.33918016355014696 ], "predicted_position_m": [ - 0.33675978642838267, - 0.2203385918950872, - 0.3185106419579686 + 0.37655451150540487, + 0.20036989672895877, + 0.326611092310532 ], "error_m": [ - 0.030028569750101042, - 0.2660921735193524, - -0.0789971340835533 + -0.003359502713883522, + 0.12945819160360694, + -0.012569071239614982 ], - "error_norm_m": 0.27919044934041837 + "error_norm_m": 0.13011030391013356 }, { "marker_id": 247, "link": "Ellbow", "observed_position_m": [ - 0.2703452460684435, - -0.05085600544281668, - 0.4050093525519926 + 0.34249986610484184, + 0.07098597957188753, + 0.3391879731705899 ], "predicted_position_m": [ - 0.2992601837523469, - 0.22050262405943144, - 0.3184568592718055 + 0.3390545124817443, + 0.20037178432279854, + 0.32661943810903055 ], "error_m": [ - 0.028914937683903408, - 0.2713586295022481, - -0.0865524932801871 + -0.003445353623097558, + 0.129385804750911, + -0.01256853506155936 ], - "error_norm_m": 0.2862916581383733 + "error_norm_m": 0.13004047449245446 } ] } \ No newline at end of file diff --git a/data/evaluations/Scene7/aruco_positions_initial.json b/data/evaluations/Scene7/aruco_positions_initial.json new file mode 100644 index 0000000..fb6c347 --- /dev/null +++ b/data/evaluations/Scene7/aruco_positions_initial.json @@ -0,0 +1,1076 @@ +{ + "schema_version": "1.2", + "stage": "initial_triangulation", + "created_utc": "2026-06-01T18:52:09Z", + "summary": { + "num_cameras": 7, + "num_markers": 56, + "num_constraints": 94 + }, + "markers": [ + { + "marker_id": 41, + "position_m": [ + 0.23584374215104642, + -0.1128637439184499, + 0.3458290400120677 + ], + "position_mm": [ + 235.84374215104643, + -112.8637439184499, + 345.8290400120677 + ], + "link": "FingerA", + "normal": [ + 0.0, + -0.9375276894468237, + 0.34791066600565723 + ] + }, + { + "marker_id": 44, + "position_m": [ + 0.23408985021029313, + -0.16868760189173954, + 0.32755212243754706 + ], + "position_mm": [ + 234.08985021029312, + -168.68760189173955, + 327.55212243754704 + ], + "link": "FingerB", + "normal": [ + 0.0, + -0.9375276894468237, + -0.34791066600565723 + ] + }, + { + "marker_id": 45, + "position_m": [ + 0.21603169851187431, + -0.16584169538942475, + 0.37116193876962195 + ], + "position_mm": [ + 216.0316985118743, + -165.84169538942476, + 371.16193876962194 + ], + "link": "FingerB", + "normal": [ + -0.8830215713766957, + -0.3090575499818435, + -0.3532086285506783 + ] + }, + { + "marker_id": 46, + "position_m": [ + 0.5364914417597766, + 0.18524842393798166, + -0.02719917166361664 + ], + "position_mm": [ + 536.4914417597765, + 185.24842393798167, + -27.19917166361664 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 47, + "position_m": [ + 0.34438347500596617, + -0.28665288090640456, + -0.0272045519654204 + ], + "position_mm": [ + 344.38347500596615, + -286.65288090640456, + -27.2045519654204 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 51, + "position_m": [ + 0.167755684651821, + -0.17192015577684164, + -0.02744230154818697 + ], + "position_mm": [ + 167.755684651821, + -171.92015577684163, + -27.442301548186972 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 52, + "position_m": [ + 0.0946420139130165, + 0.20886768469899908, + -0.027302011546828587 + ], + "position_mm": [ + 94.64201391301651, + 208.86768469899908, + -27.302011546828588 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 53, + "position_m": [ + 0.48626955447328274, + 0.2120888892465906, + -0.027347170347671368 + ], + "position_mm": [ + 486.26955447328277, + 212.0888892465906, + -27.34717034767137 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 54, + "position_m": [ + 0.3423822984366628, + -0.3305978099451982, + -0.027233885013587065 + ], + "position_mm": [ + 342.3822984366628, + -330.5978099451982, + -27.233885013587066 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 55, + "position_m": [ + 0.28374875414143547, + -0.2626813395141448, + -0.02726863079346355 + ], + "position_mm": [ + 283.7487541414355, + -262.6813395141448, + -27.26863079346355 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 56, + "position_m": [ + 0.49863789377445683, + 0.1687002595688537, + -0.027279020932464797 + ], + "position_mm": [ + 498.6378937744568, + 168.7002595688537, + -27.279020932464796 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 58, + "position_m": [ + 0.050007250911977996, + -0.21799881697105947, + -0.0273070687221059 + ], + "position_mm": [ + 50.007250911978, + -217.99881697105945, + -27.3070687221059 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 60, + "position_m": [ + 0.43435655323869815, + 0.28370952054968523, + -0.027279542904309645 + ], + "position_mm": [ + 434.35655323869815, + 283.70952054968524, + -27.279542904309643 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 61, + "position_m": [ + -0.02241934624432687, + 0.33631614844845475, + -0.02757707371120747 + ], + "position_mm": [ + -22.41934624432687, + 336.3161484484548, + -27.57707371120747 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 62, + "position_m": [ + 0.40477075705189447, + -0.1748951693125956, + -0.02746089993395 + ], + "position_mm": [ + 404.77075705189446, + -174.8951693125956, + -27.46089993395 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 63, + "position_m": [ + 0.77735851801188, + -0.23623110761718424, + -0.027605062694091072 + ], + "position_mm": [ + 777.35851801188, + -236.23110761718425, + -27.60506269409107 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 64, + "position_m": [ + -0.021172237994606043, + -0.18807132241855232, + -0.027429992550724876 + ], + "position_mm": [ + -21.172237994606043, + -188.0713224185523, + -27.429992550724876 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 66, + "position_m": [ + 0.20986402668483947, + -0.3633575731940788, + -0.027324612211704027 + ], + "position_mm": [ + 209.86402668483947, + -363.3575731940788, + -27.32461221170403 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 68, + "position_m": [ + 0.573735768745386, + 0.17046030535947823, + -0.027309498694501243 + ], + "position_mm": [ + 573.735768745386, + 170.46030535947824, + -27.309498694501244 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 69, + "position_m": [ + 0.007647929189470004, + -0.2808950873186895, + -0.027496279110627003 + ], + "position_mm": [ + 7.6479291894700046, + -280.8950873186895, + -27.496279110627004 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 72, + "position_m": [ + 0.4405407557359593, + 0.1942019244788629, + -0.026957955092932744 + ], + "position_mm": [ + 440.5407557359593, + 194.20192447886288, + -26.957955092932743 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 73, + "position_m": [ + 0.22169596255520665, + 0.3326605080385249, + -0.026807253958794228 + ], + "position_mm": [ + 221.69596255520665, + 332.66050803852494, + -26.807253958794227 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 79, + "position_m": [ + 0.3124585401349159, + -0.158601231080875, + -0.02755406683603202 + ], + "position_mm": [ + 312.4585401349159, + -158.601231080875, + -27.55406683603202 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 82, + "position_m": [ + 0.21925653626778774, + 0.29733269289103514, + -0.027331849012673968 + ], + "position_mm": [ + 219.25653626778774, + 297.33269289103515, + -27.331849012673967 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 83, + "position_m": [ + 0.044229065484560834, + 0.339358288153855, + -0.027408510934371275 + ], + "position_mm": [ + 44.229065484560834, + 339.35828815385497, + -27.408510934371275 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 84, + "position_m": [ + 0.40733984187985406, + 0.25830977504563163, + -0.027242792307825992 + ], + "position_mm": [ + 407.3398418798541, + 258.3097750456316, + -27.242792307825994 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 85, + "position_m": [ + 0.5043945096748418, + -0.3125868222368263, + -0.02752043271672061 + ], + "position_mm": [ + 504.3945096748418, + -312.5868222368263, + -27.52043271672061 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 86, + "position_m": [ + 0.3632712687354534, + 0.2921756087203516, + -0.027387257781098035 + ], + "position_mm": [ + 363.2712687354534, + 292.1756087203516, + -27.387257781098036 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 92, + "position_m": [ + 0.6454021002886562, + -0.1850968330997467, + -0.027208572093157777 + ], + "position_mm": [ + 645.4021002886562, + -185.0968330997467, + -27.208572093157777 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 95, + "position_m": [ + 0.18585982739417584, + -0.27421029795654434, + -0.027259291171109614 + ], + "position_mm": [ + 185.85982739417582, + -274.2102979565443, + -27.259291171109613 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 96, + "position_m": [ + 0.3697023603958218, + -0.1865738859414754, + -0.027246953920741095 + ], + "position_mm": [ + 369.7023603958218, + -186.5738859414754, + -27.246953920741095 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 97, + "position_m": [ + 0.30414562170707854, + -0.3597453743319298, + -0.027142164505479172 + ], + "position_mm": [ + 304.14562170707853, + -359.74537433192984, + -27.142164505479172 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 101, + "position_m": [ + 0.11777926249942627, + 0.2985554264774555, + -0.027227978075313766 + ], + "position_mm": [ + 117.77926249942627, + 298.55542647745546, + -27.227978075313764 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 102, + "position_m": [ + 0.6498344099663289, + -0.22279985920979672, + -0.02776445888219712 + ], + "position_mm": [ + 649.834409966329, + -222.79985920979672, + -27.76445888219712 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 103, + "position_m": [ + 0.10569109498467903, + -0.1879181445415361, + -0.027220907250431126 + ], + "position_mm": [ + 105.69109498467903, + -187.9181445415361, + -27.220907250431125 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 105, + "position_m": [ + 0.5246788707395265, + -0.2664536362398591, + -0.027111850717305742 + ], + "position_mm": [ + 524.6788707395265, + -266.4536362398591, + -27.111850717305742 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 114, + "position_m": [ + 0.26223606139924743, + -0.1473370343160058, + 0.23458757526726137 + ], + "position_mm": [ + 262.23606139924743, + -147.3370343160058, + 234.58757526726137 + ], + "link": "Arm2", + "normal": [ + 0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 115, + "position_m": [ + 0.21520570454160212, + -0.16407119091740335, + 0.23526352220818408 + ], + "position_mm": [ + 215.20570454160213, + -164.07119091740336, + 235.26352220818407 + ], + "link": "Arm2", + "normal": [ + -0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 120, + "position_m": [ + 0.26207563260277295, + -0.15142391851283918, + 0.16457336671884645 + ], + "position_mm": [ + 262.07563260277294, + -151.42391851283918, + 164.57336671884644 + ], + "link": "Arm2", + "normal": [ + 0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 198, + "position_m": [ + 0.1401176763349959, + -0.053084368955621304, + 0.09044519432731817 + ], + "position_mm": [ + 140.11767633499588, + -53.0843689556213, + 90.44519432731816 + ], + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 205, + "position_m": [ + 0.7500641972307318, + -0.09001017856939934, + 0.0004289399757762846 + ], + "position_mm": [ + 750.0641972307318, + -90.01017856939934, + 0.4289399757762846 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 206, + "position_m": [ + 0.6499702098169382, + -0.009650544300011906, + 0.00015273744134946916 + ], + "position_mm": [ + 649.9702098169382, + -9.650544300011907, + 0.15273744134946915 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 207, + "position_m": [ + 0.7507003895107062, + -0.009545816835936334, + -0.0003629801630851015 + ], + "position_mm": [ + 750.7003895107061, + -9.545816835936334, + -0.3629801630851015 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 208, + "position_m": [ + 0.34994352400747775, + -0.09007941354850589, + 0.0003278151400407232 + ], + "position_mm": [ + 349.9435240074777, + -90.0794135485059, + 0.32781514004072315 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 210, + "position_m": [ + 0.020065824263330253, + -0.020279807909172345, + 0.0004513029981910356 + ], + "position_mm": [ + 20.065824263330253, + -20.279807909172344, + 0.4513029981910356 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 211, + "position_m": [ + 0.25001182397417865, + -0.01008796199781918, + 0.00030860770915974104 + ], + "position_mm": [ + 250.01182397417864, + -10.087961997819178, + 0.30860770915974106 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 214, + "position_m": [ + 0.34999031439468603, + -0.010437662873963529, + 0.0005743177616843856 + ], + "position_mm": [ + 349.99031439468604, + -10.437662873963529, + 0.5743177616843855 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 215, + "position_m": [ + 0.24996641561707392, + -0.09002569095246064, + 0.0002973400146577166 + ], + "position_mm": [ + 249.96641561707392, + -90.02569095246065, + 0.2973400146577166 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 217, + "position_m": [ + 0.6502063551169979, + -0.0896972541168264, + 0.00011072429342850576 + ], + "position_mm": [ + 650.2063551169979, + -89.6972541168264, + 0.11072429342850576 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 219, + "position_m": [ + 0.2637535829345879, + -0.11884944118157345, + 0.2701123549464792 + ], + "position_mm": [ + 263.7535829345879, + -118.84944118157345, + 270.11235494647923 + ], + "link": "Arm2", + "normal": [ + 1.0, + 0.0, + 0.0 + ] + }, + { + "marker_id": 229, + "position_m": [ + 0.14000393766894376, + -0.14311774987389084, + 0.08736045768765369 + ], + "position_mm": [ + 140.00393766894376, + -143.11774987389083, + 87.36045768765369 + ], + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 232, + "position_m": [ + 0.22989513108893148, + -0.16844990202534146, + 0.0283362694163111 + ], + "position_mm": [ + 229.89513108893146, + -168.44990202534146, + 28.3362694163111 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.7071067811865475, + -0.7071067811865475 + ] + }, + { + "marker_id": 243, + "position_m": [ + 0.14016714918614823, + -0.17705235626357455, + 0.050734503636621894 + ], + "position_mm": [ + 140.16714918614824, + -177.05235626357455, + 50.734503636621895 + ], + "link": "Arm1", + "normal": [ + 0.0, + -1.0, + 0.0 + ] + }, + { + "marker_id": 244, + "position_m": [ + 0.2655544067155775, + -0.14209205384927726, + 0.052048751331276705 + ], + "position_mm": [ + 265.5544067155775, + -142.09205384927725, + 52.048751331276705 + ], + "link": "Ellbow", + "normal": [ + 1.0, + 0.0, + 0.0 + ] + }, + { + "marker_id": 245, + "position_m": [ + 0.22998663035637634, + -0.17703395539578365, + 0.05371866852125128 + ], + "position_mm": [ + 229.98663035637634, + -177.03395539578364, + 53.71866852125128 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + -1.0 + ] + }, + { + "marker_id": 248, + "position_m": [ + 0.19258167461200293, + -0.17711397644899018, + 0.05373163171935805 + ], + "position_mm": [ + 192.58167461200293, + -177.11397644899017, + 53.73163171935805 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + -1.0 + ] + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/aruco_positions_optimized.json b/data/evaluations/Scene7/aruco_positions_optimized.json new file mode 100644 index 0000000..2b71557 --- /dev/null +++ b/data/evaluations/Scene7/aruco_positions_optimized.json @@ -0,0 +1,1075 @@ +{ + "schema_version": "1.2", + "created_utc": "2026-06-01T18:52:19Z", + "summary": { + "num_cameras": 7, + "num_markers": 56, + "num_constraints": 94 + }, + "markers": [ + { + "marker_id": 41, + "position_m": [ + 0.23581545450574534, + -0.1129031553838974, + 0.3458291783012675 + ], + "position_mm": [ + 235.81545450574535, + -112.9031553838974, + 345.8291783012675 + ], + "link": "FingerA", + "normal": [ + 0.0, + -0.9375276894468237, + 0.34791066600565723 + ] + }, + { + "marker_id": 44, + "position_m": [ + 0.23410534246649753, + -0.16866051697476808, + 0.327512603389477 + ], + "position_mm": [ + 234.10534246649752, + -168.6605169747681, + 327.512603389477 + ], + "link": "FingerB", + "normal": [ + 0.0, + -0.9375276894468237, + -0.34791066600565723 + ] + }, + { + "marker_id": 45, + "position_m": [ + 0.2159877797530281, + -0.1658156885503344, + 0.37123789131275975 + ], + "position_mm": [ + 215.9877797530281, + -165.81568855033441, + 371.23789131275976 + ], + "link": "FingerB", + "normal": [ + -0.8830215713766957, + -0.3090575499818435, + -0.3532086285506783 + ] + }, + { + "marker_id": 46, + "position_m": [ + 0.536647001001488, + 0.18527916844652464, + -0.027400124634562685 + ], + "position_mm": [ + 536.647001001488, + 185.27916844652464, + -27.400124634562687 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 47, + "position_m": [ + 0.3443227642765709, + -0.2865814057733745, + -0.0272262371267256 + ], + "position_mm": [ + 344.32276427657087, + -286.5814057733745, + -27.2262371267256 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 51, + "position_m": [ + 0.1678771687815009, + -0.17207856229173232, + -0.027327093026287774 + ], + "position_mm": [ + 167.8771687815009, + -172.0785622917323, + -27.327093026287773 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 52, + "position_m": [ + 0.09467560805502569, + 0.20874527205172613, + -0.02723166428882632 + ], + "position_mm": [ + 94.67560805502569, + 208.74527205172615, + -27.23166428882632 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 53, + "position_m": [ + 0.4862091033300131, + 0.21217792671234376, + -0.027242862201573396 + ], + "position_mm": [ + 486.2091033300131, + 212.17792671234375, + -27.242862201573395 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 54, + "position_m": [ + 0.3422344563918994, + -0.33062547163225275, + -0.027167092144775386 + ], + "position_mm": [ + 342.2344563918994, + -330.62547163225275, + -27.167092144775385 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 55, + "position_m": [ + 0.2837858539222682, + -0.2626894901943688, + -0.027254490681412485 + ], + "position_mm": [ + 283.7858539222682, + -262.68949019436883, + -27.254490681412484 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 56, + "position_m": [ + 0.4985818897219848, + 0.16859191768888845, + -0.02708919693550124 + ], + "position_mm": [ + 498.5818897219848, + 168.59191768888846, + -27.08919693550124 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 58, + "position_m": [ + 0.05010257868650787, + -0.21800411329189248, + -0.02729479531029521 + ], + "position_mm": [ + 50.102578686507876, + -218.00411329189248, + -27.29479531029521 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 60, + "position_m": [ + 0.434351273196595, + 0.28366496308450245, + -0.027266002749226116 + ], + "position_mm": [ + 434.351273196595, + 283.66496308450246, + -27.266002749226118 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 61, + "position_m": [ + -0.022373498357367058, + 0.33638111229832673, + -0.027633047126883817 + ], + "position_mm": [ + -22.37349835736706, + 336.38111229832674, + -27.633047126883817 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 62, + "position_m": [ + 0.4046673667519076, + -0.17502595521172398, + -0.027414295464045852 + ], + "position_mm": [ + 404.6673667519076, + -175.02595521172398, + -27.414295464045853 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 63, + "position_m": [ + 0.7773854056100802, + -0.23622030857149576, + -0.02758653227524676 + ], + "position_mm": [ + 777.3854056100802, + -236.22030857149576, + -27.58653227524676 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 64, + "position_m": [ + -0.021305635907995918, + -0.18823984825276568, + -0.027433300283029965 + ], + "position_mm": [ + -21.305635907995917, + -188.23984825276568, + -27.433300283029965 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 66, + "position_m": [ + 0.20975282388389624, + -0.36323103110516153, + -0.027346518210279565 + ], + "position_mm": [ + 209.75282388389624, + -363.23103110516155, + -27.346518210279566 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 68, + "position_m": [ + 0.5736824103777304, + 0.17051839952875328, + -0.027264183630106676 + ], + "position_mm": [ + 573.6824103777304, + 170.5183995287533, + -27.264183630106675 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 69, + "position_m": [ + 0.007432935312335513, + -0.2809756796180995, + -0.0275022176421083 + ], + "position_mm": [ + 7.4329353123355135, + -280.9756796180995, + -27.5022176421083 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 72, + "position_m": [ + 0.44095248689592637, + 0.1942495527322781, + -0.02715967888375897 + ], + "position_mm": [ + 440.95248689592637, + 194.2495527322781, + -27.159678883758968 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 73, + "position_m": [ + 0.22174036952226314, + 0.33283655511458304, + -0.02698565594507903 + ], + "position_mm": [ + 221.74036952226314, + 332.83655511458306, + -26.98565594507903 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 79, + "position_m": [ + 0.3123602780123711, + -0.15899680130913382, + -0.02747611879112248 + ], + "position_mm": [ + 312.3602780123711, + -158.99680130913382, + -27.47611879112248 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 82, + "position_m": [ + 0.21931048002638595, + 0.29695716451250354, + -0.026822343773424295 + ], + "position_mm": [ + 219.31048002638596, + 296.95716451250354, + -26.822343773424294 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 83, + "position_m": [ + 0.044235474686533556, + 0.3391164890758611, + -0.027244374217603787 + ], + "position_mm": [ + 44.23547468653356, + 339.1164890758611, + -27.244374217603788 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 84, + "position_m": [ + 0.4074251136060768, + 0.2583348281322524, + -0.027389396474780763 + ], + "position_mm": [ + 407.4251136060768, + 258.33482813225237, + -27.389396474780764 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 85, + "position_m": [ + 0.5044677208132874, + -0.31279736300670263, + -0.027381425791991987 + ], + "position_mm": [ + 504.4677208132874, + -312.79736300670265, + -27.381425791991987 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 86, + "position_m": [ + 0.36305712031055, + 0.2922305729034816, + -0.02730168438112532 + ], + "position_mm": [ + 363.05712031055, + 292.2305729034816, + -27.30168438112532 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 92, + "position_m": [ + 0.645211821631339, + -0.184731740991162, + -0.027292333545045986 + ], + "position_mm": [ + 645.211821631339, + -184.73174099116198, + -27.292333545045985 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 95, + "position_m": [ + 0.18592212203488875, + -0.27410324276604214, + -0.027278963783408685 + ], + "position_mm": [ + 185.92212203488876, + -274.1032427660422, + -27.278963783408685 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 96, + "position_m": [ + 0.36976758175271934, + -0.18650715653123334, + -0.027257930625896435 + ], + "position_mm": [ + 369.76758175271937, + -186.50715653123333, + -27.257930625896435 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 97, + "position_m": [ + 0.30435578314779627, + -0.3597592154526448, + -0.027101374961886564 + ], + "position_mm": [ + 304.3557831477963, + -359.75921545264475, + -27.101374961886563 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 101, + "position_m": [ + 0.11785659612349576, + 0.2987039281209245, + -0.027277607389765625 + ], + "position_mm": [ + 117.85659612349576, + 298.7039281209245, + -27.277607389765624 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 102, + "position_m": [ + 0.6497801649925236, + -0.22289451541541516, + -0.027572364557016414 + ], + "position_mm": [ + 649.7801649925235, + -222.89451541541516, + -27.572364557016414 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 103, + "position_m": [ + 0.10579390720054259, + -0.1877350442079064, + -0.027236802734669628 + ], + "position_mm": [ + 105.79390720054259, + -187.7350442079064, + -27.236802734669627 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 105, + "position_m": [ + 0.5247176416253903, + -0.2662936578935862, + -0.027130756906343298 + ], + "position_mm": [ + 524.7176416253902, + -266.2936578935862, + -27.130756906343297 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 114, + "position_m": [ + 0.2697710222146749, + -0.17373476121151743, + 0.2357443758850383 + ], + "position_mm": [ + 269.77102221467493, + -173.73476121151742, + 235.7443758850383 + ], + "link": "Arm2", + "normal": [ + 0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 115, + "position_m": [ + 0.2205861144209824, + -0.16816702290008992, + 0.23621674844053456 + ], + "position_mm": [ + 220.5861144209824, + -168.16702290008993, + 236.21674844053456 + ], + "link": "Arm2", + "normal": [ + -0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 120, + "position_m": [ + 0.2884031471394226, + -0.22652130257304462, + 0.1937121987576784 + ], + "position_mm": [ + 288.40314713942263, + -226.5213025730446, + 193.7121987576784 + ], + "link": "Arm2", + "normal": [ + 0.7071067811865475, + 0.0, + -0.7071067811865475 + ] + }, + { + "marker_id": 198, + "position_m": [ + 0.12961346557308134, + -0.05388743962742977, + 0.09202977106765887 + ], + "position_mm": [ + 129.61346557308136, + -53.88743962742977, + 92.02977106765887 + ], + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 205, + "position_m": [ + 0.7500655427565549, + -0.09002692729510876, + 0.0004544796891334303 + ], + "position_mm": [ + 750.0655427565549, + -90.02692729510876, + 0.45447968913343034 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 206, + "position_m": [ + 0.6501389761808353, + -0.009831693309768864, + 0.00020992195051186628 + ], + "position_mm": [ + 650.1389761808352, + -9.831693309768864, + 0.20992195051186627 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 207, + "position_m": [ + 0.7501387876259883, + -0.010027302372756657, + 0.00022082798853610138 + ], + "position_mm": [ + 750.1387876259882, + -10.027302372756656, + 0.2208279885361014 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 208, + "position_m": [ + 0.3500126537942471, + -0.08997518425019015, + 0.00040855784139890436 + ], + "position_mm": [ + 350.0126537942471, + -89.97518425019014, + 0.4085578413989044 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 210, + "position_m": [ + 0.019968963783796687, + -0.020035526172169242, + 0.0003159008123033912 + ], + "position_mm": [ + 19.968963783796685, + -20.03552617216924, + 0.3159008123033912 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 211, + "position_m": [ + 0.24987634276964732, + -0.010024364991100555, + 0.00023576830971734 + ], + "position_mm": [ + 249.87634276964732, + -10.024364991100555, + 0.23576830971733997 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 214, + "position_m": [ + 0.3499102418224347, + -0.009975549272988627, + 0.00019096803123589196 + ], + "position_mm": [ + 349.91024182243467, + -9.975549272988626, + 0.19096803123589196 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 215, + "position_m": [ + 0.25005230700030423, + -0.09002388990289793, + 0.00044692003115506725 + ], + "position_mm": [ + 250.05230700030424, + -90.02388990289793, + 0.44692003115506723 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 217, + "position_m": [ + 0.6501861415715845, + -0.08983158836458073, + 8.854713646824647e-05 + ], + "position_mm": [ + 650.1861415715845, + -89.83158836458072, + 0.08854713646824647 + ], + "link": "Board", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 219, + "position_m": [ + 0.2829691601573491, + -0.14816128373462945, + 0.2712192045281235 + ], + "position_mm": [ + 282.96916015734905, + -148.16128373462945, + 271.2192045281235 + ], + "link": "Arm2", + "normal": [ + 1.0, + 0.0, + 0.0 + ] + }, + { + "marker_id": 229, + "position_m": [ + 0.1400386501626351, + -0.1431402181827354, + 0.0870040255957681 + ], + "position_mm": [ + 140.0386501626351, + -143.1402181827354, + 87.0040255957681 + ], + "link": "Arm1", + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + { + "marker_id": 232, + "position_m": [ + 0.20559190362925497, + -0.08981883172759916, + 0.01230943206541076 + ], + "position_mm": [ + 205.59190362925497, + -89.81883172759916, + 12.30943206541076 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.7071067811865475, + -0.7071067811865475 + ] + }, + { + "marker_id": 243, + "position_m": [ + 0.14010178144546304, + -0.17682530083823117, + 0.05073676006694866 + ], + "position_mm": [ + 140.10178144546305, + -176.82530083823116, + 50.73676006694866 + ], + "link": "Arm1", + "normal": [ + 0.0, + -1.0, + 0.0 + ] + }, + { + "marker_id": 244, + "position_m": [ + 0.25460596432259597, + -0.11452427141218771, + 0.038210650714228474 + ], + "position_mm": [ + 254.60596432259598, + -114.52427141218772, + 38.21065071422847 + ], + "link": "Ellbow", + "normal": [ + 1.0, + 0.0, + 0.0 + ] + }, + { + "marker_id": 245, + "position_m": [ + 0.20815730343083416, + -0.11499393227720721, + 0.021112540557491222 + ], + "position_mm": [ + 208.15730343083416, + -114.99393227720721, + 21.112540557491222 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + -1.0 + ] + }, + { + "marker_id": 248, + "position_m": [ + 0.18804250615168436, + -0.14360458364547202, + 0.03464923842675057 + ], + "position_mm": [ + 188.04250615168436, + -143.60458364547202, + 34.64923842675057 + ], + "link": "Ellbow", + "normal": [ + 0.0, + 0.0, + -1.0 + ] + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_a_aruco_detection.json b/data/evaluations/Scene7/render_a_aruco_detection.json new file mode 100644 index 0000000..c4702f3 --- /dev/null +++ b/data/evaluations/Scene7/render_a_aruco_detection.json @@ -0,0 +1,2154 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:02Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "a", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.png", + "image_sha256": "a88163ff6fd66d677e8ad79917a13b1778a43883c1df5dedf6fe4961034ee4d6", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 32, + "num_rejected_candidates": 15 + }, + "detections": [ + { + "observation_id": "10afab06-cad6-40f5-b175-8c8711a9bb38", + "type": "aruco", + "marker_id": 45, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 709.0, + 141.0 + ], + [ + 695.0, + 99.0 + ], + [ + 740.0, + 84.0 + ], + [ + 754.0, + 127.0 + ] + ], + "center_px": [ + 724.5, + 112.75 + ], + "quality": { + "area_px": 2115.5, + "perimeter_px": 184.05521774291992, + "sharpness": { + "laplacian_var": 1749.9742631992349 + }, + "contrast": { + "p05": 35.0, + "p95": 195.0, + "dynamic_range": 160.0, + "mean_gray": 110.70592286501378, + "std_gray": 74.52202804972626 + }, + "geometry": { + "distance_to_center_norm": 0.3558352589607239, + "distance_to_border_px": 84.0 + }, + "edge_ratio": 1.0714285591192536, + "edge_lengths_px": [ + 44.271888732910156, + 47.434165954589844, + 45.221675872802734, + 47.12748718261719 + ] + }, + "confidence": 0.933333344056117 + }, + { + "observation_id": "4503577d-47c6-42ce-8f31-474f4247768c", + "type": "aruco", + "marker_id": 115, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 736.0, + 345.0 + ], + [ + 694.0, + 351.0 + ], + [ + 693.0, + 314.0 + ], + [ + 736.0, + 309.0 + ] + ], + "center_px": [ + 714.75, + 329.75 + ], + "quality": { + "area_px": 1554.0, + "perimeter_px": 158.72964096069336, + "sharpness": { + "laplacian_var": 2183.517181853134 + }, + "contrast": { + "p05": 24.0, + "p95": 189.0, + "dynamic_range": 165.0, + "mean_gray": 59.57254901960784, + "std_gray": 62.4530382891154 + }, + "geometry": { + "distance_to_center_norm": 0.10981696099042892, + "distance_to_border_px": 309.0 + }, + "edge_ratio": 1.2024922900729709, + "edge_lengths_px": [ + 42.42640686035156, + 37.013511657714844, + 43.28972244262695, + 36.0 + ] + }, + "confidence": 0.8316061635117153 + }, + { + "observation_id": "2aa66b9a-c7ce-44b3-a366-986b70d8a82f", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 684.0, + 293.0 + ], + [ + 648.0, + 282.0 + ], + [ + 647.0, + 244.0 + ], + [ + 684.0, + 256.0 + ] + ], + "center_px": [ + 665.75, + 268.75 + ], + "quality": { + "area_px": 1363.0, + "perimeter_px": 151.55351638793945, + "sharpness": { + "laplacian_var": 2762.775689982668 + }, + "contrast": { + "p05": 23.0, + "p95": 186.0, + "dynamic_range": 163.0, + "mean_gray": 94.73326359832636, + "std_gray": 73.5972514482007 + }, + "geometry": { + "distance_to_center_norm": 0.12912070751190186, + "distance_to_border_px": 244.0 + }, + "edge_ratio": 1.0512783978436444, + "edge_lengths_px": [ + 37.64305877685547, + 38.01315689086914, + 38.897300720214844, + 37.0 + ] + }, + "confidence": 0.864344467203455 + }, + { + "observation_id": "ba278d3f-7cae-4201-b90f-5bcd5a23ef8a", + "type": "aruco", + "marker_id": 44, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 760.0, + 206.0 + ], + [ + 728.0, + 173.0 + ], + [ + 745.0, + 152.0 + ], + [ + 776.0, + 184.0 + ] + ], + "center_px": [ + 752.25, + 178.75 + ], + "quality": { + "area_px": 1213.5, + "perimeter_px": 144.74217224121094, + "sharpness": { + "laplacian_var": 2671.394479543906 + }, + "contrast": { + "p05": 12.0, + "p95": 183.0, + "dynamic_range": 171.0, + "mean_gray": 65.8059880239521, + "std_gray": 72.51410410040855 + }, + "geometry": { + "distance_to_center_norm": 0.2903352379798889, + "distance_to_border_px": 152.0 + }, + "edge_ratio": 1.70132904761024, + "edge_lengths_px": [ + 45.96738052368164, + 27.018512725830078, + 44.55333709716797, + 27.20294189453125 + ] + }, + "confidence": 0.47551060221792857 + }, + { + "observation_id": "c8741af7-529f-4c59-a7e0-58e90b60d6ed", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 688.0, + 450.0 + ], + [ + 653.0, + 438.0 + ], + [ + 652.0, + 404.0 + ], + [ + 687.0, + 417.0 + ] + ], + "center_px": [ + 670.0, + 427.25 + ], + "quality": { + "area_px": 1160.0, + "perimeter_px": 141.36615753173828, + "sharpness": { + "laplacian_var": 2590.622782218677 + }, + "contrast": { + "p05": 22.0, + "p95": 183.0, + "dynamic_range": 161.0, + "mean_gray": 71.08005082592122, + "std_gray": 68.1446062846497 + }, + "geometry": { + "distance_to_center_norm": 0.10028301179409027, + "distance_to_border_px": 270.0 + }, + "edge_ratio": 1.1308841426814007, + "edge_lengths_px": [ + 37.0, + 34.01470184326172, + 37.336307525634766, + 33.0151481628418 + ] + }, + "confidence": 0.6838307339774958 + }, + { + "observation_id": "1efec4df-f9b3-4cf8-81b0-fd6bb60b7a8d", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 559.0, + 557.0 + ], + [ + 592.0, + 541.0 + ], + [ + 615.0, + 564.0 + ], + [ + 582.0, + 580.0 + ] + ], + "center_px": [ + 587.0, + 560.5 + ], + "quality": { + "area_px": 1127.0, + "perimeter_px": 138.40230560302734, + "sharpness": { + "laplacian_var": 3163.6735058854642 + }, + "contrast": { + "p05": 12.0, + "p95": 181.0, + "dynamic_range": 169.0, + "mean_gray": 62.61480552070263, + "std_gray": 70.2754461055822 + }, + "geometry": { + "distance_to_center_norm": 0.2824268639087677, + "distance_to_border_px": 140.0 + }, + "edge_ratio": 1.1275044902884868, + "edge_lengths_px": [ + 36.67424011230469, + 32.526912689208984, + 36.67424011230469, + 32.526912689208984 + ] + }, + "confidence": 0.6663683735229249 + }, + { + "observation_id": "182ec1cb-0844-452a-b436-03db4e80c29a", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 984.0, + 710.0 + ], + [ + 957.0, + 687.0 + ], + [ + 985.0, + 672.0 + ], + [ + 1011.0, + 694.0 + ] + ], + "center_px": [ + 984.25, + 690.75 + ], + "quality": { + "area_px": 1029.5, + "perimeter_px": 132.67654037475586, + "sharpness": { + "laplacian_var": 3989.1355207300144 + }, + "contrast": { + "p05": 10.0, + "p95": 176.0, + "dynamic_range": 166.0, + "mean_gray": 69.34084507042253, + "std_gray": 72.23106034220386 + }, + "geometry": { + "distance_to_center_norm": 0.6501306891441345, + "distance_to_border_px": 10.0 + }, + "edge_ratio": 1.13011385794403, + "edge_lengths_px": [ + 35.46829605102539, + 31.764760971069336, + 34.058773040771484, + 31.38471031188965 + ] + }, + "confidence": 0.12146268776527554 + }, + { + "observation_id": "5cf0d300-c32c-436b-b25a-876ed3f76fd0", + "type": "aruco", + "marker_id": 248, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 707.0, + 575.0 + ], + [ + 707.0, + 605.0 + ], + [ + 676.0, + 621.0 + ], + [ + 675.0, + 591.0 + ] + ], + "center_px": [ + 691.25, + 598.0 + ], + "quality": { + "area_px": 953.0, + "perimeter_px": 130.67927932739258, + "sharpness": { + "laplacian_var": 3906.7727035634875 + }, + "contrast": { + "p05": 21.0, + "p95": 179.0, + "dynamic_range": 158.0, + "mean_gray": 93.31937984496125, + "std_gray": 70.7510342626015 + }, + "geometry": { + "distance_to_center_norm": 0.3315466046333313, + "distance_to_border_px": 99.0 + }, + "edge_ratio": 1.1925696055094401, + "edge_lengths_px": [ + 30.0, + 34.885528564453125, + 30.01666259765625, + 35.7770881652832 + ] + }, + "confidence": 0.5327431878174796 + }, + { + "observation_id": "94f12c51-f8c5-49d5-b9c3-c837d65269bb", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 605.0, + 632.0 + ], + [ + 638.0, + 615.0 + ], + [ + 637.0, + 643.0 + ], + [ + 604.0, + 660.0 + ] + ], + "center_px": [ + 621.0, + 637.5 + ], + "quality": { + "area_px": 907.0, + "perimeter_px": 130.27854537963867, + "sharpness": { + "laplacian_var": 2850.1541913737883 + }, + "contrast": { + "p05": 24.0, + "p95": 177.0, + "dynamic_range": 153.0, + "mean_gray": 79.10361842105263, + "std_gray": 67.44028147816702 + }, + "geometry": { + "distance_to_center_norm": 0.37879449129104614, + "distance_to_border_px": 60.0 + }, + "edge_ratio": 1.3249203865938097, + "edge_lengths_px": [ + 37.121421813964844, + 28.017850875854492, + 37.121421813964844, + 28.017850875854492 + ] + }, + "confidence": 0.4563796230965866 + }, + { + "observation_id": "dd27fc85-532a-40e1-a5fe-7844e54fdba5", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 298.0, + 629.0 + ], + [ + 333.0, + 614.0 + ], + [ + 350.0, + 635.0 + ], + [ + 315.0, + 650.0 + ] + ], + "center_px": [ + 324.0, + 632.0 + ], + "quality": { + "area_px": 990.0, + "perimeter_px": 130.19475555419922, + "sharpness": { + "laplacian_var": 3625.035017533784 + }, + "contrast": { + "p05": 20.0, + "p95": 182.0, + "dynamic_range": 162.0, + "mean_gray": 82.56047197640117, + "std_gray": 68.34418599317189 + }, + "geometry": { + "distance_to_center_norm": 0.5678059458732605, + "distance_to_border_px": 70.0 + }, + "edge_ratio": 1.4093619970008786, + "edge_lengths_px": [ + 38.07886505126953, + 27.018512725830078, + 38.07886505126953, + 27.018512725830078 + ] + }, + "confidence": 0.46829700346999537 + }, + { + "observation_id": "350fc6e8-b4b8-466a-8e50-9c00831554ca", + "type": "aruco", + "marker_id": 245, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 755.0, + 550.0 + ], + [ + 754.0, + 580.0 + ], + [ + 724.0, + 596.0 + ], + [ + 724.0, + 566.0 + ] + ], + "center_px": [ + 739.25, + 573.0 + ], + "quality": { + "area_px": 907.0, + "perimeter_px": 128.90219116210938, + "sharpness": { + "laplacian_var": 3067.22491904 + }, + "contrast": { + "p05": 20.0, + "p95": 179.0, + "dynamic_range": 159.0, + "mean_gray": 83.4528, + "std_gray": 70.06350099845139 + }, + "geometry": { + "distance_to_center_norm": 0.32001590728759766, + "distance_to_border_px": 124.0 + }, + "edge_ratio": 1.1628509521484376, + "edge_lengths_px": [ + 30.01666259765625, + 34.0, + 30.0, + 34.885528564453125 + ] + }, + "confidence": 0.5199863882378979 + }, + { + "observation_id": "ce76f802-a0c2-4f5e-863d-9fa56708424c", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 479.0, + 475.0 + ], + [ + 512.0, + 462.0 + ], + [ + 531.0, + 482.0 + ], + [ + 499.0, + 496.0 + ] + ], + "center_px": [ + 505.25, + 478.75 + ], + "quality": { + "area_px": 929.5, + "perimeter_px": 126.98302268981934, + "sharpness": { + "laplacian_var": 4688.606050431283 + }, + "contrast": { + "p05": 10.0, + "p95": 179.0, + "dynamic_range": 169.0, + "mean_gray": 84.62360446570973, + "std_gray": 73.27352756318807 + }, + "geometry": { + "distance_to_center_norm": 0.24459713697433472, + "distance_to_border_px": 224.0 + }, + "edge_ratio": 1.285724686546044, + "edge_lengths_px": [ + 35.46829605102539, + 27.58622932434082, + 34.928497314453125, + 29.0 + ] + }, + "confidence": 0.4819590641378537 + }, + { + "observation_id": "24b57695-3794-4529-98ec-46d57b54c8f4", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1186.0, + 628.0 + ], + [ + 1158.0, + 607.0 + ], + [ + 1181.0, + 593.0 + ], + [ + 1210.0, + 613.0 + ] + ], + "center_px": [ + 1183.75, + 610.25 + ], + "quality": { + "area_px": 895.0, + "perimeter_px": 125.45559501647949, + "sharpness": { + "laplacian_var": 3863.545233249095 + }, + "contrast": { + "p05": 9.0, + "p95": 172.0, + "dynamic_range": 163.0, + "mean_gray": 114.23636363636363, + "std_gray": 68.10413999381771 + }, + "geometry": { + "distance_to_center_norm": 0.8151581883430481, + "distance_to_border_px": 70.0 + }, + "edge_ratio": 1.3083287631564071, + "edge_lengths_px": [ + 35.0, + 26.925823211669922, + 35.22782897949219, + 28.301942825317383 + ] + }, + "confidence": 0.4560525484643318 + }, + { + "observation_id": "0899a0bf-874e-4d01-91ff-9223daec4948", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 812.0, + 616.0 + ], + [ + 789.0, + 596.0 + ], + [ + 816.0, + 582.0 + ], + [ + 839.0, + 602.0 + ] + ], + "center_px": [ + 814.0, + 599.0 + ], + "quality": { + "area_px": 862.0, + "perimeter_px": 121.78662872314453, + "sharpness": { + "laplacian_var": 4358.434037343129 + }, + "contrast": { + "p05": 13.0, + "p95": 175.0, + "dynamic_range": 162.0, + "mean_gray": 97.18350168350169, + "std_gray": 69.53260260804747 + }, + "geometry": { + "distance_to_center_norm": 0.402599573135376, + "distance_to_border_px": 104.0 + }, + "edge_ratio": 1.0021598438741428, + "edge_lengths_px": [ + 30.479501724243164, + 30.4138126373291, + 30.479501724243164, + 30.4138126373291 + ] + }, + "confidence": 0.5734281513866332 + }, + { + "observation_id": "56fe9357-4259-48ab-bd39-3176ba7ada31", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 904.0, + 604.0 + ], + [ + 880.0, + 584.0 + ], + [ + 907.0, + 571.0 + ], + [ + 930.0, + 590.0 + ] + ], + "center_px": [ + 905.25, + 587.25 + ], + "quality": { + "area_px": 834.0, + "perimeter_px": 120.57016181945801, + "sharpness": { + "laplacian_var": 3505.331484348662 + }, + "contrast": { + "p05": 11.0, + "p95": 174.0, + "dynamic_range": 163.0, + "mean_gray": 85.87985865724382, + "std_gray": 73.23699163776209 + }, + "geometry": { + "distance_to_center_norm": 0.47566938400268555, + "distance_to_border_px": 116.0 + }, + "edge_ratio": 1.057953735938787, + "edge_lengths_px": [ + 31.240999221801758, + 29.96664810180664, + 29.832868576049805, + 29.529645919799805 + ] + }, + "confidence": 0.525542829627259 + }, + { + "observation_id": "6fd151b7-c1c0-466b-b57b-548e6a2fddbc", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 930.0, + 573.0 + ], + [ + 906.0, + 555.0 + ], + [ + 932.0, + 542.0 + ], + [ + 956.0, + 560.0 + ] + ], + "center_px": [ + 931.0, + 557.5 + ], + "quality": { + "area_px": 780.0, + "perimeter_px": 118.13776779174805, + "sharpness": { + "laplacian_var": 2260.3994861913934 + }, + "contrast": { + "p05": 11.0, + "p95": 172.0, + "dynamic_range": 161.0, + "mean_gray": 41.554913294797686, + "std_gray": 54.648785522612734 + }, + "geometry": { + "distance_to_center_norm": 0.47894710302352905, + "distance_to_border_px": 147.0 + }, + "edge_ratio": 1.03203136754274, + "edge_lengths_px": [ + 30.0, + 29.068883895874023, + 30.0, + 29.068883895874023 + ] + }, + "confidence": 0.5038606541951498 + }, + { + "observation_id": "9823e332-dad7-44b2-bcbe-55c170534373", + "type": "aruco", + "marker_id": 105, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1151.0, + 576.0 + ], + [ + 1125.0, + 557.0 + ], + [ + 1150.0, + 545.0 + ], + [ + 1175.0, + 563.0 + ] + ], + "center_px": [ + 1150.25, + 560.25 + ], + "quality": { + "area_px": 772.0, + "perimeter_px": 118.03386306762695, + "sharpness": { + "laplacian_var": 2185.536022813356 + }, + "contrast": { + "p05": 9.0, + "p95": 169.0, + "dynamic_range": 160.0, + "mean_gray": 38.00381679389313, + "std_gray": 54.09953352309812 + }, + "geometry": { + "distance_to_center_norm": 0.7464743256568909, + "distance_to_border_px": 105.0 + }, + "edge_ratio": 1.1798077703177934, + "edge_lengths_px": [ + 32.202484130859375, + 27.73084831237793, + 30.805843353271484, + 27.294687271118164 + ] + }, + "confidence": 0.43622925667631085 + }, + { + "observation_id": "a81c2209-5c04-4cc1-af87-021d1ababad8", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 586.0, + 485.0 + ], + [ + 615.0, + 473.0 + ], + [ + 634.0, + 490.0 + ], + [ + 606.0, + 503.0 + ] + ], + "center_px": [ + 610.25, + 487.75 + ], + "quality": { + "area_px": 742.5, + "perimeter_px": 114.65775489807129, + "sharpness": { + "laplacian_var": 1599.1117019714918 + }, + "contrast": { + "p05": 6.0, + "p95": 138.0, + "dynamic_range": 132.0, + "mean_gray": 57.13409961685824, + "std_gray": 56.904144261652824 + }, + "geometry": { + "distance_to_center_norm": 0.1786298304796219, + "distance_to_border_px": 217.0 + }, + "edge_ratio": 1.2310095913943035, + "edge_lengths_px": [ + 31.38471031188965, + 25.495098114013672, + 30.870698928833008, + 26.90724754333496 + ] + }, + "confidence": 0.402108970929575 + }, + { + "observation_id": "7780d8ad-c866-48cd-bff6-b8ec89192478", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 769.0, + 489.0 + ], + [ + 796.0, + 478.0 + ], + [ + 817.0, + 495.0 + ], + [ + 790.0, + 508.0 + ] + ], + "center_px": [ + 793.0, + 492.5 + ], + "quality": { + "area_px": 738.0, + "perimeter_px": 114.45952606201172, + "sharpness": { + "laplacian_var": 2594.836908284024 + }, + "contrast": { + "p05": 8.0, + "p95": 160.0, + "dynamic_range": 152.0, + "mean_gray": 63.07692307692308, + "std_gray": 62.9715583399626 + }, + "geometry": { + "distance_to_center_norm": 0.2756340503692627, + "distance_to_border_px": 212.0 + }, + "edge_ratio": 1.1091153834370056, + "edge_lengths_px": [ + 29.154760360717773, + 27.018512725830078, + 29.96664810180664, + 28.319604873657227 + ] + }, + "confidence": 0.4435967685123575 + }, + { + "observation_id": "1cf791b0-fb7a-45dc-ac49-43f22b4a0bb6", + "type": "aruco", + "marker_id": 75, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 119.0, + 530.0 + ], + [ + 106.0, + 512.0 + ], + [ + 138.0, + 500.0 + ], + [ + 151.0, + 517.0 + ] + ], + "center_px": [ + 128.5, + 514.75 + ], + "quality": { + "area_px": 722.5, + "perimeter_px": 112.32038497924805, + "sharpness": { + "laplacian_var": 3751.4234447603176 + }, + "contrast": { + "p05": 10.0, + "p95": 173.0, + "dynamic_range": 163.0, + "mean_gray": 103.20990099009902, + "std_gray": 67.27531362069206 + }, + "geometry": { + "distance_to_center_norm": 0.7277610301971436, + "distance_to_border_px": 106.0 + }, + "edge_ratio": 1.6139404343199748, + "edge_lengths_px": [ + 22.203603744506836, + 34.1760139465332, + 21.40093421936035, + 34.539833068847656 + ] + }, + "confidence": 0.29844141482805986 + }, + { + "observation_id": "58e56cb0-a6d9-48c3-b4b6-ab4419a4200a", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1220.0, + 475.0 + ], + [ + 1194.0, + 459.0 + ], + [ + 1216.0, + 448.0 + ], + [ + 1241.0, + 464.0 + ] + ], + "center_px": [ + 1217.75, + 461.5 + ], + "quality": { + "area_px": 624.5, + "perimeter_px": 108.51360702514648, + "sharpness": { + "laplacian_var": 3016.9554224284193 + }, + "contrast": { + "p05": 9.0, + "p95": 167.0, + "dynamic_range": 158.0, + "mean_gray": 100.78747203579418, + "std_gray": 63.6449676032258 + }, + "geometry": { + "distance_to_center_norm": 0.7988508939743042, + "distance_to_border_px": 39.0 + }, + "edge_ratio": 1.2877744356086955, + "edge_lengths_px": [ + 30.528675079345703, + 24.59674835205078, + 29.681644439697266, + 23.706539154052734 + ] + }, + "confidence": 0.2521714913889437 + }, + { + "observation_id": "237370d3-77b0-4c71-8652-c12a6d0e4420", + "type": "aruco", + "marker_id": 92, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1174.0, + 451.0 + ], + [ + 1151.0, + 435.0 + ], + [ + 1172.0, + 425.0 + ], + [ + 1196.0, + 440.0 + ] + ], + "center_px": [ + 1173.25, + 437.75 + ], + "quality": { + "area_px": 580.0, + "perimeter_px": 104.17594909667969, + "sharpness": { + "laplacian_var": 2407.02611436031 + }, + "contrast": { + "p05": 10.0, + "p95": 167.0, + "dynamic_range": 157.0, + "mean_gray": 64.1990407673861, + "std_gray": 62.63361697282904 + }, + "geometry": { + "distance_to_center_norm": 0.733877956867218, + "distance_to_border_px": 84.0 + }, + "edge_ratio": 1.2167955430866773, + "edge_lengths_px": [ + 28.017850875854492, + 23.25940704345703, + 28.301942825317383, + 24.59674835205078 + ] + }, + "confidence": 0.31777455864589965 + }, + { + "observation_id": "48d82e54-7873-49ba-b297-204742c9322f", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1066.0, + 345.0 + ], + [ + 1087.0, + 335.0 + ], + [ + 1110.0, + 349.0 + ], + [ + 1088.0, + 359.0 + ] + ], + "center_px": [ + 1087.75, + 347.0 + ], + "quality": { + "area_px": 526.0, + "perimeter_px": 100.42813110351562, + "sharpness": { + "laplacian_var": 2736.852285162418 + }, + "contrast": { + "p05": 9.0, + "p95": 163.0, + "dynamic_range": 154.0, + "mean_gray": 70.99186991869918, + "std_gray": 60.64037167143027 + }, + "geometry": { + "distance_to_center_norm": 0.6100193858146667, + "distance_to_border_px": 170.0 + }, + "edge_ratio": 1.1576315407079247, + "edge_lengths_px": [ + 23.25940704345703, + 26.925823211669922, + 24.166091918945312, + 26.07680892944336 + ] + }, + "confidence": 0.3029173397022545 + }, + { + "observation_id": "92db358d-d787-4444-850d-ff36ee284cb1", + "type": "aruco", + "marker_id": 61, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 49.0, + 428.0 + ], + [ + 38.0, + 414.0 + ], + [ + 68.0, + 403.0 + ], + [ + 79.0, + 417.0 + ] + ], + "center_px": [ + 58.5, + 415.5 + ], + "quality": { + "area_px": 541.0, + "perimeter_px": 99.51516723632812, + "sharpness": { + "laplacian_var": 3849.6530234709217 + }, + "contrast": { + "p05": 9.55, + "p95": 168.0, + "dynamic_range": 158.45, + "mean_gray": 100.20161290322581, + "std_gray": 64.25913346721758 + }, + "geometry": { + "distance_to_center_norm": 0.7955067753791809, + "distance_to_border_px": 38.0 + }, + "edge_ratio": 1.7946644567002925, + "edge_lengths_px": [ + 17.804492950439453, + 31.95309066772461, + 17.804492950439453, + 31.95309066772461 + ] + }, + "confidence": 0.1527342148240039 + }, + { + "observation_id": "97e33310-8524-4f6e-965e-c50510668944", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 130.0, + 395.0 + ], + [ + 119.0, + 381.0 + ], + [ + 147.0, + 371.0 + ], + [ + 160.0, + 385.0 + ] + ], + "center_px": [ + 139.0, + 383.0 + ], + "quality": { + "area_px": 526.0, + "perimeter_px": 98.26437950134277, + "sharpness": { + "laplacian_var": 3414.3597222222224 + }, + "contrast": { + "p05": 10.0, + "p95": 166.0, + "dynamic_range": 156.0, + "mean_gray": 98.13333333333334, + "std_gray": 60.1098438970967 + }, + "geometry": { + "distance_to_center_norm": 0.6829988360404968, + "distance_to_border_px": 119.0 + }, + "edge_ratio": 1.7761121375104154, + "edge_lengths_px": [ + 17.804492950439453, + 29.73213768005371, + 19.10497283935547, + 31.62277603149414 + ] + }, + "confidence": 0.19743498130596515 + }, + { + "observation_id": "c4d75170-f9cd-4186-89e4-133ffabf9339", + "type": "aruco", + "marker_id": 206, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 992.0, + 299.0 + ], + [ + 1013.0, + 290.0 + ], + [ + 1034.0, + 303.0 + ], + [ + 1013.0, + 312.0 + ] + ], + "center_px": [ + 1013.0, + 301.0 + ], + "quality": { + "area_px": 462.0, + "perimeter_px": 95.09099197387695, + "sharpness": { + "laplacian_var": 2308.910220717834 + }, + "contrast": { + "p05": 11.0, + "p95": 162.0, + "dynamic_range": 151.0, + "mean_gray": 76.22151898734177, + "std_gray": 57.874878507428754 + }, + "geometry": { + "distance_to_center_norm": 0.5142804980278015, + "distance_to_border_px": 246.0 + }, + "edge_ratio": 1.0810098864013458, + "edge_lengths_px": [ + 22.847318649291992, + 24.698177337646484, + 22.847318649291992, + 24.698177337646484 + ] + }, + "confidence": 0.2849187633475991 + }, + { + "observation_id": "16ae02ef-0573-4844-ace7-c34ab17f620d", + "type": "aruco", + "marker_id": 207, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1078.0, + 260.0 + ], + [ + 1098.0, + 252.0 + ], + [ + 1118.0, + 264.0 + ], + [ + 1098.0, + 272.0 + ] + ], + "center_px": [ + 1098.0, + 262.0 + ], + "quality": { + "area_px": 400.0, + "perimeter_px": 89.72893142700195, + "sharpness": { + "laplacian_var": 1958.15234375 + }, + "contrast": { + "p05": 11.0, + "p95": 160.0, + "dynamic_range": 149.0, + "mean_gray": 75.99652777777777, + "std_gray": 56.80201350254824 + }, + "geometry": { + "distance_to_center_norm": 0.6378399133682251, + "distance_to_border_px": 162.0 + }, + "edge_ratio": 1.0827805600544524, + "edge_lengths_px": [ + 21.540658950805664, + 23.323806762695312, + 21.540658950805664, + 23.323806762695312 + ] + }, + "confidence": 0.24627951083020566 + }, + { + "observation_id": "b320d9a5-7e77-4245-a7eb-0af8fcf347cc", + "type": "aruco", + "marker_id": 73, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 337.0, + 322.0 + ], + [ + 325.0, + 310.0 + ], + [ + 350.0, + 301.0 + ], + [ + 363.0, + 313.0 + ] + ], + "center_px": [ + 343.75, + 311.5 + ], + "quality": { + "area_px": 418.5, + "perimeter_px": 88.74666213989258, + "sharpness": { + "laplacian_var": 3379.3514206008076 + }, + "contrast": { + "p05": 13.0, + "p95": 159.0, + "dynamic_range": 146.0, + "mean_gray": 99.68858131487889, + "std_gray": 51.60758146599528 + }, + "geometry": { + "distance_to_center_norm": 0.408814936876297, + "distance_to_border_px": 301.0 + }, + "edge_ratio": 1.6212564886481111, + "edge_lengths_px": [ + 16.970561981201172, + 26.570659637451172, + 17.69180679321289, + 27.513633728027344 + ] + }, + "confidence": 0.17208874842045807 + }, + { + "observation_id": "69a34de3-b56c-4773-98f8-a29c01800999", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 576.0, + 290.0 + ], + [ + 560.0, + 278.0 + ], + [ + 583.0, + 270.0 + ], + [ + 598.0, + 281.0 + ] + ], + "center_px": [ + 579.25, + 279.75 + ], + "quality": { + "area_px": 390.5, + "perimeter_px": 86.7223949432373, + "sharpness": { + "laplacian_var": 2477.236870659722 + }, + "contrast": { + "p05": 11.0, + "p95": 157.0, + "dynamic_range": 146.0, + "mean_gray": 88.89236111111111, + "std_gray": 52.21109872944895 + }, + "geometry": { + "distance_to_center_norm": 0.13707025349140167, + "distance_to_border_px": 270.0 + }, + "edge_ratio": 1.309149586031879, + "edge_lengths_px": [ + 20.0, + 24.351591110229492, + 18.601076126098633, + 23.76972770690918 + ] + }, + "confidence": 0.1988568274481309 + }, + { + "observation_id": "2ecb4c05-cc11-4e46-9ec9-fc668b006f6e", + "type": "aruco", + "marker_id": 68, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 793.0, + 272.0 + ], + [ + 776.0, + 261.0 + ], + [ + 797.0, + 253.0 + ], + [ + 814.0, + 264.0 + ] + ], + "center_px": [ + 795.0, + 262.5 + ], + "quality": { + "area_px": 367.0, + "perimeter_px": 85.44132232666016, + "sharpness": { + "laplacian_var": 2249.198416761353 + }, + "contrast": { + "p05": 9.0, + "p95": 152.89999999999998, + "dynamic_range": 143.89999999999998, + "mean_gray": 67.39575971731449, + "std_gray": 53.03481338501394 + }, + "geometry": { + "distance_to_center_norm": 0.24937330186367035, + "distance_to_border_px": 253.0 + }, + "edge_ratio": 1.1098230476704882, + "edge_lengths_px": [ + 20.248456954956055, + 22.472204208374023, + 20.248456954956055, + 22.472204208374023 + ] + }, + "confidence": 0.22045556467782906 + }, + { + "observation_id": "6fecf543-e273-4b80-bfbe-7f1fb26968e7", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 509.0, + 289.0 + ], + [ + 496.0, + 277.0 + ], + [ + 518.0, + 269.0 + ], + [ + 533.0, + 280.0 + ] + ], + "center_px": [ + 514.0, + 278.75 + ], + "quality": { + "area_px": 383.5, + "perimeter_px": 85.33429336547852, + "sharpness": { + "laplacian_var": 3037.6686579052166 + }, + "contrast": { + "p05": 10.0, + "p95": 157.0, + "dynamic_range": 147.0, + "mean_gray": 82.10752688172043, + "std_gray": 60.03848151263045 + }, + "geometry": { + "distance_to_center_norm": 0.20417363941669464, + "distance_to_border_px": 269.0 + }, + "edge_ratio": 1.448806880674699, + "edge_lengths_px": [ + 17.69180679321289, + 23.409399032592773, + 18.601076126098633, + 25.63201141357422 + ] + }, + "confidence": 0.17646704338372862 + }, + { + "observation_id": "493b6081-f759-4709-a919-13ade4db5719", + "type": "aruco", + "marker_id": 93, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1103.0, + 162.0 + ], + [ + 1088.0, + 153.0 + ], + [ + 1105.0, + 147.0 + ], + [ + 1121.0, + 156.0 + ] + ], + "center_px": [ + 1104.25, + 154.5 + ], + "quality": { + "area_px": 250.5, + "perimeter_px": 72.85183525085449, + "sharpness": { + "laplacian_var": 2773.2301216918713 + }, + "contrast": { + "p05": 12.0, + "p95": 141.24999999999997, + "dynamic_range": 129.24999999999997, + "mean_gray": 71.72282608695652, + "std_gray": 45.63041892360476 + }, + "geometry": { + "distance_to_center_norm": 0.6914032101631165, + "distance_to_border_px": 147.0 + }, + "edge_ratio": 1.0846522857079928, + "edge_lengths_px": [ + 17.492855072021484, + 18.027755737304688, + 18.357559204101562, + 18.973665237426758 + ] + }, + "confidence": 0.15396639291733288 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 1022.0, + 383.0 + ], + [ + 882.0, + 460.0 + ], + [ + 829.0, + 444.0 + ], + [ + 963.0, + 382.0 + ] + ], + "center_px": [ + 924.0, + 417.25 + ], + "area_px": 5056.5 + }, + { + "image_points_px": [ + [ + 1152.0, + 303.0 + ], + [ + 1172.0, + 294.0 + ], + [ + 1194.0, + 307.0 + ], + [ + 1174.0, + 316.0 + ] + ], + "center_px": [ + 1173.0, + 305.0 + ], + "area_px": 458.0 + }, + { + "image_points_px": [ + [ + 381.0, + 335.0 + ], + [ + 356.0, + 344.0 + ], + [ + 343.0, + 331.0 + ], + [ + 369.0, + 322.0 + ] + ], + "center_px": [ + 362.25, + 333.0 + ], + "area_px": 444.0 + }, + { + "image_points_px": [ + [ + 318.0, + 584.0 + ], + [ + 288.0, + 598.0 + ], + [ + 281.0, + 589.0 + ], + [ + 309.0, + 576.0 + ] + ], + "center_px": [ + 299.0, + 586.75 + ], + "area_px": 354.5 + }, + { + "image_points_px": [ + [ + 875.0, + 223.0 + ], + [ + 896.0, + 216.0 + ], + [ + 912.0, + 226.0 + ], + [ + 892.0, + 234.0 + ] + ], + "center_px": [ + 893.75, + 224.75 + ], + "area_px": 339.0 + }, + { + "image_points_px": [ + [ + 606.0, + 258.0 + ], + [ + 584.0, + 266.0 + ], + [ + 570.0, + 255.0 + ], + [ + 593.0, + 247.0 + ] + ], + "center_px": [ + 588.25, + 256.5 + ], + "area_px": 355.5 + }, + { + "image_points_px": [ + [ + 965.0, + 181.0 + ], + [ + 985.0, + 175.0 + ], + [ + 1001.0, + 185.0 + ], + [ + 984.0, + 192.0 + ] + ], + "center_px": [ + 983.75, + 183.25 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 1020.0, + 158.0 + ], + [ + 1037.0, + 152.0 + ], + [ + 1054.0, + 161.0 + ], + [ + 1037.0, + 168.0 + ] + ], + "center_px": [ + 1037.0, + 159.75 + ], + "area_px": 272.0 + }, + { + "image_points_px": [ + [ + 935.0, + 146.0 + ], + [ + 953.0, + 140.0 + ], + [ + 968.0, + 149.0 + ], + [ + 951.0, + 156.0 + ] + ], + "center_px": [ + 951.75, + 147.75 + ], + "area_px": 267.0 + }, + { + "image_points_px": [ + [ + 793.0, + 140.0 + ], + [ + 811.0, + 134.0 + ], + [ + 825.0, + 143.0 + ], + [ + 807.0, + 150.0 + ] + ], + "center_px": [ + 809.0, + 141.75 + ], + "area_px": 262.0 + }, + { + "image_points_px": [ + [ + 834.0, + 133.0 + ], + [ + 850.0, + 126.0 + ], + [ + 866.0, + 136.0 + ], + [ + 848.0, + 142.0 + ] + ], + "center_px": [ + 849.5, + 134.25 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 1009.0, + 294.0 + ], + [ + 1014.0, + 292.0 + ], + [ + 1031.0, + 303.0 + ], + [ + 1024.0, + 305.0 + ] + ], + "center_px": [ + 1019.5, + 298.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 518.0, + 450.0 + ], + [ + 520.0, + 448.0 + ], + [ + 537.0, + 465.0 + ], + [ + 527.0, + 459.0 + ] + ], + "center_px": [ + 525.5, + 455.5 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 699.0, + 331.0 + ], + [ + 716.0, + 329.0 + ], + [ + 716.0, + 337.0 + ], + [ + 700.0, + 339.0 + ] + ], + "center_px": [ + 707.75, + 334.0 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 744.0, + 511.0 + ], + [ + 744.0, + 526.0 + ], + [ + 740.0, + 532.0 + ], + [ + 740.0, + 515.0 + ] + ], + "center_px": [ + 742.0, + 521.0 + ], + "area_px": 64.0 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_a_camera_pose.json b/data/evaluations/Scene7/render_a_camera_pose.json new file mode 100644 index 0000000..85e6fca --- /dev/null +++ b/data/evaluations/Scene7/render_a_camera_pose.json @@ -0,0 +1,509 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:06Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_a_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "a", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 22, + "used_marker_ids": [ + 47, + 210, + 85, + 79, + 96, + 62, + 105, + 211, + 208, + 75, + 102, + 92, + 217, + 61, + 83, + 206, + 207, + 73, + 84, + 68, + 86, + 93 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.012553833727438159, + 0.0008956966242792113, + 8.92087181419201e-05, + 8.913910695589422e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.22411257524885828, + "residual_median_px": 0.19879851753220182, + "residual_max_px": 0.3595096346306234, + "sigma2_normalized": 9.200377290845654e-09 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.8080273270606995, + -0.5891450047492981, + 0.0002487859455868602 + ], + [ + -0.3431875705718994, + -0.47103363275527954, + -0.8126189708709717 + ], + [ + 0.4788675904273987, + 0.6565329432487488, + -0.582795262336731 + ] + ], + "translation_m": [ + -0.22886477410793304, + 0.17077884078025818, + 1.1346683502197266 + ], + "rvec_rad": [ + 2.106390904595778, + -0.6862178660237623, + 0.3526404948696007 + ] + }, + "camera_in_world": { + "position_m": [ + -0.2998177111148834, + -0.7993391156196594, + 0.8001143932342529 + ], + "position_mm": [ + -299.8177185058594, + -799.339111328125, + 800.1143798828125 + ], + "orientation_deg": { + "roll": 131.5950164794922, + "pitch": -28.611467361450195, + "yaw": -23.012033462524414 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 4.0352341834101635e-08, + -1.2176139731112615e-08, + -9.185549458822521e-10, + 1.9920715565502193e-09, + 6.646867526080053e-09, + 1.1357187033307382e-08 + ], + [ + -1.21761397311127e-08, + 1.9966363371942727e-08, + -8.750842672845864e-09, + -4.542331936533281e-09, + -5.1988254903407205e-09, + -1.5762890044808953e-09 + ], + [ + -9.185549458822324e-10, + -8.750842672845925e-09, + 5.3186396266350315e-08, + 8.38053515486003e-09, + -5.132424793070352e-09, + -1.1777918990218518e-08 + ], + [ + 1.9920715565502375e-09, + -4.542331936533298e-09, + 8.38053515486004e-09, + 2.672806578193673e-09, + 2.939244752461043e-10, + -1.1957553902298092e-10 + ], + [ + 6.6468675260800715e-09, + -5.19882549034072e-09, + -5.132424793070366e-09, + 2.9392447524610235e-10, + 3.4486601208874437e-09, + 3.883370670525844e-09 + ], + [ + 1.1357187033307364e-08, + -1.5762890044809687e-09, + -1.1777918990218545e-08, + -1.1957553902296474e-10, + 3.883370670525871e-09, + 2.0643567828792927e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.011509514499353715, + 0.00809603016694327, + 0.013213653521922532 + ], + "tvec_std_m": [ + 5.169919320640964e-05, + 5.872529370626803e-05, + 0.00014367869650297127 + ] + }, + "camera_center_std_m": [ + 0.00022717896925085273, + 0.0002280382619963859, + 0.0002652434228270568 + ], + "camera_center_std_mm": [ + 0.22717896925085274, + 0.22803826199638588, + 0.2652434228270568 + ], + "orientation_std_deg": { + "roll": 0.01463827065295263, + "pitch": 0.010888868700885165, + "yaw": 0.007981047253143097 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 47, + "observed_center_px": [ + 984.25, + 690.75 + ], + "projected_center_px": [ + 983.9329833984375, + 690.8571166992188 + ], + "reprojection_error_px": 0.33462443562560856, + "confidence": 0.12146268776527554 + }, + { + "marker_id": 210, + "observed_center_px": [ + 324.0, + 632.0 + ], + "projected_center_px": [ + 324.1624755859375, + 632.0913696289062 + ], + "reprojection_error_px": 0.18640473468289315, + "confidence": 0.46829700346999537 + }, + { + "marker_id": 85, + "observed_center_px": [ + 1183.75, + 610.25 + ], + "projected_center_px": [ + 1183.87158203125, + 610.3134155273438 + ], + "reprojection_error_px": 0.13712665470710603, + "confidence": 0.4560525484643318 + }, + { + "marker_id": 79, + "observed_center_px": [ + 814.0, + 599.0 + ], + "projected_center_px": [ + 814.2798461914062, + 598.9842529296875 + ], + "reprojection_error_px": 0.2802888885917712, + "confidence": 0.5734281513866332 + }, + { + "marker_id": 96, + "observed_center_px": [ + 905.25, + 587.25 + ], + "projected_center_px": [ + 905.1922607421875, + 587.0226440429688 + ], + "reprojection_error_px": 0.23457312951472925, + "confidence": 0.525542829627259 + }, + { + "marker_id": 62, + "observed_center_px": [ + 931.0, + 557.5 + ], + "projected_center_px": [ + 931.0811767578125, + 557.4605712890625 + ], + "reprojection_error_px": 0.09024571599329362, + "confidence": 0.5038606541951498 + }, + { + "marker_id": 105, + "observed_center_px": [ + 1150.25, + 560.25 + ], + "projected_center_px": [ + 1150.0687255859375, + 560.3014526367188 + ], + "reprojection_error_px": 0.18843510028392896, + "confidence": 0.43622925667631085 + }, + { + "marker_id": 211, + "observed_center_px": [ + 610.25, + 487.75 + ], + "projected_center_px": [ + 610.1248168945312, + 487.4557800292969 + ], + "reprojection_error_px": 0.3197439617183535, + "confidence": 0.402108970929575 + }, + { + "marker_id": 208, + "observed_center_px": [ + 793.0, + 492.5 + ], + "projected_center_px": [ + 792.98779296875, + 492.7422790527344 + ], + "reprojection_error_px": 0.24258637844241077, + "confidence": 0.4435967685123575 + }, + { + "marker_id": 75, + "observed_center_px": [ + 128.5, + 514.75 + ], + "projected_center_px": [ + 128.4774627685547, + 514.646728515625 + ], + "reprojection_error_px": 0.10570206377472226, + "confidence": 0.29844141482805986 + }, + { + "marker_id": 102, + "observed_center_px": [ + 1217.75, + 461.5 + ], + "projected_center_px": [ + 1217.786865234375, + 461.4237976074219 + ], + "reprojection_error_px": 0.08465134458562582, + "confidence": 0.2521714913889437 + }, + { + "marker_id": 92, + "observed_center_px": [ + 1173.25, + 437.75 + ], + "projected_center_px": [ + 1173.1141357421875, + 437.9090270996094 + ], + "reprojection_error_px": 0.20916193478047468, + "confidence": 0.31777455864589965 + }, + { + "marker_id": 217, + "observed_center_px": [ + 1087.75, + 347.0 + ], + "projected_center_px": [ + 1087.917236328125, + 346.9950866699219 + ], + "reprojection_error_px": 0.1673084882998746, + "confidence": 0.3029173397022545 + }, + { + "marker_id": 61, + "observed_center_px": [ + 58.5, + 415.5 + ], + "projected_center_px": [ + 58.64896774291992, + 415.5035095214844 + ], + "reprojection_error_px": 0.1490090774808878, + "confidence": 0.1527342148240039 + }, + { + "marker_id": 83, + "observed_center_px": [ + 139.0, + 383.0 + ], + "projected_center_px": [ + 138.91104125976562, + 382.9791259765625 + ], + "reprojection_error_px": 0.09137495454749243, + "confidence": 0.19743498130596515 + }, + { + "marker_id": 206, + "observed_center_px": [ + 1013.0, + 301.0 + ], + "projected_center_px": [ + 1013.3508911132812, + 300.9217529296875 + ], + "reprojection_error_px": 0.3595096346306234, + "confidence": 0.2849187633475991 + }, + { + "marker_id": 207, + "observed_center_px": [ + 1098.0, + 262.0 + ], + "projected_center_px": [ + 1097.9266357421875, + 261.7966613769531 + ], + "reprojection_error_px": 0.2161687071409229, + "confidence": 0.24627951083020566 + }, + { + "marker_id": 73, + "observed_center_px": [ + 343.75, + 311.5 + ], + "projected_center_px": [ + 343.6452941894531, + 311.7585754394531 + ], + "reprojection_error_px": 0.27897054441402014, + "confidence": 0.17208874842045807 + }, + { + "marker_id": 84, + "observed_center_px": [ + 579.25, + 279.75 + ], + "projected_center_px": [ + 579.165283203125, + 279.5132751464844 + ], + "reprojection_error_px": 0.25142711060017797, + "confidence": 0.1988568274481309 + }, + { + "marker_id": 68, + "observed_center_px": [ + 795.0, + 262.5 + ], + "projected_center_px": [ + 795.1717529296875, + 262.5036926269531 + ], + "reprojection_error_px": 0.1717926201850774, + "confidence": 0.22045556467782906 + }, + { + "marker_id": 86, + "observed_center_px": [ + 514.0, + 278.75 + ], + "projected_center_px": [ + 513.7286987304688, + 278.9452819824219 + ], + "reprojection_error_px": 0.3342744852780204, + "confidence": 0.17646704338372862 + }, + { + "marker_id": 93, + "observed_center_px": [ + 1104.25, + 154.5 + ], + "projected_center_px": [ + 1104.1920166015625, + 154.6373748779297 + ], + "reprojection_error_px": 0.14911046770954217, + "confidence": 0.15396639291733288 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_b_aruco_detection.json b/data/evaluations/Scene7/render_b_aruco_detection.json new file mode 100644 index 0000000..a836ac0 --- /dev/null +++ b/data/evaluations/Scene7/render_b_aruco_detection.json @@ -0,0 +1,3014 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:02Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "b", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_b.png", + "image_sha256": "88b589ba522d5865dc3883c2b4b92f7192b3490637b584098520bd57c7c38477", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 47, + "num_rejected_candidates": 17 + }, + "detections": [ + { + "observation_id": "21cc6a5f-aac0-498c-b937-4b2b09d64779", + "type": "aruco", + "marker_id": 44, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 513.0, + 349.0 + ], + [ + 499.0, + 314.0 + ], + [ + 532.0, + 299.0 + ], + [ + 547.0, + 334.0 + ] + ], + "center_px": [ + 522.75, + 324.0 + ], + "quality": { + "area_px": 1390.0, + "perimeter_px": 149.18596649169922, + "sharpness": { + "laplacian_var": 2133.9193105855193 + }, + "contrast": { + "p05": 20.0, + "p95": 184.0, + "dynamic_range": 164.0, + "mean_gray": 68.9181347150259, + "std_gray": 68.53665508923841 + }, + "geometry": { + "distance_to_center_norm": 0.16703228652477264, + "distance_to_border_px": 299.0 + }, + "edge_ratio": 1.0504764328185843, + "edge_lengths_px": [ + 37.6961555480957, + 36.24913787841797, + 38.07886505126953, + 37.161808013916016 + ] + }, + "confidence": 0.8821394157128136 + }, + { + "observation_id": "1587ea11-d826-4727-bb82-a052036aceee", + "type": "aruco", + "marker_id": 45, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 480.0, + 288.0 + ], + [ + 471.0, + 257.0 + ], + [ + 501.0, + 263.0 + ], + [ + 509.0, + 295.0 + ] + ], + "center_px": [ + 490.25, + 275.75 + ], + "quality": { + "area_px": 874.0, + "perimeter_px": 125.69185447692871, + "sharpness": { + "laplacian_var": 2598.5505107340723 + }, + "contrast": { + "p05": 32.0, + "p95": 194.0, + "dynamic_range": 162.0, + "mean_gray": 114.22039473684211, + "std_gray": 73.02600099209057 + }, + "geometry": { + "distance_to_center_norm": 0.23399482667446136, + "distance_to_border_px": 257.0 + }, + "edge_ratio": 1.105654460404264, + "edge_lengths_px": [ + 32.280025482177734, + 30.5941162109375, + 32.98484420776367, + 29.832868576049805 + ] + }, + "confidence": 0.5269880306489465 + }, + { + "observation_id": "e8b5d103-e25e-4f88-bf90-d9aec0ecde2b", + "type": "aruco", + "marker_id": 63, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1234.0, + 693.0 + ], + [ + 1227.0, + 665.0 + ], + [ + 1258.0, + 665.0 + ], + [ + 1265.0, + 692.0 + ] + ], + "center_px": [ + 1246.0, + 678.75 + ], + "quality": { + "area_px": 856.0, + "perimeter_px": 118.77051544189453, + "sharpness": { + "laplacian_var": 2498.9973819350867 + }, + "contrast": { + "p05": 8.0, + "p95": 163.0, + "dynamic_range": 155.0, + "mean_gray": 46.49348534201955, + "std_gray": 60.60285458307936 + }, + "geometry": { + "distance_to_center_norm": 0.9324730634689331, + "distance_to_border_px": 15.0 + }, + "edge_ratio": 1.1119819756612892, + "edge_lengths_px": [ + 28.861740112304688, + 31.0, + 27.892650604248047, + 31.016124725341797 + ] + }, + "confidence": 0.1539593300495616 + }, + { + "observation_id": "e32c4185-6956-4158-83cd-ced29ba6c7eb", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 400.0, + 491.0 + ], + [ + 432.0, + 490.0 + ], + [ + 430.0, + 517.0 + ], + [ + 398.0, + 517.0 + ] + ], + "center_px": [ + 415.0, + 503.75 + ], + "quality": { + "area_px": 847.0, + "perimeter_px": 117.16640281677246, + "sharpness": { + "laplacian_var": 2881.784243952975 + }, + "contrast": { + "p05": 14.0, + "p95": 181.0, + "dynamic_range": 167.0, + "mean_gray": 65.26845637583892, + "std_gray": 70.11834491479657 + }, + "geometry": { + "distance_to_center_norm": 0.3636105954647064, + "distance_to_border_px": 203.0 + }, + "edge_ratio": 1.2277430598171792, + "edge_lengths_px": [ + 32.015621185302734, + 27.073972702026367, + 32.0, + 26.07680892944336 + ] + }, + "confidence": 0.4599225075242942 + }, + { + "observation_id": "8e07856b-3677-4dd1-adb0-1349ce397e44", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1065.0, + 679.0 + ], + [ + 1061.0, + 652.0 + ], + [ + 1091.0, + 652.0 + ], + [ + 1096.0, + 679.0 + ] + ], + "center_px": [ + 1078.25, + 665.5 + ], + "quality": { + "area_px": 823.5, + "perimeter_px": 115.75374794006348, + "sharpness": { + "laplacian_var": 3066.533199446265 + }, + "contrast": { + "p05": 9.0, + "p95": 167.0, + "dynamic_range": 158.0, + "mean_gray": 93.2350936967632, + "std_gray": 69.64421089258983 + }, + "geometry": { + "distance_to_center_norm": 0.7275234460830688, + "distance_to_border_px": 41.0 + }, + "edge_ratio": 1.1357521590951734, + "edge_lengths_px": [ + 27.294687271118164, + 30.0, + 27.459060668945312, + 31.0 + ] + }, + "confidence": 0.39637168760361213 + }, + { + "observation_id": "aa098d00-9953-44b9-93fb-f83904c337cd", + "type": "aruco", + "marker_id": 58, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 290.0, + 682.0 + ], + [ + 294.0, + 655.0 + ], + [ + 324.0, + 654.0 + ], + [ + 321.0, + 681.0 + ] + ], + "center_px": [ + 307.25, + 668.0 + ], + "quality": { + "area_px": 820.0, + "perimeter_px": 115.4936294555664, + "sharpness": { + "laplacian_var": 3363.4314599361983 + }, + "contrast": { + "p05": 17.0, + "p95": 182.0, + "dynamic_range": 165.0, + "mean_gray": 76.61301369863014, + "std_gray": 71.08725755582383 + }, + "geometry": { + "distance_to_center_norm": 0.6174793243408203, + "distance_to_border_px": 38.0 + }, + "edge_ratio": 1.1417193520219107, + "edge_lengths_px": [ + 27.294687271118164, + 30.01666259765625, + 27.166154861450195, + 31.016124725341797 + ] + }, + "confidence": 0.3638956157928849 + }, + { + "observation_id": "259fb1c6-1a06-4e71-914a-95b95a24ffdc", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 203.0, + 649.0 + ], + [ + 207.0, + 623.0 + ], + [ + 238.0, + 622.0 + ], + [ + 234.0, + 648.0 + ] + ], + "center_px": [ + 220.5, + 635.5 + ], + "quality": { + "area_px": 802.0, + "perimeter_px": 114.64403533935547, + "sharpness": { + "laplacian_var": 3191.5154759220536 + }, + "contrast": { + "p05": 16.0, + "p95": 182.0, + "dynamic_range": 166.0, + "mean_gray": 75.42003514938489, + "std_gray": 71.76830778840139 + }, + "geometry": { + "distance_to_center_norm": 0.6834745407104492, + "distance_to_border_px": 71.0 + }, + "edge_ratio": 1.1790561449851884, + "edge_lengths_px": [ + 26.305892944335938, + 31.016124725341797, + 26.305892944335938, + 31.016124725341797 + ] + }, + "confidence": 0.4534700649674178 + }, + { + "observation_id": "fbb43e0c-1c4a-4e0c-a23e-f5b6e937106f", + "type": "aruco", + "marker_id": 92, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1052.0, + 636.0 + ], + [ + 1047.0, + 610.0 + ], + [ + 1077.0, + 609.0 + ], + [ + 1082.0, + 636.0 + ] + ], + "center_px": [ + 1064.5, + 622.75 + ], + "quality": { + "area_px": 797.5, + "perimeter_px": 113.95212745666504, + "sharpness": { + "laplacian_var": 2845.338841104572 + }, + "contrast": { + "p05": 9.0, + "p95": 167.0, + "dynamic_range": 158.0, + "mean_gray": 56.648936170212764, + "std_gray": 64.96751082970067 + }, + "geometry": { + "distance_to_center_norm": 0.6798796653747559, + "distance_to_border_px": 84.0 + }, + "edge_ratio": 1.1337137166428901, + "edge_lengths_px": [ + 26.476404190063477, + 30.01666259765625, + 27.459060668945312, + 30.0 + ] + }, + "confidence": 0.46896024883690896 + }, + { + "observation_id": "79bd5703-32d1-483c-a81b-03ccd9a4769d", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 702.0, + 641.0 + ], + [ + 701.0, + 615.0 + ], + [ + 731.0, + 615.0 + ], + [ + 733.0, + 641.0 + ] + ], + "center_px": [ + 716.75, + 628.0 + ], + "quality": { + "area_px": 793.0, + "perimeter_px": 113.09603309631348, + "sharpness": { + "laplacian_var": 2705.3577994477646 + }, + "contrast": { + "p05": 12.0, + "p95": 174.0, + "dynamic_range": 162.0, + "mean_gray": 82.41889483065954, + "std_gray": 73.22028102826985 + }, + "geometry": { + "distance_to_center_norm": 0.3796437680721283, + "distance_to_border_px": 79.0 + }, + "edge_ratio": 1.1914267620428063, + "edge_lengths_px": [ + 26.019224166870117, + 30.0, + 26.07680892944336, + 31.0 + ] + }, + "confidence": 0.44372569385651617 + }, + { + "observation_id": "01e0e29c-ce32-4a2d-bb32-7b23f9610c07", + "type": "aruco", + "marker_id": 115, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 518.0, + 423.0 + ], + [ + 487.0, + 412.0 + ], + [ + 485.0, + 389.0 + ], + [ + 517.0, + 401.0 + ] + ], + "center_px": [ + 501.75, + 406.25 + ], + "quality": { + "area_px": 691.5, + "perimeter_px": 112.17928886413574, + "sharpness": { + "laplacian_var": 3162.4572500718186 + }, + "contrast": { + "p05": 32.0, + "p95": 188.0, + "dynamic_range": 156.0, + "mean_gray": 68.20338983050847, + "std_gray": 57.73625881306641 + }, + "geometry": { + "distance_to_center_norm": 0.19853004813194275, + "distance_to_border_px": 297.0 + }, + "edge_ratio": 1.5518529184163337, + "edge_lengths_px": [ + 32.893768310546875, + 23.0867919921875, + 34.1760139465332, + 22.022714614868164 + ] + }, + "confidence": 0.2970642349730222 + }, + { + "observation_id": "97b57e24-683d-4813-afe6-f8f43e684ea8", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 366.0, + 646.0 + ], + [ + 368.0, + 620.0 + ], + [ + 398.0, + 620.0 + ], + [ + 396.0, + 646.0 + ] + ], + "center_px": [ + 382.0, + 633.0 + ], + "quality": { + "area_px": 780.0, + "perimeter_px": 112.15361785888672, + "sharpness": { + "laplacian_var": 3168.091623140496 + }, + "contrast": { + "p05": 19.0, + "p95": 181.0, + "dynamic_range": 162.0, + "mean_gray": 114.67636363636363, + "std_gray": 71.86761051629804 + }, + "geometry": { + "distance_to_center_norm": 0.5115378499031067, + "distance_to_border_px": 74.0 + }, + "edge_ratio": 1.150447513772552, + "edge_lengths_px": [ + 26.07680892944336, + 30.0, + 26.07680892944336, + 30.0 + ] + }, + "confidence": 0.45199802144368495 + }, + { + "observation_id": "d484ce56-f566-4519-a7a8-cb8785853df8", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 746.0, + 628.0 + ], + [ + 745.0, + 602.0 + ], + [ + 774.0, + 602.0 + ], + [ + 776.0, + 628.0 + ] + ], + "center_px": [ + 760.25, + 615.0 + ], + "quality": { + "area_px": 767.0, + "perimeter_px": 111.09603309631348, + "sharpness": { + "laplacian_var": 2069.7408104749743 + }, + "contrast": { + "p05": 11.0, + "p95": 172.0, + "dynamic_range": 161.0, + "mean_gray": 39.500927643784784, + "std_gray": 53.74358052939038 + }, + "geometry": { + "distance_to_center_norm": 0.38394394516944885, + "distance_to_border_px": 92.0 + }, + "edge_ratio": 1.1529936406865868, + "edge_lengths_px": [ + 26.019224166870117, + 29.0, + 26.07680892944336, + 30.0 + ] + }, + "confidence": 0.44348322079976393 + }, + { + "observation_id": "c126918f-ff93-4a75-891f-a035a9ac5032", + "type": "aruco", + "marker_id": 51, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 446.0, + 628.0 + ], + [ + 448.0, + 602.0 + ], + [ + 477.0, + 602.0 + ], + [ + 476.0, + 628.0 + ] + ], + "center_px": [ + 461.75, + 615.0 + ], + "quality": { + "area_px": 767.0, + "perimeter_px": 111.09603309631348, + "sharpness": { + "laplacian_var": 3758.230909297435 + }, + "contrast": { + "p05": 15.0, + "p95": 179.0, + "dynamic_range": 164.0, + "mean_gray": 75.82745825602969, + "std_gray": 70.20829007731462 + }, + "geometry": { + "distance_to_center_norm": 0.4236999452114105, + "distance_to_border_px": 92.0 + }, + "edge_ratio": 1.1529936406865868, + "edge_lengths_px": [ + 26.07680892944336, + 29.0, + 26.019224166870117, + 30.0 + ] + }, + "confidence": 0.44348322079976393 + }, + { + "observation_id": "9db8b150-66ce-4a48-b9c6-adec635bcf22", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 408.0, + 394.0 + ], + [ + 438.0, + 394.0 + ], + [ + 437.0, + 418.0 + ], + [ + 406.0, + 419.0 + ] + ], + "center_px": [ + 422.25, + 406.25 + ], + "quality": { + "area_px": 746.5, + "perimeter_px": 110.1168212890625, + "sharpness": { + "laplacian_var": 3968.1499950645084 + }, + "contrast": { + "p05": 12.0, + "p95": 178.0, + "dynamic_range": 166.0, + "mean_gray": 82.8661567877629, + "std_gray": 71.74410963723014 + }, + "geometry": { + "distance_to_center_norm": 0.30315518379211426, + "distance_to_border_px": 301.0 + }, + "edge_ratio": 1.2912181600037478, + "edge_lengths_px": [ + 30.0, + 24.020824432373047, + 31.016124725341797, + 25.079872131347656 + ] + }, + "confidence": 0.38542415378143546 + }, + { + "observation_id": "45e64978-3f60-479f-985b-ad53e2a9613b", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 629.0, + 612.0 + ], + [ + 629.0, + 586.0 + ], + [ + 658.0, + 586.0 + ], + [ + 659.0, + 611.0 + ] + ], + "center_px": [ + 643.75, + 598.75 + ], + "quality": { + "area_px": 752.5, + "perimeter_px": 110.03665542602539, + "sharpness": { + "laplacian_var": 4411.090134879286 + }, + "contrast": { + "p05": 13.0, + "p95": 176.0, + "dynamic_range": 163.0, + "mean_gray": 94.47769516728624, + "std_gray": 70.90257508054316 + }, + "geometry": { + "distance_to_center_norm": 0.3251786530017853, + "distance_to_border_px": 108.0 + }, + "edge_ratio": 1.1997070823945877, + "edge_lengths_px": [ + 26.0, + 29.0, + 25.01999282836914, + 30.01666259765625 + ] + }, + "confidence": 0.41815762699787656 + }, + { + "observation_id": "649c5483-3c13-4bdb-869a-d458c5564047", + "type": "aruco", + "marker_id": 205, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1163.0, + 490.0 + ], + [ + 1193.0, + 490.0 + ], + [ + 1199.0, + 514.0 + ], + [ + 1169.0, + 514.0 + ] + ], + "center_px": [ + 1181.0, + 502.0 + ], + "quality": { + "area_px": 720.0, + "perimeter_px": 109.47726821899414, + "sharpness": { + "laplacian_var": 3331.541356 + }, + "contrast": { + "p05": 8.0, + "p95": 163.0, + "dynamic_range": 155.0, + "mean_gray": 71.434, + "std_gray": 65.90885861551541 + }, + "geometry": { + "distance_to_center_norm": 0.7617100477218628, + "distance_to_border_px": 81.0 + }, + "edge_ratio": 1.2126781077409245, + "edge_lengths_px": [ + 30.0, + 24.73863410949707, + 30.0, + 24.73863410949707 + ] + }, + "confidence": 0.3958181457519531 + }, + { + "observation_id": "6fe86138-18a8-4b90-9b53-6ff5e4ba452a", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1041.0, + 491.0 + ], + [ + 1070.0, + 491.0 + ], + [ + 1075.0, + 515.0 + ], + [ + 1046.0, + 516.0 + ] + ], + "center_px": [ + 1058.0, + 503.25 + ], + "quality": { + "area_px": 713.0, + "perimeter_px": 108.02763557434082, + "sharpness": { + "laplacian_var": 3236.1091683194286 + }, + "contrast": { + "p05": 8.0, + "p95": 166.0, + "dynamic_range": 158.0, + "mean_gray": 65.91497975708502, + "std_gray": 65.99163284512963 + }, + "geometry": { + "distance_to_center_norm": 0.6017478704452515, + "distance_to_border_px": 204.0 + }, + "edge_ratio": 1.1836378025559324, + "edge_lengths_px": [ + 29.0, + 24.515300750732422, + 29.017236709594727, + 25.495098114013672 + ] + }, + "confidence": 0.4015868133874269 + }, + { + "observation_id": "97f1080b-07da-4712-a8d3-a0bd974a0654", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 674.0, + 495.0 + ], + [ + 703.0, + 495.0 + ], + [ + 704.0, + 519.0 + ], + [ + 674.0, + 519.0 + ] + ], + "center_px": [ + 688.75, + 507.0 + ], + "quality": { + "area_px": 708.0, + "perimeter_px": 107.02082443237305, + "sharpness": { + "laplacian_var": 2654.5283999999997 + }, + "contrast": { + "p05": 8.0, + "p95": 160.0, + "dynamic_range": 152.0, + "mean_gray": 61.818, + "std_gray": 64.00610030301799 + }, + "geometry": { + "distance_to_center_norm": 0.21091137826442719, + "distance_to_border_px": 201.0 + }, + "edge_ratio": 1.25, + "edge_lengths_px": [ + 29.0, + 24.020824432373047, + 30.0, + 24.0 + ] + }, + "confidence": 0.3776 + }, + { + "observation_id": "ee486ff9-0ddb-4fba-a2af-6ccff6f1a543", + "type": "aruco", + "marker_id": 40, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 591.0, + 283.0 + ], + [ + 554.0, + 283.0 + ], + [ + 557.0, + 269.0 + ], + [ + 595.0, + 269.0 + ] + ], + "center_px": [ + 574.25, + 276.0 + ], + "quality": { + "area_px": 525.0, + "perimeter_px": 103.87804126739502, + "sharpness": { + "laplacian_var": 2470.1495117799873 + }, + "contrast": { + "p05": 31.0, + "p95": 165.0, + "dynamic_range": 134.0, + "mean_gray": 76.10109289617486, + "std_gray": 53.12289236096477 + }, + "geometry": { + "distance_to_center_norm": 0.14527079463005066, + "distance_to_border_px": 269.0 + }, + "edge_ratio": 2.6540350424729393, + "edge_lengths_px": [ + 37.0, + 14.317821502685547, + 38.0, + 14.560219764709473 + ] + }, + "confidence": 0.13187467173526163 + }, + { + "observation_id": "d9227cdf-39ba-4ebe-88bb-04d919323231", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 278.0, + 431.0 + ], + [ + 307.0, + 430.0 + ], + [ + 304.0, + 453.0 + ], + [ + 275.0, + 453.0 + ] + ], + "center_px": [ + 291.0, + 441.75 + ], + "quality": { + "area_px": 651.0, + "perimeter_px": 103.4156665802002, + "sharpness": { + "laplacian_var": 3303.4498417826335 + }, + "contrast": { + "p05": 18.0, + "p95": 181.0, + "dynamic_range": 163.0, + "mean_gray": 82.72911963882619, + "std_gray": 68.3759606608231 + }, + "geometry": { + "distance_to_center_norm": 0.48814597725868225, + "distance_to_border_px": 267.0 + }, + "edge_ratio": 1.306870589274211, + "edge_lengths_px": [ + 29.017236709594727, + 23.194826126098633, + 29.0, + 22.203603744506836 + ] + }, + "confidence": 0.3320910299473707 + }, + { + "observation_id": "d928a683-a12b-4b9c-a76e-b179a19f72ae", + "type": "aruco", + "marker_id": 206, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1027.0, + 413.0 + ], + [ + 1055.0, + 413.0 + ], + [ + 1059.0, + 436.0 + ], + [ + 1031.0, + 436.0 + ] + ], + "center_px": [ + 1043.0, + 424.5 + ], + "quality": { + "area_px": 644.0, + "perimeter_px": 102.69047164916992, + "sharpness": { + "laplacian_var": 3004.4913171487606 + }, + "contrast": { + "p05": 9.0, + "p95": 164.0, + "dynamic_range": 155.0, + "mean_gray": 66.95227272727273, + "std_gray": 64.13324194290693 + }, + "geometry": { + "distance_to_center_norm": 0.5558050274848938, + "distance_to_border_px": 221.0 + }, + "edge_ratio": 1.1993881839699854, + "edge_lengths_px": [ + 28.0, + 23.34523582458496, + 28.0, + 23.34523582458496 + ] + }, + "confidence": 0.3579602826436361 + }, + { + "observation_id": "d4fb71e6-6eb3-4831-b0b2-993f6ec45a6f", + "type": "aruco", + "marker_id": 207, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1145.0, + 412.0 + ], + [ + 1173.0, + 412.0 + ], + [ + 1179.0, + 434.0 + ], + [ + 1151.0, + 435.0 + ] + ], + "center_px": [ + 1162.0, + 423.25 + ], + "quality": { + "area_px": 633.0, + "perimeter_px": 102.5910873413086, + "sharpness": { + "laplacian_var": 2918.9423552360613 + }, + "contrast": { + "p05": 8.0, + "p95": 162.0, + "dynamic_range": 154.0, + "mean_gray": 66.41724941724942, + "std_gray": 64.8972706649027 + }, + "geometry": { + "distance_to_center_norm": 0.7160782814025879, + "distance_to_border_px": 101.0 + }, + "edge_ratio": 1.2286640258971397, + "edge_lengths_px": [ + 28.0, + 22.803508758544922, + 28.017850875854492, + 23.76972770690918 + ] + }, + "confidence": 0.343462485354258 + }, + { + "observation_id": "19611478-918a-4d8d-b71e-bf0c0808937e", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 672.0, + 417.0 + ], + [ + 700.0, + 417.0 + ], + [ + 701.0, + 439.0 + ], + [ + 672.0, + 439.0 + ] + ], + "center_px": [ + 686.25, + 428.0 + ], + "quality": { + "area_px": 627.0, + "perimeter_px": 101.02271461486816, + "sharpness": { + "laplacian_var": 2310.857420519228 + }, + "contrast": { + "p05": 7.0, + "p95": 149.0, + "dynamic_range": 142.0, + "mean_gray": 76.85034013605443, + "std_gray": 61.222210086053046 + }, + "geometry": { + "distance_to_center_norm": 0.11199451982975006, + "distance_to_border_px": 281.0 + }, + "edge_ratio": 1.3181818181818181, + "edge_lengths_px": [ + 28.0, + 22.022714614868164, + 29.0, + 22.0 + ] + }, + "confidence": 0.31710344827586207 + }, + { + "observation_id": "05a3e652-1470-4142-98b0-dfc831e8479d", + "type": "aruco", + "marker_id": 248, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 501.0, + 556.0 + ], + [ + 503.0, + 574.0 + ], + [ + 471.0, + 574.0 + ], + [ + 469.0, + 556.0 + ] + ], + "center_px": [ + 486.0, + 565.0 + ], + "quality": { + "area_px": 576.0, + "perimeter_px": 100.22154235839844, + "sharpness": { + "laplacian_var": 3455.5713777144892 + }, + "contrast": { + "p05": 25.0, + "p95": 179.0, + "dynamic_range": 154.0, + "mean_gray": 93.31603773584905, + "std_gray": 66.51907179600713 + }, + "geometry": { + "distance_to_center_norm": 0.3491750657558441, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 1.7669043291073652, + "edge_lengths_px": [ + 18.11077117919922, + 32.0, + 18.11077117919922, + 32.0 + ] + }, + "confidence": 0.21732925415039062 + }, + { + "observation_id": "c62bfa2a-7a4b-42df-bbc6-42d6e4226411", + "type": "aruco", + "marker_id": 120, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 581.0, + 450.0 + ], + [ + 567.0, + 474.0 + ], + [ + 566.0, + 452.0 + ], + [ + 581.0, + 428.0 + ] + ], + "center_px": [ + 573.75, + 451.0 + ], + "quality": { + "area_px": 331.0, + "perimeter_px": 100.10954475402832, + "sharpness": { + "laplacian_var": 2230.198231449442 + }, + "contrast": { + "p05": 29.0, + "p95": 101.29999999999998, + "dynamic_range": 72.29999999999998, + "mean_gray": 47.15686274509804, + "std_gray": 23.853451716367648 + }, + "geometry": { + "distance_to_center_norm": 0.15329021215438843, + "distance_to_border_px": 246.0 + }, + "edge_ratio": 1.2864519466053357, + "edge_lengths_px": [ + 27.784887313842773, + 22.022714614868164, + 28.301942825317383, + 22.0 + ] + }, + "confidence": 0.15502133641776936 + }, + { + "observation_id": "6a2008b2-215e-4ebc-b632-5df08708f633", + "type": "aruco", + "marker_id": 245, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 551.0, + 556.0 + ], + [ + 552.0, + 574.0 + ], + [ + 520.0, + 574.0 + ], + [ + 519.0, + 556.0 + ] + ], + "center_px": [ + 535.5, + 565.0 + ], + "quality": { + "area_px": 576.0, + "perimeter_px": 100.05551147460938, + "sharpness": { + "laplacian_var": 3274.6921632303993 + }, + "contrast": { + "p05": 25.0, + "p95": 179.0, + "dynamic_range": 154.0, + "mean_gray": 85.5264423076923, + "std_gray": 66.97254225568102 + }, + "geometry": { + "distance_to_center_norm": 0.3133563995361328, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 1.7750406909376224, + "edge_lengths_px": [ + 18.027755737304688, + 32.0, + 18.027755737304688, + 32.0 + ] + }, + "confidence": 0.21633306884765627 + }, + { + "observation_id": "c116b571-c10a-4085-9ccf-ea27b8aa6ed7", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 399.0, + 561.0 + ], + [ + 431.0, + 560.0 + ], + [ + 434.0, + 576.0 + ], + [ + 402.0, + 576.0 + ] + ], + "center_px": [ + 416.5, + 568.25 + ], + "quality": { + "area_px": 497.5, + "perimeter_px": 95.59149932861328, + "sharpness": { + "laplacian_var": 3051.496252500821 + }, + "contrast": { + "p05": 29.0, + "p95": 178.0, + "dynamic_range": 149.0, + "mean_gray": 80.21311475409836, + "std_gray": 63.4610886556354 + }, + "geometry": { + "distance_to_center_norm": 0.4160189926624298, + "distance_to_border_px": 144.0 + }, + "edge_ratio": 2.0929266898618266, + "edge_lengths_px": [ + 32.015621185302734, + 16.278820037841797, + 32.0, + 15.29705810546875 + ] + }, + "confidence": 0.1584702743164707 + }, + { + "observation_id": "27e82996-93ef-4e04-a494-4942ae82a76a", + "type": "aruco", + "marker_id": 94, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1242.0, + 289.0 + ], + [ + 1236.0, + 270.0 + ], + [ + 1262.0, + 270.0 + ], + [ + 1268.0, + 289.0 + ] + ], + "center_px": [ + 1252.0, + 279.5 + ], + "quality": { + "area_px": 494.0, + "perimeter_px": 91.84971618652344, + "sharpness": { + "laplacian_var": 2255.9130139413987 + }, + "contrast": { + "p05": 7.0, + "p95": 152.64999999999998, + "dynamic_range": 145.64999999999998, + "mean_gray": 59.11413043478261, + "std_gray": 58.16807558895272 + }, + "geometry": { + "distance_to_center_norm": 0.8406231999397278, + "distance_to_border_px": 12.0 + }, + "edge_ratio": 1.3049026436375375, + "edge_lengths_px": [ + 19.92485809326172, + 26.0, + 19.92485809326172, + 26.0 + ] + }, + "confidence": 0.06057156860351561 + }, + { + "observation_id": "7617b6ec-6bf3-4b7c-a7ab-839c519a8aa3", + "type": "aruco", + "marker_id": 76, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1035.0, + 297.0 + ], + [ + 1031.0, + 278.0 + ], + [ + 1057.0, + 278.0 + ], + [ + 1061.0, + 297.0 + ] + ], + "center_px": [ + 1046.0, + 287.5 + ], + "quality": { + "area_px": 494.0, + "perimeter_px": 90.83297729492188, + "sharpness": { + "laplacian_var": 2549.9148673794894 + }, + "contrast": { + "p05": 7.0, + "p95": 155.0, + "dynamic_range": 148.0, + "mean_gray": 74.02717391304348, + "std_gray": 60.89539606225129 + }, + "geometry": { + "distance_to_center_norm": 0.5616520643234253, + "distance_to_border_px": 219.0 + }, + "edge_ratio": 1.339068071064434, + "edge_lengths_px": [ + 19.416488647460938, + 26.0, + 19.416488647460938, + 26.0 + ] + }, + "confidence": 0.2459421895345052 + }, + { + "observation_id": "b33846ed-4064-4ddc-831e-1a50b3561b81", + "type": "aruco", + "marker_id": 100, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1163.0, + 291.0 + ], + [ + 1158.0, + 272.0 + ], + [ + 1183.0, + 272.0 + ], + [ + 1189.0, + 291.0 + ] + ], + "center_px": [ + 1173.25, + 281.5 + ], + "quality": { + "area_px": 484.5, + "perimeter_px": 90.57174110412598, + "sharpness": { + "laplacian_var": 2287.523069958027 + }, + "contrast": { + "p05": 7.0, + "p95": 154.0, + "dynamic_range": 147.0, + "mean_gray": 80.25207756232687, + "std_gray": 61.74494183286694 + }, + "geometry": { + "distance_to_center_norm": 0.7340260744094849, + "distance_to_border_px": 91.0 + }, + "edge_ratio": 1.3233651356107032, + "edge_lengths_px": [ + 19.646883010864258, + 25.0, + 19.92485809326172, + 26.0 + ] + }, + "confidence": 0.24407473894265982 + }, + { + "observation_id": "262c11aa-5aee-40cb-b807-6cb9e0532013", + "type": "aruco", + "marker_id": 68, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 913.0, + 295.0 + ], + [ + 910.0, + 275.0 + ], + [ + 935.0, + 276.0 + ], + [ + 938.0, + 295.0 + ] + ], + "center_px": [ + 924.0, + 285.25 + ], + "quality": { + "area_px": 486.0, + "perimeter_px": 89.4791259765625, + "sharpness": { + "laplacian_var": 2725.9199151087673 + }, + "contrast": { + "p05": 7.0, + "p95": 154.0, + "dynamic_range": 147.0, + "mean_gray": 62.399441340782126, + "std_gray": 58.99459969339558 + }, + "geometry": { + "distance_to_center_norm": 0.3999340832233429, + "distance_to_border_px": 275.0 + }, + "edge_ratio": 1.300727494950114, + "edge_lengths_px": [ + 20.2237491607666, + 25.01999282836914, + 19.235383987426758, + 25.0 + ] + }, + "confidence": 0.24909137483284013 + }, + { + "observation_id": "ac866509-ffec-4edf-9162-f417563c77ff", + "type": "aruco", + "marker_id": 46, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 870.0, + 283.0 + ], + [ + 868.0, + 264.0 + ], + [ + 893.0, + 264.0 + ], + [ + 896.0, + 283.0 + ] + ], + "center_px": [ + 881.75, + 273.5 + ], + "quality": { + "area_px": 484.5, + "perimeter_px": 89.34035682678223, + "sharpness": { + "laplacian_var": 2282.4045170726636 + }, + "contrast": { + "p05": 7.300000000000001, + "p95": 155.0, + "dynamic_range": 147.7, + "mean_gray": 79.19618528610354, + "std_gray": 61.105703624299345 + }, + "geometry": { + "distance_to_center_norm": 0.34966418147087097, + "distance_to_border_px": 264.0 + }, + "edge_ratio": 1.360902222610914, + "edge_lengths_px": [ + 19.10497283935547, + 25.0, + 19.235383987426758, + 26.0 + ] + }, + "confidence": 0.23734254719660833 + }, + { + "observation_id": "d261b501-d6f2-4fad-a792-aed82971cbe2", + "type": "aruco", + "marker_id": 50, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 907.0, + 261.0 + ], + [ + 905.0, + 243.0 + ], + [ + 930.0, + 242.0 + ], + [ + 933.0, + 261.0 + ] + ], + "center_px": [ + 918.75, + 251.75 + ], + "quality": { + "area_px": 473.0, + "perimeter_px": 88.36614799499512, + "sharpness": { + "laplacian_var": 2560.3917119050625 + }, + "contrast": { + "p05": 7.0, + "p95": 156.0, + "dynamic_range": 149.0, + "mean_gray": 54.57022471910113, + "std_gray": 56.798511522622285 + }, + "geometry": { + "distance_to_center_norm": 0.4072316288948059, + "distance_to_border_px": 242.0 + }, + "edge_ratio": 1.4356097673997341, + "edge_lengths_px": [ + 18.11077117919922, + 25.01999282836914, + 19.235383987426758, + 26.0 + ] + }, + "confidence": 0.21965114789131363 + }, + { + "observation_id": "68d6f7ce-a6f8-4eac-8be3-a641ed068452", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 766.0, + 277.0 + ], + [ + 764.0, + 258.0 + ], + [ + 790.0, + 258.0 + ], + [ + 791.0, + 276.0 + ] + ], + "center_px": [ + 777.75, + 267.25 + ], + "quality": { + "area_px": 472.5, + "perimeter_px": 88.1527214050293, + "sharpness": { + "laplacian_var": 2283.9801959999686 + }, + "contrast": { + "p05": 7.0, + "p95": 158.0, + "dynamic_range": 151.0, + "mean_gray": 55.705882352941174, + "std_gray": 59.80585109620882 + }, + "geometry": { + "distance_to_center_norm": 0.22615359723567963, + "distance_to_border_px": 258.0 + }, + "edge_ratio": 1.4422205613868182, + "edge_lengths_px": [ + 19.10497283935547, + 26.0, + 18.027755737304688, + 25.01999282836914 + ] + }, + "confidence": 0.21841319450965294 + }, + { + "observation_id": "83e64639-29e4-4a2b-9da0-13a066c289ea", + "type": "aruco", + "marker_id": 104, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1174.0, + 237.0 + ], + [ + 1169.0, + 219.0 + ], + [ + 1194.0, + 219.0 + ], + [ + 1199.0, + 237.0 + ] + ], + "center_px": [ + 1184.0, + 228.0 + ], + "quality": { + "area_px": 450.0, + "perimeter_px": 87.36308288574219, + "sharpness": { + "laplacian_var": 1956.005518353175 + }, + "contrast": { + "p05": 7.0, + "p95": 153.0, + "dynamic_range": 146.0, + "mean_gray": 85.63392857142857, + "std_gray": 61.17879664046891 + }, + "geometry": { + "distance_to_center_norm": 0.7623366713523865, + "distance_to_border_px": 81.0 + }, + "edge_ratio": 1.3382193367956818, + "edge_lengths_px": [ + 18.681541442871094, + 25.0, + 18.681541442871094, + 25.0 + ] + }, + "confidence": 0.22417849731445313 + }, + { + "observation_id": "bf6022ba-36da-4d4e-805d-68b4d245f485", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 814.0, + 262.0 + ], + [ + 812.0, + 243.0 + ], + [ + 837.0, + 243.0 + ], + [ + 839.0, + 261.0 + ] + ], + "center_px": [ + 825.5, + 252.25 + ], + "quality": { + "area_px": 463.5, + "perimeter_px": 87.23573684692383, + "sharpness": { + "laplacian_var": 2499.598082117552 + }, + "contrast": { + "p05": 7.0, + "p95": 159.0, + "dynamic_range": 152.0, + "mean_gray": 90.22063037249283, + "std_gray": 61.5711206505937 + }, + "geometry": { + "distance_to_center_norm": 0.2921459376811981, + "distance_to_border_px": 243.0 + }, + "edge_ratio": 1.3814979263337708, + "edge_lengths_px": [ + 19.10497283935547, + 25.0, + 18.11077117919922, + 25.01999282836914 + ] + }, + "confidence": 0.22367025973033955 + }, + { + "observation_id": "61cb69a0-6e57-47be-9867-9a1ecd918682", + "type": "aruco", + "marker_id": 60, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 754.0, + 206.0 + ], + [ + 752.0, + 189.0 + ], + [ + 776.0, + 188.0 + ], + [ + 778.0, + 206.0 + ] + ], + "center_px": [ + 765.0, + 197.25 + ], + "quality": { + "area_px": 421.0, + "perimeter_px": 83.24883842468262, + "sharpness": { + "laplacian_var": 2059.3458504357895 + }, + "contrast": { + "p05": 8.0, + "p95": 158.0, + "dynamic_range": 150.0, + "mean_gray": 98.69453376205787, + "std_gray": 61.332890121326514 + }, + "geometry": { + "distance_to_center_norm": 0.27946722507476807, + "distance_to_border_px": 188.0 + }, + "edge_ratio": 1.4033115434908208, + "edge_lengths_px": [ + 17.11724281311035, + 24.020824432373047, + 18.11077117919922, + 24.0 + ] + }, + "confidence": 0.2000031054889577 + }, + { + "observation_id": "4148cdf5-aca6-4f29-b4d8-0f93abfc2b72", + "type": "aruco", + "marker_id": 67, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 848.0, + 218.0 + ], + [ + 846.0, + 201.0 + ], + [ + 870.0, + 200.0 + ], + [ + 873.0, + 218.0 + ] + ], + "center_px": [ + 859.25, + 209.25 + ], + "quality": { + "area_px": 430.0, + "perimeter_px": 84.38635444641113, + "sharpness": { + "laplacian_var": 2687.259421585873 + }, + "contrast": { + "p05": 8.0, + "p95": 157.09999999999997, + "dynamic_range": 149.09999999999997, + "mean_gray": 58.47335423197492, + "std_gray": 56.440262300049106 + }, + "geometry": { + "distance_to_center_norm": 0.36235129833221436, + "distance_to_border_px": 200.0 + }, + "edge_ratio": 1.4605155907966747, + "edge_lengths_px": [ + 17.11724281311035, + 24.020824432373047, + 18.248287200927734, + 25.0 + ] + }, + "confidence": 0.19627771759033205 + }, + { + "observation_id": "711116a6-1a9a-4dad-b46e-2efc4718b0f7", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 678.0, + 200.0 + ], + [ + 677.0, + 184.0 + ], + [ + 702.0, + 183.0 + ], + [ + 703.0, + 200.0 + ] + ], + "center_px": [ + 690.0, + 191.75 + ], + "quality": { + "area_px": 413.0, + "perimeter_px": 83.08059883117676, + "sharpness": { + "laplacian_var": 2100.31505367036 + }, + "contrast": { + "p05": 8.0, + "p95": 157.0, + "dynamic_range": 149.0, + "mean_gray": 78.85197368421052, + "std_gray": 62.867559694122406 + }, + "geometry": { + "distance_to_center_norm": 0.23903268575668335, + "distance_to_border_px": 183.0 + }, + "edge_ratio": 1.560704278037201, + "edge_lengths_px": [ + 16.031219482421875, + 25.01999282836914, + 17.029386520385742, + 25.0 + ] + }, + "confidence": 0.1764160816420665 + }, + { + "observation_id": "5b4e3306-7931-49c3-8723-cfd24a6ad45d", + "type": "aruco", + "marker_id": 88, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1096.0, + 179.0 + ], + [ + 1091.0, + 161.0 + ], + [ + 1114.0, + 161.0 + ], + [ + 1119.0, + 178.0 + ] + ], + "center_px": [ + 1105.0, + 169.75 + ], + "quality": { + "area_px": 405.0, + "perimeter_px": 82.42331504821777, + "sharpness": { + "laplacian_var": 2388.923313198554 + }, + "contrast": { + "p05": 7.0, + "p95": 153.0, + "dynamic_range": 146.0, + "mean_gray": 73.2724358974359, + "std_gray": 59.86994031265409 + }, + "geometry": { + "distance_to_center_norm": 0.6842061877250671, + "distance_to_border_px": 161.0 + }, + "edge_ratio": 1.2991913056123376, + "edge_lengths_px": [ + 18.681541442871094, + 23.0, + 17.72004508972168, + 23.021728515625 + ] + }, + "confidence": 0.20782158780899712 + }, + { + "observation_id": "c0a9aaa6-b8e9-43ca-b416-aeb0e529b0b5", + "type": "aruco", + "marker_id": 73, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 531.0, + 171.0 + ], + [ + 532.0, + 154.0 + ], + [ + 556.0, + 154.0 + ], + [ + 555.0, + 171.0 + ] + ], + "center_px": [ + 543.5, + 162.5 + ], + "quality": { + "area_px": 408.0, + "perimeter_px": 82.05877304077148, + "sharpness": { + "laplacian_var": 2981.150958598691 + }, + "contrast": { + "p05": 9.0, + "p95": 160.0, + "dynamic_range": 151.0, + "mean_gray": 90.38538205980066, + "std_gray": 57.22472154947975 + }, + "geometry": { + "distance_to_center_norm": 0.2993517518043518, + "distance_to_border_px": 154.0 + }, + "edge_ratio": 1.4093285140524465, + "edge_lengths_px": [ + 17.029386520385742, + 24.0, + 17.029386520385742, + 24.0 + ] + }, + "confidence": 0.1929997138977051 + }, + { + "observation_id": "29dab72e-d063-46ec-a5c0-ede55a2f7cb4", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 528.0, + 198.0 + ], + [ + 528.0, + 181.0 + ], + [ + 552.0, + 180.0 + ], + [ + 552.0, + 197.0 + ] + ], + "center_px": [ + 540.0, + 189.0 + ], + "quality": { + "area_px": 408.0, + "perimeter_px": 82.0416488647461, + "sharpness": { + "laplacian_var": 2252.658788888889 + }, + "contrast": { + "p05": 8.0, + "p95": 158.0, + "dynamic_range": 150.0, + "mean_gray": 79.53, + "std_gray": 62.1269863532212 + }, + "geometry": { + "distance_to_center_norm": 0.26977089047431946, + "distance_to_border_px": 180.0 + }, + "edge_ratio": 1.4129896724925322, + "edge_lengths_px": [ + 17.0, + 24.020824432373047, + 17.0, + 24.020824432373047 + ] + }, + "confidence": 0.19249963767972095 + }, + { + "observation_id": "c8bfb42c-4fa1-4438-b8c3-ebb2d5a1d761", + "type": "aruco", + "marker_id": 98, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 898.0, + 181.0 + ], + [ + 896.0, + 164.0 + ], + [ + 919.0, + 164.0 + ], + [ + 922.0, + 181.0 + ] + ], + "center_px": [ + 908.75, + 172.5 + ], + "quality": { + "area_px": 399.5, + "perimeter_px": 81.37991905212402, + "sharpness": { + "laplacian_var": 2493.235351379246 + }, + "contrast": { + "p05": 7.0, + "p95": 156.45, + "dynamic_range": 149.45, + "mean_gray": 73.53767123287672, + "std_gray": 60.99479501756176 + }, + "geometry": { + "distance_to_center_norm": 0.4462646245956421, + "distance_to_border_px": 164.0 + }, + "edge_ratio": 1.4020949671648077, + "edge_lengths_px": [ + 17.11724281311035, + 23.0, + 17.262676239013672, + 24.0 + ] + }, + "confidence": 0.1899538473288218 + }, + { + "observation_id": "af6704f9-92c7-4761-829b-6ceaef4f48fb", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 348.0, + 168.0 + ], + [ + 350.0, + 152.0 + ], + [ + 374.0, + 151.0 + ], + [ + 372.0, + 168.0 + ] + ], + "center_px": [ + 361.0, + 159.75 + ], + "quality": { + "area_px": 395.0, + "perimeter_px": 81.26258277893066, + "sharpness": { + "laplacian_var": 3312.401384083045 + }, + "contrast": { + "p05": 10.0, + "p95": 165.59999999999997, + "dynamic_range": 155.59999999999997, + "mean_gray": 96.63667820069205, + "std_gray": 59.32144711009287 + }, + "geometry": { + "distance_to_center_norm": 0.4676894545555115, + "distance_to_border_px": 151.0 + }, + "edge_ratio": 1.489708288137177, + "edge_lengths_px": [ + 16.124515533447266, + 24.020824432373047, + 17.11724281311035, + 24.0 + ] + }, + "confidence": 0.17676838843571283 + }, + { + "observation_id": "6fc34d5f-a3a7-4cac-ad43-a840ebe205ce", + "type": "aruco", + "marker_id": 61, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 279.0, + 171.0 + ], + [ + 281.0, + 155.0 + ], + [ + 305.0, + 154.0 + ], + [ + 304.0, + 170.0 + ] + ], + "center_px": [ + 292.25, + 162.5 + ], + "quality": { + "area_px": 390.5, + "perimeter_px": 81.19655227661133, + "sharpness": { + "laplacian_var": 3432.069147635581 + }, + "contrast": { + "p05": 9.0, + "p95": 169.0, + "dynamic_range": 160.0, + "mean_gray": 98.08391608391608, + "std_gray": 63.00488342750296 + }, + "geometry": { + "distance_to_center_norm": 0.5446262955665588, + "distance_to_border_px": 154.0 + }, + "edge_ratio": 1.560704278037201, + "edge_lengths_px": [ + 16.124515533447266, + 24.020824432373047, + 16.031219482421875, + 25.01999282836914 + ] + }, + "confidence": 0.1668050360320266 + }, + { + "observation_id": "09480647-3aae-4cd5-ae92-b78f6de91dcc", + "type": "aruco", + "marker_id": 90, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 968.0, + 179.0 + ], + [ + 965.0, + 163.0 + ], + [ + 988.0, + 162.0 + ], + [ + 992.0, + 179.0 + ] + ], + "center_px": [ + 978.25, + 170.75 + ], + "quality": { + "area_px": 389.5, + "perimeter_px": 80.76479721069336, + "sharpness": { + "laplacian_var": 2143.874092181245 + }, + "contrast": { + "p05": 7.0, + "p95": 156.0, + "dynamic_range": 149.0, + "mean_gray": 79.14089347079037, + "std_gray": 61.58310182847914 + }, + "geometry": { + "distance_to_center_norm": 0.527838945388794, + "distance_to_border_px": 162.0 + }, + "edge_ratio": 1.4743083309606915, + "edge_lengths_px": [ + 16.278820037841797, + 23.021728515625, + 17.464248657226562, + 24.0 + ] + }, + "confidence": 0.17612778902053833 + }, + { + "observation_id": "aa2be298-66e1-4064-90ac-ed4d274f78c0", + "type": "aruco", + "marker_id": 91, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1049.0, + 170.0 + ], + [ + 1046.0, + 154.0 + ], + [ + 1069.0, + 153.0 + ], + [ + 1073.0, + 170.0 + ] + ], + "center_px": [ + 1059.25, + 161.75 + ], + "quality": { + "area_px": 389.5, + "perimeter_px": 80.76479721069336, + "sharpness": { + "laplacian_var": 1821.924918222506 + }, + "contrast": { + "p05": 7.0, + "p95": 153.0, + "dynamic_range": 146.0, + "mean_gray": 69.29553264604812, + "std_gray": 61.039691446900214 + }, + "geometry": { + "distance_to_center_norm": 0.6315658688545227, + "distance_to_border_px": 153.0 + }, + "edge_ratio": 1.4743083309606915, + "edge_lengths_px": [ + 16.278820037841797, + 23.021728515625, + 17.464248657226562, + 24.0 + ] + }, + "confidence": 0.17612778902053833 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 971.0, + 502.0 + ], + [ + 796.0, + 516.0 + ], + [ + 760.0, + 487.0 + ], + [ + 943.0, + 475.0 + ] + ], + "center_px": [ + 867.5, + 495.0 + ], + "area_px": 5428.0 + }, + { + "image_points_px": [ + [ + 363.0, + 311.0 + ], + [ + 371.0, + 312.0 + ], + [ + 363.0, + 354.0 + ], + [ + 359.0, + 346.0 + ] + ], + "center_px": [ + 364.0, + 330.75 + ], + "area_px": 258.0 + }, + { + "image_points_px": [ + [ + 473.0, + 435.0 + ], + [ + 477.0, + 446.0 + ], + [ + 474.0, + 479.0 + ], + [ + 470.0, + 476.0 + ] + ], + "center_px": [ + 473.5, + 459.0 + ], + "area_px": 169.0 + }, + { + "image_points_px": [ + [ + 829.0, + 278.0 + ], + [ + 854.0, + 278.0 + ], + [ + 856.0, + 297.0 + ], + [ + 830.0, + 297.0 + ] + ], + "center_px": [ + 842.25, + 287.5 + ], + "area_px": 484.5 + }, + { + "image_points_px": [ + [ + 725.0, + 208.0 + ], + [ + 750.0, + 208.0 + ], + [ + 751.0, + 226.0 + ], + [ + 726.0, + 226.0 + ] + ], + "center_px": [ + 738.0, + 217.0 + ], + "area_px": 450.0 + }, + { + "image_points_px": [ + [ + 402.0, + 275.0 + ], + [ + 428.0, + 273.0 + ], + [ + 429.0, + 290.0 + ], + [ + 404.0, + 291.0 + ] + ], + "center_px": [ + 415.75, + 282.25 + ], + "area_px": 423.0 + }, + { + "image_points_px": [ + [ + 924.0, + 175.0 + ], + [ + 949.0, + 175.0 + ], + [ + 951.0, + 192.0 + ], + [ + 927.0, + 192.0 + ] + ], + "center_px": [ + 937.75, + 183.5 + ], + "area_px": 416.5 + }, + { + "image_points_px": [ + [ + 423.0, + 180.0 + ], + [ + 447.0, + 180.0 + ], + [ + 446.0, + 197.0 + ], + [ + 422.0, + 198.0 + ] + ], + "center_px": [ + 434.5, + 188.75 + ], + "area_px": 419.5 + }, + { + "image_points_px": [ + [ + 580.0, + 439.0 + ], + [ + 581.0, + 449.0 + ], + [ + 569.0, + 468.0 + ], + [ + 568.0, + 463.0 + ] + ], + "center_px": [ + 574.5, + 454.75 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 560.0, + 281.0 + ], + [ + 562.0, + 273.0 + ], + [ + 582.0, + 277.0 + ], + [ + 580.0, + 280.0 + ] + ], + "center_px": [ + 571.0, + 277.75 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 520.0, + 231.0 + ], + [ + 527.0, + 228.0 + ], + [ + 536.0, + 241.0 + ], + [ + 529.0, + 244.0 + ] + ], + "center_px": [ + 528.0, + 236.0 + ], + "area_px": 118.0 + }, + { + "image_points_px": [ + [ + 49.0, + 268.0 + ], + [ + 55.0, + 266.0 + ], + [ + 70.0, + 266.0 + ], + [ + 64.0, + 268.0 + ] + ], + "center_px": [ + 59.5, + 267.0 + ], + "area_px": 30.0 + }, + { + "image_points_px": [ + [ + 555.0, + 399.0 + ], + [ + 555.0, + 412.0 + ], + [ + 552.0, + 417.0 + ], + [ + 550.0, + 400.0 + ] + ], + "center_px": [ + 553.0, + 407.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 647.0 + ], + [ + 1049.0, + 647.0 + ], + [ + 1054.0, + 649.0 + ], + [ + 1038.0, + 649.0 + ] + ], + "center_px": [ + 1043.75, + 648.0 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 481.0, + 292.0 + ], + [ + 485.0, + 299.0 + ], + [ + 484.0, + 311.0 + ], + [ + 481.0, + 300.0 + ] + ], + "center_px": [ + 482.75, + 300.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 467.0, + 449.0 + ], + [ + 469.0, + 462.0 + ], + [ + 466.0, + 468.0 + ], + [ + 465.0, + 452.0 + ] + ], + "center_px": [ + 466.75, + 457.75 + ], + "area_px": 43.0 + }, + { + "image_points_px": [ + [ + 908.0, + 245.0 + ], + [ + 923.0, + 244.0 + ], + [ + 924.0, + 248.0 + ], + [ + 909.0, + 250.0 + ] + ], + "center_px": [ + 916.0, + 246.75 + ], + "area_px": 69.0 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_b_camera_pose.json b/data/evaluations/Scene7/render_b_camera_pose.json new file mode 100644 index 0000000..d6f17ef --- /dev/null +++ b/data/evaluations/Scene7/render_b_camera_pose.json @@ -0,0 +1,719 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:06Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_b_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "b", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 37, + "used_marker_ids": [ + 63, + 102, + 58, + 64, + 92, + 96, + 103, + 62, + 51, + 79, + 205, + 217, + 208, + 210, + 206, + 207, + 214, + 94, + 76, + 100, + 68, + 46, + 50, + 72, + 104, + 53, + 60, + 67, + 86, + 88, + 73, + 82, + 98, + 83, + 61, + 90, + 91 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.010668546287832604, + 0.0006041941507852188, + 9.682325993814142e-05, + 9.679261603375064e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.2433529272481374, + "residual_median_px": 0.1793326341170652, + "residual_max_px": 0.5331678701979294, + "sigma2_normalized": 1.0195470267699082e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.9999213218688965, + -0.01253525074571371, + 0.0004404456994961947 + ], + [ + -0.00949651375412941, + -0.7795308232307434, + -0.6262918710708618 + ], + [ + 0.00819406658411026, + 0.6262384057044983, + -0.779588520526886 + ] + ], + "translation_m": [ + -0.311349093914032, + 0.05274061858654022, + 1.496019959449768 + ], + "rvec_rad": [ + 2.464767152849271, + -0.015257811055876373, + 0.005979718800098786 + ] + }, + "camera_in_world": { + "position_m": [ + 0.29956695437431335, + -0.8996550440788269, + 1.1994482278823853 + ], + "position_mm": [ + 299.56695556640625, + -899.655029296875, + 1199.4482421875 + ], + "orientation_deg": { + "roll": 141.2252960205078, + "pitch": -0.4694906771183014, + "yaw": -0.5441365838050842 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 4.7990318044821116e-08, + 1.114258716900552e-09, + 2.445723179656057e-09, + 1.285003403661356e-09, + 2.688028258796984e-09, + 1.4900572618023873e-08 + ], + [ + 1.1142587169005535e-09, + 1.1452887451200355e-08, + -4.95634733242172e-09, + -7.142202656660234e-10, + -3.1012035158103562e-09, + 3.633566530838111e-09 + ], + [ + 2.4457231796563815e-09, + -4.956347332421707e-09, + 9.133174474528649e-08, + 5.195905477801238e-09, + -9.373599510686652e-09, + -3.643068762000552e-08 + ], + [ + 1.2850034036613686e-09, + -7.142202656660089e-10, + 5.195905477801252e-09, + 1.1453359476870426e-09, + -2.686334133698763e-10, + -2.3107778167258756e-10 + ], + [ + 2.6880282587969514e-09, + -3.1012035158103546e-09, + -9.373599510686667e-09, + -2.6863341336987056e-10, + 3.0342780301070613e-09, + 4.745105560381766e-09 + ], + [ + 1.4900572618023715e-08, + 3.6335665308382627e-09, + -3.6430687620005797e-08, + -2.3107778167260826e-10, + 4.745105560381737e-09, + 3.6059857948102676e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.012551610287792636, + 0.006131689135203312, + 0.017315439111021073 + ], + "tvec_std_m": [ + 3.384281234896182e-05, + 5.508428115267605e-05, + 0.00018989433363874415 + ] + }, + "camera_center_std_m": [ + 0.00035994209339861217, + 0.00023213520324396299, + 0.00026177373525232514 + ], + "camera_center_std_mm": [ + 0.35994209339861216, + 0.23213520324396297, + 0.26177373525232517 + ], + "orientation_std_deg": { + "roll": 0.01671348006814381, + "pitch": 0.012829750819752113, + "yaw": 0.0057387187764372325 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 63, + "observed_center_px": [ + 1246.0, + 678.75 + ], + "projected_center_px": [ + 1245.95703125, + 678.5791625976562 + ], + "reprojection_error_px": 0.1761582570194279, + "confidence": 0.1539593300495616 + }, + { + "marker_id": 102, + "observed_center_px": [ + 1078.25, + 665.5 + ], + "projected_center_px": [ + 1078.4405517578125, + 665.3050537109375 + ], + "reprojection_error_px": 0.27260599410994885, + "confidence": 0.39637168760361213 + }, + { + "marker_id": 58, + "observed_center_px": [ + 307.25, + 668.0 + ], + "projected_center_px": [ + 307.20703125, + 668.136962890625 + ], + "reprojection_error_px": 0.1435449298474809, + "confidence": 0.3638956157928849 + }, + { + "marker_id": 64, + "observed_center_px": [ + 220.5, + 635.5 + ], + "projected_center_px": [ + 220.38526916503906, + 635.41259765625 + ], + "reprojection_error_px": 0.14423014311795937, + "confidence": 0.4534700649674178 + }, + { + "marker_id": 92, + "observed_center_px": [ + 1064.5, + 622.75 + ], + "projected_center_px": [ + 1064.5877685546875, + 622.592041015625 + ], + "reprojection_error_px": 0.18070517407289194, + "confidence": 0.46896024883690896 + }, + { + "marker_id": 96, + "observed_center_px": [ + 716.75, + 628.0 + ], + "projected_center_px": [ + 716.9068603515625, + 628.1483154296875 + ], + "reprojection_error_px": 0.21587643821338828, + "confidence": 0.44372569385651617 + }, + { + "marker_id": 103, + "observed_center_px": [ + 382.0, + 633.0 + ], + "projected_center_px": [ + 381.94696044921875, + 633.098876953125 + ], + "reprojection_error_px": 0.1122044821135067, + "confidence": 0.45199802144368495 + }, + { + "marker_id": 62, + "observed_center_px": [ + 760.25, + 615.0 + ], + "projected_center_px": [ + 760.3300170898438, + 615.13330078125 + ], + "reprojection_error_px": 0.15547293317141447, + "confidence": 0.44348322079976393 + }, + { + "marker_id": 51, + "observed_center_px": [ + 461.75, + 615.0 + ], + "projected_center_px": [ + 461.8117370605469, + 615.0106811523438 + ], + "reprojection_error_px": 0.0626542230049891, + "confidence": 0.44348322079976393 + }, + { + "marker_id": 79, + "observed_center_px": [ + 643.75, + 598.75 + ], + "projected_center_px": [ + 643.64111328125, + 598.9660034179688 + ], + "reprojection_error_px": 0.2418962465486476, + "confidence": 0.41815762699787656 + }, + { + "marker_id": 205, + "observed_center_px": [ + 1181.0, + 502.0 + ], + "projected_center_px": [ + 1180.772705078125, + 502.1515197753906 + ], + "reprojection_error_px": 0.2731688559199013, + "confidence": 0.3958181457519531 + }, + { + "marker_id": 217, + "observed_center_px": [ + 1058.0, + 503.25 + ], + "projected_center_px": [ + 1058.0382080078125, + 503.40069580078125 + ], + "reprojection_error_px": 0.15546406734066315, + "confidence": 0.4015868133874269 + }, + { + "marker_id": 208, + "observed_center_px": [ + 688.75, + 507.0 + ], + "projected_center_px": [ + 688.9981689453125, + 507.15673828125 + ], + "reprojection_error_px": 0.293521233008317, + "confidence": 0.3776 + }, + { + "marker_id": 210, + "observed_center_px": [ + 291.0, + 441.75 + ], + "projected_center_px": [ + 291.1379089355469, + 441.437255859375 + ], + "reprojection_error_px": 0.3418007782304509, + "confidence": 0.3320910299473707 + }, + { + "marker_id": 206, + "observed_center_px": [ + 1043.0, + 424.5 + ], + "projected_center_px": [ + 1042.8353271484375, + 424.4289855957031 + ], + "reprojection_error_px": 0.1793326341170652, + "confidence": 0.3579602826436361 + }, + { + "marker_id": 207, + "observed_center_px": [ + 1162.0, + 423.25 + ], + "projected_center_px": [ + 1161.467041015625, + 423.2649230957031 + ], + "reprojection_error_px": 0.5331678701979294, + "confidence": 0.343462485354258 + }, + { + "marker_id": 214, + "observed_center_px": [ + 686.25, + 428.0 + ], + "projected_center_px": [ + 686.1587524414062, + 427.9288635253906 + ], + "reprojection_error_px": 0.11570010790474698, + "confidence": 0.31710344827586207 + }, + { + "marker_id": 94, + "observed_center_px": [ + 1252.0, + 279.5 + ], + "projected_center_px": [ + 1251.843017578125, + 279.62103271484375 + ], + "reprojection_error_px": 0.19822310369931398, + "confidence": 0.06057156860351561 + }, + { + "marker_id": 76, + "observed_center_px": [ + 1046.0, + 287.5 + ], + "projected_center_px": [ + 1046.0574951171875, + 287.14154052734375 + ], + "reprojection_error_px": 0.36304115749788096, + "confidence": 0.2459421895345052 + }, + { + "marker_id": 100, + "observed_center_px": [ + 1173.25, + 281.5 + ], + "projected_center_px": [ + 1173.462158203125, + 281.3970947265625 + ], + "reprojection_error_px": 0.23579779145376956, + "confidence": 0.24407473894265982 + }, + { + "marker_id": 68, + "observed_center_px": [ + 924.0, + 285.25 + ], + "projected_center_px": [ + 923.9710693359375, + 285.0966491699219 + ], + "reprojection_error_px": 0.156055952814198, + "confidence": 0.24909137483284013 + }, + { + "marker_id": 46, + "observed_center_px": [ + 881.75, + 273.5 + ], + "projected_center_px": [ + 882.0352783203125, + 273.3653869628906 + ], + "reprojection_error_px": 0.3154431641359998, + "confidence": 0.23734254719660833 + }, + { + "marker_id": 50, + "observed_center_px": [ + 918.75, + 251.75 + ], + "projected_center_px": [ + 918.6425170898438, + 251.74551391601562 + ], + "reprojection_error_px": 0.10757648871928929, + "confidence": 0.21965114789131363 + }, + { + "marker_id": 72, + "observed_center_px": [ + 777.75, + 267.25 + ], + "projected_center_px": [ + 777.6222534179688, + 267.1092224121094 + ], + "reprojection_error_px": 0.19009870718384575, + "confidence": 0.21841319450965294 + }, + { + "marker_id": 104, + "observed_center_px": [ + 1184.0, + 228.0 + ], + "projected_center_px": [ + 1184.093994140625, + 227.82806396484375 + ], + "reprojection_error_px": 0.1959512660257226, + "confidence": 0.22417849731445313 + }, + { + "marker_id": 53, + "observed_center_px": [ + 825.5, + 252.25 + ], + "projected_center_px": [ + 825.0537109375, + 252.28555297851562 + ], + "reprojection_error_px": 0.4477029613353718, + "confidence": 0.22367025973033955 + }, + { + "marker_id": 60, + "observed_center_px": [ + 765.0, + 197.25 + ], + "projected_center_px": [ + 764.9734497070312, + 197.22470092773438 + ], + "reprojection_error_px": 0.03667371148694623, + "confidence": 0.2000031054889577 + }, + { + "marker_id": 67, + "observed_center_px": [ + 859.25, + 209.25 + ], + "projected_center_px": [ + 859.2935791015625, + 209.15707397460938 + ], + "reprojection_error_px": 0.10263714867382946, + "confidence": 0.19627771759033205 + }, + { + "marker_id": 86, + "observed_center_px": [ + 690.0, + 191.75 + ], + "projected_center_px": [ + 689.9363403320312, + 191.6957244873047 + ], + "reprojection_error_px": 0.08365634826019197, + "confidence": 0.1764160816420665 + }, + { + "marker_id": 88, + "observed_center_px": [ + 1105.0, + 169.75 + ], + "projected_center_px": [ + 1105.2154541015625, + 170.19320678710938 + ], + "reprojection_error_px": 0.4928008989641952, + "confidence": 0.20782158780899712 + }, + { + "marker_id": 73, + "observed_center_px": [ + 543.5, + 162.5 + ], + "projected_center_px": [ + 543.457763671875, + 162.5028076171875 + ], + "reprojection_error_px": 0.04232954202155052, + "confidence": 0.1929997138977051 + }, + { + "marker_id": 82, + "observed_center_px": [ + 540.0, + 189.0 + ], + "projected_center_px": [ + 539.9744873046875, + 189.0753631591797 + ], + "reprojection_error_px": 0.07956446055652848, + "confidence": 0.19249963767972095 + }, + { + "marker_id": 98, + "observed_center_px": [ + 908.75, + 172.5 + ], + "projected_center_px": [ + 908.751708984375, + 172.61451721191406 + ], + "reprojection_error_px": 0.1145299631195448, + "confidence": 0.1899538473288218 + }, + { + "marker_id": 83, + "observed_center_px": [ + 361.0, + 159.75 + ], + "projected_center_px": [ + 361.0619812011719, + 159.612060546875 + ], + "reprojection_error_px": 0.15122487238259621, + "confidence": 0.17676838843571283 + }, + { + "marker_id": 61, + "observed_center_px": [ + 292.25, + 162.5 + ], + "projected_center_px": [ + 292.15960693359375, + 162.67286682128906 + ], + "reprojection_error_px": 0.19507394586902013, + "confidence": 0.1668050360320266 + }, + { + "marker_id": 90, + "observed_center_px": [ + 978.25, + 170.75 + ], + "projected_center_px": [ + 978.658447265625, + 170.99900817871094 + ], + "reprojection_error_px": 0.4783662214888061, + "confidence": 0.17612778902053833 + }, + { + "marker_id": 91, + "observed_center_px": [ + 1059.25, + 161.75 + ], + "projected_center_px": [ + 1059.4056396484375, + 161.76788330078125 + ], + "reprojection_error_px": 0.15666369270696148, + "confidence": 0.17612778902053833 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_c_aruco_detection.json b/data/evaluations/Scene7/render_c_aruco_detection.json new file mode 100644 index 0000000..424bb19 --- /dev/null +++ b/data/evaluations/Scene7/render_c_aruco_detection.json @@ -0,0 +1,1203 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:03Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "c", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_c.png", + "image_sha256": "9bc714042113aacdc2a3ac0b75c2dfaeb2fa978798e6f7dd4a957e56c91c2470", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 13, + "num_rejected_candidates": 18 + }, + "detections": [ + { + "observation_id": "26864f97-26d1-4da2-a27b-7e6215f7098b", + "type": "aruco", + "marker_id": 115, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 659.0, + 243.0 + ], + [ + 610.0, + 238.0 + ], + [ + 610.0, + 181.0 + ], + [ + 659.0, + 186.0 + ] + ], + "center_px": [ + 634.5, + 212.0 + ], + "quality": { + "area_px": 2793.0, + "perimeter_px": 212.50888061523438, + "sharpness": { + "laplacian_var": 1146.023782146508 + }, + "contrast": { + "p05": 33.0, + "p95": 189.0, + "dynamic_range": 156.0, + "mean_gray": 64.27518557794274, + "std_gray": 57.839184387647954 + }, + "geometry": { + "distance_to_center_norm": 0.20169097185134888, + "distance_to_border_px": 181.0 + }, + "edge_ratio": 1.157256069584958, + "edge_lengths_px": [ + 49.25444030761719, + 57.0, + 49.25444030761719, + 57.0 + ] + }, + "confidence": 0.8641129878529331 + }, + { + "observation_id": "d20ad25c-dc0c-4db4-9231-514e056fba29", + "type": "aruco", + "marker_id": 245, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 692.0, + 592.0 + ], + [ + 692.0, + 643.0 + ], + [ + 637.0, + 640.0 + ], + [ + 638.0, + 590.0 + ] + ], + "center_px": [ + 664.75, + 616.25 + ], + "quality": { + "area_px": 2753.5, + "perimeter_px": 210.12878036499023, + "sharpness": { + "laplacian_var": 1527.6283652883606 + }, + "contrast": { + "p05": 21.0, + "p95": 178.0, + "dynamic_range": 157.0, + "mean_gray": 80.3183540877098, + "std_gray": 71.83678338875491 + }, + "geometry": { + "distance_to_center_norm": 0.3505946397781372, + "distance_to_border_px": 77.0 + }, + "edge_ratio": 1.1014148858325372, + "edge_lengths_px": [ + 51.0, + 55.081756591796875, + 50.0099983215332, + 54.037025451660156 + ] + }, + "confidence": 0.9079230840829977 + }, + { + "observation_id": "0a3a75ac-d2dc-4c3c-815d-570e76177a54", + "type": "aruco", + "marker_id": 248, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 609.0, + 588.0 + ], + [ + 609.0, + 639.0 + ], + [ + 555.0, + 636.0 + ], + [ + 555.0, + 586.0 + ] + ], + "center_px": [ + 582.0, + 612.25 + ], + "quality": { + "area_px": 2727.0, + "perimeter_px": 209.12029647827148, + "sharpness": { + "laplacian_var": 1744.1647518081886 + }, + "contrast": { + "p05": 23.0, + "p95": 179.0, + "dynamic_range": 156.0, + "mean_gray": 88.88389923329683, + "std_gray": 72.54964454550266 + }, + "geometry": { + "distance_to_center_norm": 0.35248711705207825, + "distance_to_border_px": 81.0 + }, + "edge_ratio": 1.0816654205322265, + "edge_lengths_px": [ + 51.0, + 54.08327102661133, + 50.0, + 54.037025451660156 + ] + }, + "confidence": 0.9245002946548448 + }, + { + "observation_id": "a418f4b5-2950-40a7-b564-c4882e613ce1", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 440.0, + 587.0 + ], + [ + 493.0, + 590.0 + ], + [ + 495.0, + 638.0 + ], + [ + 442.0, + 636.0 + ] + ], + "center_px": [ + 467.5, + 612.75 + ], + "quality": { + "area_px": 2565.5, + "perimeter_px": 203.20500946044922, + "sharpness": { + "laplacian_var": 1320.4311086746548 + }, + "contrast": { + "p05": 22.0, + "p95": 178.0, + "dynamic_range": 156.0, + "mean_gray": 73.89262536873156, + "std_gray": 69.11533030860744 + }, + "geometry": { + "distance_to_center_norm": 0.41672834753990173, + "distance_to_border_px": 82.0 + }, + "edge_ratio": 1.104975372861155, + "edge_lengths_px": [ + 53.0848388671875, + 48.041648864746094, + 53.037723541259766, + 49.04079818725586 + ] + }, + "confidence": 0.9049975452490508 + }, + { + "observation_id": "5329b1d8-daa7-42d6-81b4-c4789bc1f156", + "type": "aruco", + "marker_id": 114, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 760.0, + 232.0 + ], + [ + 733.0, + 243.0 + ], + [ + 735.0, + 180.0 + ], + [ + 761.0, + 177.0 + ] + ], + "center_px": [ + 747.25, + 208.0 + ], + "quality": { + "area_px": 1553.0, + "perimeter_px": 173.3680934906006, + "sharpness": { + "laplacian_var": 366.4645395623698 + }, + "contrast": { + "p05": 10.0, + "p95": 96.0, + "dynamic_range": 86.0, + "mean_gray": 32.59132841328413, + "std_gray": 33.73266889283802 + }, + "geometry": { + "distance_to_center_norm": 0.25334033370018005, + "distance_to_border_px": 177.0 + }, + "edge_ratio": 2.408318946387279, + "edge_lengths_px": [ + 29.154760360717773, + 63.03173828125, + 26.172504425048828, + 55.009090423583984 + ] + }, + "confidence": 0.41522739398786884 + }, + { + "observation_id": "b384f0f1-42b0-45c8-9fe8-5080a39fd05e", + "type": "aruco", + "marker_id": 120, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 756.0, + 386.0 + ], + [ + 730.0, + 400.0 + ], + [ + 731.0, + 343.0 + ], + [ + 758.0, + 333.0 + ] + ], + "center_px": [ + 743.75, + 365.5 + ], + "quality": { + "area_px": 1439.5, + "perimeter_px": 168.36849975585938, + "sharpness": { + "laplacian_var": 489.39781466741107 + }, + "contrast": { + "p05": 14.0, + "p95": 99.0, + "dynamic_range": 85.0, + "mean_gray": 33.263527054108216, + "std_gray": 31.70078187565451 + }, + "geometry": { + "distance_to_center_norm": 0.1414889693260193, + "distance_to_border_px": 320.0 + }, + "edge_ratio": 1.9799964081985022, + "edge_lengths_px": [ + 29.529645919799805, + 57.00876998901367, + 28.792360305786133, + 53.037723541259766 + ] + }, + "confidence": 0.48468101391144364 + }, + { + "observation_id": "c94394f1-1501-4c49-90b8-74f635a8741a", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 460.0, + 498.0 + ], + [ + 510.0, + 500.0 + ], + [ + 501.0, + 521.0 + ], + [ + 449.0, + 519.0 + ] + ], + "center_px": [ + 480.0, + 509.5 + ], + "quality": { + "area_px": 1091.0, + "perimeter_px": 148.63229179382324, + "sharpness": { + "laplacian_var": 2477.7152655300806 + }, + "contrast": { + "p05": 17.0, + "p95": 180.0, + "dynamic_range": 163.0, + "mean_gray": 66.89153439153439, + "std_gray": 67.33391389247699 + }, + "geometry": { + "distance_to_center_norm": 0.2982088327407837, + "distance_to_border_px": 199.0 + }, + "edge_ratio": 2.2776610740426135, + "edge_lengths_px": [ + 50.03998565673828, + 22.847318649291992, + 52.038448333740234, + 23.706539154052734 + ] + }, + "confidence": 0.31933343447029705 + }, + { + "observation_id": "b66193ec-0752-4fea-bb02-97d2748917a1", + "type": "aruco", + "marker_id": 232, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 637.0, + 648.0 + ], + [ + 691.0, + 650.0 + ], + [ + 694.0, + 670.0 + ], + [ + 642.0, + 667.0 + ] + ], + "center_px": [ + 666.0, + 658.75 + ], + "quality": { + "area_px": 1023.5, + "perimeter_px": 145.99412536621094, + "sharpness": { + "laplacian_var": 1843.2125479933197 + }, + "contrast": { + "p05": 25.0, + "p95": 135.0, + "dynamic_range": 110.0, + "mean_gray": 75.38174273858921, + "std_gray": 46.84432650083618 + }, + "geometry": { + "distance_to_center_norm": 0.40838658809661865, + "distance_to_border_px": 50.0 + }, + "edge_ratio": 2.7504121351859716, + "edge_lengths_px": [ + 54.037025451660156, + 20.2237491607666, + 52.08646774291992, + 19.646883010864258 + ] + }, + "confidence": 0.24808403242708815 + }, + { + "observation_id": "ff9ac091-f94b-4cd1-b10c-070157818297", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 897.0, + 638.0 + ], + [ + 946.0, + 641.0 + ], + [ + 949.0, + 662.0 + ], + [ + 898.0, + 660.0 + ] + ], + "center_px": [ + 922.5, + 650.25 + ], + "quality": { + "area_px": 1070.0, + "perimeter_px": 143.36686897277832, + "sharpness": { + "laplacian_var": 2220.654195365492 + }, + "contrast": { + "p05": 12.0, + "p95": 157.0, + "dynamic_range": 145.0, + "mean_gray": 60.591809775429326, + "std_gray": 61.24486735263417 + }, + "geometry": { + "distance_to_center_norm": 0.5515881180763245, + "distance_to_border_px": 58.0 + }, + "edge_ratio": 2.4060109543143446, + "edge_lengths_px": [ + 49.09175109863281, + 21.21320343017578, + 51.03919982910156, + 22.022714614868164 + ] + }, + "confidence": 0.2964796698261984 + }, + { + "observation_id": "13d8d000-0bb2-483d-b128-9708510073b5", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 496.0, + 429.0 + ], + [ + 541.0, + 431.0 + ], + [ + 534.0, + 447.0 + ], + [ + 486.0, + 446.0 + ] + ], + "center_px": [ + 514.25, + 438.25 + ], + "quality": { + "area_px": 780.0, + "perimeter_px": 130.24216842651367, + "sharpness": { + "laplacian_var": 3765.0523935866267 + }, + "contrast": { + "p05": 16.0, + "p95": 177.0, + "dynamic_range": 161.0, + "mean_gray": 85.00702987697716, + "std_gray": 67.43046893198584 + }, + "geometry": { + "distance_to_center_norm": 0.20169959962368011, + "distance_to_border_px": 273.0 + }, + "edge_ratio": 2.7490684005846906, + "edge_lengths_px": [ + 45.0444221496582, + 17.464248657226562, + 48.010414123535156, + 19.72308349609375 + ] + }, + "confidence": 0.18915498788222326 + }, + { + "observation_id": "80fd81ef-3ddb-42f6-87a7-8e3dce5e8520", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 893.0, + 574.0 + ], + [ + 937.0, + 575.0 + ], + [ + 940.0, + 594.0 + ], + [ + 895.0, + 592.0 + ] + ], + "center_px": [ + 916.25, + 583.75 + ], + "quality": { + "area_px": 819.5, + "perimeter_px": 126.40194129943848, + "sharpness": { + "laplacian_var": 1535.5442305242607 + }, + "contrast": { + "p05": 14.0, + "p95": 147.0, + "dynamic_range": 133.0, + "mean_gray": 77.2908777969019, + "std_gray": 56.76711857715743 + }, + "geometry": { + "distance_to_center_norm": 0.4841289222240448, + "distance_to_border_px": 126.0 + }, + "edge_ratio": 2.4871620155740866, + "edge_lengths_px": [ + 44.0113639831543, + 19.235383987426758, + 45.0444221496582, + 18.11077117919922 + ] + }, + "confidence": 0.21966133686197709 + }, + { + "observation_id": "6a2c4d70-a97b-4d35-a5fe-ef687528b499", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 299.0, + 554.0 + ], + [ + 341.0, + 556.0 + ], + [ + 330.0, + 573.0 + ], + [ + 287.0, + 571.0 + ] + ], + "center_px": [ + 314.25, + 563.5 + ], + "quality": { + "area_px": 745.5, + "perimeter_px": 126.15118789672852, + "sharpness": { + "laplacian_var": 2616.0782747105272 + }, + "contrast": { + "p05": 25.0, + "p95": 180.0, + "dynamic_range": 155.0, + "mean_gray": 85.49162011173185, + "std_gray": 62.58729787496483 + }, + "geometry": { + "distance_to_center_norm": 0.5230682492256165, + "distance_to_border_px": 147.0 + }, + "edge_ratio": 2.1259143843226416, + "edge_lengths_px": [ + 42.04759216308594, + 20.248456954956055, + 43.046485900878906, + 20.808652877807617 + ] + }, + "confidence": 0.233781757000696 + }, + { + "observation_id": "67db30f1-3b3b-4ce0-bd8f-32b57efac143", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1098.0, + 497.0 + ], + [ + 1092.0, + 484.0 + ], + [ + 1128.0, + 485.0 + ], + [ + 1134.0, + 498.0 + ] + ], + "center_px": [ + 1113.0, + 491.0 + ], + "quality": { + "area_px": 462.0, + "perimeter_px": 100.66341400146484, + "sharpness": { + "laplacian_var": 1482.2240364955057 + }, + "contrast": { + "p05": 19.0, + "p95": 156.0, + "dynamic_range": 137.0, + "mean_gray": 104.06521739130434, + "std_gray": 47.005405742873016 + }, + "geometry": { + "distance_to_center_norm": 0.6683969497680664, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 2.515318792826958, + "edge_lengths_px": [ + 14.317821502685547, + 36.013885498046875, + 14.317821502685547, + 36.013885498046875 + ] + }, + "confidence": 0.12244968744253681 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 717.0, + 23.0 + ], + [ + 712.0, + 81.0 + ], + [ + 694.0, + 99.0 + ], + [ + 691.0, + 27.0 + ] + ], + "center_px": [ + 703.5, + 57.5 + ], + "area_px": 1419.0 + }, + { + "image_points_px": [ + [ + 485.0, + 450.0 + ], + [ + 529.0, + 452.0 + ], + [ + 507.0, + 498.0 + ], + [ + 470.0, + 497.0 + ] + ], + "center_px": [ + 497.75, + 474.25 + ], + "area_px": 1911.0 + }, + { + "image_points_px": [ + [ + 1228.0, + 489.0 + ], + [ + 1265.0, + 491.0 + ], + [ + 1273.0, + 504.0 + ], + [ + 1235.0, + 502.0 + ] + ], + "center_px": [ + 1250.25, + 496.5 + ], + "area_px": 472.5 + }, + { + "image_points_px": [ + [ + 1025.0, + 491.0 + ], + [ + 1062.0, + 493.0 + ], + [ + 1066.0, + 505.0 + ], + [ + 1028.0, + 504.0 + ] + ], + "center_px": [ + 1045.25, + 498.25 + ], + "area_px": 463.5 + }, + { + "image_points_px": [ + [ + 1137.0, + 457.0 + ], + [ + 1172.0, + 459.0 + ], + [ + 1177.0, + 470.0 + ], + [ + 1142.0, + 469.0 + ] + ], + "center_px": [ + 1157.0, + 463.75 + ], + "area_px": 395.0 + }, + { + "image_points_px": [ + [ + 967.0, + 455.0 + ], + [ + 1001.0, + 456.0 + ], + [ + 1004.0, + 468.0 + ], + [ + 970.0, + 467.0 + ] + ], + "center_px": [ + 985.5, + 461.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1202.0, + 437.0 + ], + [ + 1235.0, + 438.0 + ], + [ + 1242.0, + 448.0 + ], + [ + 1207.0, + 447.0 + ] + ], + "center_px": [ + 1221.5, + 442.5 + ], + "area_px": 334.0 + }, + { + "image_points_px": [ + [ + 1004.0, + 444.0 + ], + [ + 1037.0, + 445.0 + ], + [ + 1041.0, + 456.0 + ], + [ + 1006.0, + 455.0 + ] + ], + "center_px": [ + 1022.0, + 450.0 + ], + "area_px": 371.0 + }, + { + "image_points_px": [ + [ + 615.0, + 227.0 + ], + [ + 652.0, + 228.0 + ], + [ + 654.0, + 236.0 + ], + [ + 619.0, + 234.0 + ] + ], + "center_px": [ + 635.0, + 231.25 + ], + "area_px": 265.5 + }, + { + "image_points_px": [ + [ + 901.0, + 436.0 + ], + [ + 933.0, + 437.0 + ], + [ + 935.0, + 448.0 + ], + [ + 902.0, + 447.0 + ] + ], + "center_px": [ + 917.75, + 442.0 + ], + "area_px": 356.0 + }, + { + "image_points_px": [ + [ + 631.0, + 190.0 + ], + [ + 652.0, + 190.0 + ], + [ + 654.0, + 207.0 + ], + [ + 632.0, + 206.0 + ] + ], + "center_px": [ + 642.25, + 198.25 + ], + "area_px": 354.0 + }, + { + "image_points_px": [ + [ + 697.0, + 514.0 + ], + [ + 698.0, + 543.0 + ], + [ + 690.0, + 547.0 + ], + [ + 689.0, + 518.0 + ] + ], + "center_px": [ + 693.5, + 530.5 + ], + "area_px": 236.0 + }, + { + "image_points_px": [ + [ + 595.0, + 24.0 + ], + [ + 598.0, + 31.0 + ], + [ + 598.0, + 43.0 + ], + [ + 595.0, + 52.0 + ] + ], + "center_px": [ + 596.5, + 37.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 449.0, + 611.0 + ], + [ + 459.0, + 613.0 + ], + [ + 459.0, + 630.0 + ], + [ + 449.0, + 629.0 + ] + ], + "center_px": [ + 454.0, + 620.75 + ], + "area_px": 175.0 + }, + { + "image_points_px": [ + [ + 940.0, + 455.0 + ], + [ + 931.0, + 457.0 + ], + [ + 917.0, + 456.0 + ], + [ + 929.0, + 454.0 + ] + ], + "center_px": [ + 929.25, + 455.5 + ], + "area_px": 35.5 + }, + { + "image_points_px": [ + [ + 642.0, + 212.0 + ], + [ + 652.0, + 213.0 + ], + [ + 652.0, + 224.0 + ], + [ + 641.0, + 223.0 + ] + ], + "center_px": [ + 646.75, + 218.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 618.0, + 190.0 + ], + [ + 627.0, + 191.0 + ], + [ + 626.0, + 202.0 + ], + [ + 617.0, + 201.0 + ] + ], + "center_px": [ + 622.0, + 196.0 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 562.0, + 620.0 + ], + [ + 572.0, + 620.0 + ], + [ + 573.0, + 629.0 + ], + [ + 563.0, + 630.0 + ] + ], + "center_px": [ + 567.5, + 624.75 + ], + "area_px": 95.5 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_c_camera_pose.json b/data/evaluations/Scene7/render_c_camera_pose.json new file mode 100644 index 0000000..74a025b --- /dev/null +++ b/data/evaluations/Scene7/render_c_camera_pose.json @@ -0,0 +1,257 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:07Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_c_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "c", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 4, + "used_marker_ids": [ + 208, + 214, + 210, + 53 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.00815907053784058, + 0.00038889026461633554, + 8.059741566258575e-05, + 8.057603531058918e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.20259041142176823, + "residual_median_px": 0.15068860335028333, + "residual_max_px": 0.3306448827815234, + "sigma2_normalized": 2.5969989343700774e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.993758499622345, + 0.1115521565079689, + -0.00043949359678663313 + ], + [ + 0.03268022835254669, + -0.2948930859565735, + -0.9549712538719177 + ], + [ + -0.1066587045788765, + 0.9489964246749878, + -0.29669803380966187 + ] + ], + "translation_m": [ + -0.1977902352809906, + 0.10628540813922882, + 1.004310965538025 + ], + "rvec_rad": [ + 1.8698444553315385, + 0.1043155347711448, + -0.07745837314462278 + ] + }, + "camera_in_world": { + "position_m": [ + 0.30020081996917725, + -0.8996807336807251, + 0.39938968420028687 + ], + "position_mm": [ + 300.2008056640625, + -899.6807250976562, + 399.3896789550781 + ], + "orientation_deg": { + "roll": 107.36153411865234, + "pitch": 6.122739791870117, + "yaw": 1.8835203647613525 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 8.246326043381866e-07, + 1.2959856028252544e-07, + 1.9490143121569102e-07, + 9.573930417634736e-09, + -5.2672319999591544e-08, + 5.321782151119725e-08 + ], + [ + 1.295985602825249e-07, + 3.532319095277726e-07, + -1.0692949930590009e-07, + 5.005679212475838e-09, + -5.3080608967819447e-08, + 9.967726495155003e-08 + ], + [ + 1.9490143121568835e-07, + -1.0692949930589784e-07, + 7.262839896596602e-07, + 1.9345880069809947e-09, + -9.100117867657551e-08, + -1.834612034473196e-07 + ], + [ + 9.57393041763478e-09, + 5.005679212475731e-09, + 1.9345880069806957e-09, + 8.309753146754929e-09, + 1.344349962827341e-09, + 2.2053170650725068e-08 + ], + [ + -5.2672319999591e-08, + -5.308060896781994e-08, + -9.100117867657526e-08, + 1.344349962827285e-09, + 3.4310938619868394e-08, + 3.7279011506444744e-08 + ], + [ + 5.3217821511198174e-08, + 9.967726495154872e-08, + -1.8346120344732167e-07, + 2.2053170650725124e-08, + 3.727901150644531e-08, + 2.94676495254624e-07 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.05202988708375333, + 0.03405278190727662, + 0.048828779353641404 + ], + "tvec_std_m": [ + 9.11578474227805e-05, + 0.00018523212091823706, + 0.0005428411326112126 + ] + }, + "camera_center_std_m": [ + 0.0007788493900434405, + 0.0005268799492092695, + 0.0008621405191751387 + ], + "camera_center_std_mm": [ + 0.7788493900434406, + 0.5268799492092695, + 0.8621405191751387 + ], + "orientation_std_deg": { + "roll": 0.05852006383811758, + "pitch": 0.041075651933117956, + "yaw": 0.03201289781064694 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 208, + "observed_center_px": [ + 922.5, + 650.25 + ], + "projected_center_px": [ + 922.323486328125, + 650.3744506835938 + ], + "reprojection_error_px": 0.21597464898859506, + "confidence": 0.2964796698261984 + }, + { + "marker_id": 214, + "observed_center_px": [ + 916.25, + 583.75 + ], + "projected_center_px": [ + 916.5070190429688, + 583.5419921875 + ], + "reprojection_error_px": 0.3306448827815234, + "confidence": 0.21966133686197709 + }, + { + "marker_id": 210, + "observed_center_px": [ + 314.25, + 563.5 + ], + "projected_center_px": [ + 314.2375183105469, + 563.5274047851562 + ], + "reprojection_error_px": 0.030113366152997114, + "confidence": 0.233781757000696 + }, + { + "marker_id": 53, + "observed_center_px": [ + 1113.0, + 491.0 + ], + "projected_center_px": [ + 1112.935546875, + 491.0560302734375 + ], + "reprojection_error_px": 0.08540255771197162, + "confidence": 0.12244968744253681 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_d_aruco_detection.json b/data/evaluations/Scene7/render_d_aruco_detection.json new file mode 100644 index 0000000..c74a1a6 --- /dev/null +++ b/data/evaluations/Scene7/render_d_aruco_detection.json @@ -0,0 +1,1277 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:04Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "d", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_d.png", + "image_sha256": "04918cd2e32b115b2d4b676153804d9437c57244bf336a884f5146877ba8a5b8", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 19, + "num_rejected_candidates": 8 + }, + "detections": [ + { + "observation_id": "bdeb975c-168d-463b-918e-506fb711d298", + "type": "aruco", + "marker_id": 114, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 696.0, + 247.0 + ], + [ + 649.0, + 250.0 + ], + [ + 653.0, + 193.0 + ], + [ + 698.0, + 193.0 + ] + ], + "center_px": [ + 674.0, + 220.75 + ], + "quality": { + "area_px": 2548.5, + "perimeter_px": 203.2728500366211, + "sharpness": { + "laplacian_var": 296.8870877926384 + }, + "contrast": { + "p05": 5.0, + "p95": 97.0, + "dynamic_range": 92.0, + "mean_gray": 30.20258367586612, + "std_gray": 37.42155709202801 + }, + "geometry": { + "distance_to_center_norm": 0.1952066868543625, + "distance_to_border_px": 193.0 + }, + "edge_ratio": 1.2697817484537761, + "edge_lengths_px": [ + 47.095645904541016, + 57.14017868041992, + 45.0, + 54.037025451660156 + ] + }, + "confidence": 0.7875369142907499 + }, + { + "observation_id": "2ff28b10-4e16-478c-bc43-c1bc39e1183c", + "type": "aruco", + "marker_id": 120, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 691.0, + 394.0 + ], + [ + 645.0, + 402.0 + ], + [ + 646.0, + 348.0 + ], + [ + 692.0, + 344.0 + ] + ], + "center_px": [ + 668.5, + 372.0 + ], + "quality": { + "area_px": 2386.0, + "perimeter_px": 196.8833122253418, + "sharpness": { + "laplacian_var": 344.03551356844446 + }, + "contrast": { + "p05": 7.0, + "p95": 100.0, + "dynamic_range": 93.0, + "mean_gray": 28.278527607361962, + "std_gray": 35.284049373099855 + }, + "geometry": { + "distance_to_center_norm": 0.042112477123737335, + "distance_to_border_px": 318.0 + }, + "edge_ratio": 1.169700369989478, + "edge_lengths_px": [ + 46.69047164916992, + 54.00925827026367, + 46.173583984375, + 50.0099983215332 + ] + }, + "confidence": 0.8549197945530235 + }, + { + "observation_id": "3f020c4c-01a6-4d48-8ee1-94d5e2bc9a90", + "type": "aruco", + "marker_id": 245, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 602.0, + 579.0 + ], + [ + 601.0, + 627.0 + ], + [ + 560.0, + 615.0 + ], + [ + 561.0, + 567.0 + ] + ], + "center_px": [ + 581.0, + 597.0 + ], + "quality": { + "area_px": 1980.0, + "perimeter_px": 181.46086883544922, + "sharpness": { + "laplacian_var": 1902.2355001384296 + }, + "contrast": { + "p05": 28.0, + "p95": 178.0, + "dynamic_range": 150.0, + "mean_gray": 85.27238525206923, + "std_gray": 68.44293947726091 + }, + "geometry": { + "distance_to_center_norm": 0.33260616660118103, + "distance_to_border_px": 93.0 + }, + "edge_ratio": 1.1238387480369543, + "edge_lengths_px": [ + 48.010414123535156, + 42.72002029418945, + 48.010414123535156, + 42.72002029418945 + ] + }, + "confidence": 0.8898073693817129 + }, + { + "observation_id": "aef0a66e-0b43-46dd-b646-eef6de91a4ab", + "type": "aruco", + "marker_id": 248, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 539.0, + 561.0 + ], + [ + 539.0, + 608.0 + ], + [ + 500.0, + 597.0 + ], + [ + 500.0, + 550.0 + ] + ], + "center_px": [ + 519.5, + 579.0 + ], + "quality": { + "area_px": 1833.0, + "perimeter_px": 175.04319763183594, + "sharpness": { + "laplacian_var": 2441.0703858862366 + }, + "contrast": { + "p05": 29.0, + "p95": 180.0, + "dynamic_range": 151.0, + "mean_gray": 91.13752913752914, + "std_gray": 68.91652697461572 + }, + "geometry": { + "distance_to_center_norm": 0.3404081165790558, + "distance_to_border_px": 112.0 + }, + "edge_ratio": 1.1598752609321314, + "edge_lengths_px": [ + 47.0, + 40.52159881591797, + 47.0, + 40.52159881591797 + ] + }, + "confidence": 0.8621616769344248 + }, + { + "observation_id": "44aef80a-3a57-47d7-9774-b1c28cf90f9d", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 418.0, + 534.0 + ], + [ + 455.0, + 544.0 + ], + [ + 458.0, + 588.0 + ], + [ + 421.0, + 577.0 + ] + ], + "center_px": [ + 438.0, + 560.75 + ], + "quality": { + "area_px": 1578.0, + "perimeter_px": 164.1347312927246, + "sharpness": { + "laplacian_var": 2019.3188777144892 + }, + "contrast": { + "p05": 29.0, + "p95": 178.0, + "dynamic_range": 149.0, + "mean_gray": 79.06981132075472, + "std_gray": 65.86556372544048 + }, + "geometry": { + "distance_to_center_norm": 0.38783565163612366, + "distance_to_border_px": 132.0 + }, + "edge_ratio": 1.1506649425608824, + "edge_lengths_px": [ + 38.327537536621094, + 44.10215377807617, + 38.60051727294922, + 43.104522705078125 + ] + }, + "confidence": 0.8690627158366645 + }, + { + "observation_id": "b9074860-462f-4bad-96fe-d76697a03d18", + "type": "aruco", + "marker_id": 244, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 697.0, + 609.0 + ], + [ + 668.0, + 627.0 + ], + [ + 671.0, + 576.0 + ], + [ + 699.0, + 562.0 + ] + ], + "center_px": [ + 683.75, + 593.5 + ], + "quality": { + "area_px": 1356.5, + "perimeter_px": 163.56773948669434, + "sharpness": { + "laplacian_var": 575.7022258054884 + }, + "contrast": { + "p05": 15.0, + "p95": 90.0, + "dynamic_range": 75.0, + "mean_gray": 47.774863387978144, + "std_gray": 33.4939782836481 + }, + "geometry": { + "distance_to_center_norm": 0.3235224187374115, + "distance_to_border_px": 93.0 + }, + "edge_ratio": 1.6319512848834974, + "edge_lengths_px": [ + 34.13209533691406, + 51.088157653808594, + 31.30495262145996, + 47.04253387451172 + ] + }, + "confidence": 0.519508460732346 + }, + { + "observation_id": "cba44a75-15a4-4077-bdf0-08ffb49b80b6", + "type": "aruco", + "marker_id": 115, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 580.0, + 244.0 + ], + [ + 555.0, + 235.0 + ], + [ + 557.0, + 184.0 + ], + [ + 581.0, + 191.0 + ] + ], + "center_px": [ + 568.25, + 213.5 + ], + "quality": { + "area_px": 1286.0, + "perimeter_px": 155.61929321289062, + "sharpness": { + "laplacian_var": 1666.613857176539 + }, + "contrast": { + "p05": 31.0, + "p95": 188.0, + "dynamic_range": 157.0, + "mean_gray": 64.44040862656072, + "std_gray": 58.31001652049814 + }, + "geometry": { + "distance_to_center_norm": 0.22215192019939423, + "distance_to_border_px": 184.0 + }, + "edge_ratio": 2.1203773498535154, + "edge_lengths_px": [ + 26.570659637451172, + 51.03919982910156, + 25.0, + 53.00943374633789 + ] + }, + "confidence": 0.40433054682109365 + }, + { + "observation_id": "8a2b64e1-4d97-4ca3-b2e0-04d9e60cc708", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 876.0, + 681.0 + ], + [ + 921.0, + 694.0 + ], + [ + 900.0, + 712.0 + ], + [ + 853.0, + 699.0 + ] + ], + "center_px": [ + 887.5, + 696.5 + ], + "quality": { + "area_px": 1114.0, + "perimeter_px": 152.46969032287598, + "sharpness": { + "laplacian_var": 2655.8515047585634 + }, + "contrast": { + "p05": 12.0, + "p95": 158.0, + "dynamic_range": 146.0, + "mean_gray": 63.262251655629136, + "std_gray": 62.09268946499477 + }, + "geometry": { + "distance_to_center_norm": 0.5688640475273132, + "distance_to_border_px": 8.0 + }, + "edge_ratio": 1.7630928433655677, + "edge_lengths_px": [ + 46.840152740478516, + 27.658634185791016, + 48.764739990234375, + 29.20616340637207 + ] + }, + "confidence": 0.06739671544456982 + }, + { + "observation_id": "ddd869fe-e892-4378-b4e4-d14e33bfe144", + "type": "aruco", + "marker_id": 232, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 562.0, + 622.0 + ], + [ + 603.0, + 635.0 + ], + [ + 624.0, + 657.0 + ], + [ + 583.0, + 645.0 + ] + ], + "center_px": [ + 593.0, + 639.75 + ], + "quality": { + "area_px": 660.0, + "perimeter_px": 147.290283203125, + "sharpness": { + "laplacian_var": 3128.4368083447152 + }, + "contrast": { + "p05": 33.0, + "p95": 134.5, + "dynamic_range": 101.5, + "mean_gray": 78.95116772823779, + "std_gray": 40.55490568962231 + }, + "geometry": { + "distance_to_center_norm": 0.38631317019462585, + "distance_to_border_px": 63.0 + }, + "edge_ratio": 1.4142135913757259, + "edge_lengths_px": [ + 43.011627197265625, + 30.4138126373291, + 42.72002029418945, + 31.14482307434082 + ] + }, + "confidence": 0.31112697734150224 + }, + { + "observation_id": "0b69ea03-7faf-450c-aa78-ceeb6e06f231", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 347.0, + 694.0 + ], + [ + 378.0, + 677.0 + ], + [ + 412.0, + 688.0 + ], + [ + 381.0, + 706.0 + ] + ], + "center_px": [ + 379.5, + 691.25 + ], + "quality": { + "area_px": 951.5, + "perimeter_px": 142.9928855895996, + "sharpness": { + "laplacian_var": 3317.1906072359197 + }, + "contrast": { + "p05": 23.0, + "p95": 180.0, + "dynamic_range": 157.0, + "mean_gray": 113.1158357771261, + "std_gray": 69.14125378552673 + }, + "geometry": { + "distance_to_center_norm": 0.5738922953605652, + "distance_to_border_px": 14.0 + }, + "edge_ratio": 1.0198038667744187, + "edge_lengths_px": [ + 35.35533905029297, + 35.735137939453125, + 35.84689712524414, + 36.055511474609375 + ] + }, + "confidence": 0.17416420855033052 + }, + { + "observation_id": "285a9edc-10ef-4696-8b94-fbacdf8da13a", + "type": "aruco", + "marker_id": 58, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 229.0, + 688.0 + ], + [ + 261.0, + 671.0 + ], + [ + 294.0, + 682.0 + ], + [ + 262.0, + 699.0 + ] + ], + "center_px": [ + 261.5, + 685.0 + ], + "quality": { + "area_px": 913.0, + "perimeter_px": 142.04078674316406, + "sharpness": { + "laplacian_var": 3844.5493899259327 + }, + "contrast": { + "p05": 18.0, + "p95": 181.0, + "dynamic_range": 163.0, + "mean_gray": 77.21505376344086, + "std_gray": 69.72865878771451 + }, + "geometry": { + "distance_to_center_norm": 0.6794013381004333, + "distance_to_border_px": 21.0 + }, + "edge_ratio": 1.0416928171614068, + "edge_lengths_px": [ + 36.2353401184082, + 34.78505325317383, + 36.2353401184082, + 34.78505325317383 + ] + }, + "confidence": 0.24540823915500745 + }, + { + "observation_id": "01b83416-848f-4183-bbaa-40b738207337", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 707.0, + 631.0 + ], + [ + 746.0, + 642.0 + ], + [ + 722.0, + 659.0 + ], + [ + 682.0, + 647.0 + ] + ], + "center_px": [ + 714.25, + 644.75 + ], + "quality": { + "area_px": 933.5, + "perimeter_px": 141.37535285949707, + "sharpness": { + "laplacian_var": 487.02713762899936 + }, + "contrast": { + "p05": 6.0, + "p95": 75.0, + "dynamic_range": 69.0, + "mean_gray": 30.576399394856278, + "std_gray": 28.208575638125733 + }, + "geometry": { + "distance_to_center_norm": 0.400749534368515, + "distance_to_border_px": 61.0 + }, + "edge_ratio": 1.4199242751498353, + "edge_lengths_px": [ + 40.52159881591797, + 29.4108829498291, + 41.761226654052734, + 29.681644439697266 + ] + }, + "confidence": 0.3780219194740923 + }, + { + "observation_id": "4625907d-47ef-4518-9703-5c70238d90c3", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 947.0, + 625.0 + ], + [ + 990.0, + 636.0 + ], + [ + 971.0, + 652.0 + ], + [ + 928.0, + 641.0 + ] + ], + "center_px": [ + 959.0, + 638.5 + ], + "quality": { + "area_px": 897.0, + "perimeter_px": 138.44833374023438, + "sharpness": { + "laplacian_var": 2501.353637101308 + }, + "contrast": { + "p05": 16.0, + "p95": 147.0, + "dynamic_range": 131.0, + "mean_gray": 81.62998405103669, + "std_gray": 54.56962478743584 + }, + "geometry": { + "distance_to_center_norm": 0.5766912698745728, + "distance_to_border_px": 68.0 + }, + "edge_ratio": 1.7868599691439266, + "edge_lengths_px": [ + 44.384681701660156, + 24.83948516845703, + 44.384681701660156, + 24.83948516845703 + ] + }, + "confidence": 0.33466528453625716 + }, + { + "observation_id": "eba18b85-4f4e-48cc-97b5-061cd1139ebc", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 717.0, + 158.0 + ], + [ + 705.0, + 165.0 + ], + [ + 707.0, + 110.0 + ], + [ + 719.0, + 106.0 + ] + ], + "center_px": [ + 712.0, + 134.75 + ], + "quality": { + "area_px": 631.0, + "perimeter_px": 133.61635303497314, + "sharpness": { + "laplacian_var": 725.2798629489604 + }, + "contrast": { + "p05": 16.0, + "p95": 78.0, + "dynamic_range": 62.0, + "mean_gray": 37.45434782608696, + "std_gray": 23.25810009925237 + }, + "geometry": { + "distance_to_center_norm": 0.32204362750053406, + "distance_to_border_px": 106.0 + }, + "edge_ratio": 4.351005469574746, + "edge_lengths_px": [ + 13.892443656921387, + 55.03635025024414, + 12.649110794067383, + 52.038448333740234 + ] + }, + "confidence": 0.0749290408725987 + }, + { + "observation_id": "9d1aa856-4d10-49c9-86b5-32fc556af46a", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 180.0, + 634.0 + ], + [ + 212.0, + 620.0 + ], + [ + 242.0, + 630.0 + ], + [ + 211.0, + 644.0 + ] + ], + "center_px": [ + 211.25, + 632.0 + ], + "quality": { + "area_px": 742.0, + "perimeter_px": 133.13896942138672, + "sharpness": { + "laplacian_var": 3269.481112162731 + }, + "contrast": { + "p05": 18.0, + "p95": 180.25, + "dynamic_range": 162.25, + "mean_gray": 82.16472868217055, + "std_gray": 69.4497615265105 + }, + "geometry": { + "distance_to_center_norm": 0.6914733052253723, + "distance_to_border_px": 76.0 + }, + "edge_ratio": 1.1045360875233317, + "edge_lengths_px": [ + 34.928497314453125, + 31.62277603149414, + 34.01470184326172, + 32.572994232177734 + ] + }, + "confidence": 0.4478501628460533 + }, + { + "observation_id": "56f845f1-be99-496a-825e-8e188b406174", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 783.0, + 582.0 + ], + [ + 822.0, + 591.0 + ], + [ + 801.0, + 606.0 + ], + [ + 762.0, + 595.0 + ] + ], + "center_px": [ + 792.0, + 593.5 + ], + "quality": { + "area_px": 756.0, + "perimeter_px": 131.0517463684082, + "sharpness": { + "laplacian_var": 1508.4285688566913 + }, + "contrast": { + "p05": 11.0, + "p95": 136.7, + "dynamic_range": 125.69999999999999, + "mean_gray": 60.774193548387096, + "std_gray": 52.81333942947642 + }, + "geometry": { + "distance_to_center_norm": 0.3794279992580414, + "distance_to_border_px": 114.0 + }, + "edge_ratio": 1.6406716277865756, + "edge_lengths_px": [ + 40.024993896484375, + 25.806976318359375, + 40.52159881591797, + 24.698177337646484 + ] + }, + "confidence": 0.3071912693949274 + }, + { + "observation_id": "e2485caf-47df-4505-b962-4a92e2293a03", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1223.0, + 599.0 + ], + [ + 1235.0, + 585.0 + ], + [ + 1275.0, + 594.0 + ], + [ + 1264.0, + 608.0 + ] + ], + "center_px": [ + 1249.25, + 596.5 + ], + "quality": { + "area_px": 670.5, + "perimeter_px": 119.21976661682129, + "sharpness": { + "laplacian_var": 2141.796728884391 + }, + "contrast": { + "p05": 13.0, + "p95": 157.0, + "dynamic_range": 144.0, + "mean_gray": 59.58441558441559, + "std_gray": 57.40733560589984 + }, + "geometry": { + "distance_to_center_norm": 0.8900182247161865, + "distance_to_border_px": 5.0 + }, + "edge_ratio": 2.3576175385513936, + "edge_lengths_px": [ + 18.439088821411133, + 41.0, + 17.804492950439453, + 41.9761848449707 + ] + }, + "confidence": 0.018959818235601233 + }, + { + "observation_id": "24e6792f-514a-4232-b163-63c5b370fb83", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1201.0, + 551.0 + ], + [ + 1213.0, + 541.0 + ], + [ + 1251.0, + 548.0 + ], + [ + 1240.0, + 560.0 + ] + ], + "center_px": [ + 1226.25, + 550.0 + ], + "quality": { + "area_px": 515.5, + "perimeter_px": 110.56367206573486, + "sharpness": { + "laplacian_var": 2284.079094780816 + }, + "contrast": { + "p05": 14.0, + "p95": 155.0, + "dynamic_range": 141.0, + "mean_gray": 83.44270833333333, + "std_gray": 55.62066321070132 + }, + "geometry": { + "distance_to_center_norm": 0.8392595052719116, + "distance_to_border_px": 29.0 + }, + "edge_ratio": 2.5623376264196214, + "edge_lengths_px": [ + 15.620499610900879, + 38.63935852050781, + 16.278820037841797, + 40.024993896484375 + ] + }, + "confidence": 0.07779094550673546 + }, + { + "observation_id": "81e70943-0a84-4345-90d3-70dbc35a905a", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1151.0, + 520.0 + ], + [ + 1163.0, + 509.0 + ], + [ + 1198.0, + 517.0 + ], + [ + 1188.0, + 527.0 + ] + ], + "center_px": [ + 1175.0, + 518.25 + ], + "quality": { + "area_px": 460.5, + "perimeter_px": 103.97994232177734, + "sharpness": { + "laplacian_var": 3086.8201878597115 + }, + "contrast": { + "p05": 13.0, + "p95": 154.0, + "dynamic_range": 141.0, + "mean_gray": 81.18731988472622, + "std_gray": 55.14546715867401 + }, + "geometry": { + "distance_to_center_norm": 0.7597878575325012, + "distance_to_border_px": 82.0 + }, + "edge_ratio": 2.6627054473419296, + "edge_lengths_px": [ + 16.278820037841797, + 35.902645111083984, + 14.142135620117188, + 37.656341552734375 + ] + }, + "confidence": 0.1152962676763461 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 715.0, + 45.0 + ], + [ + 714.0, + 92.0 + ], + [ + 709.0, + 83.0 + ], + [ + 709.0, + 64.0 + ] + ], + "center_px": [ + 711.75, + 71.0 + ], + "area_px": 179.0 + }, + { + "image_points_px": [ + [ + 953.0, + 474.0 + ], + [ + 967.0, + 465.0 + ], + [ + 997.0, + 471.0 + ], + [ + 985.0, + 481.0 + ] + ], + "center_px": [ + 975.5, + 472.75 + ], + "area_px": 379.0 + }, + { + "image_points_px": [ + [ + 978.0, + 461.0 + ], + [ + 992.0, + 452.0 + ], + [ + 1021.0, + 459.0 + ], + [ + 1010.0, + 467.0 + ] + ], + "center_px": [ + 1000.25, + 459.75 + ], + "area_px": 340.5 + }, + { + "image_points_px": [ + [ + 769.0, + 414.0 + ], + [ + 789.0, + 407.0 + ], + [ + 812.0, + 414.0 + ], + [ + 797.0, + 421.0 + ] + ], + "center_px": [ + 791.75, + 414.0 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 827.0, + 446.0 + ], + [ + 842.0, + 438.0 + ], + [ + 869.0, + 444.0 + ], + [ + 857.0, + 452.0 + ] + ], + "center_px": [ + 848.75, + 445.0 + ], + "area_px": 309.0 + }, + { + "image_points_px": [ + [ + 712.0, + 116.0 + ], + [ + 715.0, + 135.0 + ], + [ + 713.0, + 153.0 + ], + [ + 708.0, + 119.0 + ] + ], + "center_px": [ + 712.0, + 130.75 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 705.0, + 342.0 + ], + [ + 708.0, + 366.0 + ], + [ + 703.0, + 379.0 + ], + [ + 700.0, + 365.0 + ] + ], + "center_px": [ + 704.0, + 363.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 810.0, + 574.0 + ], + [ + 816.0, + 573.0 + ], + [ + 835.0, + 579.0 + ], + [ + 814.0, + 577.0 + ] + ], + "center_px": [ + 818.75, + 575.75 + ], + "area_px": 55.0 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_d_camera_pose.json b/data/evaluations/Scene7/render_d_camera_pose.json new file mode 100644 index 0000000..8a1adfe --- /dev/null +++ b/data/evaluations/Scene7/render_d_camera_pose.json @@ -0,0 +1,341 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:07Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_d_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "d", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": [ + 208, + 103, + 58, + 215, + 214, + 64, + 211, + 72, + 84, + 86 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.006421509145027727, + 0.00030557365610206765, + 0.00013984425990624098, + 0.0001398419948584902 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.35158616479725346, + "residual_median_px": 0.3037123384490076, + "residual_max_px": 0.6067997853216811, + "sigma2_normalized": 2.7936833603966692e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.8191651701927185, + 0.5735576152801514, + -9.804408909985796e-05 + ], + [ + 0.1613037884235382, + -0.23054097592830658, + -0.9595999121665955 + ], + [ + -0.5504084229469299, + 0.7860550284385681, + -0.2813681662082672 + ] + ], + "translation_m": [ + -0.11498787999153137, + 0.08634817600250244, + 1.1259154081344604 + ], + "rvec_rad": [ + 1.790596874613614, + 0.564478174520628, + -0.4228673408698875 + ] + }, + "camera_in_world": { + "position_m": [ + 0.6999790668487549, + -0.7991725206375122, + 0.3996451795101166 + ], + "position_mm": [ + 699.9790649414062, + -799.1725463867188, + 399.6451721191406 + ], + "orientation_deg": { + "roll": 109.69480895996094, + "pitch": 33.39503860473633, + "yaw": 11.139729499816895 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 4.380657853891712e-07, + 1.909777464353511e-07, + 1.9402256642558702e-07, + 5.37735615057101e-10, + -8.688999311305443e-08, + -1.801114842116536e-08 + ], + [ + 1.9097774643535377e-07, + 2.2594366792578447e-07, + 1.1777604587497934e-10, + 1.9787003229410984e-08, + -4.646496948646409e-08, + 4.307997679033845e-08 + ], + [ + 1.9402256642558345e-07, + 1.177760458707247e-10, + 3.808908801665113e-07, + -2.5126550701385215e-08, + -6.69243098214973e-08, + -1.079591309518495e-07 + ], + [ + 5.377356150574698e-10, + 1.978700322941126e-08, + -2.5126550701385026e-08, + 6.381757520278886e-09, + 1.242603415050152e-09, + 1.5038319468730028e-08 + ], + [ + -8.688999311305437e-08, + -4.646496948646337e-08, + -6.692430982149819e-08, + 1.2426034150502434e-09, + 2.6508934817368584e-08, + 1.9905869946188733e-08 + ], + [ + -1.8011148421164113e-08, + 4.307997679033955e-08, + -1.0795913095184903e-07, + 1.503831946873006e-08, + 1.9905869946188422e-08, + 1.0279237329561435e-07 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.03792209305930321, + 0.02723470777907687, + 0.0353608682030318 + ], + "tvec_std_m": [ + 7.988590313865698e-05, + 0.0001628156467215869, + 0.0003206124970983108 + ] + }, + "camera_center_std_m": [ + 0.0005026282091733053, + 0.00035512846519978605, + 0.0006838758103634668 + ], + "camera_center_std_mm": [ + 0.5026282091733053, + 0.355128465199786, + 0.6838758103634668 + ], + "orientation_std_deg": { + "roll": 0.047789881267745415, + "pitch": 0.028726144527981466, + "yaw": 0.03889201443351911 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 208, + "observed_center_px": [ + 887.5, + 696.5 + ], + "projected_center_px": [ + 887.56494140625, + 696.5433349609375 + ], + "reprojection_error_px": 0.0780724348613657, + "confidence": 0.06739671544456982 + }, + { + "marker_id": 103, + "observed_center_px": [ + 379.5, + 691.25 + ], + "projected_center_px": [ + 379.3220520019531, + 691.2205200195312 + ], + "reprojection_error_px": 0.18037338844000383, + "confidence": 0.17416420855033052 + }, + { + "marker_id": 58, + "observed_center_px": [ + 261.5, + 685.0 + ], + "projected_center_px": [ + 261.35943603515625, + 685.1051635742188 + ], + "reprojection_error_px": 0.17554943906221268, + "confidence": 0.24540823915500745 + }, + { + "marker_id": 215, + "observed_center_px": [ + 714.25, + 644.75 + ], + "projected_center_px": [ + 713.986328125, + 645.098388671875 + ], + "reprojection_error_px": 0.4369182124343663, + "confidence": 0.3780219194740923 + }, + { + "marker_id": 214, + "observed_center_px": [ + 959.0, + 638.5 + ], + "projected_center_px": [ + 958.8960571289062, + 638.2381591796875 + ], + "reprojection_error_px": 0.28171747484516263, + "confidence": 0.33466528453625716 + }, + { + "marker_id": 64, + "observed_center_px": [ + 211.25, + 632.0 + ], + "projected_center_px": [ + 211.53858947753906, + 631.8489990234375 + ], + "reprojection_error_px": 0.3257072020528526, + "confidence": 0.4478501628460533 + }, + { + "marker_id": 211, + "observed_center_px": [ + 792.0, + 593.5 + ], + "projected_center_px": [ + 792.4466552734375, + 593.3665161132812 + ], + "reprojection_error_px": 0.4661747325875481, + "confidence": 0.3071912693949274 + }, + { + "marker_id": 72, + "observed_center_px": [ + 1249.25, + 596.5 + ], + "projected_center_px": [ + 1249.353759765625, + 596.5784301757812 + ], + "reprojection_error_px": 0.130066834495319, + "confidence": 0.018959818235601233 + }, + { + "marker_id": 84, + "observed_center_px": [ + 1226.25, + 550.0 + ], + "projected_center_px": [ + 1226.55322265625, + 549.6902465820312 + ], + "reprojection_error_px": 0.43346413831668795, + "confidence": 0.07779094550673546 + }, + { + "marker_id": 86, + "observed_center_px": [ + 1175.0, + 518.25 + ], + "projected_center_px": [ + 1174.4759521484375, + 518.555908203125 + ], + "reprojection_error_px": 0.6067997853216811, + "confidence": 0.1152962676763461 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_e_aruco_detection.json b/data/evaluations/Scene7/render_e_aruco_detection.json new file mode 100644 index 0000000..ea36953 --- /dev/null +++ b/data/evaluations/Scene7/render_e_aruco_detection.json @@ -0,0 +1,2362 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:04Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "e", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_e.png", + "image_sha256": "8a9b54756e41fa146d5b1b625abc04636ca87e64aaa9a3e99d19b7728983af99", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 34, + "num_rejected_candidates": 19 + }, + "detections": [ + { + "observation_id": "1e48793b-b3fa-4cf6-a418-fc56afe11a71", + "type": "aruco", + "marker_id": 114, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 650.0, + 142.0 + ], + [ + 615.0, + 142.0 + ], + [ + 618.0, + 103.0 + ], + [ + 652.0, + 106.0 + ] + ], + "center_px": [ + 633.75, + 123.25 + ], + "quality": { + "area_px": 1297.5, + "perimeter_px": 144.3028221130371, + "sharpness": { + "laplacian_var": 517.9512723631713 + }, + "contrast": { + "p05": 5.0, + "p95": 97.0, + "dynamic_range": 92.0, + "mean_gray": 29.67155756207675, + "std_gray": 37.13317840161349 + }, + "geometry": { + "distance_to_center_norm": 0.3225271999835968, + "distance_to_border_px": 103.0 + }, + "edge_ratio": 1.145995137872779, + "edge_lengths_px": [ + 35.0, + 39.11521530151367, + 34.13209533691406, + 36.055511474609375 + ] + }, + "confidence": 0.754802504315709 + }, + { + "observation_id": "7b4166d7-cf54-4f51-86ec-288f09b104a4", + "type": "aruco", + "marker_id": 120, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 645.0, + 244.0 + ], + [ + 611.0, + 244.0 + ], + [ + 613.0, + 208.0 + ], + [ + 647.0, + 208.0 + ] + ], + "center_px": [ + 629.0, + 226.0 + ], + "quality": { + "area_px": 1224.0, + "perimeter_px": 140.11102294921875, + "sharpness": { + "laplacian_var": 607.3612868480726 + }, + "contrast": { + "p05": 6.0, + "p95": 100.0, + "dynamic_range": 94.0, + "mean_gray": 27.66547619047619, + "std_gray": 35.779067417268344 + }, + "geometry": { + "distance_to_center_norm": 0.18309995532035828, + "distance_to_border_px": 208.0 + }, + "edge_ratio": 1.0604562198414522, + "edge_lengths_px": [ + 34.0, + 36.055511474609375, + 34.0, + 36.055511474609375 + ] + }, + "confidence": 0.7694801395214592 + }, + { + "observation_id": "d87224df-5d3a-44d3-a405-cb157126c394", + "type": "aruco", + "marker_id": 92, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 991.0, + 686.0 + ], + [ + 1021.0, + 676.0 + ], + [ + 1054.0, + 690.0 + ], + [ + 1026.0, + 702.0 + ] + ], + "center_px": [ + 1023.0, + 688.5 + ], + "quality": { + "area_px": 809.0, + "perimeter_px": 136.41653060913086, + "sharpness": { + "laplacian_var": 1172.3024345952601 + }, + "contrast": { + "p05": 20.0, + "p95": 165.0, + "dynamic_range": 145.0, + "mean_gray": 71.80175438596491, + "std_gray": 57.63546359307607 + }, + "geometry": { + "distance_to_center_norm": 0.6871559619903564, + "distance_to_border_px": 18.0 + }, + "edge_ratio": 1.263291448970706, + "edge_lengths_px": [ + 31.62277603149414, + 35.84689712524414, + 30.463092803955078, + 38.4837646484375 + ] + }, + "confidence": 0.15369374989294518 + }, + { + "observation_id": "87cb8457-881d-456d-b045-3e2b5b04f4b6", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1138.0, + 589.0 + ], + [ + 1171.0, + 602.0 + ], + [ + 1146.0, + 612.0 + ], + [ + 1110.0, + 599.0 + ] + ], + "center_px": [ + 1141.25, + 600.5 + ], + "quality": { + "area_px": 689.5, + "perimeter_px": 130.40157508850098, + "sharpness": { + "laplacian_var": 1844.9831765248273 + }, + "contrast": { + "p05": 17.0, + "p95": 162.84999999999997, + "dynamic_range": 145.84999999999997, + "mean_gray": 74.37809917355372, + "std_gray": 57.10823795800261 + }, + "geometry": { + "distance_to_center_norm": 0.7571271657943726, + "distance_to_border_px": 108.0 + }, + "edge_ratio": 1.4215096728839491, + "edge_lengths_px": [ + 35.46829605102539, + 26.925823211669922, + 38.27531814575195, + 29.73213768005371 + ] + }, + "confidence": 0.3233651345714012 + }, + { + "observation_id": "13d25259-1fbf-412d-ba6a-477d8e308d86", + "type": "aruco", + "marker_id": 105, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 730.0, + 653.0 + ], + [ + 763.0, + 643.0 + ], + [ + 790.0, + 656.0 + ], + [ + 759.0, + 667.0 + ] + ], + "center_px": [ + 760.5, + 654.75 + ], + "quality": { + "area_px": 726.0, + "perimeter_px": 129.54478073120117, + "sharpness": { + "laplacian_var": 1553.3801343852688 + }, + "contrast": { + "p05": 19.0, + "p95": 163.64999999999998, + "dynamic_range": 144.64999999999998, + "mean_gray": 46.025590551181104, + "std_gray": 49.040090206747124 + }, + "geometry": { + "distance_to_center_norm": 0.43365001678466797, + "distance_to_border_px": 53.0 + }, + "edge_ratio": 1.1506752463886485, + "edge_lengths_px": [ + 34.48188018798828, + 29.96664810180664, + 32.893768310546875, + 32.202484130859375 + ] + }, + "confidence": 0.420622587927407 + }, + { + "observation_id": "a1d6bcfe-f3d1-425c-98b9-b25aefc5be2a", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 645.0, + 664.0 + ], + [ + 680.0, + 654.0 + ], + [ + 705.0, + 667.0 + ], + [ + 670.0, + 677.0 + ] + ], + "center_px": [ + 675.0, + 665.5 + ], + "quality": { + "area_px": 705.0, + "perimeter_px": 129.15711212158203, + "sharpness": { + "laplacian_var": 2434.725590809674 + }, + "contrast": { + "p05": 23.400000000000002, + "p95": 171.0, + "dynamic_range": 147.6, + "mean_gray": 129.40286298568506, + "std_gray": 52.304786269039845 + }, + "geometry": { + "distance_to_center_norm": 0.4187626242637634, + "distance_to_border_px": 43.0 + }, + "edge_ratio": 1.2918072290787694, + "edge_lengths_px": [ + 36.400550842285156, + 28.17800521850586, + 36.400550842285156, + 28.17800521850586 + ] + }, + "confidence": 0.3128949822399185 + }, + { + "observation_id": "0ce527a2-476b-4cea-b92f-6cb16fdd2714", + "type": "aruco", + "marker_id": 206, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1217.0, + 556.0 + ], + [ + 1251.0, + 568.0 + ], + [ + 1229.0, + 578.0 + ], + [ + 1193.0, + 565.0 + ] + ], + "center_px": [ + 1222.5, + 566.75 + ], + "quality": { + "area_px": 620.0, + "perimeter_px": 124.12893295288086, + "sharpness": { + "laplacian_var": 2161.9528627426453 + }, + "contrast": { + "p05": 23.0, + "p95": 161.0, + "dynamic_range": 138.0, + "mean_gray": 80.42922374429224, + "std_gray": 51.05269249327553 + }, + "geometry": { + "distance_to_center_norm": 0.8417559862136841, + "distance_to_border_px": 29.0 + }, + "edge_ratio": 1.583843936128768, + "edge_lengths_px": [ + 36.055511474609375, + 24.166091918945312, + 38.27531814575195, + 25.63201141357422 + ] + }, + "confidence": 0.15136171428561934 + }, + { + "observation_id": "f1bb2e47-d37f-4a80-b41f-6a7f8c085a79", + "type": "aruco", + "marker_id": 244, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 655.0, + 397.0 + ], + [ + 629.0, + 401.0 + ], + [ + 630.0, + 367.0 + ], + [ + 657.0, + 364.0 + ] + ], + "center_px": [ + 642.75, + 382.25 + ], + "quality": { + "area_px": 882.5, + "perimeter_px": 120.54730033874512, + "sharpness": { + "laplacian_var": 630.7101593600001 + }, + "contrast": { + "p05": 10.0, + "p95": 91.0, + "dynamic_range": 81.0, + "mean_gray": 45.008, + "std_gray": 35.75250391231361 + }, + "geometry": { + "distance_to_center_norm": 0.03053142875432968, + "distance_to_border_px": 319.0 + }, + "edge_ratio": 1.2930449430185798, + "edge_lengths_px": [ + 26.305892944335938, + 34.01470184326172, + 27.166154861450195, + 33.060550689697266 + ] + }, + "confidence": 0.45499836375360975 + }, + { + "observation_id": "feb000d2-e13e-4da9-9fb5-3cf5bdd8d4a4", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 518.0, + 568.0 + ], + [ + 548.0, + 560.0 + ], + [ + 570.0, + 570.0 + ], + [ + 539.0, + 579.0 + ] + ], + "center_px": [ + 543.75, + 569.25 + ], + "quality": { + "area_px": 503.0, + "perimeter_px": 111.20100593566895, + "sharpness": { + "laplacian_var": 3352.126515679693 + }, + "contrast": { + "p05": 30.0, + "p95": 174.0, + "dynamic_range": 144.0, + "mean_gray": 85.89008042895442, + "std_gray": 58.80878482318428 + }, + "geometry": { + "distance_to_center_norm": 0.31366512179374695, + "distance_to_border_px": 141.0 + }, + "edge_ratio": 1.361650693608701, + "edge_lengths_px": [ + 31.048349380493164, + 24.166091918945312, + 32.280025482177734, + 23.706539154052734 + ] + }, + "confidence": 0.24626971873720385 + }, + { + "observation_id": "e44c993f-28a5-4a63-90f3-9b94ce6873af", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 385.0, + 577.0 + ], + [ + 417.0, + 568.0 + ], + [ + 438.0, + 579.0 + ], + [ + 404.0, + 588.0 + ] + ], + "center_px": [ + 411.0, + 578.0 + ], + "quality": { + "area_px": 543.0, + "perimeter_px": 114.0735855102539, + "sharpness": { + "laplacian_var": 3910.046875 + }, + "contrast": { + "p05": 23.0, + "p95": 176.0, + "dynamic_range": 153.0, + "mean_gray": 102.45833333333333, + "std_gray": 65.78692984848047 + }, + "geometry": { + "distance_to_center_norm": 0.43057525157928467, + "distance_to_border_px": 132.0 + }, + "edge_ratio": 1.6019955727302424, + "edge_lengths_px": [ + 33.241539001464844, + 23.706539154052734, + 35.1710090637207, + 21.954498291015625 + ] + }, + "confidence": 0.22596816505744277 + }, + { + "observation_id": "5f5f80fc-b811-42dd-a197-355c5cfbabe1", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 665.0, + 543.0 + ], + [ + 692.0, + 535.0 + ], + [ + 715.0, + 545.0 + ], + [ + 688.0, + 554.0 + ] + ], + "center_px": [ + 690.0, + 544.25 + ], + "quality": { + "area_px": 479.0, + "perimeter_px": 107.19572448730469, + "sharpness": { + "laplacian_var": 3607.1054664336316 + }, + "contrast": { + "p05": 22.0, + "p95": 172.0, + "dynamic_range": 150.0, + "mean_gray": 87.06424581005587, + "std_gray": 64.24732940880143 + }, + "geometry": { + "distance_to_center_norm": 0.25999337434768677, + "distance_to_border_px": 166.0 + }, + "edge_ratio": 1.1347944144516315, + "edge_lengths_px": [ + 28.160255432128906, + 25.079872131347656, + 28.460498809814453, + 25.495098114013672 + ] + }, + "confidence": 0.28140192555287236 + }, + { + "observation_id": "0711646f-06fc-4357-9573-30320333cede", + "type": "aruco", + "marker_id": 245, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 583.0, + 365.0 + ], + [ + 582.0, + 398.0 + ], + [ + 562.0, + 391.0 + ], + [ + 563.0, + 358.0 + ] + ], + "center_px": [ + 572.5, + 378.0 + ], + "quality": { + "area_px": 667.0, + "perimeter_px": 108.40953826904297, + "sharpness": { + "laplacian_var": 2936.2295943399254 + }, + "contrast": { + "p05": 34.0, + "p95": 179.0, + "dynamic_range": 145.0, + "mean_gray": 92.06209850107066, + "std_gray": 63.88730038278459 + }, + "geometry": { + "distance_to_center_norm": 0.09513626992702484, + "distance_to_border_px": 322.0 + }, + "edge_ratio": 1.5580811099437382, + "edge_lengths_px": [ + 33.0151481628418, + 21.189620971679688, + 33.0151481628418, + 21.189620971679688 + ] + }, + "confidence": 0.28539378587467984 + }, + { + "observation_id": "8bc77187-3921-4394-9714-c5711362acd4", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 713.0, + 555.0 + ], + [ + 741.0, + 547.0 + ], + [ + 764.0, + 557.0 + ], + [ + 736.0, + 565.0 + ] + ], + "center_px": [ + 738.5, + 556.0 + ], + "quality": { + "area_px": 464.0, + "perimeter_px": 108.4006233215332, + "sharpness": { + "laplacian_var": 2491.3161182840486 + }, + "contrast": { + "p05": 25.0, + "p95": 167.0, + "dynamic_range": 142.0, + "mean_gray": 53.69679300291545, + "std_gray": 47.05360959909549 + }, + "geometry": { + "distance_to_center_norm": 0.2987307906150818, + "distance_to_border_px": 155.0 + }, + "edge_ratio": 1.161107974431055, + "edge_lengths_px": [ + 29.120439529418945, + 25.079872131347656, + 29.120439529418945, + 25.079872131347656 + ] + }, + "confidence": 0.2664122029520185 + }, + { + "observation_id": "3cf66db6-086f-44a0-ab29-6d921810d2cd", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 676.0, + 85.0 + ], + [ + 658.0, + 87.0 + ], + [ + 660.0, + 50.0 + ], + [ + 677.0, + 49.0 + ] + ], + "center_px": [ + 667.75, + 67.75 + ], + "quality": { + "area_px": 636.5, + "perimeter_px": 108.20805931091309, + "sharpness": { + "laplacian_var": 650.1784925305568 + }, + "contrast": { + "p05": 8.0, + "p95": 79.0, + "dynamic_range": 71.0, + "mean_gray": 32.88723404255319, + "std_gray": 28.70069401652738 + }, + "geometry": { + "distance_to_center_norm": 0.39978694915771484, + "distance_to_border_px": 49.0 + }, + "edge_ratio": 2.1758867278585865, + "edge_lengths_px": [ + 18.11077117919922, + 37.05401611328125, + 17.029386520385742, + 36.013885498046875 + ] + }, + "confidence": 0.16961540871655734 + }, + { + "observation_id": "b2e959ae-000f-42c0-9dc6-5f47b4db1a95", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 643.0, + 510.0 + ], + [ + 668.0, + 503.0 + ], + [ + 694.0, + 514.0 + ], + [ + 663.0, + 520.0 + ] + ], + "center_px": [ + 667.0, + 511.75 + ], + "quality": { + "area_px": 443.5, + "perimeter_px": 108.12868309020996, + "sharpness": { + "laplacian_var": 5811.134517906336 + }, + "contrast": { + "p05": 23.0, + "p95": 174.0, + "dynamic_range": 151.0, + "mean_gray": 95.89090909090909, + "std_gray": 59.94897003505951 + }, + "geometry": { + "distance_to_center_norm": 0.20990434288978577, + "distance_to_border_px": 200.0 + }, + "edge_ratio": 1.4120906191665992, + "edge_lengths_px": [ + 25.961509704589844, + 28.23118782043457, + 31.575305938720703, + 22.360679626464844 + ] + }, + "confidence": 0.2093822185726055 + }, + { + "observation_id": "141231f1-c807-42be-a683-bde8278f1497", + "type": "aruco", + "marker_id": 66, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 306.0, + 536.0 + ], + [ + 339.0, + 529.0 + ], + [ + 356.0, + 538.0 + ], + [ + 324.0, + 546.0 + ] + ], + "center_px": [ + 331.25, + 537.25 + ], + "quality": { + "area_px": 440.0, + "perimeter_px": 106.54574584960938, + "sharpness": { + "laplacian_var": 3575.2961911629136 + }, + "contrast": { + "p05": 24.0, + "p95": 178.0, + "dynamic_range": 154.0, + "mean_gray": 74.01510574018127, + "std_gray": 62.49309144829734 + }, + "geometry": { + "distance_to_center_norm": 0.48482945561408997, + "distance_to_border_px": 174.0 + }, + "edge_ratio": 1.7537605054536587, + "edge_lengths_px": [ + 33.734256744384766, + 19.235383987426758, + 32.98484420776367, + 20.59126091003418 + ] + }, + "confidence": 0.16725963004706537 + }, + { + "observation_id": "397d03a2-8ed8-4fbf-8e5b-5fe3e638edf6", + "type": "aruco", + "marker_id": 248, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 552.0, + 355.0 + ], + [ + 551.0, + 386.0 + ], + [ + 531.0, + 379.0 + ], + [ + 532.0, + 347.0 + ] + ], + "center_px": [ + 541.5, + 366.75 + ], + "quality": { + "area_px": 637.5, + "perimeter_px": 105.76202583312988, + "sharpness": { + "laplacian_var": 3506.2336987654317 + }, + "contrast": { + "p05": 35.0, + "p95": 180.0, + "dynamic_range": 145.0, + "mean_gray": 98.95777777777778, + "std_gray": 62.958720122840596 + }, + "geometry": { + "distance_to_center_norm": 0.13445553183555603, + "distance_to_border_px": 334.0 + }, + "edge_ratio": 1.5109105173750956, + "edge_lengths_px": [ + 31.016124725341797, + 21.189620971679688, + 32.015621185302734, + 21.540658950805664 + ] + }, + "confidence": 0.2812873397283331 + }, + { + "observation_id": "64800420-23b1-4e32-877f-2c38f77cad54", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 495.0, + 533.0 + ], + [ + 524.0, + 525.0 + ], + [ + 544.0, + 535.0 + ], + [ + 515.0, + 543.0 + ] + ], + "center_px": [ + 519.5, + 534.0 + ], + "quality": { + "area_px": 450.0, + "perimeter_px": 104.8877944946289, + "sharpness": { + "laplacian_var": 4116.777819785759 + }, + "contrast": { + "p05": 29.0, + "p95": 177.0, + "dynamic_range": 148.0, + "mean_gray": 89.27826086956522, + "std_gray": 60.80816323336863 + }, + "geometry": { + "distance_to_center_norm": 0.2882344722747803, + "distance_to_border_px": 177.0 + }, + "edge_ratio": 1.3453624005794889, + "edge_lengths_px": [ + 30.08321762084961, + 22.360679626464844, + 30.08321762084961, + 22.360679626464844 + ] + }, + "confidence": 0.22298824455832925 + }, + { + "observation_id": "150cdab0-9f7d-4d54-824a-8aae0db17b99", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1176.0, + 465.0 + ], + [ + 1195.0, + 459.0 + ], + [ + 1222.0, + 467.0 + ], + [ + 1204.0, + 473.0 + ] + ], + "center_px": [ + 1199.25, + 466.0 + ], + "quality": { + "area_px": 313.0, + "perimeter_px": 96.17921829223633, + "sharpness": { + "laplacian_var": 5040.603770920133 + }, + "contrast": { + "p05": 15.0, + "p95": 156.0, + "dynamic_range": 141.0, + "mean_gray": 92.65966386554622, + "std_gray": 55.22077282280208 + }, + "geometry": { + "distance_to_center_norm": 0.7751669883728027, + "distance_to_border_px": 58.0 + }, + "edge_ratio": 1.5347819815001813, + "edge_lengths_px": [ + 19.92485809326172, + 28.160255432128906, + 18.973665237426758, + 29.120439529418945 + ] + }, + "confidence": 0.13595850692924102 + }, + { + "observation_id": "9df50c0c-7917-4e6b-afea-3851542f83cf", + "type": "aruco", + "marker_id": 51, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 507.0, + 462.0 + ], + [ + 535.0, + 457.0 + ], + [ + 551.0, + 464.0 + ], + [ + 524.0, + 470.0 + ] + ], + "center_px": [ + 529.25, + 463.25 + ], + "quality": { + "area_px": 297.0, + "perimeter_px": 92.35410118103027, + "sharpness": { + "laplacian_var": 6133.699513250405 + }, + "contrast": { + "p05": 31.0, + "p95": 177.29999999999998, + "dynamic_range": 146.29999999999998, + "mean_gray": 92.29767441860466, + "std_gray": 58.92245392027576 + }, + "geometry": { + "distance_to_center_norm": 0.20620082318782806, + "distance_to_border_px": 250.0 + }, + "edge_ratio": 1.6286371694405686, + "edge_lengths_px": [ + 28.44292449951172, + 17.464248657226562, + 27.658634185791016, + 18.788293838500977 + ] + }, + "confidence": 0.12157403976480062 + }, + { + "observation_id": "6b8cfc9c-92c5-42f5-9e91-ce3982211f17", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1108.0, + 454.0 + ], + [ + 1131.0, + 449.0 + ], + [ + 1156.0, + 456.0 + ], + [ + 1136.0, + 462.0 + ] + ], + "center_px": [ + 1132.75, + 455.25 + ], + "quality": { + "area_px": 307.0, + "perimeter_px": 99.4997673034668, + "sharpness": { + "laplacian_var": 5998.062823182993 + }, + "contrast": { + "p05": 15.0, + "p95": 155.0, + "dynamic_range": 140.0, + "mean_gray": 60.15677966101695, + "std_gray": 51.32668711273308 + }, + "geometry": { + "distance_to_center_norm": 0.6834672689437866, + "distance_to_border_px": 124.0 + }, + "edge_ratio": 1.394616100271707, + "edge_lengths_px": [ + 23.53720474243164, + 25.961509704589844, + 20.880613327026367, + 29.120439529418945 + ] + }, + "confidence": 0.14675484287524884 + }, + { + "observation_id": "7cf84dcc-0d0f-404f-8f44-e95c4f9a75fc", + "type": "aruco", + "marker_id": 95, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 402.0, + 498.0 + ], + [ + 431.0, + 491.0 + ], + [ + 449.0, + 500.0 + ], + [ + 419.0, + 506.0 + ] + ], + "center_px": [ + 425.25, + 498.75 + ], + "quality": { + "area_px": 364.5, + "perimeter_px": 99.33988952636719, + "sharpness": { + "laplacian_var": 5475.006906898789 + }, + "contrast": { + "p05": 23.0, + "p95": 179.0, + "dynamic_range": 156.0, + "mean_gray": 88.89338235294117, + "std_gray": 65.26253283087368 + }, + "geometry": { + "distance_to_center_norm": 0.34818607568740845, + "distance_to_border_px": 214.0 + }, + "edge_ratio": 1.6283605352309334, + "edge_lengths_px": [ + 29.832868576049805, + 20.124610900878906, + 30.5941162109375, + 18.788293838500977 + ] + }, + "confidence": 0.14922985097126407 + }, + { + "observation_id": "044a636b-02e5-459c-baff-8e40c4cf6fd5", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 859.0, + 438.0 + ], + [ + 882.0, + 445.0 + ], + [ + 856.0, + 451.0 + ], + [ + 835.0, + 444.0 + ] + ], + "center_px": [ + 858.0, + 444.5 + ], + "quality": { + "area_px": 307.0, + "perimeter_px": 97.59953689575195, + "sharpness": { + "laplacian_var": 5371.0344577715905 + }, + "contrast": { + "p05": 20.0, + "p95": 147.0, + "dynamic_range": 127.0, + "mean_gray": 81.33187772925764, + "std_gray": 50.60709070968798 + }, + "geometry": { + "distance_to_center_norm": 0.3184027075767517, + "distance_to_border_px": 269.0 + }, + "edge_ratio": 1.205429874000591, + "edge_lengths_px": [ + 24.041629791259766, + 26.68332862854004, + 22.135944366455078, + 24.73863410949707 + ] + }, + "confidence": 0.1697872859143744 + }, + { + "observation_id": "a3bbd7b1-321e-441a-a19f-bebf3e4a9bf6", + "type": "aruco", + "marker_id": 232, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 563.0, + 396.0 + ], + [ + 583.0, + 404.0 + ], + [ + 602.0, + 424.0 + ], + [ + 582.0, + 416.0 + ] + ], + "center_px": [ + 582.5, + 410.0 + ], + "quality": { + "area_px": 248.0, + "perimeter_px": 98.25377655029297, + "sharpness": { + "laplacian_var": 4760.039899134986 + }, + "contrast": { + "p05": 37.0, + "p95": 133.2, + "dynamic_range": 96.19999999999999, + "mean_gray": 85.85310734463278, + "std_gray": 35.019460351906616 + }, + "geometry": { + "distance_to_center_norm": 0.10377027094364166, + "distance_to_border_px": 296.0 + }, + "edge_ratio": 1.2806585623653375, + "edge_lengths_px": [ + 21.540658950805664, + 27.58622932434082, + 21.540658950805664, + 27.58622932434082 + ] + }, + "confidence": 0.12910024435238043 + }, + { + "observation_id": "6f436abd-a851-4957-b6ae-955da43c6b0e", + "type": "aruco", + "marker_id": 60, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1174.0, + 430.0 + ], + [ + 1193.0, + 425.0 + ], + [ + 1217.0, + 432.0 + ], + [ + 1199.0, + 437.0 + ] + ], + "center_px": [ + 1195.75, + 431.0 + ], + "quality": { + "area_px": 252.0, + "perimeter_px": 89.2899341583252, + "sharpness": { + "laplacian_var": 5474.010809519545 + }, + "contrast": { + "p05": 16.0, + "p95": 155.0, + "dynamic_range": 139.0, + "mean_gray": 102.5846994535519, + "std_gray": 54.34027766603922 + }, + "geometry": { + "distance_to_center_norm": 0.7629922032356262, + "distance_to_border_px": 63.0 + }, + "edge_ratio": 1.3896877719636351, + "edge_lengths_px": [ + 19.646883010864258, + 25.0, + 18.681541442871094, + 25.961509704589844 + ] + }, + "confidence": 0.1208904643109979 + }, + { + "observation_id": "0e7d743d-aee1-444e-bdc6-40a50cee236c", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 444.0, + 446.0 + ], + [ + 471.0, + 441.0 + ], + [ + 486.0, + 448.0 + ], + [ + 459.0, + 453.0 + ] + ], + "center_px": [ + 465.0, + 447.0 + ], + "quality": { + "area_px": 264.0, + "perimeter_px": 88.02401351928711, + "sharpness": { + "laplacian_var": 7597.627155480568 + }, + "contrast": { + "p05": 29.0, + "p95": 179.0, + "dynamic_range": 150.0, + "mean_gray": 129.83957219251337, + "std_gray": 55.18046170364721 + }, + "geometry": { + "distance_to_center_norm": 0.266147643327713, + "distance_to_border_px": 267.0 + }, + "edge_ratio": 1.6588624477171257, + "edge_lengths_px": [ + 27.459060668945312, + 16.552946090698242, + 27.459060668945312, + 16.552946090698242 + ] + }, + "confidence": 0.10609680160172753 + }, + { + "observation_id": "0fc60864-7bdd-4a25-95fa-3827202686be", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 686.0, + 426.0 + ], + [ + 707.0, + 434.0 + ], + [ + 682.0, + 440.0 + ], + [ + 662.0, + 432.0 + ] + ], + "center_px": [ + 684.25, + 433.0 + ], + "quality": { + "area_px": 319.0, + "perimeter_px": 94.46141815185547, + "sharpness": { + "laplacian_var": 772.9893545653555 + }, + "contrast": { + "p05": 10.0, + "p95": 73.0, + "dynamic_range": 63.0, + "mean_gray": 32.983193277310924, + "std_gray": 23.60902946238835 + }, + "geometry": { + "distance_to_center_norm": 0.11625224351882935, + "distance_to_border_px": 280.0 + }, + "edge_ratio": 1.1935531286157384, + "edge_lengths_px": [ + 22.472204208374023, + 25.70992088317871, + 21.540658950805664, + 24.73863410949707 + ] + }, + "confidence": 0.1403163344678544 + }, + { + "observation_id": "66242007-3c9c-4b3d-b558-fdb098797190", + "type": "aruco", + "marker_id": 69, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 274.0, + 439.0 + ], + [ + 302.0, + 434.0 + ], + [ + 319.0, + 442.0 + ], + [ + 287.0, + 446.0 + ] + ], + "center_px": [ + 295.5, + 440.25 + ], + "quality": { + "area_px": 292.5, + "perimeter_px": 94.24507236480713, + "sharpness": { + "laplacian_var": 7687.299054508826 + }, + "contrast": { + "p05": 24.0, + "p95": 180.0, + "dynamic_range": 156.0, + "mean_gray": 84.51196172248804, + "std_gray": 62.93568601851055 + }, + "geometry": { + "distance_to_center_norm": 0.4817137122154236, + "distance_to_border_px": 274.0 + }, + "edge_ratio": 2.1841800036803938, + "edge_lengths_px": [ + 28.44292449951172, + 18.788293838500977, + 32.24903106689453, + 14.764822959899902 + ] + }, + "confidence": 0.08927835602899967 + }, + { + "observation_id": "c201c1cb-2242-455f-8050-7f5e7dceae94", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 767.0, + 407.0 + ], + [ + 786.0, + 413.0 + ], + [ + 762.0, + 419.0 + ], + [ + 742.0, + 412.0 + ] + ], + "center_px": [ + 764.25, + 412.75 + ], + "quality": { + "area_px": 266.5, + "perimeter_px": 91.34821128845215, + "sharpness": { + "laplacian_var": 4272.925877204757 + }, + "contrast": { + "p05": 17.0, + "p95": 133.39999999999998, + "dynamic_range": 116.39999999999998, + "mean_gray": 64.52331606217616, + "std_gray": 44.841583280212916 + }, + "geometry": { + "distance_to_center_norm": 0.18382589519023895, + "distance_to_border_px": 301.0 + }, + "edge_ratio": 1.2795623434144168, + "edge_lengths_px": [ + 19.92485809326172, + 24.73863410949707, + 21.189620971679688, + 25.495098114013672 + ] + }, + "confidence": 0.13884955866439178 + }, + { + "observation_id": "c4de8297-c3ed-44e6-9832-9c6a73baa725", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1126.0, + 428.0 + ], + [ + 1145.0, + 423.0 + ], + [ + 1169.0, + 430.0 + ], + [ + 1150.0, + 435.0 + ] + ], + "center_px": [ + 1147.5, + 429.0 + ], + "quality": { + "area_px": 253.0, + "perimeter_px": 89.29376602172852, + "sharpness": { + "laplacian_var": 6798.2089547924625 + }, + "contrast": { + "p05": 16.0, + "p95": 154.75, + "dynamic_range": 138.75, + "mean_gray": 85.88709677419355, + "std_gray": 53.04586314640967 + }, + "geometry": { + "distance_to_center_norm": 0.6974908709526062, + "distance_to_border_px": 111.0 + }, + "edge_ratio": 1.272466476548753, + "edge_lengths_px": [ + 19.646883010864258, + 25.0, + 19.646883010864258, + 25.0 + ] + }, + "confidence": 0.13255097071329755 + }, + { + "observation_id": "1221516d-caa4-4ca1-acb7-4a32b2046a45", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 359.0, + 408.0 + ], + [ + 385.0, + 404.0 + ], + [ + 401.0, + 412.0 + ], + [ + 373.0, + 415.0 + ] + ], + "center_px": [ + 379.5, + 409.75 + ], + "quality": { + "area_px": 255.0, + "perimeter_px": 88.00716876983643, + "sharpness": { + "laplacian_var": 7051.0944727068445 + }, + "contrast": { + "p05": 23.0, + "p95": 179.0, + "dynamic_range": 156.0, + "mean_gray": 88.36871508379889, + "std_gray": 59.74394454270804 + }, + "geometry": { + "distance_to_center_norm": 0.36117011308670044, + "distance_to_border_px": 305.0 + }, + "edge_ratio": 1.799092672181505, + "edge_lengths_px": [ + 26.305892944335938, + 17.8885440826416, + 28.160255432128906, + 15.65247631072998 + ] + }, + "confidence": 0.09449207516023345 + }, + { + "observation_id": "a783b3e2-344c-4851-adb4-f7bfebf133f5", + "type": "aruco", + "marker_id": 86, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1106.0, + 408.0 + ], + [ + 1128.0, + 404.0 + ], + [ + 1147.0, + 409.0 + ], + [ + 1128.0, + 414.0 + ] + ], + "center_px": [ + 1127.25, + 408.75 + ], + "quality": { + "area_px": 205.0, + "perimeter_px": 84.45795440673828, + "sharpness": { + "laplacian_var": 6560.118200692042 + }, + "contrast": { + "p05": 16.0, + "p95": 154.0, + "dynamic_range": 138.0, + "mean_gray": 84.08235294117647, + "std_gray": 52.77649025726732 + }, + "geometry": { + "distance_to_center_norm": 0.6668679118156433, + "distance_to_border_px": 133.0 + }, + "edge_ratio": 1.1606680177173716, + "edge_lengths_px": [ + 22.360679626464844, + 19.646883010864258, + 19.646883010864258, + 22.803508758544922 + ] + }, + "confidence": 0.11774828338549573 + }, + { + "observation_id": "c4980591-bf45-402f-ab62-f06b8e5987c2", + "type": "aruco", + "marker_id": 52, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 806.0, + 357.0 + ], + [ + 824.0, + 353.0 + ], + [ + 845.0, + 360.0 + ], + [ + 823.0, + 363.0 + ] + ], + "center_px": [ + 824.5, + 358.25 + ], + "quality": { + "area_px": 196.5, + "perimeter_px": 80.80639266967773, + "sharpness": { + "laplacian_var": 2833.1236155624974 + }, + "contrast": { + "p05": 14.0, + "p95": 108.19999999999999, + "dynamic_range": 94.19999999999999, + "mean_gray": 49.152866242038215, + "std_gray": 31.49424487009528 + }, + "geometry": { + "distance_to_center_norm": 0.25127020478248596, + "distance_to_border_px": 353.0 + }, + "edge_ratio": 1.231634379123581, + "edge_lengths_px": [ + 18.439088821411133, + 22.135944366455078, + 22.203603744506836, + 18.027755737304688 + ] + }, + "confidence": 0.10636273412018452 + }, + { + "observation_id": "c7d9acf6-ba39-49f5-9f93-60159fb3b235", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 892.0, + 346.0 + ], + [ + 912.0, + 343.0 + ], + [ + 929.0, + 348.0 + ], + [ + 911.0, + 352.0 + ] + ], + "center_px": [ + 911.0, + 347.25 + ], + "quality": { + "area_px": 167.5, + "perimeter_px": 76.30774116516113, + "sharpness": { + "laplacian_var": 5230.845555555555 + }, + "contrast": { + "p05": 20.45, + "p95": 147.54999999999998, + "dynamic_range": 127.09999999999998, + "mean_gray": 81.38, + "std_gray": 41.60843984898576 + }, + "geometry": { + "distance_to_center_norm": 0.36946600675582886, + "distance_to_border_px": 343.0 + }, + "edge_ratio": 1.1412921952719617, + "edge_lengths_px": [ + 20.2237491607666, + 17.72004508972168, + 18.439088821411133, + 19.92485809326172 + ] + }, + "confidence": 0.09784231166152618 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 728.0, + 300.0 + ], + [ + 704.0, + 321.0 + ], + [ + 666.0, + 336.0 + ], + [ + 666.0, + 314.0 + ] + ], + "center_px": [ + 691.0, + 317.75 + ], + "area_px": 901.0 + }, + { + "image_points_px": [ + [ + 579.0, + 141.0 + ], + [ + 607.0, + 147.0 + ], + [ + 606.0, + 182.0 + ], + [ + 577.0, + 176.0 + ] + ], + "center_px": [ + 592.25, + 161.5 + ], + "area_px": 1006.5 + }, + { + "image_points_px": [ + [ + 511.0, + 586.0 + ], + [ + 477.0, + 595.0 + ], + [ + 457.0, + 584.0 + ], + [ + 489.0, + 575.0 + ] + ], + "center_px": [ + 483.5, + 585.0 + ], + "area_px": 552.0 + }, + { + "image_points_px": [ + [ + 732.0, + 278.0 + ], + [ + 677.0, + 289.0 + ], + [ + 684.0, + 283.0 + ], + [ + 716.0, + 276.0 + ] + ], + "center_px": [ + 702.25, + 281.5 + ], + "area_px": 214.5 + }, + { + "image_points_px": [ + [ + 753.0, + 466.0 + ], + [ + 781.0, + 460.0 + ], + [ + 805.0, + 469.0 + ], + [ + 777.0, + 475.0 + ] + ], + "center_px": [ + 779.0, + 467.5 + ], + "area_px": 396.0 + }, + { + "image_points_px": [ + [ + 490.0, + 338.0 + ], + [ + 508.0, + 344.0 + ], + [ + 510.0, + 375.0 + ], + [ + 492.0, + 368.0 + ] + ], + "center_px": [ + 500.0, + 356.25 + ], + "area_px": 536.0 + }, + { + "image_points_px": [ + [ + 414.0, + 438.0 + ], + [ + 388.0, + 444.0 + ], + [ + 373.0, + 436.0 + ], + [ + 399.0, + 431.0 + ] + ], + "center_px": [ + 393.5, + 437.25 + ], + "area_px": 277.5 + }, + { + "image_points_px": [ + [ + 976.0, + 370.0 + ], + [ + 997.0, + 366.0 + ], + [ + 1016.0, + 373.0 + ], + [ + 998.0, + 377.0 + ] + ], + "center_px": [ + 996.75, + 371.5 + ], + "area_px": 218.5 + }, + { + "image_points_px": [ + [ + 1005.0, + 363.0 + ], + [ + 1026.0, + 360.0 + ], + [ + 1044.0, + 366.0 + ], + [ + 1027.0, + 371.0 + ] + ], + "center_px": [ + 1025.5, + 365.0 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 866.0, + 324.0 + ], + [ + 885.0, + 321.0 + ], + [ + 902.0, + 327.0 + ], + [ + 885.0, + 331.0 + ] + ], + "center_px": [ + 884.5, + 325.75 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 817.0, + 312.0 + ], + [ + 835.0, + 309.0 + ], + [ + 851.0, + 315.0 + ], + [ + 833.0, + 318.0 + ] + ], + "center_px": [ + 834.0, + 313.5 + ], + "area_px": 156.0 + }, + { + "image_points_px": [ + [ + 601.0, + 113.0 + ], + [ + 608.0, + 116.0 + ], + [ + 607.0, + 138.0 + ], + [ + 601.0, + 139.0 + ] + ], + "center_px": [ + 604.25, + 126.5 + ], + "area_px": 156.5 + }, + { + "image_points_px": [ + [ + 1209.0, + 563.0 + ], + [ + 1211.0, + 560.0 + ], + [ + 1235.0, + 564.0 + ], + [ + 1225.0, + 566.0 + ] + ], + "center_px": [ + 1220.0, + 563.25 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 439.0, + 497.0 + ], + [ + 428.0, + 504.0 + ], + [ + 416.0, + 502.0 + ], + [ + 431.0, + 494.0 + ] + ], + "center_px": [ + 428.5, + 499.25 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 1243.0, + 567.0 + ], + [ + 1227.0, + 575.0 + ], + [ + 1220.0, + 572.0 + ], + [ + 1234.0, + 565.0 + ] + ], + "center_px": [ + 1231.0, + 569.75 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 280.0, + 439.0 + ], + [ + 301.0, + 438.0 + ], + [ + 302.0, + 442.0 + ], + [ + 289.0, + 445.0 + ] + ], + "center_px": [ + 293.0, + 441.0 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 572.0, + 311.0 + ], + [ + 575.0, + 312.0 + ], + [ + 575.0, + 333.0 + ], + [ + 571.0, + 331.0 + ] + ], + "center_px": [ + 573.25, + 321.75 + ], + "area_px": 72.5 + }, + { + "image_points_px": [ + [ + 668.0, + 130.0 + ], + [ + 669.0, + 148.0 + ], + [ + 666.0, + 152.0 + ], + [ + 665.0, + 135.0 + ] + ], + "center_px": [ + 667.0, + 141.25 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 665.0, + 409.0 + ], + [ + 677.0, + 410.0 + ], + [ + 686.0, + 416.0 + ], + [ + 670.0, + 412.0 + ] + ], + "center_px": [ + 674.5, + 411.75 + ], + "area_px": 45.5 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_e_camera_pose.json b/data/evaluations/Scene7/render_e_camera_pose.json new file mode 100644 index 0000000..a4d74d4 --- /dev/null +++ b/data/evaluations/Scene7/render_e_camera_pose.json @@ -0,0 +1,579 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:08Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_e_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "e", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 27, + "used_marker_ids": [ + 92, + 217, + 105, + 85, + 206, + 47, + 97, + 96, + 62, + 79, + 66, + 55, + 53, + 51, + 72, + 95, + 214, + 60, + 103, + 215, + 69, + 211, + 84, + 64, + 86, + 52, + 101 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.006401204531180255, + 0.0003766111975104218, + 0.00020073336004876284, + 0.00020073219734116008 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.5046750929940835, + "residual_median_px": 0.2891630629290655, + "residual_max_px": 1.2004464044344447, + "sigma2_normalized": 4.533009193041924e-08 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.6287134289741516, + 0.7776370644569397, + 0.00012919869914185256 + ], + [ + 0.20653744041919708, + -0.16682371497154236, + -0.9641121029853821 + ], + [ + -0.7497077584266663, + 0.6061769127845764, + -0.2654954791069031 + ] + ], + "translation_m": [ + -0.05458054691553116, + -0.012609036639332771, + 1.5510241985321045 + ], + "rvec_rad": [ + 1.701324518828557, + 0.8124083978521872, + -0.6187560305164702 + ] + }, + "camera_in_world": { + "position_m": [ + 1.1997345685958862, + -0.8998547196388245, + 0.39964044094085693 + ], + "position_mm": [ + 1199.734619140625, + -899.854736328125, + 399.64044189453125 + ], + "orientation_deg": { + "roll": 113.65261840820312, + "pitch": 48.5650634765625, + "yaw": 18.185768127441406 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 9.092525097642024e-08, + 1.2055598746684504e-08, + 1.7020610545735293e-08, + -3.326079669889031e-09, + -2.288680662960713e-08, + 1.4434475106646116e-08 + ], + [ + 1.20555987466846e-08, + 7.570240297842105e-08, + 5.968544706666438e-09, + 1.6832908027273283e-08, + -1.8240155458953033e-08, + 1.4200273749877888e-08 + ], + [ + 1.7020610545734956e-08, + 5.968544706666551e-09, + 1.329910907275747e-07, + -1.8735682229830523e-08, + -2.076201513992743e-08, + -1.1112517493947462e-08 + ], + [ + -3.326079669888968e-09, + 1.6832908027273256e-08, + -1.8735682229830596e-08, + 9.898855261794726e-09, + 1.6740545766904808e-10, + 1.0682794904104043e-08 + ], + [ + -2.2886806629607087e-08, + -1.8240155458953033e-08, + -2.0762015139927476e-08, + 1.674054576690441e-10, + 1.404256544786154e-08, + 3.5622395582508013e-09 + ], + [ + 1.443447510664613e-08, + 1.4200273749877892e-08, + -1.1112517493947534e-08, + 1.068279490410406e-08, + 3.562239558250812e-09, + 9.252305304310091e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.017276862888898667, + 0.015764400692976202, + 0.02089459253336782 + ], + "tvec_std_m": [ + 9.94929910184367e-05, + 0.00011850133099616029, + 0.00030417602312329107 + ] + }, + "camera_center_std_m": [ + 0.00033567786354230184, + 0.00030887631174858113, + 0.0004070570710815092 + ], + "camera_center_std_mm": [ + 0.33567786354230184, + 0.30887631174858116, + 0.40705707108150924 + ], + "orientation_std_deg": { + "roll": 0.02679691541309811, + "pitch": 0.01597896242182844, + "yaw": 0.02415617035724935 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 92, + "observed_center_px": [ + 1023.0, + 688.5 + ], + "projected_center_px": [ + 1022.7685546875, + 688.3378295898438 + ], + "reprojection_error_px": 0.2826060413516827, + "confidence": 0.15369374989294518 + }, + { + "marker_id": 217, + "observed_center_px": [ + 1141.25, + 600.5 + ], + "projected_center_px": [ + 1140.515380859375, + 600.2459106445312 + ], + "reprojection_error_px": 0.7773201929289746, + "confidence": 0.3233651345714012 + }, + { + "marker_id": 105, + "observed_center_px": [ + 760.5, + 654.75 + ], + "projected_center_px": [ + 761.0886840820312, + 655.0447998046875 + ], + "reprojection_error_px": 0.6583736577968196, + "confidence": 0.420622587927407 + }, + { + "marker_id": 85, + "observed_center_px": [ + 675.0, + 665.5 + ], + "projected_center_px": [ + 674.9059448242188, + 665.3302612304688 + ], + "reprojection_error_px": 0.19405572903994522, + "confidence": 0.3128949822399185 + }, + { + "marker_id": 206, + "observed_center_px": [ + 1222.5, + 566.75 + ], + "projected_center_px": [ + 1222.1412353515625, + 566.795166015625 + ], + "reprojection_error_px": 0.3615965181468438, + "confidence": 0.15136171428561934 + }, + { + "marker_id": 47, + "observed_center_px": [ + 543.75, + 569.25 + ], + "projected_center_px": [ + 543.755615234375, + 569.275146484375 + ], + "reprojection_error_px": 0.025765801627512016, + "confidence": 0.24626971873720385 + }, + { + "marker_id": 97, + "observed_center_px": [ + 411.0, + 578.0 + ], + "projected_center_px": [ + 411.5135803222656, + 578.326416015625 + ], + "reprojection_error_px": 0.6085327950693894, + "confidence": 0.22596816505744277 + }, + { + "marker_id": 96, + "observed_center_px": [ + 690.0, + 544.25 + ], + "projected_center_px": [ + 690.035888671875, + 544.4639282226562 + ], + "reprojection_error_px": 0.21691768304546657, + "confidence": 0.28140192555287236 + }, + { + "marker_id": 62, + "observed_center_px": [ + 738.5, + 556.0 + ], + "projected_center_px": [ + 738.5704956054688, + 555.7847900390625 + ], + "reprojection_error_px": 0.22646182388456984, + "confidence": 0.2664122029520185 + }, + { + "marker_id": 79, + "observed_center_px": [ + 667.0, + 511.75 + ], + "projected_center_px": [ + 666.1134033203125, + 511.69403076171875 + ], + "reprojection_error_px": 0.8883615413032482, + "confidence": 0.2093822185726055 + }, + { + "marker_id": 66, + "observed_center_px": [ + 331.25, + 537.25 + ], + "projected_center_px": [ + 331.1085205078125, + 537.091064453125 + ], + "reprojection_error_px": 0.2127838216831538, + "confidence": 0.16725963004706537 + }, + { + "marker_id": 55, + "observed_center_px": [ + 519.5, + 534.0 + ], + "projected_center_px": [ + 519.52685546875, + 533.9942626953125 + ], + "reprojection_error_px": 0.02746147969173249, + "confidence": 0.22298824455832925 + }, + { + "marker_id": 53, + "observed_center_px": [ + 1199.25, + 466.0 + ], + "projected_center_px": [ + 1199.4935302734375, + 465.84722900390625 + ], + "reprojection_error_px": 0.28748212349295754, + "confidence": 0.13595850692924102 + }, + { + "marker_id": 51, + "observed_center_px": [ + 529.25, + 463.25 + ], + "projected_center_px": [ + 529.0338134765625, + 463.167236328125 + ], + "reprojection_error_px": 0.2314874473880288, + "confidence": 0.12157403976480062 + }, + { + "marker_id": 72, + "observed_center_px": [ + 1132.75, + 455.25 + ], + "projected_center_px": [ + 1133.888427734375, + 455.630859375 + ], + "reprojection_error_px": 1.2004464044344447, + "confidence": 0.14675484287524884 + }, + { + "marker_id": 95, + "observed_center_px": [ + 425.25, + 498.75 + ], + "projected_center_px": [ + 426.06231689453125, + 498.87841796875 + ], + "reprojection_error_px": 0.822404956112723, + "confidence": 0.14922985097126407 + }, + { + "marker_id": 214, + "observed_center_px": [ + 858.0, + 444.5 + ], + "projected_center_px": [ + 858.5934448242188, + 444.6385498046875 + ], + "reprojection_error_px": 0.6094036492924599, + "confidence": 0.1697872859143744 + }, + { + "marker_id": 60, + "observed_center_px": [ + 1195.75, + 431.0 + ], + "projected_center_px": [ + 1195.8671875, + 430.9717102050781 + ], + "reprojection_error_px": 0.12055381641811157, + "confidence": 0.1208904643109979 + }, + { + "marker_id": 103, + "observed_center_px": [ + 465.0, + 447.0 + ], + "projected_center_px": [ + 465.3871154785156, + 447.06195068359375 + ], + "reprojection_error_px": 0.39204117246038617, + "confidence": 0.10609680160172753 + }, + { + "marker_id": 215, + "observed_center_px": [ + 684.25, + 433.0 + ], + "projected_center_px": [ + 684.2902221679688, + 433.0013122558594 + ], + "reprojection_error_px": 0.0402435685737088, + "confidence": 0.1403163344678544 + }, + { + "marker_id": 69, + "observed_center_px": [ + 295.5, + 440.25 + ], + "projected_center_px": [ + 294.65997314453125, + 440.0010070800781 + ], + "reprojection_error_px": 0.876152151215722, + "confidence": 0.08927835602899967 + }, + { + "marker_id": 211, + "observed_center_px": [ + 764.25, + 412.75 + ], + "projected_center_px": [ + 764.1819458007812, + 412.91510009765625 + ], + "reprojection_error_px": 0.1785760798018833, + "confidence": 0.13884955866439178 + }, + { + "marker_id": 84, + "observed_center_px": [ + 1147.5, + 429.0 + ], + "projected_center_px": [ + 1147.779296875, + 429.07489013671875 + ], + "reprojection_error_px": 0.2891630629290655, + "confidence": 0.13255097071329755 + }, + { + "marker_id": 64, + "observed_center_px": [ + 379.5, + 409.75 + ], + "projected_center_px": [ + 379.0390930175781, + 409.5782165527344 + ], + "reprojection_error_px": 0.49187884605835647, + "confidence": 0.09449207516023345 + }, + { + "marker_id": 86, + "observed_center_px": [ + 1127.25, + 408.75 + ], + "projected_center_px": [ + 1126.7772216796875, + 408.53515625 + ], + "reprojection_error_px": 0.5193045128550023, + "confidence": 0.11774828338549573 + }, + { + "marker_id": 52, + "observed_center_px": [ + 824.5, + 358.25 + ], + "projected_center_px": [ + 824.1967163085938, + 358.2999267578125 + ], + "reprojection_error_px": 0.30736570826731713, + "confidence": 0.10636273412018452 + }, + { + "marker_id": 101, + "observed_center_px": [ + 911.0, + 347.25 + ], + "projected_center_px": [ + 910.9776611328125, + 347.2913513183594 + ], + "reprojection_error_px": 0.04699953741558685, + "confidence": 0.09784231166152618 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_f_aruco_detection.json b/data/evaluations/Scene7/render_f_aruco_detection.json new file mode 100644 index 0000000..c296bbc --- /dev/null +++ b/data/evaluations/Scene7/render_f_aruco_detection.json @@ -0,0 +1,1763 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:05Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "f", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_f.png", + "image_sha256": "71a84b0a707c6ebfe88cbaa8f377f03d826a915727276e14547fc4b8e6b5d97e", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 28, + "num_rejected_candidates": 8 + }, + "detections": [ + { + "observation_id": "c4413bed-f0aa-4393-b1d5-a02f2a397a9e", + "type": "aruco", + "marker_id": 41, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 790.0, + 276.0 + ], + [ + 820.0, + 300.0 + ], + [ + 794.0, + 328.0 + ], + [ + 764.0, + 303.0 + ] + ], + "center_px": [ + 792.0, + 301.75 + ], + "quality": { + "area_px": 1462.0, + "perimeter_px": 153.16326904296875, + "sharpness": { + "laplacian_var": 2036.1834901112702 + }, + "contrast": { + "p05": 22.0, + "p95": 169.0, + "dynamic_range": 147.0, + "mean_gray": 59.522142121524205, + "std_gray": 57.04036074399183 + }, + "geometry": { + "distance_to_center_norm": 0.2216786891222, + "distance_to_border_px": 276.0 + }, + "edge_ratio": 1.0418297114908055, + "edge_lengths_px": [ + 38.41874694824219, + 38.20994567871094, + 39.051246643066406, + 37.48332977294922 + ] + }, + "confidence": 0.9355335674502584 + }, + { + "observation_id": "e747e812-5d79-47f5-917d-aa63c971f0f9", + "type": "aruco", + "marker_id": 46, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1214.0, + 656.0 + ], + [ + 1242.0, + 647.0 + ], + [ + 1254.0, + 676.0 + ], + [ + 1226.0, + 685.0 + ] + ], + "center_px": [ + 1234.0, + 666.0 + ], + "quality": { + "area_px": 920.0, + "perimeter_px": 121.5911865234375, + "sharpness": { + "laplacian_var": 2712.699578951379 + }, + "contrast": { + "p05": 10.0, + "p95": 156.0, + "dynamic_range": 146.0, + "mean_gray": 79.70216049382717, + "std_gray": 64.66732909377339 + }, + "geometry": { + "distance_to_center_norm": 0.9099597334861755, + "distance_to_border_px": 26.0 + }, + "edge_ratio": 1.0671121423123415, + "edge_lengths_px": [ + 29.4108829498291, + 31.38471031188965, + 29.4108829498291, + 31.38471031188965 + ] + }, + "confidence": 0.2988751797371847 + }, + { + "observation_id": "135021a6-d8c0-4aaf-b9b2-54a0a5769476", + "type": "aruco", + "marker_id": 56, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1176.0, + 617.0 + ], + [ + 1204.0, + 608.0 + ], + [ + 1216.0, + 636.0 + ], + [ + 1188.0, + 646.0 + ] + ], + "center_px": [ + 1196.0, + 626.75 + ], + "quality": { + "area_px": 912.0, + "perimeter_px": 120.99082374572754, + "sharpness": { + "laplacian_var": 2078.757827979729 + }, + "contrast": { + "p05": 10.0, + "p95": 155.0, + "dynamic_range": 145.0, + "mean_gray": 45.83179012345679, + "std_gray": 55.36891795771165 + }, + "geometry": { + "distance_to_center_norm": 0.8398146033287048, + "distance_to_border_px": 64.0 + }, + "edge_ratio": 1.0671121423123415, + "edge_lengths_px": [ + 29.4108829498291, + 30.463092803955078, + 29.73213768005371, + 31.38471031188965 + ] + }, + "confidence": 0.5697620483284124 + }, + { + "observation_id": "62936b73-9575-4d74-a10a-07b6ca42ecd8", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 840.0, + 529.0 + ], + [ + 851.0, + 557.0 + ], + [ + 822.0, + 567.0 + ], + [ + 812.0, + 538.0 + ] + ], + "center_px": [ + 831.25, + 547.75 + ], + "quality": { + "area_px": 912.0, + "perimeter_px": 120.84554862976074, + "sharpness": { + "laplacian_var": 2272.522318188416 + }, + "contrast": { + "p05": 15.0, + "p95": 160.0, + "dynamic_range": 145.0, + "mean_gray": 63.71686746987952, + "std_gray": 60.34050931908058 + }, + "geometry": { + "distance_to_center_norm": 0.3649789094924927, + "distance_to_border_px": 153.0 + }, + "edge_ratio": 1.043005886014016, + "edge_lengths_px": [ + 30.08321762084961, + 30.675724029541016, + 30.675724029541016, + 29.4108829498291 + ] + }, + "confidence": 0.5829305549976826 + }, + { + "observation_id": "986d14c3-19ba-442e-b949-b1002de24f55", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 731.0, + 642.0 + ], + [ + 760.0, + 633.0 + ], + [ + 770.0, + 661.0 + ], + [ + 742.0, + 671.0 + ] + ], + "center_px": [ + 750.75, + 651.75 + ], + "quality": { + "area_px": 912.0, + "perimeter_px": 120.84485244750977, + "sharpness": { + "laplacian_var": 1921.2818361693705 + }, + "contrast": { + "p05": 24.0, + "p95": 172.79999999999995, + "dynamic_range": 148.79999999999995, + "mean_gray": 47.42255639097744, + "std_gray": 48.390924732561004 + }, + "geometry": { + "distance_to_center_norm": 0.424979567527771, + "distance_to_border_px": 49.0 + }, + "edge_ratio": 1.0431851573911375, + "edge_lengths_px": [ + 30.364452362060547, + 29.73213768005371, + 29.73213768005371, + 31.016124725341797 + ] + }, + "confidence": 0.5711737708098855 + }, + { + "observation_id": "90b8f805-2be6-4cfd-b52c-dc4214d46bd5", + "type": "aruco", + "marker_id": 47, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 575.0, + 614.0 + ], + [ + 603.0, + 605.0 + ], + [ + 613.0, + 633.0 + ], + [ + 584.0, + 643.0 + ] + ], + "center_px": [ + 593.75, + 623.75 + ], + "quality": { + "area_px": 902.5, + "perimeter_px": 120.18319702148438, + "sharpness": { + "laplacian_var": 2741.576489230833 + }, + "contrast": { + "p05": 32.0, + "p95": 177.0, + "dynamic_range": 145.0, + "mean_gray": 80.64535768645358, + "std_gray": 61.62527758685918 + }, + "geometry": { + "distance_to_center_norm": 0.3646650016307831, + "distance_to_border_px": 77.0 + }, + "edge_ratio": 1.043005886014016, + "edge_lengths_px": [ + 29.4108829498291, + 29.73213768005371, + 30.675724029541016, + 30.364452362060547 + ] + }, + "confidence": 0.5768583617164568 + }, + { + "observation_id": "8ce155ea-fbf2-44c2-b8ff-8e98fd29a712", + "type": "aruco", + "marker_id": 54, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 522.0, + 629.0 + ], + [ + 550.0, + 620.0 + ], + [ + 559.0, + 649.0 + ], + [ + 531.0, + 658.0 + ] + ], + "center_px": [ + 540.5, + 639.0 + ], + "quality": { + "area_px": 893.0, + "perimeter_px": 119.5506706237793, + "sharpness": { + "laplacian_var": 2051.2691655248113 + }, + "contrast": { + "p05": 35.0, + "p95": 178.0, + "dynamic_range": 143.0, + "mean_gray": 64.74726989079564, + "std_gray": 51.98537322370563 + }, + "geometry": { + "distance_to_center_norm": 0.4033917188644409, + "distance_to_border_px": 62.0 + }, + "edge_ratio": 1.032422332027845, + "edge_lengths_px": [ + 29.4108829498291, + 30.364452362060547, + 29.4108829498291, + 30.364452362060547 + ] + }, + "confidence": 0.5766374039623903 + }, + { + "observation_id": "c26b599f-4d70-4e5c-b244-7d34892d6d3e", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1221.0, + 585.0 + ], + [ + 1248.0, + 576.0 + ], + [ + 1260.0, + 604.0 + ], + [ + 1233.0, + 614.0 + ] + ], + "center_px": [ + 1240.5, + 594.75 + ], + "quality": { + "area_px": 883.5, + "perimeter_px": 119.10066223144531, + "sharpness": { + "laplacian_var": 2905.0537199899104 + }, + "contrast": { + "p05": 10.0, + "p95": 160.0, + "dynamic_range": 150.0, + "mean_gray": 86.57433489827856, + "std_gray": 66.09243561503772 + }, + "geometry": { + "distance_to_center_norm": 0.8780498504638672, + "distance_to_border_px": 20.0 + }, + "edge_ratio": 1.102746319437901, + "edge_lengths_px": [ + 28.460498809814453, + 30.463092803955078, + 28.792360305786133, + 31.38471031188965 + ] + }, + "confidence": 0.21364841201201337 + }, + { + "observation_id": "85769bb4-9675-48eb-b042-5714934faff4", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 473.0, + 596.0 + ], + [ + 501.0, + 586.0 + ], + [ + 510.0, + 615.0 + ], + [ + 482.0, + 624.0 + ] + ], + "center_px": [ + 491.5, + 605.25 + ], + "quality": { + "area_px": 883.5, + "perimeter_px": 118.91835594177246, + "sharpness": { + "laplacian_var": 2658.3630248174045 + }, + "contrast": { + "p05": 39.0, + "p95": 180.0, + "dynamic_range": 141.0, + "mean_gray": 104.42589703588143, + "std_gray": 63.90804541292981 + }, + "geometry": { + "distance_to_center_norm": 0.3904455602169037, + "distance_to_border_px": 96.0 + }, + "edge_ratio": 1.032422332027845, + "edge_lengths_px": [ + 29.73213768005371, + 30.364452362060547, + 29.4108829498291, + 29.4108829498291 + ] + }, + "confidence": 0.5705029634947052 + }, + { + "observation_id": "01db305e-db45-4add-87c7-a2f4331fd476", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1178.0, + 539.0 + ], + [ + 1206.0, + 530.0 + ], + [ + 1217.0, + 558.0 + ], + [ + 1190.0, + 567.0 + ] + ], + "center_px": [ + 1197.75, + 548.5 + ], + "quality": { + "area_px": 873.5, + "perimeter_px": 118.41769218444824, + "sharpness": { + "laplacian_var": 2225.3235952290656 + }, + "contrast": { + "p05": 10.0, + "p95": 159.0, + "dynamic_range": 149.0, + "mean_gray": 53.87480190174326, + "std_gray": 60.29154089823134 + }, + "geometry": { + "distance_to_center_norm": 0.8017706871032715, + "distance_to_border_px": 63.0 + }, + "edge_ratio": 1.0703639808818122, + "edge_lengths_px": [ + 29.4108829498291, + 30.08321762084961, + 28.460498809814453, + 30.463092803955078 + ] + }, + "confidence": 0.5440516905787338 + }, + { + "observation_id": "c3215d38-18d3-4dab-bf23-ff56f24ea7a9", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 580.0, + 534.0 + ], + [ + 608.0, + 524.0 + ], + [ + 618.0, + 552.0 + ], + [ + 589.0, + 561.0 + ] + ], + "center_px": [ + 598.75, + 542.75 + ], + "quality": { + "area_px": 874.0, + "perimeter_px": 118.28922653198242, + "sharpness": { + "laplacian_var": 2681.121792712054 + }, + "contrast": { + "p05": 34.0, + "p95": 179.0, + "dynamic_range": 145.0, + "mean_gray": 89.1563981042654, + "std_gray": 63.47134936726854 + }, + "geometry": { + "distance_to_center_norm": 0.2551368772983551, + "distance_to_border_px": 159.0 + }, + "edge_ratio": 1.0668981090236382, + "edge_lengths_px": [ + 29.73213768005371, + 29.73213768005371, + 30.364452362060547, + 28.460498809814453 + ] + }, + "confidence": 0.5461315019106076 + }, + { + "observation_id": "ff10f2d7-544e-441e-8354-d38c00f39137", + "type": "aruco", + "marker_id": 96, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 704.0, + 605.0 + ], + [ + 732.0, + 596.0 + ], + [ + 742.0, + 624.0 + ], + [ + 714.0, + 633.0 + ] + ], + "center_px": [ + 723.0, + 614.5 + ], + "quality": { + "area_px": 874.0, + "perimeter_px": 118.28604125976562, + "sharpness": { + "laplacian_var": 2521.974721098382 + }, + "contrast": { + "p05": 26.0, + "p95": 175.0, + "dynamic_range": 149.0, + "mean_gray": 89.5886075949367, + "std_gray": 67.26368664516674 + }, + "geometry": { + "distance_to_center_norm": 0.36455342173576355, + "distance_to_border_px": 87.0 + }, + "edge_ratio": 1.0109229882956123, + "edge_lengths_px": [ + 29.4108829498291, + 29.73213768005371, + 29.4108829498291, + 29.73213768005371 + ] + }, + "confidence": 0.5763709732716893 + }, + { + "observation_id": "339d1360-6dca-4b40-8b86-985edae149c9", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1235.0, + 476.0 + ], + [ + 1262.0, + 467.0 + ], + [ + 1274.0, + 494.0 + ], + [ + 1246.0, + 503.0 + ] + ], + "center_px": [ + 1254.25, + 485.0 + ], + "quality": { + "area_px": 846.0, + "perimeter_px": 116.57271575927734, + "sharpness": { + "laplacian_var": 3185.370192346838 + }, + "contrast": { + "p05": 10.0, + "p95": 159.0, + "dynamic_range": 149.0, + "mean_gray": 75.2322899505766, + "std_gray": 64.28317510445991 + }, + "geometry": { + "distance_to_center_norm": 0.8536534309387207, + "distance_to_border_px": 6.0 + }, + "edge_ratio": 1.0381607798359118, + "edge_lengths_px": [ + 28.460498809814453, + 29.546573638916016, + 29.4108829498291, + 29.154760360717773 + ] + }, + "confidence": 0.06519221426443914 + }, + { + "observation_id": "381caf08-a06b-45aa-a1bb-b4194a9c1d2b", + "type": "aruco", + "marker_id": 79, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 713.0, + 526.0 + ], + [ + 741.0, + 518.0 + ], + [ + 750.0, + 545.0 + ], + [ + 722.0, + 554.0 + ] + ], + "center_px": [ + 731.5, + 535.75 + ], + "quality": { + "area_px": 846.5, + "perimeter_px": 116.4027042388916, + "sharpness": { + "laplacian_var": 3334.91236272551 + }, + "contrast": { + "p05": 26.400000000000002, + "p95": 176.0, + "dynamic_range": 149.6, + "mean_gray": 100.36124794745484, + "std_gray": 65.04590428400601 + }, + "geometry": { + "distance_to_center_norm": 0.26983729004859924, + "distance_to_border_px": 166.0 + }, + "edge_ratio": 1.0333930949828227, + "edge_lengths_px": [ + 29.120439529418945, + 28.460498809814453, + 29.4108829498291, + 29.4108829498291 + ] + }, + "confidence": 0.5460974493377216 + }, + { + "observation_id": "95609a3b-a27a-4fa1-8798-a3590d92ece0", + "type": "aruco", + "marker_id": 66, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 435.0, + 486.0 + ], + [ + 463.0, + 478.0 + ], + [ + 471.0, + 505.0 + ], + [ + 443.0, + 514.0 + ] + ], + "center_px": [ + 453.0, + 495.75 + ], + "quality": { + "area_px": 838.0, + "perimeter_px": 115.8120174407959, + "sharpness": { + "laplacian_var": 2231.8786526375256 + }, + "contrast": { + "p05": 43.0, + "p95": 182.0, + "dynamic_range": 139.0, + "mean_gray": 85.51596638655462, + "std_gray": 57.830854466000915 + }, + "geometry": { + "distance_to_center_norm": 0.31469058990478516, + "distance_to_border_px": 206.0 + }, + "edge_ratio": 1.0444110857131401, + "edge_lengths_px": [ + 29.120439529418945, + 28.160255432128906, + 29.4108829498291, + 29.120439529418945 + ] + }, + "confidence": 0.5349107016469481 + }, + { + "observation_id": "535c5cd6-0c1d-4bbd-9344-6f5039444028", + "type": "aruco", + "marker_id": 95, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 531.0, + 426.0 + ], + [ + 558.0, + 417.0 + ], + [ + 567.0, + 444.0 + ], + [ + 539.0, + 453.0 + ] + ], + "center_px": [ + 548.75, + 435.0 + ], + "quality": { + "area_px": 819.0, + "perimeter_px": 114.49213600158691, + "sharpness": { + "laplacian_var": 2533.282472057857 + }, + "contrast": { + "p05": 37.0, + "p95": 182.0, + "dynamic_range": 145.0, + "mean_gray": 94.08034188034188, + "std_gray": 63.55105927461676 + }, + "geometry": { + "distance_to_center_norm": 0.1608557105064392, + "distance_to_border_px": 267.0 + }, + "edge_ratio": 1.0444110857131401, + "edge_lengths_px": [ + 28.460498809814453, + 28.460498809814453, + 29.4108829498291, + 28.160255432128906 + ] + }, + "confidence": 0.5227826547122322 + }, + { + "observation_id": "22fed7f6-67af-49f7-a583-4cfcf3daf071", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 600.0, + 305.0 + ], + [ + 627.0, + 296.0 + ], + [ + 636.0, + 322.0 + ], + [ + 609.0, + 331.0 + ] + ], + "center_px": [ + 618.0, + 313.5 + ], + "quality": { + "area_px": 783.0, + "perimeter_px": 111.9482650756836, + "sharpness": { + "laplacian_var": 2573.8392662933206 + }, + "contrast": { + "p05": 34.0, + "p95": 182.0, + "dynamic_range": 148.0, + "mean_gray": 118.74954954954956, + "std_gray": 65.35251861241679 + }, + "geometry": { + "distance_to_center_norm": 0.07005522400140762, + "distance_to_border_px": 296.0 + }, + "edge_ratio": 1.0344143958281513, + "edge_lengths_px": [ + 28.460498809814453, + 27.513633728027344, + 28.460498809814453, + 27.513633728027344 + ] + }, + "confidence": 0.5046333482067283 + }, + { + "observation_id": "a6c7aa46-bbde-4e6f-aa97-24b288233e3e", + "type": "aruco", + "marker_id": 73, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1229.0, + 243.0 + ], + [ + 1255.0, + 234.0 + ], + [ + 1266.0, + 260.0 + ], + [ + 1240.0, + 268.0 + ] + ], + "center_px": [ + 1247.5, + 251.25 + ], + "quality": { + "area_px": 756.5, + "perimeter_px": 110.26076316833496, + "sharpness": { + "laplacian_var": 3090.448202272599 + }, + "contrast": { + "p05": 11.0, + "p95": 161.0, + "dynamic_range": 150.0, + "mean_gray": 87.25, + "std_gray": 63.30573490157563 + }, + "geometry": { + "distance_to_center_norm": 0.8404671549797058, + "distance_to_border_px": 14.0 + }, + "edge_ratio": 1.0377990707729312, + "edge_lengths_px": [ + 27.513633728027344, + 28.23118782043457, + 27.20294189453125, + 27.312999725341797 + ] + }, + "confidence": 0.13607001327160623 + }, + { + "observation_id": "386322ea-953d-4517-bdd8-049730db5838", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 784.0, + 134.0 + ], + [ + 793.0, + 159.0 + ], + [ + 766.0, + 167.0 + ], + [ + 757.0, + 142.0 + ] + ], + "center_px": [ + 775.0, + 150.5 + ], + "quality": { + "area_px": 747.0, + "perimeter_px": 109.46183013916016, + "sharpness": { + "laplacian_var": 3157.141410892163 + }, + "contrast": { + "p05": 27.0, + "p95": 182.0, + "dynamic_range": 155.0, + "mean_gray": 84.0361216730038, + "std_gray": 65.79595018117567 + }, + "geometry": { + "distance_to_center_norm": 0.33940964937210083, + "distance_to_border_px": 134.0 + }, + "edge_ratio": 1.0598252288940997, + "edge_lengths_px": [ + 26.570659637451172, + 28.160255432128906, + 26.570659637451172, + 28.160255432128906 + ] + }, + "confidence": 0.46988879526830113 + }, + { + "observation_id": "2bcd08ee-a607-4117-9645-356174b80117", + "type": "aruco", + "marker_id": 58, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 545.0, + 256.0 + ], + [ + 572.0, + 247.0 + ], + [ + 580.0, + 273.0 + ], + [ + 554.0, + 281.0 + ] + ], + "center_px": [ + 562.75, + 264.25 + ], + "quality": { + "area_px": 748.0, + "perimeter_px": 109.43704223632812, + "sharpness": { + "laplacian_var": 2770.4630976304416 + }, + "contrast": { + "p05": 37.0, + "p95": 183.0, + "dynamic_range": 146.0, + "mean_gray": 91.24714828897338, + "std_gray": 62.30441443756348 + }, + "geometry": { + "distance_to_center_norm": 0.16754259169101715, + "distance_to_border_px": 247.0 + }, + "edge_ratio": 1.071125037848122, + "edge_lengths_px": [ + 28.460498809814453, + 27.20294189453125, + 27.20294189453125, + 26.570659637451172 + ] + }, + "confidence": 0.4655541127751829 + }, + { + "observation_id": "133a9c30-246c-4ba7-88a2-e990b8f33b18", + "type": "aruco", + "marker_id": 69, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 459.0, + 232.0 + ], + [ + 485.0, + 224.0 + ], + [ + 494.0, + 249.0 + ], + [ + 467.0, + 258.0 + ] + ], + "center_px": [ + 476.25, + 240.75 + ], + "quality": { + "area_px": 748.0, + "perimeter_px": 109.43704223632812, + "sharpness": { + "laplacian_var": 2613.853857537383 + }, + "contrast": { + "p05": 43.0, + "p95": 184.0, + "dynamic_range": 141.0, + "mean_gray": 95.39848197343454, + "std_gray": 60.17265353123222 + }, + "geometry": { + "distance_to_center_norm": 0.2758673429489136, + "distance_to_border_px": 224.0 + }, + "edge_ratio": 1.071125037848122, + "edge_lengths_px": [ + 27.20294189453125, + 26.570659637451172, + 28.460498809814453, + 27.20294189453125 + ] + }, + "confidence": 0.4655541127751829 + }, + { + "observation_id": "e6f43a1a-8f51-404a-b818-dacf73834701", + "type": "aruco", + "marker_id": 82, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1189.0, + 253.0 + ], + [ + 1215.0, + 245.0 + ], + [ + 1226.0, + 270.0 + ], + [ + 1200.0, + 278.0 + ] + ], + "center_px": [ + 1207.5, + 261.5 + ], + "quality": { + "area_px": 738.0, + "perimeter_px": 109.0318832397461, + "sharpness": { + "laplacian_var": 2198.4106123430083 + }, + "contrast": { + "p05": 10.0, + "p95": 158.0, + "dynamic_range": 148.0, + "mean_gray": 77.70736434108527, + "std_gray": 64.62405910753301 + }, + "geometry": { + "distance_to_center_norm": 0.784397304058075, + "distance_to_border_px": 54.0 + }, + "edge_ratio": 1.0040458061939497, + "edge_lengths_px": [ + 27.20294189453125, + 27.312999725341797, + 27.20294189453125, + 27.312999725341797 + ] + }, + "confidence": 0.49001748422717006 + }, + { + "observation_id": "0b87ada6-8082-437f-a207-fb610a815460", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1144.0, + 145.0 + ], + [ + 1170.0, + 137.0 + ], + [ + 1180.0, + 162.0 + ], + [ + 1155.0, + 170.0 + ] + ], + "center_px": [ + 1162.25, + 153.5 + ], + "quality": { + "area_px": 721.5, + "perimeter_px": 107.6905746459961, + "sharpness": { + "laplacian_var": 2592.0619173595364 + }, + "contrast": { + "p05": 11.0, + "p95": 157.0, + "dynamic_range": 146.0, + "mean_gray": 78.13888888888889, + "std_gray": 61.98166455995333 + }, + "geometry": { + "distance_to_center_norm": 0.7647988200187683, + "distance_to_border_px": 100.0 + }, + "edge_ratio": 1.0405424062428426, + "edge_lengths_px": [ + 27.20294189453125, + 26.925823211669922, + 26.248809814453125, + 27.312999725341797 + ] + }, + "confidence": 0.46225891142368675 + }, + { + "observation_id": "65c117fb-c723-4f2c-b3e9-05f15bcbe27c", + "type": "aruco", + "marker_id": 81, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1009.0, + 206.0 + ], + [ + 1035.0, + 197.0 + ], + [ + 1045.0, + 222.0 + ], + [ + 1019.0, + 230.0 + ] + ], + "center_px": [ + 1027.0, + 213.75 + ], + "quality": { + "area_px": 722.0, + "perimeter_px": 107.64239883422852, + "sharpness": { + "laplacian_var": 668.2052654253406 + }, + "contrast": { + "p05": 4.0, + "p95": 91.0, + "dynamic_range": 87.0, + "mean_gray": 33.6520874751491, + "std_gray": 35.7467932999441 + }, + "geometry": { + "distance_to_center_norm": 0.5634089708328247, + "distance_to_border_px": 197.0 + }, + "edge_ratio": 1.0582166818472056, + "edge_lengths_px": [ + 27.513633728027344, + 26.925823211669922, + 27.20294189453125, + 26.0 + ] + }, + "confidence": 0.4548532843889077 + }, + { + "observation_id": "0bb64099-5d1f-4dfb-ba1c-394e49990e8d", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 553.0, + 169.0 + ], + [ + 580.0, + 162.0 + ], + [ + 588.0, + 186.0 + ], + [ + 561.0, + 194.0 + ] + ], + "center_px": [ + 570.5, + 177.75 + ], + "quality": { + "area_px": 721.5, + "perimeter_px": 107.59993743896484, + "sharpness": { + "laplacian_var": 2674.714149593177 + }, + "contrast": { + "p05": 36.0, + "p95": 183.0, + "dynamic_range": 147.0, + "mean_gray": 90.5049504950495, + "std_gray": 63.307769964427244 + }, + "geometry": { + "distance_to_center_norm": 0.2656291127204895, + "distance_to_border_px": 162.0 + }, + "edge_ratio": 1.1131318197219238, + "edge_lengths_px": [ + 27.892650604248047, + 25.298221588134766, + 28.160255432128906, + 26.248809814453125 + ] + }, + "confidence": 0.43211414091114625 + }, + { + "observation_id": "0d5ba706-e28b-4e8f-8dfa-e931f1f1c6e9", + "type": "aruco", + "marker_id": 52, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1037.0, + 152.0 + ], + [ + 1062.0, + 144.0 + ], + [ + 1072.0, + 169.0 + ], + [ + 1047.0, + 177.0 + ] + ], + "center_px": [ + 1054.5, + 160.5 + ], + "quality": { + "area_px": 705.0, + "perimeter_px": 106.3492660522461, + "sharpness": { + "laplacian_var": 1260.5802083464018 + }, + "contrast": { + "p05": 6.0, + "p95": 121.59999999999997, + "dynamic_range": 115.59999999999997, + "mean_gray": 45.93456032719836, + "std_gray": 45.56928938251218 + }, + "geometry": { + "distance_to_center_norm": 0.6264604926109314, + "distance_to_border_px": 144.0 + }, + "edge_ratio": 1.0257921559873553, + "edge_lengths_px": [ + 26.248809814453125, + 26.925823211669922, + 26.248809814453125, + 26.925823211669922 + ] + }, + "confidence": 0.45818248585417487 + }, + { + "observation_id": "4bd8ecac-c4d7-4304-94e3-ddadeb163e86", + "type": "aruco", + "marker_id": 83, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1155.0, + 56.0 + ], + [ + 1180.0, + 48.0 + ], + [ + 1191.0, + 72.0 + ], + [ + 1166.0, + 80.0 + ] + ], + "center_px": [ + 1173.0, + 64.0 + ], + "quality": { + "area_px": 688.0, + "perimeter_px": 105.29913330078125, + "sharpness": { + "laplacian_var": 3336.15054567466 + }, + "contrast": { + "p05": 12.0, + "p95": 166.0, + "dynamic_range": 154.0, + "mean_gray": 93.4620253164557, + "std_gray": 64.6656088116914 + }, + "geometry": { + "distance_to_center_norm": 0.8302794098854065, + "distance_to_border_px": 48.0 + }, + "edge_ratio": 1.0057887204242193, + "edge_lengths_px": [ + 26.248809814453125, + 26.4007568359375, + 26.248809814453125, + 26.4007568359375 + ] + }, + "confidence": 0.4377857805109236 + }, + { + "observation_id": "281d6d4d-eaef-4de3-a2ff-ef9692e62457", + "type": "aruco", + "marker_id": 120, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 748.0, + 430.0 + ], + [ + 714.0, + 426.0 + ], + [ + 716.0, + 418.0 + ], + [ + 751.0, + 422.0 + ] + ], + "center_px": [ + 732.25, + 424.0 + ], + "quality": { + "area_px": 286.0, + "perimeter_px": 86.25252914428711, + "sharpness": { + "laplacian_var": 3876.824614821089 + }, + "contrast": { + "p05": 31.0, + "p95": 100.0, + "dynamic_range": 69.0, + "mean_gray": 53.86124401913876, + "std_gray": 24.46958624668581 + }, + "geometry": { + "distance_to_center_norm": 0.15290257334709167, + "distance_to_border_px": 290.0 + }, + "edge_ratio": 4.272001863352816, + "edge_lengths_px": [ + 34.2344856262207, + 8.246211051940918, + 35.22782897949219, + 8.5440034866333 + ] + }, + "confidence": 0.038494833396662875 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 769.0, + 432.0 + ], + [ + 781.0, + 458.0 + ], + [ + 785.0, + 487.0 + ], + [ + 767.0, + 443.0 + ] + ], + "center_px": [ + 775.5, + 455.0 + ], + "area_px": 265.0 + }, + { + "image_points_px": [ + [ + 868.0, + 162.0 + ], + [ + 870.0, + 169.0 + ], + [ + 821.0, + 181.0 + ], + [ + 821.0, + 175.0 + ] + ], + "center_px": [ + 845.0, + 171.75 + ], + "area_px": 324.5 + }, + { + "image_points_px": [ + [ + 931.0, + 499.0 + ], + [ + 942.0, + 527.0 + ], + [ + 917.0, + 535.0 + ], + [ + 907.0, + 507.0 + ] + ], + "center_px": [ + 924.25, + 517.0 + ], + "area_px": 770.0 + }, + { + "image_points_px": [ + [ + 887.0, + 383.0 + ], + [ + 897.0, + 410.0 + ], + [ + 873.0, + 418.0 + ], + [ + 863.0, + 391.0 + ] + ], + "center_px": [ + 880.0, + 400.5 + ], + "area_px": 728.0 + }, + { + "image_points_px": [ + [ + 1133.0, + 364.0 + ], + [ + 1139.0, + 371.0 + ], + [ + 1147.0, + 393.0 + ], + [ + 1141.0, + 386.0 + ] + ], + "center_px": [ + 1140.0, + 378.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 802.0, + 292.0 + ], + [ + 807.0, + 297.0 + ], + [ + 792.0, + 312.0 + ], + [ + 787.0, + 306.0 + ] + ], + "center_px": [ + 797.0, + 301.75 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 853.0, + 199.0 + ], + [ + 843.0, + 206.0 + ], + [ + 830.0, + 208.0 + ], + [ + 843.0, + 201.0 + ] + ], + "center_px": [ + 842.25, + 203.5 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 626.0, + 425.0 + ], + [ + 632.0, + 439.0 + ], + [ + 632.0, + 443.0 + ], + [ + 625.0, + 427.0 + ] + ], + "center_px": [ + 628.75, + 433.5 + ], + "area_px": 27.0 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_f_camera_pose.json b/data/evaluations/Scene7/render_f_camera_pose.json new file mode 100644 index 0000000..1eb9cfa --- /dev/null +++ b/data/evaluations/Scene7/render_f_camera_pose.json @@ -0,0 +1,568 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:08Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_f_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "f", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 26, + "used_marker_ids": [ + 46, + 56, + 208, + 62, + 47, + 54, + 53, + 97, + 72, + 55, + 96, + 84, + 79, + 66, + 95, + 103, + 73, + 210, + 58, + 69, + 82, + 101, + 81, + 64, + 52, + 83 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3, + 4 + ], + "rms": [ + 0.007422227100458106, + 0.00037929858889617843, + 9.361118326782244e-05, + 9.352719540039077e-05, + 9.35271615518822e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125, + 6.25e-05 + ] + }, + "residual_rms_px": 0.23513362436810548, + "residual_median_px": 0.19402287640768395, + "residual_max_px": 0.4735015529951511, + "sigma2_normalized": 9.888286027285453e-09 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.31643328070640564, + 0.9486141204833984, + 0.0010992434108629823 + ], + [ + 0.9183030724525452, + -0.3060312569141388, + -0.2511261999607086 + ], + [ + -0.2378854602575302, + 0.0804741233587265, + -0.9679537415504456 + ] + ], + "translation_m": [ + 0.12611393630504608, + -0.20017801225185394, + 1.4976917505264282 + ], + "rvec_rad": [ + 2.3747005945480755, + 1.7114492363340732, + -0.21706778643009716 + ] + }, + "camera_in_world": { + "position_m": [ + 0.5001965165138245, + -0.30141961574554443, + 1.3992877006530762 + ], + "position_mm": [ + 500.1965026855469, + -301.41961669921875, + 1399.2877197265625 + ], + "orientation_deg": { + "roll": 175.2474365234375, + "pitch": 13.761771202087402, + "yaw": 70.98682403564453 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 2.1676729793342622e-07, + 1.3619983551224775e-07, + 3.9169423551656145e-08, + -1.4324234000348522e-09, + -1.4505045194645116e-09, + -2.732681298231853e-09 + ], + [ + 1.361998355122478e-07, + 1.1589633769981796e-07, + 6.195297126155646e-09, + 3.169329179052311e-09, + -1.520996477131377e-09, + 2.2851953461739577e-09 + ], + [ + 3.916942355164647e-08, + 6.195297126147603e-09, + 7.974546745471005e-07, + 4.91898065578733e-09, + -1.2561908358291764e-08, + -1.471947197601002e-07 + ], + [ + -1.4324234000349347e-09, + 3.1693291790522375e-09, + 4.918980655787529e-09, + 1.7382559082309342e-09, + -1.0110923995201435e-10, + 1.6178605841352917e-09 + ], + [ + -1.4505045194643352e-09, + -1.5209964771313627e-09, + -1.2561908358291971e-08, + -1.0110923995202705e-10, + 1.0680808211688275e-09, + 3.078200251383334e-09 + ], + [ + -2.7326812982300673e-09, + 2.2851953461754544e-09, + -1.471947197600998e-07, + 1.617860584135329e-09, + 3.078200251383249e-09, + 4.789494632062779e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.02667592664052627, + 0.019505518022961296, + 0.05116531314718762 + ], + "tvec_std_m": [ + 4.169239628794361e-05, + 3.268150579714508e-05, + 0.00021884914055263682 + ] + }, + "camera_center_std_m": [ + 0.0008881233449060201, + 0.0008215405963109499, + 0.00042815204227667007 + ], + "camera_center_std_mm": [ + 0.8881233449060201, + 0.8215405963109499, + 0.4281520422766701 + ], + "orientation_std_deg": { + "roll": 0.03955268942652775, + "pitch": 0.03402465449050477, + "yaw": 0.007782285063540366 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 46, + "observed_center_px": [ + 1234.0, + 666.0 + ], + "projected_center_px": [ + 1234.322021484375, + 665.8219604492188 + ], + "reprojection_error_px": 0.367961843186855, + "confidence": 0.2988751797371847 + }, + { + "marker_id": 56, + "observed_center_px": [ + 1196.0, + 626.75 + ], + "projected_center_px": [ + 1196.0927734375, + 626.841552734375 + ], + "reprojection_error_px": 0.13034114422202114, + "confidence": 0.5697620483284124 + }, + { + "marker_id": 208, + "observed_center_px": [ + 831.25, + 547.75 + ], + "projected_center_px": [ + 831.42578125, + 547.8938598632812 + ], + "reprojection_error_px": 0.22714468542068608, + "confidence": 0.5829305549976826 + }, + { + "marker_id": 62, + "observed_center_px": [ + 750.75, + 651.75 + ], + "projected_center_px": [ + 750.7119140625, + 651.61279296875 + ], + "reprojection_error_px": 0.14239490180372463, + "confidence": 0.5711737708098855 + }, + { + "marker_id": 47, + "observed_center_px": [ + 593.75, + 623.75 + ], + "projected_center_px": [ + 593.893310546875, + 623.6600341796875 + ], + "reprojection_error_px": 0.16920922454202256, + "confidence": 0.5768583617164568 + }, + { + "marker_id": 54, + "observed_center_px": [ + 540.5, + 639.0 + ], + "projected_center_px": [ + 540.5552978515625, + 638.8973999023438 + ], + "reprojection_error_px": 0.11655313134575288, + "confidence": 0.5766374039623903 + }, + { + "marker_id": 53, + "observed_center_px": [ + 1240.5, + 594.75 + ], + "projected_center_px": [ + 1240.2105712890625, + 594.7680053710938 + ], + "reprojection_error_px": 0.28998822752513004, + "confidence": 0.21364841201201337 + }, + { + "marker_id": 97, + "observed_center_px": [ + 491.5, + 605.25 + ], + "projected_center_px": [ + 491.5602722167969, + 605.1970825195312 + ], + "reprojection_error_px": 0.080205983921214, + "confidence": 0.5705029634947052 + }, + { + "marker_id": 72, + "observed_center_px": [ + 1197.75, + 548.5 + ], + "projected_center_px": [ + 1197.50341796875, + 548.541259765625 + ], + "reprojection_error_px": 0.2500101325842733, + "confidence": 0.5440516905787338 + }, + { + "marker_id": 55, + "observed_center_px": [ + 598.75, + 542.75 + ], + "projected_center_px": [ + 598.85302734375, + 542.7650756835938 + ], + "reprojection_error_px": 0.10412449181628464, + "confidence": 0.5461315019106076 + }, + { + "marker_id": 96, + "observed_center_px": [ + 723.0, + 614.5 + ], + "projected_center_px": [ + 722.7930908203125, + 614.3304443359375 + ], + "reprojection_error_px": 0.26750800334687097, + "confidence": 0.5763709732716893 + }, + { + "marker_id": 84, + "observed_center_px": [ + 1254.25, + 485.0 + ], + "projected_center_px": [ + 1254.08984375, + 484.9773864746094 + ], + "reprojection_error_px": 0.1617448482785617, + "confidence": 0.06519221426443914 + }, + { + "marker_id": 79, + "observed_center_px": [ + 731.5, + 535.75 + ], + "projected_center_px": [ + 731.5128173828125, + 535.8655395507812 + ], + "reprojection_error_px": 0.11624832513587117, + "confidence": 0.5460974493377216 + }, + { + "marker_id": 66, + "observed_center_px": [ + 453.0, + 495.75 + ], + "projected_center_px": [ + 452.8591613769531, + 495.8890686035156 + ], + "reprojection_error_px": 0.19792825524802127, + "confidence": 0.5349107016469481 + }, + { + "marker_id": 95, + "observed_center_px": [ + 548.75, + 435.0 + ], + "projected_center_px": [ + 548.4973754882812, + 434.8678894042969 + ], + "reprojection_error_px": 0.28508306406760014, + "confidence": 0.5227826547122322 + }, + { + "marker_id": 103, + "observed_center_px": [ + 618.0, + 313.5 + ], + "projected_center_px": [ + 617.7993774414062, + 313.51080322265625 + ], + "reprojection_error_px": 0.20091321667939907, + "confidence": 0.5046333482067283 + }, + { + "marker_id": 73, + "observed_center_px": [ + 1247.5, + 251.25 + ], + "projected_center_px": [ + 1247.8372802734375, + 251.246826171875 + ], + "reprojection_error_px": 0.33729520606590574, + "confidence": 0.13607001327160623 + }, + { + "marker_id": 210, + "observed_center_px": [ + 775.0, + 150.5 + ], + "projected_center_px": [ + 775.2924194335938, + 150.43130493164062 + ], + "reprojection_error_px": 0.30037998861473575, + "confidence": 0.46988879526830113 + }, + { + "marker_id": 58, + "observed_center_px": [ + 562.75, + 264.25 + ], + "projected_center_px": [ + 562.7250366210938, + 264.16064453125 + ], + "reprojection_error_px": 0.09277699112360367, + "confidence": 0.4655541127751829 + }, + { + "marker_id": 69, + "observed_center_px": [ + 476.25, + 240.75 + ], + "projected_center_px": [ + 476.0916748046875, + 241.12998962402344 + ], + "reprojection_error_px": 0.4116539588491949, + "confidence": 0.4655541127751829 + }, + { + "marker_id": 82, + "observed_center_px": [ + 1207.5, + 261.5 + ], + "projected_center_px": [ + 1207.3568115234375, + 261.322509765625 + ], + "reprojection_error_px": 0.2280476334426254, + "confidence": 0.49001748422717006 + }, + { + "marker_id": 101, + "observed_center_px": [ + 1162.25, + 153.5 + ], + "projected_center_px": [ + 1162.3350830078125, + 153.42735290527344 + ], + "reprojection_error_px": 0.11187814170172868, + "confidence": 0.46225891142368675 + }, + { + "marker_id": 81, + "observed_center_px": [ + 1027.0, + 213.75 + ], + "projected_center_px": [ + 1027.4039306640625, + 213.9970703125 + ], + "reprojection_error_px": 0.4735015529951511, + "confidence": 0.4548532843889077 + }, + { + "marker_id": 64, + "observed_center_px": [ + 570.5, + 177.75 + ], + "projected_center_px": [ + 570.482177734375, + 177.70457458496094 + ], + "reprojection_error_px": 0.04879653146975861, + "confidence": 0.43211414091114625 + }, + { + "marker_id": 52, + "observed_center_px": [ + 1054.5, + 160.5 + ], + "projected_center_px": [ + 1054.453857421875, + 160.68443298339844 + ], + "reprojection_error_px": 0.19011749756734664, + "confidence": 0.45818248585417487 + }, + { + "marker_id": 83, + "observed_center_px": [ + 1173.0, + 64.0 + ], + "projected_center_px": [ + 1172.8411865234375, + 63.976505279541016 + ], + "reprojection_error_px": 0.16054196406956517, + "confidence": 0.4377857805109236 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_g_aruco_detection.json b/data/evaluations/Scene7/render_g_aruco_detection.json new file mode 100644 index 0000000..b03d77a --- /dev/null +++ b/data/evaluations/Scene7/render_g_aruco_detection.json @@ -0,0 +1,2033 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:05Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "g", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_a.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\simulation\\Scene7\\render_g.png", + "image_sha256": "3f0ca6e96946c081e5a30ad4981f608b820c335cb0d5d06c9d3a1faf658b1d8c", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 33, + "num_rejected_candidates": 8 + }, + "detections": [ + { + "observation_id": "490a383a-f497-422a-bda4-38168b57a39f", + "type": "aruco", + "marker_id": 41, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 520.0, + 324.0 + ], + [ + 485.0, + 314.0 + ], + [ + 496.0, + 283.0 + ], + [ + 531.0, + 293.0 + ] + ], + "center_px": [ + 508.0, + 303.5 + ], + "quality": { + "area_px": 1195.0, + "perimeter_px": 138.58863830566406, + "sharpness": { + "laplacian_var": 1798.1389750000003 + }, + "contrast": { + "p05": 19.0, + "p95": 168.0, + "dynamic_range": 149.0, + "mean_gray": 57.925, + "std_gray": 57.81366079915715 + }, + "geometry": { + "distance_to_center_norm": 0.19553743302822113, + "distance_to_border_px": 283.0 + }, + "edge_ratio": 1.1066093279015978, + "edge_lengths_px": [ + 36.400550842285156, + 32.893768310546875, + 36.400550842285156, + 32.893768310546875 + ] + }, + "confidence": 0.7199168185011974 + }, + { + "observation_id": "8cabd1f9-6c64-4158-8739-f3eed072e356", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 560.0, + 602.0 + ], + [ + 537.0, + 581.0 + ], + [ + 559.0, + 561.0 + ], + [ + 581.0, + 581.0 + ] + ], + "center_px": [ + 559.25, + 581.25 + ], + "quality": { + "area_px": 902.0, + "perimeter_px": 120.30758285522461, + "sharpness": { + "laplacian_var": 4813.292788050087 + }, + "contrast": { + "p05": 28.0, + "p95": 180.0, + "dynamic_range": 152.0, + "mean_gray": 94.34395973154362, + "std_gray": 66.78924189300754 + }, + "geometry": { + "distance_to_center_norm": 0.32074689865112305, + "distance_to_border_px": 118.0 + }, + "edge_ratio": 1.0487007563440722, + "edge_lengths_px": [ + 31.14482307434082, + 29.73213768005371, + 29.73213768005371, + 29.698484420776367 + ] + }, + "confidence": 0.5734079332884925 + }, + { + "observation_id": "c9d13f6c-7f95-443b-bc92-b476c459c719", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 642.0, + 525.0 + ], + [ + 621.0, + 504.0 + ], + [ + 643.0, + 485.0 + ], + [ + 664.0, + 505.0 + ] + ], + "center_px": [ + 642.5, + 504.75 + ], + "quality": { + "area_px": 860.5, + "perimeter_px": 117.4995059967041, + "sharpness": { + "laplacian_var": 3656.1960738692464 + }, + "contrast": { + "p05": 33.0, + "p95": 183.0, + "dynamic_range": 150.0, + "mean_gray": 80.05699481865285, + "std_gray": 63.4375805866881 + }, + "geometry": { + "distance_to_center_norm": 0.19715528190135956, + "distance_to_border_px": 195.0 + }, + "edge_ratio": 1.0252461268984039, + "edge_lengths_px": [ + 29.698484420776367, + 29.068883895874023, + 29.0, + 29.73213768005371 + ] + }, + "confidence": 0.5595404377699383 + }, + { + "observation_id": "9f15a298-9bb3-47ce-90b5-00ebe1a15fd9", + "type": "aruco", + "marker_id": 84, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 86.0, + 662.0 + ], + [ + 62.0, + 682.0 + ], + [ + 45.0, + 662.0 + ], + [ + 68.0, + 642.0 + ] + ], + "center_px": [ + 65.25, + 662.0 + ], + "quality": { + "area_px": 820.0, + "perimeter_px": 114.87655830383301, + "sharpness": { + "laplacian_var": 4615.5973006061695 + }, + "contrast": { + "p05": 10.0, + "p95": 160.0, + "dynamic_range": 150.0, + "mean_gray": 80.41894353369763, + "std_gray": 64.84109261429634 + }, + "geometry": { + "distance_to_center_norm": 0.8841893672943115, + "distance_to_border_px": 38.0 + }, + "edge_ratio": 1.1901872672565836, + "edge_lengths_px": [ + 31.240999221801758, + 26.248809814453125, + 30.479501724243164, + 26.90724754333496 + ] + }, + "confidence": 0.3490767193505014 + }, + { + "observation_id": "8bb329d9-fccc-4d25-a218-03b4b5e6994b", + "type": "aruco", + "marker_id": 64, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 840.0, + 647.0 + ], + [ + 820.0, + 667.0 + ], + [ + 799.0, + 647.0 + ], + [ + 819.0, + 627.0 + ] + ], + "center_px": [ + 819.5, + 647.0 + ], + "quality": { + "area_px": 820.0, + "perimeter_px": 114.56854248046875, + "sharpness": { + "laplacian_var": 3896.9010015991917 + }, + "contrast": { + "p05": 42.0, + "p95": 184.0, + "dynamic_range": 142.0, + "mean_gray": 94.58532110091743, + "std_gray": 61.935247076293166 + }, + "geometry": { + "distance_to_center_norm": 0.4609958529472351, + "distance_to_border_px": 53.0 + }, + "edge_ratio": 1.0253048329824916, + "edge_lengths_px": [ + 28.284271240234375, + 29.0, + 28.284271240234375, + 29.0 + ] + }, + "confidence": 0.5331747682067169 + }, + { + "observation_id": "969cab49-23fc-4fa7-9f79-86d15d88df8e", + "type": "aruco", + "marker_id": 72, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 122.0, + 582.0 + ], + [ + 99.0, + 600.0 + ], + [ + 82.0, + 581.0 + ], + [ + 105.0, + 562.0 + ] + ], + "center_px": [ + 102.0, + 581.25 + ], + "quality": { + "area_px": 763.0, + "perimeter_px": 110.78293991088867, + "sharpness": { + "laplacian_var": 3158.4937355135958 + }, + "contrast": { + "p05": 10.0, + "p95": 160.0, + "dynamic_range": 150.0, + "mean_gray": 56.338345864661655, + "std_gray": 61.75505059471303 + }, + "geometry": { + "distance_to_center_norm": 0.7922046780586243, + "distance_to_border_px": 82.0 + }, + "edge_ratio": 1.170141351982161, + "edge_lengths_px": [ + 29.20616340637207, + 25.495098114013672, + 29.832868576049805, + 26.248809814453125 + ] + }, + "confidence": 0.4347053164175514 + }, + { + "observation_id": "d2731f2b-b80f-40aa-b1e0-1888f1fb8c40", + "type": "aruco", + "marker_id": 53, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 72.0, + 559.0 + ], + [ + 49.0, + 578.0 + ], + [ + 32.0, + 559.0 + ], + [ + 55.0, + 540.0 + ] + ], + "center_px": [ + 52.0, + 559.0 + ], + "quality": { + "area_px": 760.0, + "perimeter_px": 110.65593338012695, + "sharpness": { + "laplacian_var": 4155.988594606818 + }, + "contrast": { + "p05": 9.0, + "p95": 160.0, + "dynamic_range": 151.0, + "mean_gray": 90.3327067669173, + "std_gray": 65.52558059431664 + }, + "geometry": { + "distance_to_center_norm": 0.8453760743141174, + "distance_to_border_px": 32.0 + }, + "edge_ratio": 1.170141351982161, + "edge_lengths_px": [ + 29.832868576049805, + 25.495098114013672, + 29.832868576049805, + 25.495098114013672 + ] + }, + "confidence": 0.27711751756945874 + }, + { + "observation_id": "e5532763-cf8c-476e-8d13-38bbacd49200", + "type": "aruco", + "marker_id": 58, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 801.0, + 564.0 + ], + [ + 782.0, + 583.0 + ], + [ + 761.0, + 564.0 + ], + [ + 780.0, + 545.0 + ] + ], + "center_px": [ + 781.0, + 564.0 + ], + "quality": { + "area_px": 760.0, + "perimeter_px": 110.37932586669922, + "sharpness": { + "laplacian_var": 4261.342488430046 + }, + "contrast": { + "p05": 38.0, + "p95": 184.0, + "dynamic_range": 146.0, + "mean_gray": 91.33018867924528, + "std_gray": 62.60889708582977 + }, + "geometry": { + "distance_to_center_norm": 0.33771631121635437, + "distance_to_border_px": 137.0 + }, + "edge_ratio": 1.053946545658541, + "edge_lengths_px": [ + 26.870058059692383, + 28.319604873657227, + 26.870058059692383, + 28.319604873657227 + ] + }, + "confidence": 0.48073279309443956 + }, + { + "observation_id": "3e7ffb9b-f154-4545-8bdd-d7e1c5f85061", + "type": "aruco", + "marker_id": 69, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 889.0, + 547.0 + ], + [ + 871.0, + 566.0 + ], + [ + 849.0, + 548.0 + ], + [ + 867.0, + 529.0 + ] + ], + "center_px": [ + 869.0, + 547.5 + ], + "quality": { + "area_px": 742.0, + "perimeter_px": 109.1956901550293, + "sharpness": { + "laplacian_var": 4141.364441511923 + }, + "contrast": { + "p05": 44.0, + "p95": 185.0, + "dynamic_range": 141.0, + "mean_gray": 96.89514563106796, + "std_gray": 60.67629114021546 + }, + "geometry": { + "distance_to_center_norm": 0.40306055545806885, + "distance_to_border_px": 154.0 + }, + "edge_ratio": 1.0860764484296306, + "edge_lengths_px": [ + 26.172504425048828, + 28.42534065246582, + 26.172504425048828, + 28.42534065246582 + ] + }, + "confidence": 0.45546210617301425 + }, + { + "observation_id": "6d442b23-d9c0-4a30-8896-a8383b40c802", + "type": "aruco", + "marker_id": 103, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 728.0, + 543.0 + ], + [ + 709.0, + 562.0 + ], + [ + 688.0, + 544.0 + ], + [ + 708.0, + 525.0 + ] + ], + "center_px": [ + 708.25, + 543.5 + ], + "quality": { + "area_px": 740.5, + "perimeter_px": 109.02216911315918, + "sharpness": { + "laplacian_var": 3842.592600192272 + }, + "contrast": { + "p05": 34.0, + "p95": 182.0, + "dynamic_range": 148.0, + "mean_gray": 122.46783625730994, + "std_gray": 65.18711587886648 + }, + "geometry": { + "distance_to_center_norm": 0.2666221559047699, + "distance_to_border_px": 158.0 + }, + "edge_ratio": 1.0293477641301256, + "edge_lengths_px": [ + 26.870058059692383, + 27.658634185791016, + 27.58622932434082, + 26.90724754333496 + ] + }, + "confidence": 0.4795917219326271 + }, + { + "observation_id": "245e4267-23a4-4a13-8416-06c27a6a59a2", + "type": "aruco", + "marker_id": 56, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 104.0, + 515.0 + ], + [ + 81.0, + 533.0 + ], + [ + 65.0, + 515.0 + ], + [ + 87.0, + 496.0 + ] + ], + "center_px": [ + 84.25, + 514.75 + ], + "quality": { + "area_px": 721.5, + "perimeter_px": 107.85333442687988, + "sharpness": { + "laplacian_var": 3021.4587356413563 + }, + "contrast": { + "p05": 9.0, + "p95": 155.0, + "dynamic_range": 146.0, + "mean_gray": 47.45029239766082, + "std_gray": 56.741797158257256 + }, + "geometry": { + "distance_to_center_norm": 0.7856342196464539, + "distance_to_border_px": 65.0 + }, + "edge_ratio": 1.2127199347849176, + "edge_lengths_px": [ + 29.20616340637207, + 24.083189010620117, + 29.068883895874023, + 25.495098114013672 + ] + }, + "confidence": 0.39662908657084783 + }, + { + "observation_id": "ff87a220-e12a-452c-ad71-336415e4f0c7", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 503.0, + 514.0 + ], + [ + 485.0, + 495.0 + ], + [ + 506.0, + 477.0 + ], + [ + 524.0, + 496.0 + ] + ], + "center_px": [ + 504.5, + 495.5 + ], + "quality": { + "area_px": 723.0, + "perimeter_px": 107.66227722167969, + "sharpness": { + "laplacian_var": 634.1773537156731 + }, + "contrast": { + "p05": 3.0, + "p95": 77.0, + "dynamic_range": 74.0, + "mean_gray": 30.101364522417153, + "std_gray": 30.60242218766537 + }, + "geometry": { + "distance_to_center_norm": 0.2609632611274719, + "distance_to_border_px": 206.0 + }, + "edge_ratio": 1.056782099894111, + "edge_lengths_px": [ + 26.172504425048828, + 27.658634185791016, + 26.172504425048828, + 27.658634185791016 + ] + }, + "confidence": 0.42189397421159375 + }, + { + "observation_id": "e8fb0802-583c-4221-b8e3-a3055b32f147", + "type": "aruco", + "marker_id": 46, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 61.0, + 498.0 + ], + [ + 38.0, + 516.0 + ], + [ + 22.0, + 498.0 + ], + [ + 45.0, + 480.0 + ] + ], + "center_px": [ + 41.5, + 498.0 + ], + "quality": { + "area_px": 702.0, + "perimeter_px": 106.57870483398438, + "sharpness": { + "laplacian_var": 3988.2002160633892 + }, + "contrast": { + "p05": 9.0, + "p95": 156.0, + "dynamic_range": 147.0, + "mean_gray": 82.93987975951904, + "std_gray": 63.70784702319041 + }, + "geometry": { + "distance_to_center_norm": 0.8364452719688416, + "distance_to_border_px": 22.0 + }, + "edge_ratio": 1.2127199347849176, + "edge_lengths_px": [ + 29.20616340637207, + 24.083189010620117, + 29.20616340637207, + 24.083189010620117 + ] + }, + "confidence": 0.1698001278724927 + }, + { + "observation_id": "2e120c61-fc10-4bbb-997b-4bd378e52a99", + "type": "aruco", + "marker_id": 68, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 49.0, + 458.0 + ], + [ + 26.0, + 476.0 + ], + [ + 10.0, + 458.0 + ], + [ + 32.0, + 440.0 + ] + ], + "center_px": [ + 29.25, + 458.0 + ], + "quality": { + "area_px": 702.0, + "perimeter_px": 106.47352981567383, + "sharpness": { + "laplacian_var": 3721.0383994105478 + }, + "contrast": { + "p05": 8.0, + "p95": 155.0, + "dynamic_range": 147.0, + "mean_gray": 60.48490945674044, + "std_gray": 61.16300970504088 + }, + "geometry": { + "distance_to_center_norm": 0.8423811793327332, + "distance_to_border_px": 10.0 + }, + "edge_ratio": 1.2127199347849176, + "edge_lengths_px": [ + 29.20616340637207, + 24.083189010620117, + 28.42534065246582, + 24.75883674621582 + ] + }, + "confidence": 0.07718187630567852 + }, + { + "observation_id": "b9540fef-ab99-4320-b21f-7ae9a55febd5", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 423.0, + 436.0 + ], + [ + 405.0, + 417.0 + ], + [ + 426.0, + 400.0 + ], + [ + 444.0, + 418.0 + ] + ], + "center_px": [ + 424.5, + 417.75 + ], + "quality": { + "area_px": 703.5, + "perimeter_px": 106.30549621582031, + "sharpness": { + "laplacian_var": 3265.912003206361 + }, + "contrast": { + "p05": 15.0, + "p95": 160.0, + "dynamic_range": 145.0, + "mean_gray": 66.21730382293762, + "std_gray": 60.991844478846815 + }, + "geometry": { + "distance_to_center_norm": 0.3038310110569, + "distance_to_border_px": 284.0 + }, + "edge_ratio": 1.0865337338869794, + "edge_lengths_px": [ + 26.172504425048828, + 27.018512725830078, + 25.45584487915039, + 27.658634185791016 + ] + }, + "confidence": 0.4316478958478293 + }, + { + "observation_id": "0eb9ffb9-7144-4a4b-ad5e-01dbcb1db22e", + "type": "aruco", + "marker_id": 95, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 730.0, + 415.0 + ], + [ + 711.0, + 433.0 + ], + [ + 692.0, + 415.0 + ], + [ + 710.0, + 398.0 + ] + ], + "center_px": [ + 710.75, + 415.25 + ], + "quality": { + "area_px": 665.0, + "perimeter_px": 103.3526554107666, + "sharpness": { + "laplacian_var": 3924.6265614727154 + }, + "contrast": { + "p05": 30.0, + "p95": 182.0, + "dynamic_range": 152.0, + "mean_gray": 93.31837606837607, + "std_gray": 66.83513268832053 + }, + "geometry": { + "distance_to_center_norm": 0.1222480833530426, + "distance_to_border_px": 287.0 + }, + "edge_ratio": 1.0601794455656337, + "edge_lengths_px": [ + 26.172504425048828, + 26.172504425048828, + 24.75883674621582, + 26.248809814453125 + ] + }, + "confidence": 0.4181682027393045 + }, + { + "observation_id": "860a8131-9d6b-448b-a972-e083c013eb2a", + "type": "aruco", + "marker_id": 55, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 641.0, + 352.0 + ], + [ + 623.0, + 369.0 + ], + [ + 604.0, + 351.0 + ], + [ + 623.0, + 335.0 + ] + ], + "center_px": [ + 622.75, + 351.75 + ], + "quality": { + "area_px": 629.0, + "perimeter_px": 100.5296630859375, + "sharpness": { + "laplacian_var": 4269.743582190051 + }, + "contrast": { + "p05": 24.0, + "p95": 178.0, + "dynamic_range": 154.0, + "mean_gray": 89.93807339449542, + "std_gray": 67.35074098986975 + }, + "geometry": { + "distance_to_center_norm": 0.026040121912956238, + "distance_to_border_px": 335.0 + }, + "edge_ratio": 1.057097499907748, + "edge_lengths_px": [ + 24.75883674621582, + 26.172504425048828, + 24.83948516845703, + 24.75883674621582 + ] + }, + "confidence": 0.39668368657567366 + }, + { + "observation_id": "93ab7acb-7291-4296-8f2a-52dbd0366112", + "type": "aruco", + "marker_id": 66, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 780.0, + 332.0 + ], + [ + 763.0, + 349.0 + ], + [ + 743.0, + 333.0 + ], + [ + 760.0, + 316.0 + ] + ], + "center_px": [ + 761.5, + 332.5 + ], + "quality": { + "area_px": 612.0, + "perimeter_px": 99.30825424194336, + "sharpness": { + "laplacian_var": 4008.339052476572 + }, + "contrast": { + "p05": 30.0, + "p95": 182.0, + "dynamic_range": 152.0, + "mean_gray": 80.78859857482185, + "std_gray": 63.768214952110156 + }, + "geometry": { + "distance_to_center_norm": 0.16964846849441528, + "distance_to_border_px": 316.0 + }, + "edge_ratio": 1.0653394779010876, + "edge_lengths_px": [ + 24.041629791259766, + 25.612497329711914, + 24.041629791259766, + 25.612497329711914 + ] + }, + "confidence": 0.3829765144945479 + }, + { + "observation_id": "76532e43-bd96-4b90-889d-147d142942e6", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 199.0, + 218.0 + ], + [ + 183.0, + 202.0 + ], + [ + 204.0, + 186.0 + ], + [ + 220.0, + 202.0 + ] + ], + "center_px": [ + 201.5, + 202.0 + ], + "quality": { + "area_px": 592.0, + "perimeter_px": 98.05634689331055, + "sharpness": { + "laplacian_var": 3687.255047441093 + }, + "contrast": { + "p05": 10.0, + "p95": 166.0, + "dynamic_range": 156.0, + "mean_gray": 70.36945812807882, + "std_gray": 63.724518355244186 + }, + "geometry": { + "distance_to_center_norm": 0.6347478032112122, + "distance_to_border_px": 183.0 + }, + "edge_ratio": 1.1667596566650227, + "edge_lengths_px": [ + 22.627416610717773, + 26.4007568359375, + 22.627416610717773, + 26.4007568359375 + ] + }, + "confidence": 0.3382587531306593 + }, + { + "observation_id": "3d2b8639-182f-4bb9-a354-c62c0ee7d2db", + "type": "aruco", + "marker_id": 62, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 475.0, + 329.0 + ], + [ + 456.0, + 344.0 + ], + [ + 439.0, + 328.0 + ], + [ + 458.0, + 311.0 + ] + ], + "center_px": [ + 457.0, + 328.0 + ], + "quality": { + "area_px": 595.0, + "perimeter_px": 97.80660820007324, + "sharpness": { + "laplacian_var": 2664.1936987244117 + }, + "contrast": { + "p05": 17.0, + "p95": 173.0, + "dynamic_range": 156.0, + "mean_gray": 47.105651105651106, + "std_gray": 53.59463047022017 + }, + "geometry": { + "distance_to_center_norm": 0.25299760699272156, + "distance_to_border_px": 311.0 + }, + "edge_ratio": 1.0920899795394092, + "edge_lengths_px": [ + 24.20743751525879, + 23.34523582458496, + 25.495098114013672, + 24.75883674621582 + ] + }, + "confidence": 0.3632179345093538 + }, + { + "observation_id": "84d24b52-8e55-453f-ae59-291a02f91329", + "type": "aruco", + "marker_id": 97, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 701.0, + 268.0 + ], + [ + 683.0, + 285.0 + ], + [ + 665.0, + 269.0 + ], + [ + 682.0, + 253.0 + ] + ], + "center_px": [ + 682.75, + 268.75 + ], + "quality": { + "area_px": 576.5, + "perimeter_px": 96.39469909667969, + "sharpness": { + "laplacian_var": 3776.6961096938776 + }, + "contrast": { + "p05": 24.0, + "p95": 179.0, + "dynamic_range": 155.0, + "mean_gray": 108.51020408163265, + "std_gray": 67.30553922347278 + }, + "geometry": { + "distance_to_center_norm": 0.13722912967205048, + "distance_to_border_px": 253.0 + }, + "edge_ratio": 1.0605520086518976, + "edge_lengths_px": [ + 24.75883674621582, + 24.083189010620117, + 23.34523582458496, + 24.20743751525879 + ] + }, + "confidence": 0.3623898971459892 + }, + { + "observation_id": "a2195cc1-1c29-43ad-bf7b-85f93f0b413e", + "type": "aruco", + "marker_id": 54, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 648.0, + 262.0 + ], + [ + 631.0, + 278.0 + ], + [ + 612.0, + 263.0 + ], + [ + 630.0, + 247.0 + ] + ], + "center_px": [ + 630.25, + 262.5 + ], + "quality": { + "area_px": 558.5, + "perimeter_px": 95.06661224365234, + "sharpness": { + "laplacian_var": 3591.9395663615237 + }, + "contrast": { + "p05": 22.0, + "p95": 178.0, + "dynamic_range": 156.0, + "mean_gray": 60.023809523809526, + "std_gray": 59.037894424514505 + }, + "geometry": { + "distance_to_center_norm": 0.13344134390354156, + "distance_to_border_px": 247.0 + }, + "edge_ratio": 1.0369326614283263, + "edge_lengths_px": [ + 23.34523582458496, + 24.20743751525879, + 24.083189010620117, + 23.430749893188477 + ] + }, + "confidence": 0.3590718541167963 + }, + { + "observation_id": "84ffb95f-06f4-4c11-afa8-6b073758a728", + "type": "aruco", + "marker_id": 205, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 130.0, + 150.0 + ], + [ + 115.0, + 135.0 + ], + [ + 136.0, + 120.0 + ], + [ + 151.0, + 135.0 + ] + ], + "center_px": [ + 133.0, + 135.0 + ], + "quality": { + "area_px": 540.0, + "perimeter_px": 94.04035949707031, + "sharpness": { + "laplacian_var": 3632.093509420229 + }, + "contrast": { + "p05": 9.0, + "p95": 163.0, + "dynamic_range": 154.0, + "mean_gray": 78.22222222222223, + "std_gray": 62.931333480914475 + }, + "geometry": { + "distance_to_center_norm": 0.7553886771202087, + "distance_to_border_px": 115.0 + }, + "edge_ratio": 1.216552530753038, + "edge_lengths_px": [ + 21.21320343017578, + 25.806976318359375, + 21.21320343017578, + 25.806976318359375 + ] + }, + "confidence": 0.29591817114314195 + }, + { + "observation_id": "4c9fae0f-608d-4a3c-8450-04ce64166411", + "type": "aruco", + "marker_id": 92, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 309.0, + 157.0 + ], + [ + 289.0, + 172.0 + ], + [ + 273.0, + 157.0 + ], + [ + 293.0, + 142.0 + ] + ], + "center_px": [ + 291.0, + 157.0 + ], + "quality": { + "area_px": 540.0, + "perimeter_px": 93.8634262084961, + "sharpness": { + "laplacian_var": 3395.1406455586352 + }, + "contrast": { + "p05": 11.0, + "p95": 167.0, + "dynamic_range": 156.0, + "mean_gray": 63.476190476190474, + "std_gray": 63.54863749354875 + }, + "geometry": { + "distance_to_center_norm": 0.5498347282409668, + "distance_to_border_px": 142.0 + }, + "edge_ratio": 1.1399018344425471, + "edge_lengths_px": [ + 25.0, + 21.931713104248047, + 25.0, + 21.931713104248047 + ] + }, + "confidence": 0.3158166687011719 + }, + { + "observation_id": "9db54152-4964-42c3-8534-959baca5cec9", + "type": "aruco", + "marker_id": 113, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 542.0, + 410.0 + ], + [ + 512.0, + 397.0 + ], + [ + 508.0, + 384.0 + ], + [ + 538.0, + 397.0 + ] + ], + "center_px": [ + 525.0, + 397.0 + ], + "quality": { + "area_px": 338.0, + "perimeter_px": 92.59407043457031, + "sharpness": { + "laplacian_var": 1154.4804077148438 + }, + "contrast": { + "p05": 19.0, + "p95": 87.25, + "dynamic_range": 68.25, + "mean_gray": 34.61328125, + "std_gray": 23.089560246102533 + }, + "geometry": { + "distance_to_center_norm": 0.16451755166053772, + "distance_to_border_px": 310.0 + }, + "edge_ratio": 2.4038256153899655, + "edge_lengths_px": [ + 32.69556427001953, + 13.601470947265625, + 32.69556427001953, + 13.601470947265625 + ] + }, + "confidence": 0.07997148327617512 + }, + { + "observation_id": "04aea3a3-5ef3-4ca2-99ff-79f7c3b37244", + "type": "aruco", + "marker_id": 105, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 460.0, + 183.0 + ], + [ + 441.0, + 198.0 + ], + [ + 425.0, + 182.0 + ], + [ + 444.0, + 168.0 + ] + ], + "center_px": [ + 442.5, + 182.75 + ], + "quality": { + "area_px": 526.5, + "perimeter_px": 92.3674144744873, + "sharpness": { + "laplacian_var": 2481.4484969037344 + }, + "contrast": { + "p05": 14.0, + "p95": 168.0, + "dynamic_range": 154.0, + "mean_gray": 43.772602739726025, + "std_gray": 52.56338967686194 + }, + "geometry": { + "distance_to_center_norm": 0.36139723658561707, + "distance_to_border_px": 168.0 + }, + "edge_ratio": 1.1037640972318732, + "edge_lengths_px": [ + 24.20743751525879, + 22.627416610717773, + 23.600847244262695, + 21.931713104248047 + ] + }, + "confidence": 0.31800273344664126 + }, + { + "observation_id": "0c2a9e54-aa2a-4c5d-8d7e-5d8a0ff5653c", + "type": "aruco", + "marker_id": 85, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 511.0, + 166.0 + ], + [ + 493.0, + 181.0 + ], + [ + 476.0, + 166.0 + ], + [ + 496.0, + 151.0 + ] + ], + "center_px": [ + 494.0, + 166.0 + ], + "quality": { + "area_px": 525.0, + "perimeter_px": 92.31552124023438, + "sharpness": { + "laplacian_var": 3986.9990817263547 + }, + "contrast": { + "p05": 16.1, + "p95": 173.0, + "dynamic_range": 156.9, + "mean_gray": 125.21487603305785, + "std_gray": 58.958528630409944 + }, + "geometry": { + "distance_to_center_norm": 0.33065441250801086, + "distance_to_border_px": 151.0 + }, + "edge_ratio": 1.1785113022787261, + "edge_lengths_px": [ + 23.430749893188477, + 22.671567916870117, + 25.0, + 21.21320343017578 + ] + }, + "confidence": 0.2969848480224609 + }, + { + "observation_id": "dc595c66-cb9e-4e8a-a04e-721a3f6da8bf", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 336.0, + 130.0 + ], + [ + 317.0, + 145.0 + ], + [ + 301.0, + 130.0 + ], + [ + 320.0, + 115.0 + ] + ], + "center_px": [ + 318.5, + 130.0 + ], + "quality": { + "area_px": 525.0, + "perimeter_px": 92.27830123901367, + "sharpness": { + "laplacian_var": 4100.48324263464 + }, + "contrast": { + "p05": 12.0, + "p95": 168.0, + "dynamic_range": 156.0, + "mean_gray": 102.68767123287671, + "std_gray": 63.606805755457174 + }, + "geometry": { + "distance_to_center_norm": 0.5383343696594238, + "distance_to_border_px": 115.0 + }, + "edge_ratio": 1.1037640972318732, + "edge_lengths_px": [ + 24.20743751525879, + 21.931713104248047, + 24.20743751525879, + 21.931713104248047 + ] + }, + "confidence": 0.3170967427530611 + }, + { + "observation_id": "91e796f4-817a-47f3-8368-b66aa180e7a3", + "type": "aruco", + "marker_id": 59, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 397.0, + 109.0 + ], + [ + 379.0, + 124.0 + ], + [ + 362.0, + 109.0 + ], + [ + 381.0, + 94.0 + ] + ], + "center_px": [ + 379.75, + 109.0 + ], + "quality": { + "area_px": 525.0, + "perimeter_px": 92.24146842956543, + "sharpness": { + "laplacian_var": 3327.4987727528614 + }, + "contrast": { + "p05": 12.0, + "p95": 169.0, + "dynamic_range": 157.0, + "mean_gray": 99.71780821917808, + "std_gray": 66.85764747082477 + }, + "geometry": { + "distance_to_center_norm": 0.49239593744277954, + "distance_to_border_px": 94.0 + }, + "edge_ratio": 1.1037640972318732, + "edge_lengths_px": [ + 23.430749893188477, + 22.671567916870117, + 24.20743751525879, + 21.931713104248047 + ] + }, + "confidence": 0.3170967427530611 + }, + { + "observation_id": "83fd0aa9-ba5e-43e7-ba5e-1b55829f5136", + "type": "aruco", + "marker_id": 48, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 387.0, + 44.0 + ], + [ + 368.0, + 59.0 + ], + [ + 352.0, + 44.0 + ], + [ + 371.0, + 30.0 + ] + ], + "center_px": [ + 369.5, + 44.25 + ], + "quality": { + "area_px": 507.5, + "perimeter_px": 91.00028991699219, + "sharpness": { + "laplacian_var": 3331.7804165884777 + }, + "contrast": { + "p05": 11.0, + "p95": 166.0, + "dynamic_range": 155.0, + "mean_gray": 62.11232876712329, + "std_gray": 61.993512575318384 + }, + "geometry": { + "distance_to_center_norm": 0.5662168264389038, + "distance_to_border_px": 30.0 + }, + "edge_ratio": 1.1386220591259189, + "edge_lengths_px": [ + 24.20743751525879, + 21.931713104248047, + 23.600847244262695, + 21.260292053222656 + ] + }, + "confidence": 0.17828567290874034 + }, + { + "observation_id": "9c909a4e-cfb8-4a70-8564-e8e2714c7c45", + "type": "aruco", + "marker_id": 57, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 480.0, + 71.0 + ], + [ + 462.0, + 85.0 + ], + [ + 446.0, + 70.0 + ], + [ + 464.0, + 56.0 + ] + ], + "center_px": [ + 463.0, + 70.5 + ], + "quality": { + "area_px": 494.0, + "perimeter_px": 89.47044372558594, + "sharpness": { + "laplacian_var": 4699.651786867252 + }, + "contrast": { + "p05": 13.0, + "p95": 170.45, + "dynamic_range": 157.45, + "mean_gray": 84.39488636363636, + "std_gray": 65.05496170187591 + }, + "geometry": { + "distance_to_center_norm": 0.4621008336544037, + "distance_to_border_px": 56.0 + }, + "edge_ratio": 1.0397504586236819, + "edge_lengths_px": [ + 22.803508758544922, + 21.931713104248047, + 22.803508758544922, + 21.931713104248047 + ] + }, + "confidence": 0.3167426670523156 + }, + { + "observation_id": "206a623f-b1ea-4541-ab10-abb476432399", + "type": "aruco", + "marker_id": 63, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 260.0, + 42.0 + ], + [ + 241.0, + 56.0 + ], + [ + 226.0, + 42.0 + ], + [ + 245.0, + 28.0 + ] + ], + "center_px": [ + 243.0, + 42.0 + ], + "quality": { + "area_px": 476.0, + "perimeter_px": 88.23826217651367, + "sharpness": { + "laplacian_var": 3141.2947463324113 + }, + "contrast": { + "p05": 9.0, + "p95": 163.0, + "dynamic_range": 154.0, + "mean_gray": 54.17751479289941, + "std_gray": 59.87010962876083 + }, + "geometry": { + "distance_to_center_norm": 0.6927092671394348, + "distance_to_border_px": 28.0 + }, + "edge_ratio": 1.1502349525772275, + "edge_lengths_px": [ + 23.600847244262695, + 20.51828384399414, + 23.600847244262695, + 20.51828384399414 + ] + }, + "confidence": 0.15449597168691093 + }, + { + "observation_id": "0a1f622e-447c-4ce6-b52e-24803869a1df", + "type": "aruco", + "marker_id": 71, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 316.0, + 30.0 + ], + [ + 297.0, + 43.0 + ], + [ + 282.0, + 29.0 + ], + [ + 302.0, + 16.0 + ] + ], + "center_px": [ + 299.25, + 29.5 + ], + "quality": { + "area_px": 461.5, + "perimeter_px": 87.19272422790527, + "sharpness": { + "laplacian_var": 4560.135907254991 + }, + "contrast": { + "p05": 10.0, + "p95": 165.0, + "dynamic_range": 155.0, + "mean_gray": 102.70370370370371, + "std_gray": 63.55248524915691 + }, + "geometry": { + "distance_to_center_norm": 0.646465003490448, + "distance_to_border_px": 16.0 + }, + "edge_ratio": 1.2047948566010105, + "edge_lengths_px": [ + 23.021728515625, + 20.51828384399414, + 23.853721618652344, + 19.79899024963379 + ] + }, + "confidence": 0.08171792300897739 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 499.0, + 366.0 + ], + [ + 518.0, + 363.0 + ], + [ + 543.0, + 373.0 + ], + [ + 511.0, + 373.0 + ] + ], + "center_px": [ + 517.75, + 368.75 + ], + "area_px": 244.5 + }, + { + "image_points_px": [ + [ + 605.0, + 523.0 + ], + [ + 616.0, + 538.0 + ], + [ + 597.0, + 553.0 + ], + [ + 584.0, + 538.0 + ] + ], + "center_px": [ + 600.5, + 538.0 + ], + "area_px": 480.0 + }, + { + "image_points_px": [ + [ + 255.0, + 258.0 + ], + [ + 263.0, + 256.0 + ], + [ + 269.0, + 258.0 + ], + [ + 282.0, + 272.0 + ] + ], + "center_px": [ + 267.25, + 261.0 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 570.0, + 460.0 + ], + [ + 549.0, + 455.0 + ], + [ + 548.0, + 452.0 + ], + [ + 568.0, + 450.0 + ] + ], + "center_px": [ + 558.75, + 454.25 + ], + "area_px": 131.0 + }, + { + "image_points_px": [ + [ + 498.0, + 461.0 + ], + [ + 501.0, + 461.0 + ], + [ + 517.0, + 477.0 + ], + [ + 498.0, + 470.0 + ] + ], + "center_px": [ + 503.5, + 467.25 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 589.0, + 305.0 + ], + [ + 608.0, + 308.0 + ], + [ + 607.0, + 316.0 + ], + [ + 588.0, + 311.0 + ] + ], + "center_px": [ + 598.0, + 310.0 + ], + "area_px": 137.0 + }, + { + "image_points_px": [ + [ + 589.0, + 331.0 + ], + [ + 589.0, + 337.0 + ], + [ + 579.0, + 353.0 + ], + [ + 582.0, + 340.0 + ] + ], + "center_px": [ + 584.75, + 340.25 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 532.0, + 269.0 + ], + [ + 547.0, + 272.0 + ], + [ + 552.0, + 275.0 + ], + [ + 537.0, + 273.0 + ] + ], + "center_px": [ + 542.0, + 272.25 + ], + "area_px": 40.0 + } + ] +} \ No newline at end of file diff --git a/data/evaluations/Scene7/render_g_camera_pose.json b/data/evaluations/Scene7/render_g_camera_pose.json new file mode 100644 index 0000000..ae92f4f --- /dev/null +++ b/data/evaluations/Scene7/render_g_camera_pose.json @@ -0,0 +1,607 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-06-01T18:52:08Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\evaluations\\Scene7\\render_g_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\data\\robot\\robot.json" + }, + "camera": { + "camera_id": "g", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1777.77783203125, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "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": 29, + "used_marker_ids": [ + 84, + 64, + 72, + 53, + 58, + 69, + 103, + 56, + 215, + 46, + 68, + 208, + 95, + 55, + 66, + 217, + 62, + 97, + 54, + 205, + 92, + 105, + 85, + 102, + 59, + 48, + 57, + 63, + 71 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3 + ], + "rms": [ + 0.008325383540469156, + 0.0005417386490812175, + 9.448814845179684e-05, + 9.446596091975557e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125 + ] + }, + "residual_rms_px": 0.2375035311197796, + "residual_median_px": 0.17309818346751052, + "residual_max_px": 0.5123980841324197, + "sigma2_normalized": 9.953488980491326e-09 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.7071463465690613, + -0.7070671319961548, + 0.0002781667571980506 + ], + [ + -0.6414983868598938, + 0.6414046883583069, + -0.4208085834980011 + ], + [ + 0.29736149311065674, + -0.29775169491767883, + -0.9071494340896606 + ] + ], + "translation_m": [ + -0.0004116299096494913, + 0.33173036575317383, + 1.388380765914917 + ], + "rvec_rad": [ + 1.1161949948749121, + -2.694712629607763, + 0.5947455692101269 + ] + }, + "camera_in_world": { + "position_m": [ + -0.20033755898475647, + 0.2003282606601715, + 1.3990639448165894 + ], + "position_mm": [ + -200.33755493164062, + 200.32826232910156, + 1399.06396484375 + ], + "orientation_deg": { + "roll": -161.82872009277344, + "pitch": -17.299196243286133, + "yaw": -137.78677368164062 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 4.569025779871222e-08, + -6.52787605856918e-08, + 2.1608261857312573e-08, + 4.132563094817804e-09, + 1.1200277990290036e-08, + 4.0760448832209645e-08 + ], + [ + -6.527876058569087e-08, + 2.0619328142843444e-07, + -1.0127940118953613e-07, + -3.120648147541952e-08, + -1.869450873999253e-08, + -1.087554324361622e-07 + ], + [ + 2.1608261857309503e-08, + -1.0127940118953352e-07, + 3.8707555216911077e-07, + 3.947332932817163e-08, + -2.2814230005404747e-08, + 2.108406356669123e-09 + ], + [ + 4.132563094817438e-09, + -3.1206481475419204e-08, + 3.9473329328171574e-08, + 8.708592108552053e-09, + -3.2133816198009293e-10, + 8.722112787501299e-09 + ], + [ + 1.1200277990290252e-08, + -1.8694508739992955e-08, + -2.281423000540389e-08, + -3.2133816197999594e-10, + 6.327912810507861e-09, + 1.548891689334884e-08 + ], + [ + 4.076044883220967e-08, + -1.0875543243616289e-07, + 2.1084063566710303e-09, + 8.722112787501546e-09, + 1.5488916893348742e-08, + 9.06182029429418e-08 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.012247133070040762, + 0.026017159983422924, + 0.03564679621782382 + ], + "tvec_std_m": [ + 9.331983770105932e-05, + 7.95481791778282e-05, + 0.00030102857496081963 + ] + }, + "camera_center_std_m": [ + 0.0006325397576512814, + 0.0007577831068765956, + 0.00037712208401860997 + ], + "camera_center_std_mm": [ + 0.6325397576512815, + 0.7577831068765957, + 0.37712208401860997 + ], + "orientation_std_deg": { + "roll": 0.03163228181821559, + "pitch": 0.025524544428679574, + "yaw": 0.012121286392443026 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 84, + "observed_center_px": [ + 65.25, + 662.0 + ], + "projected_center_px": [ + 65.09073638916016, + 661.9937744140625 + ], + "reprojection_error_px": 0.1593852429116648, + "confidence": 0.3490767193505014 + }, + { + "marker_id": 64, + "observed_center_px": [ + 819.5, + 647.0 + ], + "projected_center_px": [ + 819.5111694335938, + 646.9634399414062 + ], + "reprojection_error_px": 0.03822818503648354, + "confidence": 0.5331747682067169 + }, + { + "marker_id": 72, + "observed_center_px": [ + 102.0, + 581.25 + ], + "projected_center_px": [ + 102.19963836669922, + 581.2167358398438 + ], + "reprojection_error_px": 0.20239066630957167, + "confidence": 0.4347053164175514 + }, + { + "marker_id": 53, + "observed_center_px": [ + 52.0, + 559.0 + ], + "projected_center_px": [ + 51.979827880859375, + 559.1500854492188 + ], + "reprojection_error_px": 0.15143499086346443, + "confidence": 0.27711751756945874 + }, + { + "marker_id": 58, + "observed_center_px": [ + 781.0, + 564.0 + ], + "projected_center_px": [ + 780.95947265625, + 563.8441772460938 + ], + "reprojection_error_px": 0.161006820434286, + "confidence": 0.48073279309443956 + }, + { + "marker_id": 69, + "observed_center_px": [ + 869.0, + 547.5 + ], + "projected_center_px": [ + 868.9120483398438, + 547.327880859375 + ], + "reprojection_error_px": 0.1932886263951633, + "confidence": 0.45546210617301425 + }, + { + "marker_id": 103, + "observed_center_px": [ + 708.25, + 543.5 + ], + "projected_center_px": [ + 708.1882934570312, + 543.6549682617188 + ], + "reprojection_error_px": 0.16680185725969957, + "confidence": 0.4795917219326271 + }, + { + "marker_id": 56, + "observed_center_px": [ + 84.25, + 514.75 + ], + "projected_center_px": [ + 84.36662292480469, + 514.6975708007812 + ], + "reprojection_error_px": 0.12786605304270235, + "confidence": 0.39662908657084783 + }, + { + "marker_id": 215, + "observed_center_px": [ + 504.5, + 495.5 + ], + "projected_center_px": [ + 504.43603515625, + 495.4935302734375 + ], + "reprojection_error_px": 0.06429120155787596, + "confidence": 0.42189397421159375 + }, + { + "marker_id": 46, + "observed_center_px": [ + 41.5, + 498.0 + ], + "projected_center_px": [ + 41.283145904541016, + 498.0747985839844 + ], + "reprojection_error_px": 0.22939164519093086, + "confidence": 0.1698001278724927 + }, + { + "marker_id": 68, + "observed_center_px": [ + 29.25, + 458.0 + ], + "projected_center_px": [ + 29.080041885375977, + 458.13616943359375 + ], + "reprojection_error_px": 0.21777941907305057, + "confidence": 0.07718187630567852 + }, + { + "marker_id": 208, + "observed_center_px": [ + 424.5, + 417.75 + ], + "projected_center_px": [ + 424.3273010253906, + 417.7617492675781 + ], + "reprojection_error_px": 0.17309818346751052, + "confidence": 0.4316478958478293 + }, + { + "marker_id": 95, + "observed_center_px": [ + 710.75, + 415.25 + ], + "projected_center_px": [ + 710.8889770507812, + 415.14788818359375 + ], + "reprojection_error_px": 0.172457077829928, + "confidence": 0.4181682027393045 + }, + { + "marker_id": 55, + "observed_center_px": [ + 622.75, + 351.75 + ], + "projected_center_px": [ + 622.6372680664062, + 351.86810302734375 + ], + "reprojection_error_px": 0.1632691456446815, + "confidence": 0.39668368657567366 + }, + { + "marker_id": 66, + "observed_center_px": [ + 761.5, + 332.5 + ], + "projected_center_px": [ + 761.3326416015625, + 332.7066650390625 + ], + "reprojection_error_px": 0.26593095325341437, + "confidence": 0.3829765144945479 + }, + { + "marker_id": 217, + "observed_center_px": [ + 201.5, + 202.0 + ], + "projected_center_px": [ + 201.7760772705078, + 201.81399536132812 + ], + "reprojection_error_px": 0.3328909504605054, + "confidence": 0.3382587531306593 + }, + { + "marker_id": 62, + "observed_center_px": [ + 457.0, + 328.0 + ], + "projected_center_px": [ + 457.47796630859375, + 327.8153381347656 + ], + "reprojection_error_px": 0.5123980841324197, + "confidence": 0.3632179345093538 + }, + { + "marker_id": 97, + "observed_center_px": [ + 682.75, + 268.75 + ], + "projected_center_px": [ + 682.6819458007812, + 268.70654296875 + ], + "reprojection_error_px": 0.08074582092200679, + "confidence": 0.3623898971459892 + }, + { + "marker_id": 54, + "observed_center_px": [ + 630.25, + 262.5 + ], + "projected_center_px": [ + 630.407958984375, + 262.6029052734375 + ], + "reprojection_error_px": 0.18852197762072234, + "confidence": 0.3590718541167963 + }, + { + "marker_id": 205, + "observed_center_px": [ + 133.0, + 135.0 + ], + "projected_center_px": [ + 132.97947692871094, + 135.05868530273438 + ], + "reprojection_error_px": 0.06217042071726058, + "confidence": 0.29591817114314195 + }, + { + "marker_id": 92, + "observed_center_px": [ + 291.0, + 157.0 + ], + "projected_center_px": [ + 290.98089599609375, + 157.4166717529297 + ], + "reprojection_error_px": 0.41710947322585296, + "confidence": 0.3158166687011719 + }, + { + "marker_id": 105, + "observed_center_px": [ + 442.5, + 182.75 + ], + "projected_center_px": [ + 442.3226623535156, + 182.8793487548828 + ], + "reprojection_error_px": 0.21949884111391357, + "confidence": 0.31800273344664126 + }, + { + "marker_id": 85, + "observed_center_px": [ + 494.0, + 166.0 + ], + "projected_center_px": [ + 493.9233703613281, + 165.65301513671875 + ], + "reprojection_error_px": 0.35534574272008645, + "confidence": 0.2969848480224609 + }, + { + "marker_id": 102, + "observed_center_px": [ + 318.5, + 130.0 + ], + "projected_center_px": [ + 318.8559265136719, + 129.80921936035156 + ], + "reprojection_error_px": 0.4038328064920957, + "confidence": 0.3170967427530611 + }, + { + "marker_id": 59, + "observed_center_px": [ + 379.75, + 109.0 + ], + "projected_center_px": [ + 379.8922119140625, + 109.25536346435547 + ], + "reprojection_error_px": 0.29229219529256445, + "confidence": 0.3170967427530611 + }, + { + "marker_id": 48, + "observed_center_px": [ + 369.5, + 44.25 + ], + "projected_center_px": [ + 369.5580139160156, + 44.28627395629883 + ], + "reprojection_error_px": 0.0684208620015656, + "confidence": 0.17828567290874034 + }, + { + "marker_id": 57, + "observed_center_px": [ + 463.0, + 70.5 + ], + "projected_center_px": [ + 463.0158386230469, + 70.44519805908203 + ], + "reprojection_error_px": 0.05704484821960295, + "confidence": 0.3167426670523156 + }, + { + "marker_id": 63, + "observed_center_px": [ + 243.0, + 42.0 + ], + "projected_center_px": [ + 242.70668029785156, + 41.7450065612793 + ], + "reprojection_error_px": 0.38866193723988085, + "confidence": 0.15449597168691093 + }, + { + "marker_id": 71, + "observed_center_px": [ + 299.25, + 29.5 + ], + "projected_center_px": [ + 299.2639465332031, + 29.4696102142334 + ], + "reprojection_error_px": 0.03343717792107771, + "confidence": 0.08171792300897739 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/data/evaluations/Scene7/robot_state.json b/data/evaluations/Scene7/robot_state.json new file mode 100644 index 0000000..8f348d2 --- /dev/null +++ b/data/evaluations/Scene7/robot_state.json @@ -0,0 +1,5489 @@ +{ + "schema_version": "1.0", + "method": "deterministic_geometric_sequential_prefix", + "created_utc": "2026-06-01T18:52:19Z", + "root_pose": { + "translation_m": [ + 2.522185138842392e-05, + 7.88837756199312e-06, + 4.613156500766699e-05 + ], + "rotation_matrix": [ + [ + 0.9999999825452351, + 7.933775773991147e-06, + 0.00018667239901209626 + ], + [ + -7.911330830307139e-06, + 0.9999999927401763, + -0.0001202375069444404 + ], + [ + -0.00018667335159430908, + 0.00012023602801862844, + 0.9999999753481786 + ] + ], + "euler_xyz_deg": [ + 0.006889017087513451, + 0.010695595256033755, + -0.0004532858748108697 + ] + }, + "movements": { + "x": { + "value_m": 0.02894587263620346, + "value_mm": 28.945872636203458, + "joint_type": "linear", + "link": "Base" + }, + "y": { + "value_rad": -0.08818746829453605, + "value_deg": -5.052769739220675, + "joint_type": "revolute", + "link": "Arm1" + }, + "z": { + "value_rad": 1.4953740918354965, + "value_deg": 85.67862425538233, + "joint_type": "revolute", + "link": "Ellbow" + }, + "a": { + "value_rad": 1.0840347802398904, + "value_deg": 62.11061775313741, + "joint_type": "revolute", + "link": "Arm2" + }, + "b": { + "value_rad": 0.0, + "value_deg": 0.0, + "joint_type": "revolute", + "link": "Hand" + }, + "c": { + "value_rad": 0.0, + "value_deg": 0.0, + "joint_type": "revolute", + "link": "Palm" + }, + "e": { + "value_m": 0.0, + "value_mm": 0.0, + "joint_type": "linear", + "link": "FingerB" + } + }, + "link_poses": { + "Board": { + "translation_m": [ + 2.522185138842392e-05, + 7.88837756199312e-06, + 4.613156500766699e-05 + ], + "rotation_matrix": [ + [ + 0.9999999825452351, + 7.933775773991147e-06, + 0.00018667239901209626 + ], + [ + -7.911330830307139e-06, + 0.9999999927401763, + -0.0001202375069444404 + ], + [ + -0.00018667335159430908, + 0.00012023602801862844, + 0.9999999753481786 + ] + ] + }, + "Base": { + "translation_m": [ + 0.02897408074070373, + 5.735577076285363e-06, + 0.016040727747518708 + ], + "rotation_matrix": [ + [ + 0.9999999825452351, + 7.933775773991147e-06, + 0.00018667239901209626 + ], + [ + -7.911330830307139e-06, + 0.9999999927401763, + -0.0001202375069444404 + ], + [ + -0.00018667335159430908, + 0.00012023602801862844, + 0.9999999753481786 + ] + ] + }, + "Arm1": { + "translation_m": [ + 0.1389833359264187, + 0.10799945385881149, + 0.06103317806053739 + ], + "rotation_matrix": [ + [ + 0.9999999825452274, + 2.4343781931001343e-05, + 0.00018524823786546138 + ], + [ + -7.911330830307078e-06, + 0.9961034077214911, + -0.08819297626811436 + ], + [ + -0.00018667335159430762, + 0.08819297326316664, + 0.9961033905273324 + ] + ] + }, + "Ellbow": { + "translation_m": [ + 0.13897724998093597, + -0.14102639807156128, + 0.03898493474474573 + ], + "rotation_matrix": [ + [ + 0.9999999825433781, + -0.0001828872718432975, + 3.823316817383942e-05 + ], + [ + -7.911330830292448e-06, + 0.16299938910282458, + 0.9866261698776861 + ], + [ + -0.0001866733515939624, + -0.986626152958834, + 0.16299938481082693 + ] + ] + }, + "Arm2": { + "translation_m": [ + 0.22897724840984, + -0.141027110091336, + 0.038968134143102275 + ], + "rotation_matrix": [ + [ + 0.4677998157278742, + -0.00018288727184310284, + -0.8838344296031561 + ], + [ + 0.8720281376536912, + 0.16299938910265108, + 0.46151720042574373 + ], + [ + 0.14398006647193082, + -0.9866261529577838, + 0.07641056703326514 + ] + ] + }, + "Hand": { + "translation_m": [ + 0.22902297022780077, + -0.18177695736699878, + 0.28562467238254824 + ], + "rotation_matrix": [ + [ + 0.4677998157278742, + -0.00018288727184310284, + -0.8838344296031561 + ], + [ + 0.8720281376536912, + 0.16299938910265108, + 0.46151720042574373 + ], + [ + 0.14398006647193082, + -0.9866261529577838, + 0.07641056703326514 + ] + ] + }, + "Palm": { + "translation_m": [ + 0.22902297022780077, + -0.18177695736699878, + 0.28562467238254824 + ], + "rotation_matrix": [ + [ + 0.4677998157278742, + -0.00018288727184310284, + -0.8838344296031561 + ], + [ + 0.8720281376536912, + 0.16299938910265108, + 0.46151720042574373 + ], + [ + 0.14398006647193082, + -0.9866261529577838, + 0.07641056703326514 + ] + ] + }, + "FingerA": { + "translation_m": [ + 0.23090057054522678, + -0.1839938234349768, + 0.3207325080019584 + ], + "rotation_matrix": [ + [ + 0.4677998157278742, + -0.00018288727184310284, + -0.8838344296031561 + ], + [ + 0.8720281376536912, + 0.16299938910265108, + 0.46151720042574373 + ], + [ + 0.14398006647193082, + -0.9866261529577838, + 0.07641056703326514 + ] + ] + }, + "FingerB": { + "translation_m": [ + 0.22715817201940378, + -0.19097004853620633, + 0.31958066747018293 + ], + "rotation_matrix": [ + [ + 0.4677998157278742, + -0.00018288727184310284, + -0.8838344296031561 + ], + [ + 0.8720281376536912, + 0.16299938910265108, + 0.46151720042574373 + ], + [ + 0.14398006647193082, + -0.9866261529577838, + 0.07641056703326514 + ] + ] + } + }, + "stage_reports": [ + { + "method": "deterministic_geometric_prefix", + "active_links": [ + "Board", + "Base", + "Arm1" + ], + "active_observations": 45, + "joint_updates": [ + { + "pass": 0, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.0, + "new": 0.03005780230191435, + "info": { + "reason": "weighted_projection", + "used_markers": 3, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.03007599697268205, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.02996354643060487, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.03013386350245613, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": 0.0, + "new": 0.035233325052451914, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 3, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": 0.0352333250524521, + "theta_alt_rad": -3.1063593285373408, + "score_theta": 0.0009147871933339627, + "score_theta_alt": 0.8864885289918489, + "best_score": 0.0009147871933339627, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + } + ] + } + } + ] + }, + { + "pass": 1, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.03005780230191435, + "new": 0.03005780230191434, + "info": { + "reason": "weighted_projection", + "used_markers": 3, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.03007599697268204, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.029963546430604854, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.03013386350245613, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": 0.035233325052451914, + "new": 0.035233325052451914, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 3, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": 0.0352333250524521, + "theta_alt_rad": -3.1063593285373408, + "score_theta": 0.0009147871933339627, + "score_theta_alt": 0.8864885289918489, + "best_score": 0.0009147871933339627, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + } + ] + } + } + ] + } + ], + "root_link": "Board", + "root_pose": { + "reason": "kabsch", + "used_markers": [ + 210, + 211, + 215, + 214, + 208, + 206, + 205, + 207, + 217, + 46, + 47, + 51, + 52, + 53, + 54, + 55, + 56, + 58, + 60, + 61, + 62, + 63, + 64, + 66, + 68, + 69, + 72, + 73, + 79, + 82, + 83, + 84, + 85, + 86, + 92, + 95, + 96, + 97, + 101, + 102, + 103, + 105 + ] + }, + "marker_stats": { + "num_markers_used": 45, + "mean_error_m": 0.0013702169454727078, + "rms_error_m": 0.004367018789821951, + "median_error_m": 0.00023458082696422862, + "worst_error_m": 0.020305043665621827 + }, + "marker_reports": [ + { + "marker_id": 46, + "link": "Board", + "error_m": [ + 0.00024014580635156602, + 0.00019849948688827057, + -0.0001325889838793802 + ], + "error_norm_m": 0.00033860285475659696, + "predicted_m": [ + 0.5367315875661282, + 0.18544692342486993, + -0.02733176064749602 + ], + "observed_m": [ + 0.5364914417597766, + 0.18524842393798166, + -0.02719917166361664 + ] + }, + { + "marker_id": 47, + "link": "Board", + "error_m": [ + -0.0001356286636347015, + 0.00012133053072427291, + -0.00014802679586498058 + ], + "error_norm_m": 0.00023458082696422862, + "predicted_m": [ + 0.34424784634233146, + -0.2865315503756803, + -0.02735257876128538 + ], + "observed_m": [ + 0.34438347500596617, + -0.28665288090640456, + -0.0272045519654204 + ] + }, + { + "marker_id": 51, + "link": "Board", + "error_m": [ + 6.307287002968454e-05, + -0.00014999963369966007, + 0.00013641978209038771 + ], + "error_norm_m": 0.0002123403729614379, + "predicted_m": [ + 0.1678187575218507, + -0.1720701554105413, + -0.027305881766096583 + ], + "observed_m": [ + 0.167755684651821, + -0.17192015577684164, + -0.02744230154818697 + ] + }, + { + "marker_id": 52, + "link": "Board", + "error_m": [ + 5.976559091475098e-05, + -0.00019726439713532717, + 5.5558001508391325e-05 + ], + "error_norm_m": 0.00021347566551286321, + "predicted_m": [ + 0.09470177950393126, + 0.20867042030186375, + -0.027246453545320196 + ], + "observed_m": [ + 0.0946420139130165, + 0.20886768469899908, + -0.027302011546828587 + ] + }, + { + "marker_id": 53, + "link": "Board", + "error_m": [ + 2.2465988035458295e-06, + 0.00015843318946973106, + 2.8051563047696432e-05 + ], + "error_norm_m": 0.00016091306013234192, + "predicted_m": [ + 0.4862718010720863, + 0.21224732243606034, + -0.02731911878462367 + ], + "observed_m": [ + 0.48626955447328274, + 0.2120888892465906, + -0.027347170347671368 + ] + }, + { + "marker_id": 54, + "link": "Board", + "error_m": [ + -9.480154294294607e-05, + 1.627539552162549e-05, + -0.00012362426496341158 + ], + "error_norm_m": 0.00015663709628147604, + "predicted_m": [ + 0.34228749689371984, + -0.3305815345496766, + -0.027357509278550476 + ], + "observed_m": [ + 0.3423822984366628, + -0.3305978099451982, + -0.027233885013587065 + ] + }, + { + "marker_id": 55, + "link": "Board", + "error_m": [ + -1.0716649648634391e-05, + 0.00011026767914773528, + -6.97715080855317e-05 + ], + "error_norm_m": 0.0001309269681343339, + "predicted_m": [ + 0.28373803749178683, + -0.26257107183499706, + -0.027338402301549082 + ], + "observed_m": [ + 0.28374875414143547, + -0.2626813395141448, + -0.02726863079346355 + ] + }, + { + "marker_id": 56, + "link": "Board", + "error_m": [ + 6.356140605623395e-05, + -2.3035154325057317e-05, + -4.765688565996212e-05 + ], + "error_norm_m": 8.271547270874637e-05, + "predicted_m": [ + 0.49870145518051306, + 0.16867722441452865, + -0.02732667781812476 + ], + "observed_m": [ + 0.49863789377445683, + 0.1687002595688537, + -0.027279020932464797 + ] + }, + { + "marker_id": 58, + "link": "Board", + "error_m": [ + 0.00010114347277415808, + -0.000100406862560104, + 1.7625811855784268e-05 + ], + "error_norm_m": 0.00014360435013451362, + "predicted_m": [ + 0.050108394384752154, + -0.21809922383361957, + -0.027289442910250115 + ], + "observed_m": [ + 0.050007250911977996, + -0.21799881697105947, + -0.0273070687221059 + ] + }, + { + "marker_id": 60, + "link": "Board", + "error_m": [ + 2.5816559448055276e-05, + 0.00010821188574633434, + -2.1284107574501276e-05 + ], + "error_norm_m": 0.00011326658904441165, + "predicted_m": [ + 0.4343823697981462, + 0.28381773243543157, + -0.027300827011884146 + ], + "observed_m": [ + 0.43435655323869815, + 0.28370952054968523, + -0.027279542904309645 + ] + }, + { + "marker_id": 61, + "link": "Board", + "error_m": [ + 2.213673047626874e-05, + -0.0004748026529825533, + 0.00036777003104209935 + ], + "error_norm_m": 0.000600984517145123, + "predicted_m": [ + -0.022397209513850602, + 0.3358413457954722, + -0.02720930368016537 + ], + "observed_m": [ + -0.02241934624432687, + 0.33631614844845475, + -0.02757707371120747 + ] + }, + { + "marker_id": 62, + "link": "Board", + "error_m": [ + -5.2027625080386386e-05, + -0.00019686027029469644, + 0.0001104321380561088 + ], + "error_norm_m": 0.00023163785724196654, + "predicted_m": [ + 0.4047187294268141, + -0.1750920295828903, + -0.027350467795893892 + ], + "observed_m": [ + 0.40477075705189447, + -0.1748951693125956, + -0.02746089993395 + ] + }, + { + "marker_id": 63, + "link": "Board", + "error_m": [ + 5.97205525321165e-05, + 8.612992450571233e-05, + 0.00017768133054744256 + ], + "error_norm_m": 0.00020628999858260345, + "predicted_m": [ + 0.7774182385644122, + -0.23614497769267853, + -0.02742738136354363 + ], + "observed_m": [ + 0.77735851801188, + -0.23623110761718424, + -0.027605062694091072 + ] + }, + { + "marker_id": 64, + "link": "Board", + "error_m": [ + -7.91293138496553e-05, + -0.0001473370794227158, + 0.00015746330336172815 + ], + "error_norm_m": 0.0002297049307018039, + "predicted_m": [ + -0.0212513673084557, + -0.18821865949797503, + -0.027272529247363148 + ], + "observed_m": [ + -0.021172237994606043, + -0.18807132241855232, + -0.027429992550724876 + ] + }, + { + "marker_id": 66, + "link": "Board", + "error_m": [ + -9.67864364553872e-05, + 0.0001370872909244869, + -1.2083618247695632e-05 + ], + "error_norm_m": 0.0001682455153776874, + "predicted_m": [ + 0.20976724024838408, + -0.3632204859031543, + -0.027336695829951723 + ], + "observed_m": [ + 0.20986402668483947, + -0.3633575731940788, + -0.027324612211704027 + ] + }, + { + "marker_id": 68, + "link": "Board", + "error_m": [ + 1.5700754685266105e-05, + 0.00018632529536974363, + -3.095209368547333e-05 + ], + "error_norm_m": 0.00018953010709600582, + "predicted_m": [ + 0.5737514695000713, + 0.17064663065484797, + -0.027340450788186716 + ], + "observed_m": [ + 0.573735768745386, + 0.17046030535947823, + -0.027309498694501243 + ] + }, + { + "marker_id": 69, + "link": "Board", + "error_m": [ + -2.0034684490774328e-05, + -0.00030379998350144044, + 0.0002071791909846396 + ], + "error_norm_m": 0.0003682648988638072, + "predicted_m": [ + 0.00762789450497923, + -0.28119888730219095, + -0.027289099919642363 + ], + "observed_m": [ + 0.007647929189470004, + -0.2808950873186895, + -0.027496279110627003 + ] + }, + { + "marker_id": 72, + "link": "Board", + "error_m": [ + 0.00047090395286775166, + 0.00012575615412688257, + -0.00035486948541986474 + ], + "error_norm_m": 0.0006029075342118536, + "predicted_m": [ + 0.44101165968882705, + 0.19432768063298977, + -0.02731282457835261 + ], + "observed_m": [ + 0.4405407557359593, + 0.1942019244788629, + -0.026957955092932744 + ] + }, + { + "marker_id": 73, + "link": "Board", + "error_m": [ + 5.680208949179755e-05, + 0.0004589062252717824, + -0.0004479530621591017 + ], + "error_norm_m": 0.0006438038108473311, + "predicted_m": [ + 0.22175276464469845, + 0.3331194142637967, + -0.02725520702095333 + ], + "observed_m": [ + 0.22169596255520665, + 0.3326605080385249, + -0.026807253958794228 + ] + }, + { + "marker_id": 79, + "link": "Board", + "error_m": [ + -0.00013968223420696146, + -0.0005000676111311941, + 0.00022277023191346126 + ], + "error_norm_m": 0.0005649825824592162, + "predicted_m": [ + 0.31231885790070896, + -0.1591012986920062, + -0.02733129660411856 + ], + "observed_m": [ + 0.3124585401349159, + -0.158601231080875, + -0.02755406683603202 + ] + }, + { + "marker_id": 82, + "link": "Board", + "error_m": [ + -7.405616276753846e-05, + -8.325803470837778e-05, + 7.280887590920687e-05 + ], + "error_norm_m": 0.00013310652875992175, + "predicted_m": [ + 0.2191824801050202, + 0.29724943485632677, + -0.02725904013676476 + ], + "observed_m": [ + 0.21925653626778774, + 0.29733269289103514, + -0.027331849012673968 + ] + }, + { + "marker_id": 83, + "link": "Board", + "error_m": [ + -4.62492650498067e-05, + -0.00012746911940025862, + 0.00018718614259173594 + ], + "error_norm_m": 0.00023114069935149535, + "predicted_m": [ + 0.04418281621951103, + 0.33923081903445473, + -0.02722132479177954 + ], + "observed_m": [ + 0.044229065484560834, + 0.339358288153855, + -0.027408510934371275 + ] + }, + { + "marker_id": 84, + "link": "Board", + "error_m": [ + 0.00017232694873475785, + 0.00011817015158627209, + -5.607158385221092e-05 + ], + "error_norm_m": 0.00021634413442903855, + "predicted_m": [ + 0.4075121688285888, + 0.2584279451972179, + -0.027298863891678203 + ], + "observed_m": [ + 0.40733984187985406, + 0.25830977504563163, + -0.027242792307825992 + ] + }, + { + "marker_id": 85, + "link": "Board", + "error_m": [ + 0.00020312592435511867, + -0.00015599653047260187, + 0.0001347694972127153 + ], + "error_norm_m": 0.0002894095299805776, + "predicted_m": [ + 0.5045976355991969, + -0.3127428187672989, + -0.027385663219507896 + ], + "observed_m": [ + 0.5043945096748418, + -0.3125868222368263, + -0.02752043271672061 + ] + }, + { + "marker_id": 86, + "link": "Board", + "error_m": [ + -0.00035883263285391154, + -0.00015731092163612237, + 0.00010075824908208422 + ], + "error_norm_m": 0.00040454889596310066, + "predicted_m": [ + 0.3629124361025995, + 0.29201829779871546, + -0.02728649953201595 + ], + "observed_m": [ + 0.3632712687354534, + 0.2921756087203516, + -0.027387257781098035 + ] + }, + { + "marker_id": 92, + "link": "Board", + "error_m": [ + -0.0002934523327690064, + 0.0002629017827487645, + -0.00018794120863876995 + ], + "error_norm_m": 0.0004365243600128771, + "predicted_m": [ + 0.6451086479558872, + -0.18483393131699793, + -0.027396513301796547 + ], + "observed_m": [ + 0.6454021002886562, + -0.1850968330997467, + -0.027208572093157777 + ] + }, + { + "marker_id": 95, + "link": "Board", + "error_m": [ + 0.00019812064350874237, + 0.00014999898375817056, + -6.225838941766731e-05 + ], + "error_norm_m": 0.00025617882731733316, + "predicted_m": [ + 0.18605794803768458, + -0.27406029897278616, + -0.02732154956052728 + ], + "observed_m": [ + 0.18585982739417584, + -0.27421029795654434, + -0.027259291171109614 + ] + }, + { + "marker_id": 96, + "link": "Board", + "error_m": [ + 8.627927498106036e-05, + 9.213278406036696e-05, + -9.836286334074032e-05 + ], + "error_norm_m": 0.000160024423368937, + "predicted_m": [ + 0.3697886396708029, + -0.18648175315741503, + -0.027345316784081836 + ], + "observed_m": [ + 0.3697023603958218, + -0.1865738859414754, + -0.027246953920741095 + ] + }, + { + "marker_id": 97, + "link": "Board", + "error_m": [ + 0.00022164513432659794, + 8.413999103396019e-05, + -0.00021176258327362807 + ], + "error_norm_m": 0.0003178828327176081, + "predicted_m": [ + 0.30436726684140514, + -0.35966123434089586, + -0.0273539270887528 + ], + "observed_m": [ + 0.30414562170707854, + -0.3597453743319298, + -0.027142164505479172 + ] + }, + { + "marker_id": 101, + "link": "Board", + "error_m": [ + -5.676935748405443e-05, + 0.00011481105218846821, + -1.1951448038453188e-05 + ], + "error_norm_m": 0.00012863582224245074, + "predicted_m": [ + 0.11772249314194222, + 0.29867023752964394, + -0.02723992952335222 + ], + "observed_m": [ + 0.11777926249942627, + 0.2985554264774555, + -0.027227978075313766 + ] + }, + { + "marker_id": 102, + "link": "Board", + "error_m": [ + -0.00012606484361721293, + -0.00019410822228813074, + 0.00036249867615404524 + ], + "error_norm_m": 0.00043008794097199016, + "predicted_m": [ + 0.6497083451227117, + -0.22299396743208486, + -0.027401960206043074 + ], + "observed_m": [ + 0.6498344099663289, + -0.22279985920979672, + -0.02776445888219712 + ] + }, + { + "marker_id": 103, + "link": "Board", + "error_m": [ + 3.75396160226249e-05, + 0.00021848045899708346, + -7.526325638289658e-05 + ], + "error_norm_m": 0.00023410999871013627, + "predicted_m": [ + 0.10572863460070166, + -0.18769966408253902, + -0.027296170506814023 + ], + "observed_m": [ + 0.10569109498467903, + -0.1879181445415361, + -0.027220907250431126 + ] + }, + { + "marker_id": 105, + "link": "Board", + "error_m": [ + 0.00017913342661046716, + 0.000210656851415858, + -0.0002720035290025881 + ], + "error_norm_m": 0.0003878801533560492, + "predicted_m": [ + 0.5248580041661369, + -0.26624297938844327, + -0.02738385424630833 + ], + "observed_m": [ + 0.5246788707395265, + -0.2664536362398591, + -0.027111850717305742 + ] + }, + { + "marker_id": 198, + "link": "Arm1", + "error_m": [ + -1.6088001288744325e-05, + 0.0024111437455629284, + 0.011183141279931988 + ], + "error_norm_m": 0.011440127703503644, + "predicted_m": [ + 0.14010158833370714, + -0.050673225210058376, + 0.10162833560725015 + ], + "observed_m": [ + 0.1401176763349959, + -0.053084368955621304, + 0.09044519432731817 + ] + }, + { + "marker_id": 205, + "link": "Board", + "error_m": [ + -3.964650851695506e-05, + 1.2098030970658646e-05, + -0.00023363467438157246 + ], + "error_norm_m": 0.00023728330970452892, + "predicted_m": [ + 0.7500245507222149, + -0.08999808053842868, + 0.00019530530139471217 + ], + "observed_m": [ + 0.7500641972307318, + -0.09001017856939934, + 0.0004289399757762846 + ] + }, + { + "marker_id": 206, + "link": "Board", + "error_m": [ + 5.497735281512206e-05, + -0.0003467456861196462, + 7.08540774461642e-05 + ], + "error_norm_m": 0.0003581555255135535, + "predicted_m": [ + 0.6500251871697533, + -0.009997289986131553, + 0.00022359151879563336 + ], + "observed_m": [ + 0.6499702098169382, + -0.009650544300011906, + 0.00015273744134946916 + ] + }, + { + "marker_id": 207, + "link": "Board", + "error_m": [ + -0.000675204086429404, + -0.0004522642832782489, + 0.000567904346721304 + ], + "error_norm_m": 0.0009914428310725258, + "predicted_m": [ + 0.7500251854242768, + -0.009998081119214583, + 0.00020492418363620245 + ], + "observed_m": [ + 0.7507003895107062, + -0.009545816835936334, + -0.0003629801630851015 + ] + }, + { + "marker_id": 208, + "link": "Board", + "error_m": [ + 8.103369664302917e-05, + 8.449754240932861e-05, + -5.784049800828736e-05 + ], + "error_norm_m": 0.00013058260938845362, + "predicted_m": [ + 0.3500245577041208, + -0.08999491600609656, + 0.0002699746420324358 + ], + "observed_m": [ + 0.34994352400747775, + -0.09007941354850589, + 0.0003278151400407232 + ] + }, + { + "marker_id": 210, + "link": "Board", + "error_m": [ + -4.0705434832904314e-05, + 0.0002875021340621245, + -0.00011130962817117374 + ], + "error_norm_m": 0.0003109730580594026, + "predicted_m": [ + 0.02002511882849735, + -0.01999230577511022, + 0.00033999337001986183 + ], + "observed_m": [ + 0.020065824263330253, + -0.020279807909172345, + 0.0004513029981910356 + ] + }, + { + "marker_id": 211, + "link": "Board", + "error_m": [ + 1.33701774804873e-05, + 9.383654401974931e-05, + -1.0346849726384035e-05 + ], + "error_norm_m": 9.534734363730566e-05, + "predicted_m": [ + 0.25002519415165914, + -0.00999412545379943, + 0.000298260859433357 + ], + "observed_m": [ + 0.25001182397417865, + -0.01008796199781918, + 0.00030860770915974104 + ] + }, + { + "marker_id": 214, + "link": "Board", + "error_m": [ + 3.487801149665293e-05, + 0.00044274628708106806, + -0.00029472423741045946 + ], + "error_norm_m": 0.0005330132517369611, + "predicted_m": [ + 0.3500251924061827, + -0.00999491658688246, + 0.0002795935242739261 + ], + "observed_m": [ + 0.34999031439468603, + -0.010437662873963529, + 0.0005743177616843856 + ] + }, + { + "marker_id": 215, + "link": "Board", + "error_m": [ + 5.814383252331079e-05, + 3.1566079447112316e-05, + -8.698037465849884e-06 + ], + "error_norm_m": 6.672914271828725e-05, + "predicted_m": [ + 0.25002455944959723, + -0.08999412487301353, + 0.0002886419771918667 + ], + "observed_m": [ + 0.24996641561707392, + -0.09002569095246064, + 0.0002973400146577166 + ] + }, + { + "marker_id": 217, + "link": "Board", + "error_m": [ + -0.00018180264930645063, + -0.0003000352885192542, + 0.00010324834312563732 + ], + "error_norm_m": 0.000365696045931407, + "predicted_m": [ + 0.6500245524676914, + -0.08999728940534565, + 0.00021397263655414307 + ], + "observed_m": [ + 0.6502063551169979, + -0.0896972541168264, + 0.00011072429342850576 + ] + }, + { + "marker_id": 229, + "link": "Arm1", + "error_m": [ + 9.752888367287049e-05, + 0.002500000767718197, + 0.017427406537361564 + ], + "error_norm_m": 0.017606078903044102, + "predicted_m": [ + 0.14010146655261663, + -0.14061774910617264, + 0.10478786422501525 + ], + "observed_m": [ + 0.14000393766894376, + -0.14311774987389084, + 0.08736045768765369 + ] + }, + { + "marker_id": 243, + "link": "Arm1", + "error_m": [ + -7.226925354825164e-05, + 0.00022747565451403107, + 0.02030364081253419 + ], + "error_norm_m": 0.020305043665621827, + "predicted_m": [ + 0.14009487993259997, + -0.17682488060906051, + 0.07103814444915608 + ], + "observed_m": [ + 0.14016714918614823, + -0.17705235626357455, + 0.050734503636621894 + ] + } + ], + "stage_idx": 0, + "num_active_links": 3 + }, + { + "method": "deterministic_geometric_prefix", + "active_links": [ + "Board", + "Base", + "Arm1", + "Ellbow" + ], + "active_observations": 49, + "joint_updates": [ + { + "pass": 0, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.03005780230191434, + "new": 0.03008008223991194, + "info": { + "reason": "weighted_projection", + "used_markers": 7, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.03007599697268204, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.029963546430604854, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.03013386350245613, + "weight": 1.0 + }, + { + "marker_id": 244, + "q_i": 0.03052059692573975, + "weight": 1.0 + }, + { + "marker_id": 245, + "q_i": 0.029952785895270544, + "weight": 1.0 + }, + { + "marker_id": 248, + "q_i": 0.03004782901698107, + "weight": 1.0 + }, + { + "marker_id": 232, + "q_i": 0.029865956935649182, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": 0.035233325052451914, + "new": -0.01709056164052214, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 7, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": -0.017090561640522268, + "theta_alt_rad": 3.124502091949271, + "score_theta": 0.007377603144415212, + "score_theta_alt": 1.9681402101890386, + "best_score": 0.007377603144415212, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + }, + { + "marker_id": 244, + "weight": 1.0 + }, + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + } + ] + } + }, + { + "link": "Ellbow", + "joint_variable": "z", + "joint_type": "revolute", + "old": 0.0, + "new": 1.6206480172155189, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 3, + "axis_world": [ + -0.9999999825442352, + 7.911330830299227e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": -1.5209446363742747, + "theta_alt_rad": 1.6206480172155189, + "score_theta": 0.19621666885710629, + "score_theta_alt": 0.11915769622974923, + "best_score": 0.11915769622974923, + "per_marker": [ + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + } + ] + } + } + ] + }, + { + "pass": 1, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.03008008223991194, + "new": 0.03008008224001913, + "info": { + "reason": "weighted_projection", + "used_markers": 7, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.030075996972682033, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.029963546430604848, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.030133863502456143, + "weight": 1.0 + }, + { + "marker_id": 244, + "q_i": 0.0305205969260021, + "weight": 1.0 + }, + { + "marker_id": 245, + "q_i": 0.029952785895459435, + "weight": 1.0 + }, + { + "marker_id": 248, + "q_i": 0.030047829017091274, + "weight": 1.0 + }, + { + "marker_id": 232, + "q_i": 0.02986595693583809, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": -0.01709056164052214, + "new": 0.03362140443012329, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 7, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": 0.033621404430123514, + "theta_alt_rad": -3.10797124915967, + "score_theta": 0.002202747189759713, + "score_theta_alt": 2.0939306729503113, + "best_score": 0.002202747189759713, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + }, + { + "marker_id": 244, + "weight": 1.0 + }, + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + } + ] + } + }, + { + "link": "Ellbow", + "joint_variable": "z", + "joint_type": "revolute", + "old": 1.6206480172155189, + "new": -1.199306941308583, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 3, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.00018667335159412238 + ], + "axis_id": 0, + "theta_rad": -1.199306941308583, + "theta_alt_rad": 1.94228571228121, + "score_theta": 0.1449652535403994, + "score_theta_alt": 0.17371317628502098, + "best_score": 0.1449652535403994, + "per_marker": [ + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + } + ] + } + } + ] + } + ], + "root_link": "Board", + "root_pose": { + "reason": "kabsch", + "used_markers": [ + 210, + 211, + 215, + 214, + 208, + 206, + 205, + 207, + 217, + 46, + 47, + 51, + 52, + 53, + 54, + 55, + 56, + 58, + 60, + 61, + 62, + 63, + 64, + 66, + 68, + 69, + 72, + 73, + 79, + 82, + 83, + 84, + 85, + 86, + 92, + 95, + 96, + 97, + 101, + 102, + 103, + 105 + ] + }, + "marker_stats": { + "num_markers_used": 49, + "mean_error_m": 0.0059748628308253894, + "rms_error_m": 0.018417460752568476, + "median_error_m": 0.00025617882731733316, + "worst_error_m": 0.08008046701372831 + }, + "marker_reports": [ + { + "marker_id": 46, + "link": "Board", + "error_m": [ + 0.00024014580635156602, + 0.00019849948688827057, + -0.0001325889838793802 + ], + "error_norm_m": 0.00033860285475659696, + "predicted_m": [ + 0.5367315875661282, + 0.18544692342486993, + -0.02733176064749602 + ], + "observed_m": [ + 0.5364914417597766, + 0.18524842393798166, + -0.02719917166361664 + ] + }, + { + "marker_id": 47, + "link": "Board", + "error_m": [ + -0.0001356286636347015, + 0.00012133053072427291, + -0.00014802679586498058 + ], + "error_norm_m": 0.00023458082696422862, + "predicted_m": [ + 0.34424784634233146, + -0.2865315503756803, + -0.02735257876128538 + ], + "observed_m": [ + 0.34438347500596617, + -0.28665288090640456, + -0.0272045519654204 + ] + }, + { + "marker_id": 51, + "link": "Board", + "error_m": [ + 6.307287002968454e-05, + -0.00014999963369966007, + 0.00013641978209038771 + ], + "error_norm_m": 0.0002123403729614379, + "predicted_m": [ + 0.1678187575218507, + -0.1720701554105413, + -0.027305881766096583 + ], + "observed_m": [ + 0.167755684651821, + -0.17192015577684164, + -0.02744230154818697 + ] + }, + { + "marker_id": 52, + "link": "Board", + "error_m": [ + 5.976559091475098e-05, + -0.00019726439713532717, + 5.5558001508391325e-05 + ], + "error_norm_m": 0.00021347566551286321, + "predicted_m": [ + 0.09470177950393126, + 0.20867042030186375, + -0.027246453545320196 + ], + "observed_m": [ + 0.0946420139130165, + 0.20886768469899908, + -0.027302011546828587 + ] + }, + { + "marker_id": 53, + "link": "Board", + "error_m": [ + 2.2465988035458295e-06, + 0.00015843318946973106, + 2.8051563047696432e-05 + ], + "error_norm_m": 0.00016091306013234192, + "predicted_m": [ + 0.4862718010720863, + 0.21224732243606034, + -0.02731911878462367 + ], + "observed_m": [ + 0.48626955447328274, + 0.2120888892465906, + -0.027347170347671368 + ] + }, + { + "marker_id": 54, + "link": "Board", + "error_m": [ + -9.480154294294607e-05, + 1.627539552162549e-05, + -0.00012362426496341158 + ], + "error_norm_m": 0.00015663709628147604, + "predicted_m": [ + 0.34228749689371984, + -0.3305815345496766, + -0.027357509278550476 + ], + "observed_m": [ + 0.3423822984366628, + -0.3305978099451982, + -0.027233885013587065 + ] + }, + { + "marker_id": 55, + "link": "Board", + "error_m": [ + -1.0716649648634391e-05, + 0.00011026767914773528, + -6.97715080855317e-05 + ], + "error_norm_m": 0.0001309269681343339, + "predicted_m": [ + 0.28373803749178683, + -0.26257107183499706, + -0.027338402301549082 + ], + "observed_m": [ + 0.28374875414143547, + -0.2626813395141448, + -0.02726863079346355 + ] + }, + { + "marker_id": 56, + "link": "Board", + "error_m": [ + 6.356140605623395e-05, + -2.3035154325057317e-05, + -4.765688565996212e-05 + ], + "error_norm_m": 8.271547270874637e-05, + "predicted_m": [ + 0.49870145518051306, + 0.16867722441452865, + -0.02732667781812476 + ], + "observed_m": [ + 0.49863789377445683, + 0.1687002595688537, + -0.027279020932464797 + ] + }, + { + "marker_id": 58, + "link": "Board", + "error_m": [ + 0.00010114347277415808, + -0.000100406862560104, + 1.7625811855784268e-05 + ], + "error_norm_m": 0.00014360435013451362, + "predicted_m": [ + 0.050108394384752154, + -0.21809922383361957, + -0.027289442910250115 + ], + "observed_m": [ + 0.050007250911977996, + -0.21799881697105947, + -0.0273070687221059 + ] + }, + { + "marker_id": 60, + "link": "Board", + "error_m": [ + 2.5816559448055276e-05, + 0.00010821188574633434, + -2.1284107574501276e-05 + ], + "error_norm_m": 0.00011326658904441165, + "predicted_m": [ + 0.4343823697981462, + 0.28381773243543157, + -0.027300827011884146 + ], + "observed_m": [ + 0.43435655323869815, + 0.28370952054968523, + -0.027279542904309645 + ] + }, + { + "marker_id": 61, + "link": "Board", + "error_m": [ + 2.213673047626874e-05, + -0.0004748026529825533, + 0.00036777003104209935 + ], + "error_norm_m": 0.000600984517145123, + "predicted_m": [ + -0.022397209513850602, + 0.3358413457954722, + -0.02720930368016537 + ], + "observed_m": [ + -0.02241934624432687, + 0.33631614844845475, + -0.02757707371120747 + ] + }, + { + "marker_id": 62, + "link": "Board", + "error_m": [ + -5.2027625080386386e-05, + -0.00019686027029469644, + 0.0001104321380561088 + ], + "error_norm_m": 0.00023163785724196654, + "predicted_m": [ + 0.4047187294268141, + -0.1750920295828903, + -0.027350467795893892 + ], + "observed_m": [ + 0.40477075705189447, + -0.1748951693125956, + -0.02746089993395 + ] + }, + { + "marker_id": 63, + "link": "Board", + "error_m": [ + 5.97205525321165e-05, + 8.612992450571233e-05, + 0.00017768133054744256 + ], + "error_norm_m": 0.00020628999858260345, + "predicted_m": [ + 0.7774182385644122, + -0.23614497769267853, + -0.02742738136354363 + ], + "observed_m": [ + 0.77735851801188, + -0.23623110761718424, + -0.027605062694091072 + ] + }, + { + "marker_id": 64, + "link": "Board", + "error_m": [ + -7.91293138496553e-05, + -0.0001473370794227158, + 0.00015746330336172815 + ], + "error_norm_m": 0.0002297049307018039, + "predicted_m": [ + -0.0212513673084557, + -0.18821865949797503, + -0.027272529247363148 + ], + "observed_m": [ + -0.021172237994606043, + -0.18807132241855232, + -0.027429992550724876 + ] + }, + { + "marker_id": 66, + "link": "Board", + "error_m": [ + -9.67864364553872e-05, + 0.0001370872909244869, + -1.2083618247695632e-05 + ], + "error_norm_m": 0.0001682455153776874, + "predicted_m": [ + 0.20976724024838408, + -0.3632204859031543, + -0.027336695829951723 + ], + "observed_m": [ + 0.20986402668483947, + -0.3633575731940788, + -0.027324612211704027 + ] + }, + { + "marker_id": 68, + "link": "Board", + "error_m": [ + 1.5700754685266105e-05, + 0.00018632529536974363, + -3.095209368547333e-05 + ], + "error_norm_m": 0.00018953010709600582, + "predicted_m": [ + 0.5737514695000713, + 0.17064663065484797, + -0.027340450788186716 + ], + "observed_m": [ + 0.573735768745386, + 0.17046030535947823, + -0.027309498694501243 + ] + }, + { + "marker_id": 69, + "link": "Board", + "error_m": [ + -2.0034684490774328e-05, + -0.00030379998350144044, + 0.0002071791909846396 + ], + "error_norm_m": 0.0003682648988638072, + "predicted_m": [ + 0.00762789450497923, + -0.28119888730219095, + -0.027289099919642363 + ], + "observed_m": [ + 0.007647929189470004, + -0.2808950873186895, + -0.027496279110627003 + ] + }, + { + "marker_id": 72, + "link": "Board", + "error_m": [ + 0.00047090395286775166, + 0.00012575615412688257, + -0.00035486948541986474 + ], + "error_norm_m": 0.0006029075342118536, + "predicted_m": [ + 0.44101165968882705, + 0.19432768063298977, + -0.02731282457835261 + ], + "observed_m": [ + 0.4405407557359593, + 0.1942019244788629, + -0.026957955092932744 + ] + }, + { + "marker_id": 73, + "link": "Board", + "error_m": [ + 5.680208949179755e-05, + 0.0004589062252717824, + -0.0004479530621591017 + ], + "error_norm_m": 0.0006438038108473311, + "predicted_m": [ + 0.22175276464469845, + 0.3331194142637967, + -0.02725520702095333 + ], + "observed_m": [ + 0.22169596255520665, + 0.3326605080385249, + -0.026807253958794228 + ] + }, + { + "marker_id": 79, + "link": "Board", + "error_m": [ + -0.00013968223420696146, + -0.0005000676111311941, + 0.00022277023191346126 + ], + "error_norm_m": 0.0005649825824592162, + "predicted_m": [ + 0.31231885790070896, + -0.1591012986920062, + -0.02733129660411856 + ], + "observed_m": [ + 0.3124585401349159, + -0.158601231080875, + -0.02755406683603202 + ] + }, + { + "marker_id": 82, + "link": "Board", + "error_m": [ + -7.405616276753846e-05, + -8.325803470837778e-05, + 7.280887590920687e-05 + ], + "error_norm_m": 0.00013310652875992175, + "predicted_m": [ + 0.2191824801050202, + 0.29724943485632677, + -0.02725904013676476 + ], + "observed_m": [ + 0.21925653626778774, + 0.29733269289103514, + -0.027331849012673968 + ] + }, + { + "marker_id": 83, + "link": "Board", + "error_m": [ + -4.62492650498067e-05, + -0.00012746911940025862, + 0.00018718614259173594 + ], + "error_norm_m": 0.00023114069935149535, + "predicted_m": [ + 0.04418281621951103, + 0.33923081903445473, + -0.02722132479177954 + ], + "observed_m": [ + 0.044229065484560834, + 0.339358288153855, + -0.027408510934371275 + ] + }, + { + "marker_id": 84, + "link": "Board", + "error_m": [ + 0.00017232694873475785, + 0.00011817015158627209, + -5.607158385221092e-05 + ], + "error_norm_m": 0.00021634413442903855, + "predicted_m": [ + 0.4075121688285888, + 0.2584279451972179, + -0.027298863891678203 + ], + "observed_m": [ + 0.40733984187985406, + 0.25830977504563163, + -0.027242792307825992 + ] + }, + { + "marker_id": 85, + "link": "Board", + "error_m": [ + 0.00020312592435511867, + -0.00015599653047260187, + 0.0001347694972127153 + ], + "error_norm_m": 0.0002894095299805776, + "predicted_m": [ + 0.5045976355991969, + -0.3127428187672989, + -0.027385663219507896 + ], + "observed_m": [ + 0.5043945096748418, + -0.3125868222368263, + -0.02752043271672061 + ] + }, + { + "marker_id": 86, + "link": "Board", + "error_m": [ + -0.00035883263285391154, + -0.00015731092163612237, + 0.00010075824908208422 + ], + "error_norm_m": 0.00040454889596310066, + "predicted_m": [ + 0.3629124361025995, + 0.29201829779871546, + -0.02728649953201595 + ], + "observed_m": [ + 0.3632712687354534, + 0.2921756087203516, + -0.027387257781098035 + ] + }, + { + "marker_id": 92, + "link": "Board", + "error_m": [ + -0.0002934523327690064, + 0.0002629017827487645, + -0.00018794120863876995 + ], + "error_norm_m": 0.0004365243600128771, + "predicted_m": [ + 0.6451086479558872, + -0.18483393131699793, + -0.027396513301796547 + ], + "observed_m": [ + 0.6454021002886562, + -0.1850968330997467, + -0.027208572093157777 + ] + }, + { + "marker_id": 95, + "link": "Board", + "error_m": [ + 0.00019812064350874237, + 0.00014999898375817056, + -6.225838941766731e-05 + ], + "error_norm_m": 0.00025617882731733316, + "predicted_m": [ + 0.18605794803768458, + -0.27406029897278616, + -0.02732154956052728 + ], + "observed_m": [ + 0.18585982739417584, + -0.27421029795654434, + -0.027259291171109614 + ] + }, + { + "marker_id": 96, + "link": "Board", + "error_m": [ + 8.627927498106036e-05, + 9.213278406036696e-05, + -9.836286334074032e-05 + ], + "error_norm_m": 0.000160024423368937, + "predicted_m": [ + 0.3697886396708029, + -0.18648175315741503, + -0.027345316784081836 + ], + "observed_m": [ + 0.3697023603958218, + -0.1865738859414754, + -0.027246953920741095 + ] + }, + { + "marker_id": 97, + "link": "Board", + "error_m": [ + 0.00022164513432659794, + 8.413999103396019e-05, + -0.00021176258327362807 + ], + "error_norm_m": 0.0003178828327176081, + "predicted_m": [ + 0.30436726684140514, + -0.35966123434089586, + -0.0273539270887528 + ], + "observed_m": [ + 0.30414562170707854, + -0.3597453743319298, + -0.027142164505479172 + ] + }, + { + "marker_id": 101, + "link": "Board", + "error_m": [ + -5.676935748405443e-05, + 0.00011481105218846821, + -1.1951448038453188e-05 + ], + "error_norm_m": 0.00012863582224245074, + "predicted_m": [ + 0.11772249314194222, + 0.29867023752964394, + -0.02723992952335222 + ], + "observed_m": [ + 0.11777926249942627, + 0.2985554264774555, + -0.027227978075313766 + ] + }, + { + "marker_id": 102, + "link": "Board", + "error_m": [ + -0.00012606484361721293, + -0.00019410822228813074, + 0.00036249867615404524 + ], + "error_norm_m": 0.00043008794097199016, + "predicted_m": [ + 0.6497083451227117, + -0.22299396743208486, + -0.027401960206043074 + ], + "observed_m": [ + 0.6498344099663289, + -0.22279985920979672, + -0.02776445888219712 + ] + }, + { + "marker_id": 103, + "link": "Board", + "error_m": [ + 3.75396160226249e-05, + 0.00021848045899708346, + -7.526325638289658e-05 + ], + "error_norm_m": 0.00023410999871013627, + "predicted_m": [ + 0.10572863460070166, + -0.18769966408253902, + -0.027296170506814023 + ], + "observed_m": [ + 0.10569109498467903, + -0.1879181445415361, + -0.027220907250431126 + ] + }, + { + "marker_id": 105, + "link": "Board", + "error_m": [ + 0.00017913342661046716, + 0.000210656851415858, + -0.0002720035290025881 + ], + "error_norm_m": 0.0003878801533560492, + "predicted_m": [ + 0.5248580041661369, + -0.26624297938844327, + -0.02738385424630833 + ], + "observed_m": [ + 0.5246788707395265, + -0.2664536362398591, + -0.027111850717305742 + ] + }, + { + "marker_id": 198, + "link": "Arm1", + "error_m": [ + 6.1436655210134195e-06, + 0.0023459132292872747, + 0.010927316747539328 + ], + "error_norm_m": 0.011176296252561694, + "predicted_m": [ + 0.1401238200005169, + -0.05073845572633403, + 0.1013725110748575 + ], + "observed_m": [ + 0.1401176763349959, + -0.053084368955621304, + 0.09044519432731817 + ] + }, + { + "marker_id": 205, + "link": "Board", + "error_m": [ + -3.964650851695506e-05, + 1.2098030970658646e-05, + -0.00023363467438157246 + ], + "error_norm_m": 0.00023728330970452892, + "predicted_m": [ + 0.7500245507222149, + -0.08999808053842868, + 0.00019530530139471217 + ], + "observed_m": [ + 0.7500641972307318, + -0.09001017856939934, + 0.0004289399757762846 + ] + }, + { + "marker_id": 206, + "link": "Board", + "error_m": [ + 5.497735281512206e-05, + -0.0003467456861196462, + 7.08540774461642e-05 + ], + "error_norm_m": 0.0003581555255135535, + "predicted_m": [ + 0.6500251871697533, + -0.009997289986131553, + 0.00022359151879563336 + ], + "observed_m": [ + 0.6499702098169382, + -0.009650544300011906, + 0.00015273744134946916 + ] + }, + { + "marker_id": 207, + "link": "Board", + "error_m": [ + -0.000675204086429404, + -0.0004522642832782489, + 0.000567904346721304 + ], + "error_norm_m": 0.0009914428310725258, + "predicted_m": [ + 0.7500251854242768, + -0.009998081119214583, + 0.00020492418363620245 + ], + "observed_m": [ + 0.7507003895107062, + -0.009545816835936334, + -0.0003629801630851015 + ] + }, + { + "marker_id": 208, + "link": "Board", + "error_m": [ + 8.103369664302917e-05, + 8.449754240932861e-05, + -5.784049800828736e-05 + ], + "error_norm_m": 0.00013058260938845362, + "predicted_m": [ + 0.3500245577041208, + -0.08999491600609656, + 0.0002699746420324358 + ], + "observed_m": [ + 0.34994352400747775, + -0.09007941354850589, + 0.0003278151400407232 + ] + }, + { + "marker_id": 210, + "link": "Board", + "error_m": [ + -4.0705434832904314e-05, + 0.0002875021340621245, + -0.00011130962817117374 + ], + "error_norm_m": 0.0003109730580594026, + "predicted_m": [ + 0.02002511882849735, + -0.01999230577511022, + 0.00033999337001986183 + ], + "observed_m": [ + 0.020065824263330253, + -0.020279807909172345, + 0.0004513029981910356 + ] + }, + { + "marker_id": 211, + "link": "Board", + "error_m": [ + 1.33701774804873e-05, + 9.383654401974931e-05, + -1.0346849726384035e-05 + ], + "error_norm_m": 9.534734363730566e-05, + "predicted_m": [ + 0.25002519415165914, + -0.00999412545379943, + 0.000298260859433357 + ], + "observed_m": [ + 0.25001182397417865, + -0.01008796199781918, + 0.00030860770915974104 + ] + }, + { + "marker_id": 214, + "link": "Board", + "error_m": [ + 3.487801149665293e-05, + 0.00044274628708106806, + -0.00029472423741045946 + ], + "error_norm_m": 0.0005330132517369611, + "predicted_m": [ + 0.3500251924061827, + -0.00999491658688246, + 0.0002795935242739261 + ], + "observed_m": [ + 0.34999031439468603, + -0.010437662873963529, + 0.0005743177616843856 + ] + }, + { + "marker_id": 215, + "link": "Board", + "error_m": [ + 5.814383252331079e-05, + 3.1566079447112316e-05, + -8.698037465849884e-06 + ], + "error_norm_m": 6.672914271828725e-05, + "predicted_m": [ + 0.25002455944959723, + -0.08999412487301353, + 0.0002886419771918667 + ], + "observed_m": [ + 0.24996641561707392, + -0.09002569095246064, + 0.0002973400146577166 + ] + }, + { + "marker_id": 217, + "link": "Board", + "error_m": [ + -0.00018180264930645063, + -0.0003000352885192542, + 0.00010324834312563732 + ], + "error_norm_m": 0.000365696045931407, + "predicted_m": [ + 0.6500245524676914, + -0.08999728940534565, + 0.00021397263655414307 + ], + "observed_m": [ + 0.6502063551169979, + -0.0896972541168264, + 0.00011072429342850576 + ] + }, + { + "marker_id": 229, + "link": "Arm1", + "error_m": [ + 0.00011973344581753254, + 0.002429794195305174, + 0.017026594532667333 + ], + "error_norm_m": 0.017199510379933586, + "predicted_m": [ + 0.1401236711147613, + -0.14068795567858566, + 0.10438705222032102 + ], + "observed_m": [ + 0.14000393766894376, + -0.14311774987389084, + 0.08736045768765369 + ] + }, + { + "marker_id": 232, + "link": "Ellbow", + "error_m": [ + 0.00022468242480011558, + 0.05908853866903127, + 0.05404974849990712 + ], + "error_norm_m": 0.08008046701372831, + "predicted_m": [ + 0.2301198135137316, + -0.10936136335631019, + 0.08238601791621822 + ], + "observed_m": [ + 0.22989513108893148, + -0.16844990202534146, + 0.0283362694163111 + ] + }, + { + "marker_id": 243, + "link": "Arm1", + "error_m": [ + -5.007514727181639e-05, + 0.0002117179671483338, + 0.01984450965784186 + ], + "error_norm_m": 0.019845702194131773, + "predicted_m": [ + 0.1401170740388764, + -0.1768406382964262, + 0.07057901329446375 + ], + "observed_m": [ + 0.14016714918614823, + -0.17705235626357455, + 0.050734503636621894 + ] + }, + { + "marker_id": 244, + "link": "Ellbow", + "error_m": [ + -0.0004372769586900027, + 0.00023078772903964428, + 0.017334606237668637 + ], + "error_norm_m": 0.017341656424041417, + "predicted_m": [ + 0.2651171297568875, + -0.1418612661202376, + 0.06938335756894534 + ], + "observed_m": [ + 0.2655544067155775, + -0.14209205384927726, + 0.052048751331276705 + ] + }, + { + "marker_id": 245, + "link": "Ellbow", + "error_m": [ + 0.00012818021745081287, + 0.06734168035893326, + 0.0018808701110254386 + ], + "error_norm_m": 0.06736806376991573, + "predicted_m": [ + 0.23011481057382716, + -0.10969227503685039, + 0.05559953863227672 + ], + "observed_m": [ + 0.22998663035637634, + -0.17703395539578365, + 0.05371866852125128 + ] + }, + { + "marker_id": 248, + "link": "Ellbow", + "error_m": [ + 3.3136616425732957e-05, + 0.06742199808704592, + 0.0018749071636034592 + ], + "error_norm_m": 0.06744807040202933, + "predicted_m": [ + 0.19261481122842866, + -0.10969197836194426, + 0.055606538882961506 + ], + "observed_m": [ + 0.19258167461200293, + -0.17711397644899018, + 0.05373163171935805 + ] + } + ], + "stage_idx": 1, + "num_active_links": 4 + }, + { + "method": "deterministic_geometric_prefix", + "active_links": [ + "Board", + "Base", + "Arm1", + "Ellbow", + "Arm2" + ], + "active_observations": 53, + "joint_updates": [ + { + "pass": 0, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.03008008224001913, + "new": 0.0321651305358493, + "info": { + "reason": "weighted_projection", + "used_markers": 11, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.030075996972682036, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.02996354643060485, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.03013386350245614, + "weight": 1.0 + }, + { + "marker_id": 244, + "q_i": 0.03052059692589901, + "weight": 1.0 + }, + { + "marker_id": 245, + "q_i": 0.029952785895385182, + "weight": 1.0 + }, + { + "marker_id": 248, + "q_i": 0.03004782901704794, + "weight": 1.0 + }, + { + "marker_id": 232, + "q_i": 0.02986595693576383, + "weight": 1.0 + }, + { + "marker_id": 120, + "q_i": 0.037270891354173157, + "weight": 1.0 + }, + { + "marker_id": 114, + "q_i": 0.03741821802818537, + "weight": 1.0 + }, + { + "marker_id": 115, + "q_i": 0.03988786819954635, + "weight": 1.0 + }, + { + "marker_id": 219, + "q_i": 0.02867888263259843, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": 0.03362140443012329, + "new": -0.5318264271484381, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 11, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": -0.5318264271484379, + "theta_alt_rad": 2.609766226441355, + "score_theta": 1.0319501580739046, + "score_theta_alt": 2.557477346779494, + "best_score": 1.0319501580739046, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + }, + { + "marker_id": 244, + "weight": 1.0 + }, + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + }, + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + }, + { + "link": "Ellbow", + "joint_variable": "z", + "joint_type": "revolute", + "old": -1.199306941308583, + "new": 1.0027658216553856, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 7, + "axis_world": [ + -0.9999999825442352, + 7.911330830299227e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": -2.1388268319344075, + "theta_alt_rad": 1.0027658216553856, + "score_theta": 1.0209781366597686, + "score_theta_alt": 0.3829212775389696, + "best_score": 0.3829212775389696, + "per_marker": [ + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + }, + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm2", + "joint_variable": "a", + "joint_type": "revolute", + "old": 0.0, + "new": 0.948088380748696, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 4, + "axis_world": [ + 7.762755216443495e-05, + -0.8911970041080515, + 0.4536164611660348 + ], + "axis_id": 1, + "theta_rad": -2.193504272841097, + "theta_alt_rad": 0.948088380748696, + "score_theta": 0.4440521987492321, + "score_theta_alt": 0.3646813567763245, + "best_score": 0.3646813567763245, + "per_marker": [ + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + } + ] + }, + { + "pass": 1, + "updates": [ + { + "link": "Base", + "joint_variable": "x", + "joint_type": "linear", + "old": 0.0321651305358493, + "new": 0.02894587263620346, + "info": { + "reason": "weighted_projection", + "used_markers": 11, + "axis_world": [ + 0.9999999825442352, + -7.911330830299229e-06, + -0.0001866733515941224 + ], + "per_marker": [ + { + "marker_id": 198, + "q_i": 0.03007599697268204, + "weight": 1.0 + }, + { + "marker_id": 229, + "q_i": 0.02996354643060486, + "weight": 1.0 + }, + { + "marker_id": 243, + "q_i": 0.03013386350245612, + "weight": 1.0 + }, + { + "marker_id": 244, + "q_i": 0.03052059692588964, + "weight": 1.0 + }, + { + "marker_id": 245, + "q_i": 0.029952785895378434, + "weight": 1.0 + }, + { + "marker_id": 248, + "q_i": 0.030047829017044024, + "weight": 1.0 + }, + { + "marker_id": 232, + "q_i": 0.02986595693575709, + "weight": 1.0 + }, + { + "marker_id": 120, + "q_i": 0.02748130038436775, + "weight": 1.0 + }, + { + "marker_id": 114, + "q_i": 0.027628627058379953, + "weight": 1.0 + }, + { + "marker_id": 115, + "q_i": 0.009468507068402972, + "weight": 1.0 + }, + { + "marker_id": 219, + "q_i": 0.043265588807275164, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm1", + "joint_variable": "y", + "joint_type": "revolute", + "old": -0.5318264271484381, + "new": -0.08818746829453605, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 11, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.0001866733515941224 + ], + "axis_id": 0, + "theta_rad": -0.08818746829453583, + "theta_alt_rad": 3.053405185295257, + "score_theta": 0.05988103606739789, + "score_theta_alt": 3.881092548073068, + "best_score": 0.05988103606739789, + "per_marker": [ + { + "marker_id": 198, + "weight": 1.0 + }, + { + "marker_id": 229, + "weight": 1.0 + }, + { + "marker_id": 243, + "weight": 1.0 + }, + { + "marker_id": 244, + "weight": 1.0 + }, + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + }, + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + }, + { + "link": "Ellbow", + "joint_variable": "z", + "joint_type": "revolute", + "old": 1.0027658216553856, + "new": 1.4953740918354965, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 7, + "axis_world": [ + -0.9999999825442352, + 7.911330830299229e-06, + 0.00018667335159412238 + ], + "axis_id": 0, + "theta_rad": -1.6462185617542968, + "theta_alt_rad": 1.4953740918354965, + "score_theta": 0.7697425070037229, + "score_theta_alt": 0.09893560477387695, + "best_score": 0.09893560477387695, + "per_marker": [ + { + "marker_id": 245, + "weight": 1.0 + }, + { + "marker_id": 248, + "weight": 1.0 + }, + { + "marker_id": 232, + "weight": 1.0 + }, + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + }, + { + "link": "Arm2", + "joint_variable": "a", + "joint_type": "revolute", + "old": 0.948088380748696, + "new": 1.0840347802398904, + "info": { + "reason": "2d_alignment+normal_tiebreak", + "used_markers": 4, + "axis_world": [ + 0.0001828872718432978, + -0.16299938910282485, + 0.9866261529588356 + ], + "axis_id": 2, + "theta_rad": 1.0840347802398902, + "theta_alt_rad": -2.0575578733499027, + "score_theta": 0.1513821515667613, + "score_theta_alt": 0.1755960639876984, + "best_score": 0.1513821515667613, + "per_marker": [ + { + "marker_id": 120, + "weight": 1.0 + }, + { + "marker_id": 114, + "weight": 1.0 + }, + { + "marker_id": 115, + "weight": 1.0 + }, + { + "marker_id": 219, + "weight": 1.0 + } + ] + } + } + ] + } + ], + "root_link": "Board", + "root_pose": { + "reason": "kabsch", + "used_markers": [ + 210, + 211, + 215, + 214, + 208, + 206, + 205, + 207, + 217, + 46, + 47, + 51, + 52, + 53, + 54, + 55, + 56, + 58, + 60, + 61, + 62, + 63, + 64, + 66, + 68, + 69, + 72, + 73, + 79, + 82, + 83, + 84, + 85, + 86, + 92, + 95, + 96, + 97, + 101, + 102, + 103, + 105 + ] + }, + "marker_stats": { + "num_markers_used": 53, + "mean_error_m": 0.004569083821120897, + "rms_error_m": 0.010879937404143085, + "median_error_m": 0.0003109730580594026, + "worst_error_m": 0.05141331442445902 + }, + "marker_reports": [ + { + "marker_id": 46, + "link": "Board", + "error_m": [ + 0.00024014580635156602, + 0.00019849948688827057, + -0.0001325889838793802 + ], + "error_norm_m": 0.00033860285475659696, + "predicted_m": [ + 0.5367315875661282, + 0.18544692342486993, + -0.02733176064749602 + ], + "observed_m": [ + 0.5364914417597766, + 0.18524842393798166, + -0.02719917166361664 + ] + }, + { + "marker_id": 47, + "link": "Board", + "error_m": [ + -0.0001356286636347015, + 0.00012133053072427291, + -0.00014802679586498058 + ], + "error_norm_m": 0.00023458082696422862, + "predicted_m": [ + 0.34424784634233146, + -0.2865315503756803, + -0.02735257876128538 + ], + "observed_m": [ + 0.34438347500596617, + -0.28665288090640456, + -0.0272045519654204 + ] + }, + { + "marker_id": 51, + "link": "Board", + "error_m": [ + 6.307287002968454e-05, + -0.00014999963369966007, + 0.00013641978209038771 + ], + "error_norm_m": 0.0002123403729614379, + "predicted_m": [ + 0.1678187575218507, + -0.1720701554105413, + -0.027305881766096583 + ], + "observed_m": [ + 0.167755684651821, + -0.17192015577684164, + -0.02744230154818697 + ] + }, + { + "marker_id": 52, + "link": "Board", + "error_m": [ + 5.976559091475098e-05, + -0.00019726439713532717, + 5.5558001508391325e-05 + ], + "error_norm_m": 0.00021347566551286321, + "predicted_m": [ + 0.09470177950393126, + 0.20867042030186375, + -0.027246453545320196 + ], + "observed_m": [ + 0.0946420139130165, + 0.20886768469899908, + -0.027302011546828587 + ] + }, + { + "marker_id": 53, + "link": "Board", + "error_m": [ + 2.2465988035458295e-06, + 0.00015843318946973106, + 2.8051563047696432e-05 + ], + "error_norm_m": 0.00016091306013234192, + "predicted_m": [ + 0.4862718010720863, + 0.21224732243606034, + -0.02731911878462367 + ], + "observed_m": [ + 0.48626955447328274, + 0.2120888892465906, + -0.027347170347671368 + ] + }, + { + "marker_id": 54, + "link": "Board", + "error_m": [ + -9.480154294294607e-05, + 1.627539552162549e-05, + -0.00012362426496341158 + ], + "error_norm_m": 0.00015663709628147604, + "predicted_m": [ + 0.34228749689371984, + -0.3305815345496766, + -0.027357509278550476 + ], + "observed_m": [ + 0.3423822984366628, + -0.3305978099451982, + -0.027233885013587065 + ] + }, + { + "marker_id": 55, + "link": "Board", + "error_m": [ + -1.0716649648634391e-05, + 0.00011026767914773528, + -6.97715080855317e-05 + ], + "error_norm_m": 0.0001309269681343339, + "predicted_m": [ + 0.28373803749178683, + -0.26257107183499706, + -0.027338402301549082 + ], + "observed_m": [ + 0.28374875414143547, + -0.2626813395141448, + -0.02726863079346355 + ] + }, + { + "marker_id": 56, + "link": "Board", + "error_m": [ + 6.356140605623395e-05, + -2.3035154325057317e-05, + -4.765688565996212e-05 + ], + "error_norm_m": 8.271547270874637e-05, + "predicted_m": [ + 0.49870145518051306, + 0.16867722441452865, + -0.02732667781812476 + ], + "observed_m": [ + 0.49863789377445683, + 0.1687002595688537, + -0.027279020932464797 + ] + }, + { + "marker_id": 58, + "link": "Board", + "error_m": [ + 0.00010114347277415808, + -0.000100406862560104, + 1.7625811855784268e-05 + ], + "error_norm_m": 0.00014360435013451362, + "predicted_m": [ + 0.050108394384752154, + -0.21809922383361957, + -0.027289442910250115 + ], + "observed_m": [ + 0.050007250911977996, + -0.21799881697105947, + -0.0273070687221059 + ] + }, + { + "marker_id": 60, + "link": "Board", + "error_m": [ + 2.5816559448055276e-05, + 0.00010821188574633434, + -2.1284107574501276e-05 + ], + "error_norm_m": 0.00011326658904441165, + "predicted_m": [ + 0.4343823697981462, + 0.28381773243543157, + -0.027300827011884146 + ], + "observed_m": [ + 0.43435655323869815, + 0.28370952054968523, + -0.027279542904309645 + ] + }, + { + "marker_id": 61, + "link": "Board", + "error_m": [ + 2.213673047626874e-05, + -0.0004748026529825533, + 0.00036777003104209935 + ], + "error_norm_m": 0.000600984517145123, + "predicted_m": [ + -0.022397209513850602, + 0.3358413457954722, + -0.02720930368016537 + ], + "observed_m": [ + -0.02241934624432687, + 0.33631614844845475, + -0.02757707371120747 + ] + }, + { + "marker_id": 62, + "link": "Board", + "error_m": [ + -5.2027625080386386e-05, + -0.00019686027029469644, + 0.0001104321380561088 + ], + "error_norm_m": 0.00023163785724196654, + "predicted_m": [ + 0.4047187294268141, + -0.1750920295828903, + -0.027350467795893892 + ], + "observed_m": [ + 0.40477075705189447, + -0.1748951693125956, + -0.02746089993395 + ] + }, + { + "marker_id": 63, + "link": "Board", + "error_m": [ + 5.97205525321165e-05, + 8.612992450571233e-05, + 0.00017768133054744256 + ], + "error_norm_m": 0.00020628999858260345, + "predicted_m": [ + 0.7774182385644122, + -0.23614497769267853, + -0.02742738136354363 + ], + "observed_m": [ + 0.77735851801188, + -0.23623110761718424, + -0.027605062694091072 + ] + }, + { + "marker_id": 64, + "link": "Board", + "error_m": [ + -7.91293138496553e-05, + -0.0001473370794227158, + 0.00015746330336172815 + ], + "error_norm_m": 0.0002297049307018039, + "predicted_m": [ + -0.0212513673084557, + -0.18821865949797503, + -0.027272529247363148 + ], + "observed_m": [ + -0.021172237994606043, + -0.18807132241855232, + -0.027429992550724876 + ] + }, + { + "marker_id": 66, + "link": "Board", + "error_m": [ + -9.67864364553872e-05, + 0.0001370872909244869, + -1.2083618247695632e-05 + ], + "error_norm_m": 0.0001682455153776874, + "predicted_m": [ + 0.20976724024838408, + -0.3632204859031543, + -0.027336695829951723 + ], + "observed_m": [ + 0.20986402668483947, + -0.3633575731940788, + -0.027324612211704027 + ] + }, + { + "marker_id": 68, + "link": "Board", + "error_m": [ + 1.5700754685266105e-05, + 0.00018632529536974363, + -3.095209368547333e-05 + ], + "error_norm_m": 0.00018953010709600582, + "predicted_m": [ + 0.5737514695000713, + 0.17064663065484797, + -0.027340450788186716 + ], + "observed_m": [ + 0.573735768745386, + 0.17046030535947823, + -0.027309498694501243 + ] + }, + { + "marker_id": 69, + "link": "Board", + "error_m": [ + -2.0034684490774328e-05, + -0.00030379998350144044, + 0.0002071791909846396 + ], + "error_norm_m": 0.0003682648988638072, + "predicted_m": [ + 0.00762789450497923, + -0.28119888730219095, + -0.027289099919642363 + ], + "observed_m": [ + 0.007647929189470004, + -0.2808950873186895, + -0.027496279110627003 + ] + }, + { + "marker_id": 72, + "link": "Board", + "error_m": [ + 0.00047090395286775166, + 0.00012575615412688257, + -0.00035486948541986474 + ], + "error_norm_m": 0.0006029075342118536, + "predicted_m": [ + 0.44101165968882705, + 0.19432768063298977, + -0.02731282457835261 + ], + "observed_m": [ + 0.4405407557359593, + 0.1942019244788629, + -0.026957955092932744 + ] + }, + { + "marker_id": 73, + "link": "Board", + "error_m": [ + 5.680208949179755e-05, + 0.0004589062252717824, + -0.0004479530621591017 + ], + "error_norm_m": 0.0006438038108473311, + "predicted_m": [ + 0.22175276464469845, + 0.3331194142637967, + -0.02725520702095333 + ], + "observed_m": [ + 0.22169596255520665, + 0.3326605080385249, + -0.026807253958794228 + ] + }, + { + "marker_id": 79, + "link": "Board", + "error_m": [ + -0.00013968223420696146, + -0.0005000676111311941, + 0.00022277023191346126 + ], + "error_norm_m": 0.0005649825824592162, + "predicted_m": [ + 0.31231885790070896, + -0.1591012986920062, + -0.02733129660411856 + ], + "observed_m": [ + 0.3124585401349159, + -0.158601231080875, + -0.02755406683603202 + ] + }, + { + "marker_id": 82, + "link": "Board", + "error_m": [ + -7.405616276753846e-05, + -8.325803470837778e-05, + 7.280887590920687e-05 + ], + "error_norm_m": 0.00013310652875992175, + "predicted_m": [ + 0.2191824801050202, + 0.29724943485632677, + -0.02725904013676476 + ], + "observed_m": [ + 0.21925653626778774, + 0.29733269289103514, + -0.027331849012673968 + ] + }, + { + "marker_id": 83, + "link": "Board", + "error_m": [ + -4.62492650498067e-05, + -0.00012746911940025862, + 0.00018718614259173594 + ], + "error_norm_m": 0.00023114069935149535, + "predicted_m": [ + 0.04418281621951103, + 0.33923081903445473, + -0.02722132479177954 + ], + "observed_m": [ + 0.044229065484560834, + 0.339358288153855, + -0.027408510934371275 + ] + }, + { + "marker_id": 84, + "link": "Board", + "error_m": [ + 0.00017232694873475785, + 0.00011817015158627209, + -5.607158385221092e-05 + ], + "error_norm_m": 0.00021634413442903855, + "predicted_m": [ + 0.4075121688285888, + 0.2584279451972179, + -0.027298863891678203 + ], + "observed_m": [ + 0.40733984187985406, + 0.25830977504563163, + -0.027242792307825992 + ] + }, + { + "marker_id": 85, + "link": "Board", + "error_m": [ + 0.00020312592435511867, + -0.00015599653047260187, + 0.0001347694972127153 + ], + "error_norm_m": 0.0002894095299805776, + "predicted_m": [ + 0.5045976355991969, + -0.3127428187672989, + -0.027385663219507896 + ], + "observed_m": [ + 0.5043945096748418, + -0.3125868222368263, + -0.02752043271672061 + ] + }, + { + "marker_id": 86, + "link": "Board", + "error_m": [ + -0.00035883263285391154, + -0.00015731092163612237, + 0.00010075824908208422 + ], + "error_norm_m": 0.00040454889596310066, + "predicted_m": [ + 0.3629124361025995, + 0.29201829779871546, + -0.02728649953201595 + ], + "observed_m": [ + 0.3632712687354534, + 0.2921756087203516, + -0.027387257781098035 + ] + }, + { + "marker_id": 92, + "link": "Board", + "error_m": [ + -0.0002934523327690064, + 0.0002629017827487645, + -0.00018794120863876995 + ], + "error_norm_m": 0.0004365243600128771, + "predicted_m": [ + 0.6451086479558872, + -0.18483393131699793, + -0.027396513301796547 + ], + "observed_m": [ + 0.6454021002886562, + -0.1850968330997467, + -0.027208572093157777 + ] + }, + { + "marker_id": 95, + "link": "Board", + "error_m": [ + 0.00019812064350874237, + 0.00014999898375817056, + -6.225838941766731e-05 + ], + "error_norm_m": 0.00025617882731733316, + "predicted_m": [ + 0.18605794803768458, + -0.27406029897278616, + -0.02732154956052728 + ], + "observed_m": [ + 0.18585982739417584, + -0.27421029795654434, + -0.027259291171109614 + ] + }, + { + "marker_id": 96, + "link": "Board", + "error_m": [ + 8.627927498106036e-05, + 9.213278406036696e-05, + -9.836286334074032e-05 + ], + "error_norm_m": 0.000160024423368937, + "predicted_m": [ + 0.3697886396708029, + -0.18648175315741503, + -0.027345316784081836 + ], + "observed_m": [ + 0.3697023603958218, + -0.1865738859414754, + -0.027246953920741095 + ] + }, + { + "marker_id": 97, + "link": "Board", + "error_m": [ + 0.00022164513432659794, + 8.413999103396019e-05, + -0.00021176258327362807 + ], + "error_norm_m": 0.0003178828327176081, + "predicted_m": [ + 0.30436726684140514, + -0.35966123434089586, + -0.0273539270887528 + ], + "observed_m": [ + 0.30414562170707854, + -0.3597453743319298, + -0.027142164505479172 + ] + }, + { + "marker_id": 101, + "link": "Board", + "error_m": [ + -5.676935748405443e-05, + 0.00011481105218846821, + -1.1951448038453188e-05 + ], + "error_norm_m": 0.00012863582224245074, + "predicted_m": [ + 0.11772249314194222, + 0.29867023752964394, + -0.02723992952335222 + ], + "observed_m": [ + 0.11777926249942627, + 0.2985554264774555, + -0.027227978075313766 + ] + }, + { + "marker_id": 102, + "link": "Board", + "error_m": [ + -0.00012606484361721293, + -0.00019410822228813074, + 0.00036249867615404524 + ], + "error_norm_m": 0.00043008794097199016, + "predicted_m": [ + 0.6497083451227117, + -0.22299396743208486, + -0.027401960206043074 + ], + "observed_m": [ + 0.6498344099663289, + -0.22279985920979672, + -0.02776445888219712 + ] + }, + { + "marker_id": 103, + "link": "Board", + "error_m": [ + 3.75396160226249e-05, + 0.00021848045899708346, + -7.526325638289658e-05 + ], + "error_norm_m": 0.00023410999871013627, + "predicted_m": [ + 0.10572863460070166, + -0.18769966408253902, + -0.027296170506814023 + ], + "observed_m": [ + 0.10569109498467903, + -0.1879181445415361, + -0.027220907250431126 + ] + }, + { + "marker_id": 105, + "link": "Board", + "error_m": [ + 0.00017913342661046716, + 0.000210656851415858, + -0.0002720035290025881 + ], + "error_norm_m": 0.0003878801533560492, + "predicted_m": [ + 0.5248580041661369, + -0.26624297938844327, + -0.02738385424630833 + ], + "observed_m": [ + 0.5246788707395265, + -0.2664536362398591, + -0.027111850717305742 + ] + }, + { + "marker_id": 114, + "link": "Arm2", + "error_m": [ + 0.00022742006601100817, + -0.013195818895620992, + -0.014381136174735493 + ], + "error_norm_m": 0.01951918117874667, + "predicted_m": [ + 0.26246348146525844, + -0.1605328532116268, + 0.22020643909252588 + ], + "observed_m": [ + 0.26223606139924743, + -0.1473370343160058, + 0.23458757526726137 + ] + }, + { + "marker_id": 115, + "link": "Arm2", + "error_m": [ + 0.024101686045126552, + -0.03962705510808118, + -0.02218409640601879 + ], + "error_norm_m": 0.05141331442445902, + "predicted_m": [ + 0.23930739058672867, + -0.20369824602548453, + 0.2130794258021653 + ], + "observed_m": [ + 0.21520570454160212, + -0.16407119091740335, + 0.23526352220818408 + ] + }, + { + "marker_id": 120, + "link": "Arm2", + "error_m": [ + 0.0003750467534565094, + 0.002301022538397951, + -0.013430758333365406 + ], + "error_norm_m": 0.013631604241568852, + "predicted_m": [ + 0.26245067935622945, + -0.14912289597444123, + 0.15114260838548105 + ], + "observed_m": [ + 0.26207563260277295, + -0.15142391851283918, + 0.16457336671884645 + ] + }, + { + "marker_id": 198, + "link": "Arm1", + "error_m": [ + -0.0011317517253608689, + -0.0013794765903897763, + -0.008659273320430802 + ], + "error_norm_m": 0.008841200827331964, + "predicted_m": [ + 0.13898592460963502, + -0.05446384554601108, + 0.08178592100688736 + ], + "observed_m": [ + 0.1401176763349959, + -0.053084368955621304, + 0.09044519432731817 + ] + }, + { + "marker_id": 205, + "link": "Board", + "error_m": [ + -3.964650851695506e-05, + 1.2098030970658646e-05, + -0.00023363467438157246 + ], + "error_norm_m": 0.00023728330970452892, + "predicted_m": [ + 0.7500245507222149, + -0.08999808053842868, + 0.00019530530139471217 + ], + "observed_m": [ + 0.7500641972307318, + -0.09001017856939934, + 0.0004289399757762846 + ] + }, + { + "marker_id": 206, + "link": "Board", + "error_m": [ + 5.497735281512206e-05, + -0.0003467456861196462, + 7.08540774461642e-05 + ], + "error_norm_m": 0.0003581555255135535, + "predicted_m": [ + 0.6500251871697533, + -0.009997289986131553, + 0.00022359151879563336 + ], + "observed_m": [ + 0.6499702098169382, + -0.009650544300011906, + 0.00015273744134946916 + ] + }, + { + "marker_id": 207, + "link": "Board", + "error_m": [ + -0.000675204086429404, + -0.0004522642832782489, + 0.000567904346721304 + ], + "error_norm_m": 0.0009914428310725258, + "predicted_m": [ + 0.7500251854242768, + -0.009998081119214583, + 0.00020492418363620245 + ], + "observed_m": [ + 0.7507003895107062, + -0.009545816835936334, + -0.0003629801630851015 + ] + }, + { + "marker_id": 208, + "link": "Board", + "error_m": [ + 8.103369664302917e-05, + 8.449754240932861e-05, + -5.784049800828736e-05 + ], + "error_norm_m": 0.00013058260938845362, + "predicted_m": [ + 0.3500245577041208, + -0.08999491600609656, + 0.0002699746420324358 + ], + "observed_m": [ + 0.34994352400747775, + -0.09007941354850589, + 0.0003278151400407232 + ] + }, + { + "marker_id": 210, + "link": "Board", + "error_m": [ + -4.0705434832904314e-05, + 0.0002875021340621245, + -0.00011130962817117374 + ], + "error_norm_m": 0.0003109730580594026, + "predicted_m": [ + 0.02002511882849735, + -0.01999230577511022, + 0.00033999337001986183 + ], + "observed_m": [ + 0.020065824263330253, + -0.020279807909172345, + 0.0004513029981910356 + ] + }, + { + "marker_id": 211, + "link": "Board", + "error_m": [ + 1.33701774804873e-05, + 9.383654401974931e-05, + -1.0346849726384035e-05 + ], + "error_norm_m": 9.534734363730566e-05, + "predicted_m": [ + 0.25002519415165914, + -0.00999412545379943, + 0.000298260859433357 + ], + "observed_m": [ + 0.25001182397417865, + -0.01008796199781918, + 0.00030860770915974104 + ] + }, + { + "marker_id": 214, + "link": "Board", + "error_m": [ + 3.487801149665293e-05, + 0.00044274628708106806, + -0.00029472423741045946 + ], + "error_norm_m": 0.0005330132517369611, + "predicted_m": [ + 0.3500251924061827, + -0.00999491658688246, + 0.0002795935242739261 + ], + "observed_m": [ + 0.34999031439468603, + -0.010437662873963529, + 0.0005743177616843856 + ] + }, + { + "marker_id": 215, + "link": "Board", + "error_m": [ + 5.814383252331079e-05, + 3.1566079447112316e-05, + -8.698037465849884e-06 + ], + "error_norm_m": 6.672914271828725e-05, + "predicted_m": [ + 0.25002455944959723, + -0.08999412487301353, + 0.0002886419771918667 + ], + "observed_m": [ + 0.24996641561707392, + -0.09002569095246064, + 0.0002973400146577166 + ] + }, + { + "marker_id": 217, + "link": "Board", + "error_m": [ + -0.00018180264930645063, + -0.0003000352885192542, + 0.00010324834312563732 + ], + "error_norm_m": 0.000365696045931407, + "predicted_m": [ + 0.6500245524676914, + -0.08999728940534565, + 0.00021397263655414307 + ], + "observed_m": [ + 0.6502063551169979, + -0.0896972541168264, + 0.00011072429342850576 + ] + }, + { + "marker_id": 219, + "link": "Arm2", + "error_m": [ + -0.01836328866173864, + -0.027353550305363933, + -0.010033790979104729 + ], + "error_norm_m": 0.03443986129755428, + "predicted_m": [ + 0.24539029427284925, + -0.14620299148693738, + 0.2600785639673745 + ], + "observed_m": [ + 0.2637535829345879, + -0.11884944118157345, + 0.2701123549464792 + ] + }, + { + "marker_id": 229, + "link": "Arm1", + "error_m": [ + -0.0010202039996825008, + -0.0009954023670544487, + -0.013511904274451314 + ], + "error_norm_m": 0.013586875991015795, + "predicted_m": [ + 0.13898373366926126, + -0.14411315224094529, + 0.07384855341320237 + ], + "observed_m": [ + 0.14000393766894376, + -0.14311774987389084, + 0.08736045768765369 + ] + }, + { + "marker_id": 232, + "link": "Ellbow", + "error_m": [ + -0.0009233554099819241, + 0.007038029109827648, + -0.01782136733300794 + ], + "error_norm_m": 0.01918300217854147, + "predicted_m": [ + 0.22897177567894955, + -0.16141187291551382, + 0.01051490208330316 + ], + "observed_m": [ + 0.22989513108893148, + -0.16844990202534146, + 0.0283362694163111 + ] + }, + { + "marker_id": 243, + "link": "Arm1", + "error_m": [ + -0.0011907512375798623, + 0.0011623389217610691, + -0.014836322956087 + ], + "error_norm_m": 0.014929346909230583, + "predicted_m": [ + 0.13897639794856836, + -0.17589001734181348, + 0.035898180680534894 + ], + "observed_m": [ + 0.14016714918614823, + -0.17705235626357455, + 0.050734503636621894 + ] + }, + { + "marker_id": 244, + "link": "Ellbow", + "error_m": [ + -0.001577158916719279, + 0.0010646668613621957, + -0.013087150755480219 + ], + "error_norm_m": 0.013224766942027236, + "predicted_m": [ + 0.26397724779885823, + -0.14102738698791506, + 0.038961600575796486 + ], + "observed_m": [ + 0.2655544067155775, + -0.14209205384927726, + 0.052048751331276705 + ] + }, + { + "marker_id": 245, + "link": "Ellbow", + "error_m": [ + -0.0010107201074224248, + 0.001474929358728616, + -0.020455512846527954 + ], + "error_norm_m": 0.0205335086520365, + "predicted_m": [ + 0.22897591024895392, + -0.17555902603705503, + 0.03326315567472333 + ], + "observed_m": [ + 0.22998663035637634, + -0.17703395539578365, + 0.05371866852125128 + ] + }, + { + "marker_id": 248, + "link": "Ellbow", + "error_m": [ + -0.0011057637084256888, + 0.0015552470868412938, + -0.02046147579394994 + ], + "error_norm_m": 0.02055026760279289, + "predicted_m": [ + 0.19147591090357724, + -0.1755587293621489, + 0.03327015592540811 + ], + "observed_m": [ + 0.19258167461200293, + -0.17711397644899018, + 0.05373163171935805 + ] + } + ], + "stage_idx": 2, + "num_active_links": 5 + } + ], + "markers": [ + { + "marker_id": 41, + "link": "FingerA", + "observed_position_m": [ + 0.23584374215104642, + -0.1128637439184499, + 0.3458290400120677 + ], + "predicted_position_m": [ + 0.20879974433705523, + -0.17113723611353793, + 0.32509044826763167 + ], + "error_m": [ + -0.027043997813991194, + -0.058273492195088025, + -0.02073859174443604 + ], + "error_norm_m": 0.0675075321569122 + }, + { + "marker_id": 44, + "link": "FingerB", + "observed_position_m": [ + 0.23408985021029313, + -0.16868760189173954, + 0.32755212243754706 + ], + "predicted_position_m": [ + 0.24925980293157143, + -0.20454383316969688, + 0.3195638822775239 + ], + "error_m": [ + 0.015169952721278301, + -0.03585623127795734, + -0.007988240160023141 + ], + "error_norm_m": 0.03974429226792687 + }, + { + "marker_id": 45, + "link": "FingerB", + "observed_position_m": [ + 0.21603169851187431, + -0.16584169538942475, + 0.37116193876962195 + ], + "predicted_position_m": [ + 0.22066307007166003, + -0.2096112152136987, + 0.3570443906645345 + ], + "error_m": [ + 0.004631371559785713, + -0.043769519824273934, + -0.014117548105087474 + ], + "error_norm_m": 0.046222566270943455 + }, + { + "marker_id": 46, + "link": "Board", + "observed_position_m": [ + 0.5364914417597766, + 0.18524842393798166, + -0.02719917166361664 + ], + "predicted_position_m": [ + 0.5367315875661282, + 0.18544692342486993, + -0.02733176064749602 + ], + "error_m": [ + 0.00024014580635156602, + 0.00019849948688827057, + -0.0001325889838793802 + ], + "error_norm_m": 0.00033860285475659696 + }, + { + "marker_id": 47, + "link": "Board", + "observed_position_m": [ + 0.34438347500596617, + -0.28665288090640456, + -0.0272045519654204 + ], + "predicted_position_m": [ + 0.34424784634233146, + -0.2865315503756803, + -0.02735257876128538 + ], + "error_m": [ + -0.0001356286636347015, + 0.00012133053072427291, + -0.00014802679586498058 + ], + "error_norm_m": 0.00023458082696422862 + }, + { + "marker_id": 51, + "link": "Board", + "observed_position_m": [ + 0.167755684651821, + -0.17192015577684164, + -0.02744230154818697 + ], + "predicted_position_m": [ + 0.1678187575218507, + -0.1720701554105413, + -0.027305881766096583 + ], + "error_m": [ + 6.307287002968454e-05, + -0.00014999963369966007, + 0.00013641978209038771 + ], + "error_norm_m": 0.0002123403729614379 + }, + { + "marker_id": 52, + "link": "Board", + "observed_position_m": [ + 0.0946420139130165, + 0.20886768469899908, + -0.027302011546828587 + ], + "predicted_position_m": [ + 0.09470177950393126, + 0.20867042030186375, + -0.027246453545320196 + ], + "error_m": [ + 5.976559091475098e-05, + -0.00019726439713532717, + 5.5558001508391325e-05 + ], + "error_norm_m": 0.00021347566551286321 + }, + { + "marker_id": 53, + "link": "Board", + "observed_position_m": [ + 0.48626955447328274, + 0.2120888892465906, + -0.027347170347671368 + ], + "predicted_position_m": [ + 0.4862718010720863, + 0.21224732243606034, + -0.02731911878462367 + ], + "error_m": [ + 2.2465988035458295e-06, + 0.00015843318946973106, + 2.8051563047696432e-05 + ], + "error_norm_m": 0.00016091306013234192 + }, + { + "marker_id": 54, + "link": "Board", + "observed_position_m": [ + 0.3423822984366628, + -0.3305978099451982, + -0.027233885013587065 + ], + "predicted_position_m": [ + 0.34228749689371984, + -0.3305815345496766, + -0.027357509278550476 + ], + "error_m": [ + -9.480154294294607e-05, + 1.627539552162549e-05, + -0.00012362426496341158 + ], + "error_norm_m": 0.00015663709628147604 + }, + { + "marker_id": 55, + "link": "Board", + "observed_position_m": [ + 0.28374875414143547, + -0.2626813395141448, + -0.02726863079346355 + ], + "predicted_position_m": [ + 0.28373803749178683, + -0.26257107183499706, + -0.027338402301549082 + ], + "error_m": [ + -1.0716649648634391e-05, + 0.00011026767914773528, + -6.97715080855317e-05 + ], + "error_norm_m": 0.0001309269681343339 + }, + { + "marker_id": 56, + "link": "Board", + "observed_position_m": [ + 0.49863789377445683, + 0.1687002595688537, + -0.027279020932464797 + ], + "predicted_position_m": [ + 0.49870145518051306, + 0.16867722441452865, + -0.02732667781812476 + ], + "error_m": [ + 6.356140605623395e-05, + -2.3035154325057317e-05, + -4.765688565996212e-05 + ], + "error_norm_m": 8.271547270874637e-05 + }, + { + "marker_id": 58, + "link": "Board", + "observed_position_m": [ + 0.050007250911977996, + -0.21799881697105947, + -0.0273070687221059 + ], + "predicted_position_m": [ + 0.050108394384752154, + -0.21809922383361957, + -0.027289442910250115 + ], + "error_m": [ + 0.00010114347277415808, + -0.000100406862560104, + 1.7625811855784268e-05 + ], + "error_norm_m": 0.00014360435013451362 + }, + { + "marker_id": 60, + "link": "Board", + "observed_position_m": [ + 0.43435655323869815, + 0.28370952054968523, + -0.027279542904309645 + ], + "predicted_position_m": [ + 0.4343823697981462, + 0.28381773243543157, + -0.027300827011884146 + ], + "error_m": [ + 2.5816559448055276e-05, + 0.00010821188574633434, + -2.1284107574501276e-05 + ], + "error_norm_m": 0.00011326658904441165 + }, + { + "marker_id": 61, + "link": "Board", + "observed_position_m": [ + -0.02241934624432687, + 0.33631614844845475, + -0.02757707371120747 + ], + "predicted_position_m": [ + -0.022397209513850602, + 0.3358413457954722, + -0.02720930368016537 + ], + "error_m": [ + 2.213673047626874e-05, + -0.0004748026529825533, + 0.00036777003104209935 + ], + "error_norm_m": 0.000600984517145123 + }, + { + "marker_id": 62, + "link": "Board", + "observed_position_m": [ + 0.40477075705189447, + -0.1748951693125956, + -0.02746089993395 + ], + "predicted_position_m": [ + 0.4047187294268141, + -0.1750920295828903, + -0.027350467795893892 + ], + "error_m": [ + -5.2027625080386386e-05, + -0.00019686027029469644, + 0.0001104321380561088 + ], + "error_norm_m": 0.00023163785724196654 + }, + { + "marker_id": 63, + "link": "Board", + "observed_position_m": [ + 0.77735851801188, + -0.23623110761718424, + -0.027605062694091072 + ], + "predicted_position_m": [ + 0.7774182385644122, + -0.23614497769267853, + -0.02742738136354363 + ], + "error_m": [ + 5.97205525321165e-05, + 8.612992450571233e-05, + 0.00017768133054744256 + ], + "error_norm_m": 0.00020628999858260345 + }, + { + "marker_id": 64, + "link": "Board", + "observed_position_m": [ + -0.021172237994606043, + -0.18807132241855232, + -0.027429992550724876 + ], + "predicted_position_m": [ + -0.0212513673084557, + -0.18821865949797503, + -0.027272529247363148 + ], + "error_m": [ + -7.91293138496553e-05, + -0.0001473370794227158, + 0.00015746330336172815 + ], + "error_norm_m": 0.0002297049307018039 + }, + { + "marker_id": 66, + "link": "Board", + "observed_position_m": [ + 0.20986402668483947, + -0.3633575731940788, + -0.027324612211704027 + ], + "predicted_position_m": [ + 0.20976724024838408, + -0.3632204859031543, + -0.027336695829951723 + ], + "error_m": [ + -9.67864364553872e-05, + 0.0001370872909244869, + -1.2083618247695632e-05 + ], + "error_norm_m": 0.0001682455153776874 + }, + { + "marker_id": 68, + "link": "Board", + "observed_position_m": [ + 0.573735768745386, + 0.17046030535947823, + -0.027309498694501243 + ], + "predicted_position_m": [ + 0.5737514695000713, + 0.17064663065484797, + -0.027340450788186716 + ], + "error_m": [ + 1.5700754685266105e-05, + 0.00018632529536974363, + -3.095209368547333e-05 + ], + "error_norm_m": 0.00018953010709600582 + }, + { + "marker_id": 69, + "link": "Board", + "observed_position_m": [ + 0.007647929189470004, + -0.2808950873186895, + -0.027496279110627003 + ], + "predicted_position_m": [ + 0.00762789450497923, + -0.28119888730219095, + -0.027289099919642363 + ], + "error_m": [ + -2.0034684490774328e-05, + -0.00030379998350144044, + 0.0002071791909846396 + ], + "error_norm_m": 0.0003682648988638072 + }, + { + "marker_id": 72, + "link": "Board", + "observed_position_m": [ + 0.4405407557359593, + 0.1942019244788629, + -0.026957955092932744 + ], + "predicted_position_m": [ + 0.44101165968882705, + 0.19432768063298977, + -0.02731282457835261 + ], + "error_m": [ + 0.00047090395286775166, + 0.00012575615412688257, + -0.00035486948541986474 + ], + "error_norm_m": 0.0006029075342118536 + }, + { + "marker_id": 73, + "link": "Board", + "observed_position_m": [ + 0.22169596255520665, + 0.3326605080385249, + -0.026807253958794228 + ], + "predicted_position_m": [ + 0.22175276464469845, + 0.3331194142637967, + -0.02725520702095333 + ], + "error_m": [ + 5.680208949179755e-05, + 0.0004589062252717824, + -0.0004479530621591017 + ], + "error_norm_m": 0.0006438038108473311 + }, + { + "marker_id": 79, + "link": "Board", + "observed_position_m": [ + 0.3124585401349159, + -0.158601231080875, + -0.02755406683603202 + ], + "predicted_position_m": [ + 0.31231885790070896, + -0.1591012986920062, + -0.02733129660411856 + ], + "error_m": [ + -0.00013968223420696146, + -0.0005000676111311941, + 0.00022277023191346126 + ], + "error_norm_m": 0.0005649825824592162 + }, + { + "marker_id": 82, + "link": "Board", + "observed_position_m": [ + 0.21925653626778774, + 0.29733269289103514, + -0.027331849012673968 + ], + "predicted_position_m": [ + 0.2191824801050202, + 0.29724943485632677, + -0.02725904013676476 + ], + "error_m": [ + -7.405616276753846e-05, + -8.325803470837778e-05, + 7.280887590920687e-05 + ], + "error_norm_m": 0.00013310652875992175 + }, + { + "marker_id": 83, + "link": "Board", + "observed_position_m": [ + 0.044229065484560834, + 0.339358288153855, + -0.027408510934371275 + ], + "predicted_position_m": [ + 0.04418281621951103, + 0.33923081903445473, + -0.02722132479177954 + ], + "error_m": [ + -4.62492650498067e-05, + -0.00012746911940025862, + 0.00018718614259173594 + ], + "error_norm_m": 0.00023114069935149535 + }, + { + "marker_id": 84, + "link": "Board", + "observed_position_m": [ + 0.40733984187985406, + 0.25830977504563163, + -0.027242792307825992 + ], + "predicted_position_m": [ + 0.4075121688285888, + 0.2584279451972179, + -0.027298863891678203 + ], + "error_m": [ + 0.00017232694873475785, + 0.00011817015158627209, + -5.607158385221092e-05 + ], + "error_norm_m": 0.00021634413442903855 + }, + { + "marker_id": 85, + "link": "Board", + "observed_position_m": [ + 0.5043945096748418, + -0.3125868222368263, + -0.02752043271672061 + ], + "predicted_position_m": [ + 0.5045976355991969, + -0.3127428187672989, + -0.027385663219507896 + ], + "error_m": [ + 0.00020312592435511867, + -0.00015599653047260187, + 0.0001347694972127153 + ], + "error_norm_m": 0.0002894095299805776 + }, + { + "marker_id": 86, + "link": "Board", + "observed_position_m": [ + 0.3632712687354534, + 0.2921756087203516, + -0.027387257781098035 + ], + "predicted_position_m": [ + 0.3629124361025995, + 0.29201829779871546, + -0.02728649953201595 + ], + "error_m": [ + -0.00035883263285391154, + -0.00015731092163612237, + 0.00010075824908208422 + ], + "error_norm_m": 0.00040454889596310066 + }, + { + "marker_id": 92, + "link": "Board", + "observed_position_m": [ + 0.6454021002886562, + -0.1850968330997467, + -0.027208572093157777 + ], + "predicted_position_m": [ + 0.6451086479558872, + -0.18483393131699793, + -0.027396513301796547 + ], + "error_m": [ + -0.0002934523327690064, + 0.0002629017827487645, + -0.00018794120863876995 + ], + "error_norm_m": 0.0004365243600128771 + }, + { + "marker_id": 95, + "link": "Board", + "observed_position_m": [ + 0.18585982739417584, + -0.27421029795654434, + -0.027259291171109614 + ], + "predicted_position_m": [ + 0.18605794803768458, + -0.27406029897278616, + -0.02732154956052728 + ], + "error_m": [ + 0.00019812064350874237, + 0.00014999898375817056, + -6.225838941766731e-05 + ], + "error_norm_m": 0.00025617882731733316 + }, + { + "marker_id": 96, + "link": "Board", + "observed_position_m": [ + 0.3697023603958218, + -0.1865738859414754, + -0.027246953920741095 + ], + "predicted_position_m": [ + 0.3697886396708029, + -0.18648175315741503, + -0.027345316784081836 + ], + "error_m": [ + 8.627927498106036e-05, + 9.213278406036696e-05, + -9.836286334074032e-05 + ], + "error_norm_m": 0.000160024423368937 + }, + { + "marker_id": 97, + "link": "Board", + "observed_position_m": [ + 0.30414562170707854, + -0.3597453743319298, + -0.027142164505479172 + ], + "predicted_position_m": [ + 0.30436726684140514, + -0.35966123434089586, + -0.0273539270887528 + ], + "error_m": [ + 0.00022164513432659794, + 8.413999103396019e-05, + -0.00021176258327362807 + ], + "error_norm_m": 0.0003178828327176081 + }, + { + "marker_id": 101, + "link": "Board", + "observed_position_m": [ + 0.11777926249942627, + 0.2985554264774555, + -0.027227978075313766 + ], + "predicted_position_m": [ + 0.11772249314194222, + 0.29867023752964394, + -0.02723992952335222 + ], + "error_m": [ + -5.676935748405443e-05, + 0.00011481105218846821, + -1.1951448038453188e-05 + ], + "error_norm_m": 0.00012863582224245074 + }, + { + "marker_id": 102, + "link": "Board", + "observed_position_m": [ + 0.6498344099663289, + -0.22279985920979672, + -0.02776445888219712 + ], + "predicted_position_m": [ + 0.6497083451227117, + -0.22299396743208486, + -0.027401960206043074 + ], + "error_m": [ + -0.00012606484361721293, + -0.00019410822228813074, + 0.00036249867615404524 + ], + "error_norm_m": 0.00043008794097199016 + }, + { + "marker_id": 103, + "link": "Board", + "observed_position_m": [ + 0.10569109498467903, + -0.1879181445415361, + -0.027220907250431126 + ], + "predicted_position_m": [ + 0.10572863460070166, + -0.18769966408253902, + -0.027296170506814023 + ], + "error_m": [ + 3.75396160226249e-05, + 0.00021848045899708346, + -7.526325638289658e-05 + ], + "error_norm_m": 0.00023410999871013627 + }, + { + "marker_id": 105, + "link": "Board", + "observed_position_m": [ + 0.5246788707395265, + -0.2664536362398591, + -0.027111850717305742 + ], + "predicted_position_m": [ + 0.5248580041661369, + -0.26624297938844327, + -0.02738385424630833 + ], + "error_m": [ + 0.00017913342661046716, + 0.000210656851415858, + -0.0002720035290025881 + ], + "error_norm_m": 0.0003878801533560492 + }, + { + "marker_id": 114, + "link": "Arm2", + "observed_position_m": [ + 0.26223606139924743, + -0.1473370343160058, + 0.23458757526726137 + ], + "predicted_position_m": [ + 0.26246348146525844, + -0.1605328532116268, + 0.22020643909252588 + ], + "error_m": [ + 0.00022742006601100817, + -0.013195818895620992, + -0.014381136174735493 + ], + "error_norm_m": 0.01951918117874667 + }, + { + "marker_id": 115, + "link": "Arm2", + "observed_position_m": [ + 0.21520570454160212, + -0.16407119091740335, + 0.23526352220818408 + ], + "predicted_position_m": [ + 0.23930739058672867, + -0.20369824602548453, + 0.2130794258021653 + ], + "error_m": [ + 0.024101686045126552, + -0.03962705510808118, + -0.02218409640601879 + ], + "error_norm_m": 0.05141331442445902 + }, + { + "marker_id": 120, + "link": "Arm2", + "observed_position_m": [ + 0.26207563260277295, + -0.15142391851283918, + 0.16457336671884645 + ], + "predicted_position_m": [ + 0.26245067935622945, + -0.14912289597444123, + 0.15114260838548105 + ], + "error_m": [ + 0.0003750467534565094, + 0.002301022538397951, + -0.013430758333365406 + ], + "error_norm_m": 0.013631604241568852 + }, + { + "marker_id": 198, + "link": "Arm1", + "observed_position_m": [ + 0.1401176763349959, + -0.053084368955621304, + 0.09044519432731817 + ], + "predicted_position_m": [ + 0.13898592460963502, + -0.05446384554601108, + 0.08178592100688736 + ], + "error_m": [ + -0.0011317517253608689, + -0.0013794765903897763, + -0.008659273320430802 + ], + "error_norm_m": 0.008841200827331964 + }, + { + "marker_id": 205, + "link": "Board", + "observed_position_m": [ + 0.7500641972307318, + -0.09001017856939934, + 0.0004289399757762846 + ], + "predicted_position_m": [ + 0.7500245507222149, + -0.08999808053842868, + 0.00019530530139471217 + ], + "error_m": [ + -3.964650851695506e-05, + 1.2098030970658646e-05, + -0.00023363467438157246 + ], + "error_norm_m": 0.00023728330970452892 + }, + { + "marker_id": 206, + "link": "Board", + "observed_position_m": [ + 0.6499702098169382, + -0.009650544300011906, + 0.00015273744134946916 + ], + "predicted_position_m": [ + 0.6500251871697533, + -0.009997289986131553, + 0.00022359151879563336 + ], + "error_m": [ + 5.497735281512206e-05, + -0.0003467456861196462, + 7.08540774461642e-05 + ], + "error_norm_m": 0.0003581555255135535 + }, + { + "marker_id": 207, + "link": "Board", + "observed_position_m": [ + 0.7507003895107062, + -0.009545816835936334, + -0.0003629801630851015 + ], + "predicted_position_m": [ + 0.7500251854242768, + -0.009998081119214583, + 0.00020492418363620245 + ], + "error_m": [ + -0.000675204086429404, + -0.0004522642832782489, + 0.000567904346721304 + ], + "error_norm_m": 0.0009914428310725258 + }, + { + "marker_id": 208, + "link": "Board", + "observed_position_m": [ + 0.34994352400747775, + -0.09007941354850589, + 0.0003278151400407232 + ], + "predicted_position_m": [ + 0.3500245577041208, + -0.08999491600609656, + 0.0002699746420324358 + ], + "error_m": [ + 8.103369664302917e-05, + 8.449754240932861e-05, + -5.784049800828736e-05 + ], + "error_norm_m": 0.00013058260938845362 + }, + { + "marker_id": 210, + "link": "Board", + "observed_position_m": [ + 0.020065824263330253, + -0.020279807909172345, + 0.0004513029981910356 + ], + "predicted_position_m": [ + 0.02002511882849735, + -0.01999230577511022, + 0.00033999337001986183 + ], + "error_m": [ + -4.0705434832904314e-05, + 0.0002875021340621245, + -0.00011130962817117374 + ], + "error_norm_m": 0.0003109730580594026 + }, + { + "marker_id": 211, + "link": "Board", + "observed_position_m": [ + 0.25001182397417865, + -0.01008796199781918, + 0.00030860770915974104 + ], + "predicted_position_m": [ + 0.25002519415165914, + -0.00999412545379943, + 0.000298260859433357 + ], + "error_m": [ + 1.33701774804873e-05, + 9.383654401974931e-05, + -1.0346849726384035e-05 + ], + "error_norm_m": 9.534734363730566e-05 + }, + { + "marker_id": 214, + "link": "Board", + "observed_position_m": [ + 0.34999031439468603, + -0.010437662873963529, + 0.0005743177616843856 + ], + "predicted_position_m": [ + 0.3500251924061827, + -0.00999491658688246, + 0.0002795935242739261 + ], + "error_m": [ + 3.487801149665293e-05, + 0.00044274628708106806, + -0.00029472423741045946 + ], + "error_norm_m": 0.0005330132517369611 + }, + { + "marker_id": 215, + "link": "Board", + "observed_position_m": [ + 0.24996641561707392, + -0.09002569095246064, + 0.0002973400146577166 + ], + "predicted_position_m": [ + 0.25002455944959723, + -0.08999412487301353, + 0.0002886419771918667 + ], + "error_m": [ + 5.814383252331079e-05, + 3.1566079447112316e-05, + -8.698037465849884e-06 + ], + "error_norm_m": 6.672914271828725e-05 + }, + { + "marker_id": 217, + "link": "Board", + "observed_position_m": [ + 0.6502063551169979, + -0.0896972541168264, + 0.00011072429342850576 + ], + "predicted_position_m": [ + 0.6500245524676914, + -0.08999728940534565, + 0.00021397263655414307 + ], + "error_m": [ + -0.00018180264930645063, + -0.0003000352885192542, + 0.00010324834312563732 + ], + "error_norm_m": 0.000365696045931407 + }, + { + "marker_id": 219, + "link": "Arm2", + "observed_position_m": [ + 0.2637535829345879, + -0.11884944118157345, + 0.2701123549464792 + ], + "predicted_position_m": [ + 0.24539029427284925, + -0.14620299148693738, + 0.2600785639673745 + ], + "error_m": [ + -0.01836328866173864, + -0.027353550305363933, + -0.010033790979104729 + ], + "error_norm_m": 0.03443986129755428 + }, + { + "marker_id": 229, + "link": "Arm1", + "observed_position_m": [ + 0.14000393766894376, + -0.14311774987389084, + 0.08736045768765369 + ], + "predicted_position_m": [ + 0.13898373366926126, + -0.14411315224094529, + 0.07384855341320237 + ], + "error_m": [ + -0.0010202039996825008, + -0.0009954023670544487, + -0.013511904274451314 + ], + "error_norm_m": 0.013586875991015795 + }, + { + "marker_id": 232, + "link": "Ellbow", + "observed_position_m": [ + 0.22989513108893148, + -0.16844990202534146, + 0.0283362694163111 + ], + "predicted_position_m": [ + 0.22897177567894955, + -0.16141187291551382, + 0.01051490208330316 + ], + "error_m": [ + -0.0009233554099819241, + 0.007038029109827648, + -0.01782136733300794 + ], + "error_norm_m": 0.01918300217854147 + }, + { + "marker_id": 243, + "link": "Arm1", + "observed_position_m": [ + 0.14016714918614823, + -0.17705235626357455, + 0.050734503636621894 + ], + "predicted_position_m": [ + 0.13897639794856836, + -0.17589001734181348, + 0.035898180680534894 + ], + "error_m": [ + -0.0011907512375798623, + 0.0011623389217610691, + -0.014836322956087 + ], + "error_norm_m": 0.014929346909230583 + }, + { + "marker_id": 244, + "link": "Ellbow", + "observed_position_m": [ + 0.2655544067155775, + -0.14209205384927726, + 0.052048751331276705 + ], + "predicted_position_m": [ + 0.26397724779885823, + -0.14102738698791506, + 0.038961600575796486 + ], + "error_m": [ + -0.001577158916719279, + 0.0010646668613621957, + -0.013087150755480219 + ], + "error_norm_m": 0.013224766942027236 + }, + { + "marker_id": 245, + "link": "Ellbow", + "observed_position_m": [ + 0.22998663035637634, + -0.17703395539578365, + 0.05371866852125128 + ], + "predicted_position_m": [ + 0.22897591024895392, + -0.17555902603705503, + 0.03326315567472333 + ], + "error_m": [ + -0.0010107201074224248, + 0.001474929358728616, + -0.020455512846527954 + ], + "error_norm_m": 0.0205335086520365 + }, + { + "marker_id": 248, + "link": "Ellbow", + "observed_position_m": [ + 0.19258167461200293, + -0.17711397644899018, + 0.05373163171935805 + ], + "predicted_position_m": [ + 0.19147591090357724, + -0.1755587293621489, + 0.03327015592540811 + ], + "error_m": [ + -0.0011057637084256888, + 0.0015552470868412938, + -0.02046147579394994 + ], + "error_norm_m": 0.02055026760279289 + } + ] +} \ No newline at end of file diff --git a/data/robot/robot.json b/data/robot/robot.json index a6d5358..48cea29 100644 --- a/data/robot/robot.json +++ b/data/robot/robot.json @@ -14,8 +14,8 @@ "MarkerSize": 0.025 }, "renderingInfo": { - "width": 1280, - "height": 720, + "width": 4896, + "height": 3264, "cameraPosition__1": [ -10, -800, @@ -42,9 +42,9 @@ 500 ], "cameraPosition": [ - 500, -300, - 1400 + -800, + 800 ], "cameraPosition_c": [ 600, @@ -52,8 +52,8 @@ 600 ], "cameraTarget": [ - 200, - -200, + 210, + -100, 180 ], "cameraUpVector": [ @@ -91,7 +91,7 @@ "lensDirt": true, "lensDirtStrength": 0.08, "dofEnabled": true, - "dofFStop": 11.0, + "dofFStop": 5.6, "arucoDust": false, "arucoDustStrength": 5e-05, "localizedBlur": false, @@ -204,13 +204,13 @@ "e": 1 }, "defaultPosition": { - "x": 30, + "x": 60, "y": -2, "z": 95, - "a": 20, - "b": 23, + "a": 200, + "b": 60, "c": 9, - "e": 9 + "e": 8 }, "recognized": { "x": null, diff --git a/data/simulation/Scene5/pose.json b/data/simulation/Scene5/pose.json index f05cc2c..283611e 100644 --- a/data/simulation/Scene5/pose.json +++ b/data/simulation/Scene5/pose.json @@ -9,6 +9,11 @@ "c": 91, "e": 10 }, + "rendering": { + "width": 1280, + "height": 720, + "dofFStop": 11.0 + }, "camera_positions": { "a": [ -300, @@ -45,5 +50,42 @@ 200, 1400 ] + }, + "camera_targets": { + "a": [ + 210, + -100, + 180 + ], + "b": [ + 310, + -80, + 180 + ], + "c": [ + 210, + -100, + 150 + ], + "d": [ + 210, + -100, + 150 + ], + "e": [ + 210, + -100, + 50 + ], + "f": [ + 200, + -200, + 180 + ], + "g": [ + 200, + -200, + 180 + ] } } \ No newline at end of file diff --git a/data/simulation/Scene5/render_a.json b/data/simulation/Scene5/render_a.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_a.json +++ b/data/simulation/Scene5/render_a.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_a.npz b/data/simulation/Scene5/render_a.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_a.npz and b/data/simulation/Scene5/render_a.npz differ diff --git a/data/simulation/Scene5/render_a.png b/data/simulation/Scene5/render_a.png index a6a5258..306aba5 100644 Binary files a/data/simulation/Scene5/render_a.png and b/data/simulation/Scene5/render_a.png differ diff --git a/data/simulation/Scene5/render_b.json b/data/simulation/Scene5/render_b.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_b.json +++ b/data/simulation/Scene5/render_b.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_b.npz b/data/simulation/Scene5/render_b.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_b.npz and b/data/simulation/Scene5/render_b.npz differ diff --git a/data/simulation/Scene5/render_b.png b/data/simulation/Scene5/render_b.png index 849dd44..1ade59b 100644 Binary files a/data/simulation/Scene5/render_b.png and b/data/simulation/Scene5/render_b.png differ diff --git a/data/simulation/Scene5/render_c.json b/data/simulation/Scene5/render_c.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_c.json +++ b/data/simulation/Scene5/render_c.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_c.npz b/data/simulation/Scene5/render_c.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_c.npz and b/data/simulation/Scene5/render_c.npz differ diff --git a/data/simulation/Scene5/render_c.png b/data/simulation/Scene5/render_c.png index 98c952a..ae571d9 100644 Binary files a/data/simulation/Scene5/render_c.png and b/data/simulation/Scene5/render_c.png differ diff --git a/data/simulation/Scene5/render_d.json b/data/simulation/Scene5/render_d.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_d.json +++ b/data/simulation/Scene5/render_d.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_d.npz b/data/simulation/Scene5/render_d.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_d.npz and b/data/simulation/Scene5/render_d.npz differ diff --git a/data/simulation/Scene5/render_d.png b/data/simulation/Scene5/render_d.png index 432a7d9..62a0daa 100644 Binary files a/data/simulation/Scene5/render_d.png and b/data/simulation/Scene5/render_d.png differ diff --git a/data/simulation/Scene5/render_e.json b/data/simulation/Scene5/render_e.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_e.json +++ b/data/simulation/Scene5/render_e.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_e.npz b/data/simulation/Scene5/render_e.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_e.npz and b/data/simulation/Scene5/render_e.npz differ diff --git a/data/simulation/Scene5/render_e.png b/data/simulation/Scene5/render_e.png index e911335..585ca27 100644 Binary files a/data/simulation/Scene5/render_e.png and b/data/simulation/Scene5/render_e.png differ diff --git a/data/simulation/Scene5/render_f.json b/data/simulation/Scene5/render_f.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_f.json +++ b/data/simulation/Scene5/render_f.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_f.npz b/data/simulation/Scene5/render_f.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_f.npz and b/data/simulation/Scene5/render_f.npz differ diff --git a/data/simulation/Scene5/render_f.png b/data/simulation/Scene5/render_f.png index fb730dc..f83c47c 100644 Binary files a/data/simulation/Scene5/render_f.png and b/data/simulation/Scene5/render_f.png differ diff --git a/data/simulation/Scene5/render_g.json b/data/simulation/Scene5/render_g.json index f7ac0e7..13f7433 100644 --- a/data/simulation/Scene5/render_g.json +++ b/data/simulation/Scene5/render_g.json @@ -2001,6 +2001,84 @@ 0.8290374279022217 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.3425000309944153, + 0.11041221022605896, + 0.28096017241477966 + ], + "position_mm": [ + 342.5000309944153, + 110.41221022605896, + 280.96017241477966 + ], + "rotation_quaternion": [ + 0.2067381590604782, + -0.676209568977356, + -0.676209568977356, + -0.20673811435699463 + ], + "normal": [ + -5.960463766996327e-08, + 0.5591931939125061, + -0.8290373086929321 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.12541037797927856, + 0.3036169409751892 + ], + "position_mm": [ + 380.0000250339508, + 125.41037797927856, + 303.6169409751892 + ], + "rotation_quaternion": [ + 0.6360782980918884, + -0.7716245055198669, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.9816272258758545, + -0.19080877304077148 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.3800000250339508, + 0.09733490645885468, + 0.3452405333518982 + ], + "position_mm": [ + 380.0000250339508, + 97.33490645885468, + 345.2405333518982 + ], + "rotation_quaternion": [ + 0.9953961968421936, + -0.09584558010101318, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + 0.19080865383148193, + 0.9816272258758545 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene5/render_g.npz b/data/simulation/Scene5/render_g.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene5/render_g.npz and b/data/simulation/Scene5/render_g.npz differ diff --git a/data/simulation/Scene5/render_g.png b/data/simulation/Scene5/render_g.png index b99e926..e6c1656 100644 Binary files a/data/simulation/Scene5/render_g.png and b/data/simulation/Scene5/render_g.png differ diff --git a/data/simulation/Scene6/pose.json b/data/simulation/Scene6/pose.json index 449bf42..c25c898 100644 --- a/data/simulation/Scene6/pose.json +++ b/data/simulation/Scene6/pose.json @@ -9,6 +9,11 @@ "c": 9, "e": 3 }, + "rendering": { + "width": 1280, + "height": 720, + "dofFStop": 11.0 + }, "camera_positions": { "a": [ -300, @@ -45,5 +50,42 @@ 200, 1400 ] + }, + "camera_targets": { + "a": [ + 210, + -100, + 180 + ], + "b": [ + 310, + -80, + 180 + ], + "c": [ + 210, + -100, + 150 + ], + "d": [ + 210, + -100, + 150 + ], + "e": [ + 210, + -100, + 50 + ], + "f": [ + 200, + -200, + 180 + ], + "g": [ + 200, + -200, + 180 + ] } } \ No newline at end of file diff --git a/data/simulation/Scene6/render_a.json b/data/simulation/Scene6/render_a.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_a.json +++ b/data/simulation/Scene6/render_a.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_a.npz b/data/simulation/Scene6/render_a.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_a.npz and b/data/simulation/Scene6/render_a.npz differ diff --git a/data/simulation/Scene6/render_a.png b/data/simulation/Scene6/render_a.png index 2ea3955..20e6f9e 100644 Binary files a/data/simulation/Scene6/render_a.png and b/data/simulation/Scene6/render_a.png differ diff --git a/data/simulation/Scene6/render_b.json b/data/simulation/Scene6/render_b.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_b.json +++ b/data/simulation/Scene6/render_b.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_b.npz b/data/simulation/Scene6/render_b.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_b.npz and b/data/simulation/Scene6/render_b.npz differ diff --git a/data/simulation/Scene6/render_b.png b/data/simulation/Scene6/render_b.png index cba60bb..6f7c27c 100644 Binary files a/data/simulation/Scene6/render_b.png and b/data/simulation/Scene6/render_b.png differ diff --git a/data/simulation/Scene6/render_c.json b/data/simulation/Scene6/render_c.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_c.json +++ b/data/simulation/Scene6/render_c.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_c.npz b/data/simulation/Scene6/render_c.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_c.npz and b/data/simulation/Scene6/render_c.npz differ diff --git a/data/simulation/Scene6/render_c.png b/data/simulation/Scene6/render_c.png index 5d6462f..afb65de 100644 Binary files a/data/simulation/Scene6/render_c.png and b/data/simulation/Scene6/render_c.png differ diff --git a/data/simulation/Scene6/render_d.json b/data/simulation/Scene6/render_d.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_d.json +++ b/data/simulation/Scene6/render_d.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_d.npz b/data/simulation/Scene6/render_d.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_d.npz and b/data/simulation/Scene6/render_d.npz differ diff --git a/data/simulation/Scene6/render_d.png b/data/simulation/Scene6/render_d.png index 73134d2..25c37ad 100644 Binary files a/data/simulation/Scene6/render_d.png and b/data/simulation/Scene6/render_d.png differ diff --git a/data/simulation/Scene6/render_e.json b/data/simulation/Scene6/render_e.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_e.json +++ b/data/simulation/Scene6/render_e.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_e.npz b/data/simulation/Scene6/render_e.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_e.npz and b/data/simulation/Scene6/render_e.npz differ diff --git a/data/simulation/Scene6/render_e.png b/data/simulation/Scene6/render_e.png index 4b4908c..ffdc17c 100644 Binary files a/data/simulation/Scene6/render_e.png and b/data/simulation/Scene6/render_e.png differ diff --git a/data/simulation/Scene6/render_f.json b/data/simulation/Scene6/render_f.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_f.json +++ b/data/simulation/Scene6/render_f.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_f.npz b/data/simulation/Scene6/render_f.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_f.npz and b/data/simulation/Scene6/render_f.npz differ diff --git a/data/simulation/Scene6/render_f.png b/data/simulation/Scene6/render_f.png index c2a8af3..49a8884 100644 Binary files a/data/simulation/Scene6/render_f.png and b/data/simulation/Scene6/render_f.png differ diff --git a/data/simulation/Scene6/render_g.json b/data/simulation/Scene6/render_g.json index c939fba..ca2dfe5 100644 --- a/data/simulation/Scene6/render_g.json +++ b/data/simulation/Scene6/render_g.json @@ -2001,6 +2001,84 @@ -0.17364829778671265 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.24249999225139618, + -0.16188383102416992, + 0.15266956388950348 + ], + "position_mm": [ + 242.49999225139618, + -161.88383102416992, + 152.66956388950348 + ], + "rotation_quaternion": [ + 0.5416752099990845, + 0.45451948046684265, + 0.4545193910598755, + -0.5416752696037292 + ], + "normal": [ + -1.4901161193847656e-07, + -0.9848077297210693, + 0.17364828288555145 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.15600450336933136, + 0.12614205479621887 + ], + "position_mm": [ + 280.0000011920929, + -156.00450336933136, + 126.14205479621887 + ], + "rotation_quaternion": [ + 0.4617486298084259, + 0.8870108127593994, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.8191520571708679, + -0.5735763907432556 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.2800000011920929, + -0.10656015574932098, + 0.11742367595434189 + ], + "position_mm": [ + 280.0000011920929, + -106.56015574932098, + 117.42367595434189 + ], + "rotation_quaternion": [ + 0.30070579051971436, + -0.9537169933319092, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.5735763907432556, + -0.8191519975662231 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene6/render_g.npz b/data/simulation/Scene6/render_g.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene6/render_g.npz and b/data/simulation/Scene6/render_g.npz differ diff --git a/data/simulation/Scene6/render_g.png b/data/simulation/Scene6/render_g.png index 55aa545..ca5be3b 100644 Binary files a/data/simulation/Scene6/render_g.png and b/data/simulation/Scene6/render_g.png differ diff --git a/data/simulation/Scene7/render_f.json b/data/simulation/Scene7/render_f.json index 81e77f6..a7fb394 100644 --- a/data/simulation/Scene7/render_f.json +++ b/data/simulation/Scene7/render_f.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.19249999523162842, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 192.49999523162842, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.23000000417232513, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 230.00000417232513, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.23000000417232513, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 230.00000417232513, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene7/render_f.npz b/data/simulation/Scene7/render_f.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene7/render_f.npz and b/data/simulation/Scene7/render_f.npz differ diff --git a/data/simulation/Scene7/render_f.png b/data/simulation/Scene7/render_f.png index 9297a21..ab309a1 100644 Binary files a/data/simulation/Scene7/render_f.png and b/data/simulation/Scene7/render_f.png differ diff --git a/data/simulation/Scene7/render_g.json b/data/simulation/Scene7/render_g.json index 81e77f6..a7fb394 100644 --- a/data/simulation/Scene7/render_g.json +++ b/data/simulation/Scene7/render_g.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.19249999523162842, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 192.49999523162842, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.23000000417232513, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 230.00000417232513, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.23000000417232513, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 230.00000417232513, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene7/render_g.npz b/data/simulation/Scene7/render_g.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene7/render_g.npz and b/data/simulation/Scene7/render_g.npz differ diff --git a/data/simulation/Scene7/render_g.png b/data/simulation/Scene7/render_g.png index c67bfe6..fe59a01 100644 Binary files a/data/simulation/Scene7/render_g.png and b/data/simulation/Scene7/render_g.png differ diff --git a/data/simulation/Scene9/pose.json b/data/simulation/Scene9/pose.json index 8b0122a..76acf59 100644 --- a/data/simulation/Scene9/pose.json +++ b/data/simulation/Scene9/pose.json @@ -9,6 +9,11 @@ "c": 9, "e": 8 }, + "rendering": { + "width": 1280, + "height": 720, + "dofFStop": 11.0 + }, "camera_positions": { "a": [ -300, @@ -45,5 +50,42 @@ 200, 1400 ] + }, + "camera_targets": { + "a": [ + 210, + -100, + 180 + ], + "b": [ + 310, + -80, + 180 + ], + "c": [ + 210, + -100, + 150 + ], + "d": [ + 210, + -100, + 150 + ], + "e": [ + 210, + -100, + 50 + ], + "f": [ + 200, + -200, + 180 + ], + "g": [ + 200, + -200, + 180 + ] } } \ No newline at end of file diff --git a/data/simulation/Scene9/render_a.json b/data/simulation/Scene9/render_a.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_a.json +++ b/data/simulation/Scene9/render_a.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_a.npz b/data/simulation/Scene9/render_a.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_a.npz and b/data/simulation/Scene9/render_a.npz differ diff --git a/data/simulation/Scene9/render_a.png b/data/simulation/Scene9/render_a.png index 48ff985..1fc230e 100644 Binary files a/data/simulation/Scene9/render_a.png and b/data/simulation/Scene9/render_a.png differ diff --git a/data/simulation/Scene9/render_b.json b/data/simulation/Scene9/render_b.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_b.json +++ b/data/simulation/Scene9/render_b.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_b.npz b/data/simulation/Scene9/render_b.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_b.npz and b/data/simulation/Scene9/render_b.npz differ diff --git a/data/simulation/Scene9/render_b.png b/data/simulation/Scene9/render_b.png index 7ec270a..2749e78 100644 Binary files a/data/simulation/Scene9/render_b.png and b/data/simulation/Scene9/render_b.png differ diff --git a/data/simulation/Scene9/render_c.json b/data/simulation/Scene9/render_c.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_c.json +++ b/data/simulation/Scene9/render_c.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_c.npz b/data/simulation/Scene9/render_c.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_c.npz and b/data/simulation/Scene9/render_c.npz differ diff --git a/data/simulation/Scene9/render_c.png b/data/simulation/Scene9/render_c.png index 310cc37..69d0bfe 100644 Binary files a/data/simulation/Scene9/render_c.png and b/data/simulation/Scene9/render_c.png differ diff --git a/data/simulation/Scene9/render_d.json b/data/simulation/Scene9/render_d.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_d.json +++ b/data/simulation/Scene9/render_d.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_d.npz b/data/simulation/Scene9/render_d.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_d.npz and b/data/simulation/Scene9/render_d.npz differ diff --git a/data/simulation/Scene9/render_d.png b/data/simulation/Scene9/render_d.png index f6fe25d..418f65d 100644 Binary files a/data/simulation/Scene9/render_d.png and b/data/simulation/Scene9/render_d.png differ diff --git a/data/simulation/Scene9/render_e.json b/data/simulation/Scene9/render_e.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_e.json +++ b/data/simulation/Scene9/render_e.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_e.npz b/data/simulation/Scene9/render_e.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_e.npz and b/data/simulation/Scene9/render_e.npz differ diff --git a/data/simulation/Scene9/render_e.png b/data/simulation/Scene9/render_e.png index 2bf4698..3ce866b 100644 Binary files a/data/simulation/Scene9/render_e.png and b/data/simulation/Scene9/render_e.png differ diff --git a/data/simulation/Scene9/render_f.json b/data/simulation/Scene9/render_f.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_f.json +++ b/data/simulation/Scene9/render_f.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_f.npz b/data/simulation/Scene9/render_f.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_f.npz and b/data/simulation/Scene9/render_f.npz differ diff --git a/data/simulation/Scene9/render_f.png b/data/simulation/Scene9/render_f.png index 3876eb3..0763ded 100644 Binary files a/data/simulation/Scene9/render_f.png and b/data/simulation/Scene9/render_f.png differ diff --git a/data/simulation/Scene9/render_g.json b/data/simulation/Scene9/render_g.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9/render_g.json +++ b/data/simulation/Scene9/render_g.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9/render_g.npz b/data/simulation/Scene9/render_g.npz index 6243600..b10ee26 100644 Binary files a/data/simulation/Scene9/render_g.npz and b/data/simulation/Scene9/render_g.npz differ diff --git a/data/simulation/Scene9/render_g.png b/data/simulation/Scene9/render_g.png index 59234be..db97787 100644 Binary files a/data/simulation/Scene9/render_g.png and b/data/simulation/Scene9/render_g.png differ diff --git a/data/simulation/Scene9a/pose.json b/data/simulation/Scene9a/pose.json index 04c0abe..9974214 100644 --- a/data/simulation/Scene9a/pose.json +++ b/data/simulation/Scene9a/pose.json @@ -9,6 +9,11 @@ "c": 9, "e": 8 }, + "rendering": { + "width": 1440, + "height": 1080, + "dofFStop": 11 + }, "camera_positions": { "a": [ -300, @@ -45,5 +50,42 @@ 200, 1400 ] + }, + "camera_targets": { + "a": [ + 210, + -100, + 180 + ], + "b": [ + 310, + -80, + 180 + ], + "c": [ + 210, + -100, + 150 + ], + "d": [ + 210, + -100, + 150 + ], + "e": [ + 210, + -100, + 50 + ], + "f": [ + 200, + -200, + 180 + ], + "g": [ + 200, + -200, + 180 + ] } } \ No newline at end of file diff --git a/data/simulation/Scene9a/render_a.json b/data/simulation/Scene9a/render_a.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_a.json +++ b/data/simulation/Scene9a/render_a.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_a.npz b/data/simulation/Scene9a/render_a.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_a.npz and b/data/simulation/Scene9a/render_a.npz differ diff --git a/data/simulation/Scene9a/render_a.png b/data/simulation/Scene9a/render_a.png index f299dae..9b70d54 100644 Binary files a/data/simulation/Scene9a/render_a.png and b/data/simulation/Scene9a/render_a.png differ diff --git a/data/simulation/Scene9a/render_b.json b/data/simulation/Scene9a/render_b.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_b.json +++ b/data/simulation/Scene9a/render_b.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_b.npz b/data/simulation/Scene9a/render_b.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_b.npz and b/data/simulation/Scene9a/render_b.npz differ diff --git a/data/simulation/Scene9a/render_b.png b/data/simulation/Scene9a/render_b.png index 4348629..98dc91d 100644 Binary files a/data/simulation/Scene9a/render_b.png and b/data/simulation/Scene9a/render_b.png differ diff --git a/data/simulation/Scene9a/render_c.json b/data/simulation/Scene9a/render_c.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_c.json +++ b/data/simulation/Scene9a/render_c.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_c.npz b/data/simulation/Scene9a/render_c.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_c.npz and b/data/simulation/Scene9a/render_c.npz differ diff --git a/data/simulation/Scene9a/render_c.png b/data/simulation/Scene9a/render_c.png index 0f46435..abf83dc 100644 Binary files a/data/simulation/Scene9a/render_c.png and b/data/simulation/Scene9a/render_c.png differ diff --git a/data/simulation/Scene9a/render_d.json b/data/simulation/Scene9a/render_d.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_d.json +++ b/data/simulation/Scene9a/render_d.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_d.npz b/data/simulation/Scene9a/render_d.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_d.npz and b/data/simulation/Scene9a/render_d.npz differ diff --git a/data/simulation/Scene9a/render_d.png b/data/simulation/Scene9a/render_d.png index db972b2..01c8617 100644 Binary files a/data/simulation/Scene9a/render_d.png and b/data/simulation/Scene9a/render_d.png differ diff --git a/data/simulation/Scene9a/render_e.json b/data/simulation/Scene9a/render_e.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_e.json +++ b/data/simulation/Scene9a/render_e.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_e.npz b/data/simulation/Scene9a/render_e.npz index c76f892..5a60970 100644 Binary files a/data/simulation/Scene9a/render_e.npz and b/data/simulation/Scene9a/render_e.npz differ diff --git a/data/simulation/Scene9a/render_e.png b/data/simulation/Scene9a/render_e.png index 0aa576a..83a6f25 100644 Binary files a/data/simulation/Scene9a/render_e.png and b/data/simulation/Scene9a/render_e.png differ diff --git a/data/simulation/Scene9a/render_f.json b/data/simulation/Scene9a/render_f.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_f.json +++ b/data/simulation/Scene9a/render_f.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_f.npz b/data/simulation/Scene9a/render_f.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_f.npz and b/data/simulation/Scene9a/render_f.npz differ diff --git a/data/simulation/Scene9a/render_f.png b/data/simulation/Scene9a/render_f.png index f667a6e..e30b1a9 100644 Binary files a/data/simulation/Scene9a/render_f.png and b/data/simulation/Scene9a/render_f.png differ diff --git a/data/simulation/Scene9a/render_g.json b/data/simulation/Scene9a/render_g.json index 6870bb5..e812ff0 100644 --- a/data/simulation/Scene9a/render_g.json +++ b/data/simulation/Scene9a/render_g.json @@ -2001,6 +2001,84 @@ -0.05233597010374069 ] }, + { + "name": "aruco_248", + "id": 248, + "link": "Ellbow", + "position_m": [ + 0.2224999964237213, + -0.17729905247688293, + 0.05413304641842842 + ], + "position_mm": [ + 222.4999964237213, + -177.29905247688293, + 54.13304641842842 + ], + "rotation_quaternion": [ + 0.5129170417785645, + 0.48674020171165466, + 0.4867401123046875, + -0.512917160987854 + ], + "normal": [ + -2.0861628513557662e-07, + -0.9986295700073242, + 0.05233597010374069 + ] + }, + { + "name": "aruco_232", + "id": 232, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.16823066771030426, + 0.02851978689432144 + ], + "position_mm": [ + 259.99999046325684, + -168.23066771030426, + 28.51978689432144 + ], + "rotation_quaternion": [ + 0.4067366421222687, + 0.9135454893112183, + 0.0, + 0.0 + ], + "normal": [ + 0.0, + -0.7431448698043823, + -0.6691306233406067 + ] + }, + { + "name": "aruco_231", + "id": 231, + "link": "Ellbow", + "position_m": [ + 0.25999999046325684, + -0.1180923730134964, + 0.02589215338230133 + ], + "position_mm": [ + 259.99999046325684, + -118.0923730134964, + 25.89215338230133 + ], + "rotation_quaternion": [ + 0.35836800932884216, + -0.9335803985595703, + -0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.6691306829452515, + -0.7431447505950928 + ] + }, { "name": "Arm2_marker_120", "id": 120, diff --git a/data/simulation/Scene9a/render_g.npz b/data/simulation/Scene9a/render_g.npz index cdb93c1..5a60970 100644 Binary files a/data/simulation/Scene9a/render_g.npz and b/data/simulation/Scene9a/render_g.npz differ diff --git a/data/simulation/Scene9a/render_g.png b/data/simulation/Scene9a/render_g.png index 6d3b006..f6d6349 100644 Binary files a/data/simulation/Scene9a/render_g.png and b/data/simulation/Scene9a/render_g.png differ diff --git a/data/simulation/Scene9b/pose.json b/data/simulation/Scene9b/pose.json index 89d6a32..bb6a645 100644 --- a/data/simulation/Scene9b/pose.json +++ b/data/simulation/Scene9b/pose.json @@ -9,6 +9,11 @@ "c": 9, "e": 8 }, + "rendering": { + "width": 4896, + "height": 3264, + "dofFStop": 5.6 + }, "camera_positions": { "a": [ -300, @@ -45,5 +50,42 @@ 200, 1400 ] + }, + "camera_targets": { + "a": [ + 210, + -100, + 180 + ], + "b": [ + 310, + -80, + 180 + ], + "c": [ + 210, + -100, + 150 + ], + "d": [ + 210, + -100, + 150 + ], + "e": [ + 210, + -100, + 50 + ], + "f": [ + 200, + -200, + 180 + ], + "g": [ + 200, + -200, + 180 + ] } } \ No newline at end of file diff --git a/data/simulation/debug/markers.json b/data/simulation/debug/markers.json index a7fb394..e812ff0 100644 --- a/data/simulation/debug/markers.json +++ b/data/simulation/debug/markers.json @@ -1798,12 +1798,12 @@ "id": 198, "link": "Arm1", "position_m": [ - 0.14000000059604645, + 0.17000000178813934, -0.053141459822654724, 0.09089445322751999 ], "position_mm": [ - 140.00000059604645, + 170.00000178813934, -53.141459822654724, 90.89445322751999 ], @@ -1824,12 +1824,12 @@ "id": 229, "link": "Arm1", "position_m": [ - 0.14000000059604645, + 0.17000000178813934, -0.14308664202690125, 0.08775349706411362 ], "position_mm": [ - 140.00000059604645, + 170.00000178813934, -143.08664202690125, 87.75349706411362 ], @@ -1850,12 +1850,12 @@ "id": 242, "link": "Arm1", "position_m": [ - 0.14000000059604645, + 0.17000000178813934, -0.1406087726354599, 0.016796745359897614 ], "position_mm": [ - 140.00000059604645, + 170.00000178813934, -140.6087726354599, 16.796745359897614 ], @@ -1876,12 +1876,12 @@ "id": 243, "link": "Arm1", "position_m": [ - 0.14000000059604645, + 0.17000000178813934, -0.1773260533809662, 0.05103618651628494 ], "position_mm": [ - 140.00000059604645, + 170.00000178813934, -177.3260533809662, 51.03618651628494 ], @@ -1902,12 +1902,12 @@ "id": 244, "link": "Ellbow", "position_m": [ - 0.265500009059906, + 0.2954999804496765, -0.14184769988059998, 0.052275121212005615 ], "position_mm": [ - 265.500009059906, + 295.4999804496765, -141.84769988059998, 52.275121212005615 ], @@ -1928,12 +1928,12 @@ "id": 245, "link": "Ellbow", "position_m": [ - 0.23000000417232513, + 0.25999999046325684, -0.17729905247688293, 0.05413304641842842 ], "position_mm": [ - 230.00000417232513, + 259.99999046325684, -177.29905247688293, 54.13304641842842 ], @@ -1954,12 +1954,12 @@ "id": 246, "link": "Ellbow", "position_m": [ - 0.23000000417232513, + 0.25999999046325684, -0.10639634728431702, 0.05041719600558281 ], "position_mm": [ - 230.00000417232513, + 259.99999046325684, -106.39634728431702, 50.41719600558281 ], @@ -1980,12 +1980,12 @@ "id": 247, "link": "Ellbow", "position_m": [ - 0.19249999523162842, + 0.2224999964237213, -0.10639634728431702, 0.05041719600558281 ], "position_mm": [ - 192.49999523162842, + 222.4999964237213, -106.39634728431702, 50.41719600558281 ], @@ -2006,12 +2006,12 @@ "id": 248, "link": "Ellbow", "position_m": [ - 0.19249999523162842, + 0.2224999964237213, -0.17729905247688293, 0.05413304641842842 ], "position_mm": [ - 192.49999523162842, + 222.4999964237213, -177.29905247688293, 54.13304641842842 ], @@ -2032,12 +2032,12 @@ "id": 232, "link": "Ellbow", "position_m": [ - 0.23000000417232513, + 0.25999999046325684, -0.16823066771030426, 0.02851978689432144 ], "position_mm": [ - 230.00000417232513, + 259.99999046325684, -168.23066771030426, 28.51978689432144 ], @@ -2058,12 +2058,12 @@ "id": 231, "link": "Ellbow", "position_m": [ - 0.23000000417232513, + 0.25999999046325684, -0.1180923730134964, 0.02589215338230133 ], "position_mm": [ - 230.00000417232513, + 259.99999046325684, -118.0923730134964, 25.89215338230133 ], @@ -2084,25 +2084,25 @@ "id": 120, "link": "Arm2", "position_m": [ - 0.2621755301952362, - -0.1509692370891571, - 0.16490685939788818 + 0.22782443463802338, + -0.1210029348731041, + 0.1633363962173462 ], "position_mm": [ - 262.1755301952362, - -150.9692370891571, - 164.90685939788818 + 227.82443463802338, + -121.0029348731041, + 163.3363962173462 ], "rotation_quaternion": [ - 0.3698526918888092, - -0.3897433578968048, - 0.5805523991584778, - -0.6117745041847229 + 0.5805524587631226, + -0.6117745637893677, + -0.36985260248184204, + 0.38974329829216003 ], "normal": [ - 0.9063078165054321, - -0.4220390319824219, - 0.02211807668209076 + -0.9063076972961426, + 0.42203933000564575, + -0.022118031978607178 ] }, { @@ -2110,25 +2110,25 @@ "id": 122, "link": "Arm2", "position_m": [ - 0.19664090871810913, - -0.14811114966869354, - 0.16475707292556763 + 0.29335907101631165, + -0.12386100739240646, + 0.16348618268966675 ], "position_mm": [ - 196.64090871810913, - -148.11114966869354, - 164.75707292556763 + 293.35907101631165, + -123.86100739240646, + 163.48618268966675 ], "rotation_quaternion": [ - 0.3948240280151367, - -0.41605767607688904, - -0.5638671517372131, - 0.59419184923172 + 0.5638670921325684, + -0.5941917896270752, + 0.3948240578174591, + -0.4160577356815338 ], "normal": [ - -0.9396926164627075, - -0.34155139327049255, - 0.017899779602885246 + 0.9396927356719971, + 0.34155115485191345, + -0.017899811267852783 ] }, { @@ -2136,25 +2136,25 @@ "id": 218, "link": "Arm2", "position_m": [ - 0.26335909962654114, - -0.12386099994182587, - 0.16348618268966675 + 0.22664089500904083, + -0.14811114966869354, + 0.16475707292556763 ], "position_mm": [ - 263.35909962654114, - -123.86099994182587, - 163.48618268966675 + 226.64089500904083, + -148.11114966869354, + 164.75707292556763 ], "rotation_quaternion": [ - 0.5638671517372131, - -0.5941919088363647, - 0.39482399821281433, - -0.41605764627456665 + 0.3948240280151367, + -0.4160577058792114, + -0.5638670921325684, + 0.59419184923172 ], "normal": [ - 0.9396926164627075, - 0.3415515422821045, - -0.017899898812174797 + -0.9396926760673523, + -0.3415512442588806, + 0.017899809405207634 ] }, { @@ -2162,25 +2162,25 @@ "id": 113, "link": "Arm2", "position_m": [ - 0.2195683866739273, - -0.10370121896266937, - 0.23252572119235992 + 0.27043160796165466, + -0.1609439104795456, + 0.2355256825685501 ], "position_mm": [ - 219.5683866739273, - -103.70121896266937, - 232.52572119235992 + 270.43160796165466, + -160.9439104795456, + 235.5256825685501 ], "rotation_quaternion": [ + 0.11953148245811462, + -0.1259598731994629, 0.6778969764709473, - -0.7143542766571045, - -0.1195315346121788, - 0.12595993280410767 + -0.7143542766571045 ], "normal": [ - -0.3420201539993286, - 0.9384047985076904, - -0.04917961359024048 + 0.34202003479003906, + -0.9384048581123352, + 0.04917958378791809 ] }, { @@ -2188,25 +2188,25 @@ "id": 114, "link": "Arm2", "position_m": [ - 0.2621755301952362, - -0.1473057121038437, - 0.2348109483718872 + 0.22782443463802338, + -0.11733941733837128, + 0.23324045538902283 ], "position_mm": [ - 262.1755301952362, - -147.3057121038437, - 234.8109483718872 + 227.82443463802338, + -117.33941733837128, + 233.24045538902283 ], "rotation_quaternion": [ - 0.3698526918888092, - -0.3897433578968048, - 0.5805523991584778, - -0.6117745041847229 + 0.5805524587631226, + -0.6117745637893677, + -0.36985260248184204, + 0.38974329829216003 ], "normal": [ - 0.9063078165054321, - -0.4220390319824219, - 0.02211807668209076 + -0.9063076972961426, + 0.42203933000564575, + -0.022118031978607178 ] }, { @@ -2214,25 +2214,25 @@ "id": 115, "link": "Arm2", "position_m": [ - 0.21499629318714142, - -0.16445402801036835, - 0.23570963740348816 + 0.27500370144844055, + -0.10019111633300781, + 0.23234176635742188 ], "position_mm": [ - 214.99629318714142, - -164.45402801036835, - 235.70963740348816 + 275.00370144844055, + -100.19111633300781, + 232.34176635742188 ], "rotation_quaternion": [ - 0.14898721873760223, - -0.15699973702430725, - -0.6720378994941711, - 0.7081800699234009 + 0.6720378398895264, + -0.7081800699234009, + 0.148987278342247, + -0.15699981153011322 ], "normal": [ - -0.4226182699203491, - -0.9050657749176025, - 0.047432348132133484 + 0.42261838912963867, + 0.9050655961036682, + -0.047432444989681244 ] }, { @@ -2240,25 +2240,25 @@ "id": 124, "link": "Arm2", "position_m": [ - 0.19664090871810913, - -0.14251121878623962, - 0.27161043882369995 + 0.29335907101631165, + -0.11826106905937195, + 0.2703395485877991 ], "position_mm": [ - 196.64090871810913, - -142.51121878623962, - 271.61043882369995 + 293.35907101631165, + -118.26106905937195, + 270.3395485877991 ], "rotation_quaternion": [ - 0.3948240280151367, - -0.41605767607688904, - -0.5638671517372131, - 0.59419184923172 + 0.5638670921325684, + -0.5941917896270752, + 0.3948240578174591, + -0.4160577356815338 ], "normal": [ - -0.9396926164627075, - -0.34155139327049255, - 0.017899779602885246 + 0.9396927356719971, + 0.34155115485191345, + -0.017899811267852783 ] }, { @@ -2266,25 +2266,25 @@ "id": 219, "link": "Arm2", "position_m": [ - 0.26335909962654114, - -0.11826106160879135, - 0.2703395485877991 + 0.22664089500904083, + -0.14251121878623962, + 0.27161043882369995 ], "position_mm": [ - 263.35909962654114, - -118.26106160879135, - 270.3395485877991 + 226.64089500904083, + -142.51121878623962, + 271.61043882369995 ], "rotation_quaternion": [ - 0.5638671517372131, - -0.5941919088363647, - 0.39482399821281433, - -0.41605764627456665 + 0.3948240280151367, + -0.4160577058792114, + -0.5638670921325684, + 0.59419184923172 ], "normal": [ - 0.9396926164627075, - 0.3415515422821045, - -0.017899898812174797 + -0.9396926760673523, + -0.3415512442588806, + 0.017899809405207634 ] }, { @@ -2292,25 +2292,25 @@ "id": 40, "link": "FingerA", "position_m": [ - 0.2677094340324402, - -0.1501556783914566, - 0.35217177867889404 + 0.21553662419319153, + -0.08246307820081711, + 0.31723877787590027 ], "position_mm": [ - 267.7094340324402, - -150.1556783914566, - 352.17177867889404 + 215.53662419319153, + -82.46307820081711, + 317.23877787590027 ], "rotation_quaternion": [ - 0.021059956401586533, - 0.06727804243564606, - -0.8116653561592102, - 0.5798529982566833 + 0.25081899762153625, + -0.9551512002944946, + -0.13290834426879883, + -0.08432948589324951 ], "normal": [ - 0.04383547604084015, - -0.9441269040107727, - -0.32665398716926575 + 0.09442292153835297, + 0.5015562772750854, + -0.859956681728363 ] }, { @@ -2318,25 +2318,25 @@ "id": 41, "link": "FingerA", "position_m": [ - 0.2358827143907547, - -0.11256645619869232, - 0.34673067927360535 + 0.24487937986850739, + -0.11210105568170547, + 0.34399858117103577 ], "position_mm": [ - 235.8827143907547, - -112.56645619869232, - 346.73067927360535 + 244.87937986850739, + -112.10105568170547, + 343.99858117103577 ], "rotation_quaternion": [ - 0.9692426919937134, - 0.002282005036249757, - -0.018137134611606598, - 0.24542734026908875 + 0.22204725444316864, + 0.003033978631719947, + -0.3654671907424927, + -0.9039466977119446 ], "normal": [ - -0.03403843566775322, - -0.013326330110430717, - 0.9993317127227783 + -0.16778706014156342, + 0.6593782901763916, + 0.73284912109375 ] }, { @@ -2344,25 +2344,25 @@ "id": 42, "link": "FingerA", "position_m": [ - 0.2639923095703125, - -0.13954909145832062, - 0.3735145628452301 + 0.21405166387557983, + -0.0764177069067955, + 0.34054282307624817 ], "position_mm": [ - 263.9923095703125, - -139.54909145832062, - 373.5145628452301 + 214.05166387557983, + -76.4177069067955, + 340.54282307624817 ], "rotation_quaternion": [ - 0.8447493314743042, - -0.3168453276157379, - 0.42179709672927856, - 0.0899711325764656 + 0.2647150754928589, + 0.453290730714798, + -0.008107217960059643, + -0.8511097431182861 ], "normal": [ - 0.6556118130683899, - 0.6112089157104492, - 0.4433925151824951 + -0.7758923768997192, + -0.22618548572063446, + 0.5889236330986023 ] }, { @@ -2370,25 +2370,25 @@ "id": 43, "link": "FingerB", "position_m": [ - 0.2080598622560501, - -0.1449533998966217, - 0.36243146657943726 + 0.26951199769973755, + -0.07608000934123993, + 0.34051966667175293 ], "position_mm": [ - 208.0598622560501, - -144.9533998966217, - 362.43146657943726 + 269.51199769973755, + -76.08000934123993, + 340.51966667175293 ], "rotation_quaternion": [ - 0.526361346244812, - -0.39512625336647034, - 0.42490965127944946, - 0.6215068101882935 + 0.7693742513656616, + 0.23698587715625763, + 0.11772578954696655, + -0.5814135074615479 ], "normal": [ - -0.043835271149873734, - 0.9441269636154175, - 0.3266540467739105 + -0.09442318975925446, + -0.5015563368797302, + 0.859956681728363 ] }, { @@ -2396,25 +2396,25 @@ "id": 44, "link": "FingerB", "position_m": [ - 0.23418523371219635, - -0.16895513236522675, - 0.3278355598449707 + 0.25280579924583435, + -0.08222946524620056, + 0.2942748963832855 ], "position_mm": [ - 234.18523371219635, - -168.95513236522675, - 327.8355598449707 + 252.80579924583435, + -82.22946524620056, + 294.2748963832855 ], "rotation_quaternion": [ - 0.47481709718704224, - 0.28831005096435547, - -0.19160225987434387, - 0.8091443777084351 + 0.6558026671409607, + -0.4080226421356201, + -0.521297037601471, + -0.3628908097743988 ], "normal": [ - 0.2846168577671051, - -0.5838568210601807, - 0.7603318095207214 + -0.38760069012641907, + 0.9135125875473022, + 0.12353380024433136 ] }, { @@ -2422,25 +2422,25 @@ "id": 45, "link": "FingerB", "position_m": [ - 0.21609467267990112, - -0.16585004329681396, - 0.37140941619873047 + 0.2614270746707916, + -0.055022913962602615, + 0.3319719433784485 ], "position_mm": [ - 216.09467267990112, - -165.85004329681396, - 371.40941619873047 + 261.4270746707916, + -55.022913962602615, + 331.9719433784485 ], "rotation_quaternion": [ - 0.6045908331871033, - 0.20278345048427582, - -0.6249297261238098, - 0.45034608244895935 + 0.18035854399204254, + -0.6729050278663635, + -0.44777974486351013, + -0.5605023503303528 ], "normal": [ - -0.573008120059967, - -0.808071494102478, - 0.136683389544487 + 0.592807948589325, + 0.7446916103363037, + -0.30661579966545105 ] } ] \ No newline at end of file diff --git a/data/simulation/debug/render.npz b/data/simulation/debug/render.npz index b10ee26..c76f892 100644 Binary files a/data/simulation/debug/render.npz and b/data/simulation/debug/render.npz differ diff --git a/data/simulation/debug/render.png b/data/simulation/debug/render.png index 235204b..f6d6349 100644 Binary files a/data/simulation/debug/render.png and b/data/simulation/debug/render.png differ diff --git a/pipeline/3_anchor_patch.py b/pipeline/3_anchor_patch.py deleted file mode 100644 index e69de29..0000000 diff --git a/pipeline/3_multiview_bundle_adjustment_v1.py b/pipeline/3_multiview_bundle_adjustment_v1.py deleted file mode 100644 index 705f90f..0000000 --- a/pipeline/3_multiview_bundle_adjustment_v1.py +++ /dev/null @@ -1,674 +0,0 @@ -#!/usr/bin/env python3 -""" -3_multiview_bundle_adjustment.py - -Multi-view ArUco marker position optimization with geometric constraints. - -Strategy: -1. Triangulate markers from multi-view observations (rough initial estimate) -2. Optimize marker positions with constraints: - - Same-link distance constraints: markers on same link keep fixed relative distance - - Joint-axis constraints: markers on linked arms via joint keep distance along joint axis -3. Use bundle adjustment: minimize reprojection error + constraint violations - -Key insight: We do NOT use robot.json marker positions (they're in different joint config). -We only use robot.json hierarchy to DEFINE constraints. - -Dependencies: numpy, opencv-python, scipy -""" - -from __future__ import annotations - -import argparse -import json -import os -import sys -import time -from typing import Any, Dict, List, Optional, Tuple - -import cv2 -import numpy as np - - -# =================================================================== -# Path / JSON helpers -# =================================================================== - -def resolve_path(path: str) -> str: - path = os.path.expanduser(path) - if os.path.isabs(path): - return path - return os.path.abspath(path) - - -def load_json(path: str) -> Dict[str, Any]: - with open(resolve_path(path), "r", encoding="utf-8") as f: - return json.load(f) - - -def save_json(path: str, data: Dict[str, Any]) -> None: - with open(resolve_path(path), "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) - - -# =================================================================== -# Units -# =================================================================== - -def get_length_scale(robot_data: Dict[str, Any]) -> float: - units = robot_data.get("units", {}) - length_unit = str(units.get("length", "")).strip().lower() - if length_unit in ("mm", "millimeter", "millimeters"): - return 1.0 / 1000.0 - elif length_unit in ("cm", "centimeter", "centimeters"): - return 1.0 / 100.0 - return 1.0 - - -# =================================================================== -# Constraint definitions (from robot.json structure ONLY) -# =================================================================== - -class MarkerDistanceConstraint: - """ - Two markers on the same link must maintain a fixed distance. - We compute this distance from their relative positions in robot.json, - but scaled to meters. The ACTUAL 3D positions will be optimized, - but their distance must stay constant. - """ - def __init__(self, marker_id_a: int, marker_id_b: int, - link_name: str, target_distance: float, weight: float = 1.0): - self.marker_id_a = marker_id_a - self.marker_id_b = marker_id_b - self.link_name = link_name - self.target_distance = target_distance - self.weight = weight - - -class JointAxisConstraint: - """ - Two markers on linked arms (connected by joint around axis). - If joint axis is [1,0,0], then delta_x component must stay constant. - """ - def __init__(self, marker_id_parent: int, marker_id_child: int, - parent_link: str, child_link: str, - joint_axis: np.ndarray, # unit vector [x,y,z] - target_delta_along_axis: float, - weight: float = 1.0): - self.marker_id_parent = marker_id_parent - self.marker_id_child = marker_id_child - self.parent_link = parent_link - self.child_link = child_link - self.joint_axis = joint_axis / (np.linalg.norm(joint_axis) + 1e-9) - self.target_delta_along_axis = target_delta_along_axis - self.weight = weight - - -def extract_constraints_from_hierarchy(robot_data: Dict[str, Any], - length_scale: float) -> Tuple[Dict, List]: - """ - Extract constraint definitions from robot.json. - - NOTE: We only extract CONSTRAINT TYPES, not actual marker positions. - Marker positions will come from triangulation. - - Returns: - marker_to_link: {marker_id -> link_name} - constraints: List of constraint objects - """ - constraints = [] - marker_to_link = {} - - links = robot_data.get("links", {}) - - # Build map: link_name -> markers on that link - link_markers = {} - for link_name, link_data in links.items(): - markers = link_data.get("markers", []) - marker_ids = [] - marker_positions = {} - - for marker in markers: - marker_id = int(marker.get("id", -1)) - pos = marker.get("position", None) - - if marker_id >= 0 and pos is not None and len(pos) == 3: - marker_ids.append(marker_id) - marker_positions[marker_id] = np.array(pos, dtype=np.float32) * np.float32(length_scale) - marker_to_link[marker_id] = link_name - - link_markers[link_name] = (marker_ids, marker_positions) - - # Extract same-link distance constraints - for link_name, (marker_ids, positions) in link_markers.items(): - if len(marker_ids) >= 2: - # For each pair, compute their distance - for i in range(len(marker_ids)): - for j in range(i + 1, len(marker_ids)): - mid_a = marker_ids[i] - mid_b = marker_ids[j] - pos_a = positions[mid_a] - pos_b = positions[mid_b] - target_dist = float(np.linalg.norm(pos_b - pos_a)) - - constraint = MarkerDistanceConstraint( - mid_a, mid_b, link_name, target_dist, weight=1.0 - ) - constraints.append(constraint) - - # Extract joint-axis constraints (if we have markers on parent and child links) - for link_name, link_data in links.items(): - parent_link = link_data.get("parent", None) - - if parent_link is None: - continue - - joint_info = link_data.get("jointToParent", {}) - if not joint_info: - continue - - joint_axis = joint_info.get("axis", [1, 0, 0]) - joint_axis = np.array(joint_axis, dtype=np.float32) - - # Get markers on this link and parent link - child_marker_ids, child_positions = link_markers.get(link_name, ([], {})) - parent_marker_ids, parent_positions = link_markers.get(parent_link, ([], {})) - - if len(child_marker_ids) > 0 and len(parent_marker_ids) > 0: - # Create constraint between first marker of parent and first marker of child - for mid_parent in parent_marker_ids: - for mid_child in child_marker_ids: - - if mid_parent == mid_child: - continue - - pos_parent = parent_positions[mid_parent] - pos_child = child_positions[mid_child] - - delta = pos_child - pos_parent - - target_delta_along_axis = float( - np.dot(delta, joint_axis) - ) - - constraint = JointAxisConstraint( - mid_parent, - mid_child, - parent_link, - link_name, - joint_axis, - target_delta_along_axis, - weight=0.5 - ) - - constraints.append(constraint) - - return marker_to_link, constraints - -# === -# Helper Function -# - -def print_constraints_with_errors( - title: str, - constraints: List, - positions: Dict[int, np.ndarray] -) -> None: - - print(f"\n[INFO] {title}") - - for idx, constraint in enumerate(constraints): - - # ---------------------------------------------------------- - # Distance constraint - # ---------------------------------------------------------- - - if isinstance(constraint, MarkerDistanceConstraint): - - if ( - constraint.marker_id_a not in positions or - constraint.marker_id_b not in positions - ): - continue - - pos_a = positions[constraint.marker_id_a] - pos_b = positions[constraint.marker_id_b] - - actual_dist = np.linalg.norm(pos_b - pos_a) - - error_m = actual_dist - constraint.target_distance - - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | " - f"target={constraint.target_distance*1000:.2f} mm | " - f"actual={actual_dist*1000:.2f} mm | " - f"error={error_m*1000:+.2f} mm" - ) - - # ---------------------------------------------------------- - # Joint-axis constraint - # ---------------------------------------------------------- - - elif isinstance(constraint, JointAxisConstraint): - - if ( - constraint.marker_id_parent not in positions or - constraint.marker_id_child not in positions - ): - continue - - pos_parent = positions[constraint.marker_id_parent] - pos_child = positions[constraint.marker_id_child] - - delta = pos_child - pos_parent - - actual = np.dot(delta, constraint.joint_axis) - - error_m = actual - constraint.target_delta_along_axis - - axis_str = np.array2string( - constraint.joint_axis, - precision=2, - suppress_small=True - ) - - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}(M{constraint.marker_id_parent}) -> " - f"{constraint.child_link}(M{constraint.marker_id_child}) | " - f"axis={axis_str} | " - f"target={constraint.target_delta_along_axis*1000:.2f} mm | " - f"actual={actual*1000:.2f} mm | " - f"error={error_m*1000:+.2f} mm" - ) - -# =================================================================== -# Multi-view loading -# =================================================================== - -def load_observations_and_poses( - detection_files: List[str], - pose_files: List[str] -) -> Tuple[Dict, List, List]: - """Load observations and camera poses.""" - if len(detection_files) != len(pose_files): - raise ValueError(f"Mismatch: {len(detection_files)} detections vs {len(pose_files)} poses") - - marker_observations = {} - cameras = [] - obs_metadata = [] - - for cam_idx, (det_file, pose_file) in enumerate(zip(detection_files, pose_files)): - det = load_json(det_file) - pose_data = load_json(pose_file) - - # Camera intrinsics - cam_section = det.get("camera", {}) - K = np.array(cam_section.get("camera_matrix", []), dtype=np.float32).reshape(3, 3) - D = np.array(cam_section.get("distortion_coefficients", []), dtype=np.float32).reshape(-1, 1) - - # Camera pose - pose_section = pose_data.get("camera_pose", {}) - world_to_cam = pose_section.get("world_to_camera", {}) - R_wc = np.array(world_to_cam.get("rotation_matrix", []), dtype=np.float32).reshape(3, 3) - t_wc = np.array(world_to_cam.get("translation_m", []), dtype=np.float32).reshape(3) - - cameras.append((K, D, R_wc, t_wc)) - - # Extract observations - detections = det.get("detections", []) - for det_obj in detections: - marker_id = int(det_obj.get("marker_id", -1)) - if marker_id < 0: - continue - - center_px = np.array(det_obj.get("center_px", []), dtype=np.float32) - - # Undistort to normalized coordinates - pts = center_px.reshape(1, 1, 2).astype(np.float32) - und = cv2.undistortPoints(pts, K, D, P=None) - norm_coords = und.reshape(2).astype(np.float32) - - if marker_id not in marker_observations: - marker_observations[marker_id] = [] - - marker_observations[marker_id].append((cam_idx, norm_coords)) - - return marker_observations, cameras, obs_metadata - - -# =================================================================== -# Initial triangulation -# =================================================================== - -def triangulate_marker_initial( - marker_id: int, - observations: List[Tuple[int, np.ndarray]], - cameras: List[Tuple] -) -> Optional[np.ndarray]: - """Rough triangulation using first two views.""" - if len(observations) < 2: - return None - - K1, D1, R_wc_1, t_wc_1 = cameras[observations[0][0]] - K2, D2, R_wc_2, t_wc_2 = cameras[observations[1][0]] - - norm_coords_1 = observations[0][1] - norm_coords_2 = observations[1][1] - - # Convert to pixel coordinates - x1_px = K1[0, 0] * norm_coords_1[0] + K1[0, 2] - y1_px = K1[1, 1] * norm_coords_1[1] + K1[1, 2] - - x2_px = K2[0, 0] * norm_coords_2[0] + K2[0, 2] - y2_px = K2[1, 1] * norm_coords_2[1] + K2[1, 2] - - P1 = K1 @ np.hstack([R_wc_1, t_wc_1.reshape(3, 1)]) - P2 = K2 @ np.hstack([R_wc_2, t_wc_2.reshape(3, 1)]) - - try: - X_h = cv2.triangulatePoints(P1, P2, - np.array([[x1_px], [y1_px]]).astype(np.float32), - np.array([[x2_px], [y2_px]]).astype(np.float32)) - X = (X_h[:3] / X_h[3]).reshape(3).astype(np.float32) - return X - except Exception: - return None - - -def initial_triangulation( - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple] -) -> Dict[int, np.ndarray]: - """Compute initial marker positions via triangulation.""" - triangulated = {} - - for marker_id, observations in marker_observations.items(): - X = triangulate_marker_initial(marker_id, observations, cameras) - if X is not None: - triangulated[marker_id] = X - - return triangulated - - -# =================================================================== -# Bundle adjustment with constraints -# =================================================================== - -def bundle_adjustment_residuals( - marker_positions_flat: np.ndarray, - marker_ids: List[int], - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple], - constraints: List, - lambda_constraint: float = 100.0 -) -> np.ndarray: - """ - Compute residuals for bundle adjustment. - - marker_positions_flat: [x0, y0, z0, x1, y1, z1, ...] - - Returns: [reprojection_residuals, constraint_residuals] - """ - marker_dict = {} - for i, marker_id in enumerate(marker_ids): - marker_dict[marker_id] = marker_positions_flat[i*3:(i+1)*3] - - residuals = [] - - # Reprojection residuals - for marker_id, observations in marker_observations.items(): - if marker_id not in marker_dict: - continue - - X_world = marker_dict[marker_id] - - for cam_idx, norm_coords_obs in observations: - K, D, R_wc, t_wc = cameras[cam_idx] - - # Project - X_cam = R_wc @ X_world + t_wc - if X_cam[2] > 0.001: # in front of camera - proj_norm = X_cam[:2] / X_cam[2] - residual = proj_norm - norm_coords_obs - residuals.append(residual[0]) - residuals.append(residual[1]) - - # Constraint residuals - for constraint in constraints: - if isinstance(constraint, MarkerDistanceConstraint): - if constraint.marker_id_a in marker_dict and constraint.marker_id_b in marker_dict: - pos_a = marker_dict[constraint.marker_id_a] - pos_b = marker_dict[constraint.marker_id_b] - actual_dist = np.linalg.norm(pos_b - pos_a) - residual = (actual_dist - constraint.target_distance) * constraint.weight * lambda_constraint - residuals.append(residual) - - elif isinstance(constraint, JointAxisConstraint): - if constraint.marker_id_parent in marker_dict and constraint.marker_id_child in marker_dict: - pos_parent = marker_dict[constraint.marker_id_parent] - pos_child = marker_dict[constraint.marker_id_child] - delta = pos_child - pos_parent - actual_delta_along_axis = np.dot(delta, constraint.joint_axis) - residual = (actual_delta_along_axis - constraint.target_delta_along_axis) * constraint.weight * lambda_constraint - residuals.append(residual) - - return np.array(residuals, dtype=np.float64) - - -def optimize_with_constraints( - initial_positions: Dict[int, np.ndarray], - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple], - constraints: List, - lambda_constraint: float = 100.0, - max_iterations: int = 50 -) -> Dict[int, np.ndarray]: - """ - Optimize marker positions using scipy least squares. - """ - try: - from scipy.optimize import least_squares - except ImportError: - print("[WARN] scipy not available, skipping optimization. Using initial triangulation.") - return initial_positions - - marker_ids = sorted(initial_positions.keys()) - x0 = np.concatenate([initial_positions[mid] for mid in marker_ids]) - - def residuals_fn(x): - return bundle_adjustment_residuals(x, marker_ids, marker_observations, cameras, - constraints, lambda_constraint) - - print(f"[INFO] Starting optimization with {len(x0)} variables and {len(constraints)} constraints...") - - result = least_squares( - residuals_fn, - x0, - max_nfev=max_iterations * len(marker_ids), - verbose=1 - ) - - optimized_flat = result.x - optimized = {} - - for i, marker_id in enumerate(marker_ids): - optimized[marker_id] = optimized_flat[i*3:(i+1)*3] - - print(f"[INFO] Optimization complete. Final cost: {np.sum(result.fun**2):.6f}") - - return optimized - - -# =================================================================== -# Main -# =================================================================== - -def main() -> None: - parser = argparse.ArgumentParser( - description="Multi-view bundle adjustment with geometric constraints" - ) - parser.add_argument( - "-det", "--detections", - action="append", - required=True, - help="*_aruco_detection.json files" - ) - parser.add_argument( - "-pose", "--poses", - action="append", - required=True, - help="*_camera_pose.json files" - ) - parser.add_argument( - "-robot", "--robot", - required=True, - help="robot.json" - ) - parser.add_argument( - "-outDir", "--outDir", - default=None, - help="Output directory" - ) - parser.add_argument( - "-lambdaWeight", "--lambdaWeight", - type=float, - default=100.0, - help="Constraint weight" - ) - - args = parser.parse_args() - - if len(args.detections) != len(args.poses): - print(f"[ERROR] Mismatch: {len(args.detections)} vs {len(args.poses)}") - sys.exit(1) - - # Load robot - robot_data = load_json(args.robot) - length_scale = get_length_scale(robot_data) - - print("[STEP 1] Extract constraint definitions from robot.json hierarchy...") - marker_to_link, constraints = extract_constraints_from_hierarchy(robot_data, length_scale) - print(f"[INFO] Extracted {len(constraints)} constraints") - - print("\n[INFO] Constraint list:") - - for idx, constraint in enumerate(constraints): - - if isinstance(constraint, MarkerDistanceConstraint): - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"Marker {constraint.marker_id_a} <-> {constraint.marker_id_b} | " - f"TargetDistance={constraint.target_distance:.6f} m | " - f"Weight={constraint.weight}" - ) - - elif isinstance(constraint, JointAxisConstraint): - axis_str = np.array2string( - constraint.joint_axis, - precision=3, - suppress_small=True - ) - - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}({constraint.marker_id_parent}) -> " - f"{constraint.child_link}({constraint.marker_id_child}) | " - f"Axis={axis_str} | " - f"TargetDelta={constraint.target_delta_along_axis:.6f} m | " - f"Weight={constraint.weight}" - ) - - print("\n[STEP 2] Load observations and camera poses...") - marker_observations, cameras, _ = load_observations_and_poses(args.detections, args.poses) - print(f"[INFO] {len(cameras)} cameras, {len(marker_observations)} observed markers") - - print("\n[STEP 3] Initial triangulation...") - initial_pos = initial_triangulation(marker_observations, cameras) - print(f"[INFO] Triangulated {len(initial_pos)} markers") - - # ------------------------------------------------------------ - # Save initial triangulated positions (before optimization) - # ------------------------------------------------------------ - - initial_output_markers = [] - - for marker_id, position in sorted(initial_pos.items()): - initial_output_markers.append({ - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown") - }) - - initial_output = { - "schema_version": "1.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "stage": "initial_triangulation", - "num_cameras": len(cameras), - "num_markers": len(initial_pos) - }, - "markers": initial_output_markers - } - - out_dir = args.outDir or os.path.dirname(args.detections[0]) or "." - os.makedirs(resolve_path(out_dir), exist_ok=True) - - initial_out_file = os.path.join( - out_dir, - "aruco_positions_initial.json" - ) - - save_json(initial_out_file, initial_output) - - print(f"[INFO] Initial triangulation saved to {initial_out_file}") - - - print("\n[STEP 4] Bundle adjustment with constraints...") - optimized_pos = optimize_with_constraints( - initial_pos, marker_observations, cameras, constraints, - lambda_constraint=args.lambdaWeight - ) - - print_constraints_with_errors( - "Constraint list AFTER optimization", - constraints, - optimized_pos - ) - - - # Output - output_markers = [] - for marker_id, position in sorted(optimized_pos.items()): - output_markers.append({ - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown") - }) - - output = { - "schema_version": "1.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_cameras": len(cameras), - "num_markers": len(optimized_pos), - "num_constraints": len(constraints) - }, - "markers": output_markers - } - - out_dir = args.outDir or os.path.dirname(args.detections[0]) or "." - os.makedirs(resolve_path(out_dir), exist_ok=True) - out_file = os.path.join(out_dir, "aruco_positions_optimized.json") - - save_json(out_file, output) - print(f"\n[INFO] Saved to {out_file}") - - -if __name__ == "__main__": - main() diff --git a/pipeline/3_multiview_bundle_adjustment_v2.py b/pipeline/3_multiview_bundle_adjustment_v2.py deleted file mode 100644 index 615714d..0000000 --- a/pipeline/3_multiview_bundle_adjustment_v2.py +++ /dev/null @@ -1,1369 +0,0 @@ -#!/usr/bin/env python3 -""" -3_multiview_bundle_adjustment_v2.py - -Multi-view ArUco marker position optimization with explicit, programmable -constraint families. - -Main ideas: -1) Triangulate initial marker positions from multi-view detections. -2) Compile constraints from robot.json structure using rule-based recognition: - - rigid link constraints (within a link) - - joint-axis projection constraints (between directly connected links) - - chain-axis projection constraints (ancestor/descendant propagation) -3) Optimize marker positions with bundle adjustment: - reprojection residuals + constraint residuals. - -This version is designed to be debuggable and switchable: -- each constraint family can be enabled/disabled -- robot.json may optionally include constraint_rules / constraint_overrides -- duplicate marker IDs can be checked strictly or only warned about - -Dependencies: - numpy, opencv-python, scipy (optional for optimization) - -Example: - python 3_multiview_bundle_adjustment_v2.py ^ - -det cam1_aruco_detection.json cam2_aruco_detection.json cam3_aruco_detection.json ^ - -pose cam1_camera_pose.json cam2_camera_pose.json cam3_camera_pose.json ^ - -robot robot.json ^ - -lambdaWeight 100.0 -""" - -from __future__ import annotations - -import argparse -import json -import os -import sys -import time -from dataclasses import dataclass -from itertools import combinations -from typing import Any, Dict, List, Optional, Tuple - -import cv2 -import numpy as np - - -# =================================================================== -# Path / JSON helpers -# =================================================================== - -def resolve_path(path: str) -> str: - path = os.path.expanduser(path) - if os.path.isabs(path): - return path - return os.path.abspath(path) - - -def load_json(path: str) -> Dict[str, Any]: - with open(resolve_path(path), "r", encoding="utf-8") as f: - return json.load(f) - - -def save_json(path: str, data: Dict[str, Any]) -> None: - with open(resolve_path(path), "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) - - -# =================================================================== -# Units -# =================================================================== - -def get_length_scale(robot_data: Dict[str, Any]) -> float: - units = robot_data.get("units", {}) - length_unit = str(units.get("length", "")).strip().lower() - if length_unit in ("mm", "millimeter", "millimeters"): - return 1.0 / 1000.0 - if length_unit in ("cm", "centimeter", "centimeters"): - return 1.0 / 100.0 - return 1.0 - - -# =================================================================== -# Small geometry helpers -# =================================================================== - -def safe_norm(v: np.ndarray, eps: float = 1e-12) -> float: - return float(np.linalg.norm(v) + eps) - - -def normalize_vector(v: np.ndarray, eps: float = 1e-12) -> np.ndarray: - n = safe_norm(v, eps) - return np.asarray(v, dtype=np.float64) / n - - -def principal_axis_id(axis: np.ndarray, threshold: float = 0.95) -> Optional[int]: - """ - Return 0,1,2 for x,y,z if the axis is close enough to a principal axis. - Return None if it is not sufficiently aligned. - """ - a = normalize_vector(np.asarray(axis, dtype=np.float64)) - idx = int(np.argmax(np.abs(a))) - if abs(a[idx]) >= threshold: - return idx - return None - - -def axis_name(axis_id: int) -> str: - return ["x", "y", "z"][axis_id] - - -def camera_center_from_world_to_cam(R_wc: np.ndarray, t_wc: np.ndarray) -> np.ndarray: - """ - world_to_camera: X_cam = R_wc * X_world + t_wc - Camera center in world is -R^T t. - """ - return -R_wc.T @ t_wc - - -# =================================================================== -# Constraint rules / config -# =================================================================== - -@dataclass -class ConstraintRuleConfig: - # Rigid link constraints - rigid_distance_enabled: bool = True - rigid_distance_mode: str = "mst" # mst | star | full - rigid_distance_weight: float = 1.0 - - # Direct joint constraints (parent <-> child) - joint_axis_enabled: bool = True - joint_axis_max_pairs: int = 2 # number of anchor markers selected per side - joint_axis_weight: float = 0.5 - - # Propagated ancestor-descendant constraints - chain_axis_enabled: bool = True - chain_axis_max_depth: int = 3 - chain_axis_max_pairs: int = 2 - chain_axis_weight: float = 0.3 - - # Axis recognition threshold - axis_alignment_threshold: float = 0.95 - - # If True, link-marker duplicates in robot.json are fatal. - strict_unique_marker_ids: bool = False - - # Print/skipped diagnostics - show_skipped_constraints: bool = True - - -def _bool_or_default(value: Any, default: bool) -> bool: - if value is None: - return default - return bool(value) - - -def _float_or_default(value: Any, default: float) -> float: - if value is None: - return default - return float(value) - - -def _int_or_default(value: Any, default: int) -> int: - if value is None: - return default - return int(value) - - -def load_constraint_rule_config(robot_data: Dict[str, Any], args: argparse.Namespace) -> ConstraintRuleConfig: - """ - Merge built-in defaults, optional robot.json constraint_rules, and CLI flags. - """ - cfg = ConstraintRuleConfig() - - rules = robot_data.get("constraint_rules", {}) or {} - - rigid = rules.get("rigid_distance", {}) or {} - joint = rules.get("joint_axis_projection", {}) or {} - chain = rules.get("chain_axis_projection", {}) or {} - - cfg.rigid_distance_enabled = _bool_or_default(rigid.get("enabled"), cfg.rigid_distance_enabled) - cfg.rigid_distance_mode = str(rigid.get("mode", cfg.rigid_distance_mode)).strip().lower() - cfg.rigid_distance_weight = _float_or_default(rigid.get("weight"), cfg.rigid_distance_weight) - - cfg.joint_axis_enabled = _bool_or_default(joint.get("enabled"), cfg.joint_axis_enabled) - cfg.joint_axis_max_pairs = _int_or_default(joint.get("max_pairs"), cfg.joint_axis_max_pairs) - cfg.joint_axis_weight = _float_or_default(joint.get("weight"), cfg.joint_axis_weight) - - cfg.chain_axis_enabled = _bool_or_default(chain.get("enabled"), cfg.chain_axis_enabled) - cfg.chain_axis_max_depth = _int_or_default(chain.get("max_depth"), cfg.chain_axis_max_depth) - cfg.chain_axis_max_pairs = _int_or_default(chain.get("max_pairs"), cfg.chain_axis_max_pairs) - cfg.chain_axis_weight = _float_or_default(chain.get("weight"), cfg.chain_axis_weight) - - cfg.axis_alignment_threshold = _float_or_default( - rules.get("axis_alignment_threshold"), cfg.axis_alignment_threshold - ) - - if getattr(args, "strictUniqueMarkerIds", False): - cfg.strict_unique_marker_ids = True - - if getattr(args, "showSkippedConstraints", None) is not None: - cfg.show_skipped_constraints = bool(args.showSkippedConstraints) - - return cfg - - -# =================================================================== -# Constraint definitions -# =================================================================== - -@dataclass -class MarkerDistanceConstraint: - marker_id_a: int - marker_id_b: int - link_name: str - target_distance_m: float - weight: float = 1.0 - enabled: bool = True - source: str = "rigid_distance" - - -@dataclass -class JointAxisConstraint: - marker_id_parent: int - marker_id_child: int - parent_link: str - child_link: str - joint_axis: np.ndarray - target_delta_along_axis_m: float - weight: float = 1.0 - enabled: bool = True - source: str = "joint_axis_projection" - - -Constraint = MarkerDistanceConstraint | JointAxisConstraint - - -# =================================================================== -# Robot parsing -# =================================================================== - -def parse_robot_markers( - robot_data: Dict[str, Any], - length_scale: float, - strict_unique_marker_ids: bool = False -) -> Tuple[Dict[int, str], Dict[str, List[Dict[str, Any]]], List[str]]: - """ - Build: - marker_to_link: marker_id -> link_name - link_markers: link_name -> [{id, position_m, position_raw, ...}, ...] - """ - links = robot_data.get("links", {}) or {} - - marker_to_link: Dict[int, str] = {} - link_markers: Dict[str, List[Dict[str, Any]]] = {} - issues: List[str] = [] - - seen_global: Dict[int, str] = {} - - for link_name, link_data in links.items(): - markers = link_data.get("markers", []) or [] - collected: List[Dict[str, Any]] = [] - - seen_local: set[int] = set() - - for idx, marker in enumerate(markers): - marker_id = int(marker.get("id", -1)) - pos = marker.get("position", None) - - if marker_id < 0 or pos is None or len(pos) != 3: - issues.append(f"[WARN] link={link_name}: skipped invalid marker entry at index {idx}") - continue - - if marker_id in seen_local: - msg = f"[WARN] duplicate marker id {marker_id} inside link '{link_name}'" - if strict_unique_marker_ids: - raise ValueError(msg) - issues.append(msg + " -> skipped duplicate inside same link") - continue - - if marker_id in seen_global: - msg = ( - f"[WARN] duplicate marker id {marker_id} appears in link '{link_name}' " - f"and already in link '{seen_global[marker_id]}'" - ) - if strict_unique_marker_ids: - raise ValueError(msg) - issues.append(msg + " -> skipped duplicate occurrence") - continue - - seen_local.add(marker_id) - seen_global[marker_id] = link_name - - pos_raw = np.array(pos, dtype=np.float64) - pos_m = pos_raw * float(length_scale) - - collected.append( - { - "id": marker_id, - "name": marker.get("name", f"marker_{marker_id}"), - "position_raw": pos_raw, - "position_m": pos_m, - "normal": np.array(marker.get("normal", [0, 0, 1]), dtype=np.float64), - "size": marker.get("size", None), - "spin": marker.get("spin", None), - } - ) - - marker_to_link[marker_id] = link_name - - link_markers[link_name] = collected - - return marker_to_link, link_markers, issues - - -def get_link_parent_map(robot_data: Dict[str, Any]) -> Dict[str, Optional[str]]: - links = robot_data.get("links", {}) or {} - parent_map: Dict[str, Optional[str]] = {} - for link_name, link_data in links.items(): - parent_map[link_name] = link_data.get("parent", None) - return parent_map - - -def get_joint_info(robot_data: Dict[str, Any], child_link: str) -> Dict[str, Any]: - links = robot_data.get("links", {}) or {} - return (links.get(child_link, {}) or {}).get("jointToParent", {}) or {} - - -def get_joint_axis(robot_data: Dict[str, Any], child_link: str) -> Optional[np.ndarray]: - joint = get_joint_info(robot_data, child_link) - axis = joint.get("axis", None) - if axis is None: - return None - axis = np.asarray(axis, dtype=np.float64) - if safe_norm(axis) < 1e-12: - return None - return normalize_vector(axis) - - -# =================================================================== -# Constraint compilation helpers -# =================================================================== - -def get_enabled_link_rule( - robot_data: Dict[str, Any], - link_name: str, - rule_name: str, - default_enabled: bool = True -) -> bool: - """ - Optional per-link override structure: - - "constraint_overrides": { - "Arm2": { - "rigid_distance": {"enabled": true}, - "joint_axis_projection": {"enabled": false} - } - } - """ - overrides = robot_data.get("constraint_overrides", {}) or {} - link_override = overrides.get(link_name, {}) or {} - rule_override = link_override.get(rule_name, {}) or {} - if "enabled" in rule_override: - return bool(rule_override["enabled"]) - return default_enabled - - -def select_anchor_marker_ids( - markers: List[Dict[str, Any]], - axis: Optional[np.ndarray] = None, - max_count: int = 2 -) -> List[int]: - """ - Deterministic anchor selection: - - if axis is provided, choose markers with min/max projection on that axis - - otherwise choose marker(s) closest to centroid and farthest from centroid - - Returns up to max_count ids, deduplicated. - """ - if not markers: - return [] - - if len(markers) == 1: - return [int(markers[0]["id"])] - - ids = [int(m["id"]) for m in markers] - pos = np.stack([np.asarray(m["position_m"], dtype=np.float64) for m in markers], axis=0) - - selected: List[int] = [] - - if axis is not None and safe_norm(axis) > 1e-12: - a = normalize_vector(axis) - proj = pos @ a - min_idx = int(np.argmin(proj)) - max_idx = int(np.argmax(proj)) - selected = [ids[min_idx], ids[max_idx]] - else: - centroid = np.mean(pos, axis=0) - d = np.linalg.norm(pos - centroid, axis=1) - min_idx = int(np.argmin(d)) - max_idx = int(np.argmax(d)) - selected = [ids[min_idx], ids[max_idx]] - - # Fill if needed - if len(selected) < max_count: - for mid in ids: - if mid not in selected: - selected.append(mid) - if len(selected) >= max_count: - break - - # Deduplicate while preserving order - out: List[int] = [] - seen: set[int] = set() - for mid in selected: - if mid not in seen: - seen.add(mid) - out.append(mid) - if len(out) >= max_count: - break - - return out - - -def mst_edges_for_link(markers: List[Dict[str, Any]]) -> List[Tuple[int, int]]: - """ - Prim's algorithm on a complete graph of marker positions. - Returns n-1 edges connecting all markers with minimal total distance. - """ - n = len(markers) - if n < 2: - return [] - - ids = [int(m["id"]) for m in markers] - pos = np.stack([np.asarray(m["position_m"], dtype=np.float64) for m in markers], axis=0) - - in_tree = np.zeros(n, dtype=bool) - in_tree[0] = True - edges: List[Tuple[int, int]] = [] - - # pairwise distances - dist = np.linalg.norm(pos[:, None, :] - pos[None, :, :], axis=2) - - for _ in range(n - 1): - best = None - best_d = float("inf") - for i in range(n): - if not in_tree[i]: - continue - for j in range(n): - if in_tree[j]: - continue - d = float(dist[i, j]) - if d < best_d: - best_d = d - best = (i, j) - if best is None: - break - i, j = best - in_tree[j] = True - edges.append((ids[i], ids[j])) - - return edges - - -def compile_rigid_distance_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[MarkerDistanceConstraint]: - constraints: List[MarkerDistanceConstraint] = [] - links = robot_data.get("links", {}) or {} - - for link_name, markers in link_markers.items(): - if not get_enabled_link_rule(robot_data, link_name, "rigid_distance", cfg.rigid_distance_enabled): - continue - - if len(markers) < 2: - continue - - mode = cfg.rigid_distance_mode - - if mode == "full": - pairs = [(int(a["id"]), int(b["id"])) for a, b in combinations(markers, 2)] - elif mode == "star": - anchor_ids = select_anchor_marker_ids(markers, axis=None, max_count=1) - anchor_id = anchor_ids[0] - pairs = [] - for m in markers: - mid = int(m["id"]) - if mid != anchor_id: - pairs.append((anchor_id, mid)) - elif mode == "mst": - pairs = mst_edges_for_link(markers) - else: - raise ValueError(f"Unknown rigid_distance_mode='{mode}'. Use mst|star|full.") - - pos_map = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in markers} - unique_pairs: List[Tuple[int, int]] = [] - seen_pairs: set[Tuple[int, int]] = set() - - for mid_a, mid_b in pairs: - if mid_a == mid_b: - continue - key = tuple(sorted((int(mid_a), int(mid_b)))) - if key in seen_pairs: - continue - seen_pairs.add(key) - unique_pairs.append((int(mid_a), int(mid_b))) - - for mid_a, mid_b in unique_pairs: - pos_a = pos_map[mid_a] - pos_b = pos_map[mid_b] - target = float(np.linalg.norm(pos_b - pos_a)) - - constraints.append( - MarkerDistanceConstraint( - marker_id_a=mid_a, - marker_id_b=mid_b, - link_name=link_name, - target_distance_m=target, - weight=cfg.rigid_distance_weight, - enabled=True, - source=f"rigid_distance:{mode}", - ) - ) - - return constraints - - -def compile_direct_joint_axis_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[JointAxisConstraint]: - """ - Direct parent-child axis projection constraints. - We keep them intentionally sparse: - - choose up to 2 anchors per side (min/max along axis) - - create cross-product pairs between anchors - """ - constraints: List[JointAxisConstraint] = [] - links = robot_data.get("links", {}) or {} - - for child_link, child_data in links.items(): - parent_link = child_data.get("parent", None) - if not parent_link: - continue - - if not get_enabled_link_rule(robot_data, child_link, "joint_axis_projection", cfg.joint_axis_enabled): - continue - - joint_axis = get_joint_axis(robot_data, child_link) - if joint_axis is None: - continue - - axis_id = principal_axis_id(joint_axis, threshold=cfg.axis_alignment_threshold) - if axis_id is None: - # Still allow non-principal axes, but keep them with lower confidence: - axis_id = int(np.argmax(np.abs(joint_axis))) - axis_vec = np.zeros(3, dtype=np.float64) - axis_vec[axis_id] = float(np.sign(joint_axis[axis_id]) if abs(joint_axis[axis_id]) > 1e-12 else 1.0) - axis_vec = normalize_vector(axis_vec) - - parent_markers = link_markers.get(parent_link, []) - child_markers = link_markers.get(child_link, []) - if len(parent_markers) == 0 or len(child_markers) == 0: - continue - - max_pairs = max(1, int(cfg.joint_axis_max_pairs)) - parent_anchor_ids = select_anchor_marker_ids(parent_markers, axis=axis_vec, max_count=max_pairs) - child_anchor_ids = select_anchor_marker_ids(child_markers, axis=axis_vec, max_count=max_pairs) - - parent_pos = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in parent_markers} - child_pos = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in child_markers} - - seen: set[Tuple[int, int]] = set() - - for mid_p in parent_anchor_ids: - for mid_c in child_anchor_ids: - if mid_p == mid_c: - continue - key = (mid_p, mid_c) - if key in seen: - continue - seen.add(key) - - delta = child_pos[mid_c] - parent_pos[mid_p] - target = float(np.dot(delta, axis_vec)) - - constraints.append( - JointAxisConstraint( - marker_id_parent=mid_p, - marker_id_child=mid_c, - parent_link=parent_link, - child_link=child_link, - joint_axis=axis_vec, - target_delta_along_axis_m=target, - weight=cfg.joint_axis_weight, - enabled=True, - source="joint_axis_projection", - ) - ) - - return constraints - - -def ancestors_of(link_name: str, parent_map: Dict[str, Optional[str]], max_depth: int) -> List[str]: - out = [] - cur = parent_map.get(link_name, None) - depth = 0 - while cur is not None and depth < max_depth: - out.append(cur) - cur = parent_map.get(cur, None) - depth += 1 - return out - - -def path_axes_consistent( - robot_data: Dict[str, Any], - ancestor: str, - descendant: str, - parent_map: Dict[str, Optional[str]], - threshold: float -) -> Optional[np.ndarray]: - """ - Check whether the chain from ancestor to descendant is consistent with a single - principal axis. Returns the axis vector (unit, sign-preserving) if yes. - """ - # Build path descendant -> ancestor - chain: List[str] = [] - cur = descendant - while cur is not None and cur != ancestor: - chain.append(cur) - cur = parent_map.get(cur, None) - - if cur != ancestor: - return None # not an ancestor - - chain.reverse() # from ancestor child-step to descendant - - # Collect axes on each joint in the path - axes: List[np.ndarray] = [] - for link in chain: - ax = get_joint_axis(robot_data, link) - if ax is None: - return None - axes.append(ax) - - if not axes: - return None - - axis_ids: List[int] = [] - signs: List[float] = [] - for ax in axes: - aid = principal_axis_id(ax, threshold=threshold) - if aid is None: - return None - axis_ids.append(aid) - signs.append(float(np.sign(ax[aid])) if abs(ax[aid]) > 1e-12 else 1.0) - - if len(set(axis_ids)) != 1: - return None - - axis_id = axis_ids[0] - sign = 1.0 if np.sum(signs) >= 0 else -1.0 - axis_vec = np.zeros(3, dtype=np.float64) - axis_vec[axis_id] = sign - return normalize_vector(axis_vec) - - -def compile_chain_axis_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[JointAxisConstraint]: - """ - Ancestor-descendant projection constraints for chains that preserve a stable - principal axis over multiple joints. - - Example: - Board -> Base -> Arm1 -> Ellbow - with all joints x-aligned: - add Board<->Arm1, Board<->Ellbow, Base<->Ellbow, ... - """ - constraints: List[JointAxisConstraint] = [] - parent_map = get_link_parent_map(robot_data) - - links_with_markers = [ln for ln, mk in link_markers.items() if len(mk) > 0] - max_depth = max(1, int(cfg.chain_axis_max_depth)) - max_pairs = max(1, int(cfg.chain_axis_max_pairs)) - - # Cache positions for quick lookup - pos_cache: Dict[int, np.ndarray] = {} - for ln, mk in link_markers.items(): - for m in mk: - pos_cache[int(m["id"])] = np.asarray(m["position_m"], dtype=np.float64) - - for descendant in links_with_markers: - if not get_enabled_link_rule(robot_data, descendant, "chain_axis_projection", cfg.chain_axis_enabled): - continue - - for ancestor in ancestors_of(descendant, parent_map, max_depth=max_depth): - if ancestor == descendant: - continue - - axis_vec = path_axes_consistent( - robot_data=robot_data, - ancestor=ancestor, - descendant=descendant, - parent_map=parent_map, - threshold=cfg.axis_alignment_threshold, - ) - if axis_vec is None: - continue - - ancestor_markers = link_markers.get(ancestor, []) - descendant_markers = link_markers.get(descendant, []) - if len(ancestor_markers) == 0 or len(descendant_markers) == 0: - continue - - anc_anchors = select_anchor_marker_ids(ancestor_markers, axis=axis_vec, max_count=max_pairs) - des_anchors = select_anchor_marker_ids(descendant_markers, axis=axis_vec, max_count=max_pairs) - - seen: set[Tuple[int, int]] = set() - for mid_a in anc_anchors: - for mid_b in des_anchors: - if mid_a == mid_b: - continue - key = (mid_a, mid_b) - if key in seen: - continue - seen.add(key) - - target = float(np.dot(pos_cache[mid_b] - pos_cache[mid_a], axis_vec)) - - constraints.append( - JointAxisConstraint( - marker_id_parent=mid_a, - marker_id_child=mid_b, - parent_link=ancestor, - child_link=descendant, - joint_axis=axis_vec, - target_delta_along_axis_m=target, - weight=cfg.chain_axis_weight, - enabled=True, - source=f"chain_axis_projection:depth{len(ancestors_of(descendant, parent_map, max_depth))}", - ) - ) - - return constraints - - -def compile_constraints( - robot_data: Dict[str, Any], - length_scale: float, - cfg: ConstraintRuleConfig -) -> Tuple[Dict[int, str], Dict[str, List[Dict[str, Any]]], List[Constraint], List[str]]: - """ - Full rule-based constraint compiler. - Returns: - marker_to_link - link_markers - constraints - issues - """ - marker_to_link, link_markers, issues = parse_robot_markers( - robot_data, - length_scale=length_scale, - strict_unique_marker_ids=cfg.strict_unique_marker_ids, - ) - - constraints: List[Constraint] = [] - constraints.extend(compile_rigid_distance_constraints(robot_data, link_markers, cfg)) - constraints.extend(compile_direct_joint_axis_constraints(robot_data, link_markers, cfg)) - constraints.extend(compile_chain_axis_constraints(robot_data, link_markers, cfg)) - - # De-duplicate identical constraints - unique_constraints: List[Constraint] = [] - seen_keys: set[Tuple[Any, ...]] = set() - - for c in constraints: - if isinstance(c, MarkerDistanceConstraint): - key = ("d", min(c.marker_id_a, c.marker_id_b), max(c.marker_id_a, c.marker_id_b), c.link_name, round(c.target_distance_m, 9)) - else: - key = ( - "j", - c.parent_link, - c.child_link, - c.marker_id_parent, - c.marker_id_child, - tuple(np.round(c.joint_axis, 9).tolist()), - round(c.target_delta_along_axis_m, 9), - ) - if key in seen_keys: - continue - seen_keys.add(key) - unique_constraints.append(c) - - return marker_to_link, link_markers, unique_constraints, issues - - -# =================================================================== -# Constraint reporting -# =================================================================== - -def print_constraint_summary(constraints: List[Constraint]) -> None: - num_dist = sum(isinstance(c, MarkerDistanceConstraint) for c in constraints) - num_joint = sum(isinstance(c, JointAxisConstraint) for c in constraints) - print(f"[INFO] Constraint summary: total={len(constraints)} distance={num_dist} joint/chain={num_joint}") - - -def print_constraint_list(constraints: List[Constraint]) -> None: - print("\n[INFO] Constraint list:") - for idx, constraint in enumerate(constraints): - if isinstance(constraint, MarkerDistanceConstraint): - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | " - f"Target={constraint.target_distance_m:.6f} m | " - f"Weight={constraint.weight} | " - f"Source={constraint.source}" - ) - else: - axis_str = np.array2string(constraint.joint_axis, precision=3, suppress_small=True) - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}(M{constraint.marker_id_parent}) -> " - f"{constraint.child_link}(M{constraint.marker_id_child}) | " - f"Axis={axis_str} | " - f"TargetDelta={constraint.target_delta_along_axis_m:.6f} m | " - f"Weight={constraint.weight} | " - f"Source={constraint.source}" - ) - - -def print_constraints_with_errors( - title: str, - constraints: List[Constraint], - positions: Dict[int, np.ndarray], - show_skipped: bool = True -) -> None: - print(f"\n[INFO] {title}") - - active = 0 - skipped = 0 - - for idx, constraint in enumerate(constraints): - if isinstance(constraint, MarkerDistanceConstraint): - if constraint.marker_id_a not in positions or constraint.marker_id_b not in positions: - skipped += 1 - if show_skipped: - print( - f" [{idx:03d}] DISTANCE | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | SKIPPED (missing marker)" - ) - continue - - pos_a = positions[constraint.marker_id_a] - pos_b = positions[constraint.marker_id_b] - actual = float(np.linalg.norm(pos_b - pos_a)) - error = actual - constraint.target_distance_m - active += 1 - - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | " - f"target={constraint.target_distance_m*1000:.2f} mm | " - f"actual={actual*1000:.2f} mm | " - f"error={error*1000:+.2f} mm" - ) - - elif isinstance(constraint, JointAxisConstraint): - if constraint.marker_id_parent not in positions or constraint.marker_id_child not in positions: - skipped += 1 - if show_skipped: - print( - f" [{idx:03d}] JOINT_AXIS | " - f"M{constraint.marker_id_parent} -> M{constraint.marker_id_child} | SKIPPED (missing marker)" - ) - continue - - pos_parent = positions[constraint.marker_id_parent] - pos_child = positions[constraint.marker_id_child] - delta = pos_child - pos_parent - actual = float(np.dot(delta, constraint.joint_axis)) - error = actual - constraint.target_delta_along_axis_m - active += 1 - - axis_str = np.array2string(constraint.joint_axis, precision=2, suppress_small=True) - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}(M{constraint.marker_id_parent}) -> " - f"{constraint.child_link}(M{constraint.marker_id_child}) | " - f"axis={axis_str} | " - f"target={constraint.target_delta_along_axis_m*1000:.2f} mm | " - f"actual={actual*1000:.2f} mm | " - f"error={error*1000:+.2f} mm" - ) - - print(f"[INFO] Active constraints: {active} | Skipped: {skipped}") - - -# =================================================================== -# Multi-view loading -# =================================================================== - -def load_observations_and_poses( - detection_files: List[str], - pose_files: List[str] -) -> Tuple[Dict[int, List[Tuple[int, np.ndarray]]], List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], List[Dict[str, Any]]]: - """Load detections and camera poses.""" - if len(detection_files) != len(pose_files): - raise ValueError(f"Mismatch: {len(detection_files)} detections vs {len(pose_files)} poses") - - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]] = {} - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] = [] - obs_metadata: List[Dict[str, Any]] = [] - - for cam_idx, (det_file, pose_file) in enumerate(zip(detection_files, pose_files)): - det = load_json(det_file) - pose_data = load_json(pose_file) - - cam_section = det.get("camera", {}) or {} - K = np.array(cam_section.get("camera_matrix", []), dtype=np.float64).reshape(3, 3) - D = np.array(cam_section.get("distortion_coefficients", []), dtype=np.float64).reshape(-1, 1) - - pose_section = pose_data.get("camera_pose", {}) or {} - world_to_cam = pose_section.get("world_to_camera", {}) or {} - R_wc = np.array(world_to_cam.get("rotation_matrix", []), dtype=np.float64).reshape(3, 3) - t_wc = np.array(world_to_cam.get("translation_m", []), dtype=np.float64).reshape(3) - - cameras.append((K, D, R_wc, t_wc)) - - detections = det.get("detections", []) or [] - for det_obj in detections: - marker_id = int(det_obj.get("marker_id", -1)) - if marker_id < 0: - continue - - center_px = np.array(det_obj.get("center_px", []), dtype=np.float64) - if center_px.shape != (2,): - continue - - pts = center_px.reshape(1, 1, 2).astype(np.float32) - und = cv2.undistortPoints(pts, K.astype(np.float32), D.astype(np.float32), P=None) - norm_coords = und.reshape(2).astype(np.float64) - - marker_observations.setdefault(marker_id, []).append((cam_idx, norm_coords)) - - obs_metadata.append( - { - "detection_file": det_file, - "pose_file": pose_file, - "num_detections": len(detections), - } - ) - - return marker_observations, cameras, obs_metadata - - -# =================================================================== -# Initial triangulation -# =================================================================== - -def triangulate_marker_initial( - marker_id: int, - observations: List[Tuple[int, np.ndarray]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] -) -> Optional[np.ndarray]: - """ - Triangulate using the best baseline pair among all available observations. - This is more stable than using just the first two views. - """ - if len(observations) < 2: - return None - - best_pair = None - best_baseline = -1.0 - - for (cam_i, _), (cam_j, _) in combinations(observations, 2): - K1, D1, R1, t1 = cameras[cam_i] - K2, D2, R2, t2 = cameras[cam_j] - c1 = camera_center_from_world_to_cam(R1, t1) - c2 = camera_center_from_world_to_cam(R2, t2) - baseline = float(np.linalg.norm(c2 - c1)) - if baseline > best_baseline: - best_baseline = baseline - best_pair = (cam_i, cam_j) - - if best_pair is None: - return None - - cam_i, cam_j = best_pair - norm_coords_i = None - norm_coords_j = None - for ci, coords in observations: - if ci == cam_i: - norm_coords_i = coords - elif ci == cam_j: - norm_coords_j = coords - - if norm_coords_i is None or norm_coords_j is None: - return None - - K1, D1, R1, t1 = cameras[cam_i] - K2, D2, R2, t2 = cameras[cam_j] - - x1_px = K1[0, 0] * norm_coords_i[0] + K1[0, 2] - y1_px = K1[1, 1] * norm_coords_i[1] + K1[1, 2] - x2_px = K2[0, 0] * norm_coords_j[0] + K2[0, 2] - y2_px = K2[1, 1] * norm_coords_j[1] + K2[1, 2] - - P1 = K1 @ np.hstack([R1, t1.reshape(3, 1)]) - P2 = K2 @ np.hstack([R2, t2.reshape(3, 1)]) - - try: - X_h = cv2.triangulatePoints( - P1, - P2, - np.array([[x1_px], [y1_px]], dtype=np.float64), - np.array([[x2_px], [y2_px]], dtype=np.float64), - ) - X = (X_h[:3] / X_h[3]).reshape(3).astype(np.float64) - if not np.all(np.isfinite(X)): - return None - return X - except Exception: - return None - - -def initial_triangulation( - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] -) -> Dict[int, np.ndarray]: - triangulated: Dict[int, np.ndarray] = {} - for marker_id, observations in marker_observations.items(): - X = triangulate_marker_initial(marker_id, observations, cameras) - if X is not None: - triangulated[marker_id] = X - return triangulated - - -# =================================================================== -# Residuals / optimization -# =================================================================== - -def bundle_adjustment_residuals( - marker_positions_flat: np.ndarray, - marker_ids: List[int], - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - constraints: List[Constraint], - lambda_constraint: float = 100.0 -) -> np.ndarray: - marker_dict: Dict[int, np.ndarray] = {} - for i, marker_id in enumerate(marker_ids): - marker_dict[marker_id] = marker_positions_flat[i * 3:(i + 1) * 3] - - residuals: List[float] = [] - - # Reprojection residuals in normalized coordinates - for marker_id, observations in marker_observations.items(): - if marker_id not in marker_dict: - continue - - X_world = marker_dict[marker_id] - for cam_idx, norm_coords_obs in observations: - K, D, R_wc, t_wc = cameras[cam_idx] - X_cam = R_wc @ X_world + t_wc - if X_cam[2] > 1e-6: - proj_norm = X_cam[:2] / X_cam[2] - r = proj_norm - norm_coords_obs - residuals.append(float(r[0])) - residuals.append(float(r[1])) - - # Constraint residuals - for constraint in constraints: - if isinstance(constraint, MarkerDistanceConstraint): - if constraint.marker_id_a in marker_dict and constraint.marker_id_b in marker_dict: - pos_a = marker_dict[constraint.marker_id_a] - pos_b = marker_dict[constraint.marker_id_b] - actual_dist = float(np.linalg.norm(pos_b - pos_a)) - residuals.append( - (actual_dist - constraint.target_distance_m) * constraint.weight * lambda_constraint - ) - - elif isinstance(constraint, JointAxisConstraint): - if constraint.marker_id_parent in marker_dict and constraint.marker_id_child in marker_dict: - pos_parent = marker_dict[constraint.marker_id_parent] - pos_child = marker_dict[constraint.marker_id_child] - delta = pos_child - pos_parent - actual_delta = float(np.dot(delta, constraint.joint_axis)) - residuals.append( - (actual_delta - constraint.target_delta_along_axis_m) * constraint.weight * lambda_constraint - ) - - return np.asarray(residuals, dtype=np.float64) - - -def optimize_with_constraints( - initial_positions: Dict[int, np.ndarray], - marker_observations: Dict[int, List[Tuple[int, np.ndarray]]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - constraints: List[Constraint], - lambda_constraint: float = 100.0, - max_iterations: int = 50 -) -> Dict[int, np.ndarray]: - try: - from scipy.optimize import least_squares - except ImportError: - print("[WARN] scipy not available, skipping optimization.") - return initial_positions - - marker_ids = sorted(initial_positions.keys()) - if not marker_ids: - return {} - - x0 = np.concatenate([initial_positions[mid] for mid in marker_ids]) - - def residuals_fn(x: np.ndarray) -> np.ndarray: - return bundle_adjustment_residuals( - x, marker_ids, marker_observations, cameras, constraints, lambda_constraint - ) - - print(f"[INFO] Starting optimization with {len(x0)} variables and {len(constraints)} constraints...") - - result = least_squares( - residuals_fn, - x0, - max_nfev=max_iterations * max(1, len(marker_ids)), - verbose=1, - ) - - optimized = {} - for i, marker_id in enumerate(marker_ids): - optimized[marker_id] = result.x[i * 3:(i + 1) * 3] - - print(f"[INFO] Optimization complete. Final cost: {float(np.sum(result.fun ** 2)):.6f}") - return optimized - - -# =================================================================== -# Main -# =================================================================== - -def main() -> None: - parser = argparse.ArgumentParser( - description="Multi-view bundle adjustment with rule-based geometric constraints" - ) - parser.add_argument( - "-det", "--detections", - action="append", - required=True, - help="*_aruco_detection.json files" - ) - - parser.add_argument( - "-pose", "--poses", - action="append", - required=True, - help="*_camera_pose.json files" - ) - parser.add_argument( - "-robot", "--robot", - required=True, - help="robot.json" - ) - parser.add_argument( - "-outDir", "--outDir", - default=None, - help="Output directory" - ) - parser.add_argument( - "-lambdaWeight", "--lambdaWeight", - type=float, - default=100.0, - help="Constraint weight multiplier" - ) - parser.add_argument( - "--strictUniqueMarkerIds", - action="store_true", - help="Fail if a marker ID appears more than once in robot.json" - ) - parser.add_argument( - "--showSkippedConstraints", - action="store_true", - help="Print skipped constraints in the report" - ) - parser.add_argument( - "--noShowSkippedConstraints", - action="store_true", - help="Hide skipped constraints in the report" - ) - parser.add_argument( - "--saveConstraintReport", - action="store_true", - help="Save constraint report JSON files" - ) - - args = parser.parse_args() - - if args.showSkippedConstraints and args.noShowSkippedConstraints: - print("[ERROR] Choose only one of --showSkippedConstraints or --noShowSkippedConstraints") - sys.exit(1) - - if len(args.detections) != len(args.poses): - print(f"[ERROR] Mismatch: {len(args.detections)} detection files vs {len(args.poses)} pose files") - sys.exit(1) - - robot_data = load_json(args.robot) - length_scale = get_length_scale(robot_data) - cfg = load_constraint_rule_config(robot_data, args) - - if args.noShowSkippedConstraints: - cfg.show_skipped_constraints = False - elif args.showSkippedConstraints: - cfg.show_skipped_constraints = True - - print("[STEP 1] Compile constraints from robot.json structure...") - marker_to_link, link_markers, constraints, issues = compile_constraints(robot_data, length_scale, cfg) - - for issue in issues: - print(issue) - - print(f"[INFO] Links with markers: {sum(1 for v in link_markers.values() if len(v) > 0)}") - print(f"[INFO] Unique marker IDs: {len(marker_to_link)}") - print_constraint_summary(constraints) - print_constraint_list(constraints) - - print("\n[STEP 2] Load observations and camera poses...") - marker_observations, cameras, obs_metadata = load_observations_and_poses(args.detections, args.poses) - print(f"[INFO] {len(cameras)} cameras, {len(marker_observations)} observed markers") - print(f"[INFO] Detection files loaded: {len(obs_metadata)}") - - print("\n[STEP 3] Initial triangulation...") - initial_pos = initial_triangulation(marker_observations, cameras) - print(f"[INFO] Triangulated {len(initial_pos)} markers") - - out_dir = args.outDir or os.path.dirname(args.detections[0]) or "." - os.makedirs(resolve_path(out_dir), exist_ok=True) - - # Save initial solution - initial_output_markers = [] - for marker_id, position in sorted(initial_pos.items()): - initial_output_markers.append( - { - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown"), - } - ) - - initial_output = { - "schema_version": "1.1", - "stage": "initial_triangulation", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_cameras": len(cameras), - "num_markers": len(initial_pos), - "num_constraints": len(constraints), - }, - "markers": initial_output_markers, - } - - initial_out_file = os.path.join(out_dir, "aruco_positions_initial.json") - save_json(initial_out_file, initial_output) - print(f"[INFO] Initial triangulation saved to {initial_out_file}") - - print_constraints_with_errors( - "Constraint list BEFORE optimization", - constraints, - initial_pos, - show_skipped=cfg.show_skipped_constraints, - ) - - print("\n[STEP 4] Bundle adjustment with constraints...") - optimized_pos = optimize_with_constraints( - initial_pos, - marker_observations, - cameras, - constraints, - lambda_constraint=args.lambdaWeight, - ) - - print_constraints_with_errors( - "Constraint list AFTER optimization", - constraints, - optimized_pos, - show_skipped=cfg.show_skipped_constraints, - ) - - output_markers = [] - for marker_id, position in sorted(optimized_pos.items()): - output_markers.append( - { - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown"), - } - ) - - output = { - "schema_version": "1.1", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_cameras": len(cameras), - "num_markers": len(optimized_pos), - "num_constraints": len(constraints), - }, - "markers": output_markers, - } - - out_file = os.path.join(out_dir, "aruco_positions_optimized.json") - save_json(out_file, output) - print(f"\n[INFO] Saved to {out_file}") - - if args.saveConstraintReport: - report = { - "schema_version": "1.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_constraints": len(constraints), - "num_links_with_markers": sum(1 for v in link_markers.values() if len(v) > 0), - "num_observed_markers": len(marker_observations), - "num_triangulated_markers": len(initial_pos), - "num_optimized_markers": len(optimized_pos), - }, - "constraints": [], - } - for c in constraints: - if isinstance(c, MarkerDistanceConstraint): - report["constraints"].append( - { - "kind": "distance", - "link_name": c.link_name, - "marker_id_a": c.marker_id_a, - "marker_id_b": c.marker_id_b, - "target_distance_m": c.target_distance_m, - "weight": c.weight, - "source": c.source, - } - ) - else: - report["constraints"].append( - { - "kind": "joint_axis", - "parent_link": c.parent_link, - "child_link": c.child_link, - "marker_id_parent": c.marker_id_parent, - "marker_id_child": c.marker_id_child, - "joint_axis": [float(x) for x in c.joint_axis], - "target_delta_along_axis_m": c.target_delta_along_axis_m, - "weight": c.weight, - "source": c.source, - } - ) - report_file = os.path.join(out_dir, "constraint_report.json") - save_json(report_file, report) - print(f"[INFO] Constraint report saved to {report_file}") - - -if __name__ == "__main__": - main() diff --git a/pipeline/3_multiview_bundle_adjustment_v3.py b/pipeline/3_multiview_bundle_adjustment_v3.py deleted file mode 100644 index 7376326..0000000 --- a/pipeline/3_multiview_bundle_adjustment_v3.py +++ /dev/null @@ -1,1466 +0,0 @@ -#!/usr/bin/env python3 -""" -3_multiview_bundle_adjustment_v3.py - -Multi-view ArUco marker position optimization with rule-based geometric constraints. - -Mathematical model ------------------- -We estimate 3D marker positions X_i ∈ R^3 by minimizing a weighted least-squares objective - - E(X) = Σ_i Σ_c w_ic || π_c(X_i) - u_ic ||^2 - + λ_d Σ_j w_j^d || g_j^d(X) ||^2 - + λ_a Σ_k w_k^a || g_k^a(X) ||^2 - -where: -- u_ic are observed normalized image coordinates of marker i in camera c -- π_c(.) is the normalized reprojection model for camera c -- w_ic are observation weights (quality-based) -- g_j^d are rigid-link distance constraints -- g_k^a are joint-axis / chain-axis projection constraints - -Important design choices: -- robot.json is used as a kinematic description, not as a direct source of marker positions. -- constraint families are explicit and switchable. -- marker observation weights are based on available measurement quality cues - (e.g. detection confidence, observed pixel size if present, marker size prior, - and initial range from the camera); orientation information is treated cautiously. -- optimization is single-stage in this version to keep comparisons reproducible. - If a second refinement stage is needed later, it can be added as a separate version. - -Dependencies: - numpy, opencv-python, scipy (optional for optimization) - -Example: - python 3_multiview_bundle_adjustment_v3.py ^ - -det cam1_aruco_detection.json cam2_aruco_detection.json cam3_aruco_detection.json ^ - -pose cam1_camera_pose.json cam2_camera_pose.json cam3_camera_pose.json ^ - -robot robot.json ^ - -lambdaWeight 100.0 -""" - -from __future__ import annotations - -import argparse -import json -import os -import sys -import time -from dataclasses import dataclass -from itertools import combinations -from typing import Any, Dict, List, Optional, Tuple - -import cv2 -import numpy as np - - -# =================================================================== -# Path / JSON helpers -# =================================================================== - -def resolve_path(path: str) -> str: - path = os.path.expanduser(path) - if os.path.isabs(path): - return path - return os.path.abspath(path) - - -def load_json(path: str) -> Dict[str, Any]: - with open(resolve_path(path), "r", encoding="utf-8") as f: - return json.load(f) - - -def save_json(path: str, data: Dict[str, Any]) -> None: - with open(resolve_path(path), "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) - - -# =================================================================== -# Units -# =================================================================== - -def get_length_scale(robot_data: Dict[str, Any]) -> float: - units = robot_data.get("units", {}) or {} - length_unit = str(units.get("length", "")).strip().lower() - if length_unit in ("mm", "millimeter", "millimeters"): - return 1.0 / 1000.0 - if length_unit in ("cm", "centimeter", "centimeters"): - return 1.0 / 100.0 - return 1.0 - - -# =================================================================== -# Small geometry helpers -# =================================================================== - -def safe_norm(v: np.ndarray, eps: float = 1e-12) -> float: - return float(np.linalg.norm(v) + eps) - - -def normalize_vector(v: np.ndarray, eps: float = 1e-12) -> np.ndarray: - return np.asarray(v, dtype=np.float64) / safe_norm(v, eps) - - -def clamp(v: float, lo: float, hi: float) -> float: - return float(max(lo, min(hi, v))) - - -def principal_axis_id(axis: np.ndarray, threshold: float = 0.95) -> Optional[int]: - """Return 0,1,2 for x,y,z if axis is close enough to a principal axis.""" - a = normalize_vector(np.asarray(axis, dtype=np.float64)) - idx = int(np.argmax(np.abs(a))) - if abs(a[idx]) >= threshold: - return idx - return None - - -def camera_center_from_world_to_cam(R_wc: np.ndarray, t_wc: np.ndarray) -> np.ndarray: - """world_to_camera: X_cam = R_wc * X_world + t_wc; camera center is -R^T t.""" - return -R_wc.T @ t_wc - - -def principal_axis_vector(axis: np.ndarray) -> np.ndarray: - """Convert a near-principal axis to an exact signed principal axis vector.""" - a = normalize_vector(axis) - idx = int(np.argmax(np.abs(a))) - out = np.zeros(3, dtype=np.float64) - out[idx] = 1.0 if a[idx] >= 0 else -1.0 - return normalize_vector(out) - - -# =================================================================== -# Configuration -# =================================================================== - -@dataclass -class ConstraintRuleConfig: - rigid_distance_enabled: bool = True - rigid_distance_mode: str = "mst" # mst | star | full - rigid_distance_weight: float = 1.0 - - joint_axis_enabled: bool = True - joint_axis_max_pairs: int = 2 - joint_axis_weight: float = 0.5 - - chain_axis_enabled: bool = True - chain_axis_max_depth: int = 3 - chain_axis_max_pairs: int = 2 - chain_axis_weight: float = 0.3 - - axis_alignment_threshold: float = 0.95 - - strict_unique_marker_ids: bool = False - show_skipped_constraints: bool = True - - enable_observation_weights: bool = True - weight_floor: float = 0.30 - weight_ceiling: float = 3.00 - ref_distance_m: float = 0.75 - ref_marker_size_px: float = 50.0 - use_detection_confidence: bool = True - use_detection_size_px: bool = True - use_initial_range: bool = True - use_marker_size_prior: bool = True - - -def _bool_or_default(value: Any, default: bool) -> bool: - if value is None: - return default - return bool(value) - - -def _float_or_default(value: Any, default: float) -> float: - if value is None: - return default - return float(value) - - -def _int_or_default(value: Any, default: int) -> int: - if value is None: - return default - return int(value) - - -def load_constraint_rule_config(robot_data: Dict[str, Any], args: argparse.Namespace) -> ConstraintRuleConfig: - rules = robot_data.get("constraint_rules", {}) or {} - - cfg = ConstraintRuleConfig() - rigid = rules.get("rigid_distance", {}) or {} - joint = rules.get("joint_axis_projection", {}) or {} - chain = rules.get("chain_axis_projection", {}) or {} - obs = rules.get("observation_weights", {}) or {} - - cfg.rigid_distance_enabled = _bool_or_default(rigid.get("enabled"), cfg.rigid_distance_enabled) - cfg.rigid_distance_mode = str(rigid.get("mode", cfg.rigid_distance_mode)).strip().lower() - cfg.rigid_distance_weight = _float_or_default(rigid.get("weight"), cfg.rigid_distance_weight) - - cfg.joint_axis_enabled = _bool_or_default(joint.get("enabled"), cfg.joint_axis_enabled) - cfg.joint_axis_max_pairs = _int_or_default(joint.get("max_pairs"), cfg.joint_axis_max_pairs) - cfg.joint_axis_weight = _float_or_default(joint.get("weight"), cfg.joint_axis_weight) - - cfg.chain_axis_enabled = _bool_or_default(chain.get("enabled"), cfg.chain_axis_enabled) - cfg.chain_axis_max_depth = _int_or_default(chain.get("max_depth"), cfg.chain_axis_max_depth) - cfg.chain_axis_max_pairs = _int_or_default(chain.get("max_pairs"), cfg.chain_axis_max_pairs) - cfg.chain_axis_weight = _float_or_default(chain.get("weight"), cfg.chain_axis_weight) - - cfg.axis_alignment_threshold = _float_or_default( - rules.get("axis_alignment_threshold"), cfg.axis_alignment_threshold - ) - - cfg.enable_observation_weights = _bool_or_default(obs.get("enabled"), cfg.enable_observation_weights) - cfg.weight_floor = _float_or_default(obs.get("weight_floor"), cfg.weight_floor) - cfg.weight_ceiling = _float_or_default(obs.get("weight_ceiling"), cfg.weight_ceiling) - cfg.ref_distance_m = _float_or_default(obs.get("ref_distance_m"), cfg.ref_distance_m) - cfg.ref_marker_size_px = _float_or_default(obs.get("ref_marker_size_px"), cfg.ref_marker_size_px) - cfg.use_detection_confidence = _bool_or_default(obs.get("use_detection_confidence"), cfg.use_detection_confidence) - cfg.use_detection_size_px = _bool_or_default(obs.get("use_detection_size_px"), cfg.use_detection_size_px) - cfg.use_initial_range = _bool_or_default(obs.get("use_initial_range"), cfg.use_initial_range) - cfg.use_marker_size_prior = _bool_or_default(obs.get("use_marker_size_prior"), cfg.use_marker_size_prior) - - if getattr(args, "strictUniqueMarkerIds", False): - cfg.strict_unique_marker_ids = True - if getattr(args, "showSkippedConstraints", False): - cfg.show_skipped_constraints = True - if getattr(args, "noShowSkippedConstraints", False): - cfg.show_skipped_constraints = False - - return cfg - - -# =================================================================== -# Observation / constraint definitions -# =================================================================== - -@dataclass -class Observation: - cam_idx: int - norm_coords: np.ndarray - meta: Dict[str, Any] - - -@dataclass -class MarkerDistanceConstraint: - marker_id_a: int - marker_id_b: int - link_name: str - target_distance_m: float - weight: float = 1.0 - enabled: bool = True - source: str = "rigid_distance" - - -@dataclass -class JointAxisConstraint: - marker_id_parent: int - marker_id_child: int - parent_link: str - child_link: str - joint_axis: np.ndarray - target_delta_along_axis_m: float - weight: float = 1.0 - enabled: bool = True - source: str = "joint_axis_projection" - - -Constraint = MarkerDistanceConstraint | JointAxisConstraint - - -# =================================================================== -# Robot parsing -# =================================================================== - -def parse_robot_markers( - robot_data: Dict[str, Any], - length_scale: float, - strict_unique_marker_ids: bool = False -) -> Tuple[Dict[int, str], Dict[str, List[Dict[str, Any]]], List[str], Dict[int, Dict[str, Any]]]: - links = robot_data.get("links", {}) or {} - - marker_to_link: Dict[int, str] = {} - link_markers: Dict[str, List[Dict[str, Any]]] = {} - issues: List[str] = [] - marker_meta: Dict[int, Dict[str, Any]] = {} - - seen_global: Dict[int, str] = {} - - for link_name, link_data in links.items(): - markers = link_data.get("markers", []) or [] - collected: List[Dict[str, Any]] = [] - seen_local: set[int] = set() - - for idx, marker in enumerate(markers): - marker_id = int(marker.get("id", -1)) - pos = marker.get("position", None) - - if marker_id < 0 or pos is None or len(pos) != 3: - issues.append(f"[WARN] link={link_name}: skipped invalid marker entry at index {idx}") - continue - - if marker_id in seen_local: - msg = f"[WARN] duplicate marker id {marker_id} inside link '{link_name}'" - if strict_unique_marker_ids: - raise ValueError(msg) - issues.append(msg + " -> skipped duplicate inside same link") - continue - - if marker_id in seen_global: - msg = ( - f"[WARN] duplicate marker id {marker_id} appears in link '{link_name}' " - f"and already in link '{seen_global[marker_id]}'" - ) - if strict_unique_marker_ids: - raise ValueError(msg) - issues.append(msg + " -> skipped duplicate occurrence") - continue - - seen_local.add(marker_id) - seen_global[marker_id] = link_name - - pos_raw = np.array(pos, dtype=np.float64) - pos_m = pos_raw * float(length_scale) - - item = { - "id": marker_id, - "name": marker.get("name", f"marker_{marker_id}"), - "position_raw": pos_raw, - "position_m": pos_m, - "normal": np.array(marker.get("normal", [0, 0, 1]), dtype=np.float64), - "size": marker.get("size", None), - "spin": marker.get("spin", None), - } - collected.append(item) - marker_to_link[marker_id] = link_name - marker_meta[marker_id] = { - "link_name": link_name, - "name": item["name"], - "position_m": pos_m, - "normal": item["normal"], - "size": item["size"], - "spin": item["spin"], - } - - link_markers[link_name] = collected - - return marker_to_link, link_markers, issues, marker_meta - - -def get_link_parent_map(robot_data: Dict[str, Any]) -> Dict[str, Optional[str]]: - links = robot_data.get("links", {}) or {} - return {link_name: (link_data.get("parent", None)) for link_name, link_data in links.items()} - - -def get_joint_info(robot_data: Dict[str, Any], child_link: str) -> Dict[str, Any]: - links = robot_data.get("links", {}) or {} - return (links.get(child_link, {}) or {}).get("jointToParent", {}) or {} - - -def get_joint_axis(robot_data: Dict[str, Any], child_link: str) -> Optional[np.ndarray]: - joint = get_joint_info(robot_data, child_link) - axis = joint.get("axis", None) - if axis is None: - return None - axis = np.asarray(axis, dtype=np.float64) - if safe_norm(axis) < 1e-12: - return None - return normalize_vector(axis) - - -def get_vision_marker_size_default(robot_data: Dict[str, Any]) -> float: - vision = robot_data.get("vision_config", {}) or {} - ms = vision.get("MarkerSize", None) - if ms is None: - return 0.025 - return float(ms) - - -# =================================================================== -# Constraint compilation helpers -# =================================================================== - -def get_enabled_link_rule( - robot_data: Dict[str, Any], - link_name: str, - rule_name: str, - default_enabled: bool = True -) -> bool: - overrides = robot_data.get("constraint_overrides", {}) or {} - link_override = overrides.get(link_name, {}) or {} - rule_override = link_override.get(rule_name, {}) or {} - if "enabled" in rule_override: - return bool(rule_override["enabled"]) - return default_enabled - - -def select_anchor_marker_ids( - markers: List[Dict[str, Any]], - axis: Optional[np.ndarray] = None, - max_count: int = 2 -) -> List[int]: - if not markers: - return [] - if len(markers) == 1: - return [int(markers[0]["id"])] - - ids = [int(m["id"]) for m in markers] - pos = np.stack([np.asarray(m["position_m"], dtype=np.float64) for m in markers], axis=0) - - selected: List[int] = [] - - if axis is not None and safe_norm(axis) > 1e-12: - a = normalize_vector(axis) - proj = pos @ a - min_idx = int(np.argmin(proj)) - max_idx = int(np.argmax(proj)) - selected = [ids[min_idx], ids[max_idx]] - else: - centroid = np.mean(pos, axis=0) - d = np.linalg.norm(pos - centroid, axis=1) - min_idx = int(np.argmin(d)) - max_idx = int(np.argmax(d)) - selected = [ids[min_idx], ids[max_idx]] - - if len(selected) < max_count: - for mid in ids: - if mid not in selected: - selected.append(mid) - if len(selected) >= max_count: - break - - out: List[int] = [] - seen: set[int] = set() - for mid in selected: - if mid not in seen: - seen.add(mid) - out.append(mid) - if len(out) >= max_count: - break - return out - - -def mst_edges_for_link(markers: List[Dict[str, Any]]) -> List[Tuple[int, int]]: - n = len(markers) - if n < 2: - return [] - - ids = [int(m["id"]) for m in markers] - pos = np.stack([np.asarray(m["position_m"], dtype=np.float64) for m in markers], axis=0) - in_tree = np.zeros(n, dtype=bool) - in_tree[0] = True - edges: List[Tuple[int, int]] = [] - dist = np.linalg.norm(pos[:, None, :] - pos[None, :, :], axis=2) - - for _ in range(n - 1): - best = None - best_d = float("inf") - for i in range(n): - if not in_tree[i]: - continue - for j in range(n): - if in_tree[j]: - continue - d = float(dist[i, j]) - if d < best_d: - best_d = d - best = (i, j) - if best is None: - break - i, j = best - in_tree[j] = True - edges.append((ids[i], ids[j])) - return edges - - -def compile_rigid_distance_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[MarkerDistanceConstraint]: - constraints: List[MarkerDistanceConstraint] = [] - - for link_name, markers in link_markers.items(): - if not get_enabled_link_rule(robot_data, link_name, "rigid_distance", cfg.rigid_distance_enabled): - continue - if len(markers) < 2: - continue - - mode = cfg.rigid_distance_mode - if mode == "full": - pairs = [(int(a["id"]), int(b["id"])) for a, b in combinations(markers, 2)] - elif mode == "star": - anchor_ids = select_anchor_marker_ids(markers, axis=None, max_count=1) - anchor_id = anchor_ids[0] - pairs = [] - for m in markers: - mid = int(m["id"]) - if mid != anchor_id: - pairs.append((anchor_id, mid)) - elif mode == "mst": - pairs = mst_edges_for_link(markers) - else: - raise ValueError(f"Unknown rigid_distance_mode='{mode}'. Use mst|star|full.") - - pos_map = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in markers} - seen_pairs: set[Tuple[int, int]] = set() - - for mid_a, mid_b in pairs: - if mid_a == mid_b: - continue - key = tuple(sorted((int(mid_a), int(mid_b)))) - if key in seen_pairs: - continue - seen_pairs.add(key) - - pos_a = pos_map[mid_a] - pos_b = pos_map[mid_b] - target = float(np.linalg.norm(pos_b - pos_a)) - - constraints.append( - MarkerDistanceConstraint( - marker_id_a=mid_a, - marker_id_b=mid_b, - link_name=link_name, - target_distance_m=target, - weight=cfg.rigid_distance_weight, - enabled=True, - source=f"rigid_distance:{mode}", - ) - ) - - return constraints - - -def compile_direct_joint_axis_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[JointAxisConstraint]: - constraints: List[JointAxisConstraint] = [] - links = robot_data.get("links", {}) or {} - - for child_link, child_data in links.items(): - parent_link = child_data.get("parent", None) - if not parent_link: - continue - - if not get_enabled_link_rule(robot_data, child_link, "joint_axis_projection", cfg.joint_axis_enabled): - continue - - joint_axis = get_joint_axis(robot_data, child_link) - if joint_axis is None: - continue - - axis_vec = principal_axis_vector(joint_axis) - - parent_markers = link_markers.get(parent_link, []) - child_markers = link_markers.get(child_link, []) - if len(parent_markers) == 0 or len(child_markers) == 0: - continue - - max_pairs = max(1, int(cfg.joint_axis_max_pairs)) - parent_anchor_ids = select_anchor_marker_ids(parent_markers, axis=axis_vec, max_count=max_pairs) - child_anchor_ids = select_anchor_marker_ids(child_markers, axis=axis_vec, max_count=max_pairs) - - parent_pos = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in parent_markers} - child_pos = {int(m["id"]): np.asarray(m["position_m"], dtype=np.float64) for m in child_markers} - - seen: set[Tuple[int, int]] = set() - for mid_p in parent_anchor_ids: - for mid_c in child_anchor_ids: - if mid_p == mid_c: - continue - key = (mid_p, mid_c) - if key in seen: - continue - seen.add(key) - - delta = child_pos[mid_c] - parent_pos[mid_p] - target = float(np.dot(delta, axis_vec)) - - constraints.append( - JointAxisConstraint( - marker_id_parent=mid_p, - marker_id_child=mid_c, - parent_link=parent_link, - child_link=child_link, - joint_axis=axis_vec, - target_delta_along_axis_m=target, - weight=cfg.joint_axis_weight, - enabled=True, - source="joint_axis_projection", - ) - ) - - return constraints - - -def ancestors_of(link_name: str, parent_map: Dict[str, Optional[str]], max_depth: int) -> List[str]: - out = [] - cur = parent_map.get(link_name, None) - depth = 0 - while cur is not None and depth < max_depth: - out.append(cur) - cur = parent_map.get(cur, None) - depth += 1 - return out - - -def path_axes_consistent( - robot_data: Dict[str, Any], - ancestor: str, - descendant: str, - parent_map: Dict[str, Optional[str]], - threshold: float -) -> Optional[np.ndarray]: - chain: List[str] = [] - cur = descendant - while cur is not None and cur != ancestor: - chain.append(cur) - cur = parent_map.get(cur, None) - - if cur != ancestor: - return None - - chain.reverse() - axes: List[np.ndarray] = [] - for link in chain: - ax = get_joint_axis(robot_data, link) - if ax is None: - return None - axes.append(ax) - - if not axes: - return None - - axis_ids: List[int] = [] - signs: List[float] = [] - for ax in axes: - aid = principal_axis_id(ax, threshold=threshold) - if aid is None: - return None - axis_ids.append(aid) - signs.append(float(np.sign(ax[aid])) if abs(ax[aid]) > 1e-12 else 1.0) - - if len(set(axis_ids)) != 1: - return None - - axis_id = axis_ids[0] - sign = 1.0 if np.sum(signs) >= 0 else -1.0 - axis_vec = np.zeros(3, dtype=np.float64) - axis_vec[axis_id] = sign - return normalize_vector(axis_vec) - - -def compile_chain_axis_constraints( - robot_data: Dict[str, Any], - link_markers: Dict[str, List[Dict[str, Any]]], - cfg: ConstraintRuleConfig -) -> List[JointAxisConstraint]: - constraints: List[JointAxisConstraint] = [] - parent_map = get_link_parent_map(robot_data) - - links_with_markers = [ln for ln, mk in link_markers.items() if len(mk) > 0] - max_depth = max(1, int(cfg.chain_axis_max_depth)) - max_pairs = max(1, int(cfg.chain_axis_max_pairs)) - - pos_cache: Dict[int, np.ndarray] = {} - for mk in link_markers.values(): - for m in mk: - pos_cache[int(m["id"])] = np.asarray(m["position_m"], dtype=np.float64) - - for descendant in links_with_markers: - if not get_enabled_link_rule(robot_data, descendant, "chain_axis_projection", cfg.chain_axis_enabled): - continue - - for ancestor in ancestors_of(descendant, parent_map, max_depth=max_depth): - if ancestor == descendant: - continue - - axis_vec = path_axes_consistent( - robot_data=robot_data, - ancestor=ancestor, - descendant=descendant, - parent_map=parent_map, - threshold=cfg.axis_alignment_threshold, - ) - if axis_vec is None: - continue - - ancestor_markers = link_markers.get(ancestor, []) - descendant_markers = link_markers.get(descendant, []) - if len(ancestor_markers) == 0 or len(descendant_markers) == 0: - continue - - anc_anchors = select_anchor_marker_ids(ancestor_markers, axis=axis_vec, max_count=max_pairs) - des_anchors = select_anchor_marker_ids(descendant_markers, axis=axis_vec, max_count=max_pairs) - - seen: set[Tuple[int, int]] = set() - for mid_a in anc_anchors: - for mid_b in des_anchors: - if mid_a == mid_b: - continue - key = (mid_a, mid_b) - if key in seen: - continue - seen.add(key) - - target = float(np.dot(pos_cache[mid_b] - pos_cache[mid_a], axis_vec)) - constraints.append( - JointAxisConstraint( - marker_id_parent=mid_a, - marker_id_child=mid_b, - parent_link=ancestor, - child_link=descendant, - joint_axis=axis_vec, - target_delta_along_axis_m=target, - weight=cfg.chain_axis_weight, - enabled=True, - source=f"chain_axis_projection:depth{len(ancestors_of(descendant, parent_map, max_depth))}", - ) - ) - - return constraints - - -def compile_constraints( - robot_data: Dict[str, Any], - length_scale: float, - cfg: ConstraintRuleConfig -) -> Tuple[Dict[int, str], Dict[str, List[Dict[str, Any]]], List[Constraint], List[str], Dict[int, Dict[str, Any]]]: - marker_to_link, link_markers, issues, marker_meta = parse_robot_markers( - robot_data, - length_scale=length_scale, - strict_unique_marker_ids=cfg.strict_unique_marker_ids, - ) - - constraints: List[Constraint] = [] - constraints.extend(compile_rigid_distance_constraints(robot_data, link_markers, cfg)) - constraints.extend(compile_direct_joint_axis_constraints(robot_data, link_markers, cfg)) - constraints.extend(compile_chain_axis_constraints(robot_data, link_markers, cfg)) - - unique_constraints: List[Constraint] = [] - seen_keys: set[Tuple[Any, ...]] = set() - - for c in constraints: - if isinstance(c, MarkerDistanceConstraint): - key = ( - "d", - min(c.marker_id_a, c.marker_id_b), - max(c.marker_id_a, c.marker_id_b), - c.link_name, - round(c.target_distance_m, 9), - ) - else: - key = ( - "j", - c.parent_link, - c.child_link, - c.marker_id_parent, - c.marker_id_child, - tuple(np.round(c.joint_axis, 9).tolist()), - round(c.target_delta_along_axis_m, 9), - ) - if key in seen_keys: - continue - seen_keys.add(key) - unique_constraints.append(c) - - return marker_to_link, link_markers, unique_constraints, issues, marker_meta - - -# =================================================================== -# Observation quality / weighting -# =================================================================== - -def _optional_float(meta: Dict[str, Any], keys: List[str]) -> Optional[float]: - for k in keys: - if k in meta and meta[k] is not None: - try: - return float(meta[k]) - except Exception: - pass - return None - - -def detection_quality_from_metadata(det_obj: Dict[str, Any], cfg: ConstraintRuleConfig) -> float: - q = 1.0 - - if cfg.use_detection_confidence: - conf = _optional_float(det_obj, ["confidence", "score", "quality", "det_confidence"]) - if conf is not None: - q *= clamp(conf, 0.1, 1.0) - - if cfg.use_detection_size_px: - size_px = _optional_float(det_obj, ["size_px", "marker_size_px", "side_px", "side_length_px"]) - if size_px is None and "corners_px" in det_obj and isinstance(det_obj["corners_px"], list): - try: - corners = np.asarray(det_obj["corners_px"], dtype=np.float64).reshape(-1, 2) - if len(corners) >= 4: - edges = [] - for i in range(len(corners)): - p = corners[i] - q2 = corners[(i + 1) % len(corners)] - edges.append(float(np.linalg.norm(q2 - p))) - size_px = float(np.mean(edges)) - except Exception: - size_px = None - if size_px is not None: - q *= clamp(size_px / max(cfg.ref_marker_size_px, 1e-6), 0.25, 3.0) - - sharpness = _optional_float(det_obj, ["sharpness", "corner_sharpness"]) - if sharpness is not None: - q *= clamp(sharpness / 2500.0, 0.5, 1.5) - - normal_alignment = _optional_float(det_obj, ["normal_alignment", "view_cosine", "cos_to_camera"]) - if normal_alignment is not None: - q *= clamp(normal_alignment, 0.3, 1.0) - - return float(q) - - -def marker_size_prior_factor(marker_meta: Dict[str, Any], default_marker_size_m: float) -> float: - size_val = marker_meta.get("size", None) - if size_val is None: - return 1.0 - - try: - size_val = float(size_val) - except Exception: - return 1.0 - - size_m = size_val / 1000.0 if size_val > 1.0 else size_val - ref = max(default_marker_size_m, 1e-6) - return clamp(size_m / ref, 0.7, 1.3) - - -def compute_observation_weights( - marker_observations: Dict[int, List[Observation]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - initial_positions: Dict[int, np.ndarray], - marker_meta: Dict[int, Dict[str, Any]], - cfg: ConstraintRuleConfig, - robot_data: Dict[str, Any] -) -> Dict[Tuple[int, int], float]: - weights: Dict[Tuple[int, int], float] = {} - default_marker_size_m = get_vision_marker_size_default(robot_data) - - for marker_id, obs_list in marker_observations.items(): - X = initial_positions.get(marker_id, None) - size_prior = marker_size_prior_factor(marker_meta.get(marker_id, {}), default_marker_size_m) - - for obs_idx, obs in enumerate(obs_list): - w = 1.0 - q = detection_quality_from_metadata(obs.meta, cfg) - w *= q - - if cfg.use_marker_size_prior: - w *= size_prior - - if cfg.use_initial_range and X is not None: - _, _, R_wc, t_wc = cameras[obs.cam_idx] - C = camera_center_from_world_to_cam(R_wc, t_wc) - dist = float(np.linalg.norm(X - C)) - if np.isfinite(dist): - w *= clamp(cfg.ref_distance_m / max(dist, 1e-6), 0.4, 2.0) - - weights[(marker_id, obs_idx)] = clamp(w, cfg.weight_floor, cfg.weight_ceiling) - - return weights - - -# =================================================================== -# Multi-view loading -# =================================================================== - -def load_observations_and_poses( - detection_files: List[str], - pose_files: List[str] -) -> Tuple[ - Dict[int, List[Observation]], - List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - List[Dict[str, Any]] -]: - if len(detection_files) != len(pose_files): - raise ValueError(f"Mismatch: {len(detection_files)} detections vs {len(pose_files)} poses") - - marker_observations: Dict[int, List[Observation]] = {} - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] = [] - obs_metadata: List[Dict[str, Any]] = [] - - for cam_idx, (det_file, pose_file) in enumerate(zip(detection_files, pose_files)): - det = load_json(det_file) - pose_data = load_json(pose_file) - - cam_section = det.get("camera", {}) or {} - K = np.array(cam_section.get("camera_matrix", []), dtype=np.float64).reshape(3, 3) - D = np.array(cam_section.get("distortion_coefficients", []), dtype=np.float64).reshape(-1, 1) - - pose_section = pose_data.get("camera_pose", {}) or {} - world_to_cam = pose_section.get("world_to_camera", {}) or {} - R_wc = np.array(world_to_cam.get("rotation_matrix", []), dtype=np.float64).reshape(3, 3) - t_wc = np.array(world_to_cam.get("translation_m", []), dtype=np.float64).reshape(3) - - cameras.append((K, D, R_wc, t_wc)) - - detections = det.get("detections", []) or [] - for det_obj in detections: - marker_id = int(det_obj.get("marker_id", -1)) - if marker_id < 0: - continue - - center_px = np.array(det_obj.get("center_px", []), dtype=np.float64) - if center_px.shape != (2,): - continue - - pts = center_px.reshape(1, 1, 2).astype(np.float32) - und = cv2.undistortPoints(pts, K.astype(np.float32), D.astype(np.float32), P=None) - norm_coords = und.reshape(2).astype(np.float64) - - obs = Observation(cam_idx=cam_idx, norm_coords=norm_coords, meta=dict(det_obj)) - marker_observations.setdefault(marker_id, []).append(obs) - - obs_metadata.append( - { - "detection_file": det_file, - "pose_file": pose_file, - "num_detections": len(detections), - } - ) - - return marker_observations, cameras, obs_metadata - - -# =================================================================== -# Initial triangulation -# =================================================================== - -def triangulate_marker_initial( - marker_id: int, - observations: List[Observation], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] -) -> Optional[np.ndarray]: - if len(observations) < 2: - return None - - best_pair = None - best_baseline = -1.0 - - for obs_i, obs_j in combinations(observations, 2): - cam_i, cam_j = obs_i.cam_idx, obs_j.cam_idx - _, _, R1, t1 = cameras[cam_i] - _, _, R2, t2 = cameras[cam_j] - c1 = camera_center_from_world_to_cam(R1, t1) - c2 = camera_center_from_world_to_cam(R2, t2) - baseline = float(np.linalg.norm(c2 - c1)) - if baseline > best_baseline: - best_baseline = baseline - best_pair = (obs_i, obs_j) - - if best_pair is None: - return None - - obs_i, obs_j = best_pair - cam_i, cam_j = obs_i.cam_idx, obs_j.cam_idx - norm_coords_i = obs_i.norm_coords - norm_coords_j = obs_j.norm_coords - - K1, D1, R1, t1 = cameras[cam_i] - K2, D2, R2, t2 = cameras[cam_j] - - x1_px = K1[0, 0] * norm_coords_i[0] + K1[0, 2] - y1_px = K1[1, 1] * norm_coords_i[1] + K1[1, 2] - x2_px = K2[0, 0] * norm_coords_j[0] + K2[0, 2] - y2_px = K2[1, 1] * norm_coords_j[1] + K2[1, 2] - - P1 = K1 @ np.hstack([R1, t1.reshape(3, 1)]) - P2 = K2 @ np.hstack([R2, t2.reshape(3, 1)]) - - try: - X_h = cv2.triangulatePoints( - P1, - P2, - np.array([[x1_px], [y1_px]], dtype=np.float64), - np.array([[x2_px], [y2_px]], dtype=np.float64), - ) - X = (X_h[:3] / X_h[3]).reshape(3).astype(np.float64) - if not np.all(np.isfinite(X)): - return None - return X - except Exception: - return None - - -def initial_triangulation( - marker_observations: Dict[int, List[Observation]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] -) -> Dict[int, np.ndarray]: - triangulated: Dict[int, np.ndarray] = {} - for marker_id, observations in marker_observations.items(): - X = triangulate_marker_initial(marker_id, observations, cameras) - if X is not None: - triangulated[marker_id] = X - return triangulated - - -# =================================================================== -# Weighted residuals / optimization -# =================================================================== - -def bundle_adjustment_residuals( - marker_positions_flat: np.ndarray, - marker_ids: List[int], - marker_observations: Dict[int, List[Observation]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - constraints: List[Constraint], - obs_weights: Dict[Tuple[int, int], float], - lambda_constraint: float = 100.0 -) -> np.ndarray: - marker_dict: Dict[int, np.ndarray] = {} - for i, marker_id in enumerate(marker_ids): - marker_dict[marker_id] = marker_positions_flat[i * 3:(i + 1) * 3] - - residuals: List[float] = [] - - for marker_id, observations in marker_observations.items(): - if marker_id not in marker_dict: - continue - - X_world = marker_dict[marker_id] - for obs_idx, obs in enumerate(observations): - cam_idx, norm_coords_obs = obs.cam_idx, obs.norm_coords - K, D, R_wc, t_wc = cameras[cam_idx] - X_cam = R_wc @ X_world + t_wc - if X_cam[2] > 1e-6: - proj_norm = X_cam[:2] / X_cam[2] - r = proj_norm - norm_coords_obs - w = float(np.sqrt(obs_weights.get((marker_id, obs_idx), 1.0))) - residuals.append(w * float(r[0])) - residuals.append(w * float(r[1])) - - for constraint in constraints: - if isinstance(constraint, MarkerDistanceConstraint): - if constraint.marker_id_a in marker_dict and constraint.marker_id_b in marker_dict: - pos_a = marker_dict[constraint.marker_id_a] - pos_b = marker_dict[constraint.marker_id_b] - actual_dist = float(np.linalg.norm(pos_b - pos_a)) - residuals.append((actual_dist - constraint.target_distance_m) * constraint.weight * lambda_constraint) - - elif isinstance(constraint, JointAxisConstraint): - if constraint.marker_id_parent in marker_dict and constraint.marker_id_child in marker_dict: - pos_parent = marker_dict[constraint.marker_id_parent] - pos_child = marker_dict[constraint.marker_id_child] - delta = pos_child - pos_parent - actual_delta = float(np.dot(delta, constraint.joint_axis)) - residuals.append((actual_delta - constraint.target_delta_along_axis_m) * constraint.weight * lambda_constraint) - - return np.asarray(residuals, dtype=np.float64) - - -def optimize_with_constraints( - initial_positions: Dict[int, np.ndarray], - marker_observations: Dict[int, List[Observation]], - cameras: List[Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]], - constraints: List[Constraint], - obs_weights: Dict[Tuple[int, int], float], - lambda_constraint: float = 100.0, - max_iterations: int = 50 -) -> Dict[int, np.ndarray]: - try: - from scipy.optimize import least_squares - except ImportError: - print("[WARN] scipy not available, skipping optimization.") - return initial_positions - - marker_ids = sorted(initial_positions.keys()) - if not marker_ids: - return {} - - x0 = np.concatenate([initial_positions[mid] for mid in marker_ids]) - - def residuals_fn(x: np.ndarray) -> np.ndarray: - return bundle_adjustment_residuals( - x, marker_ids, marker_observations, cameras, constraints, obs_weights, lambda_constraint - ) - - print(f"[INFO] Starting optimization with {len(x0)} variables and {len(constraints)} constraints...") - - result = least_squares( - residuals_fn, - x0, - max_nfev=max_iterations * max(1, len(marker_ids)), - verbose=1, - ) - - optimized = {} - for i, marker_id in enumerate(marker_ids): - optimized[marker_id] = result.x[i * 3:(i + 1) * 3] - - print(f"[INFO] Optimization complete. Final cost: {float(np.sum(result.fun ** 2)):.6f}") - return optimized - - -# =================================================================== -# Reporting helpers -# =================================================================== - -def print_constraint_summary(constraints: List[Constraint]) -> None: - num_dist = sum(isinstance(c, MarkerDistanceConstraint) for c in constraints) - num_joint = sum(isinstance(c, JointAxisConstraint) for c in constraints) - print(f"[INFO] Constraint summary: total={len(constraints)} distance={num_dist} joint/chain={num_joint}") - - -def print_constraint_list(constraints: List[Constraint]) -> None: - print("\n[INFO] Constraint list:") - for idx, constraint in enumerate(constraints): - if isinstance(constraint, MarkerDistanceConstraint): - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | " - f"Target={constraint.target_distance_m:.6f} m | " - f"Weight={constraint.weight} | " - f"Source={constraint.source}" - ) - else: - axis_str = np.array2string(constraint.joint_axis, precision=3, suppress_small=True) - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}(M{constraint.marker_id_parent}) -> " - f"{constraint.child_link}(M{constraint.marker_id_child}) | " - f"Axis={axis_str} | " - f"TargetDelta={constraint.target_delta_along_axis_m:.6f} m | " - f"Weight={constraint.weight} | " - f"Source={constraint.source}" - ) - - -def print_constraints_with_errors( - title: str, - constraints: List[Constraint], - positions: Dict[int, np.ndarray], - show_skipped: bool = True -) -> None: - print(f"\n[INFO] {title}") - - active = 0 - skipped = 0 - - for idx, constraint in enumerate(constraints): - if isinstance(constraint, MarkerDistanceConstraint): - if constraint.marker_id_a not in positions or constraint.marker_id_b not in positions: - skipped += 1 - if show_skipped: - print( - f" [{idx:03d}] DISTANCE | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | SKIPPED (missing marker)" - ) - continue - - pos_a = positions[constraint.marker_id_a] - pos_b = positions[constraint.marker_id_b] - actual = float(np.linalg.norm(pos_b - pos_a)) - error = actual - constraint.target_distance_m - active += 1 - - print( - f" [{idx:03d}] DISTANCE | " - f"Link='{constraint.link_name}' | " - f"M{constraint.marker_id_a} <-> M{constraint.marker_id_b} | " - f"target={constraint.target_distance_m*1000:.2f} mm | " - f"actual={actual*1000:.2f} mm | " - f"error={error*1000:+.2f} mm" - ) - - elif isinstance(constraint, JointAxisConstraint): - if constraint.marker_id_parent not in positions or constraint.marker_id_child not in positions: - skipped += 1 - if show_skipped: - print( - f" [{idx:03d}] JOINT_AXIS | " - f"M{constraint.marker_id_parent} -> M{constraint.marker_id_child} | SKIPPED (missing marker)" - ) - continue - - pos_parent = positions[constraint.marker_id_parent] - pos_child = positions[constraint.marker_id_child] - delta = pos_child - pos_parent - actual = float(np.dot(delta, constraint.joint_axis)) - error = actual - constraint.target_delta_along_axis_m - active += 1 - - axis_str = np.array2string(constraint.joint_axis, precision=2, suppress_small=True) - print( - f" [{idx:03d}] JOINT_AXIS | " - f"{constraint.parent_link}(M{constraint.marker_id_parent}) -> " - f"{constraint.child_link}(M{constraint.marker_id_child}) | " - f"axis={axis_str} | " - f"target={constraint.target_delta_along_axis_m*1000:.2f} mm | " - f"actual={actual*1000:.2f} mm | " - f"error={error*1000:+.2f} mm" - ) - - print(f"[INFO] Active constraints: {active} | Skipped: {skipped}") - - -def print_observation_weight_summary(obs_weights: Dict[Tuple[int, int], float]) -> None: - if not obs_weights: - print("[INFO] Observation weighting: disabled or empty") - return - values = np.array(list(obs_weights.values()), dtype=np.float64) - print( - "[INFO] Observation weights: " - f"min={values.min():.3f} mean={values.mean():.3f} " - f"median={np.median(values):.3f} max={values.max():.3f}" - ) - - -# =================================================================== -# Main -# =================================================================== - -def main() -> None: - parser = argparse.ArgumentParser( - description="Multi-view bundle adjustment with rule-based geometric constraints" - ) - parser.add_argument( - "-det", "--detections", - action="append", - required=True, - help="*_aruco_detection.json files" - ) - parser.add_argument( - "-pose", "--poses", - action="append", - required=True, - help="*_camera_pose.json files" - ) - parser.add_argument( - "-robot", "--robot", - required=True, - help="robot.json" - ) - parser.add_argument( - "-outDir", "--outDir", - default=None, - help="Output directory" - ) - parser.add_argument( - "-lambdaWeight", "--lambdaWeight", - type=float, - default=100.0, - help="Constraint weight multiplier" - ) - parser.add_argument( - "--strictUniqueMarkerIds", - action="store_true", - help="Fail if a marker ID appears more than once in robot.json" - ) - parser.add_argument( - "--showSkippedConstraints", - action="store_true", - help="Print skipped constraints in the report" - ) - parser.add_argument( - "--noShowSkippedConstraints", - action="store_true", - help="Hide skipped constraints in the report" - ) - parser.add_argument( - "--saveConstraintReport", - action="store_true", - help="Save constraint report JSON files" - ) - parser.add_argument( - "--saveObservationWeightReport", - action="store_true", - help="Save observation-weight report JSON file" - ) - - args = parser.parse_args() - - if args.showSkippedConstraints and args.noShowSkippedConstraints: - print("[ERROR] Choose only one of --showSkippedConstraints or --noShowSkippedConstraints") - sys.exit(1) - - if len(args.detections) != len(args.poses): - print(f"[ERROR] Mismatch: {len(args.detections)} detection files vs {len(args.poses)} pose files") - sys.exit(1) - - robot_data = load_json(args.robot) - length_scale = get_length_scale(robot_data) - cfg = load_constraint_rule_config(robot_data, args) - - print("[STEP 1] Compile constraints from robot.json structure...") - marker_to_link, link_markers, constraints, issues, marker_meta = compile_constraints(robot_data, length_scale, cfg) - - for issue in issues: - print(issue) - - print(f"[INFO] Links with markers: {sum(1 for v in link_markers.values() if len(v) > 0)}") - print(f"[INFO] Unique marker IDs: {len(marker_to_link)}") - print_constraint_summary(constraints) - print_constraint_list(constraints) - - print("\n[STEP 2] Load observations and camera poses...") - marker_observations, cameras, obs_metadata = load_observations_and_poses(args.detections, args.poses) - print(f"[INFO] {len(cameras)} cameras, {len(marker_observations)} observed markers") - print(f"[INFO] Detection files loaded: {len(obs_metadata)}") - - print("\n[STEP 3] Initial triangulation...") - initial_pos = initial_triangulation(marker_observations, cameras) - print(f"[INFO] Triangulated {len(initial_pos)} markers") - - out_dir = args.outDir or os.path.dirname(args.detections[0]) or "." - os.makedirs(resolve_path(out_dir), exist_ok=True) - - initial_output_markers = [] - for marker_id, position in sorted(initial_pos.items()): - initial_output_markers.append( - { - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown"), - } - ) - - initial_output = { - "schema_version": "1.2", - "stage": "initial_triangulation", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_cameras": len(cameras), - "num_markers": len(initial_pos), - "num_constraints": len(constraints), - }, - "markers": initial_output_markers, - } - initial_out_file = os.path.join(out_dir, "aruco_positions_initial.json") - save_json(initial_out_file, initial_output) - print(f"[INFO] Initial triangulation saved to {initial_out_file}") - - obs_weights = compute_observation_weights( - marker_observations=marker_observations, - cameras=cameras, - initial_positions=initial_pos, - marker_meta=marker_meta, - cfg=cfg, - robot_data=robot_data, - ) - print_observation_weight_summary(obs_weights) - - print_constraints_with_errors( - "Constraint list BEFORE optimization", - constraints, - initial_pos, - show_skipped=cfg.show_skipped_constraints, - ) - - print("\n[STEP 4] Bundle adjustment with constraints...") - optimized_pos = optimize_with_constraints( - initial_pos, - marker_observations, - cameras, - constraints, - obs_weights, - lambda_constraint=args.lambdaWeight, - ) - - print_constraints_with_errors( - "Constraint list AFTER optimization", - constraints, - optimized_pos, - show_skipped=cfg.show_skipped_constraints, - ) - - output_markers = [] - for marker_id, position in sorted(optimized_pos.items()): - output_markers.append( - { - "marker_id": int(marker_id), - "position_m": [float(x) for x in position], - "position_mm": [float(x * 1000.0) for x in position], - "link": marker_to_link.get(marker_id, "unknown"), - } - ) - - output = { - "schema_version": "1.2", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_cameras": len(cameras), - "num_markers": len(optimized_pos), - "num_constraints": len(constraints), - }, - "markers": output_markers, - } - out_file = os.path.join(out_dir, "aruco_positions_optimized.json") - save_json(out_file, output) - print(f"\n[INFO] Saved to {out_file}") - - if args.saveConstraintReport: - report = { - "schema_version": "1.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_constraints": len(constraints), - "num_links_with_markers": sum(1 for v in link_markers.values() if len(v) > 0), - "num_observed_markers": len(marker_observations), - "num_triangulated_markers": len(initial_pos), - "num_optimized_markers": len(optimized_pos), - }, - "constraints": [], - } - for c in constraints: - if isinstance(c, MarkerDistanceConstraint): - report["constraints"].append( - { - "kind": "distance", - "link_name": c.link_name, - "marker_id_a": c.marker_id_a, - "marker_id_b": c.marker_id_b, - "target_distance_m": c.target_distance_m, - "weight": c.weight, - "source": c.source, - } - ) - else: - report["constraints"].append( - { - "kind": "joint_axis", - "parent_link": c.parent_link, - "child_link": c.child_link, - "marker_id_parent": c.marker_id_parent, - "marker_id_child": c.marker_id_child, - "joint_axis": [float(x) for x in c.joint_axis], - "target_delta_along_axis_m": c.target_delta_along_axis_m, - "weight": c.weight, - "source": c.source, - } - ) - report_file = os.path.join(out_dir, "constraint_report.json") - save_json(report_file, report) - print(f"[INFO] Constraint report saved to {report_file}") - - if args.saveObservationWeightReport: - obs_report = { - "schema_version": "1.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "summary": { - "num_weighted_observations": len(obs_weights), - }, - "observation_weights": [ - { - "marker_id": int(mid), - "observation_index": int(obs_idx), - "weight": float(w), - } - for (mid, obs_idx), w in sorted(obs_weights.items()) - ], - } - obs_file = os.path.join(out_dir, "observation_weight_report.json") - save_json(obs_file, obs_report) - print(f"[INFO] Observation-weight report saved to {obs_file}") - - -if __name__ == "__main__": - main() diff --git a/pipeline/4_robotState_estimation_v4_seq.py b/pipeline/4_robotState_estimation_v4_seq.py deleted file mode 100644 index d72dcf5..0000000 --- a/pipeline/4_robotState_estimation_v4_seq.py +++ /dev/null @@ -1,1182 +0,0 @@ -#!/usr/bin/env python3 -""" -4_robotState_estimation_v2.py - -Sequential robot-state estimation from optimized 3D ArUco marker positions. - -Mathematical idea ------------------ -This script estimates a robot state q from already optimized marker positions p_i^obs. - -The robot state consists of: - - a world pose for the root link (translation + rotation) - - one scalar variable for each actuated joint - -Forward kinematics predicts each marker position: - p_i^pred(q) = T_world(link(i); q) * p_i^local - -Instead of solving the whole robot at once, we solve it sequentially by kinematic prefix: - stage 0: root link - stage 1: root + first child layer - stage 2: root + first three connected elements ... - ... -Each stage reuses the previous solution as initialization and only activates the -joint variables that belong to the current kinematic prefix. - -The residual minimized at each stage is: - sum_i w_i ||p_i^pred(q) - p_i^obs||^2 - + weak priors on the active joint values - + weak prior on the root pose - -This is intentionally conservative and debuggable. It is designed so that: - - early links can be resolved first, - - later links only refine an already plausible state, - - one visible marker on an early rigid prefix can already fix a lot of state, - - ambiguous branches can later be resolved by adding more links. - -Optional future extension: - raw detections + camera poses can be added later as visibility / normal cues, - but this script intentionally works directly from aruco_positions_optimized*.json. - -Dependencies ------------- -numpy, scipy (optional but strongly recommended) -""" - -from __future__ import annotations - -import argparse -import json -import math -import os -import sys -import time -from dataclasses import dataclass -from typing import Any, Dict, List, Optional, Tuple - -import numpy as np - - -# ============================================================================= -# JSON / path helpers -# ============================================================================= - -def resolve_path(path: str) -> str: - path = os.path.expanduser(path) - if os.path.isabs(path): - return path - return os.path.abspath(path) - - -def load_json(path: str) -> Any: - with open(resolve_path(path), "r", encoding="utf-8") as f: - return json.load(f) - - -def save_json(path: str, data: Any) -> None: - with open(resolve_path(path), "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) - - -# ============================================================================= -# Small math helpers -# ============================================================================= - -def safe_norm(v: np.ndarray, eps: float = 1e-12) -> float: - return float(np.linalg.norm(v) + eps) - - -def normalize(v: np.ndarray, eps: float = 1e-12) -> np.ndarray: - v = np.asarray(v, dtype=np.float64) - return v / safe_norm(v, eps) - - -def get_length_scale(robot_data: Dict[str, Any]) -> float: - units = robot_data.get("units", {}) or {} - length_unit = str(units.get("length", "")).strip().lower() - if length_unit in ("mm", "millimeter", "millimeters"): - return 1.0 / 1000.0 - if length_unit in ("cm", "centimeter", "centimeters"): - return 1.0 / 100.0 - return 1.0 - - -def rotation_matrix_xyz(rx: float, ry: float, rz: float, degrees: bool = False) -> np.ndarray: - """Rotation order: X then Y then Z.""" - if degrees: - rx, ry, rz = math.radians(rx), math.radians(ry), math.radians(rz) - - cx, sx = math.cos(rx), math.sin(rx) - cy, sy = math.cos(ry), math.sin(ry) - cz, sz = math.cos(rz), math.sin(rz) - - rx_m = np.array([[1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx]], dtype=np.float64) - ry_m = np.array([[cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy]], dtype=np.float64) - rz_m = np.array([[cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0]], dtype=np.float64) - return rz_m @ ry_m @ rx_m - - -def axis_angle_rotation(axis: np.ndarray, angle_rad: float) -> np.ndarray: - axis = normalize(axis) - x, y, z = axis - c = math.cos(angle_rad) - s = math.sin(angle_rad) - C = 1.0 - c - return np.array([ - [c + x * x * C, x * y * C - z * s, x * z * C + y * s], - [y * x * C + z * s, c + y * y * C, y * z * C - x * s], - [z * x * C - y * s, z * y * C + x * s, c + z * z * C] - ], dtype=np.float64) - - -def make_transform(R: Optional[np.ndarray] = None, t: Optional[np.ndarray] = None) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - if R is not None: - T[:3, :3] = np.asarray(R, dtype=np.float64) - if t is not None: - T[:3, 3] = np.asarray(t, dtype=np.float64).reshape(3) - return T - - -def transform_point(T: np.ndarray, p: np.ndarray) -> np.ndarray: - p4 = np.ones(4, dtype=np.float64) - p4[:3] = np.asarray(p, dtype=np.float64).reshape(3) - return (T @ p4)[:3] - - -def matrix_to_euler_xyz(R: np.ndarray) -> np.ndarray: - """Return XYZ Euler angles in degrees.""" - R = np.asarray(R, dtype=np.float64) - sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0]) - singular = sy < 1e-9 - - if not singular: - x = math.atan2(R[2, 1], R[2, 2]) - y = math.atan2(-R[2, 0], sy) - z = math.atan2(R[1, 0], R[0, 0]) - else: - x = math.atan2(-R[1, 2], R[1, 1]) - y = math.atan2(-R[2, 0], sy) - z = 0.0 - return np.degrees([x, y, z]) - - -def wrap_angle_rad(a: float) -> float: - return (a + math.pi) % (2.0 * math.pi) - math.pi - - -def kabsch(P: np.ndarray, Q: np.ndarray, W: Optional[np.ndarray] = None) -> Tuple[np.ndarray, np.ndarray]: - """Find R, t such that R @ P + t ≈ Q.""" - P = np.asarray(P, dtype=np.float64) - Q = np.asarray(Q, dtype=np.float64) - assert P.shape == Q.shape and P.shape[1] == 3 - - if W is None: - W = np.ones(len(P), dtype=np.float64) - W = np.asarray(W, dtype=np.float64).reshape(-1) - W = np.maximum(W, 1e-12) - W = W / np.sum(W) - - p_cent = np.sum(P * W[:, None], axis=0) - q_cent = np.sum(Q * W[:, None], axis=0) - - P0 = P - p_cent - Q0 = Q - q_cent - H = (P0 * W[:, None]).T @ Q0 - - U, S, Vt = np.linalg.svd(H) - R = Vt.T @ U.T - if np.linalg.det(R) < 0: - Vt[-1, :] *= -1.0 - R = Vt.T @ U.T - t = q_cent - R @ p_cent - return R, t - - -# ============================================================================= -# Data structures -# ============================================================================= - -@dataclass -class MarkerInfo: - marker_id: int - link_name: str - local_pos_m: np.ndarray - size: Optional[float] = None - normal: Optional[np.ndarray] = None - name: str = "" - - -@dataclass -class LinkInfo: - name: str - parent: Optional[str] - joint_type: Optional[str] - joint_axis: Optional[np.ndarray] - joint_origin_m: np.ndarray - joint_rotation_deg: np.ndarray - joint_variable: Optional[str] - mount_position_m: np.ndarray - mount_rotation_deg: np.ndarray - markers: List[MarkerInfo] - - -@dataclass -class StageResult: - depth: int - active_links: List[str] - active_joint_vars: List[str] - mean_error_m: Optional[float] - rms_error_m: Optional[float] - worst_error_m: Optional[float] - num_markers_used: int - optimizer_info: Dict[str, Any] - - -@dataclass -class EstimationConfig: - root_pose_prior_weight: float = 0.1 - joint_prior_weight: float = 0.05 - marker_base_weight: float = 1.0 - robust_loss: str = "soft_l1" - max_iterations: int = 120 - include_joint_prior: bool = True - include_root_prior: bool = True - sequential: bool = True - show_stage_reports: bool = True - - -# ============================================================================= -# Robot parsing -# ============================================================================= - -def parse_robot(robot_data: Dict[str, Any]) -> Tuple[Dict[str, LinkInfo], Dict[int, MarkerInfo], List[str]]: - length_scale = get_length_scale(robot_data) - links = robot_data.get("links", {}) or {} - - link_infos: Dict[str, LinkInfo] = {} - marker_by_id: Dict[int, MarkerInfo] = {} - issues: List[str] = [] - - for link_name, link_data in links.items(): - parent = link_data.get("parent", None) - - joint = link_data.get("jointToParent", {}) or {} - joint_type = joint.get("type", None) - - axis = joint.get("axis", None) - if axis is not None: - axis = np.asarray(axis, dtype=np.float64) - if safe_norm(axis) > 1e-12: - axis = normalize(axis) - else: - axis = None - - joint_origin = np.asarray(joint.get("origin", [0, 0, 0]), dtype=np.float64) * float(length_scale) - joint_rotation_deg = np.asarray(joint.get("rotation", [0, 0, 0]), dtype=np.float64) - joint_variable = joint.get("variable", None) - - mount_position = np.asarray(link_data.get("mountPosition", [0, 0, 0]), dtype=np.float64) * float(length_scale) - mount_rotation_deg = np.asarray(link_data.get("mountRotation", [0, 0, 0]), dtype=np.float64) - - markers_data = link_data.get("markers", []) or [] - markers: List[MarkerInfo] = [] - for idx, m in enumerate(markers_data): - marker_id = int(m.get("id", -1)) - pos = m.get("position", None) - - if marker_id < 0 or pos is None or len(pos) != 3: - issues.append(f"[WARN] link='{link_name}': skipped invalid marker entry at index {idx}") - continue - - if marker_id in marker_by_id: - issues.append( - f"[WARN] duplicate marker ID {marker_id} in link '{link_name}' " - f"(already in '{marker_by_id[marker_id].link_name}'); using first occurrence" - ) - continue - - normal = None - if "normal" in m and isinstance(m["normal"], list) and len(m["normal"]) == 3: - normal = np.asarray(m["normal"], dtype=np.float64) - - marker = MarkerInfo( - marker_id=marker_id, - link_name=link_name, - local_pos_m=np.asarray(pos, dtype=np.float64) * float(length_scale), - size=m.get("size", None), - normal=normal, - name=str(m.get("name", f"marker_{marker_id}")), - ) - markers.append(marker) - marker_by_id[marker_id] = marker - - link_infos[link_name] = LinkInfo( - name=link_name, - parent=parent, - joint_type=joint_type, - joint_axis=axis, - joint_origin_m=joint_origin, - joint_rotation_deg=joint_rotation_deg, - joint_variable=joint_variable, - mount_position_m=mount_position, - mount_rotation_deg=mount_rotation_deg, - markers=markers, - ) - - return link_infos, marker_by_id, issues - - -def topological_links(link_infos: Dict[str, LinkInfo]) -> List[str]: - children = {name: [] for name in link_infos} - roots = [] - for name, info in link_infos.items(): - if info.parent is None: - roots.append(name) - else: - children.setdefault(info.parent, []).append(name) - - order: List[str] = [] - queue = list(roots) - seen = set() - - while queue: - cur = queue.pop(0) - if cur in seen: - continue - seen.add(cur) - order.append(cur) - for ch in children.get(cur, []): - queue.append(ch) - - for name in link_infos: - if name not in seen: - order.append(name) - return order - - -def compute_link_depths(link_infos: Dict[str, LinkInfo]) -> Dict[str, int]: - depths: Dict[str, int] = {} - - def depth_of(name: str) -> int: - if name in depths: - return depths[name] - info = link_infos[name] - if info.parent is None: - depths[name] = 0 - else: - depths[name] = depth_of(info.parent) + 1 - return depths[name] - - for name in link_infos: - depth_of(name) - return depths - - -# ============================================================================= -# Marker weights -# ============================================================================= - -def marker_weight(marker_info: MarkerInfo, base_weight: float = 1.0, ref_size: float = 25.0) -> float: - """ - Weight the marker residuals lightly by marker size. - Larger markers tend to be more stable in image space. - """ - w = base_weight - if marker_info.size is not None: - try: - size = float(marker_info.size) - if size > 0: - w *= max(0.35, math.sqrt(size / ref_size)) - except Exception: - pass - return w - - -# ============================================================================= -# Forward kinematics -# ============================================================================= - -def link_static_transform(link: LinkInfo) -> np.ndarray: - Rm = rotation_matrix_xyz(*link.mount_rotation_deg, degrees=True) - return make_transform(Rm, link.mount_position_m) - - -def joint_motion_transform(link: LinkInfo, q_value: float) -> np.ndarray: - joint_type = (link.joint_type or "").strip().lower() - if link.joint_axis is None: - return np.eye(4, dtype=np.float64) - - axis = normalize(link.joint_axis) - if joint_type == "linear": - return make_transform(np.eye(3), axis * float(q_value)) - if joint_type == "revolute": - return make_transform(axis_angle_rotation(axis, float(q_value)), np.zeros(3)) - return np.eye(4, dtype=np.float64) - - -def world_to_link_transform( - link_name: str, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - cache: Dict[str, np.ndarray], -) -> np.ndarray: - if link_name in cache: - return cache[link_name] - - link = link_infos[link_name] - if link.parent is None: - T = make_transform(state["root_R"], state["root_t"]) - cache[link_name] = T - return T - - parent_T = world_to_link_transform(link.parent, link_infos, state, cache) - - # Convention: - # parent frame -> joint origin -> joint motion -> static joint rotation -> child mount transform - T = parent_T @ make_transform(np.eye(3), link.joint_origin_m) - - q = state["joint_values"].get(link.joint_variable, state["joint_defaults"].get(link.joint_variable, 0.0)) - T = T @ joint_motion_transform(link, q) - - R_static = rotation_matrix_xyz(*link.joint_rotation_deg, degrees=True) - T = T @ make_transform(R_static, np.zeros(3)) - - T = T @ link_static_transform(link) - - cache[link_name] = T - return T - - -def predict_marker_positions( - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], -) -> Dict[int, np.ndarray]: - pred: Dict[int, np.ndarray] = {} - cache: Dict[str, np.ndarray] = {} - for link_name, link in link_infos.items(): - T = world_to_link_transform(link_name, link_infos, state, cache) - for marker in link.markers: - pred[marker.marker_id] = transform_point(T, marker.local_pos_m) - return pred - - -# ============================================================================= -# Initial parameters -# ============================================================================= - -def infer_joint_defaults(robot_data: Dict[str, Any], link_infos: Dict[str, LinkInfo]) -> Dict[str, float]: - defaults_raw = robot_data.get("defaultPosition", {}) or {} - out: Dict[str, float] = {} - - for link in link_infos.values(): - var = link.joint_variable - if not var: - continue - raw_val = defaults_raw.get(var, 0.0) - joint_type = (link.joint_type or "").strip().lower() - if joint_type == "linear": - out[var] = float(raw_val) * get_length_scale(robot_data) - elif joint_type == "revolute": - out[var] = math.radians(float(raw_val)) - else: - out[var] = float(raw_val) - return out - - -def initial_root_pose( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], -) -> Tuple[np.ndarray, np.ndarray]: - roots = [name for name, info in link_infos.items() if info.parent is None] - if not roots: - return np.eye(3, dtype=np.float64), np.zeros(3, dtype=np.float64) - - root = roots[0] - root_info = link_infos[root] - - P = [] - Q = [] - W = [] - - for marker in root_info.markers: - if marker.marker_id in observed_markers: - obs = np.asarray(observed_markers[marker.marker_id]["position_m"], dtype=np.float64) - P.append(marker.local_pos_m) - Q.append(obs) - W.append(marker_weight(marker, base_weight=1.0)) - - if len(P) >= 3: - return kabsch(np.asarray(P), np.asarray(Q), np.asarray(W)) - - return np.eye(3, dtype=np.float64), np.zeros(3, dtype=np.float64) - - -def build_initial_state( - robot_data: Dict[str, Any], - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], -) -> Dict[str, Any]: - root_R, root_t = initial_root_pose(link_infos, observed_markers) - joint_defaults = infer_joint_defaults(robot_data, link_infos) - - return { - "root_R": root_R, - "root_t": root_t, - "joint_defaults": joint_defaults, - "joint_values": dict(joint_defaults), - } - - -# ============================================================================= -# Stage helpers -# ============================================================================= - -def active_links_for_depth(link_infos: Dict[str, LinkInfo], depths: Dict[str, int], max_depth: int) -> List[str]: - ordered = topological_links(link_infos) - return [name for name in ordered if depths.get(name, 0) <= max_depth] - - -def active_joint_vars_for_links(link_infos: Dict[str, LinkInfo], active_links: List[str]) -> List[str]: - vars_out: List[str] = [] - seen = set() - for name in active_links: - link = link_infos[name] - if not link.joint_variable: - continue - if link.joint_variable in seen: - continue - seen.add(link.joint_variable) - vars_out.append(link.joint_variable) - return vars_out - - -def active_observations_for_links( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - active_links: List[str], -) -> Dict[int, Dict[str, Any]]: - allowed_links = set(active_links) - out: Dict[int, Dict[str, Any]] = {} - for marker_id, obs in observed_markers.items(): - link_name = obs.get("link", None) - if link_name in allowed_links: - out[marker_id] = obs - return out - - -def stage_variables_to_vector( - state: Dict[str, Any], - active_joint_vars: List[str], -) -> np.ndarray: - try: - from scipy.spatial.transform import Rotation - root_rvec = Rotation.from_matrix(state["root_R"]).as_rotvec() - except Exception: - root_rvec = np.zeros(3, dtype=np.float64) - - root_t = np.asarray(state["root_t"], dtype=np.float64).reshape(3) - values = list(root_t) + list(np.asarray(root_rvec, dtype=np.float64)) - for var in active_joint_vars: - values.append(float(state["joint_values"].get(var, state["joint_defaults"].get(var, 0.0)))) - return np.asarray(values, dtype=np.float64) - - -def vector_to_stage_state( - x: np.ndarray, - template_state: Dict[str, Any], - active_joint_vars: List[str], -) -> Dict[str, Any]: - try: - from scipy.spatial.transform import Rotation - except Exception: - Rotation = None - - x = np.asarray(x, dtype=np.float64).reshape(-1) - - out = { - "root_t": x[0:3].copy(), - "root_R": template_state["root_R"].copy(), - "joint_defaults": dict(template_state["joint_defaults"]), - "joint_values": dict(template_state["joint_values"]), - } - - root_rvec = x[3:6].copy() - if Rotation is not None: - out["root_R"] = Rotation.from_rotvec(root_rvec).as_matrix() - else: - angle = safe_norm(root_rvec) - if angle < 1e-12: - out["root_R"] = np.eye(3, dtype=np.float64) - else: - out["root_R"] = axis_angle_rotation(root_rvec / angle, angle) - - idx = 6 - for var in active_joint_vars: - if idx >= len(x): - break - out["joint_values"][var] = float(x[idx]) - idx += 1 - - return out - - -def residuals_stage( - x: np.ndarray, - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - template_state: Dict[str, Any], - active_joint_vars: List[str], - cfg: EstimationConfig, -) -> np.ndarray: - state = vector_to_stage_state(x, template_state, active_joint_vars) - pred = predict_marker_positions(link_infos, state) - - res: List[float] = [] - - # Marker residuals - for marker_id, obs in observed_markers.items(): - if marker_id not in pred: - continue - - link_name = obs.get("link", None) - marker = None - if link_name is not None and link_name in link_infos: - for m in link_infos[link_name].markers: - if m.marker_id == marker_id: - marker = m - break - if marker is None: - continue - - w = marker_weight(marker, base_weight=cfg.marker_base_weight) - sqrt_w = math.sqrt(max(1e-12, w)) - - p_obs = np.asarray(obs["position_m"], dtype=np.float64) - p_pred = pred[marker_id] - d = (p_pred - p_obs) * sqrt_w - res.extend(d.tolist()) - - # Root prior - if cfg.include_root_prior: - root_t_prior = np.asarray(template_state["root_t"], dtype=np.float64) - try: - from scipy.spatial.transform import Rotation - root_rvec_prior = Rotation.from_matrix(template_state["root_R"]).as_rotvec() - except Exception: - root_rvec_prior = np.zeros(3, dtype=np.float64) - - root_t = x[0:3] - root_rvec = x[3:6] - w = math.sqrt(max(1e-12, cfg.root_pose_prior_weight)) - res.extend(((root_t - root_t_prior) * w).tolist()) - res.extend(((root_rvec - root_rvec_prior) * w).tolist()) - - # Joint priors - if cfg.include_joint_prior: - idx = 6 - w = math.sqrt(max(1e-12, cfg.joint_prior_weight)) - for var in active_joint_vars: - if idx >= len(x): - break - q = x[idx] - q0 = template_state["joint_defaults"].get(var, 0.0) - # Revolute angles should not wrap too aggressively during optimization, - # but the prior itself should be short-arc. - if abs(q0) <= math.pi * 2.5: - dq = wrap_angle_rad(float(q - q0)) - else: - dq = float(q - q0) - res.append(dq * w) - idx += 1 - - return np.asarray(res, dtype=np.float64) - - -def optimize_stage( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - template_state: Dict[str, Any], - active_joint_vars: List[str], - cfg: EstimationConfig, -) -> Tuple[Dict[str, Any], Dict[str, Any]]: - try: - from scipy.optimize import least_squares - except ImportError: - print("[WARN] scipy not available; returning template state for this stage.") - return template_state, {"success": False, "message": "scipy unavailable"} - - x0 = stage_variables_to_vector(template_state, active_joint_vars) - - print(f"[INFO] Stage variables: {len(x0)} (root pose + {len(active_joint_vars)} active joints)") - - result = least_squares( - lambda x: residuals_stage(x, link_infos, observed_markers, template_state, active_joint_vars, cfg), - x0, - loss=cfg.robust_loss, - f_scale=1.0, - max_nfev=cfg.max_iterations, - verbose=1, - ) - - final_state = vector_to_stage_state(result.x, template_state, active_joint_vars) - opt_info = { - "cost": float(np.sum(result.fun ** 2)), - "success": bool(result.success), - "status": int(result.status), - "message": str(result.message), - "nfev": int(result.nfev), - "njev": int(getattr(result, "njev", -1)), - } - final_state["_optimizer"] = opt_info - return final_state, opt_info - - -def compute_error_stats( - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], -) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]: - pred = predict_marker_positions(link_infos, state) - - marker_reports: List[Dict[str, Any]] = [] - errors = [] - - marker_to_link = {} - marker_meta = {} - for link in link_infos.values(): - for m in link.markers: - marker_to_link[m.marker_id] = link.name - marker_meta[m.marker_id] = m - - for marker_id, obs in observed_markers.items(): - if marker_id not in pred: - continue - - p_obs = np.asarray(obs["position_m"], dtype=np.float64) - p_pred = pred[marker_id] - err = p_pred - p_obs - err_norm = float(np.linalg.norm(err)) - errors.append(err_norm) - - m = marker_meta.get(marker_id) - marker_reports.append( - { - "marker_id": int(marker_id), - "link": marker_to_link.get(marker_id, "unknown"), - "observed_position_m": [float(x) for x in p_obs], - "predicted_position_m": [float(x) for x in p_pred], - "error_m": [float(x) for x in err], - "error_norm_m": err_norm, - "error_norm_mm": err_norm * 1000.0, - "marker_size": None if m is None else m.size, - } - ) - - if errors: - arr = np.asarray(errors, dtype=np.float64) - stats = { - "num_markers_used": int(len(errors)), - "mean_error_m": float(np.mean(arr)), - "median_error_m": float(np.median(arr)), - "rms_error_m": float(np.sqrt(np.mean(arr ** 2))), - "worst_error_m": float(np.max(arr)), - "p80_error_m": float(np.quantile(arr, 0.80)), - "p90_error_m": float(np.quantile(arr, 0.90)), - } - else: - stats = { - "num_markers_used": 0, - "mean_error_m": None, - "median_error_m": None, - "rms_error_m": None, - "worst_error_m": None, - "p80_error_m": None, - "p90_error_m": None, - } - - return marker_reports, stats - - -def print_stage_stats(stage_idx: int, depth: int, stage_result: StageResult) -> None: - print( - f"[INFO] Stage {stage_idx} (depth={depth}) | " - f"active_links={len(stage_result.active_links)} | " - f"active_joint_vars={len(stage_result.active_joint_vars)} | " - f"markers={stage_result.num_markers_used}" - ) - if stage_result.mean_error_m is not None: - print( - f"[INFO] Stage {stage_idx} error: " - f"mean={stage_result.mean_error_m*1000.0:.2f} mm | " - f"rms={stage_result.rms_error_m*1000.0:.2f} mm | " - f"worst={stage_result.worst_error_m*1000.0:.2f} mm" - ) - if stage_result.optimizer_info: - print( - f"[INFO] Stage {stage_idx} optimizer: " - f"success={stage_result.optimizer_info.get('success', False)} | " - f"nfev={stage_result.optimizer_info.get('nfev', -1)} | " - f"cost={stage_result.optimizer_info.get('cost', 0.0):.6f}" - ) - - -def sequential_optimize_state( - robot_data: Dict[str, Any], - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - initial_state: Dict[str, Any], - cfg: EstimationConfig, -) -> Tuple[Dict[str, Any], List[StageResult]]: - """ - Sequential prefix optimization: - - solve links up to depth 0, - - then depth 1, - - then depth 2, ... - Each new stage starts from the previous state and only activates the - joint variables that belong to the current prefix. - """ - depths = compute_link_depths(link_infos) - max_depth = max(depths.values()) if depths else 0 - - current_state = { - "root_R": initial_state["root_R"].copy(), - "root_t": initial_state["root_t"].copy(), - "joint_defaults": dict(initial_state["joint_defaults"]), - "joint_values": dict(initial_state["joint_values"]), - } - - stage_results: List[StageResult] = [] - - for depth in range(0, max_depth + 1): - active_links = active_links_for_depth(link_infos, depths, depth) - active_joint_vars = active_joint_vars_for_links(link_infos, active_links) - active_obs = active_observations_for_links(link_infos, observed_markers, active_links) - - # If a stage introduces no observations, we still may want the chain prefix, - # but there is nothing to fit against. In that case just keep the current state. - if len(active_obs) == 0: - stage_state = current_state - stage_res = StageResult( - depth=depth, - active_links=active_links, - active_joint_vars=active_joint_vars, - mean_error_m=None, - rms_error_m=None, - worst_error_m=None, - num_markers_used=0, - optimizer_info={"skipped": True, "reason": "no active observations"}, - ) - stage_results.append(stage_res) - if cfg.show_stage_reports: - print_stage_stats(len(stage_results) - 1, depth, stage_res) - continue - - # Optimize only the active prefix variables. - template_state = current_state - optimized_state, opt_info = optimize_stage( - link_infos=link_infos, - observed_markers=active_obs, - template_state=template_state, - active_joint_vars=active_joint_vars, - cfg=cfg, - ) - - # Merge optimized active values into the running state. - current_state["root_R"] = optimized_state["root_R"].copy() - current_state["root_t"] = optimized_state["root_t"].copy() - current_state["joint_values"].update(optimized_state["joint_values"]) - - # Evaluate the active prefix after the stage. - marker_reports, stats = compute_error_stats(link_infos, current_state, active_obs) - - stage_res = StageResult( - depth=depth, - active_links=active_links, - active_joint_vars=active_joint_vars, - mean_error_m=stats["mean_error_m"], - rms_error_m=stats["rms_error_m"], - worst_error_m=stats["worst_error_m"], - num_markers_used=stats["num_markers_used"], - optimizer_info=opt_info, - ) - stage_results.append(stage_res) - - if cfg.show_stage_reports: - print_stage_stats(len(stage_results) - 1, depth, stage_res) - - if stage_results: - current_state["_optimizer"] = stage_results[-1].optimizer_info - return current_state, stage_results - - -# ============================================================================= -# Output -# ============================================================================= - -def state_to_json( - robot_data: Dict[str, Any], - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - marker_reports: List[Dict[str, Any]], - stats: Dict[str, Any], - input_file: str, - robot_file: str, - stage_results: List[StageResult], -) -> Dict[str, Any]: - movements = {} - for link_name in topological_links(link_infos): - link = link_infos[link_name] - if not link.joint_variable: - continue - - q = state["joint_values"].get(link.joint_variable, state["joint_defaults"].get(link.joint_variable, 0.0)) - joint_type = (link.joint_type or "").strip().lower() - - if joint_type == "revolute": - movements[link.joint_variable] = { - "value_rad": float(q), - "value_deg": float(math.degrees(q)), - "joint_type": joint_type, - "link": link_name, - } - elif joint_type == "linear": - movements[link.joint_variable] = { - "value_m": float(q), - "value_mm": float(q * 1000.0), - "joint_type": joint_type, - "link": link_name, - } - else: - movements[link.joint_variable] = { - "value": float(q), - "joint_type": joint_type, - "link": link_name, - } - - link_pose_entries = [] - cache: Dict[str, np.ndarray] = {} - for link_name in topological_links(link_infos): - T = world_to_link_transform(link_name, link_infos, state, cache) - R = T[:3, :3] - t = T[:3, 3] - link = link_infos[link_name] - num_used = sum(1 for m in link.markers if m.marker_id in observed_markers) - link_pose_entries.append( - { - "link": link_name, - "parent": link.parent, - "position_m": [float(x) for x in t], - "rotation_matrix": [[float(v) for v in row] for row in R], - "euler_xyz_deg": [float(x) for x in matrix_to_euler_xyz(R)], - "num_observed_markers": int(num_used), - "num_markers_total": int(len(link.markers)), - } - ) - - root_link = next((name for name, info in link_infos.items() if info.parent is None), None) - root_T = make_transform(state["root_R"], state["root_t"]) - - out = { - "schema_version": "2.0", - "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), - "source": { - "marker_positions_file": input_file, - "robot_file": robot_file, - }, - "summary": { - "num_links": int(len(link_infos)), - "num_observed_markers": int(len(observed_markers)), - "num_link_markers": int(sum(len(li.markers) for li in link_infos.values())), - "root_link": root_link, - "optimizer": state.get("_optimizer", {}), - "fit_stats": stats, - "stages": [ - { - "depth": int(s.depth), - "active_links": s.active_links, - "active_joint_vars": s.active_joint_vars, - "mean_error_m": s.mean_error_m, - "rms_error_m": s.rms_error_m, - "worst_error_m": s.worst_error_m, - "num_markers_used": int(s.num_markers_used), - "optimizer_info": s.optimizer_info, - } - for s in stage_results - ], - }, - "world_pose": { - "root_translation_m": [float(x) for x in root_T[:3, 3]], - "root_rotation_matrix": [[float(v) for v in row] for row in root_T[:3, :3]], - "root_euler_xyz_deg": [float(x) for x in matrix_to_euler_xyz(root_T[:3, :3])], - }, - "movements": movements, - "links": link_pose_entries, - "markers": marker_reports, - } - - return out - - -# ============================================================================= -# Main -# ============================================================================= - -def main() -> None: - parser = argparse.ArgumentParser( - description="Sequential robot state estimation from optimized ArUco marker positions" - ) - parser.add_argument( - "optimized_markers", - help="aruco_positions_optimized*.json" - ) - parser.add_argument( - "-robot", "--robot", - required=True, - help="robot.json" - ) - parser.add_argument( - "-out", "--out", - default=None, - help="Output robot_state.json path" - ) - parser.add_argument( - "--maxIterations", - type=int, - default=120, - help="Maximum least-squares iterations per stage" - ) - parser.add_argument( - "--jointPriorWeight", - type=float, - default=0.05, - help="Prior weight for joint variables" - ) - parser.add_argument( - "--rootPosePriorWeight", - type=float, - default=0.1, - help="Prior weight for root pose" - ) - parser.add_argument( - "--markerBaseWeight", - type=float, - default=1.0, - help="Base weight for marker residuals" - ) - parser.add_argument( - "--noJointPrior", - action="store_true", - help="Disable joint priors" - ) - parser.add_argument( - "--noRootPrior", - action="store_true", - help="Disable root pose prior" - ) - parser.add_argument( - "--noSequential", - action="store_true", - help="Disable sequential prefix optimization and do one global pass" - ) - - args = parser.parse_args() - - print("[STEP 1] Load robot.json and optimized marker positions...") - robot_data = load_json(args.robot) - link_infos, marker_by_id, issues = parse_robot(robot_data) - observed_markers = load_json(args.optimized_markers) - markers = observed_markers.get("markers", []) if isinstance(observed_markers, dict) else [] - - observed_map: Dict[int, Dict[str, Any]] = {} - for m in markers: - marker_id = int(m["marker_id"]) - observed_map[marker_id] = m - - for issue in issues: - print(issue) - - print(f"[INFO] Links: {len(link_infos)}") - print(f"[INFO] Known robot markers: {len(marker_by_id)}") - print(f"[INFO] Observed optimized markers: {len(observed_map)}") - - print("\n[STEP 2] Build initial robot state...") - initial_state = build_initial_state(robot_data, link_infos, observed_map) - print(f"[INFO] Initial root translation (m): {initial_state['root_t']}") - print(f"[INFO] Initial joint defaults: {initial_state['joint_defaults']}") - - cfg = EstimationConfig( - root_pose_prior_weight=float(args.rootPosePriorWeight), - joint_prior_weight=float(args.jointPriorWeight), - marker_base_weight=float(args.markerBaseWeight), - robust_loss="soft_l1", - max_iterations=int(args.maxIterations), - include_joint_prior=not args.noJointPrior, - include_root_prior=not args.noRootPrior, - sequential=not args.noSequential, - show_stage_reports=True, - ) - - print("\n[STEP 3] Estimate robot state...") - if cfg.sequential: - final_state, stage_results = sequential_optimize_state( - robot_data=robot_data, - link_infos=link_infos, - observed_markers=observed_map, - initial_state=initial_state, - cfg=cfg, - ) - else: - # Fallback: single global stage over the entire kinematic tree. - active_links = topological_links(link_infos) - active_joint_vars = active_joint_vars_for_links(link_infos, active_links) - final_state, opt_info = optimize_stage( - link_infos=link_infos, - observed_markers=observed_map, - template_state=initial_state, - active_joint_vars=active_joint_vars, - cfg=cfg, - ) - final_state["_optimizer"] = opt_info - stage_results = [] - - print("\n[STEP 4] Build report and save robot_state.json...") - marker_reports, stats = compute_error_stats(link_infos, final_state, observed_map) - - out_data = state_to_json( - robot_data=robot_data, - link_infos=link_infos, - state=final_state, - observed_markers=observed_map, - marker_reports=marker_reports, - stats=stats, - input_file=args.optimized_markers, - robot_file=args.robot, - stage_results=stage_results, - ) - - out_path = args.out - if out_path is None: - out_dir = os.path.dirname(args.optimized_markers) or "." - out_path = os.path.join(out_dir, "robot_state.json") - - save_json(out_path, out_data) - - print(f"[INFO] Saved to {out_path}") - if stats["mean_error_m"] is not None: - print(f"[INFO] Mean marker error: {stats['mean_error_m']*1000.0:.2f} mm") - print(f"[INFO] RMS marker error : {stats['rms_error_m']*1000.0:.2f} mm") - print(f"[INFO] Worst marker error: {stats['worst_error_m']*1000.0:.2f} mm") - else: - print("[INFO] No marker error statistics available.") - - -if __name__ == "__main__": - main() diff --git a/pipeline/4_robotState_estimation_v5.py b/pipeline/4_robotState_estimation_v5.py deleted file mode 100644 index a5de588..0000000 --- a/pipeline/4_robotState_estimation_v5.py +++ /dev/null @@ -1,1330 +0,0 @@ -#!/usr/bin/env python3 -""" -4_robotState_estimation_v5.py - -Sequential robot-state estimation from optimized 3D ArUco marker positions. - -Mathematical idea ------------------ -This script estimates a robot state q directly from already optimized marker -positions p_i^obs (from aruco_positions_optimized*.json). - -The state is built incrementally along the kinematic chain: - 1) estimate the root link pose from observed root-link markers - 2) extend the active prefix link-by-link - 3) for each newly activated joint, estimate its scalar variable by a geometric - rule that matches the robot's degrees of freedom - -For each stage we keep the already estimated prefix fixed and only add the next -link(s) from the chain. This is intentionally *not* a generic global optimizer -by default. It is a deterministic geometric initializer that uses the robot -structure and marker geometry directly. - -The stage logic is controlled by robot.json::state_pose_params: - - numbers_of_Elements_to_consider_start - - numbers_of_Elements_to_consider_final - - solver_in_between_geometrical - - solver_after_geometrical - -Geometric rules used here -------------------------- -Rigid root / early prefix: - - root link pose is estimated from its observed markers with weighted Kabsch - -Linear joint (slider): - - the joint translates its whole descendant subtree along the joint axis - - q is estimated as the weighted mean projection of observed minus predicted - marker positions onto the world-space joint axis - -Revolute joint: - - the joint rotates its descendant subtree around the joint axis - - q is estimated by a coarse-to-fine 1D angular search that minimizes the - weighted marker residual over the active prefix - -Optional solver ---------------- -If enabled in state_pose_params, a least-squares refinement can be run after a -geometric stage or at the end. The geometric estimator remains the default and -is the first-class method in this script. - -Important limitation --------------------- -This script works from marker positions only. It does not yet use image-space -marker orientation / normal / visibility cues. Those can be added later by -feeding in raw detections and camera poses. - -Dependencies ------------- -numpy, scipy (optional for refinement) -""" - -from __future__ import annotations - -import argparse -import copy -import json -import math -import os -import sys -import time -from dataclasses import dataclass -from typing import Any, Dict, List, Optional, Tuple - -import numpy as np - - -# ============================================================================= -# Path / JSON helpers -# ============================================================================= - -def resolve_path(path: str) -> str: - path = os.path.expanduser(path) - if os.path.isabs(path): - return path - return os.path.abspath(path) - - -def load_json(path: str) -> Any: - with open(resolve_path(path), 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(path: str, data: Any) -> None: - with open(resolve_path(path), 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ============================================================================= -# Small math helpers -# ============================================================================= - -def safe_norm(v: np.ndarray, eps: float = 1e-12) -> float: - return float(np.linalg.norm(v) + eps) - - -def normalize(v: np.ndarray, eps: float = 1e-12) -> np.ndarray: - v = np.asarray(v, dtype=np.float64) - return v / safe_norm(v, eps) - - -def wrap_angle_rad(a: float) -> float: - return (a + math.pi) % (2.0 * math.pi) - math.pi - - -def get_length_scale(robot_data: Dict[str, Any]) -> float: - units = robot_data.get('units', {}) or {} - length_unit = str(units.get('length', '')).strip().lower() - if length_unit in ('mm', 'millimeter', 'millimeters'): - return 1.0 / 1000.0 - if length_unit in ('cm', 'centimeter', 'centimeters'): - return 1.0 / 100.0 - return 1.0 - - -def rotation_matrix_xyz(rx: float, ry: float, rz: float, degrees: bool = False) -> np.ndarray: - """Rotation order: X then Y then Z.""" - if degrees: - rx, ry, rz = math.radians(rx), math.radians(ry), math.radians(rz) - - cx, sx = math.cos(rx), math.sin(rx) - cy, sy = math.cos(ry), math.sin(ry) - cz, sz = math.cos(rz), math.sin(rz) - - rx_m = np.array([[1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx]], dtype=np.float64) - ry_m = np.array([[cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy]], dtype=np.float64) - rz_m = np.array([[cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0]], dtype=np.float64) - return rz_m @ ry_m @ rx_m - - -def axis_angle_rotation(axis: np.ndarray, angle_rad: float) -> np.ndarray: - axis = normalize(axis) - x, y, z = axis - c = math.cos(angle_rad) - s = math.sin(angle_rad) - C = 1.0 - c - return np.array([ - [c + x * x * C, x * y * C - z * s, x * z * C + y * s], - [y * x * C + z * s, c + y * y * C, y * z * C - x * s], - [z * x * C - y * s, z * y * C + x * s, c + z * z * C] - ], dtype=np.float64) - - -def make_transform(R: Optional[np.ndarray] = None, t: Optional[np.ndarray] = None) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - if R is not None: - T[:3, :3] = np.asarray(R, dtype=np.float64) - if t is not None: - T[:3, 3] = np.asarray(t, dtype=np.float64).reshape(3) - return T - - -def transform_point(T: np.ndarray, p: np.ndarray) -> np.ndarray: - p4 = np.ones(4, dtype=np.float64) - p4[:3] = np.asarray(p, dtype=np.float64).reshape(3) - return (T @ p4)[:3] - - -def matrix_to_euler_xyz(R: np.ndarray) -> np.ndarray: - R = np.asarray(R, dtype=np.float64) - sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0]) - singular = sy < 1e-9 - - if not singular: - x = math.atan2(R[2, 1], R[2, 2]) - y = math.atan2(-R[2, 0], sy) - z = math.atan2(R[1, 0], R[0, 0]) - else: - x = math.atan2(-R[1, 2], R[1, 1]) - y = math.atan2(-R[2, 0], sy) - z = 0.0 - return np.degrees([x, y, z]) - - -def kabsch(P: np.ndarray, Q: np.ndarray, W: Optional[np.ndarray] = None) -> Tuple[np.ndarray, np.ndarray]: - """Find R, t such that R @ P + t ≈ Q.""" - P = np.asarray(P, dtype=np.float64) - Q = np.asarray(Q, dtype=np.float64) - assert P.shape == Q.shape and P.shape[1] == 3 - - if W is None: - W = np.ones(len(P), dtype=np.float64) - W = np.asarray(W, dtype=np.float64).reshape(-1) - W = np.maximum(W, 1e-12) - W = W / np.sum(W) - - p_cent = np.sum(P * W[:, None], axis=0) - q_cent = np.sum(Q * W[:, None], axis=0) - - P0 = P - p_cent - Q0 = Q - q_cent - H = (P0 * W[:, None]).T @ Q0 - - U, S, Vt = np.linalg.svd(H) - R = Vt.T @ U.T - if np.linalg.det(R) < 0: - Vt[-1, :] *= -1.0 - R = Vt.T @ U.T - t = q_cent - R @ p_cent - return R, t - - -# ============================================================================= -# Data structures -# ============================================================================= - -@dataclass -class MarkerInfo: - marker_id: int - link_name: str - local_pos_m: np.ndarray - size: Optional[float] = None - normal: Optional[np.ndarray] = None - name: str = '' - - -@dataclass -class LinkInfo: - name: str - parent: Optional[str] - joint_type: Optional[str] - joint_axis: Optional[np.ndarray] - joint_origin_m: np.ndarray - joint_rotation_deg: np.ndarray - joint_variable: Optional[str] - mount_position_m: np.ndarray - mount_rotation_deg: np.ndarray - markers: List[MarkerInfo] - - -@dataclass -class StageResult: - stage_idx: int - active_links: List[str] - active_joint_vars: List[str] - num_markers_used: int - mean_error_m: Optional[float] - rms_error_m: Optional[float] - worst_error_m: Optional[float] - method: str - optimizer_info: Dict[str, Any] - - -@dataclass -class StatePoseParams: - numbers_of_elements_to_consider_start: int = 4 - numbers_of_elements_to_consider_final: int = 5 - solver_in_between_geometrical: bool = False - solver_after_geometrical: bool = False - geometric_passes_per_stage: int = 2 - revolute_search_coarse_deg: float = 5.0 - revolute_search_fine_deg: float = 1.0 - root_pose_min_markers: int = 3 - - -@dataclass -class EstimationConfig: - marker_base_weight: float = 1.0 - root_pose_prior_weight: float = 0.0 - joint_prior_weight: float = 0.0 - robust_loss: str = 'soft_l1' - max_iterations: int = 120 - show_stage_reports: bool = True - use_geometric_prefix: bool = True - - -# ============================================================================= -# Robot parsing -# ============================================================================= - -def parse_robot(robot_data: Dict[str, Any]) -> Tuple[Dict[str, LinkInfo], Dict[int, MarkerInfo], List[str]]: - length_scale = get_length_scale(robot_data) - links = robot_data.get('links', {}) or {} - - link_infos: Dict[str, LinkInfo] = {} - marker_by_id: Dict[int, MarkerInfo] = {} - issues: List[str] = [] - - for link_name, link_data in links.items(): - parent = link_data.get('parent', None) - - joint = link_data.get('jointToParent', {}) or {} - joint_type = joint.get('type', None) - - axis = joint.get('axis', None) - if axis is not None: - axis = np.asarray(axis, dtype=np.float64) - if safe_norm(axis) > 1e-12: - axis = normalize(axis) - else: - axis = None - - joint_origin = np.asarray(joint.get('origin', [0, 0, 0]), dtype=np.float64) * float(length_scale) - joint_rotation_deg = np.asarray(joint.get('rotation', [0, 0, 0]), dtype=np.float64) - joint_variable = joint.get('variable', None) - - mount_position = np.asarray(link_data.get('mountPosition', [0, 0, 0]), dtype=np.float64) * float(length_scale) - mount_rotation_deg = np.asarray(link_data.get('mountRotation', [0, 0, 0]), dtype=np.float64) - - markers_data = link_data.get('markers', []) or [] - markers: List[MarkerInfo] = [] - for idx, m in enumerate(markers_data): - marker_id = int(m.get('id', -1)) - pos = m.get('position', None) - - if marker_id < 0 or pos is None or len(pos) != 3: - issues.append(f"[WARN] link='{link_name}': skipped invalid marker entry at index {idx}") - continue - - if marker_id in marker_by_id: - issues.append( - f"[WARN] duplicate marker ID {marker_id} in link '{link_name}' " - f"(already in '{marker_by_id[marker_id].link_name}'); using first occurrence" - ) - continue - - normal = None - if isinstance(m.get('normal', None), list) and len(m['normal']) == 3: - normal = np.asarray(m['normal'], dtype=np.float64) - - marker = MarkerInfo( - marker_id=marker_id, - link_name=link_name, - local_pos_m=np.asarray(pos, dtype=np.float64) * float(length_scale), - size=m.get('size', None), - normal=normal, - name=str(m.get('name', f'marker_{marker_id}')), - ) - markers.append(marker) - marker_by_id[marker_id] = marker - - link_infos[link_name] = LinkInfo( - name=link_name, - parent=parent, - joint_type=joint_type, - joint_axis=axis, - joint_origin_m=joint_origin, - joint_rotation_deg=joint_rotation_deg, - joint_variable=joint_variable, - mount_position_m=mount_position, - mount_rotation_deg=mount_rotation_deg, - markers=markers, - ) - - return link_infos, marker_by_id, issues - - -def topological_links(link_infos: Dict[str, LinkInfo]) -> List[str]: - children = {name: [] for name in link_infos} - roots = [] - for name, info in link_infos.items(): - if info.parent is None: - roots.append(name) - else: - children.setdefault(info.parent, []).append(name) - - order: List[str] = [] - queue = list(roots) - seen = set() - - while queue: - cur = queue.pop(0) - if cur in seen: - continue - seen.add(cur) - order.append(cur) - for ch in children.get(cur, []): - queue.append(ch) - - for name in link_infos: - if name not in seen: - order.append(name) - return order - - -def compute_children_map(link_infos: Dict[str, LinkInfo]) -> Dict[str, List[str]]: - children: Dict[str, List[str]] = {name: [] for name in link_infos} - for name, info in link_infos.items(): - if info.parent is not None: - children.setdefault(info.parent, []).append(name) - return children - - -def compute_link_depths(link_infos: Dict[str, LinkInfo]) -> Dict[str, int]: - depths: Dict[str, int] = {} - - def depth_of(name: str) -> int: - if name in depths: - return depths[name] - info = link_infos[name] - if info.parent is None: - depths[name] = 0 - else: - depths[name] = depth_of(info.parent) + 1 - return depths[name] - - for name in link_infos: - depth_of(name) - return depths - - -# ============================================================================= -# State pose params -# ============================================================================= - -def load_state_pose_params(robot_data: Dict[str, Any]) -> StatePoseParams: - raw = robot_data.get('state_pose_params', {}) or {} - return StatePoseParams( - numbers_of_elements_to_consider_start=int(raw.get('numbers_of_Elements_to_consider_start', 4)), - numbers_of_elements_to_consider_final=int(raw.get('numbers_of_Elements_to_consider_final', 5)), - solver_in_between_geometrical=bool(raw.get('solver_in_between_geometrical', False)), - solver_after_geometrical=bool(raw.get('solver_after_geometrical', False)), - geometric_passes_per_stage=max(1, int(raw.get('geometric_passes_per_stage', 2))), - revolute_search_coarse_deg=float(raw.get('revolute_search_coarse_deg', 5.0)), - revolute_search_fine_deg=float(raw.get('revolute_search_fine_deg', 1.0)), - root_pose_min_markers=max(1, int(raw.get('root_pose_min_markers', 3))), - ) - - -# ============================================================================= -# Observations -# ============================================================================= - -def load_observed_markers(optimized_markers_file: str) -> Dict[int, Dict[str, Any]]: - data = load_json(optimized_markers_file) - if isinstance(data, dict): - markers = data.get('markers', []) or [] - elif isinstance(data, list): - markers = data - else: - markers = [] - - observed: Dict[int, Dict[str, Any]] = {} - for m in markers: - if not isinstance(m, dict): - continue - if 'marker_id' not in m: - continue - marker_id = int(m['marker_id']) - pos = m.get('position_m', None) - if pos is None or len(pos) != 3: - continue - obs = dict(m) - obs['marker_id'] = marker_id - obs['position_m'] = np.asarray(pos, dtype=np.float64) - observed[marker_id] = obs - return observed - - -def marker_weight(marker_info: MarkerInfo, base_weight: float = 1.0, ref_size: float = 25.0) -> float: - w = base_weight - if marker_info.size is not None: - try: - size = float(marker_info.size) - if size > 0: - w *= max(0.35, math.sqrt(size / ref_size)) - except Exception: - pass - return w - - -# ============================================================================= -# Forward kinematics -# ============================================================================= - -def link_static_transform(link: LinkInfo) -> np.ndarray: - Rm = rotation_matrix_xyz(*link.mount_rotation_deg, degrees=True) - return make_transform(Rm, link.mount_position_m) - - -def joint_motion_transform(link: LinkInfo, q_value: float) -> np.ndarray: - joint_type = (link.joint_type or '').strip().lower() - if link.joint_axis is None: - return np.eye(4, dtype=np.float64) - - axis = normalize(link.joint_axis) - if joint_type == 'linear': - return make_transform(np.eye(3), axis * float(q_value)) - if joint_type == 'revolute': - return make_transform(axis_angle_rotation(axis, float(q_value)), np.zeros(3)) - return np.eye(4, dtype=np.float64) - - -def world_to_link_transform( - link_name: str, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - cache: Dict[Tuple[str, Tuple[Tuple[str, float], ...]], np.ndarray], - joint_override: Optional[Dict[str, float]] = None, -) -> np.ndarray: - override_items = tuple(sorted((joint_override or {}).items())) - cache_key = (link_name, override_items) - if cache_key in cache: - return cache[cache_key] - - link = link_infos[link_name] - if link.parent is None: - T = make_transform(state['root_R'], state['root_t']) - cache[cache_key] = T - return T - - parent_T = world_to_link_transform(link.parent, link_infos, state, cache, joint_override=joint_override) - - T = parent_T @ make_transform(np.eye(3), link.joint_origin_m) - - joint_values = state['joint_values'] - q = joint_override.get(link.name, joint_values.get(link.joint_variable, 0.0)) if joint_override else joint_values.get(link.joint_variable, 0.0) - T = T @ joint_motion_transform(link, q) - - R_static = rotation_matrix_xyz(*link.joint_rotation_deg, degrees=True) - T = T @ make_transform(R_static, np.zeros(3)) - - T = T @ link_static_transform(link) - - cache[cache_key] = T - return T - - -def predict_marker_positions( - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - joint_override: Optional[Dict[str, float]] = None, - active_links: Optional[set[str]] = None, -) -> Dict[int, np.ndarray]: - pred: Dict[int, np.ndarray] = {} - cache: Dict[Tuple[str, Tuple[Tuple[str, float], ...]], np.ndarray] = {} - for link_name, link in link_infos.items(): - if active_links is not None and link_name not in active_links: - continue - T = world_to_link_transform(link_name, link_infos, state, cache, joint_override=joint_override) - for marker in link.markers: - pred[marker.marker_id] = transform_point(T, marker.local_pos_m) - return pred - - -def collect_observations_by_link( - observed_markers: Dict[int, Dict[str, Any]], - active_links: Optional[set[str]] = None, -) -> Dict[str, List[int]]: - by_link: Dict[str, List[int]] = {} - for marker_id, obs in observed_markers.items(): - link = obs.get('link', None) - if link is None or link == 'unknown': - continue - if active_links is not None and link not in active_links: - continue - by_link.setdefault(link, []).append(marker_id) - return by_link - - -# ============================================================================= -# Initial geometric root pose -# ============================================================================= - -def initial_root_pose( - root_link: LinkInfo, - observed_markers: Dict[int, Dict[str, Any]], - min_markers: int = 3, -) -> Tuple[np.ndarray, np.ndarray]: - P = [] - Q = [] - W = [] - - for marker in root_link.markers: - if marker.marker_id in observed_markers: - obs = np.asarray(observed_markers[marker.marker_id]['position_m'], dtype=np.float64) - P.append(marker.local_pos_m) - Q.append(obs) - W.append(marker_weight(marker)) - - if len(P) >= min_markers: - return kabsch(np.asarray(P), np.asarray(Q), np.asarray(W)) - - if len(P) >= 1: - # Weak fallback: keep world axes and place root so the first marker matches. - marker = root_link.markers[0] - obs = np.asarray(observed_markers[marker.marker_id]['position_m'], dtype=np.float64) - return np.eye(3, dtype=np.float64), obs - marker.local_pos_m - - return np.eye(3, dtype=np.float64), np.zeros(3, dtype=np.float64) - - -# ============================================================================= -# Subtree helpers -# ============================================================================= - -def subtree_links(link_name: str, children_map: Dict[str, List[str]], active_links: set[str]) -> List[str]: - out: List[str] = [] - queue = [link_name] - while queue: - cur = queue.pop(0) - if cur not in active_links: - continue - out.append(cur) - for ch in children_map.get(cur, []): - if ch in active_links: - queue.append(ch) - return out - - -def marker_ids_in_links(link_infos: Dict[str, LinkInfo], links: List[str]) -> List[int]: - ids: List[int] = [] - for link_name in links: - for m in link_infos[link_name].markers: - ids.append(m.marker_id) - return ids - - -# ============================================================================= -# Geometric joint estimation -# ============================================================================= - -def current_joint_value(state: Dict[str, Any], link: LinkInfo) -> float: - return float(state['joint_values'].get(link.joint_variable, 0.0)) if link.joint_variable else 0.0 - - -def world_joint_axis_for_link( - link_name: str, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], -) -> np.ndarray: - link = link_infos[link_name] - if link.parent is None or link.joint_axis is None: - return np.array([1.0, 0.0, 0.0], dtype=np.float64) - - cache: Dict[Tuple[str, Tuple[Tuple[str, float], ...]], np.ndarray] = {} - parent_T = world_to_link_transform(link.parent, link_infos, state, cache) - axis_world = parent_T[:3, :3] @ normalize(link.joint_axis) - return normalize(axis_world) - - -def estimate_linear_joint_value( - link_name: str, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - active_links: set[str], - children_map: Dict[str, List[str]], -) -> Tuple[float, Dict[str, Any]]: - link = link_infos[link_name] - if link.joint_variable is None: - return 0.0, {'reason': 'no_joint_variable'} - - subtree = subtree_links(link_name, children_map, active_links) - obs_ids = [mid for mid in marker_ids_in_links(link_infos, subtree) if mid in observed_markers] - if not obs_ids: - return current_joint_value(state, link), {'reason': 'no_observations'} - - axis_world = world_joint_axis_for_link(link_name, link_infos, state) - - # Evaluate current prediction with this joint forced to zero. - override = {link_name: 0.0} - pred0 = predict_marker_positions(link_infos, state, joint_override=override, active_links=active_links) - - num = 0.0 - den = 0.0 - used = 0 - per_marker = [] - for mid in obs_ids: - if mid not in pred0: - continue - marker = next((m for m in link_infos[observed_markers[mid]['link']].markers if m.marker_id == mid), None) - w = marker_weight(marker) if marker is not None else 1.0 - p_obs = np.asarray(observed_markers[mid]['position_m'], dtype=np.float64) - p0 = pred0[mid] - q_i = float(np.dot(axis_world, p_obs - p0)) - num += w * q_i - den += w - used += 1 - per_marker.append({'marker_id': mid, 'q_i': q_i, 'weight': w}) - - if den <= 1e-12: - return current_joint_value(state, link), {'reason': 'zero_weight'} - - q = num / den - return float(q), { - 'reason': 'weighted_projection', - 'used_markers': used, - 'axis_world': [float(x) for x in axis_world], - 'per_marker': per_marker, - } - - -def marker_residual_error_for_state( - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - active_links: Optional[set[str]] = None, -) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]: - pred = predict_marker_positions(link_infos, state, active_links=active_links) - - marker_reports: List[Dict[str, Any]] = [] - errors = [] - for marker_id, obs in observed_markers.items(): - if marker_id not in pred: - continue - p_obs = np.asarray(obs['position_m'], dtype=np.float64) - p_pred = pred[marker_id] - err = p_pred - p_obs - err_norm = float(np.linalg.norm(err)) - errors.append(err_norm) - marker_reports.append({ - 'marker_id': int(marker_id), - 'link': obs.get('link', 'unknown'), - 'observed_position_m': [float(x) for x in p_obs], - 'predicted_position_m': [float(x) for x in p_pred], - 'error_m': [float(x) for x in err], - 'error_norm_m': err_norm, - 'error_norm_mm': err_norm * 1000.0, - 'marker_size': obs.get('position_mm', None), - }) - - if errors: - arr = np.asarray(errors, dtype=np.float64) - stats = { - 'num_markers_used': int(len(errors)), - 'mean_error_m': float(np.mean(arr)), - 'median_error_m': float(np.median(arr)), - 'rms_error_m': float(np.sqrt(np.mean(arr ** 2))), - 'worst_error_m': float(np.max(arr)), - 'p80_error_m': float(np.quantile(arr, 0.80)), - 'p90_error_m': float(np.quantile(arr, 0.90)), - } - else: - stats = { - 'num_markers_used': 0, - 'mean_error_m': None, - 'median_error_m': None, - 'rms_error_m': None, - 'worst_error_m': None, - 'p80_error_m': None, - 'p90_error_m': None, - } - - return marker_reports, stats - - -def revolute_weighted_error( - link_name: str, - q: float, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - active_links: set[str], - children_map: Dict[str, List[str]], -) -> float: - link = link_infos[link_name] - if link.joint_variable is None: - return float('inf') - - subtree = subtree_links(link_name, children_map, active_links) - obs_ids = [mid for mid in marker_ids_in_links(link_infos, subtree) if mid in observed_markers] - if not obs_ids: - return float('inf') - - override = {link_name: q} - pred = predict_marker_positions(link_infos, state, joint_override=override, active_links=active_links) - - err = 0.0 - wsum = 0.0 - for mid in obs_ids: - if mid not in pred: - continue - marker = next((m for m in link_infos[observed_markers[mid]['link']].markers if m.marker_id == mid), None) - w = marker_weight(marker) if marker is not None else 1.0 - d = pred[mid] - np.asarray(observed_markers[mid]['position_m'], dtype=np.float64) - err += w * float(np.dot(d, d)) - wsum += w - - if wsum <= 1e-12: - return float('inf') - return err / wsum - - -def estimate_revolute_joint_value( - link_name: str, - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - active_links: set[str], - children_map: Dict[str, List[str]], - coarse_step_deg: float = 5.0, - fine_step_deg: float = 1.0, -) -> Tuple[float, Dict[str, Any]]: - link = link_infos[link_name] - if link.joint_variable is None: - return 0.0, {'reason': 'no_joint_variable'} - - subtree = subtree_links(link_name, children_map, active_links) - obs_ids = [mid for mid in marker_ids_in_links(link_infos, subtree) if mid in observed_markers] - if not obs_ids: - return current_joint_value(state, link), {'reason': 'no_observations'} - - q0 = current_joint_value(state, link) - best_q = q0 - best_e = float('inf') - used = len(obs_ids) - - # Coarse-to-fine search around the current value, but still wide enough to catch flips. - centers = [q0, 0.0] - span_list = [math.pi, math.pi / 4.0, math.pi / 16.0] - step_list = [math.radians(coarse_step_deg), math.radians(fine_step_deg), math.radians(max(0.25, fine_step_deg / 2.0))] - - for center in centers: - for span, step in zip(span_list, step_list): - if step <= 0: - continue - qs = np.arange(center - span, center + span + 0.5 * step, step) - for q in qs: - e = revolute_weighted_error(link_name, float(q), link_infos, state, observed_markers, active_links, children_map) - if e < best_e: - best_e = e - best_q = float(q) - center = best_q - - return wrap_angle_rad(best_q), { - 'reason': 'coarse_to_fine_scan', - 'used_markers': used, - 'best_error': best_e, - 'q0': q0, - 'search_span_rad': math.pi, - } - - -# ============================================================================= -# Geometric prefix estimation -# ============================================================================= - -def build_state_template(link_infos: Dict[str, LinkInfo]) -> Dict[str, Any]: - return { - 'root_R': np.eye(3, dtype=np.float64), - 'root_t': np.zeros(3, dtype=np.float64), - 'joint_values': {li.joint_variable: 0.0 for li in link_infos.values() if li.joint_variable}, - } - - -def copy_state(state: Dict[str, Any]) -> Dict[str, Any]: - return { - 'root_R': np.asarray(state['root_R'], dtype=np.float64).copy(), - 'root_t': np.asarray(state['root_t'], dtype=np.float64).copy(), - 'joint_values': dict(state.get('joint_values', {})), - } - - -def active_observations_for_links( - observed_markers: Dict[int, Dict[str, Any]], - active_links: set[str], -) -> Dict[int, Dict[str, Any]]: - out: Dict[int, Dict[str, Any]] = {} - for marker_id, obs in observed_markers.items(): - link_name = obs.get('link', None) - if link_name in active_links: - out[marker_id] = obs - return out - - -def optimize_geometric_prefix( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - initial_state: Dict[str, Any], - active_links: List[str], - cfg: StatePoseParams, -) -> Tuple[Dict[str, Any], Dict[str, Any]]: - active_set = set(active_links) - children_map = compute_children_map(link_infos) - stage_obs = active_observations_for_links(observed_markers, active_set) - - state = copy_state(initial_state) - stage_info: Dict[str, Any] = { - 'method': 'geometric_prefix', - 'active_links': active_links, - 'active_observations': len(stage_obs), - 'joint_updates': [], - } - - # Root pose is refreshed from the root markers if possible. - root_link_name = next((ln for ln in active_links if link_infos[ln].parent is None), None) - if root_link_name is not None: - root_link = link_infos[root_link_name] - root_R, root_t = initial_root_pose(root_link, stage_obs, min_markers=cfg.root_pose_min_markers) - state['root_R'] = root_R - state['root_t'] = root_t - stage_info['root_link'] = root_link_name - stage_info['root_pose_source'] = 'kabsch_root_markers' if len([m for m in root_link.markers if m.marker_id in stage_obs]) >= cfg.root_pose_min_markers else 'weak_single_marker_fallback' - - # Forward geometric passes. - active_joint_links = [ln for ln in active_links if link_infos[ln].parent is not None] - for pass_idx in range(cfg.geometric_passes_per_stage): - pass_updates = [] - for link_name in active_joint_links: - link = link_infos[link_name] - jt = (link.joint_type or '').strip().lower() - if jt == 'linear': - q_old = current_joint_value(state, link) - q_new, info = estimate_linear_joint_value(link_name, link_infos, state, stage_obs, active_set, children_map) - state['joint_values'][link.joint_variable] = q_new - pass_updates.append({'link': link_name, 'joint_variable': link.joint_variable, 'joint_type': jt, 'old': q_old, 'new': q_new, 'info': info}) - elif jt == 'revolute': - q_old = current_joint_value(state, link) - q_new, info = estimate_revolute_joint_value( - link_name, link_infos, state, stage_obs, active_set, children_map, - coarse_step_deg=cfg.revolute_search_coarse_deg, - fine_step_deg=cfg.revolute_search_fine_deg, - ) - state['joint_values'][link.joint_variable] = q_new - pass_updates.append({'link': link_name, 'joint_variable': link.joint_variable, 'joint_type': jt, 'old': q_old, 'new': q_new, 'info': info}) - stage_info[f'pass_{pass_idx+1}_updates'] = pass_updates - - marker_reports, stats = marker_residual_error_for_state(link_infos, state, stage_obs, active_links=active_set) - stage_info['fit_stats'] = stats - stage_info['num_markers_used'] = stats['num_markers_used'] - return state, stage_info - - -# ============================================================================= -# Optional least-squares refinement -# ============================================================================= - -def stage_variables_to_vector(state: Dict[str, Any], active_joint_vars: List[str]) -> np.ndarray: - try: - from scipy.spatial.transform import Rotation - root_rvec = Rotation.from_matrix(state['root_R']).as_rotvec() - except Exception: - root_rvec = np.zeros(3, dtype=np.float64) - - root_t = np.asarray(state['root_t'], dtype=np.float64).reshape(3) - values = list(root_t) + list(np.asarray(root_rvec, dtype=np.float64)) - for var in active_joint_vars: - values.append(float(state['joint_values'].get(var, 0.0))) - return np.asarray(values, dtype=np.float64) - - -def vector_to_state(x: np.ndarray, template_state: Dict[str, Any], active_joint_vars: List[str]) -> Dict[str, Any]: - try: - from scipy.spatial.transform import Rotation - except Exception: - Rotation = None - - x = np.asarray(x, dtype=np.float64).reshape(-1) - out = { - 'root_t': x[0:3].copy(), - 'root_R': template_state['root_R'].copy(), - 'joint_values': dict(template_state['joint_values']), - } - - root_rvec = x[3:6].copy() - if Rotation is not None: - out['root_R'] = Rotation.from_rotvec(root_rvec).as_matrix() - else: - angle = safe_norm(root_rvec) - out['root_R'] = np.eye(3, dtype=np.float64) if angle < 1e-12 else axis_angle_rotation(root_rvec / angle, angle) - - idx = 6 - for var in active_joint_vars: - if idx >= len(x): - break - out['joint_values'][var] = float(x[idx]) - idx += 1 - return out - - -def residuals_stage( - x: np.ndarray, - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - template_state: Dict[str, Any], - active_joint_vars: List[str], - active_links: set[str], - cfg: EstimationConfig, -) -> np.ndarray: - state = vector_to_state(x, template_state, active_joint_vars) - pred = predict_marker_positions(link_infos, state, active_links=active_links) - res: List[float] = [] - - for marker_id, obs in observed_markers.items(): - if marker_id not in pred: - continue - link_name = obs.get('link', None) - marker = None - if link_name is not None and link_name in link_infos: - marker = next((m for m in link_infos[link_name].markers if m.marker_id == marker_id), None) - w = marker_weight(marker, base_weight=cfg.marker_base_weight) if marker is not None else cfg.marker_base_weight - sqrt_w = math.sqrt(max(1e-12, w)) - p_obs = np.asarray(obs['position_m'], dtype=np.float64) - p_pred = pred[marker_id] - d = (p_pred - p_obs) * sqrt_w - res.extend(d.tolist()) - - if cfg.root_pose_prior_weight > 0: - root_t_prior = np.asarray(template_state['root_t'], dtype=np.float64) - try: - from scipy.spatial.transform import Rotation - root_rvec_prior = Rotation.from_matrix(template_state['root_R']).as_rotvec() - except Exception: - root_rvec_prior = np.zeros(3, dtype=np.float64) - w = math.sqrt(max(1e-12, cfg.root_pose_prior_weight)) - res.extend(((x[0:3] - root_t_prior) * w).tolist()) - res.extend(((x[3:6] - root_rvec_prior) * w).tolist()) - - if cfg.joint_prior_weight > 0: - idx = 6 - w = math.sqrt(max(1e-12, cfg.joint_prior_weight)) - for var in active_joint_vars: - if idx >= len(x): - break - q = x[idx] - q0 = template_state['joint_values'].get(var, 0.0) - dq = wrap_angle_rad(float(q - q0)) if abs(q0) <= math.pi * 2.5 else float(q - q0) - res.append(dq * w) - idx += 1 - - return np.asarray(res, dtype=np.float64) - - -def optional_solver_refine( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - state: Dict[str, Any], - active_links: List[str], - cfg: EstimationConfig, -) -> Tuple[Dict[str, Any], Dict[str, Any]]: - try: - from scipy.optimize import least_squares - except Exception: - return state, {'success': False, 'message': 'scipy unavailable'} - - active_joint_vars = [link_infos[ln].joint_variable for ln in active_links if link_infos[ln].joint_variable is not None] - x0 = stage_variables_to_vector(state, active_joint_vars) - active_set = set(active_links) - - result = least_squares( - lambda x: residuals_stage(x, link_infos, observed_markers, state, active_joint_vars, active_set, cfg), - x0, - loss=cfg.robust_loss, - f_scale=1.0, - max_nfev=cfg.max_iterations, - verbose=1, - ) - refined = vector_to_state(result.x, state, active_joint_vars) - info = { - 'success': bool(result.success), - 'status': int(result.status), - 'message': str(result.message), - 'nfev': int(result.nfev), - 'cost': float(np.sum(result.fun ** 2)), - } - return refined, info - - -# ============================================================================= -# Sequential estimation driver -# ============================================================================= - -def sequential_geometric_estimation( - link_infos: Dict[str, LinkInfo], - observed_markers: Dict[int, Dict[str, Any]], - params: StatePoseParams, - cfg: EstimationConfig, -) -> Tuple[Dict[str, Any], List[StageResult]]: - ordered = topological_links(link_infos) - if not ordered: - return build_state_template(link_infos), [] - - start_n = max(1, min(int(params.numbers_of_elements_to_consider_start), len(ordered))) - final_n = max(start_n, min(int(params.numbers_of_elements_to_consider_final), len(ordered))) - - state = build_state_template(link_infos) - stage_results: List[StageResult] = [] - - for n in range(start_n, final_n + 1): - active_links = ordered[:n] - stage_state, stage_info = optimize_geometric_prefix(link_infos, observed_markers, state, active_links, params) - state = stage_state - - if params.solver_in_between_geometrical: - state, solver_info = optional_solver_refine(link_infos, observed_markers, state, active_links, cfg) - stage_info['solver_in_between'] = solver_info - - stage_obs = active_observations_for_links(observed_markers, set(active_links)) - marker_reports, stats = marker_residual_error_for_state(link_infos, state, stage_obs, active_links=set(active_links)) - - active_joint_vars = [link_infos[ln].joint_variable for ln in active_links if link_infos[ln].joint_variable is not None] - stage_result = StageResult( - stage_idx=len(stage_results), - active_links=active_links, - active_joint_vars=active_joint_vars, - num_markers_used=stats['num_markers_used'], - mean_error_m=stats['mean_error_m'], - rms_error_m=stats['rms_error_m'], - worst_error_m=stats['worst_error_m'], - method='geometric_prefix' + ('+solver' if params.solver_in_between_geometrical else ''), - optimizer_info=stage_info, - ) - stage_results.append(stage_result) - - if cfg.show_stage_reports: - print( - f"[INFO] Stage {stage_result.stage_idx} | links={len(active_links)} | joints={len(active_joint_vars)} | " - f"markers={stage_result.num_markers_used} | mean={None if stats['mean_error_m'] is None else stats['mean_error_m']*1000.0:.2f} mm" - ) - - if params.solver_after_geometrical: - state, solver_info = optional_solver_refine(link_infos, observed_markers, state, ordered[:final_n], cfg) - if stage_results: - stage_results[-1].optimizer_info['solver_after_geometrical'] = solver_info - - return state, stage_results - - -# ============================================================================= -# Output -# ============================================================================= - -def state_to_json( - robot_data: Dict[str, Any], - link_infos: Dict[str, LinkInfo], - state: Dict[str, Any], - observed_markers: Dict[int, Dict[str, Any]], - marker_reports: List[Dict[str, Any]], - stats: Dict[str, Any], - input_file: str, - robot_file: str, - stage_results: List[StageResult], - params: StatePoseParams, -) -> Dict[str, Any]: - movements = {} - for link_name in topological_links(link_infos): - link = link_infos[link_name] - if not link.joint_variable: - continue - - q = float(state['joint_values'].get(link.joint_variable, 0.0)) - jt = (link.joint_type or '').strip().lower() - entry = { - 'joint_type': jt, - 'link': link_name, - 'estimated': True, - } - if jt == 'revolute': - entry['value_rad'] = q - entry['value_deg'] = float(math.degrees(q)) - elif jt == 'linear': - entry['value_m'] = q - entry['value_mm'] = q * 1000.0 - else: - entry['value'] = q - movements[link.joint_variable] = entry - - link_pose_entries = [] - cache: Dict[Tuple[str, Tuple[Tuple[str, float], ...]], np.ndarray] = {} - for link_name in topological_links(link_infos): - T = world_to_link_transform(link_name, link_infos, state, cache) - R = T[:3, :3] - t = T[:3, 3] - link = link_infos[link_name] - num_used = sum(1 for m in link.markers if m.marker_id in observed_markers) - link_pose_entries.append({ - 'link': link_name, - 'parent': link.parent, - 'position_m': [float(x) for x in t], - 'rotation_matrix': [[float(v) for v in row] for row in R], - 'euler_xyz_deg': [float(x) for x in matrix_to_euler_xyz(R)], - 'num_observed_markers': int(num_used), - 'num_markers_total': int(len(link.markers)), - }) - - root_link = next((name for name, info in link_infos.items() if info.parent is None), None) - root_T = make_transform(state['root_R'], state['root_t']) - - out = { - 'schema_version': '3.0', - 'created_utc': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()), - 'source': { - 'marker_positions_file': input_file, - 'robot_file': robot_file, - }, - 'state_pose_params': { - 'numbers_of_Elements_to_consider_start': params.numbers_of_elements_to_consider_start, - 'numbers_of_Elements_to_consider_final': params.numbers_of_elements_to_consider_final, - 'solver_in_between_geometrical': params.solver_in_between_geometrical, - 'solver_after_geometrical': params.solver_after_geometrical, - 'geometric_passes_per_stage': params.geometric_passes_per_stage, - 'revolute_search_coarse_deg': params.revolute_search_coarse_deg, - 'revolute_search_fine_deg': params.revolute_search_fine_deg, - 'root_pose_min_markers': params.root_pose_min_markers, - }, - 'summary': { - 'num_links': int(len(link_infos)), - 'num_observed_markers': int(len(observed_markers)), - 'num_link_markers': int(sum(len(li.markers) for li in link_infos.values())), - 'root_link': root_link, - 'fit_stats': stats, - 'optimizer': state.get('_optimizer', {}), - 'stages': [ - { - 'stage_idx': int(s.stage_idx), - 'active_links': s.active_links, - 'active_joint_vars': s.active_joint_vars, - 'num_markers_used': int(s.num_markers_used), - 'mean_error_m': s.mean_error_m, - 'rms_error_m': s.rms_error_m, - 'worst_error_m': s.worst_error_m, - 'method': s.method, - 'optimizer_info': s.optimizer_info, - } - for s in stage_results - ], - }, - 'world_pose': { - 'root_translation_m': [float(x) for x in root_T[:3, 3]], - 'root_rotation_matrix': [[float(v) for v in row] for row in root_T[:3, :3]], - 'root_euler_xyz_deg': [float(x) for x in matrix_to_euler_xyz(root_T[:3, :3])], - }, - 'movements': movements, - 'links': link_pose_entries, - 'markers': marker_reports, - } - return out - - -# ============================================================================= -# Main -# ============================================================================= - -def main() -> None: - parser = argparse.ArgumentParser( - description='Sequential geometric robot-state estimation from optimized ArUco marker positions' - ) - parser.add_argument('optimized_markers', help='aruco_positions_optimized*.json') - parser.add_argument('-robot', '--robot', required=True, help='robot.json') - parser.add_argument('-out', '--out', default=None, help='Output robot_state.json path') - parser.add_argument('--maxIterations', type=int, default=120, help='Maximum least-squares iterations per optional refinement stage') - parser.add_argument('--jointPriorWeight', type=float, default=0.0, help='Prior weight for joint variables during optional solver refinement') - parser.add_argument('--rootPosePriorWeight', type=float, default=0.0, help='Prior weight for root pose during optional solver refinement') - parser.add_argument('--markerBaseWeight', type=float, default=1.0, help='Base weight for marker residuals') - parser.add_argument('--noSequential', action='store_true', help='Disable sequential prefix mode and run one prefix stage only') - parser.add_argument('--forceSolverAfter', action='store_true', help='Force solver after the geometric prefix regardless of robot.json') - parser.add_argument('--forceSolverBetween', action='store_true', help='Force solver between geometric stages regardless of robot.json') - - args = parser.parse_args() - - print('[STEP 1] Load robot.json and optimized marker positions...') - robot_data = load_json(args.robot) - link_infos, marker_by_id, issues = parse_robot(robot_data) - observed_map = load_observed_markers(args.optimized_markers) - params = load_state_pose_params(robot_data) - - if args.noSequential: - params.numbers_of_elements_to_consider_start = len(topological_links(link_infos)) - params.numbers_of_elements_to_consider_final = len(topological_links(link_infos)) - - if args.forceSolverBetween: - params.solver_in_between_geometrical = True - if args.forceSolverAfter: - params.solver_after_geometrical = True - - for issue in issues: - print(issue) - - print(f"[INFO] Links: {len(link_infos)}") - print(f"[INFO] Known robot markers: {len(marker_by_id)}") - print(f"[INFO] Observed optimized markers: {len(observed_map)}") - print(f"[INFO] state_pose_params: start={params.numbers_of_elements_to_consider_start}, final={params.numbers_of_elements_to_consider_final}, between={params.solver_in_between_geometrical}, after={params.solver_after_geometrical}") - - cfg = EstimationConfig( - marker_base_weight=float(args.markerBaseWeight), - root_pose_prior_weight=float(args.rootPosePriorWeight), - joint_prior_weight=float(args.jointPriorWeight), - robust_loss='soft_l1', - max_iterations=int(args.maxIterations), - show_stage_reports=True, - use_geometric_prefix=True, - ) - - print('\n[STEP 2] Geometric sequential pose estimation...') - final_state, stage_results = sequential_geometric_estimation( - link_infos=link_infos, - observed_markers=observed_map, - params=params, - cfg=cfg, - ) - - print('\n[STEP 3] Build report and save robot_state.json...') - marker_reports, stats = marker_residual_error_for_state(link_infos, final_state, observed_map) - - out_data = state_to_json( - robot_data=robot_data, - link_infos=link_infos, - state=final_state, - observed_markers=observed_map, - marker_reports=marker_reports, - stats=stats, - input_file=args.optimized_markers, - robot_file=args.robot, - stage_results=stage_results, - params=params, - ) - - out_path = args.out - if out_path is None: - out_dir = os.path.dirname(args.optimized_markers) or '.' - out_path = os.path.join(out_dir, 'robot_state.json') - - save_json(out_path, out_data) - - print(f"[INFO] Saved to {out_path}") - if stats['mean_error_m'] is not None: - print(f"[INFO] Mean marker error: {stats['mean_error_m'] * 1000.0:.2f} mm") - print(f"[INFO] RMS marker error : {stats['rms_error_m'] * 1000.0:.2f} mm") - print(f"[INFO] Worst marker error: {stats['worst_error_m'] * 1000.0:.2f} mm") - else: - print('[INFO] No marker error statistics available.') - - -if __name__ == '__main__': - main() diff --git a/pipeline/4_robotState_estimation_v7.py b/pipeline/4_robotState_estimation_v7.py deleted file mode 100644 index 1e8dc83..0000000 --- a/pipeline/4_robotState_estimation_v7.py +++ /dev/null @@ -1,484 +0,0 @@ -#!/usr/bin/env python3 -""" -4_robotState_estimation_v7.py - -Estimate the Arm1 joint angle from ArUco marker positions. - -What this script does ---------------------- -1. Loads a robot configuration JSON and extracts the local marker positions of Arm1. -2. Loads an observation JSON with marker positions (e.g. aruco_positions_optimized.json). -3. Matches observed markers to Arm1 markers by marker_id. -4. Estimates the Arm1 angle in two ways: - - Option 1 (single marker, optional): - ---------------------------------- - If a world-space joint origin is known, estimate angle from one marker by comparing - the vector from joint origin -> marker in the model and in the observation. - - Option 2 (marker pairs, default and robust): - ------------------------------------------ - For every pair of Arm1 markers, estimate the rotation angle from the relative vector - between the two markers. This is translation-invariant and usually the preferred method. - -5. Aggregates all valid estimates using a weighted circular mean and reports: - mean angle, circular variance, circular std, linear std on wrapped samples, and per-estimate details. - -Coordinate conventions ----------------------- -The provided robot config says: -- right-handed coordinate system -- x right, y backward, z up - -Arm1 rotates around the x-axis (joint axis [-1, 0, 0] in the supplied config). -The script therefore works in 3D and automatically respects the joint axis sign. - -Usage ------ - python 4_robotState_estimation_v7.py \ - --robot-json robot_running_2026_05_30.json \ - --aruco-json aruco_positions_optimized.json - -Optional: - --joint-origin-world X Y Z # enables single-marker estimates - --output-json result.json - --arm-link Arm1 - -The script prints a concise report and can also write a JSON summary. - -Notes ------ -- This script is intentionally defensive: it accepts positions in meters or millimeters. -- It does not require any additional robot state beyond the Arm1 marker geometry. -- If only a subset of Arm1 markers is observed, the pairwise estimator still works. -""" - -from __future__ import annotations - -import argparse -import json -import math -from dataclasses import dataclass, asdict -from itertools import combinations -from pathlib import Path -from typing import Dict, Iterable, List, Optional, Sequence, Tuple - -import numpy as np - - -# ---------------------------- -# Data structures -# ---------------------------- - -@dataclass -class MarkerSpec: - marker_id: int - local_position_mm: np.ndarray - - -@dataclass -class MarkerObservation: - marker_id: int - position_mm: np.ndarray - link: Optional[str] = None - - -@dataclass -class AngleEstimate: - source: str - angle_rad: float - angle_deg: float - weight: float - marker_ids: Tuple[int, ...] - - -# ---------------------------- -# Helpers -# ---------------------------- - -def _as_np3(value: Sequence[float]) -> np.ndarray: - arr = np.asarray(value, dtype=float).reshape(3) - return arr - - -def load_json(path: Path) -> dict: - with path.open("r", encoding="utf-8") as f: - return json.load(f) - - -def unit_scale_to_mm(units: Optional[str]) -> float: - if not units: - return 1.0 - u = str(units).strip().lower() - if u in {"mm", "millimeter", "millimeters"}: - return 1.0 - if u in {"m", "meter", "meters"}: - return 1000.0 - if u in {"cm", "centimeter", "centimeters"}: - return 10.0 - # conservative default - return 1.0 - - -def normalize_angle_rad(angle: float) -> float: - """Wrap to (-pi, pi].""" - return (angle + math.pi) % (2 * math.pi) - math.pi - - -def angle_between_vectors(v_from: np.ndarray, v_to: np.ndarray, axis: np.ndarray) -> float: - """ - Signed angle rotating v_from onto v_to around axis. - - Uses atan2( axis_hat · (v_from × v_to), v_from · v_to ). - """ - a = np.asarray(axis, dtype=float).reshape(3) - an = np.linalg.norm(a) - if an == 0: - raise ValueError("Rotation axis must be non-zero.") - a = a / an - - v1 = np.asarray(v_from, dtype=float).reshape(3) - v2 = np.asarray(v_to, dtype=float).reshape(3) - - n1 = np.linalg.norm(v1) - n2 = np.linalg.norm(v2) - if n1 == 0 or n2 == 0: - raise ValueError("Cannot compute angle for zero-length vector.") - cross_term = float(np.dot(a, np.cross(v1, v2))) - dot_term = float(np.dot(v1, v2)) - return math.atan2(cross_term, dot_term) - - -def weighted_circular_mean(angles_rad: Sequence[float], weights: Sequence[float]) -> Tuple[float, float, float]: - """ - Returns: - mean_angle_rad, circular_variance, circular_std_rad - - circular_variance = 1 - R, where R is the normalized resultant length. - circular_std_rad = sqrt(-2 ln R) if R>0 else pi. - """ - if len(angles_rad) == 0: - raise ValueError("No angles provided.") - - ang = np.asarray(angles_rad, dtype=float) - w = np.asarray(weights, dtype=float) - w = np.clip(w, 0.0, None) - - if np.sum(w) <= 0: - w = np.ones_like(w) - - s = np.sum(w * np.sin(ang)) - c = np.sum(w * np.cos(ang)) - mean = math.atan2(s, c) - - R = math.sqrt(s * s + c * c) / float(np.sum(w)) - R = min(max(R, 0.0), 1.0) - - circular_variance = 1.0 - R - circular_std = math.sqrt(max(0.0, -2.0 * math.log(max(R, 1e-15)))) if R > 0 else math.pi - return mean, circular_variance, circular_std - - -def weighted_linear_std_rad(angles_rad: Sequence[float], mean_rad: float, weights: Sequence[float]) -> float: - if len(angles_rad) == 0: - return float("nan") - ang = np.asarray([normalize_angle_rad(a - mean_rad) for a in angles_rad], dtype=float) - w = np.asarray(weights, dtype=float) - w = np.clip(w, 0.0, None) - if np.sum(w) <= 0: - w = np.ones_like(w) - mu = np.sum(w * ang) / np.sum(w) - var = np.sum(w * (ang - mu) ** 2) / np.sum(w) - return float(math.sqrt(max(0.0, var))) - - -def extract_arm_markers(robot: dict, arm_link_name: str) -> Tuple[np.ndarray, List[MarkerSpec], np.ndarray]: - """ - Returns: - joint_origin_mm, markers, joint_axis - """ - links = robot.get("links", {}) - if arm_link_name not in links: - # case-insensitive fallback - lookup = {k.lower(): k for k in links.keys()} - if arm_link_name.lower() not in lookup: - raise KeyError(f"Link '{arm_link_name}' not found in robot.json.") - arm_link_name = lookup[arm_link_name.lower()] - - arm = links[arm_link_name] - jt = arm.get("jointToParent", {}) - joint_origin_mm = _as_np3(jt.get("origin", [0, 0, 0])) - joint_axis = _as_np3(jt.get("axis", [1, 0, 0])) - - markers = [] - for m in arm.get("markers", []): - if "id" not in m or "position" not in m: - continue - markers.append(MarkerSpec(marker_id=int(m["id"]), local_position_mm=_as_np3(m["position"]))) - - if not markers: - raise ValueError(f"No markers found on link '{arm_link_name}'.") - - return joint_origin_mm, markers, joint_axis - - -def load_observations(observations_json: dict) -> List[MarkerObservation]: - markers = observations_json.get("markers", []) - units = observations_json.get("units", {}) - scale = 1.0 - if isinstance(units, dict): - scale = unit_scale_to_mm(units.get("length")) - else: - scale = unit_scale_to_mm(units) - - obs: List[MarkerObservation] = [] - for m in markers: - if "marker_id" not in m and "id" not in m: - continue - marker_id = int(m.get("marker_id", m.get("id"))) - if "position_mm" in m: - pos = _as_np3(m["position_mm"]) - elif "position_m" in m: - pos = _as_np3(m["position_m"]) * 1000.0 - elif "position" in m: - pos = _as_np3(m["position"]) * scale - else: - continue - obs.append(MarkerObservation(marker_id=marker_id, position_mm=pos, link=m.get("link"))) - return obs - - -def match_markers(specs: Sequence[MarkerSpec], observations: Sequence[MarkerObservation]) -> Dict[int, Tuple[np.ndarray, np.ndarray]]: - """ - Returns marker_id -> (local_position_mm, observed_position_mm) - """ - spec_map = {m.marker_id: m.local_position_mm for m in specs} - out = {} - for o in observations: - if o.marker_id in spec_map: - out[o.marker_id] = (spec_map[o.marker_id], o.position_mm) - return out - - -def estimate_pairwise_angles( - matched: Dict[int, Tuple[np.ndarray, np.ndarray]], - axis: np.ndarray, - min_baseline_mm: float = 1.0, -) -> List[AngleEstimate]: - estimates: List[AngleEstimate] = [] - ids = sorted(matched.keys()) - - for id1, id2 in combinations(ids, 2): - p1_local, p1_obs = matched[id1] - p2_local, p2_obs = matched[id2] - - v_local = p2_local - p1_local - v_obs = p2_obs - p1_obs - - baseline_local = float(np.linalg.norm(v_local)) - baseline_obs = float(np.linalg.norm(v_obs)) - if baseline_local < min_baseline_mm or baseline_obs < min_baseline_mm: - continue - - try: - angle = angle_between_vectors(v_local, v_obs, axis) - except ValueError: - continue - - # Weight long baselines a little more strongly; if a pair is very short, it becomes noisy. - weight = max(1e-6, baseline_local * baseline_obs) - estimates.append( - AngleEstimate( - source="pair", - angle_rad=normalize_angle_rad(angle), - angle_deg=math.degrees(normalize_angle_rad(angle)), - weight=weight, - marker_ids=(id1, id2), - ) - ) - return estimates - - -def estimate_single_marker_angles( - matched: Dict[int, Tuple[np.ndarray, np.ndarray]], - joint_origin_world_mm: np.ndarray, - axis: np.ndarray, -) -> List[AngleEstimate]: - """ - Single-marker estimates require a known world-space joint origin. - - For each marker, compare: - v_local = marker_local - joint_origin_local - v_obs = marker_obs - joint_origin_world - - In the provided Arm1 config the joint origin is the local origin of Arm1, so - joint_origin_local is taken as [0,0,0]. - """ - estimates: List[AngleEstimate] = [] - joint_origin_world_mm = _as_np3(joint_origin_world_mm) - - for marker_id, (p_local, p_obs) in matched.items(): - v_local = p_local # Arm1 local origin is at the joint - v_obs = p_obs - joint_origin_world_mm - - if np.linalg.norm(v_local) < 1e-9 or np.linalg.norm(v_obs) < 1e-9: - continue - - try: - angle = angle_between_vectors(v_local, v_obs, axis) - except ValueError: - continue - - weight = float(np.linalg.norm(v_local)) - estimates.append( - AngleEstimate( - source="single", - angle_rad=normalize_angle_rad(angle), - angle_deg=math.degrees(normalize_angle_rad(angle)), - weight=weight, - marker_ids=(marker_id,), - ) - ) - return estimates - - -def build_report( - arm_link_name: str, - joint_origin_mm: np.ndarray, - joint_axis: np.ndarray, - matched: Dict[int, Tuple[np.ndarray, np.ndarray]], - estimates: List[AngleEstimate], -) -> dict: - if not estimates: - raise ValueError("No valid angle estimates could be computed.") - - mean_rad, circ_var, circ_std_rad = weighted_circular_mean( - [e.angle_rad for e in estimates], - [e.weight for e in estimates], - ) - lin_std_rad = weighted_linear_std_rad( - [e.angle_rad for e in estimates], - mean_rad, - [e.weight for e in estimates], - ) - - # unwrap around mean for a stable arithmetic mean/std reporting - unwrapped_deg = [] - for e in estimates: - d = math.degrees(normalize_angle_rad(e.angle_rad - mean_rad)) - unwrapped_deg.append(d) - - report = { - "link": arm_link_name, - "joint_origin_mm": joint_origin_mm.tolist(), - "joint_axis": joint_axis.tolist(), - "num_matched_markers": len(matched), - "num_estimates": len(estimates), - "mean_angle_rad": mean_rad, - "mean_angle_deg": math.degrees(mean_rad), - "circular_variance": circ_var, - "circular_std_rad": circ_std_rad, - "circular_std_deg": math.degrees(circ_std_rad), - "linear_std_rad": lin_std_rad, - "linear_std_deg": math.degrees(lin_std_rad), - "estimate_spread_deg_unwrapped": { - "min": float(np.min(unwrapped_deg)) if unwrapped_deg else None, - "max": float(np.max(unwrapped_deg)) if unwrapped_deg else None, - "mean_abs": float(np.mean(np.abs(unwrapped_deg))) if unwrapped_deg else None, - }, - "estimates": [asdict(e) for e in estimates], - } - return report - - -def pretty_print_report(report: dict) -> None: - print("\nArm angle estimation report") - print("=" * 32) - print(f"Link : {report['link']}") - print(f"Matched markers : {report['num_matched_markers']}") - print(f"Valid estimates : {report['num_estimates']}") - print(f"Mean angle : {report['mean_angle_deg']:.3f} deg") - print(f"Circular variance : {report['circular_variance']:.6f}") - print(f"Circular std : {report['circular_std_deg']:.3f} deg") - print(f"Linear std (wrapped): {report['linear_std_deg']:.3f} deg") - - print("\nIndividual estimates") - print("-" * 32) - for e in report["estimates"]: - mids = ",".join(str(x) for x in e["marker_ids"]) - print(f"{e['source']:>6s} markers [{mids:<8s}] angle={e['angle_deg']:>8.3f} deg weight={e['weight']:.3f}") - - -def estimate_arm1_state( - robot_json: dict, - observations_json: dict, - arm_link_name: str = "Arm1", - joint_origin_world_mm: Optional[Sequence[float]] = None, -) -> dict: - joint_origin_mm, arm_markers, joint_axis = extract_arm_markers(robot_json, arm_link_name) - observations = load_observations(observations_json) - matched = match_markers(arm_markers, observations) - - if not matched: - available = sorted(m.marker_id for m in arm_markers) - observed = sorted(o.marker_id for o in observations) - raise ValueError( - f"No Arm1 marker matches found. Arm markers: {available}. Observed IDs present in file: {observed[:25]}" - + ("..." if len(observed) > 25 else "") - ) - - estimates = estimate_pairwise_angles(matched, axis=joint_axis) - - # Optional single-marker estimates only if a world-space joint origin is supplied. - if joint_origin_world_mm is not None: - estimates.extend(estimate_single_marker_angles(matched, _as_np3(joint_origin_world_mm), axis=joint_axis)) - - report = build_report( - arm_link_name=arm_link_name, - joint_origin_mm=joint_origin_mm, - joint_axis=joint_axis, - matched=matched, - estimates=estimates, - ) - return report - - -def main() -> int: - parser = argparse.ArgumentParser(description="Estimate Arm1 angle from ArUco marker positions.") - parser.add_argument("--robot-json", type=Path, default=Path("robot.json"), help="Path to robot config JSON.") - parser.add_argument("--aruco-json", type=Path, default=Path("aruco_positions_optimized.json"), help="Path to marker observation JSON.") - parser.add_argument("--arm-link", type=str, default="Arm1", help="Name of the link to estimate.") - parser.add_argument( - "--joint-origin-world", - type=float, - nargs=3, - default=None, - metavar=("X", "Y", "Z"), - help="Optional world-space joint origin for single-marker estimates.", - ) - parser.add_argument("--output-json", type=Path, default=None, help="Optional path to write the result JSON.") - args = parser.parse_args() - - robot_json = load_json(args.robot_json) - observations_json = load_json(args.aruco_json) - - report = estimate_arm1_state( - robot_json=robot_json, - observations_json=observations_json, - arm_link_name=args.arm_link, - joint_origin_world_mm=args.joint_origin_world, - ) - - pretty_print_report(report) - - if args.output_json: - args.output_json.parent.mkdir(parents=True, exist_ok=True) - with args.output_json.open("w", encoding="utf-8") as f: - json.dump(report, f, indent=2, ensure_ascii=False) - print(f"\nWrote JSON summary to: {args.output_json}") - - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/pipeline/4_v8_4a_base_slider.py b/pipeline/4_v8_4a_base_slider.py deleted file mode 100644 index 7720f74..0000000 --- a/pipeline/4_v8_4a_base_slider.py +++ /dev/null @@ -1,207 +0,0 @@ -#!/usr/bin/env python3 -""" -4a_base_slider.py ------------------ -Estimate the Base linear-slider position (variable 'x', in mm) from -observed world-space marker positions produced by step 3. - -Mathematical principle ----------------------- -The Base slides along the world x-axis. -Every joint between Base and the observable arm markers rotates around -the x-axis (axis ≈ [-1,0,0] for Arm1, Ellbow, Arm2). - -Rotation around the x-axis NEVER changes the x-coordinate of any point. -Therefore, for every marker on Arm1, Ellbow, or Arm2: - - world_x = x_slider + link_frame_x_at_zero + local_x - -where link_frame_x_at_zero is the x of the link-frame origin in world -when all joint variables are zero (constant, readable from robot.json). - -Rearranging: - x_slider = world_x - link_frame_x_at_zero - local_x - -This holds for ANY rotation angle y, z, a of the arm links. - -This gives one independent estimate per observed marker. -We report their mean (and statistics) as the final estimate. - -Usage ------ - python 4a_base_slider.py --robot robot.json --aruco aruco_positions_optimized.json - - python 4a_base_slider.py --robot robot.json --aruco aruco_positions_optimized.json \\ - --links Arm1 Ellbow Arm2 --output 4a_result.json -""" - -from __future__ import annotations - -import argparse -import json -import math -from pathlib import Path -from typing import Dict, List, Optional - -import numpy as np -from robot_fk import RobotFK - - -# ────────────────────────────────────────────────────────────── -# I/O helpers -# ────────────────────────────────────────────────────────────── - -def _load_json(path: Path) -> dict: - with path.open("r", encoding="utf-8") as f: - return json.load(f) - - -def _load_observed_mm(aruco_json: dict) -> Dict[int, np.ndarray]: - """marker_id → world position in mm, from aruco_positions_optimized.json.""" - result: Dict[int, np.ndarray] = {} - for m in aruco_json.get("markers", []): - mid = int(m.get("marker_id", m.get("id", -1))) - if mid < 0: - continue - if "position_mm" in m: - result[mid] = np.array(m["position_mm"], dtype=float) - elif "position_m" in m: - result[mid] = np.array(m["position_m"], dtype=float) * 1000.0 - return result - - -# ────────────────────────────────────────────────────────────── -# Core estimator -# ────────────────────────────────────────────────────────────── - -def estimate_base_slider( - fk: RobotFK, - observed_mm: Dict[int, np.ndarray], - use_links: Optional[List[str]] = None, - verbose: bool = True, -) -> dict: - """ - Parameters - ---------- - fk : RobotFK instance - observed_mm : dict marker_id -> world position [mm] - use_links : links whose markers are used (default: Arm1, Ellbow, Arm2) - All must be connected to Base via only x-axis rotations. - verbose : print breakdown - - Returns - ------- - dict with keys: - status, x_mean_mm, x_median_mm, x_std_mm, - num_markers, per_marker - """ - if use_links is None: - use_links = ["Arm1", "Ellbow", "Arm2"] - - # Pre-compute link_frame_x at zero-state for each target link - link_x0: Dict[str, float] = {} - for lname in use_links: - if lname in fk.links: - link_x0[lname] = fk.link_x_at_zero_state(lname) - - estimates: List[float] = [] - per_marker: List[dict] = [] - - for lname in use_links: - if lname not in fk.links or lname not in link_x0: - continue - x0 = link_x0[lname] - - for m in fk.links[lname].get("markers", []): - mid = int(m.get("id", -1)) - if mid < 0 or "position" not in m: - continue - if mid not in observed_mm: - continue # marker not seen in this pose - - local_x = float(m["position"][0]) - world_x = float(observed_mm[mid][0]) - x_est = world_x - x0 - local_x - - estimates.append(x_est) - per_marker.append({ - "marker_id": mid, - "link": lname, - "local_x_mm": local_x, - "link_x0_mm": x0, - "world_x_mm": world_x, - "x_estimate_mm": x_est, - }) - - if not estimates: - msg = (f"No observed markers found on links {use_links}. " - "Check that aruco_positions_optimized.json contains " - "markers from those links.") - if verbose: - print(f"[4a FAILED] {msg}") - return {"status": "failed", "reason": msg, "use_links": use_links} - - arr = np.array(estimates) - x_mean = float(np.mean(arr)) - x_median = float(np.median(arr)) - x_std = float(np.std(arr, ddof=0)) - - if verbose: - print("\n── 4a: Base slider (x) ──────────────────────────────────") - print(f" Links used: {use_links}") - print(f" Markers used: {len(estimates)}") - print(f" x = {x_mean:+.2f} mm (median {x_median:+.2f}, σ {x_std:.2f})") - if x_std > 5.0: - print(f" [WARN] high spread ({x_std:.1f} mm) – step-3 errors or wrong link list") - print(f"\n Per-marker:") - print(f" {'ID':>5} {'Link':8} {'local_x':>8} {'world_x':>8} {'x_est':>8}") - print(f" " + "-"*46) - for pm in per_marker: - print(f" {pm['marker_id']:>5} {pm['link']:8} " - f"{pm['local_x_mm']:>8.2f} {pm['world_x_mm']:>8.2f} {pm['x_estimate_mm']:>8.2f}") - - return { - "status": "ok", - "joint": "x", - "description": "Base linear slider", - "x_mean_mm": x_mean, - "x_median_mm": x_median, - "x_std_mm": x_std, - "num_markers": len(estimates), - "use_links": use_links, - "per_marker": per_marker, - } - - -# ────────────────────────────────────────────────────────────── -# CLI -# ────────────────────────────────────────────────────────────── - -def main() -> int: - p = argparse.ArgumentParser(description="4a: estimate Base slider (x)") - p.add_argument("--robot", type=Path, default=Path("robot.json")) - p.add_argument("--aruco", type=Path, default=Path("aruco_positions_optimized.json")) - p.add_argument("--links", nargs="+", default=["Arm1", "Ellbow", "Arm2"], - dest="links", - help="Links whose markers to use (must be x-axis-rotation chain)") - p.add_argument("--output", type=Path, default=None, - help="Optional JSON output path (e.g. 4a_result.json)") - args = p.parse_args() - - fk = RobotFK.from_file(args.robot) - aruco_json = _load_json(args.aruco) - observed_mm = _load_observed_mm(aruco_json) - - result = estimate_base_slider(fk, observed_mm, use_links=args.links) - - if args.output and result["status"] == "ok": - args.output.parent.mkdir(parents=True, exist_ok=True) - with args.output.open("w", encoding="utf-8") as f: - json.dump(result, f, indent=2) - print(f"\n Saved → {args.output}") - - return 0 if result["status"] == "ok" else 1 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/pipeline/4_v8_4d_direct_hand_pose.py b/pipeline/4_v8_4d_direct_hand_pose.py deleted file mode 100644 index 81e436d..0000000 --- a/pipeline/4_v8_4d_direct_hand_pose.py +++ /dev/null @@ -1,464 +0,0 @@ -#!/usr/bin/env python3 -""" -4d_direct_hand_pose.py ----------------------- -Estimate Hand/Palm/Finger joint angles (b, c, e) directly from ArUco -marker observations — WITHOUT relying on step-3 triangulated positions. - -Why this is needed ------------------- -Step 3 triangulates marker centres from multiple cameras. For markers -far above the board (arm extended in Z), the depth estimation from -triangulation degrades: all reference Board markers lie in a flat plane, -so the cameras are poorly conditioned for Z estimation of out-of-plane points. - -This script takes a completely different route: - - 1. For each camera that sees a finger or hand marker, run cv2.solvePnP - on the four detected corners. solvePnP uses the apparent size / - aspect ratio of the marker to recover depth — it is NOT affected - by the flat-board reference plane problem. - - 2. Use the known camera-in-world pose (from step 2) to convert the - per-camera marker pose to world frame. - - 3. Fuse all world-frame marker poses with quality weighting. - - 4. Given world-frame positions for all visible finger markers, and the - known local positions in the FingerA/FingerB frames, solve a small - nonlinear LS problem for (b, c, e) using scipy. - -What you need -------------- - - robot.json - - Step-2 camera-pose JSONs for all cameras - - Step-1 aruco-detection JSONs for all cameras - - Already-estimated x, y, z, a from 4a/4b (pass via --state-json or CLI) - -Usage ------ - python 4d_direct_hand_pose.py \\ - --robot robot.json \\ - --det cam1_aruco_detection.json cam2_aruco_detection.json ... \\ - --pose cam1_camera_pose.json cam2_camera_pose.json ... \\ - --state 4b_arm2_result.json \\ - --output 4d_result.json - -Output ------- - { - "b_deg": ..., "c_deg": ..., "e_mm": ..., - "rms_mm": ..., - "accumulated_state": {"x":..., "y":..., "z":..., "a":..., "b":..., "c":..., "e":...} - } -""" - -from __future__ import annotations - -import argparse -import json -import math -from pathlib import Path -from typing import Any, Dict, List, Optional, Sequence, Tuple - -import cv2 -import numpy as np - -try: - from scipy.optimize import least_squares - _HAS_SCIPY = True -except ImportError: - _HAS_SCIPY = False - -from robot_fk import RobotFK, STATE_KEYS - - -# ────────────────────────────────────────────────────────────── -# I/O -# ────────────────────────────────────────────────────────────── - -def _load(path: Path) -> dict: - with path.open("r", encoding="utf-8") as f: - return json.load(f) - - -def _load_state(path: Path) -> Dict[str, float]: - raw = _load(path) - state = raw.get("accumulated_state", raw.get("state", {})) - return {k: float(v) for k, v in state.items() if k in STATE_KEYS} - - -# ────────────────────────────────────────────────────────────── -# ArUco / PnP helpers -# ────────────────────────────────────────────────────────────── - -def _marker_local_corners(size_m: float) -> np.ndarray: - """Four local corners of a marker (same order as OpenCV ArUco).""" - h = size_m / 2.0 - return np.array([[-h, h, 0], [h, h, 0], [h, -h, 0], [-h, -h, 0]], dtype=np.float32) - - -def _camera_pose_from_json(pose_json: dict) -> Tuple[np.ndarray, np.ndarray]: - """ - Load world-to-camera rotation and translation from step-2 JSON. - Returns rvec (3,), tvec (3,) — the same convention used in step 2. - """ - wtc = pose_json["camera_pose"]["world_to_camera"] - R = np.array(wtc["rotation_matrix"], dtype=np.float32).reshape(3, 3) - t = np.array(wtc["translation_m"], dtype=np.float32).reshape(3) - rvec, _ = cv2.Rodrigues(R) - return rvec.reshape(3), t - - -def _intrinsics_from_detection(det: dict) -> Tuple[np.ndarray, np.ndarray]: - cam = det["camera"] - K = np.array(cam["camera_matrix"], dtype=np.float32).reshape(3, 3) - D = np.array(cam["distortion_coefficients"], dtype=np.float32).reshape(-1, 1) - return K, D - - -def _solve_marker_pose_in_camera( - corners_px: np.ndarray, - marker_size_m: float, - K: np.ndarray, - D: np.ndarray -) -> Optional[Tuple[np.ndarray, np.ndarray]]: - """ - Estimate marker-in-camera pose via solvePnP (IPPE_SQUARE). - Returns (rvec_cm, tvec_cm) or None on failure. - """ - obj = _marker_local_corners(marker_size_m) - img = corners_px.astype(np.float32) - ok, rvec, tvec = cv2.solvePnP(obj, img, K, D, flags=cv2.SOLVEPNP_IPPE_SQUARE) - if not ok: - ok, rvec, tvec = cv2.solvePnP(obj, img, K, D, flags=cv2.SOLVEPNP_ITERATIVE) - if not ok: - return None - return rvec.reshape(3), tvec.reshape(3) - - -def _marker_world_pose( - rvec_cm: np.ndarray, - tvec_cm: np.ndarray, - rvec_wc: np.ndarray, - tvec_wc: np.ndarray -) -> Tuple[np.ndarray, np.ndarray]: - """ - Convert marker-in-camera pose to marker-in-world pose. - - Convention (same as step 2): - X_cam = R_wc @ X_world + t_wc - So: - R_wc = rvec→R(rvec_wc), camera origin in world = -R_wc^T @ t_wc - - Marker pose in world: - R_mw = R_wc^T @ R_cm (world_to_marker rotation) - t_mw = R_wc^T @ (tvec_cm - tvec_wc) - → marker centre in world = -R_mw^T @ t_mw = R_mw^T @ (-t_mw) - - We return (pos_world_m, R_marker_in_world) where - R_marker_in_world maps local marker axes to world axes. - """ - R_wc, _ = cv2.Rodrigues(rvec_wc.reshape(3, 1)) - R_cm, _ = cv2.Rodrigues(rvec_cm.reshape(3, 1)) - - R_cw = R_wc.T # camera-to-world rotation - - # Marker centre in world frame - pos_w = R_cw @ tvec_cm.reshape(3) - R_cw @ tvec_wc.reshape(3) - - # Marker orientation in world frame (columns = marker x,y,z axes in world) - R_mw = R_cw @ R_cm - - return pos_w.astype(np.float64), R_mw.astype(np.float64) - - -# ────────────────────────────────────────────────────────────── -# Multi-camera marker pose fusion -# ────────────────────────────────────────────────────────────── - -def _observation_weight(corners_px: np.ndarray, img_w: int, img_h: int) -> float: - """ - Simple quality weight: larger markers, more central = higher weight. - """ - area = float(cv2.contourArea(corners_px.astype(np.float32))) - cx, cy = corners_px.mean(axis=0) - dx = abs(cx - img_w / 2.0) / (img_w / 2.0) - dy = abs(cy - img_h / 2.0) / (img_h / 2.0) - centrality = 1.0 - 0.5 * (dx + dy) - return max(0.05, (area / 500.0) * centrality) - - -def collect_marker_world_poses( - detection_files: List[Path], - pose_files: List[Path], - target_marker_ids: set, - marker_size_m: float, - verbose: bool = True, -) -> Dict[int, List[Dict[str, Any]]]: - """ - For each target marker, collect world-frame pose estimates from all cameras. - - Returns: marker_id → list of {pos_m, R, weight, camera_id} - """ - result: Dict[int, List[Dict[str, Any]]] = {} - - for det_path, pose_path in zip(detection_files, pose_files): - det = _load(det_path) - pose_json = _load(pose_path) - - K, D = _intrinsics_from_detection(det) - rvec_wc, tvec_wc = _camera_pose_from_json(pose_json) - - cam_id = det.get("camera", {}).get("camera_id", str(det_path)) - img_w = int(det.get("image", {}).get("width_px", 1280)) - img_h = int(det.get("image", {}).get("height_px", 720)) - - for d in det.get("detections", []): - mid = int(d.get("marker_id", -1)) - if mid not in target_marker_ids: - continue - corners = np.array(d.get("image_points_px", []), dtype=np.float32).reshape(4, 2) - if corners.shape != (4, 2): - continue - - pnp = _solve_marker_pose_in_camera(corners, marker_size_m, K, D) - if pnp is None: - continue - rvec_cm, tvec_cm = pnp - - pos_w, R_w = _marker_world_pose(rvec_cm, tvec_cm, rvec_wc, tvec_wc) - w = _observation_weight(corners, img_w, img_h) - - result.setdefault(mid, []).append({ - "pos_m": pos_w, - "R": R_w, - "weight": w, - "camera_id": cam_id, - }) - - if verbose: - for mid, obs in result.items(): - print(f" M{mid}: {len(obs)} camera(s) — weights " - f"{[f'{o[\"weight\"]:.2f}' for o in obs]}") - - return result - - -def fuse_marker_positions( - observations: Dict[int, List[Dict[str, Any]]] -) -> Dict[int, np.ndarray]: - """ - Weighted-mean fusion of world-frame marker centre positions (metres). - """ - result: Dict[int, np.ndarray] = {} - for mid, obs_list in observations.items(): - total_w = sum(o["weight"] for o in obs_list) - if total_w < 1e-12: - continue - pos = sum(o["pos_m"] * o["weight"] for o in obs_list) / total_w - result[mid] = pos.astype(np.float64) - return result - - -# ────────────────────────────────────────────────────────────── -# FK-based optimizer for b, c, e -# ────────────────────────────────────────────────────────────── - -def _fk_finger_positions( - fk: RobotFK, - base_state: Dict[str, float], - b: float, - c: float, - e: float -) -> Dict[int, np.ndarray]: - """ - Compute world positions (m) of all FingerA and FingerB markers. - base_state already contains x, y, z, a. - """ - state = dict(base_state) - state.update({"b": b, "c": c, "e": e}) - transforms = fk.compute(state) - result = {} - for link_name in ("FingerA", "FingerB", "Hand", "Palm"): - if link_name not in fk.links: - continue - for m in fk.links[link_name].get("markers", []): - mid = int(m.get("id", -1)) - if mid < 0 or "position" not in m: - continue - # position in METRES - local_mm = np.array(m["position"], dtype=float) - world_m = fk.marker_world(transforms, link_name, local_mm) / 1000.0 - result[mid] = world_m - return result - - -def optimize_bce( - fk: RobotFK, - base_state: Dict[str, float], - observed_m: Dict[int, np.ndarray], - b_init: float = 0.0, - c_init: float = 0.0, - e_init: float = 0.0, - verbose: bool = True, -) -> dict: - """ - Find (b, c, e) minimising reprojection of FK finger-marker positions - to observed world positions. - - Parameters - ---------- - fk : RobotFK - base_state : already-estimated {x, y, z, a} (all in mm/deg) - observed_m : {marker_id: world_position_m} - """ - - if not _HAS_SCIPY: - return {"status": "failed", "reason": "scipy not available (pip install scipy)"} - - def residuals(p): - b, c, e = float(p[0]), float(p[1]), float(p[2]) - fk_pos = _fk_finger_positions(fk, base_state, b, c, e) - r = [] - for mid, obs_p in observed_m.items(): - if mid in fk_pos: - diff = fk_pos[mid] - obs_p - r.extend(diff.tolist()) - return r - - # Initial residual - r0 = residuals([b_init, c_init, e_init]) - if len(r0) < 3: - return { - "status": "failed", - "reason": f"Only {len(r0)//3} finger markers matched. Need ≥1.", - } - - res = least_squares( - residuals, - x0=[b_init, c_init, e_init], - method="lm", - max_nfev=2000, - ) - - b_est, c_est, e_est = float(res.x[0]), float(res.x[1]), float(res.x[2]) - - rms_m = float(np.sqrt(np.mean(np.array(res.fun) ** 2))) - rms_mm = rms_m * 1000.0 - - accum = dict(base_state) - accum.update({"b": b_est, "c": c_est, "e": e_est}) - - if verbose: - print(f"\n── 4d: Hand/Palm/Finger (b, c, e) ──────────────────────") - print(f" Markers used: {len(observed_m)} fused positions") - print(f" b = {b_est:+.2f} ° c = {c_est:+.2f} ° e = {e_est:+.2f} mm") - print(f" RMS position error: {rms_mm:.2f} mm") - if not res.success: - print(f" [WARN] Optimizer: {res.message}") - - return { - "status": "ok", - "b_deg": b_est, - "c_deg": c_est, - "e_mm": e_est, - "rms_mm": rms_mm, - "optimizer_success": bool(res.success), - "num_markers": len(observed_m), - "accumulated_state": accum, - } - - -# ────────────────────────────────────────────────────────────── -# Main -# ────────────────────────────────────────────────────────────── - -def main() -> int: - p = argparse.ArgumentParser( - description="4d: Direct hand/finger pose from per-camera solvePnP") - p.add_argument("--robot", type=Path, required=True) - p.add_argument("--det", "-d", type=Path, nargs="+", required=True, - help="*_aruco_detection.json files (one per camera)") - p.add_argument("--pose", "-p", type=Path, nargs="+", required=True, - help="*_camera_pose.json files (same order as --det)") - p.add_argument("--state", type=Path, default=None, - help="JSON from previous 4b step (accumulated_state)") - for k in ("x", "y", "z", "a"): - p.add_argument(f"--{k}", type=float, default=None, - help=f"Known {k} value (overrides --state)") - p.add_argument("--b-init", type=float, default=0.0) - p.add_argument("--c-init", type=float, default=0.0) - p.add_argument("--e-init", type=float, default=0.0) - p.add_argument("--output", type=Path, default=None) - args = p.parse_args() - - if len(args.det) != len(args.pose): - print("[ERROR] --det and --pose must have the same number of files") - return 1 - - # Base state from file or CLI - base_state: Dict[str, float] = {} - if args.state: - base_state = _load_state(args.state) - print(f" Loaded state: {base_state}") - for k in ("x", "y", "z", "a"): - v = getattr(args, k, None) - if v is not None: - base_state[k] = float(v) - - # Load FK - fk = RobotFK.from_file(args.robot) - - # Which markers belong to Hand/Palm/FingerA/FingerB? - target_ids: set = set() - for link_name in ("Hand", "Palm", "FingerA", "FingerB"): - for m in fk.links.get(link_name, {}).get("markers", []): - mid = int(m.get("id", -1)) - if mid >= 0: - target_ids.add(mid) - - marker_size_m = float( - fk.robot.get("vision_config", {}).get("MarkerSize", 0.025) - ) - - print(f"\n Target marker IDs: {sorted(target_ids)}") - print(f" Marker size: {marker_size_m*1000:.1f} mm") - print(f" Cameras: {len(args.det)}") - - # Collect world-frame poses from all cameras via solvePnP - print("\n Per-camera solvePnP:") - world_pose_obs = collect_marker_world_poses( - args.det, args.pose, target_ids, marker_size_m, verbose=True - ) - - if not world_pose_obs: - print("[ERROR] No target markers found in any detection file.") - return 1 - - # Fuse positions - observed_m = fuse_marker_positions(world_pose_obs) - print(f"\n Fused {len(observed_m)} marker world positions") - - # Optimise b, c, e - result = optimize_bce( - fk = fk, - base_state = base_state, - observed_m = observed_m, - b_init = args.b_init, - c_init = args.c_init, - e_init = args.e_init, - verbose = True, - ) - - if args.output and result["status"] == "ok": - args.output.parent.mkdir(parents=True, exist_ok=True) - with args.output.open("w", encoding="utf-8") as f: - json.dump(result, f, indent=2) - print(f"\n Saved → {args.output}") - - return 0 if result["status"] == "ok" else 1 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/pipeline/4_v8_4b_revolute_angle.py b/pipeline/4b_revolute_angle.py similarity index 100% rename from pipeline/4_v8_4b_revolute_angle.py rename to pipeline/4b_revolute_angle.py diff --git a/pipeline/5_v8_camera_z_refine.py b/pipeline/5_camera_z_refine.py similarity index 97% rename from pipeline/5_v8_camera_z_refine.py rename to pipeline/5_camera_z_refine.py index 17bab20..1dfe6a7 100644 --- a/pipeline/5_v8_camera_z_refine.py +++ b/pipeline/5_camera_z_refine.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -5_v8_camera_z_refine.py +5_camera_z_refine.py ----------------------- Refines camera z-positions using the FK-predicted z of the Ellbow link. @@ -10,7 +10,7 @@ Camera poses from step 2 are estimated from board markers alone. Board markers are roughly coplanar (z ≈ 0), so the camera's z-height above the board is poorly constrained and can be 20–40 % off. -Once we have the elbow angle (step 3b, from 4_v8_4b_revolute_angle.py), +Once we have the elbow angle (step 3b, from 4b_revolute_angle.py), FK predicts where the Ellbow markers *should* be in world space. The difference between FK-predicted z and triangulated z gives a global z-offset for the cameras. @@ -30,7 +30,7 @@ Algorithm Usage ----- -python 5_v8_camera_z_refine.py \\ +python 5_camera_z_refine.py \\ --angle path/to/v8_ellbow_angle.json \\ --robot path/to/robot.json \\ --aruco path/to/aruco_positions_optimized.json \\ @@ -96,7 +96,7 @@ def main() -> None: description="5v8: refine camera z-positions using FK-predicted Ellbow marker z" ) parser.add_argument("--angle", required=True, - help="v8_ellbow_angle.json from 4_v8_4b_revolute_angle.py") + help="v8_ellbow_angle.json from 4b_revolute_angle.py") parser.add_argument("--robot", required=True, help="robot.json") parser.add_argument("--aruco", required=True, help="aruco_positions_optimized.json (first-pass triangulation)") diff --git a/run/robot_viewer.html b/run/robot_viewer.html index 867c53f..8893e92 100644 --- a/run/robot_viewer.html +++ b/run/robot_viewer.html @@ -805,8 +805,8 @@ function rebuild() { ? Math.sqrt(opos.reduce((s,v,i) => s+(v-mpos[i])**2, 0)) : null; const col = errMm == null ? 0x888888 - : errMm < 5 ? 0x3ecf6b - : errMm < 15 ? 0xf59e0b + : errMm < 2 ? 0x3ecf6b + : errMm < 5 ? 0xf59e0b : 0xff4f4f; gObserved.add(makeSphere(op, 0.006, col)); @@ -852,7 +852,7 @@ function updateStats(errArr, nObs, nModel) { const p90 = sorted[Math.floor(sorted.length*0.9)]; const max = sorted[sorted.length-1]; - const cls = v => v < 5 ? 'stat-ok' : v < 15 ? 'stat-warn' : 'stat-err'; + const cls = v => v < 2 ? 'stat-ok' : v < 5 ? 'stat-warn' : 'stat-err'; el.innerHTML = `
Observed:${nObs}
@@ -863,7 +863,7 @@ function updateStats(errArr, nObs, nModel) {
p90:${p90.toFixed(1)} mm
Max:${max.toFixed(1)} mm
- 🟢 <5mm   🟡 5–15mm   🔴 >15mm
`; + 🟢 <2mm   🟡 2–5mm   🔴 >5mm`; } function setStatus(msg) { diff --git a/run/run_pipeline_v8.bat b/run/run_pipeline_v8.bat index cbda00c..ef2cbc2 100644 --- a/run/run_pipeline_v8.bat +++ b/run/run_pipeline_v8.bat @@ -90,7 +90,7 @@ REM ── STEP 3b: Elbow angle (robust to z-error) ───────── echo. echo [STEP 3b-v8] Estimate elbow angle -python3 "..\pipeline\4_v8_4b_revolute_angle.py" ^ +python3 "..\pipeline\4b_revolute_angle.py" ^ --robot "%ROBOT_JSON%" ^ --aruco "%OUT_DIR%\aruco_positions_optimized.json" ^ --link Ellbow ^ @@ -109,7 +109,7 @@ for %%F in ("%OUT_DIR%\*_camera_pose.json") do ( set POSE_ARGS_V8=!POSE_ARGS_V8! -pose "%%F" ) -python3 "..\pipeline\5_v8_camera_z_refine.py" ^ +python3 "..\pipeline\5_camera_z_refine.py" ^ --angle "%OUT_DIR%\v8_ellbow_angle.json" ^ --robot "%ROBOT_JSON%" ^ --aruco "%OUT_DIR%\aruco_positions_optimized.json" ^