diff --git a/astra_scene_test/Scene_04/assets/black_car_contact.json b/astra_scene_test/Scene_04/assets/black_car_contact.json new file mode 100644 index 0000000000000000000000000000000000000000..ddc888da169e18c6d322790b1245c7b6e2df3fce --- /dev/null +++ b/astra_scene_test/Scene_04/assets/black_car_contact.json @@ -0,0 +1,113 @@ +{ + "parameters": { + "x": -15.531964092033139, + "y": 17.950452298140377, + "scale_x": 1.8999999994018648, + "scale_y": 0.7213880898277021, + "scale_z": 1.3220152359897148, + "yaw": -0.7048189360173098 + }, + "tire_contact_z": -0.08725300557532119, + "observations": { + "front_wheel": { + "1": [ + 242, + 583 + ], + "17": [ + 114, + 599 + ] + }, + "rear_wheel": { + "1": [ + 309, + 570 + ], + "17": [ + 217, + 580 + ], + "33": [ + 69, + 602 + ] + }, + "roof_front": { + "1": [ + 245, + 522 + ], + "17": [ + 147, + 522 + ] + }, + "roof_rear": { + "1": [ + 306, + 516 + ], + "17": [ + 206, + 517 + ], + "33": [ + 65, + 521 + ] + } + }, + "predictions": { + "front_wheel": { + "1": [ + 241.32406595288074, + 573.3415605963328 + ], + "17": [ + 111.9287777581768, + 589.8492386989836 + ] + }, + "rear_wheel": { + "1": [ + 310.8717086394684, + 566.8577877138214 + ], + "17": [ + 218.7975145158942, + 579.6674458434625 + ], + "33": [ + 68.84690460873287, + 599.4260148235435 + ] + }, + "roof_front": { + "1": [ + 261.0693610177214, + 521.9140595859122 + ], + "17": [ + 148.59168173831188, + 521.3518846330073 + ] + }, + "roof_rear": { + "1": [ + 300.8313886399866, + 521.2227841679234 + ], + "17": [ + 208.38026205506856, + 520.687831087386 + ], + "33": [ + 55.92605625947192, + 519.859047978329 + ] + } + }, + "cost": 142.21185372392205, + "note": "Static pose, pitch0 and both tire bottoms on z0. Camera fixed; metric shape remains ambiguous." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/camera_motion.json b/astra_scene_test/Scene_04/assets/camera_motion.json new file mode 100644 index 0000000000000000000000000000000000000000..d4f9145379a1d00b8857a89f9a2c96419775dc12 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/camera_motion.json @@ -0,0 +1,977 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 640.1707869459426, + 514.7179664031315 + ], + "optimizer_success": true, + "optimizer_nfev": 80, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.008802878977105338, + 0.018049922561147555, + 0.026359950391841133, + 0.034659806714658965, + 0.04327254329396077, + 0.05185140669395555, + 0.06002252695435185, + 0.06818098806171356, + 0.07636963537143969, + 0.08440271418264896, + 0.09323046245654798, + 0.10186810001346316, + 0.11087988568555436, + 0.12019423983009424, + 0.12913288611005386, + 0.13756848658320978, + 0.14512809590276202, + 0.15335421394424342, + 0.16130554758231602, + 0.16897635195394634, + 0.1770232367973462, + 0.18423940066545716, + 0.1915996698294535, + 0.19887779004285744, + 0.20571824485769807, + 0.21289980641837597, + 0.21971259292895534, + 0.22657553773609587, + 0.23358528701912837, + 0.24107258112826913, + 0.2487465357349035, + 0.25710216938241126, + 0.2646146178746809, + 0.273357316077707, + 0.2821914998830155, + 0.29051339408179966, + 0.29901428038231426, + 0.30803816091337044, + 0.31683397815242337, + 0.32595859862392734, + 0.33394999472224235, + 0.34199779634837263, + 0.35010782356486364, + 0.35813393654045206, + 0.36558144966797484, + 0.37261794577795226, + 0.38019217248507076, + 0.38831783381560425, + 0.3954755984880578, + 0.40341715705859726, + 0.4111260521557778, + 0.4189730280635394, + 0.4268682898406424, + 0.4353304914814911, + 0.4439247301639684, + 0.45241538388437325, + 0.4603716190441369, + 0.4687515859830776, + 0.4768854149879135, + 0.4846476375944465, + 0.49194061003410755, + 0.5000059572148312, + 0.5078899465428204, + 0.5153858724278887, + 0.5234472332349355, + 0.5310827233164359, + 0.5387949605443769, + 0.5466763184488568, + 0.5546173953729719, + 0.5624162937184094, + 0.5704564863797402, + 0.5783015694155771, + 0.5859831464314267, + 0.593887880540007, + 0.6019623555952226, + 0.6097046132245869, + 0.6173664539243255, + 0.6253831559700301, + 0.6335348223110313, + 0.6416748670059164, + 0.6497971592054369, + 0.6576087995430274, + 0.6653716666864264, + 0.6733886841975338, + 0.6814958698589496, + 0.689622841944666, + 0.6975194787735914, + 0.705664010997911, + 0.7136295442053926, + 0.7217867063818459, + 0.7299676234268601, + 0.7380504230799666, + 0.7461040306693285, + 0.7542214959487574, + 0.7624604912194031, + 0.7704617097985091, + 0.7783260784458794, + 0.7862920442803105, + 0.7942324240793832, + 0.8021821267951654, + 0.8099710172195204, + 0.817897537301741, + 0.8257831017896716, + 0.8336938907909718, + 0.841385111942113, + 0.8491498884125602, + 0.8569625686000244, + 0.864629449007571, + 0.87223558305206, + 0.8797293636117074, + 0.8872857604617295, + 0.8947980522821005, + 0.9023159668909211, + 0.9097835817806497, + 0.9170625401734516, + 0.9242072038888995, + 0.931372541601249, + 0.9384905519816475, + 0.9455689093454717, + 0.9527437058038144, + 0.9596173495662252, + 0.9665694943526268, + 0.9735491499000904, + 0.9803042881066719, + 0.9867806371001577, + 0.9932856650654416, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + -0.00020943973719140537, + 0.0008611195324010923, + -0.00040989375633570217 + ], + [ + -0.0003550067395339619, + 0.0017914160330369019, + -0.0008066651549705927 + ], + [ + -0.00035854347111521565, + 0.0026132167507584994, + -0.0011566295263596895 + ], + [ + -0.00010921678617277259, + 0.0033359412919149217, + -0.0012020174683988 + ], + [ + 0.0005213716427872679, + 0.0040104128413097385, + -0.00078155818554085 + ], + [ + 0.001213278223099616, + 0.004723641921671793, + -0.00032010073680318197 + ], + [ + 0.0018548900135928127, + 0.005370949192561541, + 0.0002893410896504775 + ], + [ + 0.00224774362252664, + 0.005924292116590759, + 0.001036639327532078 + ], + [ + 0.00230038052223272, + 0.006357633460308338, + 0.00138576150314999 + ], + [ + 0.00228796577867328, + 0.0067208239150738, + 0.0014748200038570754 + ], + [ + 0.0020850950656124204, + 0.007189619853540884, + 0.001657280675078751 + ], + [ + 0.0017952544161472018, + 0.00776324941179226, + 0.002403337789174542 + ], + [ + 0.0012234322395989767, + 0.008430330339027613, + 0.003136106238334495 + ], + [ + 0.0004912200928232764, + 0.00920871018212311, + 0.004015792226603442 + ], + [ + -0.0003018576434170425, + 0.00998497000720928, + 0.00484312618493851 + ], + [ + -0.0011910404166182208, + 0.010684564529596154, + 0.0055015986704040456 + ], + [ + -0.0016795136690813924, + 0.010954496792200253, + 0.006025065216310688 + ], + [ + -0.002078026256812736, + 0.011150124056444584, + 0.0068715895054009 + ], + [ + -0.0019442622822255333, + 0.0111920436258316, + 0.007450659255133659 + ], + [ + -0.0012751693143457162, + 0.011170878274448895, + 0.007597792575330646 + ], + [ + -0.0003657172133730148, + 0.011059861229784402, + 0.007341823087435605 + ], + [ + 0.0009525617855822171, + 0.010948298715698532, + 0.006998710734403429 + ], + [ + 0.0026938980361078833, + 0.010879060176285192, + 0.006640000007910429 + ], + [ + 0.004378268063234446, + 0.010671183472230263, + 0.0058501298063352095 + ], + [ + 0.006386602184111396, + 0.010121237236127763, + 0.004885857552554393 + ], + [ + 0.008263979687207825, + 0.009497824427335086, + 0.0037465198577321403 + ], + [ + 0.010248370215158878, + 0.00891944987235332, + 0.002663139189307138 + ], + [ + 0.01234874690050559, + 0.008489308304006203, + 0.00193126547916533 + ], + [ + 0.014266419222824971, + 0.008347460522798417, + 0.0011040547959791337 + ], + [ + 0.015882240167338045, + 0.008320111135362868, + 0.00018372150314470176 + ], + [ + 0.017018356567272384, + 0.00816085273641958, + -0.0006884180882443881 + ], + [ + 0.01763652280787367, + 0.008012416918407749, + -0.0014764642394765961 + ], + [ + 0.01763410797683712, + 0.007704692550791586, + -0.0026077227432538064 + ], + [ + 0.01736766873609974, + 0.007569553908238818, + -0.003432903701292357 + ], + [ + 0.016801373077826004, + 0.007609386979917657, + -0.00371913474447559 + ], + [ + 0.016158530236097778, + 0.007717638733442985, + -0.0037412839024816872 + ], + [ + 0.015443683754173362, + 0.00788446294758706, + -0.003798301662918307 + ], + [ + 0.014622826792910448, + 0.008198624636637274, + -0.004046844672165718 + ], + [ + 0.013643923288896324, + 0.008482499951652052, + -0.003972536421868014 + ], + [ + 0.012672512318890548, + 0.008782486433992596, + -0.003629059321305456 + ], + [ + 0.011674852147623704, + 0.0089059463612976, + -0.003594446836219208 + ], + [ + 0.010990854546819527, + 0.008974687779897786, + -0.0035324537273584717 + ], + [ + 0.010845710774731508, + 0.009091922315111262, + -0.0035261409760765647 + ], + [ + 0.0110930178133261, + 0.009204630301248833, + -0.003522622808314311 + ], + [ + 0.011845252807042524, + 0.009318539446861476, + -0.0034340664392589733 + ], + [ + 0.012947668230442617, + 0.00953404255218493, + -0.0030207954045265786 + ], + [ + 0.01409709216320152, + 0.009920981575635755, + -0.0023577104333276254 + ], + [ + 0.0152720514738302, + 0.010479784293087971, + -0.0016160593426945268 + ], + [ + 0.01628595538843541, + 0.010941367065369328, + -0.0009746038167461028 + ], + [ + 0.017137921977760213, + 0.011334614692952102, + -0.0005968986638529161 + ], + [ + 0.01757467111738436, + 0.011379949449609126, + -0.0006850197820164679 + ], + [ + 0.017301928399429872, + 0.011269461447619627, + -0.0009653018615329485 + ], + [ + 0.01654798584007431, + 0.011059702788572597, + -0.0012557972358060155 + ], + [ + 0.015472734933379452, + 0.01089011275751993, + -0.0013192612802725857 + ], + [ + 0.013945573109485052, + 0.010879234842203747, + -0.000980883771796475 + ], + [ + 0.012234677607333646, + 0.010968443417469399, + -0.0004865450450693065 + ], + [ + 0.010244881355364752, + 0.011130421420241138, + -0.00010333597388665863 + ], + [ + 0.008304786504793838, + 0.011394669689679497, + 0.0002906440154662258 + ], + [ + 0.006491835320376835, + 0.01169241497907603, + 0.0007321230032834831 + ], + [ + 0.004962740949130399, + 0.011901966919555576, + 0.00087659133183212 + ], + [ + 0.003799508082929694, + 0.012023890201594523, + 0.0014198083787231284 + ], + [ + 0.003107279496734778, + 0.012180137120775914, + 0.0020947421039554646 + ], + [ + 0.002900021389116785, + 0.012464348124945932, + 0.002642148341431348 + ], + [ + 0.002863457859054484, + 0.012750584445496068, + 0.0034520818165749713 + ], + [ + 0.003293798968440998, + 0.013162479122519376, + 0.0036656032948420556 + ], + [ + 0.0037711010322344645, + 0.01349394491371582, + 0.0041716605959196285 + ], + [ + 0.004273690193006163, + 0.013773823866548171, + 0.00454150992225259 + ], + [ + 0.004789018203343772, + 0.013999103830877513, + 0.004939950871607632 + ], + [ + 0.005221509958257419, + 0.014116889662524003, + 0.005043781239317572 + ], + [ + 0.0055463125189956315, + 0.01417969845753781, + 0.005196519582051358 + ], + [ + 0.005708657871658359, + 0.014184714060372926, + 0.0054491250731988385 + ], + [ + 0.005693100730550619, + 0.014236922755496246, + 0.005583381445346449 + ], + [ + 0.005619150606357115, + 0.014250969224822949, + 0.005387475294418588 + ], + [ + 0.005394090337662084, + 0.014242285268622921, + 0.005336939191310482 + ], + [ + 0.004939732420129312, + 0.014232421703819078, + 0.0051183765381283405 + ], + [ + 0.004519171501097994, + 0.01424852123823956, + 0.004319833657084627 + ], + [ + 0.004115801582518156, + 0.014296992350175737, + 0.0033923702731040646 + ], + [ + 0.0037413499785092707, + 0.014387311758723771, + 0.002472868429757525 + ], + [ + 0.003449194931436583, + 0.014440732153533774, + 0.0015955870568848765 + ], + [ + 0.0032532869847308288, + 0.014568374829030799, + 0.000763004216584281 + ], + [ + 0.0036680368928423746, + 0.014779898967876745, + -0.0005788164168664697 + ], + [ + 0.004308702901341574, + 0.015141646204507937, + -0.0013105530036512318 + ], + [ + 0.005057204763893026, + 0.015597171911848473, + -0.0017834480890574764 + ], + [ + 0.005821345548153084, + 0.016076966029129537, + -0.0021276018742495796 + ], + [ + 0.006706580674343547, + 0.016585636746680447, + -0.0023504893711797275 + ], + [ + 0.007703125526741992, + 0.017180409619238005, + -0.002566383353782403 + ], + [ + 0.008749930173653754, + 0.017827581254219266, + -0.0026624831753859694 + ], + [ + 0.009724637560048151, + 0.018447415714245713, + -0.002456395269454268 + ], + [ + 0.010965338976575744, + 0.019153937817699036, + -0.002616092172714449 + ], + [ + 0.01232007238511617, + 0.019912453077559754, + -0.0023766212688304806 + ], + [ + 0.013698396753107031, + 0.02065424632764299, + -0.0018468473913453016 + ], + [ + 0.0149719380870252, + 0.021320186666976694, + -0.0012100733354537458 + ], + [ + 0.015914701969439605, + 0.021947121986267953, + -0.0005331001167641826 + ], + [ + 0.016540292749414848, + 0.022544089308573243, + 5.754334127314092e-05 + ], + [ + 0.016773832137651778, + 0.022975758390590656, + 0.0005417094197838527 + ], + [ + 0.01657872518228831, + 0.023394415244521433, + 0.0009939050380583082 + ], + [ + 0.016374807968436204, + 0.02376941203043557, + 0.001157661535916056 + ], + [ + 0.015878078609295253, + 0.0240107425648432, + 0.0013027021330043794 + ], + [ + 0.01527335582412031, + 0.024198531192760737, + 0.0012180259911261562 + ], + [ + 0.014574741295225804, + 0.024403501767481763, + 0.0012771314474135601 + ], + [ + 0.013837307812012907, + 0.02460079412309688, + 0.001341971266355347 + ], + [ + 0.013139632467955221, + 0.024806944281998658, + 0.0017122253519052284 + ], + [ + 0.012632356381110356, + 0.02511388825715575, + 0.002183008402681762 + ], + [ + 0.012199589517405858, + 0.02533129144158546, + 0.002858604114990466 + ], + [ + 0.01208890994114536, + 0.025572031873596975, + 0.0030823366004223956 + ], + [ + 0.012174200535068418, + 0.025659082498566462, + 0.003429965684394651 + ], + [ + 0.012240144005062152, + 0.025536890027917022, + 0.00382894441099053 + ], + [ + 0.01247784010770409, + 0.025349793734286086, + 0.004147123404976383 + ], + [ + 0.012673093385848037, + 0.02517443228108811, + 0.004511725455951684 + ], + [ + 0.012850456144892454, + 0.02504258813617945, + 0.004789654679724465 + ], + [ + 0.012906142500872261, + 0.024968738837306055, + 0.005010805341839593 + ], + [ + 0.01297107627292627, + 0.024838152587685007, + 0.005258001294290399 + ], + [ + 0.012765685608374409, + 0.024648683128228852, + 0.005611371852758273 + ], + [ + 0.012413887870068252, + 0.02431935347772094, + 0.005960986850837967 + ], + [ + 0.011894791362841363, + 0.023755497050768966, + 0.005991780753745806 + ], + [ + 0.011290168211886218, + 0.023090820938008655, + 0.0057954169073208914 + ], + [ + 0.010762869446809544, + 0.02246673628089443, + 0.00554184152597768 + ], + [ + 0.010250762426635791, + 0.021861890151468794, + 0.005175197666267611 + ], + [ + 0.009952824757429788, + 0.021457563891432656, + 0.004636552122972042 + ], + [ + 0.009737385776637825, + 0.021337103777977807, + 0.004343760768897358 + ], + [ + 0.009881648876112141, + 0.021124208045683757, + 0.004124772095343848 + ], + [ + 0.010028692539991089, + 0.02108435362186473, + 0.004176762871203023 + ], + [ + 0.010239301026452582, + 0.021073716988385983, + 0.004238418867819996 + ], + [ + 0.010556366726739045, + 0.020922265676328124, + 0.004152280218195467 + ], + [ + 0.01098993597280476, + 0.020572560343156937, + 0.004039373036277026 + ], + [ + 0.011337860432733448, + 0.020275336821910704, + 0.0033549803399676044 + ], + [ + 0.011789093761427921, + 0.020360958760674838, + 0.002602562131042079 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2659399244805773, + 2.6948534930745938, + 3.652966722764379, + 2.68590390287027, + 2.018685034835302, + 3.3343229630915614, + 2.229130638539127, + 3.1888415072387786, + 2.569831635740863, + 1.700245339440428, + 2.6668575747314827, + 2.7319867441904115, + 1.523781585706796, + 1.7729100288731323, + 1.2970368078554588, + 1.7051438641295515, + 2.1266169413023075, + 3.0725443851634133, + 2.0936647017552112, + 2.8429376368547863, + 3.084397710654423, + 2.1887027902769978, + 2.0950281835696836, + 2.6968436912447915, + 2.2944323232075217 + ], + "median_reprojection_error_pixels": 0.9941164845058215, + "p90_reprojection_error_pixels": 2.901010989230633, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks.", + "refinement": "All128 source frames; fixed3D landmarks; original17 calibration knots held exact; small isolated tracker fluctuations filtered; no artificial camera shake." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/camera_motion_full.json b/astra_scene_test/Scene_04/assets/camera_motion_full.json new file mode 100644 index 0000000000000000000000000000000000000000..d4f9145379a1d00b8857a89f9a2c96419775dc12 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/camera_motion_full.json @@ -0,0 +1,977 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 640.1707869459426, + 514.7179664031315 + ], + "optimizer_success": true, + "optimizer_nfev": 80, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.008802878977105338, + 0.018049922561147555, + 0.026359950391841133, + 0.034659806714658965, + 0.04327254329396077, + 0.05185140669395555, + 0.06002252695435185, + 0.06818098806171356, + 0.07636963537143969, + 0.08440271418264896, + 0.09323046245654798, + 0.10186810001346316, + 0.11087988568555436, + 0.12019423983009424, + 0.12913288611005386, + 0.13756848658320978, + 0.14512809590276202, + 0.15335421394424342, + 0.16130554758231602, + 0.16897635195394634, + 0.1770232367973462, + 0.18423940066545716, + 0.1915996698294535, + 0.19887779004285744, + 0.20571824485769807, + 0.21289980641837597, + 0.21971259292895534, + 0.22657553773609587, + 0.23358528701912837, + 0.24107258112826913, + 0.2487465357349035, + 0.25710216938241126, + 0.2646146178746809, + 0.273357316077707, + 0.2821914998830155, + 0.29051339408179966, + 0.29901428038231426, + 0.30803816091337044, + 0.31683397815242337, + 0.32595859862392734, + 0.33394999472224235, + 0.34199779634837263, + 0.35010782356486364, + 0.35813393654045206, + 0.36558144966797484, + 0.37261794577795226, + 0.38019217248507076, + 0.38831783381560425, + 0.3954755984880578, + 0.40341715705859726, + 0.4111260521557778, + 0.4189730280635394, + 0.4268682898406424, + 0.4353304914814911, + 0.4439247301639684, + 0.45241538388437325, + 0.4603716190441369, + 0.4687515859830776, + 0.4768854149879135, + 0.4846476375944465, + 0.49194061003410755, + 0.5000059572148312, + 0.5078899465428204, + 0.5153858724278887, + 0.5234472332349355, + 0.5310827233164359, + 0.5387949605443769, + 0.5466763184488568, + 0.5546173953729719, + 0.5624162937184094, + 0.5704564863797402, + 0.5783015694155771, + 0.5859831464314267, + 0.593887880540007, + 0.6019623555952226, + 0.6097046132245869, + 0.6173664539243255, + 0.6253831559700301, + 0.6335348223110313, + 0.6416748670059164, + 0.6497971592054369, + 0.6576087995430274, + 0.6653716666864264, + 0.6733886841975338, + 0.6814958698589496, + 0.689622841944666, + 0.6975194787735914, + 0.705664010997911, + 0.7136295442053926, + 0.7217867063818459, + 0.7299676234268601, + 0.7380504230799666, + 0.7461040306693285, + 0.7542214959487574, + 0.7624604912194031, + 0.7704617097985091, + 0.7783260784458794, + 0.7862920442803105, + 0.7942324240793832, + 0.8021821267951654, + 0.8099710172195204, + 0.817897537301741, + 0.8257831017896716, + 0.8336938907909718, + 0.841385111942113, + 0.8491498884125602, + 0.8569625686000244, + 0.864629449007571, + 0.87223558305206, + 0.8797293636117074, + 0.8872857604617295, + 0.8947980522821005, + 0.9023159668909211, + 0.9097835817806497, + 0.9170625401734516, + 0.9242072038888995, + 0.931372541601249, + 0.9384905519816475, + 0.9455689093454717, + 0.9527437058038144, + 0.9596173495662252, + 0.9665694943526268, + 0.9735491499000904, + 0.9803042881066719, + 0.9867806371001577, + 0.9932856650654416, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + -0.00020943973719140537, + 0.0008611195324010923, + -0.00040989375633570217 + ], + [ + -0.0003550067395339619, + 0.0017914160330369019, + -0.0008066651549705927 + ], + [ + -0.00035854347111521565, + 0.0026132167507584994, + -0.0011566295263596895 + ], + [ + -0.00010921678617277259, + 0.0033359412919149217, + -0.0012020174683988 + ], + [ + 0.0005213716427872679, + 0.0040104128413097385, + -0.00078155818554085 + ], + [ + 0.001213278223099616, + 0.004723641921671793, + -0.00032010073680318197 + ], + [ + 0.0018548900135928127, + 0.005370949192561541, + 0.0002893410896504775 + ], + [ + 0.00224774362252664, + 0.005924292116590759, + 0.001036639327532078 + ], + [ + 0.00230038052223272, + 0.006357633460308338, + 0.00138576150314999 + ], + [ + 0.00228796577867328, + 0.0067208239150738, + 0.0014748200038570754 + ], + [ + 0.0020850950656124204, + 0.007189619853540884, + 0.001657280675078751 + ], + [ + 0.0017952544161472018, + 0.00776324941179226, + 0.002403337789174542 + ], + [ + 0.0012234322395989767, + 0.008430330339027613, + 0.003136106238334495 + ], + [ + 0.0004912200928232764, + 0.00920871018212311, + 0.004015792226603442 + ], + [ + -0.0003018576434170425, + 0.00998497000720928, + 0.00484312618493851 + ], + [ + -0.0011910404166182208, + 0.010684564529596154, + 0.0055015986704040456 + ], + [ + -0.0016795136690813924, + 0.010954496792200253, + 0.006025065216310688 + ], + [ + -0.002078026256812736, + 0.011150124056444584, + 0.0068715895054009 + ], + [ + -0.0019442622822255333, + 0.0111920436258316, + 0.007450659255133659 + ], + [ + -0.0012751693143457162, + 0.011170878274448895, + 0.007597792575330646 + ], + [ + -0.0003657172133730148, + 0.011059861229784402, + 0.007341823087435605 + ], + [ + 0.0009525617855822171, + 0.010948298715698532, + 0.006998710734403429 + ], + [ + 0.0026938980361078833, + 0.010879060176285192, + 0.006640000007910429 + ], + [ + 0.004378268063234446, + 0.010671183472230263, + 0.0058501298063352095 + ], + [ + 0.006386602184111396, + 0.010121237236127763, + 0.004885857552554393 + ], + [ + 0.008263979687207825, + 0.009497824427335086, + 0.0037465198577321403 + ], + [ + 0.010248370215158878, + 0.00891944987235332, + 0.002663139189307138 + ], + [ + 0.01234874690050559, + 0.008489308304006203, + 0.00193126547916533 + ], + [ + 0.014266419222824971, + 0.008347460522798417, + 0.0011040547959791337 + ], + [ + 0.015882240167338045, + 0.008320111135362868, + 0.00018372150314470176 + ], + [ + 0.017018356567272384, + 0.00816085273641958, + -0.0006884180882443881 + ], + [ + 0.01763652280787367, + 0.008012416918407749, + -0.0014764642394765961 + ], + [ + 0.01763410797683712, + 0.007704692550791586, + -0.0026077227432538064 + ], + [ + 0.01736766873609974, + 0.007569553908238818, + -0.003432903701292357 + ], + [ + 0.016801373077826004, + 0.007609386979917657, + -0.00371913474447559 + ], + [ + 0.016158530236097778, + 0.007717638733442985, + -0.0037412839024816872 + ], + [ + 0.015443683754173362, + 0.00788446294758706, + -0.003798301662918307 + ], + [ + 0.014622826792910448, + 0.008198624636637274, + -0.004046844672165718 + ], + [ + 0.013643923288896324, + 0.008482499951652052, + -0.003972536421868014 + ], + [ + 0.012672512318890548, + 0.008782486433992596, + -0.003629059321305456 + ], + [ + 0.011674852147623704, + 0.0089059463612976, + -0.003594446836219208 + ], + [ + 0.010990854546819527, + 0.008974687779897786, + -0.0035324537273584717 + ], + [ + 0.010845710774731508, + 0.009091922315111262, + -0.0035261409760765647 + ], + [ + 0.0110930178133261, + 0.009204630301248833, + -0.003522622808314311 + ], + [ + 0.011845252807042524, + 0.009318539446861476, + -0.0034340664392589733 + ], + [ + 0.012947668230442617, + 0.00953404255218493, + -0.0030207954045265786 + ], + [ + 0.01409709216320152, + 0.009920981575635755, + -0.0023577104333276254 + ], + [ + 0.0152720514738302, + 0.010479784293087971, + -0.0016160593426945268 + ], + [ + 0.01628595538843541, + 0.010941367065369328, + -0.0009746038167461028 + ], + [ + 0.017137921977760213, + 0.011334614692952102, + -0.0005968986638529161 + ], + [ + 0.01757467111738436, + 0.011379949449609126, + -0.0006850197820164679 + ], + [ + 0.017301928399429872, + 0.011269461447619627, + -0.0009653018615329485 + ], + [ + 0.01654798584007431, + 0.011059702788572597, + -0.0012557972358060155 + ], + [ + 0.015472734933379452, + 0.01089011275751993, + -0.0013192612802725857 + ], + [ + 0.013945573109485052, + 0.010879234842203747, + -0.000980883771796475 + ], + [ + 0.012234677607333646, + 0.010968443417469399, + -0.0004865450450693065 + ], + [ + 0.010244881355364752, + 0.011130421420241138, + -0.00010333597388665863 + ], + [ + 0.008304786504793838, + 0.011394669689679497, + 0.0002906440154662258 + ], + [ + 0.006491835320376835, + 0.01169241497907603, + 0.0007321230032834831 + ], + [ + 0.004962740949130399, + 0.011901966919555576, + 0.00087659133183212 + ], + [ + 0.003799508082929694, + 0.012023890201594523, + 0.0014198083787231284 + ], + [ + 0.003107279496734778, + 0.012180137120775914, + 0.0020947421039554646 + ], + [ + 0.002900021389116785, + 0.012464348124945932, + 0.002642148341431348 + ], + [ + 0.002863457859054484, + 0.012750584445496068, + 0.0034520818165749713 + ], + [ + 0.003293798968440998, + 0.013162479122519376, + 0.0036656032948420556 + ], + [ + 0.0037711010322344645, + 0.01349394491371582, + 0.0041716605959196285 + ], + [ + 0.004273690193006163, + 0.013773823866548171, + 0.00454150992225259 + ], + [ + 0.004789018203343772, + 0.013999103830877513, + 0.004939950871607632 + ], + [ + 0.005221509958257419, + 0.014116889662524003, + 0.005043781239317572 + ], + [ + 0.0055463125189956315, + 0.01417969845753781, + 0.005196519582051358 + ], + [ + 0.005708657871658359, + 0.014184714060372926, + 0.0054491250731988385 + ], + [ + 0.005693100730550619, + 0.014236922755496246, + 0.005583381445346449 + ], + [ + 0.005619150606357115, + 0.014250969224822949, + 0.005387475294418588 + ], + [ + 0.005394090337662084, + 0.014242285268622921, + 0.005336939191310482 + ], + [ + 0.004939732420129312, + 0.014232421703819078, + 0.0051183765381283405 + ], + [ + 0.004519171501097994, + 0.01424852123823956, + 0.004319833657084627 + ], + [ + 0.004115801582518156, + 0.014296992350175737, + 0.0033923702731040646 + ], + [ + 0.0037413499785092707, + 0.014387311758723771, + 0.002472868429757525 + ], + [ + 0.003449194931436583, + 0.014440732153533774, + 0.0015955870568848765 + ], + [ + 0.0032532869847308288, + 0.014568374829030799, + 0.000763004216584281 + ], + [ + 0.0036680368928423746, + 0.014779898967876745, + -0.0005788164168664697 + ], + [ + 0.004308702901341574, + 0.015141646204507937, + -0.0013105530036512318 + ], + [ + 0.005057204763893026, + 0.015597171911848473, + -0.0017834480890574764 + ], + [ + 0.005821345548153084, + 0.016076966029129537, + -0.0021276018742495796 + ], + [ + 0.006706580674343547, + 0.016585636746680447, + -0.0023504893711797275 + ], + [ + 0.007703125526741992, + 0.017180409619238005, + -0.002566383353782403 + ], + [ + 0.008749930173653754, + 0.017827581254219266, + -0.0026624831753859694 + ], + [ + 0.009724637560048151, + 0.018447415714245713, + -0.002456395269454268 + ], + [ + 0.010965338976575744, + 0.019153937817699036, + -0.002616092172714449 + ], + [ + 0.01232007238511617, + 0.019912453077559754, + -0.0023766212688304806 + ], + [ + 0.013698396753107031, + 0.02065424632764299, + -0.0018468473913453016 + ], + [ + 0.0149719380870252, + 0.021320186666976694, + -0.0012100733354537458 + ], + [ + 0.015914701969439605, + 0.021947121986267953, + -0.0005331001167641826 + ], + [ + 0.016540292749414848, + 0.022544089308573243, + 5.754334127314092e-05 + ], + [ + 0.016773832137651778, + 0.022975758390590656, + 0.0005417094197838527 + ], + [ + 0.01657872518228831, + 0.023394415244521433, + 0.0009939050380583082 + ], + [ + 0.016374807968436204, + 0.02376941203043557, + 0.001157661535916056 + ], + [ + 0.015878078609295253, + 0.0240107425648432, + 0.0013027021330043794 + ], + [ + 0.01527335582412031, + 0.024198531192760737, + 0.0012180259911261562 + ], + [ + 0.014574741295225804, + 0.024403501767481763, + 0.0012771314474135601 + ], + [ + 0.013837307812012907, + 0.02460079412309688, + 0.001341971266355347 + ], + [ + 0.013139632467955221, + 0.024806944281998658, + 0.0017122253519052284 + ], + [ + 0.012632356381110356, + 0.02511388825715575, + 0.002183008402681762 + ], + [ + 0.012199589517405858, + 0.02533129144158546, + 0.002858604114990466 + ], + [ + 0.01208890994114536, + 0.025572031873596975, + 0.0030823366004223956 + ], + [ + 0.012174200535068418, + 0.025659082498566462, + 0.003429965684394651 + ], + [ + 0.012240144005062152, + 0.025536890027917022, + 0.00382894441099053 + ], + [ + 0.01247784010770409, + 0.025349793734286086, + 0.004147123404976383 + ], + [ + 0.012673093385848037, + 0.02517443228108811, + 0.004511725455951684 + ], + [ + 0.012850456144892454, + 0.02504258813617945, + 0.004789654679724465 + ], + [ + 0.012906142500872261, + 0.024968738837306055, + 0.005010805341839593 + ], + [ + 0.01297107627292627, + 0.024838152587685007, + 0.005258001294290399 + ], + [ + 0.012765685608374409, + 0.024648683128228852, + 0.005611371852758273 + ], + [ + 0.012413887870068252, + 0.02431935347772094, + 0.005960986850837967 + ], + [ + 0.011894791362841363, + 0.023755497050768966, + 0.005991780753745806 + ], + [ + 0.011290168211886218, + 0.023090820938008655, + 0.0057954169073208914 + ], + [ + 0.010762869446809544, + 0.02246673628089443, + 0.00554184152597768 + ], + [ + 0.010250762426635791, + 0.021861890151468794, + 0.005175197666267611 + ], + [ + 0.009952824757429788, + 0.021457563891432656, + 0.004636552122972042 + ], + [ + 0.009737385776637825, + 0.021337103777977807, + 0.004343760768897358 + ], + [ + 0.009881648876112141, + 0.021124208045683757, + 0.004124772095343848 + ], + [ + 0.010028692539991089, + 0.02108435362186473, + 0.004176762871203023 + ], + [ + 0.010239301026452582, + 0.021073716988385983, + 0.004238418867819996 + ], + [ + 0.010556366726739045, + 0.020922265676328124, + 0.004152280218195467 + ], + [ + 0.01098993597280476, + 0.020572560343156937, + 0.004039373036277026 + ], + [ + 0.011337860432733448, + 0.020275336821910704, + 0.0033549803399676044 + ], + [ + 0.011789093761427921, + 0.020360958760674838, + 0.002602562131042079 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2659399244805773, + 2.6948534930745938, + 3.652966722764379, + 2.68590390287027, + 2.018685034835302, + 3.3343229630915614, + 2.229130638539127, + 3.1888415072387786, + 2.569831635740863, + 1.700245339440428, + 2.6668575747314827, + 2.7319867441904115, + 1.523781585706796, + 1.7729100288731323, + 1.2970368078554588, + 1.7051438641295515, + 2.1266169413023075, + 3.0725443851634133, + 2.0936647017552112, + 2.8429376368547863, + 3.084397710654423, + 2.1887027902769978, + 2.0950281835696836, + 2.6968436912447915, + 2.2944323232075217 + ], + "median_reprojection_error_pixels": 0.9941164845058215, + "p90_reprojection_error_pixels": 2.901010989230633, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks.", + "refinement": "All128 source frames; fixed3D landmarks; original17 calibration knots held exact; small isolated tracker fluctuations filtered; no artificial camera shake." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/config.json b/astra_scene_test/Scene_04/assets/config.json new file mode 100644 index 0000000000000000000000000000000000000000..e2c4ddbcbd673a25a2583593da5599c44cef3604 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/config.json @@ -0,0 +1,135 @@ +{ + "fov": 120.0, + "pitch": 4.726014521736058, + "yaw": 3.83, + "camera_height": 2.966445669913508, + "travel": 27.8, + "road_halfwidth": 10.5, + "sidewalk_width": 18.0, + "intersection": 36.5, + "intersection_width": 12.5, + "exposure": 0.5, + "world_strength": 0.085, + "haze": 0.0025, + "samples": 128, + "resolution_percentage": 100, + "shift_y": 0.09375, + "optics": true, + "world_color": [ + 0.35, + 0.25, + 0.027 + ], + "look": "None", + "rain_displacement": 12, + "glow_strength": 0.45, + "smear_strength": 0.05, + "view_transform": "Standard", + "gamma": 1.06, + "glow_size": 0.86, + "sensor_noise": 0.012, + "smear_region_gain": { + "left": 6.0, + "right": 3.6, + "lower": 4.2, + "opening": 2.5, + "right_lower": 3.0, + "right_upper": 3.9 + }, + "sky_response": { + "1": [ + 1.2605054062517196, + 1.6010563538455556, + 5.981444461917436 + ], + "17": [ + 1.0526570456656525, + 1.4420291016719715, + 6.014321509967891 + ], + "33": [ + 1.0946919130656403, + 1.4779059156328034, + 6.252126070894234 + ], + "49": [ + 1.225149642569033, + 1.7874155565200063, + 8.326589211542156 + ], + "65": [ + 1.2242025797155145, + 2.03143319103788, + 11.878108774815308 + ], + "81": [ + 1.027097816524482, + 1.7479561324369874, + 9.746948941715356 + ], + "97": [ + 0.7570487086400081, + 1.361378012245788, + 7.215861814136287 + ], + "113": [ + 0.5682937110288511, + 1.1020568822706571, + 6.685394646675636 + ], + "128": [ + 0.6520111661770153, + 1.2056391631303078, + 7.768134709770933 + ] + }, + "highlight_ceiling": 0.75, + "highlight_knee": 0.15, + "sensor_correlated": [ + [ + 5, + 12 + ], + [ + 14, + 28 + ], + [ + 36, + 35 + ] + ], + "sensor_noise_color": [ + 1, + 0.88, + 0.95 + ], + "haze_layers": [ + [ + -20, + 25, + 1.0 + ], + [ + 25, + 60, + 0.4 + ], + [ + 60, + 110, + 0.1 + ] + ], + "broad_scatter": 2.0, + "broad_scatter_size": 140, + "optical_overscan": 1.25, + "opening_kernel_scale": 1, + "opening_input_spread": 1, + "opening_ring_angle": 0.48, + "road_roughness": [ + 0.42, + 0.78 + ], + "intersection_fill_watts": 5000 +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/crosswalks.json b/astra_scene_test/Scene_04/assets/crosswalks.json new file mode 100644 index 0000000000000000000000000000000000000000..7f34c1094cd817a41cd9cdffde2666725c721e2b --- /dev/null +++ b/astra_scene_test/Scene_04/assets/crosswalks.json @@ -0,0 +1,486 @@ +{ + "right": { + "observed_end_bounds": [ + [ + 928, + 573 + ], + [ + 1098, + 556 + ], + [ + 1360, + 591 + ], + [ + 1202, + 622 + ] + ], + "plane_world_bounds": [ + [ + 14.147666695812969, + 42.25506597349137, + 0.02308081679303431 + ], + [ + 25.829577790062775, + 45.490655678781394, + 0.2436752179322461 + ], + [ + 21.315051225963373, + 36.766113878431675, + 0.5012816250445447 + ], + [ + 13.691627205459852, + 34.9137103960618, + 0.3454402878031386 + ] + ], + "strips": [ + [ + [ + 14.1425995903646, + 42.17349535596438, + 0.014 + ], + [ + 25.779416383795002, + 45.393716325444174, + 0.014 + ], + [ + 25.533625493082926, + 44.9187134940918, + 0.014 + ], + [ + 14.117770773667598, + 41.7737993300821, + 0.014 + ] + ], + [ + [ + 14.091928535880921, + 41.357789180694425, + 0.014 + ], + [ + 25.277802321117292, + 44.42432279207198, + 0.014 + ], + [ + 25.032011430405213, + 43.94931996071961, + 0.014 + ], + [ + 14.067099719183918, + 40.95809315481215, + 0.014 + ] + ], + [ + [ + 14.04125748139724, + 40.54208300542447, + 0.014 + ], + [ + 24.776188258439582, + 43.45492925869979, + 0.014 + ], + [ + 24.530397367727502, + 42.97992642734742, + 0.014 + ], + [ + 14.01642866470024, + 40.142386979542195, + 0.014 + ] + ], + [ + [ + 13.990586426913563, + 39.72637683015452, + 0.014 + ], + [ + 24.27457419576187, + 42.4855357253276, + 0.014 + ], + [ + 24.028783305049792, + 42.01053289397523, + 0.014 + ], + [ + 13.965757610216558, + 39.32668080427224, + 0.014 + ] + ], + [ + [ + 13.939915372429883, + 38.91067065488457, + 0.014 + ], + [ + 23.77296013308416, + 41.51614219195541, + 0.014 + ], + [ + 23.527169242372082, + 41.04113936060304, + 0.014 + ], + [ + 13.91508655573288, + 38.51097462900229, + 0.014 + ] + ], + [ + [ + 13.889244317946204, + 38.09496447961462, + 0.014 + ], + [ + 23.271346070406445, + 40.546748658583226, + 0.014 + ], + [ + 23.02555517969437, + 40.07174582723084, + 0.014 + ], + [ + 13.8644155012492, + 37.69526845373234, + 0.014 + ] + ], + [ + [ + 13.838573263462521, + 37.279258304344665, + 0.014 + ], + [ + 22.769732007728734, + 39.57735512521103, + 0.014 + ], + [ + 22.523941117016655, + 39.10235229385866, + 0.014 + ], + [ + 13.81374444676552, + 36.87956227846239, + 0.014 + ] + ], + [ + [ + 13.787902208978844, + 36.46355212907471, + 0.014 + ], + [ + 22.268117945051024, + 38.60796159183884, + 0.014 + ], + [ + 22.022327054338945, + 38.13295876048647, + 0.014 + ], + [ + 13.763073392281841, + 36.063856103192435, + 0.014 + ] + ], + [ + [ + 13.737231154495163, + 35.64784595380476, + 0.014 + ], + [ + 21.76650388237331, + 37.638568058466646, + 0.014 + ], + [ + 21.520712991661235, + 37.163565227114276, + 0.014 + ], + [ + 13.712402337798162, + 35.24814992792248, + 0.014 + ] + ] + ] + }, + "left": { + "observed_end_bounds": [ + [ + -100, + 632 + ], + [ + -150, + 595 + ], + [ + 151, + 577 + ], + [ + 218, + 586 + ] + ], + "plane_world_bounds": [ + [ + -17.66525713549598, + 38.938222540714364, + -0.8297024716454495 + ], + [ + -35.48385294715181, + 47.748991211853664, + -1.7967426766866237 + ], + [ + -26.1139267343991, + 51.39163014559495, + -1.6678535988418086 + ], + [ + -16.9376859391618, + 46.15681320534133, + -1.1378530443043848 + ] + ], + "strips": [ + [ + [ + -17.65717301109227, + 39.01842910365467, + 0.014 + ], + [ + -35.37974265589901, + 47.78946497778412, + 0.014 + ], + [ + -34.86960222876024, + 47.987786430843364, + 0.014 + ], + [ + -17.617560801514074, + 39.41144126206213, + 0.014 + ] + ], + [ + [ + -17.576331767055137, + 39.82049473305766, + 0.014 + ], + [ + -34.33863974337092, + 48.19420263708871, + 0.014 + ], + [ + -33.82849931623217, + 48.39252409014796, + 0.014 + ], + [ + -17.536719557476943, + 40.21350689146513, + 0.014 + ] + ], + [ + [ + -17.495490523018002, + 40.62256036246065, + 0.014 + ], + [ + -33.297536830842844, + 48.598940296393295, + 0.014 + ], + [ + -32.787396403704086, + 48.79726174945255, + 0.014 + ], + [ + -17.45587831343981, + 41.015572520868126, + 0.014 + ] + ], + [ + [ + -17.414649278980875, + 41.42462599186365, + 0.014 + ], + [ + -32.25643391831476, + 49.00367795569788, + 0.014 + ], + [ + -31.74629349117601, + 49.20199940875713, + 0.014 + ], + [ + -17.37503706940268, + 41.81763815027112, + 0.014 + ] + ], + [ + [ + -17.333808034943743, + 42.22669162126665, + 0.014 + ], + [ + -31.215331005786688, + 49.40841561500247, + 0.014 + ], + [ + -30.70519057864793, + 49.60673706806172, + 0.014 + ], + [ + -17.29419582536555, + 42.61970377967412, + 0.014 + ] + ], + [ + [ + -17.252966790906612, + 43.02875725066964, + 0.014 + ], + [ + -30.17422809325861, + 49.81315327430706, + 0.014 + ], + [ + -29.664087666119848, + 50.011474727366306, + 0.014 + ], + [ + -17.213354581328417, + 43.421769409077115, + 0.014 + ] + ], + [ + [ + -17.17212554686948, + 43.83082288007264, + 0.014 + ], + [ + -29.13312518073053, + 50.21789093361165, + 0.014 + ], + [ + -28.622984753591773, + 50.41621238667089, + 0.014 + ], + [ + -17.132513337291286, + 44.223835038480104, + 0.014 + ] + ], + [ + [ + -17.09128430283235, + 44.632888509475634, + 0.014 + ], + [ + -28.09202226820245, + 50.622628592916236, + 0.014 + ], + [ + -27.58188184106369, + 50.82095004597548, + 0.014 + ], + [ + -17.051672093254155, + 45.02590066788311, + 0.014 + ] + ], + [ + [ + -17.010443058795218, + 45.43495413887863, + 0.014 + ], + [ + -27.050919355674374, + 51.02736625222082, + 0.014 + ], + [ + -26.540778928535616, + 51.225687705280066, + 0.014 + ], + [ + -16.970830849217023, + 45.8279662972861, + 0.014 + ] + ] + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/distant_lights.json b/astra_scene_test/Scene_04/assets/distant_lights.json new file mode 100644 index 0000000000000000000000000000000000000000..226b6838093c9b24004cd257459efaf1d5efb591 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/distant_lights.json @@ -0,0 +1,747 @@ +{ + "distant_headlight_left": { + "xyz": [ + -7.35898139198819, + 71.47809397744096, + -2.30058224529908 + ], + "observations": { + "1": [ + 576.0, + 539.0 + ], + "9": [ + 576.3914184570312, + 538.5623779296875 + ], + "17": [ + 576.2930297851562, + 540.298095703125 + ], + "25": [ + 574.3419189453125, + 538.5428466796875 + ], + "33": [ + 571.5774536132812, + 534.2451171875 + ], + "41": [ + 570.3427124023438, + 537.163330078125 + ], + "49": [ + 568.6837158203125, + 536.5470581054688 + ], + "57": [ + 566.7459716796875, + 538.6200561523438 + ], + "65": [ + 565.0204467773438, + 543.1527099609375 + ], + "73": [ + 562.9796752929688, + 542.625732421875 + ], + "81": [ + 560.7957763671875, + 545.0585327148438 + ], + "89": [ + 559.5230712890625, + 543.47705078125 + ], + "97": [ + 557.9629516601562, + 541.3145751953125 + ], + "105": [ + 555.3115844726562, + 544.5411376953125 + ], + "113": [ + 551.095703125, + 545.0950317382812 + ], + "121": [ + 545.5712890625, + 548.0756225585938 + ], + "128": [ + 541.04541015625, + 548.66552734375 + ] + }, + "projections": { + "1": [ + 576.1781533091383, + 538.384066864485 + ], + "9": [ + 576.627109797683, + 538.0595213730966 + ], + "17": [ + 576.2367831944781, + 539.7194911885322 + ], + "25": [ + 574.5039117719776, + 538.2300695526071 + ], + "33": [ + 572.2954656990248, + 534.3953705010945 + ], + "41": [ + 570.4621077843385, + 537.230656333056 + ], + "49": [ + 568.90216116284, + 536.8693196552056 + ], + "57": [ + 566.6786176467982, + 538.7812964299692 + ], + "65": [ + 564.5832198403297, + 542.8958445065423 + ], + "73": [ + 562.4908233701947, + 542.5685600948904 + ], + "81": [ + 560.1356406594068, + 544.8894908792836 + ], + "89": [ + 558.9702321861055, + 543.7391223295567 + ], + "97": [ + 557.5454984134551, + 541.9554011923948 + ], + "105": [ + 554.73848486789, + 544.6522637536269 + ], + "113": [ + 550.8956287036239, + 545.4158339185625 + ], + "121": [ + 545.9528428565499, + 548.0841769465898 + ], + "128": [ + 542.6135689019417, + 548.6258324634553 + ] + }, + "mean_error_pixels": 0.5608408373299512, + "max_error_pixels": 1.5686610644785268 + }, + "distant_headlight_center": { + "xyz": [ + -5.166640818071345, + 74.8906401160613, + -2.1968774933027273 + ], + "observations": { + "1": [ + 589.0, + 537.0 + ], + "9": [ + 589.7914428710938, + 536.532958984375 + ], + "17": [ + 590.1503295898438, + 538.204833984375 + ], + "25": [ + 588.5750732421875, + 536.4144287109375 + ], + "33": [ + 586.328857421875, + 531.9990844726562 + ], + "41": [ + 585.3447875976562, + 534.762451171875 + ], + "49": [ + 584.242431640625, + 534.061767578125 + ], + "57": [ + 582.8644409179688, + 536.0819091796875 + ], + "65": [ + 581.7530517578125, + 540.5639038085938 + ], + "73": [ + 580.3848876953125, + 539.9678955078125 + ], + "81": [ + 578.9522094726562, + 542.2881469726562 + ], + "89": [ + 578.4090576171875, + 540.4335327148438 + ], + "97": [ + 577.6299438476562, + 538.175537109375 + ], + "105": [ + 575.9978637695312, + 541.2666015625 + ], + "113": [ + 572.603515625, + 541.677490234375 + ], + "121": [ + 568.5126342773438, + 544.46630859375 + ], + "128": [ + 564.9859619140625, + 544.7620239257812 + ] + }, + "projections": { + "1": [ + 589.0745499526433, + 536.5223328732282 + ], + "9": [ + 589.9217780581538, + 536.145765404874 + ], + "17": [ + 589.9892908053785, + 537.7891385807108 + ], + "25": [ + 588.6760853490683, + 536.226604648976 + ], + "33": [ + 586.8664876526012, + 532.2035113566352 + ], + "41": [ + 585.5855683719942, + 534.8964741883642 + ], + "49": [ + 584.5462500062042, + 534.4652685205119 + ], + "57": [ + 582.9166928262507, + 536.2763793125133 + ], + "65": [ + 581.4683320985137, + 540.3303328247786 + ], + "73": [ + 580.0270506178514, + 539.9134904775809 + ], + "81": [ + 578.3861790710796, + 541.9999479135967 + ], + "89": [ + 577.9446083557641, + 540.6443846063985 + ], + "97": [ + 577.3265146263161, + 538.7700669907289 + ], + "105": [ + 575.4389596713587, + 541.315872036418 + ], + "113": [ + 572.565033533462, + 541.92482212263 + ], + "121": [ + 568.6615683105347, + 544.3393503976336 + ], + "128": [ + 566.1930968922251, + 544.6458110522539 + ] + }, + "mean_error_pixels": 0.4630006274600263, + "max_error_pixels": 1.2127160786750724 + }, + "distant_headlight_far": { + "xyz": [ + -1.3408501070145125, + 78.56457439028985, + -2.0631704148883756 + ], + "observations": { + "1": [ + 611.0, + 537.0 + ], + "9": [ + 612.0967407226562, + 536.3214111328125 + ], + "17": [ + 612.3280639648438, + 537.7880249023438 + ], + "25": [ + 610.8767700195312, + 535.6309204101562 + ], + "33": [ + 608.66259765625, + 530.7155151367188 + ], + "41": [ + 607.9232788085938, + 533.1858520507812 + ], + "49": [ + 607.29833984375, + 532.1372680664062 + ], + "57": [ + 606.4265747070312, + 533.8456420898438 + ], + "65": [ + 605.8465576171875, + 538.3228149414062 + ], + "73": [ + 605.0324096679688, + 537.3521728515625 + ], + "81": [ + 604.3375854492188, + 539.036865234375 + ], + "89": [ + 604.9450073242188, + 536.6976318359375 + ], + "97": [ + 605.3412475585938, + 534.255126953125 + ], + "105": [ + 604.6949462890625, + 537.1362915039062 + ], + "113": [ + 602.6989135742188, + 537.1969604492188 + ], + "121": [ + 599.618408203125, + 539.5076293945312 + ], + "128": [ + 597.2274169921875, + 539.5512084960938 + ] + }, + "projections": { + "1": [ + 608.649284510563, + 534.5721860024094 + ], + "9": [ + 610.0220195720026, + 534.1588460443838 + ], + "17": [ + 610.6871634643762, + 535.8249689646208 + ], + "25": [ + 609.9139727402145, + 534.1962833706403 + ], + "33": [ + 608.6143427261642, + 529.9344808742193 + ], + "41": [ + 608.0381956657178, + 532.4761732701647 + ], + "49": [ + 607.6555498570159, + 531.9976522721279 + ], + "57": [ + 606.7686371840673, + 533.7248721806347 + ], + "65": [ + 606.123149601523, + 537.7603912730182 + ], + "73": [ + 605.4805529272529, + 537.2834945637096 + ], + "81": [ + 604.7111200736371, + 539.1108934336125 + ], + "89": [ + 605.1465546605856, + 537.5422284041786 + ], + "97": [ + 605.4933674721179, + 535.627939224619 + ], + "105": [ + 604.6910736887733, + 538.0624296182407 + ], + "113": [ + 602.9406479538007, + 538.5612576829834 + ], + "121": [ + 600.2240350973775, + 540.7383089533148 + ], + "128": [ + 598.7413537811864, + 540.818020719653 + ] + }, + "mean_error_pixels": 1.3104749025037048, + "max_error_pixels": 3.3793703731873013 + }, + "right_next_lamp": { + "xyz": [ + 12.171372614418908, + 73.32698309400536, + 10.287755236624047 + ], + "observations": { + "1": [ + 676.0, + 474.0 + ], + "9": [ + 679.2293701171875, + 472.12579345703125 + ], + "17": [ + 682.2525634765625, + 472.6588439941406 + ], + "25": [ + 683.0426635742188, + 469.45867919921875 + ], + "33": [ + 682.70703125, + 462.5318908691406 + ], + "41": [ + 684.1465454101562, + 463.30303955078125 + ], + "49": [ + 685.89404296875, + 461.00775146484375 + ], + "57": [ + 687.2223510742188, + 461.00384521484375 + ], + "65": [ + 689.6056518554688, + 464.12689208984375 + ], + "73": [ + 691.504638671875, + 461.5000915527344 + ], + "81": [ + 692.9893798828125, + 460.7843322753906 + ], + "89": [ + 695.825927734375, + 455.9842224121094 + ], + "97": [ + 699.2017822265625, + 451.2179870605469 + ], + "105": [ + 701.9930419921875, + 451.5902099609375 + ], + "113": [ + 703.4578247070312, + 448.8763427734375 + ], + "121": [ + 703.9640502929688, + 447.9381408691406 + ], + "128": [ + 704.8994140625, + 445.02691650390625 + ] + }, + "projections": { + "1": [ + 676.0224894191014, + 474.02737419246273 + ], + "9": [ + 679.1781353090328, + 472.1714102568612 + ], + "17": [ + 681.9945972461533, + 472.48150543567465 + ], + "25": [ + 682.9442083264481, + 469.3815834121774 + ], + "33": [ + 682.8227497095027, + 463.1203522624157 + ], + "41": [ + 684.2332820645654, + 463.54789221300604 + ], + "49": [ + 686.0136830367533, + 461.4045970455758 + ], + "57": [ + 687.4168450830999, + 461.20927022375037 + ], + "65": [ + 689.3861719576702, + 463.43935763124813 + ], + "73": [ + 691.3280317398746, + 460.98869323690974 + ], + "81": [ + 692.7838191446288, + 460.04647916478797 + ], + "89": [ + 695.730084519892, + 455.7304789232318 + ], + "97": [ + 699.3704762523512, + 451.46702325538035 + ], + "105": [ + 701.8727778783019, + 451.235670100558 + ], + "113": [ + 703.557605756206, + 449.0679534841074 + ], + "121": [ + 704.0054552811224, + 448.18727634602976 + ], + "128": [ + 705.171273994033, + 445.54589256007654 + ] + }, + "mean_error_pixels": 0.36050395947295183, + "max_error_pixels": 0.7659519762417646 + }, + "right_smaller_lamp": { + "xyz": [ + 14.926147602214728, + 102.69188314678074, + 8.372225779138235 + ], + "observations": { + "1": [ + 669.0, + 492.0 + ], + "9": [ + 671.7989501953125, + 490.62890625 + ], + "17": [ + 674.040283203125, + 491.7751770019531 + ], + "25": [ + 674.4747924804688, + 488.9952087402344 + ], + "33": [ + 673.739013671875, + 482.8454284667969 + ], + "41": [ + 674.8565673828125, + 484.1058044433594 + ], + "49": [ + 676.0146484375, + 482.53460693359375 + ], + "57": [ + 676.7369995117188, + 483.2787170410156 + ], + "65": [ + 678.2216796875, + 487.1328430175781 + ], + "73": [ + 679.3516235351562, + 485.3456115722656 + ], + "81": [ + 680.3638916015625, + 485.5367431640625 + ], + "89": [ + 682.3519287109375, + 481.94512939453125 + ], + "97": [ + 684.6644897460938, + 478.17315673828125 + ], + "105": [ + 686.397705078125, + 479.7648010253906 + ], + "113": [ + 686.5369262695312, + 478.492919921875 + ], + "121": [ + 685.7559814453125, + 479.2514953613281 + ], + "128": [ + 685.3016967773438, + 477.7740478515625 + ] + }, + "projections": { + "1": [ + 668.6647911929929, + 491.1925476953942 + ], + "9": [ + 671.3847913989883, + 489.961102713132 + ], + "17": [ + 673.6723103506375, + 490.91915071319386 + ], + "25": [ + 674.1804256180307, + 488.4500461889449 + ], + "33": [ + 673.7502214875567, + 482.89457520061734 + ], + "41": [ + 674.6716851944223, + 484.1485370661582 + ], + "49": [ + 675.870941932223, + 482.7741415565 + ], + "57": [ + 676.669113161076, + 483.42357117846916 + ], + "65": [ + 677.9461709336048, + 486.5070199438311 + ], + "73": [ + 679.1498568706313, + 484.99940068527303 + ], + "81": [ + 679.9950965715367, + 485.1569300676617 + ], + "89": [ + 682.1854830805188, + 482.0424806759358 + ], + "97": [ + 684.7968891393401, + 479.01049228456293 + ], + "105": [ + 686.3041535846587, + 480.0642636283342 + ], + "113": [ + 686.9099158368404, + 479.2307364912546 + ], + "121": [ + 686.380228869699, + 479.74440379951676 + ], + "128": [ + 686.6820172779445, + 478.3672701688363 + ] + }, + "mean_error_pixels": 0.58727013196417, + "max_error_pixels": 1.5023972184779937 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/distant_tower_anchors.json b/astra_scene_test/Scene_04/assets/distant_tower_anchors.json new file mode 100644 index 0000000000000000000000000000000000000000..f1482880dad1be964da14a0cedbf057e47a3216f --- /dev/null +++ b/astra_scene_test/Scene_04/assets/distant_tower_anchors.json @@ -0,0 +1,104 @@ +{ + "right_distant_three_windows": { + "xyz": [ + 42.617412637336564, + 209.44558427534503, + 114.72988962862105 + ], + "observations": { + "1": [ + 690, + 322 + ], + "33": [ + 692, + 310 + ], + "65": [ + 698, + 307 + ], + "97": [ + 700, + 293 + ], + "128": [ + 703, + 289 + ] + }, + "projections": { + "1": [ + 687.852849261147, + 322.4624390834458 + ], + "33": [ + 692.6227212523136, + 307.91983166392663 + ], + "65": [ + 696.6294384268816, + 307.7332476569567 + ], + "97": [ + 702.4715206445546, + 293.6340999783804 + ], + "128": [ + 703.2629287452102, + 288.89546375775444 + ] + } + }, + "right_distant_roof_peak": { + "xyz": [ + 53.51081966513235, + 189.1719805826661, + 131.21272448965607 + ], + "observations": { + "1": [ + 712, + 276 + ], + "33": [ + 723, + 259 + ], + "65": [ + 725, + 251 + ], + "97": [ + 734, + 235 + ], + "128": [ + 736, + 234 + ] + }, + "projections": { + "1": [ + 714.4628477083404, + 275.4329280907003 + ], + "33": [ + 720.7678315539995, + 257.4327984904959 + ], + "65": [ + 725.965961708042, + 255.47420523636038 + ], + "97": [ + 733.5380062708937, + 237.32373522674317 + ], + "128": [ + 735.5761860301047, + 230.20613827864662 + ] + } + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/distant_traffic_fit.json b/astra_scene_test/Scene_04/assets/distant_traffic_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..dc0060fa380ce2b272ecfbcb56920f00c6cc4a20 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/distant_traffic_fit.json @@ -0,0 +1,824 @@ +{ + "8": { + "stationary_mean_error_pixels": 5.826549887534254, + "moving_mean_error_pixels": 3.3468962555456927, + "chosen_x_y_velocity": [ + -14.843240600140897, + 203.18433062211895, + -14.999999999999998 + ], + "moving_trial": [ + -14.843240600140897, + 203.18433062211895, + -14.999999999999998 + ], + "observations": { + "1": [ + 589.0, + 537.0 + ], + "5": [ + 589.6947631835938, + 537.3878784179688 + ], + "9": [ + 589.7914428710938, + 536.532958984375 + ], + "13": [ + 589.7700805664062, + 536.8493041992188 + ], + "17": [ + 590.1503295898438, + 538.204833984375 + ], + "21": [ + 589.462646484375, + 538.2354125976562 + ], + "25": [ + 588.5750732421875, + 536.4144287109375 + ], + "29": [ + 587.1988525390625, + 533.6327514648438 + ], + "33": [ + 586.328857421875, + 531.9990844726562 + ], + "37": [ + 585.5714111328125, + 533.0647583007812 + ], + "41": [ + 585.3447875976562, + 534.762451171875 + ], + "45": [ + 584.7625732421875, + 535.7164306640625 + ], + "49": [ + 584.242431640625, + 534.061767578125 + ], + "53": [ + 583.680419921875, + 533.6455078125 + ], + "57": [ + 582.8644409179688, + 536.0819091796875 + ], + "61": [ + 582.4730224609375, + 539.5711059570312 + ], + "65": [ + 581.7530517578125, + 540.5639038085938 + ], + "69": [ + 581.2861938476562, + 540.0653686523438 + ], + "73": [ + 580.3848876953125, + 539.9678955078125 + ], + "77": [ + 579.4817504882812, + 541.0054931640625 + ], + "81": [ + 578.9522094726562, + 542.2881469726562 + ], + "85": [ + 578.6615600585938, + 541.7507934570312 + ], + "89": [ + 578.4090576171875, + 540.4335327148438 + ], + "93": [ + 578.1357421875, + 538.4361572265625 + ], + "97": [ + 577.6299438476562, + 538.175537109375 + ], + "101": [ + 576.8908081054688, + 539.6912841796875 + ], + "105": [ + 575.9978637695312, + 541.2666015625 + ], + "109": [ + 574.3720703125, + 541.5494384765625 + ], + "113": [ + 572.603515625, + 541.677490234375 + ], + "117": [ + 570.50927734375, + 543.0639038085938 + ], + "121": [ + 568.5126342773438, + 544.46630859375 + ], + "125": [ + 566.7442016601562, + 545.0211181640625 + ] + }, + "predictions": { + "1": [ + 587.5234062936316, + 537.7583983681754 + ], + "5": [ + 588.0915029643066, + 537.3448367480603 + ], + "9": [ + 588.6438414533328, + 536.9334501997039 + ], + "13": [ + 588.8332295506663, + 537.5154342082798 + ], + "17": [ + 589.0035857884669, + 538.0985940954783 + ], + "21": [ + 588.4508312286817, + 537.0913707267655 + ], + "25": [ + 587.8808568474608, + 536.0864881949603 + ], + "29": [ + 587.0572921276475, + 533.8475285505256 + ], + "33": [ + 586.2060396120932, + 531.6196517710986 + ], + "37": [ + 585.7186721960611, + 532.6922567344983 + ], + "41": [ + 585.2088127484684, + 533.7695971854147 + ], + "45": [ + 584.7933760675007, + 533.2900427993145 + ], + "49": [ + 584.3551479259022, + 532.8119771158379 + ], + "53": [ + 583.6572946384142, + 533.4317596075682 + ], + "57": [ + 582.9319463912082, + 534.0538674562484 + ], + "61": [ + 582.3196640793326, + 535.7815169220735 + ], + "65": [ + 581.6724533474005, + 537.511488761369 + ], + "69": [ + 581.0502544846896, + 536.9930584469078 + ], + "73": [ + 580.3963027371407, + 536.4764377483536 + ], + "77": [ + 579.6592248402712, + 537.1820591164815 + ], + "81": [ + 578.8867240105404, + 537.8958440580606 + ], + "85": [ + 578.7429199739707, + 536.8661164060036 + ], + "89": [ + 578.5565984359268, + 535.8437348292749 + ], + "93": [ + 578.3335743555185, + 534.5352841745254 + ], + "97": [ + 578.0659367678302, + 533.2309290513754 + ], + "101": [ + 577.1791865373781, + 534.1070051962237 + ], + "105": [ + 576.2377158179195, + 534.9867423778089 + ], + "109": [ + 574.8067129153019, + 534.8864182979581 + ], + "113": [ + 573.3159036178536, + 534.788757915225 + ], + "117": [ + 571.2865049473114, + 535.5747024080047 + ], + "121": [ + 569.1878361715968, + 536.3700283894674 + ], + "125": [ + 567.5771436267083, + 536.138431344066 + ] + } + }, + "33": { + "stationary_mean_error_pixels": 8.983875721903331, + "moving_mean_error_pixels": 5.77230124445649, + "chosen_x_y_velocity": [ + -21.875789274228374, + 203.57341713117074, + -14.999999999974111 + ], + "moving_trial": [ + -21.875789274228374, + 203.57341713117074, + -14.999999999974111 + ], + "observations": { + "1": [ + 576.0, + 539.0 + ], + "5": [ + 576.4158935546875, + 539.4017333984375 + ], + "9": [ + 576.3914184570312, + 538.5623779296875 + ], + "13": [ + 576.2140502929688, + 538.896484375 + ], + "17": [ + 576.2930297851562, + 540.298095703125 + ], + "21": [ + 575.400146484375, + 540.3518676757812 + ], + "25": [ + 574.3419189453125, + 538.5428466796875 + ], + "29": [ + 572.7302856445312, + 535.7682495117188 + ], + "33": [ + 571.5774536132812, + 534.2451171875 + ], + "37": [ + 570.7581176757812, + 535.3529663085938 + ], + "41": [ + 570.3427124023438, + 537.163330078125 + ], + "45": [ + 569.5338134765625, + 538.13037109375 + ], + "49": [ + 568.6837158203125, + 536.5470581054688 + ], + "53": [ + 567.8823852539062, + 536.2171020507812 + ], + "57": [ + 566.7459716796875, + 538.6200561523438 + ], + "61": [ + 566.0570678710938, + 542.096435546875 + ], + "65": [ + 565.0204467773438, + 543.1527099609375 + ], + "69": [ + 564.266357421875, + 542.5944213867188 + ], + "73": [ + 562.9796752929688, + 542.625732421875 + ], + "77": [ + 561.7372436523438, + 543.7108764648438 + ], + "81": [ + 560.7957763671875, + 545.0585327148438 + ], + "85": [ + 560.0787353515625, + 544.6835327148438 + ], + "89": [ + 559.5230712890625, + 543.47705078125 + ], + "93": [ + 558.87890625, + 541.6256713867188 + ], + "97": [ + 557.9629516601562, + 541.3145751953125 + ], + "101": [ + 556.6414794921875, + 542.8955078125 + ], + "105": [ + 555.3115844726562, + 544.5411376953125 + ], + "109": [ + 553.3179321289062, + 544.9266967773438 + ], + "113": [ + 551.095703125, + 545.0950317382812 + ], + "117": [ + 548.3267211914062, + 546.6200561523438 + ], + "121": [ + 545.5712890625, + 548.0756225585938 + ], + "125": [ + 543.2776489257812, + 548.7100830078125 + ] + }, + "predictions": { + "1": [ + 574.4741299827855, + 537.831220838597 + ], + "5": [ + 574.8633712318401, + 537.4057366220565 + ], + "9": [ + 575.2314773968329, + 536.9821326217359 + ], + "13": [ + 575.2213261083941, + 537.5293670064173 + ], + "17": [ + 575.1860726864052, + 538.0766489244204 + ], + "21": [ + 574.4290935597854, + 537.066876723212 + ], + "25": [ + 573.6484762831834, + 536.0593691138932 + ], + "29": [ + 572.6130328145834, + 533.8762714558604 + ], + "33": [ + 571.5427815012273, + 531.7057723640231 + ], + "37": [ + 570.8056324871552, + 532.7949116608866 + ], + "41": [ + 570.0373834927626, + 533.8893481791974 + ], + "45": [ + 569.3734714459304, + 533.3943644250292 + ], + "49": [ + 568.6783366799522, + 532.9003728345369 + ], + "53": [ + 567.7025835050708, + 533.5120277485873 + ], + "57": [ + 566.689384637597, + 534.1257048167703 + ], + "61": [ + 565.7762624309839, + 535.8194751434496 + ], + "65": [ + 564.81696336414, + 537.5141871214988 + ], + "69": [ + 563.886462402089, + 536.9756694149257 + ], + "73": [ + 562.9125130026555, + 536.4382291277777 + ], + "77": [ + 561.8311231328701, + 537.1854235771874 + ], + "81": [ + 560.7006485726143, + 537.9424537368129 + ], + "85": [ + 560.2087857580082, + 536.9382065509232 + ], + "89": [ + 559.6600950136341, + 535.9423902460305 + ], + "93": [ + 559.0620607825987, + 534.5958918391758 + ], + "97": [ + 558.4033142846993, + 533.2521078577444 + ], + "101": [ + 557.0836103603682, + 534.1063653609818 + ], + "105": [ + 555.6898249127457, + 534.963232987264 + ], + "109": [ + 553.7885361903859, + 534.8379911343897 + ], + "113": [ + 551.8053826231514, + 534.7142439176322 + ], + "117": [ + 549.2472057951329, + 535.5139159388891 + ], + "121": [ + 546.593252767997, + 536.3237553954363 + ], + "125": [ + 544.4325093721909, + 536.1162837462894 + ] + } + }, + "60": { + "stationary_mean_error_pixels": 3.2411584257232136, + "moving_mean_error_pixels": 2.0663826434868175, + "chosen_x_y_velocity": [ + -4.171084996792737, + 152.9270068833871, + 0.0 + ], + "moving_trial": [ + -3.8651657218354667, + 181.02352966244334, + -14.999999999999304 + ], + "observations": { + "1": [ + 611.0, + 537.0 + ], + "5": [ + 611.817626953125, + 537.2843017578125 + ], + "9": [ + 612.0967407226562, + 536.3214111328125 + ], + "13": [ + 612.0643310546875, + 536.497314453125 + ], + "17": [ + 612.3280639648438, + 537.7880249023438 + ], + "21": [ + 611.6948852539062, + 537.8065795898438 + ], + "25": [ + 610.8767700195312, + 535.6309204101562 + ], + "29": [ + 609.43603515625, + 532.5975341796875 + ], + "33": [ + 608.66259765625, + 530.7155151367188 + ], + "37": [ + 607.9825439453125, + 531.5700073242188 + ], + "41": [ + 607.9232788085938, + 533.1858520507812 + ], + "45": [ + 607.480712890625, + 533.8895874023438 + ], + "49": [ + 607.29833984375, + 532.1372680664062 + ], + "53": [ + 607.0217895507812, + 531.6180419921875 + ], + "57": [ + 606.4265747070312, + 533.8456420898438 + ], + "61": [ + 606.196044921875, + 537.4027709960938 + ], + "65": [ + 605.8465576171875, + 538.3228149414062 + ], + "69": [ + 605.6130981445312, + 537.6458129882812 + ], + "73": [ + 605.0324096679688, + 537.3521728515625 + ], + "77": [ + 604.5411987304688, + 538.0623168945312 + ], + "81": [ + 604.3375854492188, + 539.036865234375 + ], + "85": [ + 604.528076171875, + 538.2694702148438 + ], + "89": [ + 604.9450073242188, + 536.6976318359375 + ], + "93": [ + 605.3616943359375, + 534.6802978515625 + ], + "97": [ + 605.3412475585938, + 534.255126953125 + ], + "101": [ + 605.007568359375, + 535.6028442382812 + ], + "105": [ + 604.6949462890625, + 537.1362915039062 + ], + "109": [ + 603.7603149414062, + 537.1900024414062 + ], + "113": [ + 602.6989135742188, + 537.1969604492188 + ], + "117": [ + 601.1856689453125, + 538.4503784179688 + ], + "121": [ + 599.618408203125, + 539.5076293945312 + ], + "125": [ + 598.5499877929688, + 539.7424926757812 + ] + }, + "predictions": { + "1": [ + 604.8041246440838, + 536.0828866484186 + ], + "5": [ + 605.6628234598159, + 535.7587528783114 + ], + "9": [ + 606.5183293367365, + 535.437043325908 + ], + "13": [ + 607.0378950312975, + 536.1378467717806 + ], + "17": [ + 607.5523722020496, + 536.84145809814 + ], + "21": [ + 607.3468923258791, + 535.9085274962296 + ], + "25": [ + 607.1390683218217, + 534.9776708929829 + ], + "29": [ + 606.6811053463744, + 532.7329076001137 + ], + "33": [ + 606.2122681278084, + 530.4958391768944 + ], + "37": [ + 606.1565198612531, + 531.6149633377228 + ], + "41": [ + 606.0984562880999, + 532.7372276661592 + ], + "45": [ + 606.1361710786894, + 532.3456310969656 + ], + "49": [ + 606.1713649408246, + 531.9556313991453 + ], + "53": [ + 605.9828496361895, + 532.6518207316486 + ], + "57": [ + 605.790574960591, + 533.349953945737 + ], + "61": [ + 605.743115987282, + 535.1879933451658 + ], + "65": [ + 605.6875806225993, + 537.0298685335952 + ], + "69": [ + 605.662118333579, + 536.6018403822027 + ], + "73": [ + 605.6337900837188, + 536.1755488706424 + ], + "77": [ + 605.567542441064, + 536.8793883416623 + ], + "81": [ + 605.4998209562209, + 537.5863490490049 + ], + "85": [ + 606.066949518401, + 536.5734451767562 + ], + "89": [ + 606.6286108087304, + 535.5633065510526 + ], + "93": [ + 607.1913656440731, + 534.3606440246441 + ], + "97": [ + 607.7514909008027, + 533.1621445115768 + ], + "101": [ + 607.768737483913, + 534.1150768224192 + ], + "105": [ + 607.780865061312, + 535.0706014785204 + ], + "109": [ + 607.346406619297, + 535.0463790693149 + ], + "113": [ + 606.9081044488888, + 535.0235145295508 + ], + "117": [ + 606.0027649329098, + 535.818718996099 + ], + "121": [ + 605.0935888170767, + 536.6174448090546 + ], + "125": [ + 604.694153048999, + 536.3696958119033 + ] + } + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/distant_window_row.json b/astra_scene_test/Scene_04/assets/distant_window_row.json new file mode 100644 index 0000000000000000000000000000000000000000..c8439999b1b77f787e06d976822ffe30a710db3e --- /dev/null +++ b/astra_scene_test/Scene_04/assets/distant_window_row.json @@ -0,0 +1,27 @@ +{ + "x": 41.462958485542764, + "y": 201.97, + "z": 110.73928105813275, + "observations": { + "1": [ + 689.5, + 321.7 + ], + "33": [ + 693.6, + 307.5 + ], + "65": [ + 698.5, + 307.2 + ], + "97": [ + 702.9, + 293.1 + ], + "128": [ + 702.7, + 288.3 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/intersection_vehicle.json b/astra_scene_test/Scene_04/assets/intersection_vehicle.json new file mode 100644 index 0000000000000000000000000000000000000000..f0438723595e192dec90856371e29d4d9fbef4df --- /dev/null +++ b/astra_scene_test/Scene_04/assets/intersection_vehicle.json @@ -0,0 +1,41 @@ +{ + "license_plate_observations": { + "65": [ + 495, + 544 + ], + "97": [ + 453, + 547 + ], + "128": [ + 381, + 563 + ] + }, + "license_plate_xyz": [ + -9.399410767370359, + 45.770513780133484, + -0.048393315593366 + ], + "scale": 1.4, + "root_xy": [ + -9.399410767370359, + 49.204433780133485 + ], + "predictions": { + "65": [ + 493.96545478191047, + 543.4552025962012 + ], + "97": [ + 454.25731603030977, + 547.2743509012653 + ], + "128": [ + 380.70892637228917, + 563.098523777601 + ] + }, + "note": "Static three-view fit. Car body and later row spacing are inferred; terrain contact is shared with the street." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/landmarks.json b/astra_scene_test/Scene_04/assets/landmarks.json new file mode 100644 index 0000000000000000000000000000000000000000..372968336007f5c2784e35317925a274d66379a9 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/landmarks.json @@ -0,0 +1,1023 @@ +{ + "left_near_lamp": { + "xyz": [ + -14.200729466726834, + 46.298022711089374, + 11.536065952944016 + ], + "observations": { + "1": [ + 500, + 441 + ], + "33": [ + 477, + 421 + ], + "65": [ + 444, + 407 + ], + "97": [ + 393, + 373 + ], + "128": [ + 300, + 325 + ] + }, + "projections": { + "1": [ + 500.73402913273384, + 441.17188636667913 + ], + "33": [ + 478.1079348214165, + 421.4161694922248 + ], + "65": [ + 443.8763502321533, + 406.61480424103513 + ], + "97": [ + 390.8930016305568, + 371.9110794914525 + ], + "128": [ + 300.5744684918089, + 325.7419514372331 + ] + }, + "mean_error_pixels": 1.1304121866115637, + "max_error_pixels": 2.3717483008893887 + }, + "right_near_lamp": { + "xyz": [ + 10.392373139610859, + 33.01043668651939, + 13.734346140984389 + ], + "observations": { + "1": [ + 727, + 395 + ], + "33": [ + 752, + 355 + ], + "65": [ + 798, + 307 + ], + "97": [ + 886, + 185 + ] + }, + "projections": { + "1": [ + 727.6843252887536, + 394.5042848124134 + ], + "33": [ + 754.2096025641899, + 355.4829418445371 + ], + "65": [ + 795.9850276848208, + 307.69087640834766 + ], + "97": [ + 885.9783560347623, + 184.52529055234214 + ] + }, + "mean_error_pixels": 1.4280238049928071, + "max_error_pixels": 2.2617639834606154 + }, + "right_secondary_lamp": { + "xyz": [ + 16.40212160660987, + 36.58076186439755, + 13.982917142455664 + ], + "observations": { + "97": [ + 960, + 254 + ], + "128": [ + 1148, + 100 + ] + }, + "projections": { + "97": [ + 959.5418014757051, + 253.4386937439212 + ], + "128": [ + 1148.282253338666, + 100.34542866333624 + ] + }, + "mean_error_pixels": 0.585328380145347, + "max_error_pixels": 0.7245761525051688 + }, + "left_far_lamp": { + "xyz": [ + -9.379595573502398, + 47.13539318211352, + 11.486611306013817 + ], + "observations": { + "1": [ + 541.0, + 443.0 + ], + "9": [ + 539.4916381835938, + 439.3216552734375 + ], + "17": [ + 537.485595703125, + 437.11785888671875 + ], + "25": [ + 532.926513671875, + 431.6917724609375 + ], + "33": [ + 526.0064086914062, + 423.3890380859375 + ], + "41": [ + 520.7630004882812, + 421.8131103515625 + ], + "49": [ + 515.613037109375, + 415.9709167480469 + ], + "57": [ + 509.6747741699219, + 412.7524108886719 + ], + "65": [ + 504.20135498046875, + 411.1305236816406 + ], + "73": [ + 497.11669921875, + 404.0169372558594 + ], + "81": [ + 488.283935546875, + 399.40057373046875 + ], + "89": [ + 479.4316101074219, + 390.09033203125 + ], + "97": [ + 470.0669250488281, + 378.4097900390625 + ], + "105": [ + 458.78826904296875, + 370.81695556640625 + ], + "113": [ + 444.2247314453125, + 359.21331787109375 + ], + "121": [ + 425.7640075683594, + 348.38427734375 + ], + "128": [ + 407.7334289550781, + 335.6137390136719 + ] + }, + "projections": { + "1": [ + 541.5634615197931, + 443.2611123315446 + ], + "9": [ + 539.8045286737156, + 439.3883762426721 + ], + "17": [ + 537.3776407655463, + 436.95380986354076 + ], + "25": [ + 532.9696981195091, + 431.63576805969535 + ], + "33": [ + 526.8264300807299, + 424.145852604538 + ], + "41": [ + 521.2627365819642, + 422.0695715270556 + ], + "49": [ + 516.1942930310026, + 416.66964928602914 + ], + "57": [ + 509.95209362737, + 412.9281749729347 + ], + "65": [ + 504.0632384835899, + 410.8276225193913 + ], + "73": [ + 496.88798352829133, + 403.71161419476834 + ], + "81": [ + 487.84693442257856, + 398.8962032786197 + ], + "89": [ + 478.88493914263563, + 389.69103105774263 + ], + "97": [ + 469.41078371972617, + 378.1502860955218 + ], + "105": [ + 457.67419410852915, + 370.1524245041593 + ], + "113": [ + 443.1841354736833, + 358.7421228024798 + ], + "121": [ + 425.67957260403807, + 348.34063360179294 + ], + "128": [ + 409.80670241361105, + 336.8492867100157 + ] + }, + "mean_error_pixels": 0.6961912416809485, + "max_error_pixels": 2.413512159446805 + }, + "left_near_signal": { + "xyz": [ + -8.109304879175783, + 36.35099002645948, + 6.799730493445938 + ], + "observations": { + "1": [ + 532.0, + 471.0 + ], + "9": [ + 528.5169067382812, + 467.8038024902344 + ], + "17": [ + 524.0791015625, + 466.2242126464844 + ], + "25": [ + 516.974853515625, + 461.2014465332031 + ], + "33": [ + 507.3438415527344, + 453.6877136230469 + ], + "41": [ + 498.4823913574219, + 452.1849365234375 + ], + "49": [ + 489.051025390625, + 446.7339782714844 + ], + "57": [ + 478.26409912109375, + 443.2602233886719 + ], + "65": [ + 466.6575927734375, + 441.1639099121094 + ], + "73": [ + 451.6542053222656, + 433.3653259277344 + ], + "81": [ + 432.9798278808594, + 427.89337158203125 + ], + "89": [ + 411.48309326171875, + 416.65887451171875 + ], + "97": [ + 385.3642578125, + 401.4269104003906 + ], + "105": [ + 351.8008117675781, + 388.5360107421875 + ], + "113": [ + 307.4602966308594, + 369.214111328125 + ], + "121": [ + 248.99717712402344, + 347.3996276855469 + ], + "128": [ + 185.6737823486328, + 321.3771057128906 + ] + }, + "projections": { + "1": [ + 531.7980336313469, + 470.98351907024875 + ], + "9": [ + 528.1871764455223, + 467.6316388403121 + ], + "17": [ + 523.3893996134333, + 465.63431920470106 + ], + "25": [ + 516.6637647163654, + 460.77842097072 + ], + "33": [ + 508.1929231001427, + 453.90101373915894 + ], + "41": [ + 498.9623887553071, + 452.21610832881885 + ], + "49": [ + 489.82038328778435, + 447.0077927794067 + ], + "57": [ + 478.45158428674927, + 443.26800664040155 + ], + "65": [ + 466.2861751811171, + 440.73316411029145 + ], + "73": [ + 451.5001663262537, + 432.96501378553194 + ], + "81": [ + 432.89824929344866, + 427.26377602542584 + ], + "89": [ + 411.65010087705264, + 416.4707600749598 + ], + "97": [ + 385.61225301617776, + 401.69892810673264 + ], + "105": [ + 351.8796606353686, + 388.62800811260314 + ], + "113": [ + 307.46645145262573, + 369.37944863943545 + ], + "121": [ + 248.90261135600764, + 347.48817112101426 + ], + "128": [ + 185.40704488238504, + 321.81770347162796 + ] + }, + "mean_error_pixels": 0.4442014652812221, + "max_error_pixels": 0.9075588417317058 + }, + "right_far_signal": { + "xyz": [ + 8.71915752790315, + 40.75595999522281, + 7.253766295525992 + ], + "observations": { + "1": [ + 694.0, + 471.0 + ], + "9": [ + 698.5577392578125, + 468.45086669921875 + ], + "17": [ + 703.3010864257812, + 468.2178649902344 + ], + "25": [ + 706.0357055664062, + 463.7693786621094 + ], + "33": [ + 707.5382690429688, + 455.1895446777344 + ], + "41": [ + 711.2960815429688, + 454.2938537597656 + ], + "49": [ + 715.709228515625, + 450.38934326171875 + ], + "57": [ + 720.2081909179688, + 448.4042663574219 + ], + "65": [ + 726.0914916992188, + 449.4227294921875 + ], + "73": [ + 732.2811279296875, + 444.2070617675781 + ], + "81": [ + 738.5117797851562, + 439.9429626464844 + ], + "89": [ + 747.1100463867188, + 430.94683837890625 + ], + "97": [ + 757.9595947265625, + 421.08697509765625 + ], + "105": [ + 769.6968994140625, + 415.4256591796875 + ], + "113": [ + 782.4249877929688, + 405.2038879394531 + ], + "121": [ + 796.6268310546875, + 394.6088562011719 + ], + "128": [ + 812.3159790039062, + 380.6214599609375 + ] + }, + "projections": { + "1": [ + 693.2707949991034, + 472.2078247993892 + ], + "9": [ + 698.058081432782, + 469.39917144535747 + ], + "17": [ + 702.7572240316523, + 468.66289622127243 + ], + "25": [ + 705.5580568424793, + 464.42337669711264 + ], + "33": [ + 707.36086469691, + 456.7382817150605 + ], + "41": [ + 711.3724966294412, + 455.39577732802945 + ], + "49": [ + 715.9172776694526, + 451.4880232580769 + ], + "57": [ + 720.5433449094228, + 449.16091818887946 + ], + "65": [ + 726.2015682755222, + 449.04527529278374 + ], + "73": [ + 732.4779227598541, + 443.73114068786265 + ], + "81": [ + 738.8739427037523, + 439.05588368044755 + ], + "89": [ + 747.9382513924168, + 430.18746757145914 + ], + "97": [ + 759.3248090601107, + 420.62646297803184 + ], + "105": [ + 770.7980468096621, + 414.0248203618629 + ], + "113": [ + 783.2382285996143, + 404.20569034890207 + ], + "121": [ + 795.9632887767126, + 394.06071766049104 + ], + "128": [ + 809.6806272148485, + 381.74856498848123 + ] + }, + "mean_error_pixels": 1.166565175051173, + "max_error_pixels": 2.866259722217109 + }, + "tower_window_right": { + "xyz": [ + -29.751068326755114, + 71.85901165324739, + 53.88414167724895 + ], + "observations": { + "1": [ + 467.0, + 254.0 + ], + "9": [ + 464.99371337890625, + 246.5759735107422 + ], + "17": [ + 463.69232177734375, + 240.07489013671875 + ], + "25": [ + 458.90411376953125, + 230.98538208007812 + ], + "33": [ + 450.2771911621094, + 219.12452697753906 + ], + "41": [ + 444.66998291015625, + 213.47528076171875 + ], + "49": [ + 440.4549255371094, + 204.1541748046875 + ], + "57": [ + 435.107421875, + 195.88824462890625 + ], + "65": [ + 432.099365234375, + 190.137939453125 + ], + "73": [ + 426.6878967285156, + 178.90660095214844 + ], + "81": [ + 418.8594055175781, + 170.5100860595703 + ], + "89": [ + 411.3830261230469, + 158.05894470214844 + ], + "97": [ + 405.77960205078125, + 142.83619689941406 + ], + "105": [ + 399.63330078125, + 132.13729858398438 + ], + "113": [ + 391.3387756347656, + 118.40894317626953 + ], + "121": [ + 381.1039733886719, + 106.61896514892578 + ], + "128": [ + 371.6095275878906, + 93.8125228881836 + ] + }, + "projections": { + "1": [ + 467.03759382142596, + 254.29072521676525 + ], + "9": [ + 465.1645096531274, + 246.7589457064068 + ], + "17": [ + 463.9340788417902, + 240.9767536534039 + ], + "25": [ + 458.8868843663472, + 231.1552934216854 + ], + "33": [ + 449.54757580026774, + 218.10707731806912 + ], + "41": [ + 444.29519897193063, + 212.81074546897327 + ], + "49": [ + 439.76700511313044, + 202.95682874621554 + ], + "57": [ + 434.83918051406556, + 195.64096180047306 + ], + "65": [ + 432.2364309205651, + 191.42375411993453 + ], + "73": [ + 426.7255807351526, + 179.80865060658743 + ], + "81": [ + 419.0349317847196, + 172.0799048596901 + ], + "89": [ + 411.33475764513435, + 158.32121626450686 + ], + "97": [ + 405.5061293697758, + 141.864278851054 + ], + "105": [ + 399.76403841057606, + 132.18696267092383 + ], + "113": [ + 391.56684092974945, + 117.88048930625513 + ], + "121": [ + 381.44951898004024, + 106.37660085900973 + ], + "128": [ + 372.11806008891045, + 93.55468474261608 + ] + }, + "mean_error_pixels": 0.7157726888042262, + "max_error_pixels": 1.5796013850545083 + }, + "tower_window_above": { + "xyz": [ + -30.206881997980737, + 73.39670782875702, + 59.10901533956867 + ], + "observations": { + "1": [ + 469.0, + 235.0 + ], + "9": [ + 466.9984436035156, + 227.2169189453125 + ], + "17": [ + 465.7508850097656, + 220.1780548095703 + ], + "25": [ + 461.249267578125, + 210.5689697265625 + ], + "33": [ + 452.6790771484375, + 198.67703247070312 + ], + "41": [ + 447.21307373046875, + 192.49615478515625 + ], + "49": [ + 443.1694030761719, + 182.83709716796875 + ], + "57": [ + 438.1517333984375, + 174.4036865234375 + ], + "65": [ + 435.36932373046875, + 168.04501342773438 + ], + "73": [ + 430.4035339355469, + 156.72047424316406 + ], + "81": [ + 422.7218322753906, + 148.11119079589844 + ], + "89": [ + 415.48175048828125, + 135.50946044921875 + ], + "97": [ + 410.2955627441406, + 120.07831573486328 + ], + "105": [ + 404.6603698730469, + 109.10233306884766 + ], + "113": [ + 396.9137268066406, + 94.90699005126953 + ], + "121": [ + 386.98046875, + 82.55496215820312 + ], + "128": [ + 378.2152099609375, + 69.58731079101562 + ] + }, + "projections": { + "1": [ + 468.7264773990986, + 235.20557349676724 + ], + "9": [ + 467.0075302360989, + 227.3563555272901 + ], + "17": [ + 466.06240070642855, + 221.39007340123965 + ], + "25": [ + 461.1501282371954, + 211.13006414431595 + ], + "33": [ + 451.72774100488874, + 197.36628943922597 + ], + "41": [ + 446.69898828900284, + 191.87137890113905 + ], + "49": [ + 442.40787687887985, + 181.62900222397684 + ], + "57": [ + 437.78428947086695, + 174.0864542912534 + ], + "65": [ + 435.624073769623, + 169.8993539529232 + ], + "73": [ + 430.4298050570293, + 157.88643604363062 + ], + "81": [ + 422.9914558676447, + 149.91623215394105 + ], + "89": [ + 415.50772406488164, + 135.60305350462318 + ], + "97": [ + 410.07601879931485, + 118.58157024076803 + ], + "105": [ + 404.8623446629439, + 108.8056745899558 + ], + "113": [ + 397.20281156490455, + 94.17311424358962 + ], + "121": [ + 387.6399855506237, + 82.52295700462156 + ], + "128": [ + 378.7189959982258, + 69.37530489299064 + ] + }, + "mean_error_pixels": 0.91016418897469, + "max_error_pixels": 1.8717575606383132 + }, + "tower_window_left": { + "xyz": [ + -65.09771227637259, + 84.5620816143931, + 75.10958474060008 + ], + "observations": { + "1": [ + 335.0, + 200.0 + ], + "9": [ + 331.4877014160156, + 191.74758911132812 + ], + "17": [ + 328.3415222167969, + 183.99449157714844 + ], + "25": [ + 321.3124084472656, + 174.48814392089844 + ], + "33": [ + 310.0098571777344, + 163.9500274658203 + ], + "41": [ + 302.093017578125, + 158.16368103027344 + ], + "49": [ + 295.2342224121094, + 148.7094268798828 + ], + "57": [ + 287.56683349609375, + 140.78289794921875 + ], + "65": [ + 282.7301330566406, + 133.88592529296875 + ], + "73": [ + 275.2150573730469, + 122.91220092773438 + ], + "81": [ + 265.39862060546875, + 115.28715515136719 + ], + "89": [ + 255.3653106689453, + 104.95367431640625 + ], + "97": [ + 247.53680419921875, + 90.76495361328125 + ], + "105": [ + 239.53671264648438, + 80.81397247314453 + ], + "113": [ + 228.95188903808594, + 68.32307434082031 + ], + "121": [ + 216.32554626464844, + 58.18230438232422 + ], + "128": [ + 204.4120330810547, + 48.380897521972656 + ] + }, + "projections": { + "1": [ + 335.5897883402013, + 198.4256526101376 + ], + "9": [ + 332.21234069945183, + 191.0782462093203 + ], + "17": [ + 330.1548497185217, + 185.39594751577863 + ], + "25": [ + 322.2321901222826, + 174.9441073595467 + ], + "33": [ + 307.9112107634219, + 161.30077554055032 + ], + "41": [ + 300.8349389663795, + 156.81767653282918 + ], + "49": [ + 293.9321588725419, + 146.7319015695494 + ], + "57": [ + 287.1222530558825, + 139.72837857858946 + ], + "65": [ + 284.18815419430405, + 136.32361099743537 + ], + "73": [ + 276.10818467512746, + 124.72235705804627 + ], + "81": [ + 266.0761014438346, + 118.50991807925334 + ], + "89": [ + 255.31226337590272, + 106.01347280336233 + ], + "97": [ + 246.85864872704497, + 90.17363208664688 + ], + "105": [ + 239.91999599910037, + 82.11298444967377 + ], + "113": [ + 228.91077722127415, + 68.52642261483095 + ], + "121": [ + 215.8937513740791, + 58.19453415596456 + ], + "128": [ + 203.63433624335795, + 46.61628450057083 + ] + }, + "mean_error_pixels": 1.6915025523249403, + "max_error_pixels": 3.3797710774331255 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/materials/asphalt_track_files.json b/astra_scene_test/Scene_04/assets/materials/asphalt_track_files.json new file mode 100644 index 0000000000000000000000000000000000000000..9ed3dfa68e30ca311e9d3e9aab309dd6028e4fa7 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/materials/asphalt_track_files.json @@ -0,0 +1 @@ +{"Diffuse":{"8k":{"jpg":{"size":47987723,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_diff_8k.jpg","md5":"e0e0dbb41ed149b0f4a5a49437b244fa"},"png":{"size":351140287,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_diff_8k.png","md5":"bb895101f59a77924f6fbf8fe139b24d"},"exr":{"size":92188379,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_diff_8k.exr","md5":"5020e01b809cb7ccccb640654e2a8dbc"}},"4k":{"jpg":{"size":14847841,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_diff_4k.jpg","md5":"173f5f31c51f9d432931b3f17c734d3c"},"png":{"size":91057902,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_diff_4k.png","md5":"bf7829c05d44c2604b2140af204fbc6e"},"exr":{"size":30525271,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_diff_4k.exr","md5":"63af0119459adeae8b1d81c28f7779e6"}},"2k":{"jpg":{"size":3779263,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_diff_2k.jpg","md5":"faec159f1f29d231581c32bd256b5ede"},"png":{"size":22995688,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_diff_2k.png","md5":"b7df6b346da0b9faa4a6c2f4b480c002"},"exr":{"size":8531486,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_diff_2k.exr","md5":"a96f4f1ae0c4efd5d839e1c261832c33"}},"1k":{"jpg":{"size":858925,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_diff_1k.jpg","md5":"92e0682878c39430e521cce235ac1f75"},"png":{"size":5694360,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_diff_1k.png","md5":"10ac8b303641094d451807d161bb724a"},"exr":{"size":2078907,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_diff_1k.exr","md5":"e3ffd6cf8978158c459c76dee9e25cda"}}},"nor_dx":{"8k":{"jpg":{"size":61409593,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_nor_dx_8k.jpg","md5":"125c641932aa9c77a7e5e6468f3f3292"},"png":{"size":354764065,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_nor_dx_8k.png","md5":"9990f67d0f2359902385b4dbdf1afec8"},"exr":{"size":129304411,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_nor_dx_8k.exr","md5":"824c39f9547b1e8e6166f16da332b714"}},"4k":{"jpg":{"size":15227810,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_nor_dx_4k.jpg","md5":"22750f3616f292a037af1926f751f557"},"png":{"size":89478134,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_nor_dx_4k.png","md5":"e2fbf996095824e883c919445a6baef8"},"exr":{"size":32357114,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_nor_dx_4k.exr","md5":"5b029be3e9f9f8dd1a162c2f97c60bb3"}},"2k":{"jpg":{"size":3687631,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_nor_dx_2k.jpg","md5":"81fb6473062c9a2de8b59746723a345c"},"png":{"size":22357092,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_nor_dx_2k.png","md5":"82c1b75221147953e206b139e3ed1f44"},"exr":{"size":7977760,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_nor_dx_2k.exr","md5":"ca840156f3f2878fa67a0dedcdd11c7b"}},"1k":{"jpg":{"size":833383,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_nor_dx_1k.jpg","md5":"cb52486599d3c14385e09bdb4fecfb6f"},"png":{"size":5576795,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_nor_dx_1k.png","md5":"63ee6deb2d5221a5bc9489674c4f9cc6"},"exr":{"size":1906325,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_nor_dx_1k.exr","md5":"c492f0fed46b598103f91deb17655dd3"}}},"nor_gl":{"8k":{"jpg":{"size":61578400,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_nor_gl_8k.jpg","md5":"1d61a272d114f1c02ae1232b4d80bd67"},"png":{"size":355641745,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_nor_gl_8k.png","md5":"883c8e5dfe7bc9b36eca5a4f87cbad0f"},"exr":{"size":129393690,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_nor_gl_8k.exr","md5":"76506327724646f9aecf3faf7b25c68c"}},"4k":{"jpg":{"size":15267669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_nor_gl_4k.jpg","md5":"b1330784382948d82765709a1c1390e9"},"png":{"size":89478315,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_nor_gl_4k.png","md5":"15c4515b3ca2621300dc61328194cbe3"},"exr":{"size":32371203,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_nor_gl_4k.exr","md5":"8d75ac89f3836309e03df335a23798c7"}},"2k":{"jpg":{"size":3694762,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_nor_gl_2k.jpg","md5":"5381e78d5deda41e9ff5dd9c317bfa62"},"png":{"size":22358634,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_nor_gl_2k.png","md5":"e4fa33856e0f3146c2de85f3a08dd343"},"exr":{"size":7982651,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_nor_gl_2k.exr","md5":"d7e59eb012c0f37a3c5a0dd51e535a18"}},"1k":{"jpg":{"size":832851,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_nor_gl_1k.jpg","md5":"d61d8e22e24ea0e44873b9c9c97d4e0c"},"png":{"size":5576836,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_nor_gl_1k.png","md5":"af77c53cabdcccd619d85322f7af1535"},"exr":{"size":1905508,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_nor_gl_1k.exr","md5":"abc2203a45666b0a614273e564d93c96"}}},"blend":{"8k":{"blend":{"include":{"textures/asphalt_track_disp_8k.png":{"size":85805855,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_disp_8k.png","md5":"7620fee4adfdbd5e23a05bed6b3823b9"},"textures/asphalt_track_rough_8k.exr":{"size":24430548,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_rough_8k.exr","md5":"511b6581bb522a79fc783a4bfe9d7a18"},"textures/asphalt_track_diff_8k.jpg":{"size":47987723,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_diff_8k.jpg","md5":"e0e0dbb41ed149b0f4a5a49437b244fa"},"textures/asphalt_track_nor_gl_8k.exr":{"size":129393690,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_nor_gl_8k.exr","md5":"76506327724646f9aecf3faf7b25c68c"}},"size":217281,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/8k/asphalt_track/asphalt_track_8k.blend","md5":"ec94b6f3a874572cba4f43bf5e55062c"}},"4k":{"blend":{"include":{"textures/asphalt_track_diff_4k.jpg":{"size":14847841,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_diff_4k.jpg","md5":"173f5f31c51f9d432931b3f17c734d3c"},"textures/asphalt_track_disp_4k.png":{"size":24113156,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_disp_4k.png","md5":"b9c25daad8006e9fb066560ac8cb82e2"},"textures/asphalt_track_nor_gl_4k.exr":{"size":32371203,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_nor_gl_4k.exr","md5":"8d75ac89f3836309e03df335a23798c7"},"textures/asphalt_track_rough_4k.exr":{"size":8329545,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_rough_4k.exr","md5":"4ce96b2a791267ff9305d0730eaefd20"}},"size":217483,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/4k/asphalt_track/asphalt_track_4k.blend","md5":"34493bb39c00fb13f53e468e630c40f0"}},"2k":{"blend":{"include":{"textures/asphalt_track_nor_gl_2k.exr":{"size":7982651,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_nor_gl_2k.exr","md5":"d7e59eb012c0f37a3c5a0dd51e535a18"},"textures/asphalt_track_rough_2k.exr":{"size":2156438,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_rough_2k.exr","md5":"0d7c3bd6a59e7d9853953233855c3d15"},"textures/asphalt_track_disp_2k.png":{"size":6257146,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_disp_2k.png","md5":"799c1ce524ef0cc8353876aa4994e6c5"},"textures/asphalt_track_diff_2k.jpg":{"size":3779263,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_diff_2k.jpg","md5":"faec159f1f29d231581c32bd256b5ede"}},"size":217343,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/2k/asphalt_track/asphalt_track_2k.blend","md5":"c2a4bad9d5cc44775f3b0dd67085b8cb"}},"1k":{"blend":{"include":{"textures/asphalt_track_diff_1k.jpg":{"size":858925,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_diff_1k.jpg","md5":"92e0682878c39430e521cce235ac1f75"},"textures/asphalt_track_disp_1k.png":{"size":1611338,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_disp_1k.png","md5":"a70a3b47069f56629b076beb7fbf69d1"},"textures/asphalt_track_rough_1k.exr":{"size":464541,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_rough_1k.exr","md5":"0bcfe4ce111da735856129f628ca7696"},"textures/asphalt_track_nor_gl_1k.exr":{"size":1905508,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_nor_gl_1k.exr","md5":"abc2203a45666b0a614273e564d93c96"}},"size":217388,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/1k/asphalt_track/asphalt_track_1k.blend","md5":"79280330ecf39f39f101bf4e9e11cbcf"}}},"gltf":{"8k":{"gltf":{"include":{"asphalt_track.bin":{"size":2370708,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/asphalt_track/asphalt_track.bin","md5":"9a58bf9fb3baf83887ff9690abb127ec"},"textures/asphalt_track_arm_8k.jpg":{"size":39077381,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_arm_8k.jpg","md5":"63c11f866cf3f220b31f34f61ee9a7b8"},"textures/asphalt_track_diff_8k.jpg":{"size":47987723,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_diff_8k.jpg","md5":"e0e0dbb41ed149b0f4a5a49437b244fa"},"textures/asphalt_track_nor_gl_8k.jpg":{"size":61578400,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_nor_gl_8k.jpg","md5":"1d61a272d114f1c02ae1232b4d80bd67"}},"size":2789,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/asphalt_track/asphalt_track_8k.gltf","md5":"a9b6215b4afc4eb8d240ee2ec061d6cf"}},"4k":{"gltf":{"include":{"asphalt_track.bin":{"size":2370708,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/asphalt_track/asphalt_track.bin","md5":"9a58bf9fb3baf83887ff9690abb127ec"},"textures/asphalt_track_diff_4k.jpg":{"size":14847841,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_diff_4k.jpg","md5":"173f5f31c51f9d432931b3f17c734d3c"},"textures/asphalt_track_arm_4k.jpg":{"size":10594366,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_arm_4k.jpg","md5":"d428dd6753ba7fe6877852196d641813"},"textures/asphalt_track_nor_gl_4k.jpg":{"size":15267669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_nor_gl_4k.jpg","md5":"b1330784382948d82765709a1c1390e9"}},"size":2789,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/4k/asphalt_track/asphalt_track_4k.gltf","md5":"26c7a6058d711d231dabb8d368103213"}},"2k":{"gltf":{"include":{"asphalt_track.bin":{"size":2370708,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/asphalt_track/asphalt_track.bin","md5":"9a58bf9fb3baf83887ff9690abb127ec"},"textures/asphalt_track_diff_2k.jpg":{"size":3779263,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_diff_2k.jpg","md5":"faec159f1f29d231581c32bd256b5ede"},"textures/asphalt_track_arm_2k.jpg":{"size":2469962,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_arm_2k.jpg","md5":"a528253bac67e8570553c4eac14d97e8"},"textures/asphalt_track_nor_gl_2k.jpg":{"size":3694762,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_nor_gl_2k.jpg","md5":"5381e78d5deda41e9ff5dd9c317bfa62"}},"size":2789,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/2k/asphalt_track/asphalt_track_2k.gltf","md5":"5eb57493df2eabcdf9ef1f5a31ac2683"}},"1k":{"gltf":{"include":{"asphalt_track.bin":{"size":2370708,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/asphalt_track/asphalt_track.bin","md5":"9a58bf9fb3baf83887ff9690abb127ec"},"textures/asphalt_track_arm_1k.jpg":{"size":529896,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_arm_1k.jpg","md5":"f38c5981fb7f8e8c9a8a42726d7fe5a5"},"textures/asphalt_track_diff_1k.jpg":{"size":858925,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_diff_1k.jpg","md5":"92e0682878c39430e521cce235ac1f75"},"textures/asphalt_track_nor_gl_1k.jpg":{"size":832851,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_nor_gl_1k.jpg","md5":"d61d8e22e24ea0e44873b9c9c97d4e0c"}},"size":2789,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/1k/asphalt_track/asphalt_track_1k.gltf","md5":"6360b5017a755187b401eb3c4eb0a5a3"}}},"arm":{"8k":{"jpg":{"size":39077381,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_arm_8k.jpg","md5":"63c11f866cf3f220b31f34f61ee9a7b8"},"png":{"size":245720880,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_arm_8k.png","md5":"42212a45b70d39e52417bbb649411842"},"exr":{"size":66026359,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_arm_8k.exr","md5":"66df4694cbcbe8f68e1df23df0c32f6e"}},"4k":{"jpg":{"size":10594366,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_arm_4k.jpg","md5":"d428dd6753ba7fe6877852196d641813"},"png":{"size":66231113,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_arm_4k.png","md5":"93fc13769c0e0b5be8cb49ca2781ee1a"},"exr":{"size":21063764,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_arm_4k.exr","md5":"f9262b4ed253f3638d3eef9c74b8d7b9"}},"2k":{"jpg":{"size":2469962,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_arm_2k.jpg","md5":"a528253bac67e8570553c4eac14d97e8"},"png":{"size":17082979,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_arm_2k.png","md5":"ba907661fae10c071109392b930d3207"},"exr":{"size":5367706,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_arm_2k.exr","md5":"04a6c7a4b18ff32186f6573d3e93251b"}},"1k":{"jpg":{"size":529896,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_arm_1k.jpg","md5":"f38c5981fb7f8e8c9a8a42726d7fe5a5"},"png":{"size":4202359,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_arm_1k.png","md5":"7e79e55a0261bb50b09283bfcdfd54d8"},"exr":{"size":1071236,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_arm_1k.exr","md5":"008e54cb2c5923d85da0e4085c7deac0"}}},"AO":{"8k":{"jpg":{"size":37686131,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_ao_8k.jpg","md5":"39f265397f46132b319d9d5318ec0256"},"png":{"size":95367135,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_ao_8k.png","md5":"785de799c4ce307a3e8ca4ebcbd5e9d9"},"exr":{"size":35224140,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_ao_8k.exr","md5":"054c4fd7a6dd39a17da8452e551ed120"}},"4k":{"jpg":{"size":9924792,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_ao_4k.jpg","md5":"6f4b7e0e8faf2f043f7e65933695a781"},"png":{"size":27808243,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_ao_4k.png","md5":"90ec429d1f815875cac9385b94ff23f8"},"exr":{"size":9492270,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_ao_4k.exr","md5":"7576a70c0a535481702925a12eaac0e3"}},"2k":{"jpg":{"size":2411966,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_ao_2k.jpg","md5":"1e5ceb618cfa35b6481fdaf2dd1427c1"},"png":{"size":7333205,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_ao_2k.png","md5":"a916b15ac30672e6d2272af7e0f772ec"},"exr":{"size":2341584,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_ao_2k.exr","md5":"37a3848f119e717b3c5b4898b1ee8629"}},"1k":{"jpg":{"size":572610,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_ao_1k.jpg","md5":"c6e83474bcca7fd9307860934ca20918"},"png":{"size":1827130,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_ao_1k.png","md5":"ab027d04f509da36f2098c8fa53a1594"},"exr":{"size":572371,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_ao_1k.exr","md5":"6b667816cbbaaa0d3c15c62f2460b407"}}},"Displacement":{"8k":{"jpg":{"size":9594294,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_disp_8k.jpg","md5":"4739f20ca761e585a0d9270dcef0296a"},"png":{"size":85805855,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_disp_8k.png","md5":"7620fee4adfdbd5e23a05bed6b3823b9"},"exr":{"size":6830453,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_disp_8k.exr","md5":"e858eea408332aa74aeb768efcb39c7e"}},"4k":{"jpg":{"size":2996796,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_disp_4k.jpg","md5":"5030513f53caeae6f2f8fd81f0c9ea5a"},"png":{"size":24113156,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_disp_4k.png","md5":"b9c25daad8006e9fb066560ac8cb82e2"},"exr":{"size":2399037,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_disp_4k.exr","md5":"be8a8cff2e2d9b3040febd9e1ebdaa73"}},"2k":{"jpg":{"size":929202,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_disp_2k.jpg","md5":"1dd05731262bf00e6c691ff9151280d8"},"png":{"size":6257146,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_disp_2k.png","md5":"799c1ce524ef0cc8353876aa4994e6c5"},"exr":{"size":804834,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_disp_2k.exr","md5":"34cc177a575276608c978a9ef84f2516"}},"1k":{"jpg":{"size":280742,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_disp_1k.jpg","md5":"b28970fde2a5c20efa71a8e377ed426f"},"png":{"size":1611338,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_disp_1k.png","md5":"a70a3b47069f56629b076beb7fbf69d1"},"exr":{"size":244015,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_disp_1k.exr","md5":"c5fd1268d85f483ed6fbea16e4b693e2"}}},"Rough":{"8k":{"jpg":{"size":26684611,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_rough_8k.jpg","md5":"232d529d5b522e488529a2b0c3b3d422"},"png":{"size":110546291,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_rough_8k.png","md5":"c99606faeff35f85be950977cb5f6c95"},"exr":{"size":24430548,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_rough_8k.exr","md5":"511b6581bb522a79fc783a4bfe9d7a18"}},"4k":{"jpg":{"size":8806397,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_rough_4k.jpg","md5":"e1c7654e45dffccdb2edc1c48b65a707"},"png":{"size":28902111,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_rough_4k.png","md5":"776debbb78181ca1748aeed3a70b92df"},"exr":{"size":8329545,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_rough_4k.exr","md5":"4ce96b2a791267ff9305d0730eaefd20"}},"2k":{"jpg":{"size":2182047,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_rough_2k.jpg","md5":"213b9f13c03772e24a9cd55c4e43f391"},"png":{"size":7275946,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_rough_2k.png","md5":"57444a326e829d84d9ef6232f15be406"},"exr":{"size":2156438,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_rough_2k.exr","md5":"0d7c3bd6a59e7d9853953233855c3d15"}},"1k":{"jpg":{"size":459197,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_rough_1k.jpg","md5":"c57f7b3a42ebfaf58e44c0ccc83326c3"},"png":{"size":1758717,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_rough_1k.png","md5":"c092a77d75b861a8b3be9f31e7ec5067"},"exr":{"size":464541,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_rough_1k.exr","md5":"0bcfe4ce111da735856129f628ca7696"}}},"mtlx":{"8k":{"mtlx":{"include":{"textures/asphalt_track_disp_8k.png":{"size":85805855,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/asphalt_track/asphalt_track_disp_8k.png","md5":"7620fee4adfdbd5e23a05bed6b3823b9"},"textures/asphalt_track_rough_8k.exr":{"size":24430548,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_rough_8k.exr","md5":"511b6581bb522a79fc783a4bfe9d7a18"},"textures/asphalt_track_diff_8k.jpg":{"size":47987723,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/asphalt_track/asphalt_track_diff_8k.jpg","md5":"e0e0dbb41ed149b0f4a5a49437b244fa"},"textures/asphalt_track_nor_gl_8k.exr":{"size":129393690,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/asphalt_track/asphalt_track_nor_gl_8k.exr","md5":"76506327724646f9aecf3faf7b25c68c"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/8k/asphalt_track/asphalt_track_8k.mtlx","md5":"3ef147f4cf6499a0cfb3f6acfae81994"}},"4k":{"mtlx":{"include":{"textures/asphalt_track_diff_4k.jpg":{"size":14847841,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/asphalt_track/asphalt_track_diff_4k.jpg","md5":"173f5f31c51f9d432931b3f17c734d3c"},"textures/asphalt_track_disp_4k.png":{"size":24113156,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/asphalt_track/asphalt_track_disp_4k.png","md5":"b9c25daad8006e9fb066560ac8cb82e2"},"textures/asphalt_track_nor_gl_4k.exr":{"size":32371203,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_nor_gl_4k.exr","md5":"8d75ac89f3836309e03df335a23798c7"},"textures/asphalt_track_rough_4k.exr":{"size":8329545,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/asphalt_track/asphalt_track_rough_4k.exr","md5":"4ce96b2a791267ff9305d0730eaefd20"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/4k/asphalt_track/asphalt_track_4k.mtlx","md5":"dcf83e19c0a84b773170b8c25cc76455"}},"2k":{"mtlx":{"include":{"textures/asphalt_track_nor_gl_2k.exr":{"size":7982651,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_nor_gl_2k.exr","md5":"d7e59eb012c0f37a3c5a0dd51e535a18"},"textures/asphalt_track_rough_2k.exr":{"size":2156438,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/asphalt_track/asphalt_track_rough_2k.exr","md5":"0d7c3bd6a59e7d9853953233855c3d15"},"textures/asphalt_track_disp_2k.png":{"size":6257146,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_disp_2k.png","md5":"799c1ce524ef0cc8353876aa4994e6c5"},"textures/asphalt_track_diff_2k.jpg":{"size":3779263,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_diff_2k.jpg","md5":"faec159f1f29d231581c32bd256b5ede"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/2k/asphalt_track/asphalt_track_2k.mtlx","md5":"8acc0f64f9f51397c1bcc24d49dfa27c"}},"1k":{"mtlx":{"include":{"textures/asphalt_track_diff_1k.jpg":{"size":858925,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/asphalt_track/asphalt_track_diff_1k.jpg","md5":"92e0682878c39430e521cce235ac1f75"},"textures/asphalt_track_disp_1k.png":{"size":1611338,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/asphalt_track/asphalt_track_disp_1k.png","md5":"a70a3b47069f56629b076beb7fbf69d1"},"textures/asphalt_track_rough_1k.exr":{"size":464541,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_rough_1k.exr","md5":"0bcfe4ce111da735856129f628ca7696"},"textures/asphalt_track_nor_gl_1k.exr":{"size":1905508,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/asphalt_track/asphalt_track_nor_gl_1k.exr","md5":"abc2203a45666b0a614273e564d93c96"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/1k/asphalt_track/asphalt_track_1k.mtlx","md5":"07742ba313308bfa42fdadd0ae22b471"}}}} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/materials/brick_wall_09_files.json b/astra_scene_test/Scene_04/assets/materials/brick_wall_09_files.json new file mode 100644 index 0000000000000000000000000000000000000000..d281fcddfb34eec2082761721be7a530585608ed --- /dev/null +++ b/astra_scene_test/Scene_04/assets/materials/brick_wall_09_files.json @@ -0,0 +1 @@ +{"Diffuse":{"8k":{"jpg":{"size":49298042,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_diff_8k.jpg","md5":"016759ec830a1bc05be68ff4bd2cb9fe"},"png":{"size":332200652,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_diff_8k.png","md5":"a39c587fc604f2d7130387bbcf368cdf"},"exr":{"size":72041425,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_diff_8k.exr","md5":"8f52a97f76a8c0c4b642f634dae2f564"}},"16k":{"jpg":{"size":155495415,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_diff_16k.jpg","md5":"9179a8fca35bba6f3ea7b6861f01d403"},"png":{"size":1206706898,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_diff_16k.png","md5":"5876d9dca9f3650c167be12e54968604"},"exr":{"size":212163861,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_diff_16k.exr","md5":"8a662d9421eafeea9d629c9fc33b8c1e"}},"4k":{"jpg":{"size":12691833,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_diff_4k.jpg","md5":"5b57d70ff2e76ae09b083054f118282f"},"png":{"size":86086698,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_diff_4k.png","md5":"edfe0528915c3e312b18a0e8f555b8c9"},"exr":{"size":20800432,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_diff_4k.exr","md5":"36ad32604a34a5c1da7c4d6b9c7a9c75"}},"2k":{"jpg":{"size":3116669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_diff_2k.jpg","md5":"f675297a70b77f881feb18c012b53b82"},"png":{"size":22071408,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_diff_2k.png","md5":"2ac295b100129f7221df920498d462be"},"exr":{"size":5429958,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_diff_2k.exr","md5":"fd5da95e9800518d830af968c20ac90b"}},"1k":{"jpg":{"size":777371,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_diff_1k.jpg","md5":"d08a1a4be611135d174f051189e00156"},"png":{"size":5495107,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_diff_1k.png","md5":"fa911ea2501ad438ee3715b05d23b977"},"exr":{"size":1391393,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_diff_1k.exr","md5":"5a71c382f6696e4a8e0a6d652119b2c5"}}},"nor_dx":{"8k":{"jpg":{"size":72927862,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_nor_dx_8k.jpg","md5":"a272247bd8d4360ef282e5edf395f33b"},"png":{"size":362198222,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_nor_dx_8k.png","md5":"a296dab0cc36b219ba16c7fde49ab6c4"},"exr":{"size":143963731,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_nor_dx_8k.exr","md5":"2b2c2ceaceea290dd11050667768823e"}},"16k":{"jpg":{"size":238233072,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_nor_dx_16k.jpg","md5":"509c120cf44c17f41cc9dd9313b4bc8b"},"png":{"size":1322132992,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_nor_dx_16k.png","md5":"a53df4dc9c22a22d8d3a94bcbcf0e0bc"},"exr":{"size":449523497,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_nor_dx_16k.exr","md5":"2185ba310acdc1383105a917bf9ae235"}},"4k":{"jpg":{"size":19039005,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_nor_dx_4k.jpg","md5":"9811b8716451f4d07b7db2bb50d43f53"},"png":{"size":93004905,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_nor_dx_4k.png","md5":"da7d2518d3a905d4d2e1ec06dd119a27"},"exr":{"size":37978537,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_nor_dx_4k.exr","md5":"acd363b9cfd17a06f445944e4b71a091"}},"2k":{"jpg":{"size":4506692,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_nor_dx_2k.jpg","md5":"ca757a730cd079c2fee9ff9832102fcb"},"png":{"size":23357919,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_nor_dx_2k.png","md5":"a2e2ef0ea329970bd9a75db5fe3764e7"},"exr":{"size":9276470,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_nor_dx_2k.exr","md5":"2b2a4fe64df91fcfc962f231e2df36e8"}},"1k":{"jpg":{"size":1036781,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_nor_dx_1k.jpg","md5":"b16a16056e2012adb6a5a6f7d34a61ca"},"png":{"size":5755493,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_nor_dx_1k.png","md5":"54cb847b41a9d15a1a29c834cac32fe3"},"exr":{"size":2224723,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_nor_dx_1k.exr","md5":"e9e1369bdacc493156e12af93488de68"}}},"nor_gl":{"8k":{"jpg":{"size":72875273,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_nor_gl_8k.jpg","md5":"e86e02f10cd582a2c664f7a5811fdc1b"},"png":{"size":362195296,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_nor_gl_8k.png","md5":"305c91c4310b82a6c7b7ac33b9c9437f"},"exr":{"size":143777324,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_nor_gl_8k.exr","md5":"36d30bbaf3f23500f69371b5e473ebe3"}},"16k":{"jpg":{"size":238157952,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_nor_gl_16k.jpg","md5":"e6a248bc9e238bc1f67fb79e2770b209"},"png":{"size":1326437253,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_nor_gl_16k.png","md5":"df35660ae66570de27bb4c81a0ec01fb"},"exr":{"size":448776519,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_nor_gl_16k.exr","md5":"11f8235722f7caaebff806ae264c18d3"}},"4k":{"jpg":{"size":19034343,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_nor_gl_4k.jpg","md5":"708479dad1c3d63e5468e016a44d46ac"},"png":{"size":93005762,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_nor_gl_4k.png","md5":"f1bebc6ef51d241669c8228e04656529"},"exr":{"size":37937299,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_nor_gl_4k.exr","md5":"02bc11ba5ff6fbceabf9138c98655d82"}},"2k":{"jpg":{"size":4511408,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_nor_gl_2k.jpg","md5":"4541c3d3354e3f22f96f47a944c9d742"},"png":{"size":23359116,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_nor_gl_2k.png","md5":"bb665bddf097079d6800001bd85d7b65"},"exr":{"size":9264325,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_nor_gl_2k.exr","md5":"3e3a1bf42a79463783ee1871d45ce03e"}},"1k":{"jpg":{"size":1039733,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_nor_gl_1k.jpg","md5":"dabdbe435f6880f41dc7bbdc3f02840a"},"png":{"size":5756520,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_nor_gl_1k.png","md5":"600679747309e94afdd49915a74c2126"},"exr":{"size":2221558,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_nor_gl_1k.exr","md5":"c988ebdc35bfc02f9c8052bd4aac0706"}}},"blend":{"8k":{"blend":{"include":{"textures/brick_wall_09_disp_8k.png":{"size":88096829,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_disp_8k.png","md5":"cda83fc359e02a3885f34d33490938f7"},"textures/brick_wall_09_nor_gl_8k.exr":{"size":143777324,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_nor_gl_8k.exr","md5":"36d30bbaf3f23500f69371b5e473ebe3"},"textures/brick_wall_09_rough_8k.exr":{"size":25304479,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_rough_8k.exr","md5":"7fe7e628a014ff92fb9b26d0b4104ec8"},"textures/brick_wall_09_diff_8k.jpg":{"size":49298042,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_diff_8k.jpg","md5":"016759ec830a1bc05be68ff4bd2cb9fe"},"textures/brick_wall_09_ao_8k.jpg":{"size":44278667,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_ao_8k.jpg","md5":"b50cea2691e71df0109656ac340fcb28"}},"size":216884,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/8k/brick_wall_09/brick_wall_09_8k.blend","md5":"decd3c9ffa14b26c8c62240f65d4c882"}},"16k":{"blend":{"include":{"textures/brick_wall_09_ao_16k.jpg":{"size":140408600,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_ao_16k.jpg","md5":"53342e3792410319ffe397d0033b0040"},"textures/brick_wall_09_diff_16k.jpg":{"size":155495415,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_diff_16k.jpg","md5":"9179a8fca35bba6f3ea7b6861f01d403"},"textures/brick_wall_09_rough_16k.exr":{"size":77965153,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_rough_16k.exr","md5":"366589786c5b93232f82056d655ef06c"},"textures/brick_wall_09_disp_16k.png":{"size":237367010,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_disp_16k.png","md5":"9185ef66c96c134a5ac24af9879e42da"},"textures/brick_wall_09_nor_gl_16k.exr":{"size":448776519,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_nor_gl_16k.exr","md5":"11f8235722f7caaebff806ae264c18d3"}},"size":216932,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/16k/brick_wall_09/brick_wall_09_16k.blend","md5":"3b4c91a02820f97b5461f9274b0dfe89"}},"4k":{"blend":{"include":{"textures/brick_wall_09_rough_4k.exr":{"size":6705597,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_rough_4k.exr","md5":"15caf4f7750374fbf351780216523968"},"textures/brick_wall_09_diff_4k.jpg":{"size":12691833,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_diff_4k.jpg","md5":"5b57d70ff2e76ae09b083054f118282f"},"textures/brick_wall_09_nor_gl_4k.exr":{"size":37937299,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_nor_gl_4k.exr","md5":"02bc11ba5ff6fbceabf9138c98655d82"},"textures/brick_wall_09_disp_4k.png":{"size":24534598,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_disp_4k.png","md5":"b832de2f89d1e0644b6dd995811271e9"},"textures/brick_wall_09_ao_4k.jpg":{"size":11653676,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_ao_4k.jpg","md5":"9f051cc8a5745dbccc8a8e38777413fd"}},"size":216969,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/4k/brick_wall_09/brick_wall_09_4k.blend","md5":"56d8279308611127269c0b47f631eb62"}},"2k":{"blend":{"include":{"textures/brick_wall_09_nor_gl_2k.exr":{"size":9264325,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_nor_gl_2k.exr","md5":"3e3a1bf42a79463783ee1871d45ce03e"},"textures/brick_wall_09_diff_2k.jpg":{"size":3116669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_diff_2k.jpg","md5":"f675297a70b77f881feb18c012b53b82"},"textures/brick_wall_09_disp_2k.png":{"size":6566084,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_disp_2k.png","md5":"d732d48d64c45a0041fc034edf5716d8"},"textures/brick_wall_09_ao_2k.jpg":{"size":2844498,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_ao_2k.jpg","md5":"b0b8c85b5b3ee4764723a660ceb6d811"},"textures/brick_wall_09_rough_2k.exr":{"size":1639454,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_rough_2k.exr","md5":"2267550a6e854e671976bd3b395e33d3"}},"size":217161,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/2k/brick_wall_09/brick_wall_09_2k.blend","md5":"e2493af833b6f8ebb1fee2f2d552a518"}},"1k":{"blend":{"include":{"textures/brick_wall_09_ao_1k.jpg":{"size":674910,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_ao_1k.jpg","md5":"a87c963ee7255179cae3d6f8a7b55294"},"textures/brick_wall_09_rough_1k.exr":{"size":415236,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_rough_1k.exr","md5":"21cf95c4267f53671e813bb08cd65032"},"textures/brick_wall_09_nor_gl_1k.exr":{"size":2221558,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_nor_gl_1k.exr","md5":"c988ebdc35bfc02f9c8052bd4aac0706"},"textures/brick_wall_09_diff_1k.jpg":{"size":777371,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_diff_1k.jpg","md5":"d08a1a4be611135d174f051189e00156"},"textures/brick_wall_09_disp_1k.png":{"size":1691460,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_disp_1k.png","md5":"4d3f93b662970f42471ea50986c6f52d"}},"size":217097,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/blend/1k/brick_wall_09/brick_wall_09_1k.blend","md5":"761a2d28b27aff0dc1b176a66d9efa17"}}},"gltf":{"8k":{"gltf":{"include":{"textures/brick_wall_09_nor_gl_8k.jpg":{"size":72875273,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_nor_gl_8k.jpg","md5":"e86e02f10cd582a2c664f7a5811fdc1b"},"textures/brick_wall_09_diff_8k.jpg":{"size":49298042,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_diff_8k.jpg","md5":"016759ec830a1bc05be68ff4bd2cb9fe"},"brick_wall_09.bin":{"size":2370484,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09.bin","md5":"106fdd40ad9b7e9613c60c18be089e6b"},"textures/brick_wall_09_arm_8k.jpg":{"size":44484274,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_arm_8k.jpg","md5":"7c6c35d629abee063d64d40dffa161eb"}},"size":2788,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09_8k.gltf","md5":"5adab831d3445a0e6bbf223a8773f049"}},"16k":{"gltf":{"include":{"textures/brick_wall_09_arm_16k.jpg":{"size":148428735,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_arm_16k.jpg","md5":"3515ded32065cd02410842d0d529e67f"},"textures/brick_wall_09_diff_16k.jpg":{"size":155495415,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_diff_16k.jpg","md5":"9179a8fca35bba6f3ea7b6861f01d403"},"brick_wall_09.bin":{"size":2370484,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09.bin","md5":"106fdd40ad9b7e9613c60c18be089e6b"},"textures/brick_wall_09_nor_gl_16k.jpg":{"size":238157952,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_nor_gl_16k.jpg","md5":"e6a248bc9e238bc1f67fb79e2770b209"}},"size":2791,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/16k/brick_wall_09/brick_wall_09_16k.gltf","md5":"3afb9cd641ef59f6a8d77b225ab9930f"}},"4k":{"gltf":{"include":{"textures/brick_wall_09_diff_4k.jpg":{"size":12691833,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_diff_4k.jpg","md5":"5b57d70ff2e76ae09b083054f118282f"},"textures/brick_wall_09_nor_gl_4k.jpg":{"size":19034343,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_nor_gl_4k.jpg","md5":"708479dad1c3d63e5468e016a44d46ac"},"brick_wall_09.bin":{"size":2370484,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09.bin","md5":"106fdd40ad9b7e9613c60c18be089e6b"},"textures/brick_wall_09_arm_4k.jpg":{"size":11386232,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_arm_4k.jpg","md5":"dcf393f28258f23cf8d77703e3ebf533"}},"size":2788,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/4k/brick_wall_09/brick_wall_09_4k.gltf","md5":"6eb8708646c2d21101e4eca274d89ef6"}},"2k":{"gltf":{"include":{"textures/brick_wall_09_arm_2k.jpg":{"size":2757145,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_arm_2k.jpg","md5":"199f99ebdca034c57e9e068605bbb51a"},"textures/brick_wall_09_nor_gl_2k.jpg":{"size":4511408,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_nor_gl_2k.jpg","md5":"4541c3d3354e3f22f96f47a944c9d742"},"textures/brick_wall_09_diff_2k.jpg":{"size":3116669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_diff_2k.jpg","md5":"f675297a70b77f881feb18c012b53b82"},"brick_wall_09.bin":{"size":2370484,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09.bin","md5":"106fdd40ad9b7e9613c60c18be089e6b"}},"size":2788,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/2k/brick_wall_09/brick_wall_09_2k.gltf","md5":"cec5f58b61b63b0a6ed86452c32c3a57"}},"1k":{"gltf":{"include":{"textures/brick_wall_09_arm_1k.jpg":{"size":663260,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_arm_1k.jpg","md5":"8cf1a80689ae46cfd9d2da63ff887b58"},"brick_wall_09.bin":{"size":2370484,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/8k/brick_wall_09/brick_wall_09.bin","md5":"106fdd40ad9b7e9613c60c18be089e6b"},"textures/brick_wall_09_nor_gl_1k.jpg":{"size":1039733,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_nor_gl_1k.jpg","md5":"dabdbe435f6880f41dc7bbdc3f02840a"},"textures/brick_wall_09_diff_1k.jpg":{"size":777371,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_diff_1k.jpg","md5":"d08a1a4be611135d174f051189e00156"}},"size":2788,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/gltf/1k/brick_wall_09/brick_wall_09_1k.gltf","md5":"a5b12607b7b1b417036a81762f59ce7d"}}},"arm":{"8k":{"jpg":{"size":44484274,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_arm_8k.jpg","md5":"7c6c35d629abee063d64d40dffa161eb"},"png":{"size":254300806,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_arm_8k.png","md5":"87a3b38d8fa98c5bf7c4b42a5c6e2f36"},"exr":{"size":77156733,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_arm_8k.exr","md5":"7ef34303ee060434137d4b7720d7890a"}},"16k":{"jpg":{"size":148428735,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_arm_16k.jpg","md5":"3515ded32065cd02410842d0d529e67f"},"png":{"size":904971424,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_arm_16k.png","md5":"3b5305a629b37f21aadc84f880a9b389"},"exr":{"size":228254798,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_arm_16k.exr","md5":"cf9fff9a8a21f0b41ad19b9ce037c548"}},"4k":{"jpg":{"size":11386232,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_arm_4k.jpg","md5":"dcf393f28258f23cf8d77703e3ebf533"},"png":{"size":66241957,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_arm_4k.png","md5":"d40d23edc84812ba1e00c86f88df247a"},"exr":{"size":20810638,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_arm_4k.exr","md5":"9ebdd95670ccb44bd22a0c8d57ab8bad"}},"2k":{"jpg":{"size":2757145,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_arm_2k.jpg","md5":"199f99ebdca034c57e9e068605bbb51a"},"png":{"size":16974235,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_arm_2k.png","md5":"e12bd3fdff77351e3f59a1fde34e66fb"},"exr":{"size":5060896,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_arm_2k.exr","md5":"ee70cd48a62a1bc96f45536541d3e74f"}},"1k":{"jpg":{"size":663260,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_arm_1k.jpg","md5":"8cf1a80689ae46cfd9d2da63ff887b58"},"png":{"size":4213285,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_arm_1k.png","md5":"fc86a554b4930ab596213d9485fc591a"},"exr":{"size":1213476,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_arm_1k.exr","md5":"e2e7bee9038059a3f089f99792ecbad6"}}},"AO":{"8k":{"jpg":{"size":44278667,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_ao_8k.jpg","md5":"b50cea2691e71df0109656ac340fcb28"},"png":{"size":109365411,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_ao_8k.png","md5":"e6e41aa08747b3183847a7b32fe58dd3"},"exr":{"size":41348855,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_ao_8k.exr","md5":"e66e4f3e1e0ee3ed71dd100ba556d307"}},"16k":{"jpg":{"size":140408600,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_ao_16k.jpg","md5":"53342e3792410319ffe397d0033b0040"},"png":{"size":362329621,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_ao_16k.png","md5":"6714b31c1334ddfe99d35f1fdd9051c3"},"exr":{"size":129924367,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_ao_16k.exr","md5":"e10d97b17a7ad4292c7d938712cf3933"}},"4k":{"jpg":{"size":11653676,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_ao_4k.jpg","md5":"9f051cc8a5745dbccc8a8e38777413fd"},"png":{"size":29454895,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_ao_4k.png","md5":"ff6d551f2d7aecd0e67eb1319040ab52"},"exr":{"size":10970112,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_ao_4k.exr","md5":"1956a4ce8c1d8b78664be50e5ea91068"}},"2k":{"jpg":{"size":2844498,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_ao_2k.jpg","md5":"b0b8c85b5b3ee4764723a660ceb6d811"},"png":{"size":7564184,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_ao_2k.png","md5":"0f84b2f9918cd63ab728e38802fcbee3"},"exr":{"size":2729852,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_ao_2k.exr","md5":"85b347b45da1754684af446148c40aea"}},"1k":{"jpg":{"size":674910,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_ao_1k.jpg","md5":"a87c963ee7255179cae3d6f8a7b55294"},"png":{"size":1874697,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_ao_1k.png","md5":"f39bc55f643b42d3df2c1c9e7a281c7e"},"exr":{"size":671681,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_ao_1k.exr","md5":"81884049e613e80ffa41ef4072f04a0d"}}},"Displacement":{"8k":{"jpg":{"size":12457366,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_disp_8k.jpg","md5":"c9889976027911224e78779129f8c23f"},"png":{"size":88096829,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_disp_8k.png","md5":"cda83fc359e02a3885f34d33490938f7"},"exr":{"size":10477548,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_disp_8k.exr","md5":"78713841de3fa9302d89a4c00dab7f6b"}},"16k":{"jpg":{"size":38436799,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_disp_16k.jpg","md5":"7de8b3f1711199b6f9959b5d34dfc142"},"png":{"size":237367010,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_disp_16k.png","md5":"9185ef66c96c134a5ac24af9879e42da"},"exr":{"size":27887634,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_disp_16k.exr","md5":"d6f5bd4ad5da7ae24c98eb84c924866e"}},"4k":{"jpg":{"size":4049586,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_disp_4k.jpg","md5":"3aff7396dec3009a51bf52cfa02ec7a6"},"png":{"size":24534598,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_disp_4k.png","md5":"b832de2f89d1e0644b6dd995811271e9"},"exr":{"size":3556458,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_disp_4k.exr","md5":"62dc502564a43fff5ec21dd23465c91e"}},"2k":{"jpg":{"size":1271708,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_disp_2k.jpg","md5":"e9bf6188a8bba36c1471277c79455173"},"png":{"size":6566084,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_disp_2k.png","md5":"d732d48d64c45a0041fc034edf5716d8"},"exr":{"size":1156221,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_disp_2k.exr","md5":"e28a8da1b04bded7f724af2417117468"}},"1k":{"jpg":{"size":389002,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_disp_1k.jpg","md5":"15cb73014427283cd86b99d1af068cc6"},"png":{"size":1691460,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_disp_1k.png","md5":"4d3f93b662970f42471ea50986c6f52d"},"exr":{"size":386861,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_disp_1k.exr","md5":"f32bfe2f8e91b4c6765150be14d73497"}}},"Rough":{"8k":{"jpg":{"size":28016011,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_rough_8k.jpg","md5":"b97c5cd3659976c252b7cbf0d979f322"},"png":{"size":100669227,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_rough_8k.png","md5":"ed6ae24c530e293f442e836bbcbe2d99"},"exr":{"size":25304479,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_rough_8k.exr","md5":"7fe7e628a014ff92fb9b26d0b4104ec8"}},"16k":{"jpg":{"size":86309560,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_rough_16k.jpg","md5":"3b2f44b05d7c74473508b36f946b0d35"},"png":{"size":324000667,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_rough_16k.png","md5":"9776a5f99954682eae761bb3bcacab54"},"exr":{"size":77965153,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_rough_16k.exr","md5":"366589786c5b93232f82056d655ef06c"}},"4k":{"jpg":{"size":7236955,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_rough_4k.jpg","md5":"e375a4da45a6def75e786be3caf8627f"},"png":{"size":26966298,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_rough_4k.png","md5":"d32f8f629da342f078febe4844801b11"},"exr":{"size":6705597,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_rough_4k.exr","md5":"15caf4f7750374fbf351780216523968"}},"2k":{"jpg":{"size":1760306,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_rough_2k.jpg","md5":"e190ee2e1ea9a07874092a49f0401111"},"png":{"size":6904588,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_rough_2k.png","md5":"647ff25dddcb8e245bd1551b00def314"},"exr":{"size":1639454,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_rough_2k.exr","md5":"2267550a6e854e671976bd3b395e33d3"}},"1k":{"jpg":{"size":433465,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_rough_1k.jpg","md5":"fc3b03d624d30064e5f78c82b5b6c0cc"},"png":{"size":1718853,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_rough_1k.png","md5":"82c8bff95ba48fa1e479ac822b2bcc4f"},"exr":{"size":415236,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_rough_1k.exr","md5":"21cf95c4267f53671e813bb08cd65032"}}},"mtlx":{"8k":{"mtlx":{"include":{"textures/brick_wall_09_disp_8k.png":{"size":88096829,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/8k/brick_wall_09/brick_wall_09_disp_8k.png","md5":"cda83fc359e02a3885f34d33490938f7"},"textures/brick_wall_09_nor_gl_8k.exr":{"size":143777324,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_nor_gl_8k.exr","md5":"36d30bbaf3f23500f69371b5e473ebe3"},"textures/brick_wall_09_rough_8k.exr":{"size":25304479,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/8k/brick_wall_09/brick_wall_09_rough_8k.exr","md5":"7fe7e628a014ff92fb9b26d0b4104ec8"},"textures/brick_wall_09_diff_8k.jpg":{"size":49298042,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_diff_8k.jpg","md5":"016759ec830a1bc05be68ff4bd2cb9fe"},"textures/brick_wall_09_ao_8k.jpg":{"size":44278667,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/8k/brick_wall_09/brick_wall_09_ao_8k.jpg","md5":"b50cea2691e71df0109656ac340fcb28"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/8k/brick_wall_09/brick_wall_09_8k.mtlx","md5":"cb5401e7c0803f9acec83c88ab07331f"}},"16k":{"mtlx":{"include":{"textures/brick_wall_09_ao_16k.jpg":{"size":140408600,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_ao_16k.jpg","md5":"53342e3792410319ffe397d0033b0040"},"textures/brick_wall_09_diff_16k.jpg":{"size":155495415,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/16k/brick_wall_09/brick_wall_09_diff_16k.jpg","md5":"9179a8fca35bba6f3ea7b6861f01d403"},"textures/brick_wall_09_rough_16k.exr":{"size":77965153,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_rough_16k.exr","md5":"366589786c5b93232f82056d655ef06c"},"textures/brick_wall_09_disp_16k.png":{"size":237367010,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/16k/brick_wall_09/brick_wall_09_disp_16k.png","md5":"9185ef66c96c134a5ac24af9879e42da"},"textures/brick_wall_09_nor_gl_16k.exr":{"size":448776519,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/16k/brick_wall_09/brick_wall_09_nor_gl_16k.exr","md5":"11f8235722f7caaebff806ae264c18d3"}},"size":4720,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/16k/brick_wall_09/brick_wall_09_16k.mtlx","md5":"98caa8dcb17cfaa6cd1d1f232420bae5"}},"4k":{"mtlx":{"include":{"textures/brick_wall_09_rough_4k.exr":{"size":6705597,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_rough_4k.exr","md5":"15caf4f7750374fbf351780216523968"},"textures/brick_wall_09_diff_4k.jpg":{"size":12691833,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_diff_4k.jpg","md5":"5b57d70ff2e76ae09b083054f118282f"},"textures/brick_wall_09_nor_gl_4k.exr":{"size":37937299,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/4k/brick_wall_09/brick_wall_09_nor_gl_4k.exr","md5":"02bc11ba5ff6fbceabf9138c98655d82"},"textures/brick_wall_09_disp_4k.png":{"size":24534598,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/4k/brick_wall_09/brick_wall_09_disp_4k.png","md5":"b832de2f89d1e0644b6dd995811271e9"},"textures/brick_wall_09_ao_4k.jpg":{"size":11653676,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/4k/brick_wall_09/brick_wall_09_ao_4k.jpg","md5":"9f051cc8a5745dbccc8a8e38777413fd"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/4k/brick_wall_09/brick_wall_09_4k.mtlx","md5":"efe69e584f6c4d59d5f73edc3f697447"}},"2k":{"mtlx":{"include":{"textures/brick_wall_09_nor_gl_2k.exr":{"size":9264325,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_nor_gl_2k.exr","md5":"3e3a1bf42a79463783ee1871d45ce03e"},"textures/brick_wall_09_diff_2k.jpg":{"size":3116669,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_diff_2k.jpg","md5":"f675297a70b77f881feb18c012b53b82"},"textures/brick_wall_09_disp_2k.png":{"size":6566084,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_disp_2k.png","md5":"d732d48d64c45a0041fc034edf5716d8"},"textures/brick_wall_09_ao_2k.jpg":{"size":2844498,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_ao_2k.jpg","md5":"b0b8c85b5b3ee4764723a660ceb6d811"},"textures/brick_wall_09_rough_2k.exr":{"size":1639454,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/2k/brick_wall_09/brick_wall_09_rough_2k.exr","md5":"2267550a6e854e671976bd3b395e33d3"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/2k/brick_wall_09/brick_wall_09_2k.mtlx","md5":"a70e10caeea559ee981bb4ca8825caeb"}},"1k":{"mtlx":{"include":{"textures/brick_wall_09_ao_1k.jpg":{"size":674910,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_ao_1k.jpg","md5":"a87c963ee7255179cae3d6f8a7b55294"},"textures/brick_wall_09_rough_1k.exr":{"size":415236,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_rough_1k.exr","md5":"21cf95c4267f53671e813bb08cd65032"},"textures/brick_wall_09_nor_gl_1k.exr":{"size":2221558,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/exr/1k/brick_wall_09/brick_wall_09_nor_gl_1k.exr","md5":"c988ebdc35bfc02f9c8052bd4aac0706"},"textures/brick_wall_09_diff_1k.jpg":{"size":777371,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/brick_wall_09/brick_wall_09_diff_1k.jpg","md5":"d08a1a4be611135d174f051189e00156"},"textures/brick_wall_09_disp_1k.png":{"size":1691460,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/png/1k/brick_wall_09/brick_wall_09_disp_1k.png","md5":"4d3f93b662970f42471ea50986c6f52d"}},"size":4716,"url":"https://dl.polyhaven.org/file/ph-assets/Textures/mtlx/1k/brick_wall_09/brick_wall_09_1k.mtlx","md5":"f996aab194bf02bc3950d39578da16cb"}}}} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/materials/manifest.json b/astra_scene_test/Scene_04/assets/materials/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..c44a7146fcd43ee6ae6d3693c92eeb0e4f5e64fc --- /dev/null +++ b/astra_scene_test/Scene_04/assets/materials/manifest.json @@ -0,0 +1,62 @@ +{ + "downloaded_utc": "2026-09-11T15:24:30.578061+00:00", + "assets": [ + { + "asset": "asphalt_track", + "source": "https://polyhaven.com/a/asphalt_track", + "license": "CC0", + "author": "Dimitrios Savva", + "physical_width_m": 2.0, + "maps": { + "diff": { + "path": "assets/materials/asphalt_track_diff_2k.jpg", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_diff_2k.jpg", + "bytes": 3779263, + "sha256": "742d1d79560bd661d5871afc857e981e25dcd563bfd24385cbd063ebcaeef06c" + }, + "rough": { + "path": "assets/materials/asphalt_track_rough_2k.jpg", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/asphalt_track/asphalt_track_rough_2k.jpg", + "bytes": 2182047, + "sha256": "b934fb6fbe05770df95fa94fee3a12d45eb121621ce96e9b262f403d49ee493e" + }, + "disp": { + "path": "assets/materials/asphalt_track_disp_2k.png", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/asphalt_track/asphalt_track_disp_2k.png", + "bytes": 6257146, + "sha256": "3a8fff49c110c612bfd640d7d5531d7b197967adc76a6bbd548c671eab583b43" + } + } + }, + { + "asset": "brick_wall_09", + "source": "https://polyhaven.com/a/brick_wall_09", + "license": "CC0", + "authors": [ + "Matterfield", + "Rob Tuytel" + ], + "physical_width_m": 2.0, + "maps": { + "diff": { + "path": "assets/materials/brick_wall_09_diff_2k.jpg", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_diff_2k.jpg", + "bytes": 3116669, + "sha256": "a8d716e62626f1fecdeab31ab7a8fc33f81a4f9f4dc3f23be35171b080db47a9" + }, + "rough": { + "path": "assets/materials/brick_wall_09_rough_2k.jpg", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/2k/brick_wall_09/brick_wall_09_rough_2k.jpg", + "bytes": 1760306, + "sha256": "fe20265ceafd3b0b93474c9c66efad855bdc029ea2f3c4763fb6315e9670401e" + }, + "disp": { + "path": "assets/materials/brick_wall_09_disp_2k.png", + "url": "https://dl.polyhaven.org/file/ph-assets/Textures/png/2k/brick_wall_09/brick_wall_09_disp_2k.png", + "bytes": 6566084, + "sha256": "a14478ba847341cdb335d0cb974d90fe6184c477cc3809b38959c22a9760e5dd" + } + } + } + ] +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/near_vehicle_landmarks.json b/astra_scene_test/Scene_04/assets/near_vehicle_landmarks.json new file mode 100644 index 0000000000000000000000000000000000000000..4bb54bbaf1e337c7ecab57a06de9d3a65c7f7adc --- /dev/null +++ b/astra_scene_test/Scene_04/assets/near_vehicle_landmarks.json @@ -0,0 +1,244 @@ +{ + "Left black SUV": { + "parameters": { + "x": -15.40583402772641, + "y": 17.689026458088, + "scale_x": 1.3658126531989794, + "scale_y": 0.7254529400923296, + "scale_z": 1.439240796839573, + "yaw": -0.5999999999997535, + "pitch": 0.004614710917425294, + "z": -0.29999999999999993 + }, + "observations": { + "front_wheel": { + "1": [ + 242, + 583 + ], + "17": [ + 114, + 599 + ] + }, + "rear_wheel": { + "1": [ + 309, + 570 + ], + "17": [ + 217, + 580 + ], + "33": [ + 69, + 602 + ] + }, + "roof_front": { + "1": [ + 245, + 522 + ], + "17": [ + 147, + 522 + ] + }, + "roof_rear": { + "1": [ + 306, + 516 + ], + "17": [ + 206, + 517 + ], + "33": [ + 65, + 521 + ] + } + }, + "predictions": { + "front_wheel": { + "1": [ + 241.21008186006156, + 577.0273372129063 + ], + "17": [ + 113.21239688890364, + 594.5420671918232 + ] + }, + "rear_wheel": { + "1": [ + 308.9436012495546, + 569.5166040298791 + ], + "17": [ + 218.2540810958356, + 582.7693887710858 + ], + "33": [ + 72.23341064669683, + 602.9402471122226 + ] + }, + "roof_front": { + "1": [ + 259.88152816959655, + 521.5823994346161 + ], + "17": [ + 147.27626306741416, + 520.9057516365284 + ] + }, + "roof_rear": { + "1": [ + 298.9265786048912, + 520.7329672724297 + ], + "17": [ + 206.74526176687374, + 520.0342978496262 + ], + "33": [ + 55.27533299739173, + 518.9665957301395 + ] + } + }, + "cost": 116.68450426911777 + }, + "Left red sedan": { + "parameters": { + "x": -11.836573935579574, + "y": 18.677237230964867, + "scale_x": 1.0906709901455305, + "scale_y": 0.6000000000000029, + "scale_z": 1.430791188066538, + "yaw": -0.06607431915086959, + "pitch": 0.036772614223542034, + "z": 0.02259027956653785 + }, + "observations": { + "front_wheel": { + "1": [ + 377, + 559 + ], + "17": [ + 289, + 580 + ], + "33": [ + 188, + 591 + ] + }, + "rear_wheel": { + "1": [ + 410, + 553 + ], + "17": [ + 334, + 565 + ], + "33": [ + 257, + 576 + ] + }, + "roof_front": { + "1": [ + 376, + 526 + ], + "17": [ + 292, + 529 + ], + "33": [ + 203, + 534 + ] + }, + "roof_rear": { + "1": [ + 404, + 523 + ], + "17": [ + 323, + 528 + ], + "33": [ + 238, + 530 + ] + } + }, + "predictions": { + "front_wheel": { + "1": [ + 374.5970112404388, + 562.6878244172954 + ], + "17": [ + 302.7728065982664, + 574.5197556815417 + ], + "33": [ + 187.37893660001112, + 590.7382521453769 + ] + }, + "rear_wheel": { + "1": [ + 399.6812566147236, + 556.4634955318185 + ], + "17": [ + 343.06745675780485, + 565.3958202434629 + ], + "33": [ + 256.6724762887043, + 575.4642022259088 + ] + }, + "roof_front": { + "1": [ + 375.2780576334563, + 528.4591413198377 + ], + "17": [ + 306.76309104242733, + 530.4664141911271 + ], + "33": [ + 196.61178181897685, + 531.6386497061818 + ] + }, + "roof_rear": { + "1": [ + 390.4085094450751, + 526.6535331154715 + ], + "17": [ + 330.9054705719508, + 528.0928437216932 + ], + "33": [ + 238.04067613093866, + 527.8063974679002 + ] + } + }, + "cost": 211.068758553369 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/opening_hatch.json b/astra_scene_test/Scene_04/assets/opening_hatch.json new file mode 100644 index 0000000000000000000000000000000000000000..1f11cc9c2551b067e0382fd7f87095a7ff35117e --- /dev/null +++ b/astra_scene_test/Scene_04/assets/opening_hatch.json @@ -0,0 +1,151 @@ +{ + "parameters": { + "x": -15.934376297294063, + "y": 11.605644514590427, + "scale_x": 1.9999999979566179, + "scale_y": 0.6000000000000002, + "scale_z": 1.2282623300122342, + "yaw": -0.3094418565154664 + }, + "tire_contact_z": -0.08106531378080746, + "local_features": { + "rear_wheel": [ + 0.98, + 1.44, + 0.44 + ], + "roof_rear": [ + 0.684, + 1.1, + 1.7 + ], + "rear_bumper": [ + 0.86, + 2.15, + 0.65 + ], + "rear_glass_corner": [ + 0.8, + 1.87, + 1.3 + ] + }, + "observations": { + "rear_wheel": { + "1": [ + 124, + 603 + ], + "5": [ + 89, + 610 + ], + "9": [ + 53, + 616 + ] + }, + "roof_rear": { + "1": [ + 104, + 542 + ], + "5": [ + 69, + 543 + ], + "9": [ + 33, + 545 + ] + }, + "rear_bumper": { + "1": [ + 145, + 601 + ], + "5": [ + 109, + 607 + ], + "9": [ + 75, + 615 + ] + }, + "rear_glass_corner": { + "1": [ + 131, + 560 + ], + "5": [ + 97, + 563 + ], + "9": [ + 63, + 568 + ] + } + }, + "predictions": { + "rear_wheel": { + "1": [ + 134.21909353560892, + 597.9114192483208 + ], + "5": [ + 88.2126585804101, + 606.2356274553185 + ], + "9": [ + 33.65838228042708, + 612.9594420173175 + ] + }, + "roof_rear": { + "1": [ + 116.09956002688716, + 543.7574456528481 + ], + "5": [ + 68.816334495599, + 546.9990447637751 + ], + "9": [ + 12.80371379514338, + 547.756196303031 + ] + }, + "rear_bumper": { + "1": [ + 152.18607656005366, + 585.4669628202355 + ], + "5": [ + 110.0647003461919, + 592.2843814120494 + ], + "9": [ + 60.50467960681465, + 597.2806707476982 + ] + }, + "rear_glass_corner": { + "1": [ + 143.94793731938984, + 559.1701077202015 + ], + "5": [ + 100.79437614976837, + 563.6757271898119 + ], + "9": [ + 49.96050836572158, + 565.9900374061785 + ] + } + }, + "cost": 423.88667883386915, + "note": "Fit the cropped opening hatchback to three measured views, camera fixed.\n\nThe rear wheel is partly obscured by wet glass. These manually placed features\nare approximate, and are retained with their residuals for review.\n" +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/right_warm_windows.json b/astra_scene_test/Scene_04/assets/right_warm_windows.json new file mode 100644 index 0000000000000000000000000000000000000000..a492c642b020dde52293bdd0a009e936cc759682 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/right_warm_windows.json @@ -0,0 +1,72 @@ +{ + "upper_warm_left": { + "xyz": [ + 27.124731577334103, + 29.26344576828372, + 32.061021796888525 + ], + "observations": { + "1": [ + 914, + 184 + ], + "17": [ + 967, + 146 + ], + "33": [ + 1006, + 80 + ] + }, + "predictions": { + "1": [ + 918.6034149519265, + 186.6255490338956 + ], + "17": [ + 962.9376996537841, + 143.73006470629207 + ], + "33": [ + 1006.1911962764011, + 80.05577861788169 + ] + } + }, + "upper_warm_right": { + "xyz": [ + 28.114905993348337, + 28.180852673032906, + 32.542485517819685 + ], + "observations": { + "1": [ + 940, + 172 + ], + "17": [ + 989, + 126 + ], + "33": [ + 1035, + 54 + ] + }, + "predictions": { + "1": [ + 939.0877669497763, + 171.37658672670756 + ], + "17": [ + 987.9092830981837, + 124.75433140280029 + ], + "33": [ + 1036.8208673440329, + 55.6607459327185 + ] + } + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/signal_emitters.json b/astra_scene_test/Scene_04/assets/signal_emitters.json new file mode 100644 index 0000000000000000000000000000000000000000..dd8d87146aa140cb4597d11793ffa9c1feaf3fe1 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/signal_emitters.json @@ -0,0 +1,1058 @@ +{ + "left_near_signal": { + "emitter_xyz": [ + -8.147869306397915, + 36.2293467675215, + 6.692715479200735 + ], + "housing_anchor_xyz": [ + -8.147869306397915, + 36.419346767521496, + 6.692715479200735 + ], + "median_error_pixels": 1.660346582904201, + "p90_error_pixels": 2.5813106684819296, + "observations": { + "1": [ + 530.8274643912322, + 474.50536228809517 + ], + "2": [ + 530.5244857681793, + 474.1591234887042 + ], + "3": [ + 530.219084064053, + 473.94966409587687 + ], + "4": [ + 529.9713402584281, + 473.7927926252329 + ], + "5": [ + 529.3303969609101, + 473.570336829295 + ], + "6": [ + 528.7716424800882, + 472.5985089758267 + ], + "7": [ + 528.5914639908933, + 472.0268717186786 + ], + "8": [ + 527.8804917105366, + 471.55207372624034 + ], + "9": [ + 527.4075111722369, + 471.04445124583805 + ], + "10": [ + 526.6792329286989, + 470.81013299176726 + ], + "11": [ + 526.2004045617715, + 470.458491818242 + ], + "12": [ + 525.4551184575015, + 470.1013633809708 + ], + "13": [ + 524.8790153319486, + 469.8060756876257 + ], + "14": [ + 524.1525622470226, + 469.76809455072276 + ], + "15": [ + 523.8096963572335, + 469.5036953873244 + ], + "16": [ + 523.3038799596918, + 469.4982070379594 + ], + "17": [ + 522.7461435363443, + 469.50030274154517 + ], + "18": [ + 522.17562006899, + 469.3960117210161 + ], + "19": [ + 521.4859533953672, + 469.11429275748606 + ], + "20": [ + 520.4864569282028, + 468.51732418022056 + ], + "21": [ + 519.7849379413818, + 467.77367926241186 + ], + "22": [ + 518.6707567368431, + 466.9392187452801 + ], + "23": [ + 517.6760813951738, + 466.1878646372145 + ], + "24": [ + 516.7382913190811, + 465.11567515845155 + ], + "25": [ + 515.7604650747422, + 464.18746533592065 + ], + "26": [ + 514.5313303541401, + 463.02120337835214 + ], + "27": [ + 512.9936232955174, + 461.82949689701314 + ], + "28": [ + 511.7850046728006, + 460.85714807219983 + ], + "29": [ + 510.49295649599344, + 459.7578654173329 + ], + "30": [ + 509.2951786372752, + 458.6226336185982 + ], + "31": [ + 508.28061161641244, + 457.6213720634277 + ], + "32": [ + 507.03883930065876, + 457.03321567438525 + ], + "33": [ + 505.7775310668184, + 456.5438171787632 + ], + "34": [ + 504.4815550647073, + 456.28012748557325 + ], + "35": [ + 503.5315671759844, + 456.0301614091996 + ], + "36": [ + 502.16510873701674, + 455.9424072760123 + ], + "37": [ + 501.22565715726404, + 455.6817987410751 + ], + "38": [ + 500.0629145496162, + 455.4448594226584 + ], + "39": [ + 499.21082063834524, + 455.16429727111495 + ], + "40": [ + 497.9467468717775, + 455.02328309510835 + ], + "41": [ + 497.0702211747837, + 454.91754681721613 + ], + "42": [ + 496.08541936347814, + 454.93877060613573 + ], + "43": [ + 494.83025605732297, + 454.7105381210494 + ], + "44": [ + 493.5770079125901, + 454.28612884944766 + ], + "45": [ + 492.32805180682135, + 453.6490794844575 + ], + "46": [ + 491.10359710661083, + 453.1438548331015 + ], + "47": [ + 489.98602504320326, + 451.92606342787377 + ], + "48": [ + 488.58448286325296, + 450.6443898978761 + ], + "49": [ + 487.5620242801058, + 449.41114889967537 + ], + "50": [ + 486.3496178345775, + 448.4253221696501 + ], + "51": [ + 485.0915395991696, + 447.2052208912188 + ], + "52": [ + 483.878589353552, + 446.2442784776884 + ], + "53": [ + 482.32935658185374, + 446.27249501771087 + ], + "54": [ + 480.88557379800295, + 446.0355629589287 + ], + "55": [ + 479.46577329174545, + 446.02694885478974 + ], + "56": [ + 477.8755470352215, + 446.0223305563235 + ], + "57": [ + 476.6176345704041, + 446.0197448651874 + ], + "58": [ + 475.24612082107615, + 446.15112920238994 + ], + "59": [ + 473.9064954748311, + 446.22130739786934 + ], + "60": [ + 472.3509836708225, + 446.1293532728193 + ], + "61": [ + 470.9156411669908, + 446.20002730724434 + ], + "62": [ + 469.5193054066985, + 445.6917680654495 + ], + "63": [ + 467.84381504980115, + 445.0360390752064 + ], + "64": [ + 466.3487262992165, + 444.3931620752099 + ], + "65": [ + 464.77210946445894, + 443.5414443555413 + ], + "66": [ + 462.9746935379626, + 442.58125871370265 + ], + "67": [ + 461.2938647688374, + 441.41326073391843 + ], + "68": [ + 459.63322571193055, + 440.49266983702756 + ], + "69": [ + 457.7655534920947, + 439.4314662764563 + ], + "70": [ + 456.07755131752424, + 438.0256136443234 + ], + "71": [ + 453.725664861758, + 436.9761798491169 + ], + "72": [ + 451.6580622824271, + 435.9762142912473 + ], + "73": [ + 449.4785235012257, + 435.1575426685473 + ], + "74": [ + 447.4082128573904, + 434.36775177335 + ], + "75": [ + 445.0586749051566, + 433.59080085422073 + ], + "76": [ + 442.65295669307125, + 432.9326282186534 + ], + "77": [ + 440.44725446121004, + 432.4039529876186 + ], + "78": [ + 438.11860240380867, + 431.58919237808516 + ], + "79": [ + 435.7264857452912, + 430.82134829185696 + ], + "80": [ + 433.340169090518, + 430.06002106901536 + ], + "81": [ + 430.53398041773625, + 429.17289305893706 + ], + "82": [ + 427.7090481878058, + 428.06656071282174 + ], + "83": [ + 425.40267662398355, + 426.9641854682367 + ], + "84": [ + 422.5182008445275, + 425.8505860358808 + ], + "85": [ + 420.0825428684464, + 424.4462877929625 + ], + "86": [ + 417.42828076284445, + 423.1430069322171 + ], + "87": [ + 414.54970761580387, + 421.47925570185896 + ], + "88": [ + 411.3492325782604, + 420.0190395897864 + ], + "89": [ + 408.61792615198505, + 418.30625375336183 + ], + "90": [ + 405.51797197068913, + 416.55405945181195 + ], + "91": [ + 402.82264778879824, + 414.5464971665908 + ], + "92": [ + 398.8068922557439, + 412.4766292070686 + ], + "93": [ + 395.70382645132275, + 410.3623737935808 + ], + "94": [ + 392.47250765611517, + 408.12339947822227 + ], + "95": [ + 389.3843045245399, + 406.0061343005655 + ], + "96": [ + 385.6312903231487, + 404.65124713497335 + ], + "97": [ + 382.0496694128485, + 402.77606119258485 + ], + "98": [ + 378.39429310569227, + 401.1329659239203 + ], + "99": [ + 374.40843743494423, + 399.5829263835591 + ], + "100": [ + 370.42343029489984, + 398.1209723139756 + ], + "101": [ + 366.2344150692428, + 396.7124922285568 + ], + "102": [ + 361.69563971955375, + 395.1471110088826 + ], + "103": [ + 357.4674994750693, + 393.5168763192105 + ], + "104": [ + 353.0573021990487, + 391.51306515937716 + ], + "105": [ + 348.2681298086685, + 389.5859168275093 + ], + "106": [ + 343.50872607859424, + 387.70248329406826 + ], + "107": [ + 338.0795484918839, + 385.2113486863693 + ], + "108": [ + 332.86798785578026, + 382.82364632956296 + ], + "109": [ + 327.31081513831066, + 380.312703419178 + ], + "110": [ + 321.20245910768864, + 377.7912142397787 + ], + "111": [ + 315.2862513746154, + 375.0578027679985 + ], + "112": [ + 309.1869290696538, + 372.55984901773644 + ], + "113": [ + 303.0284726044948, + 369.76249826438607 + ], + "114": [ + 296.44760374275285, + 367.0043816972769 + ], + "115": [ + 289.7451759138377, + 364.2990445780973 + ], + "116": [ + 282.62644809614085, + 361.7078951599764 + ], + "117": [ + 275.36136232139273, + 359.1977092245822 + ], + "118": [ + 267.7098131368736, + 356.35210304250927 + ], + "119": [ + 259.86133586270194, + 353.49979083129773 + ], + "120": [ + 251.74378830178054, + 350.6241591842861 + ], + "121": [ + 243.49235138312363, + 347.50437104409974 + ], + "122": [ + 234.83339121829513, + 344.1076324309318 + ], + "123": [ + 226.22437437588658, + 340.39906349204443 + ], + "124": [ + 217.06327121736237, + 336.4591531399487 + ], + "125": [ + 207.97319702624858, + 332.71444143686256 + ], + "126": [ + 198.16763178490984, + 328.511435857386 + ], + "127": [ + 188.03018679135266, + 325.15225677053144 + ], + "128": [ + 177.8868142744232, + 320.78397563797586 + ] + } + }, + "right_far_signal": { + "emitter_xyz": [ + 8.85874228424147, + 40.75779045404995, + 7.104764052100745 + ], + "housing_anchor_xyz": [ + 8.85874228424147, + 40.94779045404995, + 7.104764052100745 + ], + "median_error_pixels": 1.526466211775741, + "p90_error_pixels": 3.260012789705568, + "observations": { + "1": [ + 696.6114038794435, + 474.7870197078353 + ], + "2": [ + 697.2743251574282, + 474.2548391055962 + ], + "3": [ + 698.3742771758091, + 473.76380876976737 + ], + "4": [ + 699.2751914042923, + 473.5446523064039 + ], + "5": [ + 700.6250958814672, + 472.78462962608154 + ], + "6": [ + 700.8392771284119, + 472.227574203598 + ], + "7": [ + 702.0933445136086, + 471.0208630974202 + ], + "8": [ + 702.894841088713, + 469.86868961655534 + ], + "9": [ + 703.8474118216516, + 468.76067559745854 + ], + "10": [ + 703.6544368556292, + 470.1109761898246 + ], + "11": [ + 704.0589548299523, + 469.70037241903435 + ], + "12": [ + 703.7587982676824, + 470.46613470833375 + ], + "13": [ + 703.561034993854, + 471.0972334823426 + ], + "14": [ + 704.3043772168215, + 471.1352059664128 + ], + "15": [ + 705.2301786061817, + 470.90431219530404 + ], + "16": [ + 706.9819159616712, + 469.744123745171 + ], + "17": [ + 707.4539420382821, + 469.4936586363414 + ], + "18": [ + 707.7494201869096, + 470.0050261074085 + ], + "19": [ + 708.771935499065, + 468.6489559822967 + ], + "20": [ + 708.3158901497764, + 469.24262031467464 + ], + "21": [ + 708.3869746560046, + 469.035976683763 + ], + "22": [ + 707.6259096065401, + 470.20119092206886 + ], + "23": [ + 709.4410794447203, + 467.21767983722714 + ], + "24": [ + 709.0129327503406, + 467.50913858197487 + ], + "25": [ + 708.9809655168734, + 466.80726985490105 + ], + "26": [ + 709.4916002165116, + 465.14151327699017 + ], + "27": [ + 708.3493842006634, + 465.04517727713767 + ], + "28": [ + 708.5346088498272, + 463.01958227910376 + ], + "29": [ + 708.3904499619515, + 462.15856934850405 + ], + "30": [ + 709.202349351871, + 461.0147384342765 + ], + "31": [ + 711.054715825263, + 457.8102578943004 + ], + "32": [ + 710.9209886491392, + 458.16836290787245 + ], + "33": [ + 711.0631672780644, + 457.1560938569029 + ], + "34": [ + 711.7854509081621, + 456.307739237 + ], + "35": [ + 710.4182637041523, + 457.8612535940404 + ], + "36": [ + 710.6208510701682, + 457.4695893067918 + ], + "37": [ + 712.051961368402, + 456.88081973319277 + ], + "38": [ + 712.6912284091536, + 456.2642972566045 + ], + "39": [ + 712.4041165064048, + 457.5740427210542 + ], + "40": [ + 712.7500089258612, + 457.65138216401107 + ], + "41": [ + 713.3890169152669, + 457.8926266651114 + ], + "42": [ + 713.8630208504226, + 457.4365368847405 + ], + "43": [ + 714.4724195682245, + 457.5298925420514 + ], + "44": [ + 714.7348338827144, + 457.40292221872033 + ], + "45": [ + 715.4376772239192, + 456.8044414522113 + ], + "46": [ + 715.6031043080519, + 456.13738866786684 + ], + "47": [ + 716.3656881268463, + 455.08600955593727 + ], + "48": [ + 716.991952010743, + 454.5664957792037 + ], + "49": [ + 717.646381335936, + 454.1673586380901 + ], + "50": [ + 718.3534902807859, + 453.2835220057346 + ], + "51": [ + 719.0969050802481, + 452.4877274057314 + ], + "52": [ + 719.2675689526236, + 451.72994584735784 + ], + "53": [ + 719.8430768332184, + 451.60614994344166 + ], + "54": [ + 720.2779915436101, + 451.5278320108679 + ], + "55": [ + 720.7317148475049, + 451.4911496030879 + ], + "56": [ + 721.2781846829711, + 451.76071047742744 + ], + "57": [ + 721.6898738491989, + 452.14527612032106 + ], + "58": [ + 722.4954051282529, + 452.30323614547575 + ], + "59": [ + 722.9848450808323, + 453.0513253888024 + ], + "60": [ + 723.9151448166137, + 453.2071245964264 + ], + "61": [ + 724.7322890016229, + 453.2988379602866 + ], + "62": [ + 725.3285314601719, + 453.12642889520026 + ], + "63": [ + 725.9275321466084, + 453.0210474858106 + ], + "64": [ + 726.6755508893219, + 452.67445152048106 + ], + "65": [ + 727.6999736830772, + 452.29696014879016 + ], + "66": [ + 728.5762863540634, + 451.4052382867028 + ], + "67": [ + 729.4132878435198, + 450.7637646724363 + ], + "68": [ + 730.152138889176, + 450.12838455629264 + ], + "69": [ + 731.0221762077393, + 449.3811127516026 + ], + "70": [ + 731.8116940433129, + 448.83045666351444 + ], + "71": [ + 732.5619106845392, + 447.99842633191884 + ], + "72": [ + 733.1286558344204, + 447.1828785349978 + ], + "73": [ + 733.8286405734029, + 446.74085975523184 + ], + "74": [ + 734.5451020607171, + 445.75835970300267 + ], + "75": [ + 735.4525141872982, + 445.21365057559063 + ], + "76": [ + 736.133054735223, + 444.78241723907627 + ], + "77": [ + 736.7239249339359, + 444.35918204280426 + ], + "78": [ + 737.6046497843575, + 443.6395852268689 + ], + "79": [ + 738.4379381979555, + 443.18423668604134 + ], + "80": [ + 739.277218715672, + 442.6610789280367 + ], + "81": [ + 739.975941470702, + 441.74584178054624 + ], + "82": [ + 740.8047468952753, + 440.82320154719906 + ], + "83": [ + 741.8349411170525, + 439.8566037444804 + ], + "84": [ + 742.7695157786538, + 438.51469486435104 + ], + "85": [ + 743.7066170366435, + 437.4989589136406 + ], + "86": [ + 744.8104839611929, + 436.2801866048441 + ], + "87": [ + 746.0347745064572, + 435.0584938984965 + ], + "88": [ + 747.2028441739286, + 433.8354240728685 + ], + "89": [ + 748.4028742417985, + 432.3893139000828 + ], + "90": [ + 749.8918018438154, + 431.0897640376876 + ], + "91": [ + 751.197661364478, + 429.5710322354156 + ], + "92": [ + 752.683231169378, + 428.0243277353849 + ], + "93": [ + 754.2065918247346, + 426.78541635443855 + ], + "94": [ + 755.4659316707907, + 425.56788455498815 + ], + "95": [ + 757.0610478539309, + 424.1438429466543 + ], + "96": [ + 758.4809601691386, + 423.4799106212305 + ], + "97": [ + 759.9736566608785, + 422.6928525354665 + ], + "98": [ + 761.5540926454934, + 421.673584206389 + ], + "99": [ + 762.660388382358, + 421.0786745143708 + ], + "100": [ + 764.2304735925098, + 420.3262244155639 + ], + "101": [ + 765.7602340856918, + 419.778498169183 + ], + "102": [ + 767.1296110587597, + 419.12110368085536 + ], + "103": [ + 768.6651422177483, + 418.8094413876304 + ], + "104": [ + 770.788357650283, + 417.93711878979326 + ], + "105": [ + 771.989921736111, + 416.9849249702675 + ], + "106": [ + 773.5257551390818, + 415.96498353664884 + ], + "107": [ + 775.4886422232448, + 414.83599084641094 + ], + "108": [ + 777.269660548192, + 413.6460611332025 + ], + "109": [ + 778.3662108392956, + 412.2132679829246 + ], + "110": [ + 779.8691733598178, + 411.1174853518323 + ], + "111": [ + 781.6120161643012, + 409.52366369158455 + ], + "112": [ + 783.3935176287337, + 408.38499952797525 + ], + "113": [ + 785.1344040427056, + 407.1373252814078 + ], + "114": [ + 787.2579312435365, + 405.95812687596504 + ], + "115": [ + 789.2818919977028, + 405.0785809971002 + ], + "116": [ + 790.7343599668972, + 403.842155430863 + ], + "117": [ + 792.4274916274413, + 402.7655731704221 + ], + "118": [ + 794.2654790236896, + 401.57046321718303 + ], + "119": [ + 796.2230812062309, + 400.253622780149 + ], + "120": [ + 798.3028774507285, + 399.0186442490307 + ], + "121": [ + 800.1960158502851, + 397.31577734473944 + ], + "122": [ + 802.7977141522337, + 395.8810591801129 + ], + "123": [ + 805.2075067705938, + 394.2486364917493 + ], + "124": [ + 807.7271711962715, + 392.57196488797024 + ], + "125": [ + 809.8854777532586, + 390.59742865944946 + ], + "126": [ + 812.9027294777102, + 388.3946356118431 + ], + "127": [ + 814.8142473496994, + 386.57707710314025 + ], + "128": [ + 817.411827949075, + 384.31368288721086 + ] + } + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/signal_response.json b/astra_scene_test/Scene_04/assets/signal_response.json new file mode 100644 index 0000000000000000000000000000000000000000..2ecf340bff8ca23e47c57b1d2512b4605ad15b35 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/signal_response.json @@ -0,0 +1,5 @@ +{ + "note": "Inferred smooth angular LED response, adjusted from three timestamp comparisons. Not a uniquely recovered physical photometric distribution. No frame-dependent emission keys.", + "left_near_signal": {"floor": 8.0, "peak": 115.0, "sharpness": 47.0, "color": [0.002, 0.75, 0.65], "local_glow_watts": 5.0}, + "right_far_signal": {"floor": 28.0, "peak": 1460.0, "sharpness": 54.0, "color": [0.001, 0.75, 0.65], "local_glow_watts": 35.0} +} diff --git a/astra_scene_test/Scene_04/assets/signs_fit.json b/astra_scene_test/Scene_04/assets/signs_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..2c9a533ccdd1e83fa1ab50a0a736ef66b2f028cf --- /dev/null +++ b/astra_scene_test/Scene_04/assets/signs_fit.json @@ -0,0 +1,178 @@ +{ + "park": { + "x": 17.97, + "y": 12.30440409848917, + "z": 10.20496951784451, + "width": 1.8637724437563292, + "height": 2.7423621090751316, + "target_corners": [ + [ + 1056, + 298 + ], + [ + 1118, + 270 + ], + [ + 1130, + 340 + ], + [ + 1067, + 367 + ] + ], + "projected_corners": [ + [ + 1058.0138166606894, + 298.6905590170437 + ], + [ + 1120.12147509248, + 268.97760183205844 + ], + [ + 1128.4737856625475, + 343.05850699690717 + ], + [ + 1064.3776339154674, + 363.97317878054287 + ] + ], + "rms_pixels": 2.1737217425004216 + }, + "park_vertical": { + "x": 15.5, + "y": 13.654836056550943, + "z": 8.902742991524129, + "width": 0.5390861575978192, + "height": 2.8088626084201844, + "target_corners": [ + [ + 981, + 334 + ], + [ + 996, + 330 + ], + [ + 1010, + 394 + ], + [ + 998, + 402 + ] + ], + "projected_corners": [ + [ + 986.8901098531089, + 334.7603957723329 + ], + [ + 1000.2213437928311, + 328.45588259798745 + ], + [ + 1005.8865225935181, + 396.36355414891807 + ], + [ + 992.153877717201, + 400.3769036026191 + ] + ], + "rms_pixels": 3.7880455057634856 + }, + "training": { + "x": -28.25, + "y": 31.04441181217815, + "z": 6.433481838188228, + "width": 6.7329389381709905, + "height": 2.2047989749452777, + "target_corners": [ + [ + 214, + 442 + ], + [ + 294, + 463 + ], + [ + 294, + 492 + ], + [ + 211, + 470 + ] + ], + "projected_corners": [ + [ + 213.44410938271142, + 445.43250293445715 + ], + [ + 295.66293659263334, + 458.7588629069659 + ], + [ + 293.74016371899774, + 483.5976755095154 + ], + [ + 210.4450058255659, + 476.61415242486544 + ] + ], + "rms_pixels": 4.294841313945821 + }, + "hair": { + "x": -27.1, + "y": 36.61507903616481, + "z": 5.503453557874982, + "width": 5.473925911370885, + "height": 1.9969720514675149, + "target_corners": [ + [ + 303, + 466 + ], + [ + 347, + 480 + ], + [ + 348, + 501 + ], + [ + 303, + 488 + ] + ], + "projected_corners": [ + [ + 303.4868841490716, + 469.80669883430386 + ], + [ + 348.58723725128436, + 475.7016714819627 + ], + [ + 347.3070626047482, + 495.3171229544106 + ], + [ + 301.75720881937445, + 492.7273266859726 + ] + ], + "rms_pixels": 3.39835187249128 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/tower_fit.json b/astra_scene_test/Scene_04/assets/tower_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..c53b71f181db9440d0e01eeea897833ad5f7c7af --- /dev/null +++ b/astra_scene_test/Scene_04/assets/tower_fit.json @@ -0,0 +1,35 @@ +{ + "left": [ + -73.8962261694622, + 87.56438052261292, + 95.10580041512942 + ], + "right": [ + -30.345461751623983, + 72.7480551230025, + 95.10580041512942 + ], + "height": 95.10580041512942, + "plane_slope": -0.3402081593208893, + "plane_intercept": 62.42428143674005, + "target_roof_pixels": [ + [ + 307, + 115 + ], + [ + 478, + 85 + ] + ], + "fitted_roof_pixels": [ + [ + 312.3472404939408, + 129.8908610428336 + ], + [ + 473.3578573676606, + 72.07267863253122 + ] + ] +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf.png b/astra_scene_test/Scene_04/assets/wet_glass_psf.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8aa0fea6fc43ba54fbfa5701f802dfff974687 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf.png differ diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf_left.png b/astra_scene_test/Scene_04/assets/wet_glass_psf_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6f31325a3351e3d134a6166481892e3f2fb3d025 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf_left.png differ diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf_lower.png b/astra_scene_test/Scene_04/assets/wet_glass_psf_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..f467e5220d98da0ebcfcbd8529d74f6da8886a24 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf_lower.png differ diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf_opening.png b/astra_scene_test/Scene_04/assets/wet_glass_psf_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..f021eba2c7b848a45eb8da04f215e45bf0e66fd0 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf_opening.png differ diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf_right_lower.png b/astra_scene_test/Scene_04/assets/wet_glass_psf_right_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec12b4e14fb0db1f22ecb7ac1ec6d392ec1a11d Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf_right_lower.png differ diff --git a/astra_scene_test/Scene_04/assets/wet_glass_psf_right_upper.png b/astra_scene_test/Scene_04/assets/wet_glass_psf_right_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..240a1abe778ee33736ce56bcd3ba79c4505aec63 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/wet_glass_psf_right_upper.png differ diff --git a/astra_scene_test/Scene_04/assets/white_suv_landmarks.json b/astra_scene_test/Scene_04/assets/white_suv_landmarks.json new file mode 100644 index 0000000000000000000000000000000000000000..bb11e5c2721476ed70e7dd1e1787b6ea19de0162 --- /dev/null +++ b/astra_scene_test/Scene_04/assets/white_suv_landmarks.json @@ -0,0 +1,151 @@ +{ + "parameters": { + "x": -9.975556758220831, + "y": 24.153402893893198, + "scale_x": 1.3417784327099649, + "scale_y": 0.7223631667696098, + "scale_z": 1.4410294687795644, + "yaw": -0.3538328241534578, + "pitch": 0.009272241405475041, + "z": -0.15096781431132672 + }, + "observations": { + "front_wheel": { + "1": [ + 469, + 554 + ], + "33": [ + 378, + 567 + ], + "65": [ + 132, + 623 + ] + }, + "rear_wheel": { + "1": [ + 488, + 545 + ], + "33": [ + 425, + 555 + ], + "65": [ + 261, + 594 + ] + }, + "roof_front": { + "1": [ + 465, + 516 + ], + "33": [ + 379, + 508 + ], + "65": [ + 172, + 512 + ] + }, + "roof_rear": { + "1": [ + 483, + 518 + ], + "33": [ + 410, + 510 + ], + "65": [ + 241, + 516 + ] + } + }, + "predictions": { + "front_wheel": { + "1": [ + 460.87578499690517, + 553.0760818203138 + ], + "33": [ + 379.3108360352499, + 564.7431737341938 + ], + "65": [ + 132.4492949802186, + 620.7756711590624 + ] + }, + "rear_wheel": { + "1": [ + 485.3016460619449, + 549.1705829456153 + ], + "33": [ + 423.9872659645872, + 557.0281661397516 + ], + "65": [ + 262.014525923232, + 596.9431074576278 + ] + }, + "roof_front": { + "1": [ + 462.7459271307499, + 515.6979733111909 + ], + "33": [ + 385.5366835300524, + 509.7780998951379 + ], + "65": [ + 168.14084065418217, + 514.0867330526124 + ] + }, + "roof_rear": { + "1": [ + 477.28143192434254, + 515.2544652166251 + ], + "33": [ + 411.9233468504648, + 509.09674176874347 + ], + "65": [ + 241.4783625619163, + 513.1224778272925 + ] + } + }, + "cost": 61.328790397131776, + "triangulated": { + "front_wheel": [ + -8.89006399400093, + 22.53808090526565, + 0.45263294676290755 + ], + "rear_wheel": [ + -8.089433587435062, + 24.349948776366407, + 0.6426241609416393 + ], + "roof_front": [ + -9.547532924716826, + 23.59133225707105, + 2.6972381774810623 + ], + "roof_rear": [ + -8.630954604293809, + 24.23893546140849, + 2.5930954008864413 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_left.png b/astra_scene_test/Scene_04/assets/windshield_glare_left.png new file mode 100644 index 0000000000000000000000000000000000000000..62a839a1655194e7d3cc7f4976a5fb15c327d8e3 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_left.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_lower.png b/astra_scene_test/Scene_04/assets/windshield_glare_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..04523705d32663742381ee73f30a4f7179fa7f1d Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_lower.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_opening.png b/astra_scene_test/Scene_04/assets/windshield_glare_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..f5faddf9f46dc21b5ce231c675fc65001a7da685 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_opening.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_right.png b/astra_scene_test/Scene_04/assets/windshield_glare_right.png new file mode 100644 index 0000000000000000000000000000000000000000..343b29371303a382f7ebb325adfd8af03fc03194 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_right.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_right_lower.png b/astra_scene_test/Scene_04/assets/windshield_glare_right_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..90e1065167cad91ce165844b243ce9b95101c1a0 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_right_lower.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_right_upper.png b/astra_scene_test/Scene_04/assets/windshield_glare_right_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..6a108aa9ad130f29e7c302eb8fe5fae5a8e2410c Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_right_upper.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_glare_zones.png b/astra_scene_test/Scene_04/assets/windshield_glare_zones.png new file mode 100644 index 0000000000000000000000000000000000000000..7e17dbca7e7beefcb32b119e890fc0f5db9ae19e Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_glare_zones.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_lower_defocus.png b/astra_scene_test/Scene_04/assets/windshield_lower_defocus.png new file mode 100644 index 0000000000000000000000000000000000000000..661d7d7d933f6ee2e7c75c5f7321836166e4b874 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_lower_defocus.png differ diff --git a/astra_scene_test/Scene_04/assets/windshield_water_height.png b/astra_scene_test/Scene_04/assets/windshield_water_height.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8c7b9de1c600ac5c6cfaf00db81000ac4ac6b9 Binary files /dev/null and b/astra_scene_test/Scene_04/assets/windshield_water_height.png differ diff --git a/astra_scene_test/Scene_04/reference/black_car_contact_trial.json b/astra_scene_test/Scene_04/reference/black_car_contact_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..ddc888da169e18c6d322790b1245c7b6e2df3fce --- /dev/null +++ b/astra_scene_test/Scene_04/reference/black_car_contact_trial.json @@ -0,0 +1,113 @@ +{ + "parameters": { + "x": -15.531964092033139, + "y": 17.950452298140377, + "scale_x": 1.8999999994018648, + "scale_y": 0.7213880898277021, + "scale_z": 1.3220152359897148, + "yaw": -0.7048189360173098 + }, + "tire_contact_z": -0.08725300557532119, + "observations": { + "front_wheel": { + "1": [ + 242, + 583 + ], + "17": [ + 114, + 599 + ] + }, + "rear_wheel": { + "1": [ + 309, + 570 + ], + "17": [ + 217, + 580 + ], + "33": [ + 69, + 602 + ] + }, + "roof_front": { + "1": [ + 245, + 522 + ], + "17": [ + 147, + 522 + ] + }, + "roof_rear": { + "1": [ + 306, + 516 + ], + "17": [ + 206, + 517 + ], + "33": [ + 65, + 521 + ] + } + }, + "predictions": { + "front_wheel": { + "1": [ + 241.32406595288074, + 573.3415605963328 + ], + "17": [ + 111.9287777581768, + 589.8492386989836 + ] + }, + "rear_wheel": { + "1": [ + 310.8717086394684, + 566.8577877138214 + ], + "17": [ + 218.7975145158942, + 579.6674458434625 + ], + "33": [ + 68.84690460873287, + 599.4260148235435 + ] + }, + "roof_front": { + "1": [ + 261.0693610177214, + 521.9140595859122 + ], + "17": [ + 148.59168173831188, + 521.3518846330073 + ] + }, + "roof_rear": { + "1": [ + 300.8313886399866, + 521.2227841679234 + ], + "17": [ + 208.38026205506856, + 520.687831087386 + ], + "33": [ + 55.92605625947192, + 519.859047978329 + ] + } + }, + "cost": 142.21185372392205, + "note": "Static pose, pitch0 and both tire bottoms on z0. Camera fixed; metric shape remains ambiguous." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit.json b/astra_scene_test/Scene_04/reference/camera_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..f7544e4a4fcaede03ca0dfe135161030d904da06 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit.json @@ -0,0 +1,190 @@ +{ + "focal_pixels": 369.5041722813606, + "horizontal_fov_degrees": 120, + "epipole": [ + 640.1042693294204, + 514.8000391855434 + ], + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.07006178239057397, + 0.13724117143684933, + 0.20191503303100267, + 0.2670273389130756, + 0.33083857255726246, + 0.3935919070917752, + 0.45610531288909567, + 0.5155779079699941, + 0.5782822323140315, + 0.6395220998142835, + 0.7042332581935309, + 0.7702508162260968, + 0.8319822466282393, + 0.8933900059366289, + 0.9519801814148795, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.001980510901836688, + 0.0061169630178615365, + 0.0001555391557365775 + ], + [ + -0.0010909770722722892, + 0.011953436783872907, + 0.003506991926534917 + ], + [ + 0.003932905861377334, + 0.01221183478218934, + 0.003933344623087797 + ], + [ + 0.01587412039552616, + 0.008012472864033523, + -0.0013355099666734593 + ], + [ + 0.011481320501435606, + 0.008133995101985913, + -0.004341055849970034 + ], + [ + 0.013923124440554834, + 0.010302859021704695, + -0.002750522808853992 + ], + [ + 0.011135050960559651, + 0.01120404952617484, + -0.0022191217552774254 + ], + [ + 0.0021423337603318224, + 0.014228202497392074, + 0.0009788167626128275 + ], + [ + 0.004860872954617726, + 0.016260153195168443, + 0.002526247178810834 + ], + [ + 0.002594406395370193, + 0.01559145243496378, + -0.001866233451062562 + ], + [ + 0.008723227415838454, + 0.018477391888373367, + -0.005678809614482908 + ], + [ + 0.015338025561376489, + 0.023998422423455904, + -0.003687831921026065 + ], + [ + 0.010835718665576982, + 0.02662285597154286, + -0.002250815760281225 + ], + [ + 0.011811326140716331, + 0.026547929564738414, + -9.304674207834673e-05 + ], + [ + 0.00829740907693274, + 0.02325714350626984, + -0.00032327690597505127 + ], + [ + 0.009362380998476258, + 0.021347752842508137, + -0.0009121756901115025 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2971244600465597, + 2.6004529111987766, + 3.7553202974812248, + 2.680448303979969, + 2.0225718156190013, + 3.476593713476169, + 2.251178543752702, + 3.0706227761051563, + 2.49474559894001, + 1.6827903405576428, + 2.636809607611564, + 2.6989926857949813, + 1.5160806791080441, + 1.7528114567906903, + 1.2939416929711798, + 1.6968221484259578, + 2.088280208367186, + 3.159655023927395, + 2.1015103821369587, + 2.77380874265901, + 3.0396274515384447, + 2.2006341461753314, + 2.112321491024724, + 2.7323989744595267, + 2.311977146860039 + ], + "median_reprojection_error_pixels": 0.9083280111561022, + "p90_reprojection_error_pixels": 2.947230527955634, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_cylindrical_f611_p100.0_cy480.json b/astra_scene_test/Scene_04/reference/camera_fit_cylindrical_f611_p100.0_cy480.json new file mode 100644 index 0000000000000000000000000000000000000000..a45cc21ef1b2fa811e1013a3905060c5420d0d30 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_cylindrical_f611_p100.0_cy480.json @@ -0,0 +1,199 @@ +{ + "projection": "cylindrical", + "focal_pixels": 611.154981, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00000009284939, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "optimizer_success": true, + "optimizer_nfev": 54, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": 0.0, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06448909433199747, + 0.13041677958475553, + 0.19311155377263942, + 0.25672885451843497, + 0.32337212233122015, + 0.3840818924297137, + 0.4486370024770101, + 0.5110345778266316, + 0.572197030689451, + 0.6355474551588773, + 0.6984553600845489, + 0.7620883016482627, + 0.826504790932528, + 0.8907969659211593, + 0.9522084656185318, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + -1.350892057831514e-05, + 0.0022970280041478474, + 0.0016675762728734205 + ], + [ + -0.003658254232070795, + 0.0038947392394224154, + 0.007747766452275231 + ], + [ + -0.0013011501118966973, + 0.0021947511723383046, + 0.008229627681096927 + ], + [ + 0.006153299137093796, + -0.0015995445226267546, + 0.0013853491201155225 + ], + [ + 0.0014697412163254121, + -0.002811628079898395, + -4.049664726999305e-05 + ], + [ + 0.0017565633606380915, + -0.0036684627443785024, + 0.002529845434263831 + ], + [ + -0.001864239108617982, + -0.005295306107256127, + 0.004931730328071736 + ], + [ + -0.01026750344111397, + -0.005862979714342945, + 0.011433854599480466 + ], + [ + -0.010019510169699007, + -0.007231577861717588, + 0.014020528079242565 + ], + [ + -0.013503026014160176, + -0.009418255481908928, + 0.01092780981772223 + ], + [ + -0.01112679374987417, + -0.009792318470681599, + 0.0075703804733615555 + ], + [ + -0.00865659255569807, + -0.009795544179513638, + 0.010559653230084634 + ], + [ + -0.01459979977649427, + -0.011398793670874931, + 0.014851673328906282 + ], + [ + -0.016423545918040777, + -0.015697103250689175, + 0.017472184212502115 + ], + [ + -0.021016601994064212, + -0.021769667970273465, + 0.018609783794941208 + ], + [ + -0.021152940013124046, + -0.026201739165286245, + 0.019464174027082726 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.134855311250984, + 4.980063243547933, + 2.609855068006607, + 2.3970376186642106, + 1.935137910895655, + 2.5812024577132338, + 2.127788931939582, + 7.266096715051088, + 3.341645396033797, + 1.6146354897681678, + 2.4650271676666478, + 2.51788771087051, + 1.6070658680187797, + 1.6934168449554623, + 1.192640407288022, + 1.7444303184126777, + 2.216001645820318, + 2.416168623923266, + 1.9945485553270998, + 3.779563731852287, + 2.4670064750180973, + 2.076979697633324, + 1.9987687023389744, + 2.4155116599812576, + 2.17109973282479 + ], + "median_reprojection_error_pixels": 1.474724697412943, + "p90_reprojection_error_pixels": 6.335623299440346, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p0.03_cy480.json b/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p0.03_cy480.json new file mode 100644 index 0000000000000000000000000000000000000000..49d55401be3783e94878c873104241783ac71304 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p0.03_cy480.json @@ -0,0 +1,199 @@ +{ + "projection": "equirectangular", + "focal_pixels": 611.154981, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00000009284939, + "epipole": [ + 649.4367382839207, + 513.6423446351457 + ], + "optimizer_success": true, + "optimizer_nfev": 76, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": 0.0, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06391180852769861, + 0.12789197887907056, + 0.18954879192895213, + 0.2531274632844839, + 0.31702441945264903, + 0.3780143775936003, + 0.4387359954825423, + 0.49839542970533557, + 0.560331197357472, + 0.6229034164776623, + 0.6864317761193798, + 0.750847948390046, + 0.815290242176217, + 0.8799203224485879, + 0.944833153838353, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0013374796246577527, + 0.004452895334082045, + 0.002760667335183162 + ], + [ + -0.0010647548360292142, + 0.008340583160959382, + 0.008941550477996864 + ], + [ + 0.002637445148300528, + 0.008967796736483291, + 0.010389992877499686 + ], + [ + 0.011612631762323536, + 0.007673841312417227, + 0.005125349176807173 + ], + [ + 0.008407772664701038, + 0.009214127129507955, + 0.003456773514982663 + ], + [ + 0.010243058686913957, + 0.011065536195542094, + 0.007070046679558278 + ], + [ + 0.008287011000277613, + 0.012589873292411463, + 0.009349714594692088 + ], + [ + 0.0014424858699127246, + 0.015239846114754827, + 0.015173247650425489 + ], + [ + 0.003431757816839499, + 0.0173165080829292, + 0.018963471912999096 + ], + [ + 0.001724027683738884, + 0.01889302094472775, + 0.01610218937510642 + ], + [ + 0.006547666724693105, + 0.022645343180123016, + 0.014938125238885398 + ], + [ + 0.011885292637138372, + 0.027247550490681983, + 0.020553115094875493 + ], + [ + 0.008586517042006714, + 0.03067174420160038, + 0.026171419123893865 + ], + [ + 0.010245161914379632, + 0.03199600239350801, + 0.03329956241252277 + ], + [ + 0.00891722360520089, + 0.0317564518278113, + 0.039491392104056174 + ], + [ + 0.011259467677140813, + 0.032247083541883104, + 0.04514825161840656 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.3542995141534293, + 2.4372367987978167, + 4.825678536431219, + 2.7282710510850112, + 1.9407166359910673, + 5.078702826698262, + 2.2659128137686713, + 2.76801620146883, + 2.3761963381990228, + 1.6457565281783677, + 2.212026439563776, + 2.22312213631801, + 1.4583600577507985, + 1.724775412513709, + 1.2382913288500457, + 1.6337225456754338, + 2.050169260619565, + 3.754524726965522, + 2.027640762450462, + 2.5961180335026706, + 2.350734024870892, + 2.1579407947167675, + 2.0404947880870767, + 2.9689643482018124, + 2.301105886378358 + ], + "median_reprojection_error_pixels": 1.3673953314585612, + "p90_reprojection_error_pixels": 6.024593461728612, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p100.0_cy480.json b/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p100.0_cy480.json new file mode 100644 index 0000000000000000000000000000000000000000..cf736fb27c2a1ce00c473af3930f295a9fd5a4af --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_equirectangular_f611_p100.0_cy480.json @@ -0,0 +1,199 @@ +{ + "projection": "equirectangular", + "focal_pixels": 611.154981, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00000009284939, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "optimizer_success": true, + "optimizer_nfev": 37, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": 0.0, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06478329840275224, + 0.13030460771256971, + 0.1928160585867095, + 0.25649607971865745, + 0.3208782361895841, + 0.38193989936853945, + 0.4458720254214668, + 0.5070797892193929, + 0.5685466684894943, + 0.6306952168988338, + 0.6944011294827074, + 0.7597653186981028, + 0.8239118560867335, + 0.8905716900244716, + 0.9524832124671277, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + -2.3044617068495464e-06, + 0.0023271872845185356, + 0.002740664918111743 + ], + [ + -0.003645662313957169, + 0.003951156431908267, + 0.009380954031506718 + ], + [ + -0.0011903730594945243, + 0.0023142081480227875, + 0.011209281476797861 + ], + [ + 0.0064605110956862995, + -0.0013785456497193377, + 0.006326355498606624 + ], + [ + 0.001778321179978206, + -0.0024628280993574335, + 0.004899620949429439 + ], + [ + 0.002192932844232191, + -0.00330552313475627, + 0.008511802101034976 + ], + [ + -0.0013948321981395652, + -0.004862772567339182, + 0.01151471393047822 + ], + [ + -0.009848632712043854, + -0.0053718127142077035, + 0.017840214396753765 + ], + [ + -0.009390132506929938, + -0.006702905988333214, + 0.021978056678855034 + ], + [ + -0.012788908389997126, + -0.00875184846967887, + 0.019830081601858344 + ], + [ + -0.010027294280399059, + -0.009166084479583374, + 0.01831755016974793 + ], + [ + -0.006954686342904779, + -0.009387342626003195, + 0.023037961013288453 + ], + [ + -0.012619600996147574, + -0.011099669967715171, + 0.027678514819469844 + ], + [ + -0.01391366944851682, + -0.015705323937044217, + 0.03127042340700371 + ], + [ + -0.017965338646340978, + -0.0214816152041671, + 0.033962878900011845 + ], + [ + -0.018244026446911452, + -0.02578994626415358, + 0.037677644201401995 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.1176772014576772, + 5.418824282694666, + 2.640156481016188, + 2.418626906983489, + 1.9266075747142444, + 2.5605269201041034, + 2.1134015169604723, + 7.689772744501393, + 3.435099666871854, + 1.6159810125302043, + 2.235333556334498, + 2.2346192376003247, + 1.6064623934271767, + 1.696374884603853, + 1.1897504379385166, + 1.7643095246039386, + 2.235662237999692, + 2.384060906958486, + 1.9830347746839965, + 3.9210032095753684, + 2.492816601333477, + 2.068184020641097, + 1.9836157868671265, + 2.405076345628285, + 2.156876168419635 + ], + "median_reprojection_error_pixels": 1.5916179635125387, + "p90_reprojection_error_pixels": 9.292199081001192, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0.json b/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0.json new file mode 100644 index 0000000000000000000000000000000000000000..dd30ca6038631e68092bbe3ac8b19ee4302c6bde --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0.json @@ -0,0 +1,190 @@ +{ + "focal_pixels": 369.5, + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06962764265628649, + 0.13655150628251467, + 0.20105653749790645, + 0.26575977774149045, + 0.32915197764675214, + 0.3914186270147573, + 0.4542039484237803, + 0.5140969431959234, + 0.576054169594121, + 0.6366744971456203, + 0.7008736322420772, + 0.7666483238611931, + 0.8283429506533235, + 0.8899558858757264, + 0.9496112793717701, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.000343750328709264, + 0.003935068668348956, + 0.0008579555815715451 + ], + [ + -0.0043643170085231955, + 0.007546850031612208, + 0.004978527179798893 + ], + [ + -0.00104082114621088, + 0.0055209475170620815, + 0.006190694422352187 + ], + [ + 0.009042199848436938, + -0.0011481183002156289, + 0.0015498174786575337 + ], + [ + 0.0027052064262942954, + -0.003553392256393048, + -0.000665100206404807 + ], + [ + 0.0031421628795200306, + -0.00403923099637305, + 0.0017334094449435056 + ], + [ + -0.001801978862095022, + -0.005962554623369442, + 0.003253753778014675 + ], + [ + -0.013060676548532288, + -0.005691041629673833, + 0.00776489401665886 + ], + [ + -0.012698014452461605, + -0.0068483546034495005, + 0.010318630285755427 + ], + [ + -0.017575449584673226, + -0.010819622319586853, + 0.006905977442521772 + ], + [ + -0.014449752555135954, + -0.011876911617835332, + 0.003886400069966915 + ], + [ + -0.010983804127672808, + -0.010722693050716704, + 0.00700719590412606 + ], + [ + -0.01868938552334487, + -0.012161725568134907, + 0.010264551373760318 + ], + [ + -0.02127921029635932, + -0.017076236116790083, + 0.013420230030492057 + ], + [ + -0.028929590150316587, + -0.025447713855844753, + 0.013978762548487234 + ], + [ + -0.03199525813597809, + -0.03179505975866488, + 0.01382128174418264 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2175595890366937, + 4.282959992466799, + 2.747295391571148, + 2.494875097228703, + 2.018235940329869, + 2.7257430285991546, + 2.209224123967423, + 6.277892157820448, + 3.224979879918974, + 1.6766036085001206, + 2.68076332974861, + 2.730754458957668, + 1.6444616016376992, + 1.7400607960845846, + 1.255996560654726, + 1.7963367653670674, + 2.2256487641925706, + 2.547420656965834, + 2.0791665664561867, + 3.7332744397891817, + 3.189711194948683, + 2.160554085277853, + 2.077210412986014, + 2.5206329476895384, + 2.2583225634752004 + ], + "median_reprojection_error_pixels": 1.289244890454553, + "p90_reprojection_error_pixels": 5.39878976016502, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0_cy480.json b/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0_cy480.json new file mode 100644 index 0000000000000000000000000000000000000000..7291da8977890f11e930e6741c1416a51122ed12 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_f370_p100.0_cy480.json @@ -0,0 +1,198 @@ +{ + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "optimizer_success": true, + "optimizer_nfev": 58, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": 0.29999999999999993, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.07069726504424696, + 0.14405919533467962, + 0.20505379071145427, + 0.2515667367272918, + 0.32406159025030434, + 0.3851513948094464, + 0.4528987675862592, + 0.524176279576674, + 0.5837789164115477, + 0.6470646867920771, + 0.7079895402728676, + 0.7717253702791266, + 0.8362631609250158, + 0.9005764158298869, + 0.9600390778238594, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.00020609906396746553, + 0.003222502159291887, + 0.0011718030658345424 + ], + [ + -0.004705533851790109, + 0.005028475870144635, + 0.006484550100052919 + ], + [ + -0.001615294918704906, + 0.003025605787954558, + 0.007884740522270367 + ], + [ + 0.009001283031365737, + -0.0004476382053509587, + -0.0014881702974584297 + ], + [ + 0.002255362362020733, + -0.002748163473909014, + -0.0013664171229869782 + ], + [ + 0.0024742014151010266, + -0.0036539880443025342, + 0.0006285521492655154 + ], + [ + -0.0027255370059072275, + -0.0062427817673776234, + 0.004247668788484412 + ], + [ + -0.013915460451191866, + -0.0081723906081978, + 0.01232788623078345 + ], + [ + -0.013509968183776283, + -0.009647781261264402, + 0.01505663052317289 + ], + [ + -0.018140755455666676, + -0.012660781915393257, + 0.011908698371474213 + ], + [ + -0.015151380823796391, + -0.012403198203550247, + 0.007799582299371315 + ], + [ + -0.012379596380027159, + -0.012151241146618107, + 0.007925055465094378 + ], + [ + -0.019122831974060308, + -0.014368764150545946, + 0.014209198086209343 + ], + [ + -0.02224233123762566, + -0.019778616066054817, + 0.01489604692593693 + ], + [ + -0.02831218755753279, + -0.026976437294283197, + 0.015026910864810204 + ], + [ + -0.028900699246245002, + -0.03088292584698631, + 0.01584696004206849 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2720349716885835, + 4.010915095588875, + 2.80618249631085, + 2.5370806379108903, + 2.1332605270501204, + 2.781538840143969, + 2.272837060401338, + 5.718169592313721, + 3.195520286245081, + 1.782116992139487, + 3.3631701070506193, + 3.4664533609847314, + 1.6979034699637894, + 1.8175086541792864, + 1.3613870660195504, + 1.8962724334634593, + 2.274346109989175, + 2.5999239614636025, + 2.191332398728378, + 3.7885541808973975, + 4.417918429345469, + 2.25329776183143, + 2.170157836932337, + 2.582280847381822, + 2.34052477767493 + ], + "median_reprojection_error_pixels": 1.6275975520650472, + "p90_reprojection_error_pixels": 5.47989179179455, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_f370_p5.0.json b/astra_scene_test/Scene_04/reference/camera_fit_f370_p5.0.json new file mode 100644 index 0000000000000000000000000000000000000000..17e293a25c013778f810bc52225a92009eca61d2 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_f370_p5.0.json @@ -0,0 +1,190 @@ +{ + "focal_pixels": 369.5, + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 636.5404903622749, + 515.7843453429374 + ], + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.07019915966550773, + 0.13746887097951688, + 0.2022613992396395, + 0.267527462045243, + 0.33139503864333286, + 0.3942002659119282, + 0.4568296091607401, + 0.516293803363877, + 0.5789330485685902, + 0.6400294072101181, + 0.7046223611860553, + 0.7705557232125081, + 0.8319229970092035, + 0.8933761862202259, + 0.9523944227077171, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0019059270503517624, + 0.005812887214396728, + 0.0002452113251346533 + ], + [ + -0.0012415560202318422, + 0.011335860696906843, + 0.0036781770913165497 + ], + [ + 0.0037026425002792966, + 0.011274369102032913, + 0.004190715503588221 + ], + [ + 0.015556208805829077, + 0.0067321620303064, + -0.0009893525248467257 + ], + [ + 0.011064440987628297, + 0.006493276094330061, + -0.003914961948790108 + ], + [ + 0.013409448089909983, + 0.008282498667212335, + -0.00224396024910795 + ], + [ + 0.010505601902356807, + 0.008781952422823815, + -0.0016232875295092983 + ], + [ + 0.0013874211880624873, + 0.011401783028628916, + 0.00169295209568871 + ], + [ + 0.003983678939154361, + 0.012967870057703867, + 0.0033231405381692167 + ], + [ + 0.0015862379910393954, + 0.011824353753698908, + -0.0009935475970966423 + ], + [ + 0.007582482310770166, + 0.014129318371044175, + -0.004803140195781484 + ], + [ + 0.01405728900632604, + 0.018970408251783755, + -0.002903037569432428 + ], + [ + 0.009368371749226286, + 0.020993768306835227, + -0.001379957071859538 + ], + [ + 0.010251174941177277, + 0.020152339563674536, + 0.0006095012143257522 + ], + [ + 0.006601721559352394, + 0.01622197578489258, + 0.00041453928578887364 + ], + [ + 0.007526099403361045, + 0.01394711549906351, + 0.0003181065721994922 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2838541850329497, + 2.659601571835736, + 3.5081547287090737, + 2.6494468666845785, + 2.021338783444806, + 3.298091447576669, + 2.243497473765977, + 3.190221003679338, + 2.5351217092457774, + 1.6811020622621053, + 2.653036411651938, + 2.7153521605419555, + 1.5308134321888278, + 1.7499568632836198, + 1.2904029376955855, + 1.6960741074387682, + 2.0952908075766987, + 3.0554823578590646, + 2.0975579862953433, + 2.8326165242507435, + 3.0799241135806983, + 2.1939028135472354, + 2.107513048705329, + 2.68844797979481, + 2.3018432825793473 + ], + "median_reprojection_error_pixels": 0.9795913667339933, + "p90_reprojection_error_pixels": 2.9085380045791562, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480.json b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480.json new file mode 100644 index 0000000000000000000000000000000000000000..7887908a51e8893adea0e14b1118b08e99d0bc3f --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480.json @@ -0,0 +1,199 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 639.6776337080299, + 513.9906205242038 + ], + "optimizer_success": true, + "optimizer_nfev": 116, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -0.04273840798292971, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06662809424464981, + 0.1346959922131431, + 0.19536786912083784, + 0.25375973454233436, + 0.3213701617983418, + 0.38321710527580677, + 0.44671797192788926, + 0.5093387935536575, + 0.5718000241238298, + 0.6348477141751818, + 0.6985951469786177, + 0.7632741411860535, + 0.8269109543222969, + 0.8890418531892739, + 0.9494132024708847, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0022186467498330822, + 0.005988365686321537, + 0.0012650252604316252 + ], + [ + -0.0013229141738296877, + 0.010848555681235827, + 0.0061534743523141 + ], + [ + 0.004335471698145356, + 0.010758576660172629, + 0.0064448385573864465 + ], + [ + 0.01806381527831792, + 0.007762696357885902, + -0.0014489780160114665 + ], + [ + 0.013032350034775486, + 0.008598067251883385, + -0.0038436605941292454 + ], + [ + 0.015773502643307746, + 0.010197855621933294, + -0.0018196555508884654 + ], + [ + 0.012640033950764162, + 0.010764895849187795, + -0.000646463134286814 + ], + [ + 0.0027801608588143567, + 0.012728798005763755, + 0.004703580413032486 + ], + [ + 0.0057613702493516964, + 0.014079848553209994, + 0.006539763370895382 + ], + [ + 0.0034002701943823843, + 0.014285463959386072, + 0.001784919137315361 + ], + [ + 0.010319464998343018, + 0.0179642772636026, + -0.0019203699512114869 + ], + [ + 0.01778309503075021, + 0.022698010548954102, + 0.0012403197403231916 + ], + [ + 0.013279426291056903, + 0.02454603596626473, + 0.0035541235686658928 + ], + [ + 0.01460813927313922, + 0.02359281743117832, + 0.0055822829438812805 + ], + [ + 0.01153174614119566, + 0.019593367318522965, + 0.004288003227049923 + ], + [ + 0.014058117427372103, + 0.017362258645149734, + 0.0025730605812523295 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.235401818352547, + 2.6857385504961586, + 3.6151733319603405, + 2.660453066191109, + 1.9813483797346385, + 3.25334907263098, + 2.197505990052404, + 3.1929078305852205, + 2.5544595560565972, + 1.671713901201528, + 2.459376530820359, + 2.49591073355484, + 1.5068318939206307, + 1.7496740445909384, + 1.266788758430158, + 1.67705783848278, + 2.1081956905291355, + 2.9983707194949005, + 2.0561424245479216, + 2.8333839992190386, + 2.540546669289442, + 2.152811829052301, + 2.059042213214702, + 2.650978625815986, + 2.257303087660516 + ], + "median_reprojection_error_pixels": 0.8695204117666346, + "p90_reprojection_error_pixels": 2.6782708890124423, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480_nodist.json b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480_nodist.json new file mode 100644 index 0000000000000000000000000000000000000000..0391f3d56631f7ad1c32781f16f5646b61041442 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f370_p0.03_cy480_nodist.json @@ -0,0 +1,199 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 640.1707869459426, + 514.7179664031315 + ], + "optimizer_success": true, + "optimizer_nfev": 80, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06818098806171356, + 0.13756848658320978, + 0.19887779004285744, + 0.25710216938241126, + 0.32595859862392734, + 0.38831783381560425, + 0.45241538388437325, + 0.5153858724278887, + 0.5783015694155771, + 0.6416748670059164, + 0.705664010997911, + 0.7704617097985091, + 0.8336938907909718, + 0.8947980522821005, + 0.9527437058038144, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.00224774362252664, + 0.005924292116590759, + 0.001036639327532078 + ], + [ + -0.0011910404166182208, + 0.010684564529596154, + 0.0055015986704040456 + ], + [ + 0.004378268063234446, + 0.010671183472230263, + 0.0058501298063352095 + ], + [ + 0.01763652280787367, + 0.008012416918407749, + -0.0014764642394765961 + ], + [ + 0.012672512318890548, + 0.008782486433992596, + -0.003629059321305456 + ], + [ + 0.0152720514738302, + 0.010479784293087971, + -0.0016160593426945268 + ], + [ + 0.012234677607333646, + 0.010968443417469399, + -0.0004865450450693065 + ], + [ + 0.002863457859054484, + 0.012750584445496068, + 0.0034520818165749713 + ], + [ + 0.005693100730550619, + 0.014236922755496246, + 0.005583381445346449 + ], + [ + 0.0032532869847308288, + 0.014568374829030799, + 0.000763004216584281 + ], + [ + 0.009724637560048151, + 0.018447415714245713, + -0.002456395269454268 + ], + [ + 0.01657872518228831, + 0.023394415244521433, + 0.0009939050380583082 + ], + [ + 0.012199589517405858, + 0.02533129144158546, + 0.002858604114990466 + ], + [ + 0.01297107627292627, + 0.024838152587685007, + 0.005258001294290399 + ], + [ + 0.009737385776637825, + 0.021337103777977807, + 0.004343760768897358 + ], + [ + 0.011789093761427921, + 0.020360958760674838, + 0.002602562131042079 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2659399244805773, + 2.6948534930745938, + 3.652966722764379, + 2.68590390287027, + 2.018685034835302, + 3.3343229630915614, + 2.229130638539127, + 3.1888415072387786, + 2.569831635740863, + 1.700245339440428, + 2.6668575747314827, + 2.7319867441904115, + 1.523781585706796, + 1.7729100288731323, + 1.2970368078554588, + 1.7051438641295515, + 2.1266169413023075, + 3.0725443851634133, + 2.0936647017552112, + 2.8429376368547863, + 3.084397710654423, + 2.1887027902769978, + 2.0950281835696836, + 2.6968436912447915, + 2.2944323232075217 + ], + "median_reprojection_error_pixels": 0.9941164845058215, + "p90_reprojection_error_pixels": 2.901010989230633, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_perspective_f650_p0.0_cy480_nodist.json b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f650_p0.0_cy480_nodist.json new file mode 100644 index 0000000000000000000000000000000000000000..1aa8edb12cd2166571ef9547461a153010091574 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_perspective_f650_p0.0_cy480_nodist.json @@ -0,0 +1,199 @@ +{ + "projection": "perspective", + "focal_pixels": 650.0, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 89.11171113377615, + "epipole": [ + 639.8323821846435, + 514.669586321549 + ], + "optimizer_success": true, + "optimizer_nfev": 55, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06701958338484801, + 0.13469642947489233, + 0.19769220946237814, + 0.260657068016453, + 0.3276700958294912, + 0.3902055080566638, + 0.45328512732966164, + 0.5153847085121649, + 0.5782628109291402, + 0.6416584044712467, + 0.7053615590605775, + 0.769655477195789, + 0.8327946814996952, + 0.8940423416872182, + 0.9526329060602159, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0012340511544570044, + 0.0034511227246324183, + 0.00120202283776032 + ], + [ + -0.0009729542148815825, + 0.006342242063079393, + 0.006443620023739859 + ], + [ + 0.00238071539416358, + 0.006178844947546969, + 0.0062966370022444415 + ], + [ + 0.010476525590621674, + 0.004142805509960551, + -0.0015279368554555603 + ], + [ + 0.007514644174757227, + 0.004690176326047511, + -0.0036906793141983727 + ], + [ + 0.00915078357307234, + 0.0055033665396300785, + -0.001774259896241233 + ], + [ + 0.007333844453320958, + 0.00588497906967851, + -0.0006681122594608837 + ], + [ + 0.0012052026212279964, + 0.007271521903676919, + 0.004646037586700862 + ], + [ + 0.0029726737620358367, + 0.007993669509918512, + 0.006438712573541585 + ], + [ + 0.0013409246361203626, + 0.008186915899720341, + 0.0021343185192213526 + ], + [ + 0.005495960951185192, + 0.010236048699031892, + -0.0018840108414187595 + ], + [ + 0.00999427024175968, + 0.012917154448424952, + 0.0007562270733792243 + ], + [ + 0.006769834139492305, + 0.014287578169499422, + 0.003688442838976174 + ], + [ + 0.007458143422264729, + 0.013765028611409618, + 0.005815748897722298 + ], + [ + 0.005383093802379584, + 0.011473255132432822, + 0.00522747039811473 + ], + [ + 0.00707400414960027, + 0.01021961237121139, + 0.0032875171445000025 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2517331547295036, + 2.733897110507583, + 3.60139401210052, + 2.664630759211578, + 1.9979749321976663, + 3.286684474933288, + 2.212786742282675, + 3.2476136625508434, + 2.605833617967712, + 1.7176075550596068, + 2.6812625006560182, + 2.7429545429207574, + 1.5169316321039097, + 1.7893953298145746, + 1.3025787995710383, + 1.7128799855087196, + 2.1497772245147773, + 3.039342105460531, + 2.0734203111835705, + 2.8906094515611986, + 3.146157584084847, + 2.1677645795012666, + 2.0803043870591393, + 2.6654950906131196, + 2.2732306471381905 + ], + "median_reprojection_error_pixels": 0.9082215143012065, + "p90_reprojection_error_pixels": 2.6871043055663826, + "limitation": "89.1117-degree horizontal pinhole trial. Exact intrinsics remain ambiguous under near-forward motion; this small residual improvement does not establish a unique physical focal length." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_perspective_selected.json b/astra_scene_test/Scene_04/reference/camera_fit_perspective_selected.json new file mode 100644 index 0000000000000000000000000000000000000000..28f9ba49c4359ae1a7bd8ea39ac7a902aeff03fe --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_perspective_selected.json @@ -0,0 +1,197 @@ +{ + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "optimizer_success": true, + "optimizer_nfev": 30, + "optimizer_message": "`ftol` termination condition is satisfied.", + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06806794570387358, + 0.13838570865471742, + 0.1998086135376515, + 0.25268692838978535, + 0.3220003628774281, + 0.38265566215065144, + 0.4491100974786929, + 0.5179445999400273, + 0.5781911919236278, + 0.6415275466558922, + 0.7028424397275321, + 0.7662728877472237, + 0.8321484381272545, + 0.8949910759345721, + 0.9568387349356784, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 7.970778437958559e-05, + 0.0034029959711659795, + 0.0013843562742515557 + ], + [ + -0.005389587941039592, + 0.005467733629187528, + 0.006767489531028712 + ], + [ + -0.0019398351802378897, + 0.0029452354005250745, + 0.007754700813419292 + ], + [ + 0.009539690354054348, + -0.001855864519185092, + -0.00031756770471071273 + ], + [ + 0.0021870103200265062, + -0.004159843712941438, + -0.0013727490842938353 + ], + [ + 0.002440803338705285, + -0.005401805115803234, + 0.0008946688709505327 + ], + [ + -0.0033005651309537744, + -0.008247401753660788, + 0.003229309626757449 + ], + [ + -0.01601563011740977, + -0.010138200833504632, + 0.009632697093985277 + ], + [ + -0.01576587458854561, + -0.012111751344382608, + 0.01208851662443387 + ], + [ + -0.021154925139067585, + -0.015620060687691737, + 0.008432119421170826 + ], + [ + -0.017931212774870118, + -0.015780668154091897, + 0.004713672703641766 + ], + [ + -0.014762589539688549, + -0.015571389001831014, + 0.007020628376569298 + ], + [ + -0.02316250789974209, + -0.01847041833849067, + 0.011539355180662372 + ], + [ + -0.026715516358495523, + -0.024744914053527033, + 0.013452664119122586 + ], + [ + -0.03480870514098197, + -0.033931358575548326, + 0.012866470785062641 + ], + [ + -0.03574936893871316, + -0.03920810370805046, + 0.011717812727139709 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.1730617860200803, + 4.800102981583717, + 2.645808139917365, + 2.419783282562076, + 1.9855527863237858, + 2.6321238269999734, + 2.1659667980960653, + 7.101550174591025, + 3.377438780063602, + 1.69010236088028, + 2.638735019280352, + 2.68341792655301, + 1.626795891065523, + 1.754038401748671, + 1.2552626137950078, + 1.7862325143638011, + 2.268001218268813, + 2.469088774854978, + 2.046125826377901, + 3.8501834009050846, + 3.1442549339630395, + 2.1206605824103058, + 2.045076100442462, + 2.455453515842036, + 2.2144591227827917 + ], + "median_reprojection_error_pixels": 1.4285301752976989, + "p90_reprojection_error_pixels": 5.533630663440333, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_radial_rejected.json b/astra_scene_test/Scene_04/reference/camera_fit_radial_rejected.json new file mode 100644 index 0000000000000000000000000000000000000000..7291da8977890f11e930e6741c1416a51122ed12 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_radial_rejected.json @@ -0,0 +1,198 @@ +{ + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 615.0000009999999, + 536.9999990000001 + ], + "optimizer_success": true, + "optimizer_nfev": 58, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": 0.29999999999999993, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.07069726504424696, + 0.14405919533467962, + 0.20505379071145427, + 0.2515667367272918, + 0.32406159025030434, + 0.3851513948094464, + 0.4528987675862592, + 0.524176279576674, + 0.5837789164115477, + 0.6470646867920771, + 0.7079895402728676, + 0.7717253702791266, + 0.8362631609250158, + 0.9005764158298869, + 0.9600390778238594, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.00020609906396746553, + 0.003222502159291887, + 0.0011718030658345424 + ], + [ + -0.004705533851790109, + 0.005028475870144635, + 0.006484550100052919 + ], + [ + -0.001615294918704906, + 0.003025605787954558, + 0.007884740522270367 + ], + [ + 0.009001283031365737, + -0.0004476382053509587, + -0.0014881702974584297 + ], + [ + 0.002255362362020733, + -0.002748163473909014, + -0.0013664171229869782 + ], + [ + 0.0024742014151010266, + -0.0036539880443025342, + 0.0006285521492655154 + ], + [ + -0.0027255370059072275, + -0.0062427817673776234, + 0.004247668788484412 + ], + [ + -0.013915460451191866, + -0.0081723906081978, + 0.01232788623078345 + ], + [ + -0.013509968183776283, + -0.009647781261264402, + 0.01505663052317289 + ], + [ + -0.018140755455666676, + -0.012660781915393257, + 0.011908698371474213 + ], + [ + -0.015151380823796391, + -0.012403198203550247, + 0.007799582299371315 + ], + [ + -0.012379596380027159, + -0.012151241146618107, + 0.007925055465094378 + ], + [ + -0.019122831974060308, + -0.014368764150545946, + 0.014209198086209343 + ], + [ + -0.02224233123762566, + -0.019778616066054817, + 0.01489604692593693 + ], + [ + -0.02831218755753279, + -0.026976437294283197, + 0.015026910864810204 + ], + [ + -0.028900699246245002, + -0.03088292584698631, + 0.01584696004206849 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2720349716885835, + 4.010915095588875, + 2.80618249631085, + 2.5370806379108903, + 2.1332605270501204, + 2.781538840143969, + 2.272837060401338, + 5.718169592313721, + 3.195520286245081, + 1.782116992139487, + 3.3631701070506193, + 3.4664533609847314, + 1.6979034699637894, + 1.8175086541792864, + 1.3613870660195504, + 1.8962724334634593, + 2.274346109989175, + 2.5999239614636025, + 2.191332398728378, + 3.7885541808973975, + 4.417918429345469, + 2.25329776183143, + 2.170157836932337, + 2.582280847381822, + 2.34052477767493 + ], + "median_reprojection_error_pixels": 1.6275975520650472, + "p90_reprojection_error_pixels": 5.47989179179455, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_fit_selected.json b/astra_scene_test/Scene_04/reference/camera_fit_selected.json new file mode 100644 index 0000000000000000000000000000000000000000..0391f3d56631f7ad1c32781f16f5646b61041442 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_fit_selected.json @@ -0,0 +1,199 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 640.1707869459426, + 514.7179664031315 + ], + "optimizer_success": true, + "optimizer_nfev": 80, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06818098806171356, + 0.13756848658320978, + 0.19887779004285744, + 0.25710216938241126, + 0.32595859862392734, + 0.38831783381560425, + 0.45241538388437325, + 0.5153858724278887, + 0.5783015694155771, + 0.6416748670059164, + 0.705664010997911, + 0.7704617097985091, + 0.8336938907909718, + 0.8947980522821005, + 0.9527437058038144, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.00224774362252664, + 0.005924292116590759, + 0.001036639327532078 + ], + [ + -0.0011910404166182208, + 0.010684564529596154, + 0.0055015986704040456 + ], + [ + 0.004378268063234446, + 0.010671183472230263, + 0.0058501298063352095 + ], + [ + 0.01763652280787367, + 0.008012416918407749, + -0.0014764642394765961 + ], + [ + 0.012672512318890548, + 0.008782486433992596, + -0.003629059321305456 + ], + [ + 0.0152720514738302, + 0.010479784293087971, + -0.0016160593426945268 + ], + [ + 0.012234677607333646, + 0.010968443417469399, + -0.0004865450450693065 + ], + [ + 0.002863457859054484, + 0.012750584445496068, + 0.0034520818165749713 + ], + [ + 0.005693100730550619, + 0.014236922755496246, + 0.005583381445346449 + ], + [ + 0.0032532869847308288, + 0.014568374829030799, + 0.000763004216584281 + ], + [ + 0.009724637560048151, + 0.018447415714245713, + -0.002456395269454268 + ], + [ + 0.01657872518228831, + 0.023394415244521433, + 0.0009939050380583082 + ], + [ + 0.012199589517405858, + 0.02533129144158546, + 0.002858604114990466 + ], + [ + 0.01297107627292627, + 0.024838152587685007, + 0.005258001294290399 + ], + [ + 0.009737385776637825, + 0.021337103777977807, + 0.004343760768897358 + ], + [ + 0.011789093761427921, + 0.020360958760674838, + 0.002602562131042079 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2659399244805773, + 2.6948534930745938, + 3.652966722764379, + 2.68590390287027, + 2.018685034835302, + 3.3343229630915614, + 2.229130638539127, + 3.1888415072387786, + 2.569831635740863, + 1.700245339440428, + 2.6668575747314827, + 2.7319867441904115, + 1.523781585706796, + 1.7729100288731323, + 1.2970368078554588, + 1.7051438641295515, + 2.1266169413023075, + 3.0725443851634133, + 2.0936647017552112, + 2.8429376368547863, + 3.084397710654423, + 2.1887027902769978, + 2.0950281835696836, + 2.6968436912447915, + 2.2944323232075217 + ], + "median_reprojection_error_pixels": 0.9941164845058215, + "p90_reprojection_error_pixels": 2.901010989230633, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/camera_motion_before_full_refinement.json b/astra_scene_test/Scene_04/reference/camera_motion_before_full_refinement.json new file mode 100644 index 0000000000000000000000000000000000000000..0391f3d56631f7ad1c32781f16f5646b61041442 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/camera_motion_before_full_refinement.json @@ -0,0 +1,199 @@ +{ + "projection": "perspective", + "focal_pixels": 369.5, + "principal_point": [ + 640.0, + 480.0 + ], + "horizontal_fov_degrees": 120.00056028465872, + "epipole": [ + 640.1707869459426, + 514.7179664031315 + ], + "optimizer_success": true, + "optimizer_nfev": 80, + "optimizer_message": "`ftol` termination condition is satisfied.", + "radial_k1": -9.999999999999999e-09, + "frames": [ + 1, + 9, + 17, + 25, + 33, + 41, + 49, + 57, + 65, + 73, + 81, + 89, + 97, + 105, + 113, + 121, + 128 + ], + "displacement_fraction": [ + 0.0, + 0.06818098806171356, + 0.13756848658320978, + 0.19887779004285744, + 0.25710216938241126, + 0.32595859862392734, + 0.38831783381560425, + 0.45241538388437325, + 0.5153858724278887, + 0.5783015694155771, + 0.6416748670059164, + 0.705664010997911, + 0.7704617097985091, + 0.8336938907909718, + 0.8947980522821005, + 0.9527437058038144, + 1.0 + ], + "rotation_vectors": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.00224774362252664, + 0.005924292116590759, + 0.001036639327532078 + ], + [ + -0.0011910404166182208, + 0.010684564529596154, + 0.0055015986704040456 + ], + [ + 0.004378268063234446, + 0.010671183472230263, + 0.0058501298063352095 + ], + [ + 0.01763652280787367, + 0.008012416918407749, + -0.0014764642394765961 + ], + [ + 0.012672512318890548, + 0.008782486433992596, + -0.003629059321305456 + ], + [ + 0.0152720514738302, + 0.010479784293087971, + -0.0016160593426945268 + ], + [ + 0.012234677607333646, + 0.010968443417469399, + -0.0004865450450693065 + ], + [ + 0.002863457859054484, + 0.012750584445496068, + 0.0034520818165749713 + ], + [ + 0.005693100730550619, + 0.014236922755496246, + 0.005583381445346449 + ], + [ + 0.0032532869847308288, + 0.014568374829030799, + 0.000763004216584281 + ], + [ + 0.009724637560048151, + 0.018447415714245713, + -0.002456395269454268 + ], + [ + 0.01657872518228831, + 0.023394415244521433, + 0.0009939050380583082 + ], + [ + 0.012199589517405858, + 0.02533129144158546, + 0.002858604114990466 + ], + [ + 0.01297107627292627, + 0.024838152587685007, + 0.005258001294290399 + ], + [ + 0.009737385776637825, + 0.021337103777977807, + 0.004343760768897358 + ], + [ + 0.011789093761427921, + 0.020360958760674838, + 0.002602562131042079 + ] + ], + "track_ids": [ + 7, + 8, + 10, + 11, + 13, + 17, + 25, + 31, + 33, + 38, + 74, + 75, + 85, + 97, + 122, + 143, + 149, + 197, + 208, + 212, + 251, + 259, + 365, + 367, + 369 + ], + "depth_in_total_travel_units": [ + 2.2659399244805773, + 2.6948534930745938, + 3.652966722764379, + 2.68590390287027, + 2.018685034835302, + 3.3343229630915614, + 2.229130638539127, + 3.1888415072387786, + 2.569831635740863, + 1.700245339440428, + 2.6668575747314827, + 2.7319867441904115, + 1.523781585706796, + 1.7729100288731323, + 1.2970368078554588, + 1.7051438641295515, + 2.1266169413023075, + 3.0725443851634133, + 2.0936647017552112, + 2.8429376368547863, + 3.084397710654423, + 2.1887027902769978, + 2.0950281835696836, + 2.6968436912447915, + 2.2944323232075217 + ], + "median_reprojection_error_pixels": 0.9941164845058215, + "p90_reprojection_error_pixels": 2.901010989230633, + "limitation": "Metric scale and exact lens distortion are not uniquely constrained. Forward-camera bundle fit uses a 120-degree horizontal pinhole hypothesis and robust tracked landmarks." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/crops/lamp_base_0001.png b/astra_scene_test/Scene_04/reference/crops/lamp_base_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..63174c3b3d81d4699bb1b0a6c7e9d66ac4236519 Binary files /dev/null and b/astra_scene_test/Scene_04/reference/crops/lamp_base_0001.png differ diff --git a/astra_scene_test/Scene_04/reference/crops/lamp_base_0128.png b/astra_scene_test/Scene_04/reference/crops/lamp_base_0128.png new file mode 100644 index 0000000000000000000000000000000000000000..42fb214cca4e4fe80208786c9c009551d38bc2fc Binary files /dev/null and b/astra_scene_test/Scene_04/reference/crops/lamp_base_0128.png differ diff --git a/astra_scene_test/Scene_04/reference/crops/white_suv_1.png b/astra_scene_test/Scene_04/reference/crops/white_suv_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7201bf8dff249393e4a7be5e0b567ab67783b9d7 Binary files /dev/null and b/astra_scene_test/Scene_04/reference/crops/white_suv_1.png differ diff --git a/astra_scene_test/Scene_04/reference/distant_landmarks_trial.json b/astra_scene_test/Scene_04/reference/distant_landmarks_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..226b6838093c9b24004cd257459efaf1d5efb591 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/distant_landmarks_trial.json @@ -0,0 +1,747 @@ +{ + "distant_headlight_left": { + "xyz": [ + -7.35898139198819, + 71.47809397744096, + -2.30058224529908 + ], + "observations": { + "1": [ + 576.0, + 539.0 + ], + "9": [ + 576.3914184570312, + 538.5623779296875 + ], + "17": [ + 576.2930297851562, + 540.298095703125 + ], + "25": [ + 574.3419189453125, + 538.5428466796875 + ], + "33": [ + 571.5774536132812, + 534.2451171875 + ], + "41": [ + 570.3427124023438, + 537.163330078125 + ], + "49": [ + 568.6837158203125, + 536.5470581054688 + ], + "57": [ + 566.7459716796875, + 538.6200561523438 + ], + "65": [ + 565.0204467773438, + 543.1527099609375 + ], + "73": [ + 562.9796752929688, + 542.625732421875 + ], + "81": [ + 560.7957763671875, + 545.0585327148438 + ], + "89": [ + 559.5230712890625, + 543.47705078125 + ], + "97": [ + 557.9629516601562, + 541.3145751953125 + ], + "105": [ + 555.3115844726562, + 544.5411376953125 + ], + "113": [ + 551.095703125, + 545.0950317382812 + ], + "121": [ + 545.5712890625, + 548.0756225585938 + ], + "128": [ + 541.04541015625, + 548.66552734375 + ] + }, + "projections": { + "1": [ + 576.1781533091383, + 538.384066864485 + ], + "9": [ + 576.627109797683, + 538.0595213730966 + ], + "17": [ + 576.2367831944781, + 539.7194911885322 + ], + "25": [ + 574.5039117719776, + 538.2300695526071 + ], + "33": [ + 572.2954656990248, + 534.3953705010945 + ], + "41": [ + 570.4621077843385, + 537.230656333056 + ], + "49": [ + 568.90216116284, + 536.8693196552056 + ], + "57": [ + 566.6786176467982, + 538.7812964299692 + ], + "65": [ + 564.5832198403297, + 542.8958445065423 + ], + "73": [ + 562.4908233701947, + 542.5685600948904 + ], + "81": [ + 560.1356406594068, + 544.8894908792836 + ], + "89": [ + 558.9702321861055, + 543.7391223295567 + ], + "97": [ + 557.5454984134551, + 541.9554011923948 + ], + "105": [ + 554.73848486789, + 544.6522637536269 + ], + "113": [ + 550.8956287036239, + 545.4158339185625 + ], + "121": [ + 545.9528428565499, + 548.0841769465898 + ], + "128": [ + 542.6135689019417, + 548.6258324634553 + ] + }, + "mean_error_pixels": 0.5608408373299512, + "max_error_pixels": 1.5686610644785268 + }, + "distant_headlight_center": { + "xyz": [ + -5.166640818071345, + 74.8906401160613, + -2.1968774933027273 + ], + "observations": { + "1": [ + 589.0, + 537.0 + ], + "9": [ + 589.7914428710938, + 536.532958984375 + ], + "17": [ + 590.1503295898438, + 538.204833984375 + ], + "25": [ + 588.5750732421875, + 536.4144287109375 + ], + "33": [ + 586.328857421875, + 531.9990844726562 + ], + "41": [ + 585.3447875976562, + 534.762451171875 + ], + "49": [ + 584.242431640625, + 534.061767578125 + ], + "57": [ + 582.8644409179688, + 536.0819091796875 + ], + "65": [ + 581.7530517578125, + 540.5639038085938 + ], + "73": [ + 580.3848876953125, + 539.9678955078125 + ], + "81": [ + 578.9522094726562, + 542.2881469726562 + ], + "89": [ + 578.4090576171875, + 540.4335327148438 + ], + "97": [ + 577.6299438476562, + 538.175537109375 + ], + "105": [ + 575.9978637695312, + 541.2666015625 + ], + "113": [ + 572.603515625, + 541.677490234375 + ], + "121": [ + 568.5126342773438, + 544.46630859375 + ], + "128": [ + 564.9859619140625, + 544.7620239257812 + ] + }, + "projections": { + "1": [ + 589.0745499526433, + 536.5223328732282 + ], + "9": [ + 589.9217780581538, + 536.145765404874 + ], + "17": [ + 589.9892908053785, + 537.7891385807108 + ], + "25": [ + 588.6760853490683, + 536.226604648976 + ], + "33": [ + 586.8664876526012, + 532.2035113566352 + ], + "41": [ + 585.5855683719942, + 534.8964741883642 + ], + "49": [ + 584.5462500062042, + 534.4652685205119 + ], + "57": [ + 582.9166928262507, + 536.2763793125133 + ], + "65": [ + 581.4683320985137, + 540.3303328247786 + ], + "73": [ + 580.0270506178514, + 539.9134904775809 + ], + "81": [ + 578.3861790710796, + 541.9999479135967 + ], + "89": [ + 577.9446083557641, + 540.6443846063985 + ], + "97": [ + 577.3265146263161, + 538.7700669907289 + ], + "105": [ + 575.4389596713587, + 541.315872036418 + ], + "113": [ + 572.565033533462, + 541.92482212263 + ], + "121": [ + 568.6615683105347, + 544.3393503976336 + ], + "128": [ + 566.1930968922251, + 544.6458110522539 + ] + }, + "mean_error_pixels": 0.4630006274600263, + "max_error_pixels": 1.2127160786750724 + }, + "distant_headlight_far": { + "xyz": [ + -1.3408501070145125, + 78.56457439028985, + -2.0631704148883756 + ], + "observations": { + "1": [ + 611.0, + 537.0 + ], + "9": [ + 612.0967407226562, + 536.3214111328125 + ], + "17": [ + 612.3280639648438, + 537.7880249023438 + ], + "25": [ + 610.8767700195312, + 535.6309204101562 + ], + "33": [ + 608.66259765625, + 530.7155151367188 + ], + "41": [ + 607.9232788085938, + 533.1858520507812 + ], + "49": [ + 607.29833984375, + 532.1372680664062 + ], + "57": [ + 606.4265747070312, + 533.8456420898438 + ], + "65": [ + 605.8465576171875, + 538.3228149414062 + ], + "73": [ + 605.0324096679688, + 537.3521728515625 + ], + "81": [ + 604.3375854492188, + 539.036865234375 + ], + "89": [ + 604.9450073242188, + 536.6976318359375 + ], + "97": [ + 605.3412475585938, + 534.255126953125 + ], + "105": [ + 604.6949462890625, + 537.1362915039062 + ], + "113": [ + 602.6989135742188, + 537.1969604492188 + ], + "121": [ + 599.618408203125, + 539.5076293945312 + ], + "128": [ + 597.2274169921875, + 539.5512084960938 + ] + }, + "projections": { + "1": [ + 608.649284510563, + 534.5721860024094 + ], + "9": [ + 610.0220195720026, + 534.1588460443838 + ], + "17": [ + 610.6871634643762, + 535.8249689646208 + ], + "25": [ + 609.9139727402145, + 534.1962833706403 + ], + "33": [ + 608.6143427261642, + 529.9344808742193 + ], + "41": [ + 608.0381956657178, + 532.4761732701647 + ], + "49": [ + 607.6555498570159, + 531.9976522721279 + ], + "57": [ + 606.7686371840673, + 533.7248721806347 + ], + "65": [ + 606.123149601523, + 537.7603912730182 + ], + "73": [ + 605.4805529272529, + 537.2834945637096 + ], + "81": [ + 604.7111200736371, + 539.1108934336125 + ], + "89": [ + 605.1465546605856, + 537.5422284041786 + ], + "97": [ + 605.4933674721179, + 535.627939224619 + ], + "105": [ + 604.6910736887733, + 538.0624296182407 + ], + "113": [ + 602.9406479538007, + 538.5612576829834 + ], + "121": [ + 600.2240350973775, + 540.7383089533148 + ], + "128": [ + 598.7413537811864, + 540.818020719653 + ] + }, + "mean_error_pixels": 1.3104749025037048, + "max_error_pixels": 3.3793703731873013 + }, + "right_next_lamp": { + "xyz": [ + 12.171372614418908, + 73.32698309400536, + 10.287755236624047 + ], + "observations": { + "1": [ + 676.0, + 474.0 + ], + "9": [ + 679.2293701171875, + 472.12579345703125 + ], + "17": [ + 682.2525634765625, + 472.6588439941406 + ], + "25": [ + 683.0426635742188, + 469.45867919921875 + ], + "33": [ + 682.70703125, + 462.5318908691406 + ], + "41": [ + 684.1465454101562, + 463.30303955078125 + ], + "49": [ + 685.89404296875, + 461.00775146484375 + ], + "57": [ + 687.2223510742188, + 461.00384521484375 + ], + "65": [ + 689.6056518554688, + 464.12689208984375 + ], + "73": [ + 691.504638671875, + 461.5000915527344 + ], + "81": [ + 692.9893798828125, + 460.7843322753906 + ], + "89": [ + 695.825927734375, + 455.9842224121094 + ], + "97": [ + 699.2017822265625, + 451.2179870605469 + ], + "105": [ + 701.9930419921875, + 451.5902099609375 + ], + "113": [ + 703.4578247070312, + 448.8763427734375 + ], + "121": [ + 703.9640502929688, + 447.9381408691406 + ], + "128": [ + 704.8994140625, + 445.02691650390625 + ] + }, + "projections": { + "1": [ + 676.0224894191014, + 474.02737419246273 + ], + "9": [ + 679.1781353090328, + 472.1714102568612 + ], + "17": [ + 681.9945972461533, + 472.48150543567465 + ], + "25": [ + 682.9442083264481, + 469.3815834121774 + ], + "33": [ + 682.8227497095027, + 463.1203522624157 + ], + "41": [ + 684.2332820645654, + 463.54789221300604 + ], + "49": [ + 686.0136830367533, + 461.4045970455758 + ], + "57": [ + 687.4168450830999, + 461.20927022375037 + ], + "65": [ + 689.3861719576702, + 463.43935763124813 + ], + "73": [ + 691.3280317398746, + 460.98869323690974 + ], + "81": [ + 692.7838191446288, + 460.04647916478797 + ], + "89": [ + 695.730084519892, + 455.7304789232318 + ], + "97": [ + 699.3704762523512, + 451.46702325538035 + ], + "105": [ + 701.8727778783019, + 451.235670100558 + ], + "113": [ + 703.557605756206, + 449.0679534841074 + ], + "121": [ + 704.0054552811224, + 448.18727634602976 + ], + "128": [ + 705.171273994033, + 445.54589256007654 + ] + }, + "mean_error_pixels": 0.36050395947295183, + "max_error_pixels": 0.7659519762417646 + }, + "right_smaller_lamp": { + "xyz": [ + 14.926147602214728, + 102.69188314678074, + 8.372225779138235 + ], + "observations": { + "1": [ + 669.0, + 492.0 + ], + "9": [ + 671.7989501953125, + 490.62890625 + ], + "17": [ + 674.040283203125, + 491.7751770019531 + ], + "25": [ + 674.4747924804688, + 488.9952087402344 + ], + "33": [ + 673.739013671875, + 482.8454284667969 + ], + "41": [ + 674.8565673828125, + 484.1058044433594 + ], + "49": [ + 676.0146484375, + 482.53460693359375 + ], + "57": [ + 676.7369995117188, + 483.2787170410156 + ], + "65": [ + 678.2216796875, + 487.1328430175781 + ], + "73": [ + 679.3516235351562, + 485.3456115722656 + ], + "81": [ + 680.3638916015625, + 485.5367431640625 + ], + "89": [ + 682.3519287109375, + 481.94512939453125 + ], + "97": [ + 684.6644897460938, + 478.17315673828125 + ], + "105": [ + 686.397705078125, + 479.7648010253906 + ], + "113": [ + 686.5369262695312, + 478.492919921875 + ], + "121": [ + 685.7559814453125, + 479.2514953613281 + ], + "128": [ + 685.3016967773438, + 477.7740478515625 + ] + }, + "projections": { + "1": [ + 668.6647911929929, + 491.1925476953942 + ], + "9": [ + 671.3847913989883, + 489.961102713132 + ], + "17": [ + 673.6723103506375, + 490.91915071319386 + ], + "25": [ + 674.1804256180307, + 488.4500461889449 + ], + "33": [ + 673.7502214875567, + 482.89457520061734 + ], + "41": [ + 674.6716851944223, + 484.1485370661582 + ], + "49": [ + 675.870941932223, + 482.7741415565 + ], + "57": [ + 676.669113161076, + 483.42357117846916 + ], + "65": [ + 677.9461709336048, + 486.5070199438311 + ], + "73": [ + 679.1498568706313, + 484.99940068527303 + ], + "81": [ + 679.9950965715367, + 485.1569300676617 + ], + "89": [ + 682.1854830805188, + 482.0424806759358 + ], + "97": [ + 684.7968891393401, + 479.01049228456293 + ], + "105": [ + 686.3041535846587, + 480.0642636283342 + ], + "113": [ + 686.9099158368404, + 479.2307364912546 + ], + "121": [ + 686.380228869699, + 479.74440379951676 + ], + "128": [ + 686.6820172779445, + 478.3672701688363 + ] + }, + "mean_error_pixels": 0.58727013196417, + "max_error_pixels": 1.5023972184779937 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/distant_tower_manual_fit.json b/astra_scene_test/Scene_04/reference/distant_tower_manual_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..07682a9930b521baeaf1d19f3f06b95b5d6fbaf3 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/distant_tower_manual_fit.json @@ -0,0 +1,108 @@ +{ + "right_distant_three_windows": { + "xyz": [ + 42.054236653617394, + 201.03314622787633, + 128.00903034368366 + ], + "observations": { + "1": [ + 690, + 322 + ], + "33": [ + 692, + 310 + ], + "65": [ + 698, + 307 + ], + "97": [ + 700, + 293 + ], + "128": [ + 703, + 289 + ] + }, + "projections": { + "1": [ + 687.8528495382926, + 322.4624381631527 + ], + "33": [ + 692.6227214435469, + 307.919831096012 + ], + "65": [ + 696.6294385146346, + 307.73324751705763 + ], + "97": [ + 702.4715206138236, + 293.63410032091844 + ], + "128": [ + 703.2629285913622, + 288.89546459478254 + ] + }, + "mean_error_pixels": 1.7513311118527632, + "max_error_pixels": 2.5515676282520605 + }, + "right_distant_roof_peak": { + "xyz": [ + 52.87306630732767, + 179.64554780307964, + 143.07199345074264 + ], + "observations": { + "1": [ + 712, + 276 + ], + "33": [ + 723, + 259 + ], + "65": [ + 725, + 251 + ], + "97": [ + 734, + 235 + ], + "128": [ + 736, + 234 + ] + }, + "projections": { + "1": [ + 714.462848021547, + 275.43292750048204 + ], + "33": [ + 720.7678317689918, + 257.43279823625767 + ], + "65": [ + 725.9659618006617, + 255.47420538917297 + ], + "97": [ + 733.5380062224683, + 237.3237358548055 + ], + "128": [ + 735.5761858335604, + 230.20613939099283 + ] + }, + "mean_error_pixels": 3.2037307998570226, + "max_error_pixels": 4.577291345855323 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/facade_fit_trial.json b/astra_scene_test/Scene_04/reference/facade_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..4404aa8f9dfbbe0d06c58e4d29caad80e13354aa --- /dev/null +++ b/astra_scene_test/Scene_04/reference/facade_fit_trial.json @@ -0,0 +1,836 @@ +{ + "left_facade_14": { + "xyz": [ + -27.841737771742938, + 35.67640819611144, + 25.729445669601038 + ], + "observations": { + "1": [ + 339.0, + 298.0 + ], + "9": [ + 325.3019714355469, + 285.2109069824219 + ], + "17": [ + 310.9707336425781, + 271.56524658203125 + ], + "25": [ + 291.9886169433594, + 255.42161560058594 + ], + "33": [ + 266.9227294921875, + 233.75038146972656 + ], + "41": [ + 243.4900360107422, + 216.98995971679688 + ], + "49": [ + 220.01515197753906, + 195.30117797851562 + ], + "57": [ + 194.19801330566406, + 174.2055206298828 + ], + "65": [ + 168.88783264160156, + 152.01251220703125 + ] + }, + "projections": { + "1": [ + 339.0453271621427, + 292.95271618285994 + ], + "9": [ + 326.4840645319435, + 280.65322157175285 + ], + "17": [ + 313.04871304559526, + 268.33183065186836 + ], + "25": [ + 294.33073812763735, + 252.25113683660683 + ], + "33": [ + 268.7013769566705, + 233.3727052057902 + ], + "41": [ + 244.5599030307057, + 218.41418449324584 + ], + "49": [ + 219.50109630441852, + 197.422414064819 + ], + "57": [ + 190.65739042479817, + 176.38841151766712 + ], + "65": [ + 163.05184640447305, + 155.88217940144455 + ] + }, + "mean_error_pixels": 3.8317050393116556, + "max_error_pixels": 7.002360998654086 + }, + "left_facade_153": { + "xyz": [ + -27.765714236818646, + 35.50914466240909, + 27.447082725983854 + ], + "observations": { + "1": [ + 341.0, + 277.0 + ], + "9": [ + 327.4598083496094, + 264.03271484375 + ], + "17": [ + 313.51519775390625, + 250.0844268798828 + ], + "25": [ + 294.87237548828125, + 233.72967529296875 + ], + "33": [ + 270.6798400878906, + 214.92369079589844 + ], + "41": [ + 247.50389099121094, + 197.57298278808594 + ], + "49": [ + 221.70530700683594, + 170.7520294189453 + ], + "57": [ + 196.13729858398438, + 149.1046600341797 + ] + }, + "projections": { + "1": [ + 340.740066253516, + 276.3314043474132 + ], + "9": [ + 328.28513967917087, + 263.216247469357 + ], + "17": [ + 315.1231067946607, + 250.0889749447151 + ], + "25": [ + 296.4862952679571, + 232.94663549140898 + ], + "33": [ + 270.6391663973792, + 212.64392083297912 + ], + "41": [ + 246.753647230215, + 196.49426102238033 + ], + "49": [ + 221.89127097185104, + 174.0739425866572 + ], + "57": [ + 193.4241195040064, + 151.56841676272478 + ] + }, + "mean_error_pixels": 1.9832698303271576, + "max_error_pixels": 3.6648926229128946 + }, + "left_facade_224": { + "xyz": [ + -31.570615544142473, + 33.28003008865258, + 19.73378803209728 + ], + "observations": { + "1": [ + 276.0, + 338.0 + ], + "9": [ + 253.74559020996094, + 324.8104248046875 + ], + "17": [ + 230.70022583007812, + 311.0643310546875 + ], + "25": [ + 201.8429718017578, + 295.34918212890625 + ], + "33": [ + 167.5502471923828, + 278.9259033203125 + ], + "41": [ + 132.8997802734375, + 265.0664367675781 + ], + "49": [ + 96.36368560791016, + 244.71031188964844 + ], + "57": [ + 56.329593658447266, + 225.25418090820312 + ], + "65": [ + 15.354358673095703, + 202.4650115966797 + ] + }, + "projections": { + "1": [ + 268.1291348796826, + 334.17594454572907 + ], + "9": [ + 250.3656086381767, + 323.0001090126973 + ], + "17": [ + 230.5039574399437, + 311.3053963791516 + ], + "25": [ + 204.65238253992663, + 296.4194358035473 + ], + "33": [ + 170.85494320594887, + 279.82958625234284 + ], + "41": [ + 135.91518990950118, + 265.8186493454182 + ], + "49": [ + 99.1025155894688, + 245.50945011628025 + ], + "57": [ + 55.408418860947336, + 224.52257862558702 + ], + "65": [ + 10.69668363813662, + 202.6136727353612 + ] + }, + "mean_error_pixels": 3.45837894262643, + "max_error_pixels": 8.750652424794847 + }, + "left_facade_241": { + "xyz": [ + -31.44149494360135, + 33.638833037939385, + 22.255200243194068 + ], + "observations": { + "1": [ + 284.0, + 313.0 + ], + "9": [ + 263.9388427734375, + 300.0116882324219 + ], + "17": [ + 242.37022399902344, + 285.4534912109375 + ], + "25": [ + 215.34542846679688, + 268.5561218261719 + ], + "33": [ + 181.9423828125, + 250.8788299560547 + ], + "41": [ + 149.00613403320312, + 235.52708435058594 + ], + "49": [ + 114.51394653320312, + 213.73080444335938 + ], + "57": [ + 76.95865631103516, + 192.48257446289062 + ], + "65": [ + 38.58384704589844, + 169.10540771484375 + ] + }, + "projections": { + "1": [ + 277.3717944095918, + 311.0815119926122 + ], + "9": [ + 260.5116555174992, + 298.8910123047399 + ], + "17": [ + 241.9661695400901, + 286.2217930904136 + ], + "25": [ + 217.29355403607735, + 270.0372160984918 + ], + "33": [ + 184.48158329960825, + 251.6516021413199 + ], + "41": [ + 151.65330968797008, + 236.17857045799863 + ], + "49": [ + 117.0458780869402, + 214.239118400549 + ], + "57": [ + 76.41631774005464, + 191.61608462325802 + ], + "65": [ + 35.74889184220069, + 168.45344454732725 + ] + }, + "mean_error_pixels": 2.85725498230652, + "max_error_pixels": 6.900268515297728 + }, + "left_facade_305": { + "xyz": [ + -30.592248948539975, + 36.647279637031595, + 30.058859796798895 + ], + "observations": { + "1": [ + 327.0, + 264.0 + ], + "9": [ + 312.4950256347656, + 249.66595458984375 + ], + "17": [ + 297.2674865722656, + 234.2603302001953 + ], + "25": [ + 277.5322265625, + 216.31361389160156 + ], + "33": [ + 251.56813049316406, + 196.63795471191406 + ], + "41": [ + 227.4759063720703, + 179.9375762939453 + ], + "49": [ + 202.86875915527344, + 156.96546936035156 + ], + "57": [ + 169.35287475585938, + 128.9058837890625 + ], + "65": [ + 142.3964385986328, + 100.19003295898438 + ], + "73": [ + 111.16728973388672, + 71.78462219238281 + ], + "81": [ + 72.69959259033203, + 44.798561096191406 + ], + "89": [ + 34.01161193847656, + 16.70145606994629 + ] + }, + "projections": { + "1": [ + 323.30158230641223, + 259.9916277325066 + ], + "9": [ + 310.6749837738255, + 246.58508927938266 + ], + "17": [ + 297.5595565131833, + 233.21987312077414 + ], + "25": [ + 278.59084562713906, + 215.6587255191169 + ], + "33": [ + 251.9801044754883, + 194.82168913220323 + ], + "41": [ + 228.1848794076701, + 178.6249001645445 + ], + "49": [ + 203.42375852198853, + 156.01942481854445 + ], + "57": [ + 175.4124620849695, + 133.6133389659086 + ], + "65": [ + 149.6365974280116, + 112.36383542715566 + ], + "73": [ + 112.72730008535723, + 79.17904147705588 + ], + "81": [ + 68.30440821508762, + 48.17104182439488 + ], + "89": [ + 14.23914042149147, + 4.381618287372191 + ] + }, + "mean_error_pixels": 6.169990335963384, + "max_error_pixels": 23.296545513850912 + }, + "left_facade_312": { + "xyz": [ + -30.527604568430462, + 33.141117839074326, + 18.70811704208037 + ], + "observations": { + "1": [ + 283.0, + 349.0 + ], + "9": [ + 261.8179016113281, + 336.4425354003906 + ], + "17": [ + 239.73118591308594, + 323.41522216796875 + ], + "25": [ + 212.07040405273438, + 308.0528259277344 + ], + "33": [ + 178.0619354248047, + 291.7078552246094 + ], + "41": [ + 144.02078247070312, + 278.1570739746094 + ], + "49": [ + 108.67957305908203, + 258.6923828125 + ], + "57": [ + 69.52809143066406, + 239.5958709716797 + ], + "65": [ + 28.405357360839844, + 217.02249145507812 + ] + }, + "projections": { + "1": [ + 277.2750392895312, + 344.32791520858075 + ], + "9": [ + 259.8073451640589, + 333.6254668459767 + ], + "17": [ + 240.15375833367153, + 322.4553379258646 + ], + "25": [ + 214.7748893790469, + 308.2045993173465 + ], + "33": [ + 181.8030127670163, + 292.3653527982127 + ], + "41": [ + 147.2795721856274, + 279.0631345000596 + ], + "49": [ + 110.94551412337762, + 259.6064643439719 + ], + "57": [ + 67.64231388704832, + 239.52166552250912 + ], + "65": [ + 22.948371202699946, + 218.44344695932625 + ] + }, + "mean_error_pixels": 3.5286974783429432, + "max_error_pixels": 7.3894215899908176 + }, + "left_facade_319": { + "xyz": [ + -29.723042735599773, + 33.64367293331828, + 18.72088045181945 + ], + "observations": { + "1": [ + 296.0, + 349.0 + ], + "9": [ + 276.9952697753906, + 337.7050476074219 + ], + "17": [ + 256.49615478515625, + 325.91326904296875 + ], + "25": [ + 230.60231018066406, + 311.52423095703125 + ], + "33": [ + 199.1722869873047, + 296.6095886230469 + ], + "41": [ + 167.6732940673828, + 284.0908508300781 + ], + "49": [ + 134.66851806640625, + 265.90399169921875 + ], + "57": [ + 97.01226806640625, + 247.835693359375 + ], + "65": [ + 55.401878356933594, + 225.79563903808594 + ] + }, + "projections": { + "1": [ + 291.5784082524537, + 347.3235634839619 + ], + "9": [ + 275.16378633200344, + 336.94066807577553 + ], + "17": [ + 256.7123383099238, + 326.2043141263571 + ], + "25": [ + 232.84383892870068, + 312.4220588620525 + ], + "33": [ + 201.84097287018614, + 297.04075944247086 + ], + "41": [ + 169.52438699787672, + 284.3789794029889 + ], + "49": [ + 135.6674098788488, + 265.76162129712304 + ], + "57": [ + 95.4252503371813, + 246.71441349403867 + ], + "65": [ + 54.074452203000874, + 226.89856672724514 + ] + }, + "mean_error_pixels": 2.082799112585224, + "max_error_pixels": 4.728732702773075 + }, + "left_facade_342": { + "xyz": [ + -34.10466754191314, + 30.863052139389854, + 23.13512144622352 + ], + "observations": { + "1": [ + 239.0, + 288.0 + ], + "9": [ + 201.36651611328125, + 267.8841552734375 + ], + "17": [ + 166.82066345214844, + 245.6532745361328 + ], + "25": [ + 131.54998779296875, + 224.5261688232422 + ], + "33": [ + 90.62067413330078, + 204.49151611328125 + ], + "41": [ + 49.760948181152344, + 184.81028747558594 + ], + "49": [ + 8.783300399780273, + 160.7051239013672 + ] + }, + "projections": { + "1": [ + 216.34434067688443, + 280.680549139267 + ], + "9": [ + 194.36138891663848, + 265.71962358595465 + ], + "17": [ + 170.14188402300903, + 249.64564393243964 + ], + "25": [ + 137.86634544735045, + 229.41347015830397 + ], + "33": [ + 94.51444352302121, + 206.31498219207833 + ], + "41": [ + 50.59093946816802, + 185.2831865707675 + ], + "49": [ + 3.0399512543182254, + 156.28266071128957 + ] + }, + "mean_error_pixels": 8.117681899043443, + "max_error_pixels": 23.808680355445127 + }, + "left_facade_344": { + "xyz": [ + -31.72924947881222, + 31.06999242053081, + 19.746530468009468 + ], + "observations": { + "1": [ + 255.0, + 329.0 + ], + "9": [ + 223.57339477539062, + 307.66650390625 + ], + "17": [ + 195.84442138671875, + 291.0091857910156 + ], + "25": [ + 163.46841430664062, + 273.5496520996094 + ], + "33": [ + 124.53631591796875, + 255.82064819335938 + ], + "41": [ + 85.69303894042969, + 239.45362854003906 + ], + "49": [ + 44.76420974731445, + 216.94949340820312 + ] + }, + "projections": { + "1": [ + 242.02744493145025, + 319.851288166358 + ], + "9": [ + 221.26912791222895, + 307.0752395212239 + ], + "17": [ + 197.9634481754191, + 293.39128705808946 + ], + "25": [ + 167.70200216946364, + 276.1985058248713 + ], + "33": [ + 127.9278687884364, + 256.93863555618805 + ], + "41": [ + 86.09934038184838, + 239.54512289365644 + ], + "49": [ + 41.19881268005781, + 215.00719252417503 + ] + }, + "mean_error_pixels": 4.926118126606634, + "max_error_pixels": 15.874070467954233 + }, + "left_facade_379": { + "xyz": [ + -29.24601216344421, + 36.23762871295906, + 27.167920134256118 + ], + "observations": { + "1": [ + 330.0, + 288.0 + ], + "9": [ + 316.2759094238281, + 275.235107421875 + ], + "17": [ + 301.9510803222656, + 261.59161376953125 + ], + "25": [ + 282.84442138671875, + 245.40257263183594 + ], + "33": [ + 258.141845703125, + 223.41976928710938 + ], + "41": [ + 234.61839294433594, + 204.76332092285156 + ], + "49": [ + 211.16368103027344, + 182.8395538330078 + ], + "57": [ + 184.9812469482422, + 162.45997619628906 + ], + "65": [ + 160.3619384765625, + 140.65269470214844 + ] + }, + "projections": { + "1": [ + 330.3787393344109, + 283.09523641166277 + ], + "9": [ + 317.73790149107435, + 270.5490041031779 + ], + "17": [ + 304.3471161536146, + 257.9995607828801 + ], + "25": [ + 285.4695171267439, + 241.58490960064188 + ], + "33": [ + 259.438042437187, + 222.28661562887817 + ], + "41": [ + 235.36292152274842, + 207.14366912284402 + ], + "49": [ + 210.3770350518509, + 185.87894413583052 + ], + "57": [ + 181.80414904906553, + 164.6955771965175 + ], + "65": [ + 154.84175728506455, + 144.26231416719304 + ] + }, + "mean_error_pixels": 4.068320348839915, + "max_error_pixels": 6.595585877645492 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/fitted_landmarks.json b/astra_scene_test/Scene_04/reference/fitted_landmarks.json new file mode 100644 index 0000000000000000000000000000000000000000..e2d1c07bfac8e649c318f9748cc2fd27db63e8c2 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/fitted_landmarks.json @@ -0,0 +1,90 @@ +{ + "13": { + "uv": [ + 743, + 512 + ], + "xyz": [ + 17.37393523585375, + 53.567757141225, + 4.631902342837701 + ] + }, + "38": { + "uv": [ + 530, + 537 + ], + "xyz": [ + -9.634018010605121, + 47.197441578486384, + 1.5499998975911986 + ] + }, + "74": { + "uv": [ + 467, + 254 + ], + "xyz": [ + -28.173189393291253, + 54.00520465751647, + 47.88955448187207 + ] + }, + "75": { + "uv": [ + 469, + 235 + ], + "xyz": [ + -28.421819787604488, + 53.474482667145224, + 51.92285183605145 + ] + }, + "85": { + "uv": [ + 694, + 471 + ], + "xyz": [ + 8.588897163826156, + 42.010381452298596, + 8.179405923697072 + ] + }, + "122": { + "uv": [ + 532, + 471 + ], + "xyz": [ + -7.195057597598322, + 32.92574811947026, + 6.613366047012177 + ] + }, + "143": { + "uv": [ + 541, + 443 + ], + "xyz": [ + -9.287145200361358, + 45.55504892875169, + 11.863891384798915 + ] + }, + "251": { + "uv": [ + 335, + 200 + ], + "xyz": [ + -62.29205400794394, + 60.96458058533097, + 67.20808444619212 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/foreground_fit_trial.json b/astra_scene_test/Scene_04/reference/foreground_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..5c2db1f1802f2f09f8c199d84c5cc6adb4d0f65a --- /dev/null +++ b/astra_scene_test/Scene_04/reference/foreground_fit_trial.json @@ -0,0 +1,3344 @@ +{ + "feature_3": { + "xyz": [ + -28.42898301284557, + 28.064415464663377, + 7.547854162155794 + ], + "observations": { + "1": [ + 226.0, + 454.0 + ], + "9": [ + 195.74916076660156, + 447.7850341796875 + ], + "17": [ + 162.09800720214844, + 440.61090087890625 + ], + "25": [ + 121.47499084472656, + 432.4641418457031 + ], + "33": [ + 74.41999053955078, + 425.552734375 + ], + "41": [ + 25.392189025878906, + 420.1846008300781 + ] + }, + "projections": { + "1": [ + 221.7034857707764, + 453.1204104802208 + ], + "9": [ + 195.23799319028439, + 447.36763689049087 + ], + "17": [ + 163.0828139337096, + 441.20105305850615 + ], + "25": [ + 124.85723620951103, + 433.1182690200945 + ], + "33": [ + 78.17470969806197, + 425.57901327307917 + ], + "41": [ + 19.37099321811195, + 420.0562179831773 + ] + }, + "mean_error_pixels": 3.235991610094494, + "max_error_pixels": 6.022564330154452 + }, + "feature_6": { + "xyz": [ + -28.270099904412454, + 29.409077304510205, + 7.573533704614242 + ], + "observations": { + "1": [ + 248.0, + 457.0 + ], + "9": [ + 220.708740234375, + 451.4850158691406 + ], + "17": [ + 189.9171600341797, + 445.33135986328125 + ], + "25": [ + 152.75050354003906, + 438.07720947265625 + ], + "33": [ + 109.20884704589844, + 431.79913330078125 + ], + "41": [ + 63.273780822753906, + 427.6788024902344 + ], + "49": [ + 13.405906677246094, + 417.75860595703125 + ] + }, + "projections": { + "1": [ + 242.59446840339854, + 456.7892006206604 + ], + "9": [ + 218.94296015379535, + 451.5265722833699 + ], + "17": [ + 190.314806286394, + 446.0689989428267 + ], + "25": [ + 156.38828741702582, + 438.705872658958 + ], + "33": [ + 115.26692449689688, + 431.7867210019635 + ], + "41": [ + 64.16432634590763, + 427.37392866044206 + ], + "49": [ + 9.354565277066172, + 417.1464638560527 + ] + }, + "mean_error_pixels": 3.2574730739786912, + "max_error_pixels": 6.058090166666199 + }, + "feature_26": { + "xyz": [ + -28.38895353015113, + 33.60133750904572, + 4.333286477041266 + ], + "observations": { + "1": [ + 289.0, + 505.0 + ], + "9": [ + 268.3883056640625, + 503.0553894042969 + ], + "17": [ + 244.72183227539062, + 501.2847595214844 + ], + "25": [ + 216.33132934570312, + 498.29034423828125 + ], + "33": [ + 183.10202026367188, + 496.08831787109375 + ], + "41": [ + 147.6532745361328, + 497.2365417480469 + ], + "49": [ + 108.5990219116211, + 493.5293273925781 + ], + "57": [ + 64.94026947021484, + 492.5971374511719 + ], + "65": [ + 16.967979431152344, + 489.5366516113281 + ] + }, + "projections": { + "1": [ + 283.4939001328153, + 504.2261124799064 + ], + "9": [ + 265.39940156321677, + 502.19901755982323 + ], + "17": [ + 243.22532301403214, + 500.7760456285473 + ], + "25": [ + 217.6891330867457, + 497.65574123263025 + ], + "33": [ + 188.07210965834958, + 495.1480092546119 + ], + "41": [ + 150.9204966505415, + 496.9298979099913 + ], + "49": [ + 112.71822488246573, + 493.8009371526624 + ], + "57": [ + 64.83350283618438, + 492.863613331027 + ], + "65": [ + 10.234870611421911, + 492.0630712901377 + ] + }, + "mean_error_pixels": 3.521702970855282, + "max_error_pixels": 7.19149155403857 + }, + "feature_29": { + "xyz": [ + -27.361455982255585, + 29.98657925638708, + 6.695791682860995 + ], + "observations": { + "1": [ + 265.0, + 471.0 + ], + "9": [ + 239.87950134277344, + 466.3599548339844 + ], + "17": [ + 211.3734130859375, + 461.1990966796875 + ], + "25": [ + 176.6651611328125, + 454.6192321777344 + ], + "33": [ + 136.9361572265625, + 449.13055419921875 + ], + "41": [ + 94.71565246582031, + 446.0708312988281 + ], + "49": [ + 48.40856170654297, + 437.5699157714844 + ] + }, + "projections": { + "1": [ + 260.72660932587524, + 469.67781907573345 + ], + "9": [ + 238.6514042438463, + 465.33072698196315 + ], + "17": [ + 211.82154392685032, + 461.0322601725424 + ], + "25": [ + 180.27720064806118, + 454.88569477281413 + ], + "33": [ + 142.43980404195207, + 449.2138362510363 + ], + "41": [ + 95.11096926698883, + 446.5659873016639 + ], + "49": [ + 44.71369353880266, + 438.42214779847177 + ] + }, + "mean_error_pixels": 2.872200674425787, + "max_error_pixels": 5.504276897895192 + }, + "feature_30": { + "xyz": [ + -27.519512504221762, + 31.36495338035819, + 6.650725445009571 + ], + "observations": { + "1": [ + 280.0, + 474.0 + ], + "9": [ + 256.5245361328125, + 469.9356689453125 + ], + "17": [ + 230.77224731445312, + 465.5762023925781 + ], + "25": [ + 199.4508514404297, + 460.00372314453125 + ], + "33": [ + 162.55572509765625, + 454.9518127441406 + ], + "41": [ + 123.54429626464844, + 452.730224609375 + ], + "49": [ + 80.6122817993164, + 445.0611572265625 + ], + "57": [ + 32.60860824584961, + 439.4831237792969 + ] + }, + "projections": { + "1": [ + 274.66577108914765, + 473.26697275735216 + ], + "9": [ + 254.6196809871755, + 469.30340364350013 + ], + "17": [ + 230.3093560113636, + 465.5410093751544 + ], + "25": [ + 201.7822247696456, + 459.92824591202367 + ], + "33": [ + 167.78495554625516, + 454.7085751805987 + ], + "41": [ + 125.73505241290547, + 452.8430838587366 + ], + "49": [ + 81.55106408693791, + 445.73404104824107 + ], + "57": [ + 25.854146141349133, + 439.8228361152445 + ] + }, + "mean_error_pixels": 3.1918497977369715, + "max_error_pixels": 6.76299954105632 + }, + "feature_35": { + "xyz": [ + -29.050615878877277, + 28.406457700586518, + 6.259209989160345 + ], + "observations": { + "1": [ + 218.0, + 471.0 + ], + "9": [ + 188.30174255371094, + 466.5295715332031 + ], + "17": [ + 154.3130645751953, + 461.3646545410156 + ], + "25": [ + 113.12709045410156, + 455.3734436035156 + ], + "33": [ + 65.7053451538086, + 451.0679931640625 + ], + "41": [ + 15.152017593383789, + 448.48333740234375 + ] + }, + "projections": { + "1": [ + 214.39391996855267, + 471.40166745214844 + ], + "9": [ + 187.6454147102117, + 466.9099210299172 + ], + "17": [ + 154.94544570401933, + 462.21230275901684 + ], + "25": [ + 116.43153604773204, + 455.82605900348045 + ], + "33": [ + 69.90629493338042, + 450.38426668875763 + ], + "41": [ + 10.511074322978857, + 447.50035506550535 + ] + }, + "mean_error_pixels": 2.9633219764070855, + "max_error_pixels": 4.743902266452495 + }, + "feature_36": { + "xyz": [ + -27.501778858655612, + 33.809929348809014, + 5.275832449028375 + ], + "observations": { + "1": [ + 303.0, + 494.0 + ], + "9": [ + 283.663330078125, + 491.3922119140625 + ], + "17": [ + 261.5282897949219, + 488.9944152832031 + ], + "25": [ + 234.68563842773438, + 485.31610107421875 + ], + "33": [ + 203.22410583496094, + 482.0315246582031 + ], + "41": [ + 170.0732421875, + 482.49713134765625 + ], + "49": [ + 133.45278930664062, + 478.05584716796875 + ], + "57": [ + 92.36991882324219, + 476.4386901855469 + ], + "65": [ + 47.130985260009766, + 472.87255859375 + ] + }, + "projections": { + "1": [ + 298.0590366928667, + 493.66296420625923 + ], + "9": [ + 280.9790598945323, + 491.0739326548035 + ], + "17": [ + 260.1476452630812, + 489.0465773620228 + ], + "25": [ + 235.98274045539972, + 485.2108324492145 + ], + "33": [ + 207.77027437081614, + 481.74513991704305 + ], + "41": [ + 172.8777786042565, + 482.4129255209845 + ], + "49": [ + 137.01291557073938, + 478.2301824024911 + ], + "57": [ + 92.29576024968014, + 475.97130474496066 + ], + "65": [ + 41.73027155651903, + 473.76086670379686 + ] + }, + "mean_error_pixels": 3.0233777920321296, + "max_error_pixels": 5.473280534144734 + }, + "feature_43": { + "xyz": [ + -27.030905426806914, + 32.0729148065258, + 6.591845991065577 + ], + "observations": { + "1": [ + 295.0, + 475.0 + ], + "9": [ + 273.900634765625, + 471.2981872558594 + ], + "17": [ + 249.31129455566406, + 467.5448303222656 + ], + "25": [ + 219.30528259277344, + 462.51947021484375 + ], + "33": [ + 183.8660125732422, + 458.0122985839844 + ], + "41": [ + 146.3266143798828, + 456.68389892578125 + ], + "49": [ + 104.8652572631836, + 450.1318359375 + ], + "57": [ + 58.7099609375, + 445.6868896484375 + ], + "65": [ + 8.685697555541992, + 438.9015808105469 + ] + }, + "projections": { + "1": [ + 288.5888173739528, + 475.4896428755236 + ], + "9": [ + 269.89274401665375, + 471.7413940689869 + ], + "17": [ + 247.225281126328, + 468.29819334849 + ], + "25": [ + 220.65160589051408, + 462.9731662085603 + ], + "33": [ + 189.09669497679795, + 457.9342803756627 + ], + "41": [ + 150.25753596693602, + 456.4510746159221 + ], + "49": [ + 109.7080259868601, + 449.87896227987494 + ], + "57": [ + 58.860021338244565, + 444.647640404775 + ], + "65": [ + 0.9443191780823099, + 438.8417282313429 + ] + }, + "mean_error_pixels": 4.1012055857140854, + "max_error_pixels": 7.741609749544191 + }, + "feature_44": { + "xyz": [ + -25.204720735399285, + 33.11039071795426, + 6.723501209621738 + ], + "observations": { + "1": [ + 323.0, + 476.0 + ], + "9": [ + 305.7037353515625, + 472.4814758300781 + ], + "17": [ + 286.3162536621094, + 469.2692565917969 + ], + "25": [ + 262.3711242675781, + 464.3651428222656 + ], + "33": [ + 234.14956665039062, + 459.4612731933594 + ], + "41": [ + 204.76431274414062, + 458.4093322753906 + ] + }, + "projections": { + "1": [ + 321.8409485978341, + 476.19572142359647 + ], + "9": [ + 305.7367576832458, + 472.62074092590507 + ], + "17": [ + 286.21342251162406, + 469.52495071074463 + ], + "25": [ + 263.289105256742, + 464.4273863080243 + ], + "33": [ + 236.15655394830412, + 459.3049064306774 + ], + "41": [ + 203.09504653903906, + 458.03818313191834 + ] + }, + "mean_error_pixels": 1.0395619827508022, + "max_error_pixels": 2.0130694420356576 + }, + "feature_47": { + "xyz": [ + -23.685556428302345, + 32.665634207592795, + 6.208479052686964 + ], + "observations": { + "1": [ + 336.0, + 484.0 + ], + "9": [ + 320.4140930175781, + 480.82598876953125 + ], + "17": [ + 302.5777893066406, + 477.9319763183594 + ], + "25": [ + 280.2257995605469, + 473.3547668457031 + ], + "33": [ + 253.19427490234375, + 468.50634765625 + ], + "41": [ + 219.51609802246094, + 466.4613342285156 + ], + "49": [ + 178.99612426757812, + 458.361083984375 + ], + "57": [ + 137.1529998779297, + 453.1900634765625 + ], + "65": [ + 96.74473571777344, + 447.68719482421875 + ], + "73": [ + 51.27796936035156, + 439.90325927734375 + ] + }, + "projections": { + "1": [ + 335.8218621745102, + 481.5269928755218 + ], + "9": [ + 320.1812118698498, + 478.2436753418118 + ], + "17": [ + 301.1252722306744, + 475.5327184846515 + ], + "25": [ + 278.8256903625101, + 470.78393751003523 + ], + "33": [ + 252.52552958377316, + 465.932109319296 + ], + "41": [ + 220.15617305280426, + 465.1035674925323 + ], + "49": [ + 186.56292206232803, + 459.53765526987536 + ], + "57": [ + 144.61344180688508, + 455.5031811849375 + ], + "65": [ + 96.98291677969803, + 451.38423765455644 + ], + "73": [ + 38.04197043977058, + 442.21839042077966 + ] + }, + "mean_error_pixels": 4.757520035156363, + "max_error_pixels": 13.436945323879522 + }, + "feature_56": { + "xyz": [ + -27.59038211335012, + 33.88707235750728, + 4.20600955435572 + ], + "observations": { + "1": [ + 301.0, + 507.0 + ], + "9": [ + 281.3951416015625, + 505.0876770019531 + ], + "17": [ + 259.046142578125, + 503.50933837890625 + ], + "25": [ + 232.0009002685547, + 500.6426696777344 + ], + "33": [ + 200.4164276123047, + 498.3479309082031 + ], + "41": [ + 166.93258666992188, + 499.6916198730469 + ], + "49": [ + 129.910400390625, + 496.2977294921875 + ], + "57": [ + 88.43473815917969, + 495.41119384765625 + ], + "65": [ + 42.76484298706055, + 492.9220275878906 + ] + }, + "projections": { + "1": [ + 295.9840733125285, + 506.0365800041416 + ], + "9": [ + 278.74967682741675, + 504.13691415935256 + ], + "17": [ + 257.6024412563933, + 502.91305282747715 + ], + "25": [ + 233.27817027242907, + 499.9421204114154 + ], + "33": [ + 205.14581796607985, + 497.4694465254289 + ], + "41": [ + 169.85948232364694, + 499.4154637358708 + ], + "49": [ + 133.65904786206693, + 496.53810201562135 + ], + "57": [ + 88.3602372271896, + 495.8939733451878 + ], + "65": [ + 36.790519479797695, + 495.5156832079161 + ] + }, + "mean_error_pixels": 3.271729136895116, + "max_error_pixels": 6.513032384743926 + }, + "feature_57": { + "xyz": [ + -27.677496390949248, + 28.004568248457918, + 6.137844974549646 + ], + "observations": { + "1": [ + 231.0, + 472.0 + ], + "9": [ + 202.34840393066406, + 467.611572265625 + ], + "17": [ + 169.6800537109375, + 462.5581970214844 + ], + "25": [ + 130.60629272460938, + 456.6868896484375 + ], + "33": [ + 85.15667724609375, + 452.3750305175781 + ], + "41": [ + 29.37567138671875, + 448.5159912109375 + ] + }, + "projections": { + "1": [ + 228.67156744409675, + 472.31107892721104 + ], + "9": [ + 202.38310513483952, + 467.85180214158584 + ], + "17": [ + 170.1736526209648, + 463.2356673560925 + ], + "25": [ + 132.27529646058395, + 456.87056289434275 + ], + "33": [ + 86.49119453405422, + 451.32211813862517 + ], + "41": [ + 27.679353318630547, + 448.3839459844668 + ] + }, + "mean_error_pixels": 1.4184100501579266, + "max_error_pixels": 2.3491207432452055 + }, + "feature_124": { + "xyz": [ + -28.640813424935974, + 27.36960155125657, + 6.847910645597362 + ], + "observations": { + "1": [ + 208.0, + 461.0 + ], + "9": [ + 177.04502868652344, + 455.6080017089844 + ], + "17": [ + 142.32472229003906, + 448.8991394042969 + ], + "25": [ + 100.62256622314453, + 441.3460388183594 + ], + "33": [ + 52.582393646240234, + 435.1123962402344 + ] + }, + "projections": { + "1": [ + 206.3374836542926, + 460.61027677675565 + ], + "9": [ + 177.86416242401884, + 455.2235993271474 + ], + "17": [ + 143.0534144786214, + 449.3961670306782 + ], + "25": [ + 101.7688239154511, + 441.76126380124293 + ], + "33": [ + 51.368166062733735, + 434.9385001903427 + ] + }, + "mean_error_pixels": 1.1880505227031462, + "max_error_pixels": 1.707584489997555 + }, + "feature_136": { + "xyz": [ + -26.9620817468768, + 33.61986241193773, + 6.668058888603898 + ], + "observations": { + "1": [ + 308.0, + 479.0 + ], + "9": [ + 289.41046142578125, + 475.205810546875 + ], + "17": [ + 268.4305114746094, + 471.5572509765625 + ], + "25": [ + 242.70220947265625, + 466.43377685546875 + ], + "33": [ + 212.5166015625, + 461.4092102050781 + ], + "41": [ + 181.09127807617188, + 459.8489990234375 + ], + "49": [ + 146.3634033203125, + 453.38616943359375 + ], + "57": [ + 107.49575805664062, + 448.89892578125 + ] + }, + "projections": { + "1": [ + 305.0389564651305, + 477.55588302298713 + ], + "9": [ + 288.33262800219603, + 474.0716577752088 + ], + "17": [ + 268.1103430856092, + 471.02527105741655 + ], + "25": [ + 244.38827019456767, + 466.0596940488323 + ], + "33": [ + 216.35226133685188, + 461.24196772402087 + ], + "41": [ + 182.2808485584087, + 460.2441164979255 + ], + "49": [ + 147.15156212051727, + 454.3653140166068 + ], + "57": [ + 103.5432017477475, + 450.0204963869971 + ] + }, + "mean_error_pixels": 2.2081661827776498, + "max_error_pixels": 4.108603412188465 + }, + "feature_144": { + "xyz": [ + -29.44311538926054, + 28.36535998470726, + 8.199263362744203 + ], + "observations": { + "1": [ + 218.0, + 445.0 + ], + "9": [ + 186.73960876464844, + 438.53143310546875 + ], + "17": [ + 152.9450225830078, + 431.11920166015625 + ], + "25": [ + 112.14344787597656, + 422.6999816894531 + ], + "33": [ + 64.47027587890625, + 415.6873474121094 + ], + "41": [ + 14.279901504516602, + 410.2101135253906 + ] + }, + "projections": { + "1": [ + 212.6954138174986, + 445.13605067998583 + ], + "9": [ + 186.08737362396192, + 438.89920156461346 + ], + "17": [ + 153.91279284385683, + 432.14411697067686 + ], + "25": [ + 115.48671368260557, + 423.43197929347895 + ], + "33": [ + 68.37622307591164, + 415.21147350011864 + ], + "41": [ + 9.7334143861126, + 408.81757775453235 + ] + }, + "mean_error_pixels": 3.262830600935717, + "max_error_pixels": 5.306330592331139 + }, + "feature_147": { + "xyz": [ + -27.922350250072412, + 28.39020652223503, + 7.125883807482194 + ], + "observations": { + "1": [ + 236.0, + 461.0 + ], + "9": [ + 207.72755432128906, + 455.3135070800781 + ], + "17": [ + 175.70323181152344, + 448.6668395996094 + ], + "25": [ + 137.21754455566406, + 441.07763671875 + ], + "33": [ + 92.1731185913086, + 434.60797119140625 + ], + "41": [ + 43.65007400512695, + 430.4933166503906 + ] + }, + "projections": { + "1": [ + 232.81972692786212, + 459.86552233339717 + ], + "9": [ + 207.3980663272818, + 454.63175808501916 + ], + "17": [ + 176.4631137098687, + 449.1318584243858 + ], + "25": [ + 139.8447562528048, + 441.7573615548605 + ], + "33": [ + 95.37333442379031, + 434.9496137013968 + ], + "41": [ + 39.22225102646871, + 430.479398278646 + ] + }, + "mean_error_pixels": 2.5640998112025595, + "max_error_pixels": 4.427844854035196 + }, + "feature_194": { + "xyz": [ + -26.252431483374185, + 27.43543178405984, + 4.994571399338847 + ], + "observations": { + "1": [ + 239.0, + 489.0 + ], + "9": [ + 212.03106689453125, + 485.23138427734375 + ], + "17": [ + 181.2407989501953, + 480.85101318359375 + ], + "25": [ + 143.7088165283203, + 475.6732482910156 + ], + "33": [ + 94.15365600585938, + 470.6909484863281 + ], + "41": [ + 36.80189514160156, + 467.0282897949219 + ] + }, + "projections": { + "1": [ + 239.33097451719618, + 487.24160035775117 + ], + "9": [ + 212.9149093686944, + 483.77090133256746 + ], + "17": [ + 180.26269810529902, + 480.3582391936219 + ], + "25": [ + 142.12521022253333, + 475.278814090316 + ], + "33": [ + 96.35305096510933, + 471.1649534335561 + ], + "41": [ + 36.24965649364367, + 470.1604154656388 + ] + }, + "mean_error_pixels": 1.9423192698744636, + "max_error_pixels": 3.180436879024982 + }, + "feature_304": { + "xyz": [ + -22.78289969107923, + 25.24949349027819, + 4.760641330628004 + ], + "observations": { + "1": [ + 260.0, + 489.0 + ], + "9": [ + 235.5068817138672, + 485.5094299316406 + ], + "17": [ + 204.45596313476562, + 481.0455017089844 + ], + "25": [ + 159.7410888671875, + 474.411865234375 + ], + "33": [ + 101.54950714111328, + 467.59454345703125 + ], + "41": [ + 45.85795211791992, + 463.9017639160156 + ] + }, + "projections": { + "1": [ + 262.2291782220796, + 486.8099798920158 + ], + "9": [ + 234.6657314346799, + 483.13772232392176 + ], + "17": [ + 200.21018582210615, + 479.50456432130716 + ], + "25": [ + 159.79002070435996, + 474.04573845159604 + ], + "33": [ + 110.76011321521787, + 469.3251755233888 + ], + "41": [ + 44.36990183556111, + 467.5256882585776 + ] + }, + "mean_error_pixels": 3.969481019358026, + "max_error_pixels": 9.371784867432527 + }, + "feature_311": { + "xyz": [ + -26.552063727496613, + 29.483781117557015, + 4.2871543564988555 + ], + "observations": { + "1": [ + 264.0, + 501.0 + ], + "9": [ + 240.00119018554688, + 498.2234802246094 + ], + "17": [ + 210.3454132080078, + 495.2217102050781 + ], + "25": [ + 169.27650451660156, + 491.8037414550781 + ], + "33": [ + 127.75398254394531, + 489.5896301269531 + ], + "41": [ + 87.60099029541016, + 490.43206787109375 + ], + "49": [ + 43.08454513549805, + 485.4955749511719 + ] + }, + "projections": { + "1": [ + 260.85611964348794, + 500.1756606180715 + ], + "9": [ + 238.00378171419038, + 497.74275296703956 + ], + "17": [ + 209.80249008570343, + 495.6995963356946 + ], + "25": [ + 177.20790291715116, + 492.0246210145468 + ], + "33": [ + 138.7820129463734, + 489.2462758883132 + ], + "41": [ + 88.88709169656124, + 490.34261247074653 + ], + "49": [ + 35.620934872896555, + 486.16992606095096 + ] + }, + "mean_error_pixels": 4.825564905217825, + "max_error_pixels": 11.033374220521594 + }, + "feature_48": { + "xyz": [ + -13.005588480972518, + 24.093163524106807, + 0.45387411867106464 + ], + "observations": { + "1": [ + 404.0, + 555.0 + ], + "9": [ + 385.761962890625, + 557.3265991210938 + ], + "17": [ + 363.6872253417969, + 561.2540283203125 + ], + "25": [ + 335.3769226074219, + 564.05078125 + ], + "33": [ + 299.85760498046875, + 567.2875366210938 + ], + "41": [ + 255.25279235839844, + 577.44921875 + ], + "49": [ + 196.3499755859375, + 585.0567016601562 + ], + "57": [ + 122.29508209228516, + 598.4305419921875 + ], + "65": [ + 25.347532272338867, + 615.2725219726562 + ] + }, + "projections": { + "1": [ + 402.90998745689996, + 555.0980906850443 + ], + "9": [ + 384.7186403641946, + 557.2984735967852 + ], + "17": [ + 360.89108364764945, + 561.4621233971095 + ], + "25": [ + 333.6235096051475, + 563.7163672427805 + ], + "33": [ + 301.88151006951, + 566.43412856195 + ], + "41": [ + 255.30593831550465, + 577.1416594551858 + ], + "49": [ + 201.73971933844848, + 584.5472605510394 + ], + "57": [ + 126.17644657431504, + 597.9927720431928 + ], + "65": [ + 21.674395629185824, + 616.7241944594819 + ] + }, + "mean_error_pixels": 2.500548462495309, + "max_error_pixels": 5.41376652261523 + }, + "feature_59": { + "xyz": [ + -10.63209804488098, + 22.665108172201965, + 0.5949377155275737 + ], + "observations": { + "1": [ + 438.0, + 553.0 + ], + "9": [ + 420.2544250488281, + 555.6448974609375 + ], + "17": [ + 397.55316162109375, + 560.3634033203125 + ], + "25": [ + 368.2631530761719, + 563.668701171875 + ], + "33": [ + 330.8023376464844, + 567.6851196289062 + ], + "41": [ + 285.6253967285156, + 578.7252197265625 + ], + "49": [ + 225.93968200683594, + 587.1826782226562 + ], + "57": [ + 147.3412322998047, + 601.953857421875 + ], + "65": [ + 46.244117736816406, + 619.5076904296875 + ] + }, + "projections": { + "1": [ + 431.68344675592766, + 553.6765025363471 + ], + "9": [ + 414.66551018025723, + 556.04405404226 + ], + "17": [ + 392.06915541387775, + 560.5539377734092 + ], + "25": [ + 365.886266100612, + 563.0765916480547 + ], + "33": [ + 335.0203701162135, + 565.9066956483119 + ], + "41": [ + 288.7813629793727, + 577.2661437878556 + ], + "49": [ + 234.01746438799717, + 585.8671777176596 + ], + "57": [ + 154.29892888119105, + 601.3841283800053 + ], + "65": [ + 38.48416777322586, + 624.0344854844193 + ] + }, + "mean_error_pixels": 5.788466686878544, + "max_error_pixels": 8.983801918173235 + }, + "feature_73": { + "xyz": [ + -9.745717346308233, + 22.42103043636557, + 1.4470466617966313 + ], + "observations": { + "1": [ + 451.0, + 539.0 + ], + "9": [ + 434.7498474121094, + 540.1424560546875 + ], + "17": [ + 414.4917907714844, + 542.808837890625 + ], + "25": [ + 387.4115905761719, + 544.0657348632812 + ], + "33": [ + 352.3484191894531, + 545.446533203125 + ], + "41": [ + 311.28680419921875, + 553.0447998046875 + ], + "49": [ + 255.2911834716797, + 557.6790771484375 + ], + "57": [ + 182.05532836914062, + 567.3294067382812 + ], + "65": [ + 84.02801513671875, + 578.5353393554688 + ] + }, + "projections": { + "1": [ + 446.69328956184165, + 538.8640938321046 + ], + "9": [ + 430.94370136759335, + 539.9179019363052 + ], + "17": [ + 410.0502789505325, + 542.8228333528638 + ], + "25": [ + 385.5727334289936, + 543.540693291884 + ], + "33": [ + 356.4017886796731, + 544.1212041345061 + ], + "41": [ + 313.18804088288044, + 552.1367108979421 + ], + "49": [ + 261.809369166963, + 556.9558797149508 + ], + "57": [ + 187.03292303162812, + 566.9430344949687 + ], + "65": [ + 78.55989519826744, + 581.6486435361533 + ] + }, + "mean_error_pixels": 4.2988950828004455, + "max_error_pixels": 6.558182620665398 + }, + "feature_118": { + "xyz": [ + -21.381099300079303, + 49.31965666236786, + 3.934128306165265 + ], + "observations": { + "1": [ + 483.0, + 516.0 + ], + "9": [ + 473.6402282714844, + 515.5115966796875 + ], + "17": [ + 460.7416076660156, + 516.2073974609375 + ], + "25": [ + 443.39459228515625, + 514.4896850585938 + ], + "33": [ + 420.3373718261719, + 511.5028076171875 + ], + "41": [ + 398.3775329589844, + 514.6508178710938 + ], + "49": [ + 384.6920166015625, + 513.4697265625 + ], + "57": [ + 374.79840087890625, + 514.925048828125 + ], + "65": [ + 364.1363830566406, + 517.4613037109375 + ], + "73": [ + 352.35418701171875, + 516.28076171875 + ], + "81": [ + 340.205322265625, + 518.8330078125 + ], + "89": [ + 327.840087890625, + 517.9929809570312 + ], + "97": [ + 313.4815979003906, + 515.5008544921875 + ], + "105": [ + 298.3309631347656, + 518.5892944335938 + ] + }, + "projections": { + "1": [ + 448.7657965064801, + 518.3372963081401 + ], + "9": [ + 443.6838417291964, + 517.3223389664777 + ], + "17": [ + 437.05073218971137, + 517.7399284137829 + ], + "25": [ + 428.8665906429229, + 515.6964339558259 + ], + "33": [ + 419.5776733295646, + 512.5518619875005 + ], + "41": [ + 408.96015543939427, + 515.0954724733322 + ], + "49": [ + 398.9109180312654, + 513.835691774844 + ], + "57": [ + 386.74941576610973, + 514.9041591325139 + ], + "65": [ + 373.9895047241781, + 517.5264176548659 + ], + "73": [ + 360.0736349016765, + 516.0426186010508 + ], + "81": [ + 343.80943829669985, + 518.5785670247423 + ], + "89": [ + 327.80672417096696, + 517.3836643273848 + ], + "97": [ + 309.76341852981085, + 513.9446446815633 + ], + "105": [ + 287.2643208510232, + 515.1983411318023 + ] + }, + "mean_error_pixels": 12.722158893598701, + "max_error_pixels": 34.31389868359138 + }, + "feature_141": { + "xyz": [ + -9.17185539967833, + 23.601448878437747, + 2.1250016369154565 + ], + "observations": { + "1": [ + 473.0, + 529.0 + ], + "9": [ + 459.5030212402344, + 528.832275390625 + ], + "17": [ + 442.4862060546875, + 530.8295288085938 + ], + "25": [ + 419.18670654296875, + 530.2857666015625 + ], + "33": [ + 389.2955627441406, + 528.2664184570312 + ], + "41": [ + 355.8277893066406, + 531.2675170898438 + ], + "49": [ + 313.8809509277344, + 532.1879272460938 + ], + "57": [ + 254.19155883789062, + 537.69775390625 + ], + "65": [ + 179.15347290039062, + 542.7819213867188 + ], + "73": [ + 118.84210205078125, + 551.7826538085938 + ] + }, + "projections": { + "1": [ + 465.79963247183343, + 527.6218991700146 + ], + "9": [ + 452.79558634628427, + 527.6029241506238 + ], + "17": [ + 435.6363970488188, + 529.2280585844007 + ], + "25": [ + 415.4343708908726, + 528.4341869563431 + ], + "33": [ + 391.4598631952732, + 526.9534639895688 + ], + "41": [ + 357.16005725013315, + 531.9863456256298 + ], + "49": [ + 317.4605088064475, + 533.4047760636352 + ], + "57": [ + 261.63309896772705, + 538.2635337543484 + ], + "65": [ + 184.88500667467963, + 545.5447354069531 + ], + "73": [ + 70.6443499190558, + 551.1425106447933 + ] + }, + "mean_error_pixels": 9.522271438700239, + "max_error_pixels": 48.20200300632128 + }, + "feature_164": { + "xyz": [ + -10.235065829516923, + 25.83608298971255, + 2.9549737665616957 + ], + "observations": { + "1": [ + 466.0, + 517.0 + ], + "9": [ + 452.8934326171875, + 516.212646484375 + ], + "17": [ + 436.3958740234375, + 516.712646484375 + ], + "25": [ + 414.40325927734375, + 514.5435791015625 + ], + "33": [ + 386.62640380859375, + 511.4383850097656 + ], + "41": [ + 359.9572448730469, + 513.0645751953125 + ], + "49": [ + 340.9840393066406, + 511.170654296875 + ], + "57": [ + 303.2931823730469, + 513.329345703125 + ], + "65": [ + 244.8655242919922, + 515.552734375 + ], + "73": [ + 162.6346435546875, + 512.36083984375 + ], + "81": [ + 50.72128677368164, + 513.795166015625 + ] + }, + "projections": { + "1": [ + 463.6634588419696, + 516.0705134070877 + ], + "9": [ + 452.02941646326985, + 515.0382168429691 + ], + "17": [ + 436.9216452543378, + 515.4135894453298 + ], + "25": [ + 419.1390135799242, + 513.287389740512 + ], + "33": [ + 398.18161641912906, + 510.2216477363182 + ], + "41": [ + 369.56577480839724, + 512.8742873691234 + ], + "49": [ + 337.7093391728763, + 511.59384839398297 + ], + "57": [ + 294.8428633167835, + 512.6713099984537 + ], + "65": [ + 239.81866124356117, + 514.888883564939 + ], + "73": [ + 164.36358165907342, + 512.9904394651304 + ], + "81": [ + 51.237640982469316, + 516.8111669332887 + ] + }, + "mean_error_pixels": 4.842833268578775, + "max_error_pixels": 11.619095836908762 + }, + "feature_179": { + "xyz": [ + -10.530007517344144, + 22.45306014150578, + 1.2475757594453663 + ], + "observations": { + "1": [ + 433.0, + 541.0 + ], + "9": [ + 414.8622741699219, + 542.7109985351562 + ], + "17": [ + 392.62530517578125, + 546.360595703125 + ], + "25": [ + 367.7801818847656, + 548.5661010742188 + ], + "33": [ + 335.394287109375, + 551.1338500976562 + ] + }, + "projections": { + "1": [ + 432.6867637723919, + 542.3534594548803 + ], + "9": [ + 415.6484385107624, + 543.7032808079271 + ], + "17": [ + 393.0997349394758, + 546.9289366130665 + ], + "25": [ + 366.7969558669551, + 548.0742820919129 + ], + "33": [ + 335.50091745751536, + 549.3218711066643 + ] + }, + "mean_error_pixels": 1.262004627047612, + "max_error_pixels": 1.815113741598809 + }, + "feature_189": { + "xyz": [ + -26.941091656516384, + 50.1072421376411, + 4.3717461239464415 + ], + "observations": { + "1": [ + 449.0, + 514.0 + ], + "9": [ + 440.5047912597656, + 512.5718994140625 + ], + "17": [ + 427.90765380859375, + 512.153076171875 + ], + "25": [ + 409.42388916015625, + 509.6680603027344 + ], + "33": [ + 386.5289306640625, + 505.89288330078125 + ], + "41": [ + 367.03558349609375, + 507.43792724609375 + ], + "49": [ + 345.6221618652344, + 506.2715148925781 + ], + "57": [ + 313.1564025878906, + 508.43414306640625 + ], + "65": [ + 294.15045166015625, + 512.47119140625 + ], + "73": [ + 276.6644592285156, + 510.7812805175781 + ], + "81": [ + 251.01898193359375, + 514.8050537109375 + ], + "89": [ + 236.2827606201172, + 513.68408203125 + ], + "97": [ + 221.26272583007812, + 509.78448486328125 + ], + "105": [ + 204.6089324951172, + 510.3995056152344 + ], + "113": [ + 185.59765625, + 508.81298828125 + ], + "121": [ + 164.457763671875, + 510.3230895996094 + ], + "128": [ + 145.3196258544922, + 509.6761169433594 + ] + }, + "projections": { + "1": [ + 407.6068968575586, + 515.1186552081401 + ], + "9": [ + 401.2319814933941, + 513.9150651851206 + ], + "17": [ + 393.1290466407121, + 513.974217447497 + ], + "25": [ + 383.32199566389113, + 511.77000568456594 + ], + "33": [ + 372.1939272050182, + 508.83396554152523 + ], + "41": [ + 359.4595393304433, + 511.29503944288905 + ], + "49": [ + 347.4257990098848, + 509.75280641131843 + ], + "57": [ + 332.93856776366636, + 510.55086913367586 + ], + "65": [ + 317.8023803317938, + 512.7112526581363 + ], + "73": [ + 301.28062622430963, + 510.8418767088702 + ], + "81": [ + 281.9680292888437, + 513.3715205941667 + ], + "89": [ + 263.00931282178493, + 512.066443101637 + ], + "97": [ + 241.84822281498168, + 508.0416951649396 + ], + "105": [ + 215.58084808289505, + 508.74214791828956 + ], + "113": [ + 184.5751273527739, + 507.2727618099622 + ], + "121": [ + 147.70149846680863, + 508.8557240392617 + ], + "128": [ + 115.65155343686979, + 508.9239820102703 + ] + }, + "mean_error_pixels": 22.046873307851822, + "max_error_pixels": 41.408216301061465 + }, + "feature_222": { + "xyz": [ + -9.293500409973266, + 23.1416198055647, + 1.3589721348093768 + ], + "observations": { + "1": [ + 469.0, + 541.0 + ], + "9": [ + 455.0341796875, + 541.8815307617188 + ], + "17": [ + 436.7648620605469, + 544.9429321289062 + ], + "25": [ + 411.6676330566406, + 545.88720703125 + ], + "33": [ + 379.3047180175781, + 546.7969360351562 + ], + "41": [ + 340.7491760253906, + 555.21728515625 + ], + "49": [ + 291.2837219238281, + 558.4052124023438 + ], + "57": [ + 226.6394805908203, + 567.9657592773438 + ], + "65": [ + 140.79454040527344, + 580.64111328125 + ], + "73": [ + 21.249683380126953, + 596.2964477539062 + ] + }, + "projections": { + "1": [ + 459.7458529476912, + 540.2901330456187 + ], + "9": [ + 445.7768144472981, + 541.4172258438449 + ], + "17": [ + 427.23088860343387, + 544.4559630464968 + ], + "25": [ + 405.5394076653233, + 545.2162763084964 + ], + "33": [ + 379.9208932983451, + 545.6236361069327 + ], + "41": [ + 342.45583458930287, + 553.4998763576432 + ], + "49": [ + 298.6231912947859, + 558.1846490685913 + ], + "57": [ + 236.03015597220474, + 567.762895797657 + ], + "65": [ + 147.78403107804388, + 581.7410442452599 + ], + "73": [ + 13.1549500384142, + 597.731821537914 + ] + }, + "mean_error_pixels": 7.004019802018453, + "max_error_pixels": 9.546401875479475 + }, + "feature_233": { + "xyz": [ + -12.18564840743272, + 23.38154597928908, + 0.9395511197308821 + ], + "observations": { + "1": [ + 414.0, + 545.0 + ], + "9": [ + 395.34088134765625, + 546.9779052734375 + ], + "17": [ + 372.56341552734375, + 550.5355834960938 + ], + "25": [ + 343.6201477050781, + 553.1769409179688 + ], + "33": [ + 306.5524597167969, + 556.663330078125 + ], + "41": [ + 259.27130126953125, + 566.0368041992188 + ], + "49": [ + 199.33250427246094, + 572.7672119140625 + ], + "57": [ + 124.80342102050781, + 584.8910522460938 + ], + "65": [ + 29.229103088378906, + 600.4054565429688 + ] + }, + "projections": { + "1": [ + 411.2091785123306, + 547.3697566758889 + ], + "9": [ + 393.1065674920114, + 549.0139714405115 + ], + "17": [ + 369.34391139287624, + 552.5177755952761 + ], + "25": [ + 341.92154057861234, + 554.0511048545418 + ], + "33": [ + 309.65027591242693, + 555.9173510797089 + ], + "41": [ + 262.1397697393264, + 565.4393528899221 + ], + "49": [ + 206.75059927451855, + 571.6386791912313 + ], + "57": [ + 127.6282845711097, + 583.5104495473313 + ], + "65": [ + 16.158595643423723, + 600.3211531201446 + ] + }, + "mean_error_pixels": 4.6900012523717685, + "max_error_pixels": 13.070779316311967 + }, + "feature_234": { + "xyz": [ + -9.552058023957903, + 22.45620469168287, + 0.47554329975213494 + ], + "observations": { + "1": [ + 453.0, + 555.0 + ], + "9": [ + 437.1142883300781, + 557.7767944335938 + ], + "17": [ + 417.2198181152344, + 562.7786865234375 + ], + "25": [ + 390.5256042480469, + 566.2493896484375 + ], + "33": [ + 356.150146484375, + 570.4324951171875 + ], + "41": [ + 313.74847412109375, + 582.1493530273438 + ], + "49": [ + 258.585693359375, + 592.0498657226562 + ], + "57": [ + 185.2819061279297, + 608.9874267578125 + ], + "65": [ + 87.06477355957031, + 630.4608764648438 + ] + }, + "projections": { + "1": [ + 449.0840189514946, + 555.886398536837 + ], + "9": [ + 433.45599201346664, + 558.5298604828735 + ], + "17": [ + 412.55669123013786, + 563.46132735955 + ], + "25": [ + 388.2614707853114, + 566.3410930914157 + ], + "33": [ + 359.6412209557135, + 569.3880292615603 + ], + "41": [ + 316.5586485780905, + 581.3465457910324 + ], + "49": [ + 265.2872801896127, + 590.8264315566463 + ], + "57": [ + 190.26712969952467, + 607.6494855221106 + ], + "65": [ + 80.27716034285777, + 632.5317447604549 + ] + }, + "mean_error_pixels": 4.485101532756132, + "max_error_pixels": 7.096491293411007 + }, + "feature_279": { + "xyz": [ + -11.95048739300913, + 23.383815321800682, + 0.3659123332087131 + ], + "observations": { + "1": [ + 419.0, + 557.0 + ], + "9": [ + 400.4272766113281, + 559.69970703125 + ], + "17": [ + 377.81787109375, + 564.1937866210938 + ], + "25": [ + 348.7873229980469, + 567.6510620117188 + ], + "33": [ + 310.0450134277344, + 571.6647338867188 + ], + "41": [ + 262.8382568359375, + 582.7440185546875 + ], + "49": [ + 203.39642333984375, + 591.2234497070312 + ], + "57": [ + 128.0965576171875, + 606.2428588867188 + ], + "65": [ + 29.894895553588867, + 624.0651245117188 + ] + }, + "projections": { + "1": [ + 414.40868762776836, + 557.1119865178771 + ], + "9": [ + 396.50769043685966, + 559.6326020810953 + ], + "17": [ + 372.8974564572368, + 564.2567928168598 + ], + "25": [ + 345.76353776636626, + 566.9669674031122 + ], + "33": [ + 314.03391373700606, + 570.1421291815082 + ], + "41": [ + 266.8830462945454, + 581.7649687870422 + ], + "49": [ + 211.8818461356043, + 590.4116194070106 + ], + "57": [ + 133.05757028193693, + 605.8083275143782 + ], + "65": [ + 21.3062460127245, + 627.7337151783024 + ] + }, + "mean_error_pixels": 5.312066577992072, + "max_error_pixels": 9.33934999958426 + }, + "feature_283": { + "xyz": [ + -9.784734616429734, + 23.62262194654536, + 2.3340409246207505 + ], + "observations": { + "1": [ + 459.0, + 527.0 + ], + "9": [ + 444.93182373046875, + 526.8642578125 + ], + "17": [ + 427.41986083984375, + 528.2420654296875 + ], + "25": [ + 404.4678649902344, + 526.1802368164062 + ], + "33": [ + 374.5221252441406, + 523.8699951171875 + ], + "41": [ + 340.69427490234375, + 526.0284423828125 + ], + "49": [ + 298.37774658203125, + 525.7967529296875 + ], + "57": [ + 236.92662048339844, + 530.5911254882812 + ], + "65": [ + 155.3740692138672, + 535.248291015625 + ], + "73": [ + 43.390830993652344, + 537.377197265625 + ] + }, + "projections": { + "1": [ + 455.9465965897542, + 524.1942200175677 + ], + "9": [ + 442.1303819511379, + 523.8594706037579 + ], + "17": [ + 423.99544358148955, + 525.0538875215682 + ], + "25": [ + 402.6740776569724, + 523.8534964508242 + ], + "33": [ + 377.31247157974326, + 522.0193780076869 + ], + "41": [ + 341.1190668421724, + 526.399355679104 + ], + "49": [ + 299.24662868992476, + 526.992045014517 + ], + "57": [ + 240.432784330488, + 530.7190526721278 + ], + "65": [ + 159.77154364224293, + 536.3508641466307 + ], + "73": [ + 39.663297247138644, + 539.573138330914 + ] + }, + "mean_error_pixels": 3.362990939177976, + "max_error_pixels": 4.678793854524275 + }, + "feature_343": { + "xyz": [ + -8.798196370283364, + 22.71556252842012, + 0.22532996206500866 + ], + "observations": { + "1": [ + 470.0, + 561.0 + ], + "9": [ + 455.2610778808594, + 563.9058227539062 + ], + "17": [ + 436.5084228515625, + 568.93994140625 + ], + "25": [ + 411.9832458496094, + 572.771484375 + ], + "33": [ + 380.0935974121094, + 576.601806640625 + ], + "41": [ + 341.71563720703125, + 588.4218139648438 + ], + "49": [ + 292.5811462402344, + 598.18505859375 + ], + "57": [ + 226.8959503173828, + 615.1868896484375 + ], + "65": [ + 139.92172241210938, + 638.4476318359375 + ] + }, + "projections": { + "1": [ + 464.0063133887446, + 559.9814674384496 + ], + "9": [ + 449.9433250403918, + 562.9826611318763 + ], + "17": [ + 431.0295297319783, + 568.4182418028399 + ], + "25": [ + 409.04973298150173, + 571.7265800174189 + ], + "33": [ + 383.34038385793735, + 575.0421398040182 + ], + "41": [ + 344.7039618315627, + 587.6112557536261 + ], + "49": [ + 298.98253712787374, + 597.861635919623 + ], + "57": [ + 232.52688034405122, + 615.6424556241421 + ], + "65": [ + 135.9705731500017, + 641.8747090957268 + ] + }, + "mean_error_pixels": 4.89801368296472, + "max_error_pixels": 6.40955595361268 + }, + "feature_5": { + "xyz": [ + 10.401715207142567, + 13.572010344242237, + 1.432601948825346 + ], + "observations": { + "1": [ + 890.0, + 540.0 + ], + "9": [ + 932.1524658203125, + 543.8360595703125 + ], + "17": [ + 986.7321166992188, + 552.8622436523438 + ], + "25": [ + 1056.60986328125, + 558.5870361328125 + ], + "33": [ + 1151.8387451171875, + 559.4164428710938 + ] + }, + "projections": { + "1": [ + 889.0704837133853, + 540.193221566914 + ], + "9": [ + 931.0351334618547, + 543.8867167260535 + ], + "17": [ + 988.6635846100933, + 552.7276754817533 + ], + "25": [ + 1057.412751514566, + 558.2535836049822 + ], + "33": [ + 1151.108416286092, + 559.6496536629318 + ] + }, + "mean_error_pixels": 1.1280111828668562, + "max_error_pixels": 1.9361500156945566 + }, + "feature_27": { + "xyz": [ + 11.45098975230415, + 15.956258823488584, + 1.6482448204872064 + ], + "observations": { + "1": [ + 870.0, + 534.0 + ], + "9": [ + 906.3270874023438, + 536.6963500976562 + ], + "17": [ + 948.7317504882812, + 544.0468139648438 + ], + "25": [ + 994.3228149414062, + 546.31005859375 + ], + "33": [ + 1052.7745361328125, + 543.42236328125 + ] + }, + "projections": { + "1": [ + 871.9221958565587, + 534.8440542838312 + ], + "9": [ + 904.9909605589427, + 537.1067264015999 + ], + "17": [ + 947.7684441392923, + 543.5556318766347 + ], + "25": [ + 994.7416470473952, + 545.9656309529228 + ], + "33": [ + 1052.9754825139084, + 543.3566121997906 + ] + }, + "mean_error_pixels": 1.0664150778972066, + "max_error_pixels": 2.099348600167469 + }, + "feature_32": { + "xyz": [ + 10.369121044786528, + 15.860445059930653, + 2.0375978348938935 + ], + "observations": { + "1": [ + 849.0, + 523.0 + ], + "9": [ + 878.5810546875, + 524.1605224609375 + ], + "17": [ + 915.9013061523438, + 530.1353149414062 + ], + "25": [ + 963.0665283203125, + 531.7294921875 + ], + "33": [ + 1022.6788940429688, + 529.4323120117188 + ], + "41": [ + 1110.8033447265625, + 536.6965942382812 + ] + }, + "projections": { + "1": [ + 849.2493462957914, + 525.9524708449966 + ], + "9": [ + 879.4181702796357, + 526.9960694706425 + ], + "17": [ + 918.3856726408262, + 531.7159654287811 + ], + "25": [ + 961.2586292574122, + 532.3174529103401 + ], + "33": [ + 1014.6629849432209, + 527.7866831963017 + ], + "41": [ + 1112.7246372458656, + 533.830748961718 + ] + }, + "mean_error_pixels": 3.733093596108881, + "max_error_pixels": 8.183085780654617 + }, + "feature_62": { + "xyz": [ + 11.40506722920577, + 13.615626165815904, + 1.431903194739286 + ], + "observations": { + "1": [ + 915.0, + 540.0 + ], + "9": [ + 959.942626953125, + 543.5140380859375 + ], + "17": [ + 1018.41455078125, + 552.514892578125 + ], + "25": [ + 1094.6934814453125, + 557.9375610351562 + ], + "33": [ + 1197.463623046875, + 560.1787719726562 + ] + }, + "projections": { + "1": [ + 913.1968962221188, + 540.18759655452 + ], + "9": [ + 958.7855056565884, + 543.9020119583506 + ], + "17": [ + 1021.3714154366598, + 552.8650092424344 + ], + "25": [ + 1095.772580299168, + 558.3432869843024 + ], + "33": [ + 1196.5154520700903, + 559.2462732953934 + ] + }, + "mean_error_pixels": 1.6987042705206559, + "max_error_pixels": 2.9775208259622885 + }, + "feature_69": { + "xyz": [ + 11.703444014714204, + 13.958869374259743, + 0.6760911417636344 + ], + "observations": { + "1": [ + 918.0, + 559.0 + ], + "9": [ + 962.2476196289062, + 565.706787109375 + ], + "17": [ + 1019.024658203125, + 579.151123046875 + ], + "25": [ + 1092.8614501953125, + 589.6774291992188 + ], + "33": [ + 1192.2833251953125, + 598.533447265625 + ] + }, + "projections": { + "1": [ + 915.6408668058655, + 559.753912797014 + ], + "9": [ + 960.7360825004112, + 566.4408691044274 + ], + "17": [ + 1022.3007577699425, + 579.5599978430527 + ], + "25": [ + 1094.616042801571, + 589.9016993752119 + ], + "33": [ + 1191.1266505459625, + 597.1427317429533 + ] + }, + "mean_error_pixels": 2.207255956340491, + "max_error_pixels": 3.301515859518334 + }, + "feature_83": { + "xyz": [ + 10.016433471916091, + 14.684052333478785, + 0.2444911875561735 + ], + "observations": { + "1": [ + 861.0, + 569.0 + ], + "9": [ + 896.8580322265625, + 576.62841796875 + ], + "17": [ + 943.030517578125, + 590.7696533203125 + ], + "25": [ + 1003.5988159179688, + 603.5724487304688 + ], + "33": [ + 1087.0211181640625, + 616.3148193359375 + ], + "41": [ + 1208.4114990234375, + 647.4694213867188 + ] + }, + "projections": { + "1": [ + 862.8947456252729, + 569.7372765545699 + ], + "9": [ + 898.0824472769291, + 577.469719402 + ], + "17": [ + 945.1517902072865, + 591.6561232699106 + ], + "25": [ + 999.1777045559977, + 603.3770368475116 + ], + "33": [ + 1069.773515055981, + 612.9979420278746 + ], + "41": [ + 1210.513870637344, + 648.1515700918551 + ] + }, + "mean_error_pixels": 5.00285229286537, + "max_error_pixels": 17.563641081809955 + }, + "feature_108": { + "xyz": [ + 9.65614369746925, + 13.30889740115065, + 0.676377440846186 + ], + "observations": { + "1": [ + 879.0, + 562.0 + ], + "9": [ + 919.66015625, + 568.7604370117188 + ], + "17": [ + 972.1539916992188, + 582.1739501953125 + ], + "25": [ + 1043.643798828125, + 593.7825927734375 + ], + "33": [ + 1142.873779296875, + 604.8052368164062 + ] + }, + "projections": { + "1": [ + 877.1279078753715, + 561.0378189093293 + ], + "9": [ + 918.3923651953869, + 568.2841896145505 + ], + "17": [ + 975.7022687243243, + 582.2661963440999 + ], + "25": [ + 1045.0938480304126, + 594.3184087349845 + ], + "33": [ + 1141.5747274172807, + 605.0066794485273 + ] + }, + "mean_error_pixels": 1.9738209160122122, + "max_error_pixels": 3.5494759048144107 + }, + "feature_111": { + "xyz": [ + 12.460515874691897, + 14.061172754783492, + 1.4442265188212569 + ], + "observations": { + "1": [ + 932.0, + 541.0 + ], + "9": [ + 976.8059692382812, + 544.1072998046875 + ], + "17": [ + 1035.409423828125, + 552.2792358398438 + ], + "25": [ + 1110.744873046875, + 556.4590454101562 + ], + "33": [ + 1211.393310546875, + 555.7357177734375 + ] + }, + "projections": { + "1": [ + 929.4556655226993, + 539.7649855613191 + ], + "9": [ + 975.9400991282087, + 543.2928720226608 + ], + "17": [ + 1039.003955773456, + 551.9742951553524 + ], + "25": [ + 1112.5601392093627, + 556.8804153142062 + ], + "33": [ + 1209.7701458226966, + 556.6785631084651 + ] + }, + "mean_error_pixels": 2.2730087315486256, + "max_error_pixels": 3.607443516822313 + }, + "feature_161": { + "xyz": [ + 10.326368803124637, + 13.515399491415835, + 0.7316026891265641 + ], + "observations": { + "1": [ + 892.0, + 558.0 + ], + "9": [ + 934.5252685546875, + 564.7433471679688 + ], + "17": [ + 989.2821044921875, + 578.3794555664062 + ], + "25": [ + 1060.8193359375, + 590.1461791992188 + ], + "33": [ + 1159.70458984375, + 601.416259765625 + ] + }, + "projections": { + "1": [ + 890.1805656884179, + 559.108198812835 + ], + "9": [ + 932.8142252825257, + 565.9186232355164 + ], + "17": [ + 991.6799573134867, + 579.2507580172567 + ], + "25": [ + 1062.2318489463212, + 590.27683787799 + ], + "33": [ + 1158.9533612196778, + 599.1581645267656 + ] + }, + "mean_error_pixels": 2.1111460576504557, + "max_error_pixels": 2.551247952173729 + }, + "feature_165": { + "xyz": [ + 11.843399727221945, + 14.409715501303898, + 0.20383938057879347 + ], + "observations": { + "1": [ + 914.0, + 572.0 + ], + "9": [ + 956.5632934570312, + 579.4005737304688 + ], + "17": [ + 1007.5718383789062, + 593.4551391601562 + ], + "25": [ + 1076.148193359375, + 605.6729736328125 + ], + "33": [ + 1170.5911865234375, + 617.9508666992188 + ] + }, + "projections": { + "1": [ + 911.2617175972257, + 571.1101806976185 + ], + "9": [ + 954.3889028920112, + 579.2922636153098 + ], + "17": [ + 1012.6891413896633, + 594.3812137953113 + ], + "25": [ + 1080.0979953527208, + 606.886120278833 + ], + "33": [ + 1168.4411536264652, + 616.8015931943612 + ] + }, + "mean_error_pixels": 3.365314333398429, + "max_error_pixels": 5.200423476389265 + }, + "feature_193": { + "xyz": [ + 12.501125667396309, + 14.162823364749562, + 0.8638891264003197 + ], + "observations": { + "1": [ + 933.0, + 555.0 + ], + "9": [ + 978.0617065429688, + 560.39111328125 + ], + "17": [ + 1035.1885986328125, + 570.9076538085938 + ], + "25": [ + 1110.221923828125, + 580.0338134765625 + ], + "33": [ + 1211.3992919921875, + 586.603759765625 + ] + }, + "projections": { + "1": [ + 930.0217968154856, + 554.536668351355 + ], + "9": [ + 976.4956870225733, + 560.3158522331998 + ], + "17": [ + 1039.5636465405012, + 572.1489145690954 + ], + "25": [ + 1112.937106812985, + 580.7604461856533 + ], + "33": [ + 1209.6252050678827, + 585.3852226611516 + ] + }, + "mean_error_pixels": 2.8185136117285956, + "max_error_pixels": 4.547721679053378 + }, + "feature_226": { + "xyz": [ + 12.769646869023022, + 14.582805472457725, + -0.06778445146523615 + ], + "observations": { + "1": [ + 933.0, + 577.0 + ], + "9": [ + 977.4002685546875, + 585.9940185546875 + ], + "17": [ + 1034.11767578125, + 602.3037109375 + ], + "25": [ + 1104.7193603515625, + 616.4993286132812 + ], + "33": [ + 1200.4796142578125, + 628.7858276367188 + ] + }, + "projections": { + "1": [ + 930.3307631077178, + 577.4587692760499 + ], + "9": [ + 975.8167097449702, + 586.5217693451127 + ], + "17": [ + 1037.1641017240663, + 602.8739705973846 + ], + "25": [ + 1107.5757375775795, + 616.6082065066925 + ], + "33": [ + 1198.920177779864, + 627.6583330772195 + ] + }, + "mean_error_pixels": 2.451938392573289, + "max_error_pixels": 3.099339785302026 + }, + "feature_288": { + "xyz": [ + 11.797672551810905, + 14.051960682499955, + 2.003736817621135 + ], + "observations": { + "1": [ + 913.0, + 523.0 + ], + "9": [ + 957.0250854492188, + 525.1795043945312 + ], + "17": [ + 1011.5255737304688, + 531.875 + ], + "25": [ + 1084.4713134765625, + 533.4840698242188 + ], + "33": [ + 1175.2862548828125, + 532.3221435546875 + ] + }, + "projections": { + "1": [ + 912.2109691099799, + 525.5325825554927 + ], + "9": [ + 955.8964448961724, + 526.843059679431 + ], + "17": [ + 1014.9816075164275, + 532.3470981680683 + ], + "25": [ + 1083.9184326488967, + 533.5932961538633 + ], + "33": [ + 1175.1564197396342, + 528.8446539624667 + ] + }, + "mean_error_pixels": 2.4389084355622392, + "max_error_pixels": 3.4881293281617234 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/ground_camera_fit.json b/astra_scene_test/Scene_04/reference/ground_camera_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..50c71e8fb9a4d3842ab48fa69f0d4c964f39ebbd --- /dev/null +++ b/astra_scene_test/Scene_04/reference/ground_camera_fit.json @@ -0,0 +1,40 @@ +{ + "pitch": 4.726014521736058, + "camera_height": 2.966445669913508, + "lamp_base_targets": { + "1": [ + 519, + 541 + ], + "65": [ + 477, + 545 + ], + "128": [ + 340, + 555 + ] + }, + "predictions": { + "1": [ + 518.9255328375992, + 534.7597792851368 + ], + "65": [ + 469.0404955020731, + 541.8691616745809 + ], + "128": [ + 343.01387000988615, + 559.2713030525597 + ] + }, + "residuals": [ + -0.07446716240076512, + -6.240220714863199, + -7.9595044979269005, + -3.130838325419063, + 3.0138700098861477, + 4.271303052559688 + ] +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/ground_tracks_fit.json b/astra_scene_test/Scene_04/reference/ground_tracks_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..9b59b1657985a9becbef6c5476917034702f9c6c --- /dev/null +++ b/astra_scene_test/Scene_04/reference/ground_tracks_fit.json @@ -0,0 +1,2794 @@ +[ + { + "id": 0, + "xyz": [ + -22.565122072526318, + 46.62576968074306, + -0.947929598738695 + ], + "first_frame": 65, + "mean_error": 4.313831909263332, + "observations": { + "65": [ + 347.787109375, + 543.9345703125 + ], + "69": [ + 336.833984375, + 545.5015869140625 + ], + "73": [ + 322.2336120605469, + 548.317138671875 + ], + "77": [ + 308.6590881347656, + 554.1552124023438 + ], + "81": [ + 294.7225341796875, + 558.8268432617188 + ], + "85": [ + 284.515869140625, + 560.3363647460938 + ], + "89": [ + 273.4637145996094, + 560.6739501953125 + ], + "93": [ + 261.71881103515625, + 560.2540283203125 + ], + "97": [ + 248.69235229492188, + 560.5399169921875 + ], + "101": [ + 234.697265625, + 563.389892578125 + ], + "105": [ + 219.67337036132812, + 565.92822265625 + ], + "109": [ + 202.92176818847656, + 567.5467529296875 + ], + "113": [ + 185.28749084472656, + 569.5127563476562 + ], + "117": [ + 165.82879638671875, + 572.9268798828125 + ], + "121": [ + 145.4898223876953, + 576.8447265625 + ], + "125": [ + 124.43016815185547, + 579.5556030273438 + ] + } + }, + { + "id": 1, + "xyz": [ + 18.723966213333103, + 38.67251158647287, + 0.40438220680132975 + ], + "first_frame": 107, + "mean_error": 0.48390819744020486, + "observations": { + "107": [ + 1029.96435546875, + 562.5318603515625 + ], + "111": [ + 1051.2567138671875, + 565.4083862304688 + ], + "115": [ + 1073.6064453125, + 569.1061401367188 + ], + "119": [ + 1097.7640380859375, + 573.1621704101562 + ], + "123": [ + 1124.955078125, + 576.9346923828125 + ], + "127": [ + 1155.794189453125, + 580.1441040039062 + ] + } + }, + { + "id": 3, + "xyz": [ + -19.07572720595024, + 43.82824866401423, + -1.4123083749905259 + ], + "first_frame": 77, + "mean_error": 2.502774682444302, + "observations": { + "77": [ + 315.746826171875, + 568.4121704101562 + ], + "81": [ + 312.3748779296875, + 571.9600219726562 + ], + "85": [ + 305.460693359375, + 573.6370849609375 + ], + "89": [ + 296.3066101074219, + 574.290283203125 + ], + "93": [ + 282.27191162109375, + 574.3527221679688 + ], + "97": [ + 267.051025390625, + 575.3948364257812 + ], + "101": [ + 250.80018615722656, + 578.7013549804688 + ], + "105": [ + 232.278564453125, + 582.0795288085938 + ], + "109": [ + 211.7564239501953, + 584.9005737304688 + ], + "113": [ + 189.89219665527344, + 588.1817016601562 + ], + "117": [ + 165.91908264160156, + 592.8010864257812 + ], + "121": [ + 142.88043212890625, + 598.1405029296875 + ], + "125": [ + 120.89911651611328, + 602.3465576171875 + ] + } + }, + { + "id": 4, + "xyz": [ + -19.014276683759903, + 42.06507429685914, + -1.4723383232944665 + ], + "first_frame": 83, + "mean_error": 1.0643649960700614, + "observations": { + "83": [ + 284.0224914550781, + 580.0450439453125 + ], + "87": [ + 273.11358642578125, + 581.39111328125 + ], + "91": [ + 258.260986328125, + 581.9945678710938 + ], + "95": [ + 243.56715393066406, + 582.7080688476562 + ], + "99": [ + 226.59007263183594, + 585.661865234375 + ], + "103": [ + 205.87806701660156, + 590.03125 + ], + "107": [ + 184.92926025390625, + 593.4341430664062 + ], + "111": [ + 159.1940460205078, + 596.6100463867188 + ], + "115": [ + 131.72772216796875, + 600.4990844726562 + ], + "119": [ + 101.6380386352539, + 606.5394287109375 + ], + "123": [ + 70.36128997802734, + 612.0038452148438 + ], + "127": [ + 36.78968048095703, + 618.0877075195312 + ] + } + }, + { + "id": 5, + "xyz": [ + 16.77991195120563, + 42.96647496583244, + -0.16669542077123922 + ], + "first_frame": 65, + "mean_error": 2.7291665297043366, + "observations": { + "65": [ + 810.9480590820312, + 549.2361450195312 + ], + "69": [ + 820.7054443359375, + 549.3394775390625 + ], + "73": [ + 831.4295043945312, + 550.0914306640625 + ], + "77": [ + 841.9223022460938, + 551.59228515625 + ], + "81": [ + 847.9094848632812, + 552.3490600585938 + ], + "85": [ + 856.0639038085938, + 552.1538696289062 + ], + "89": [ + 865.5806884765625, + 551.6083374023438 + ], + "93": [ + 873.41845703125, + 550.8474731445312 + ], + "97": [ + 880.2575073242188, + 552.3397827148438 + ], + "101": [ + 891.2372436523438, + 555.37109375 + ], + "105": [ + 901.3931274414062, + 559.258056640625 + ], + "109": [ + 912.41162109375, + 561.7393798828125 + ], + "113": [ + 923.8578491210938, + 564.2930297851562 + ], + "117": [ + 935.6256713867188, + 568.0001831054688 + ], + "121": [ + 949.2911376953125, + 571.4234008789062 + ], + "125": [ + 965.4530029296875, + 575.1049194335938 + ] + } + }, + { + "id": 6, + "xyz": [ + -18.286733095051343, + 42.64992590460731, + -1.3165772331085663 + ], + "first_frame": 78, + "mean_error": 1.7772767311071738, + "observations": { + "78": [ + 312.70660400390625, + 570.9238891601562 + ], + "82": [ + 307.24359130859375, + 574.2720336914062 + ], + "86": [ + 298.59185791015625, + 575.5303955078125 + ], + "90": [ + 286.608154296875, + 576.1497802734375 + ], + "94": [ + 272.98974609375, + 576.6349487304688 + ], + "98": [ + 257.13037109375, + 578.7819213867188 + ], + "102": [ + 240.21176147460938, + 582.6419677734375 + ], + "106": [ + 220.0636749267578, + 586.0458374023438 + ], + "110": [ + 196.75836181640625, + 589.2653198242188 + ], + "114": [ + 172.84996032714844, + 592.7505493164062 + ], + "118": [ + 147.43246459960938, + 598.1160888671875 + ], + "122": [ + 120.55982971191406, + 603.475830078125 + ], + "126": [ + 89.98534393310547, + 608.3961791992188 + ] + } + }, + { + "id": 8, + "xyz": [ + 16.076922921483824, + 37.50135967511251, + 0.47147101741992864 + ], + "first_frame": 98, + "mean_error": 1.0487947231673722, + "observations": { + "98": [ + 955.2408447265625, + 556.7728271484375 + ], + "102": [ + 973.1494140625, + 560.5897216796875 + ], + "106": [ + 993.5687255859375, + 564.9030151367188 + ], + "110": [ + 1011.5039672851562, + 568.4273681640625 + ], + "114": [ + 1034.2132568359375, + 572.0595703125 + ], + "118": [ + 1060.14013671875, + 576.4579467773438 + ], + "122": [ + 1088.239013671875, + 580.5911254882812 + ], + "126": [ + 1119.7435302734375, + 585.1060180664062 + ] + } + }, + { + "id": 9, + "xyz": [ + -18.131547959124017, + 41.98382559249817, + -1.3552490144959723 + ], + "first_frame": 65, + "mean_error": 2.918225206848511, + "observations": { + "65": [ + 362.40533447265625, + 567.1651611328125 + ], + "69": [ + 348.0934753417969, + 568.6539916992188 + ], + "73": [ + 331.78778076171875, + 569.7890625 + ], + "77": [ + 313.9234313964844, + 572.3311157226562 + ], + "81": [ + 297.6807861328125, + 576.4152221679688 + ], + "85": [ + 294.318115234375, + 578.3239135742188 + ], + "89": [ + 280.8163146972656, + 579.5804443359375 + ], + "93": [ + 265.39300537109375, + 580.1239013671875 + ], + "97": [ + 249.79078674316406, + 581.73779296875 + ], + "101": [ + 232.8968048095703, + 585.6143798828125 + ], + "105": [ + 212.3263702392578, + 589.3682250976562 + ], + "109": [ + 189.83897399902344, + 592.5023803710938 + ], + "113": [ + 164.06283569335938, + 595.8429565429688 + ], + "117": [ + 138.12142944335938, + 600.7738037109375 + ], + "121": [ + 108.47491455078125, + 606.7130737304688 + ], + "125": [ + 77.2574691772461, + 611.77783203125 + ] + } + }, + { + "id": 11, + "xyz": [ + -21.767438110397684, + 47.872116016725805, + -1.1861840351534794 + ], + "first_frame": 73, + "mean_error": 1.6809132991803097, + "observations": { + "73": [ + 334.108642578125, + 556.4901123046875 + ], + "77": [ + 326.2308654785156, + 558.6172485351562 + ], + "81": [ + 320.84552001953125, + 560.7366333007812 + ], + "85": [ + 314.185791015625, + 561.34912109375 + ], + "89": [ + 305.734375, + 561.4512329101562 + ], + "93": [ + 295.42694091796875, + 560.5968017578125 + ], + "97": [ + 283.4816589355469, + 561.0346069335938 + ], + "101": [ + 270.2947998046875, + 563.5402221679688 + ], + "105": [ + 256.30364990234375, + 565.629638671875 + ], + "109": [ + 240.99620056152344, + 567.1139526367188 + ], + "113": [ + 224.4208526611328, + 568.7288208007812 + ], + "117": [ + 206.38845825195312, + 571.695556640625 + ], + "121": [ + 187.44773864746094, + 575.107177734375 + ], + "125": [ + 167.26104736328125, + 577.3043212890625 + ] + } + }, + { + "id": 13, + "xyz": [ + 15.602554962576782, + 38.996729055916965, + 0.24413416448436195 + ], + "first_frame": 85, + "mean_error": 0.772430580420983, + "observations": { + "85": [ + 876.4839477539062, + 553.9638061523438 + ], + "89": [ + 888.48095703125, + 553.9783325195312 + ], + "93": [ + 900.599365234375, + 553.7977905273438 + ], + "97": [ + 914.8483276367188, + 555.8133544921875 + ], + "101": [ + 929.5337524414062, + 559.45947265625 + ], + "105": [ + 943.5868530273438, + 563.6421508789062 + ], + "109": [ + 959.0498046875, + 566.67626953125 + ], + "113": [ + 976.8504638671875, + 569.7042846679688 + ], + "117": [ + 995.7496948242188, + 574.1650390625 + ], + "121": [ + 1016.2662963867188, + 578.223388671875 + ], + "125": [ + 1039.066162109375, + 582.5454711914062 + ] + } + }, + { + "id": 16, + "xyz": [ + 15.289143105763445, + 39.370049981401564, + 0.2470077769832015 + ], + "first_frame": 65, + "mean_error": 3.623935694260191, + "observations": { + "65": [ + 812.0540771484375, + 549.2484130859375 + ], + "69": [ + 821.9686889648438, + 549.3880004882812 + ], + "73": [ + 832.9159545898438, + 550.1609497070312 + ], + "77": [ + 845.6369018554688, + 551.8272094726562 + ], + "81": [ + 859.3221435546875, + 553.4158325195312 + ], + "85": [ + 868.822265625, + 553.2572631835938 + ], + "89": [ + 879.9484252929688, + 552.9888916015625 + ], + "93": [ + 891.3121337890625, + 552.5993041992188 + ], + "97": [ + 903.5789794921875, + 554.4908447265625 + ], + "101": [ + 917.5270385742188, + 557.903564453125 + ], + "105": [ + 931.386474609375, + 562.0985107421875 + ], + "109": [ + 946.2037963867188, + 565.0130004882812 + ], + "113": [ + 961.5426025390625, + 567.7120971679688 + ], + "117": [ + 977.8767700195312, + 571.6367797851562 + ], + "121": [ + 995.905029296875, + 575.4518432617188 + ], + "125": [ + 1016.1990966796875, + 579.618896484375 + ] + } + }, + { + "id": 18, + "xyz": [ + -21.143491587365197, + 47.12262562830057, + -1.3819445412606786 + ], + "first_frame": 65, + "mean_error": 1.751217806373846, + "observations": { + "65": [ + 361.2269287109375, + 557.1697998046875 + ], + "69": [ + 347.6336669921875, + 558.0570678710938 + ], + "73": [ + 335.35870361328125, + 559.3075561523438 + ], + "77": [ + 326.57318115234375, + 561.6690063476562 + ], + "81": [ + 320.6318054199219, + 564.3594970703125 + ], + "85": [ + 313.683837890625, + 565.3240356445312 + ], + "89": [ + 304.8467102050781, + 565.5007934570312 + ], + "93": [ + 294.11724853515625, + 564.856201171875 + ], + "97": [ + 282.098388671875, + 565.4846801757812 + ], + "101": [ + 268.6297912597656, + 568.2509765625 + ], + "105": [ + 254.2989959716797, + 570.5496215820312 + ], + "109": [ + 238.75296020507812, + 572.326171875 + ], + "113": [ + 222.1617431640625, + 574.256591796875 + ], + "117": [ + 203.59349060058594, + 578.0504150390625 + ], + "121": [ + 182.94740295410156, + 582.639892578125 + ], + "125": [ + 161.45082092285156, + 586.2760620117188 + ] + } + }, + { + "id": 20, + "xyz": [ + 16.97476664616792, + 42.560330964425454, + -0.2789716435828273 + ], + "first_frame": 98, + "mean_error": 1.2737498386741328, + "observations": { + "98": [ + 893.6885375976562, + 556.2393798828125 + ], + "102": [ + 904.0194702148438, + 559.68701171875 + ], + "106": [ + 914.1578979492188, + 563.2422485351562 + ], + "110": [ + 925.89208984375, + 565.763427734375 + ], + "114": [ + 938.7131958007812, + 568.6204833984375 + ], + "118": [ + 950.08984375, + 572.589111328125 + ], + "122": [ + 965.2464599609375, + 576.26171875 + ], + "126": [ + 981.1144409179688, + 579.7578735351562 + ] + } + }, + { + "id": 21, + "xyz": [ + -20.369106504665137, + 44.57305662607727, + -1.1573328504986973 + ], + "first_frame": 65, + "mean_error": 3.924849979393755, + "observations": { + "65": [ + 358.3122253417969, + 555.1624755859375 + ], + "69": [ + 344.556640625, + 556.1998901367188 + ], + "73": [ + 329.0116271972656, + 558.2887573242188 + ], + "77": [ + 311.52716064453125, + 562.213134765625 + ], + "81": [ + 299.922119140625, + 565.6844482421875 + ], + "85": [ + 289.8446960449219, + 567.2332763671875 + ], + "89": [ + 278.59649658203125, + 567.7047729492188 + ], + "93": [ + 266.5501708984375, + 567.52294921875 + ], + "97": [ + 253.42308044433594, + 568.4410400390625 + ], + "101": [ + 238.78567504882812, + 571.9117431640625 + ], + "105": [ + 223.12867736816406, + 575.2257080078125 + ], + "109": [ + 205.2412567138672, + 577.73046875 + ], + "113": [ + 185.62576293945312, + 580.667724609375 + ], + "117": [ + 162.04782104492188, + 585.2664794921875 + ], + "121": [ + 135.59776306152344, + 590.26318359375 + ], + "125": [ + 108.73532104492188, + 594.3992919921875 + ] + } + }, + { + "id": 22, + "xyz": [ + -18.535511853615727, + 43.121735925611155, + -1.4276953271429393 + ], + "first_frame": 77, + "mean_error": 2.1086748927929246, + "observations": { + "77": [ + 316.40985107421875, + 570.3861083984375 + ], + "81": [ + 311.48284912109375, + 573.731689453125 + ], + "85": [ + 303.584228515625, + 575.503173828125 + ], + "89": [ + 294.4993896484375, + 576.4274291992188 + ], + "93": [ + 280.27056884765625, + 576.8685913085938 + ], + "97": [ + 264.71661376953125, + 578.4840698242188 + ], + "101": [ + 248.46270751953125, + 582.1105346679688 + ], + "105": [ + 229.73451232910156, + 585.5498657226562 + ], + "109": [ + 208.10409545898438, + 588.5380249023438 + ], + "113": [ + 184.74436950683594, + 591.89111328125 + ], + "117": [ + 159.66567993164062, + 596.7078247070312 + ], + "121": [ + 135.19729614257812, + 602.2726440429688 + ], + "125": [ + 108.83543395996094, + 606.9263305664062 + ] + } + }, + { + "id": 23, + "xyz": [ + 16.179799616784923, + 40.601737100001806, + -0.005319851663811536 + ], + "first_frame": 81, + "mean_error": 0.9462747498826589, + "observations": { + "81": [ + 857.3424072265625, + 554.9451904296875 + ], + "85": [ + 867.0308837890625, + 554.8927001953125 + ], + "89": [ + 878.1820068359375, + 554.662841796875 + ], + "93": [ + 889.6114501953125, + 554.3134765625 + ], + "97": [ + 901.5321655273438, + 556.21533203125 + ], + "101": [ + 914.7537231445312, + 559.6041259765625 + ], + "105": [ + 927.8991088867188, + 563.6647338867188 + ], + "109": [ + 941.8404541015625, + 566.4493408203125 + ], + "113": [ + 955.1358032226562, + 568.9769897460938 + ], + "117": [ + 970.153564453125, + 572.9325561523438 + ], + "121": [ + 986.843505859375, + 576.6801147460938 + ], + "125": [ + 1005.8047485351562, + 580.6917724609375 + ] + } + }, + { + "id": 24, + "xyz": [ + -27.373949101611483, + 49.10446861430229, + -1.5863146115131903 + ], + "first_frame": 91, + "mean_error": 0.8635000566394273, + "observations": { + "91": [ + 233.91761779785156, + 563.3776245117188 + ], + "95": [ + 221.58328247070312, + 563.2647094726562 + ], + "99": [ + 207.1542510986328, + 564.9103393554688 + ], + "103": [ + 192.96441650390625, + 567.854248046875 + ], + "107": [ + 177.18804931640625, + 569.5890502929688 + ], + "111": [ + 159.5826873779297, + 571.4511108398438 + ], + "115": [ + 140.3829803466797, + 573.5425415039062 + ], + "119": [ + 119.9801254272461, + 577.5476684570312 + ], + "123": [ + 98.47834777832031, + 580.7399291992188 + ], + "127": [ + 76.15373229980469, + 584.5380249023438 + ] + } + }, + { + "id": 25, + "xyz": [ + 13.79845325718693, + 35.744227614586414, + 0.5338655184747758 + ], + "first_frame": 65, + "mean_error": 10.596633161179799, + "observations": { + "65": [ + 814.2052001953125, + 550.2799072265625 + ], + "69": [ + 824.69287109375, + 550.8704833984375 + ], + "73": [ + 836.1095581054688, + 552.1824340820312 + ], + "77": [ + 849.0587768554688, + 554.493408203125 + ], + "81": [ + 864.0768432617188, + 556.5123901367188 + ], + "85": [ + 881.506103515625, + 557.5201416015625 + ], + "89": [ + 901.6024169921875, + 558.6788330078125 + ], + "93": [ + 924.8521728515625, + 559.0592041015625 + ], + "97": [ + 948.5809936523438, + 561.2715454101562 + ], + "101": [ + 966.1401977539062, + 565.5895385742188 + ], + "105": [ + 985.1783447265625, + 570.4718017578125 + ], + "109": [ + 1004.4823608398438, + 574.2716064453125 + ], + "113": [ + 1026.4189453125, + 578.047119140625 + ], + "117": [ + 1050.884521484375, + 583.1507568359375 + ], + "121": [ + 1078.548095703125, + 588.2022094726562 + ], + "125": [ + 1109.054443359375, + 594.09033203125 + ] + } + }, + { + "id": 26, + "xyz": [ + 18.829374669120043, + 41.40535315805509, + 0.2289926505340913 + ], + "first_frame": 108, + "mean_error": 2.180157276946362, + "observations": { + "108": [ + 977.6544189453125, + 555.98876953125 + ], + "112": [ + 991.0550537109375, + 558.7774047851562 + ], + "116": [ + 1006.205078125, + 562.6766357421875 + ], + "120": [ + 1022.8966674804688, + 566.7128295898438 + ], + "124": [ + 1041.70751953125, + 570.834228515625 + ], + "128": [ + 1064.0, + 574.0 + ] + } + }, + { + "id": 27, + "xyz": [ + 15.137294378771731, + 37.97819809215389, + 0.1859366169797885 + ], + "first_frame": 103, + "mean_error": 0.6912917637841657, + "observations": { + "103": [ + 946.73193359375, + 567.4789428710938 + ], + "107": [ + 963.122314453125, + 571.4569091796875 + ], + "111": [ + 981.5841674804688, + 574.52294921875 + ], + "115": [ + 1001.3455810546875, + 578.6474609375 + ], + "119": [ + 1023.7356567382812, + 583.4292602539062 + ], + "123": [ + 1048.28564453125, + 588.0886840820312 + ], + "127": [ + 1076.3995361328125, + 592.6614379882812 + ] + } + }, + { + "id": 29, + "xyz": [ + -18.37546155313384, + 41.83527930679661, + -0.9235530483208045 + ], + "first_frame": 65, + "mean_error": 3.3166671597513635, + "observations": { + "65": [ + 360.29278564453125, + 559.9125366210938 + ], + "69": [ + 346.0304870605469, + 561.0802612304688 + ], + "73": [ + 329.7626037597656, + 562.7693481445312 + ], + "77": [ + 311.50885009765625, + 566.1133422851562 + ], + "81": [ + 293.3333435058594, + 570.3453979492188 + ], + "85": [ + 284.0111389160156, + 572.00634765625 + ], + "89": [ + 271.93499755859375, + 572.5546264648438 + ], + "93": [ + 259.0560302734375, + 572.5028076171875 + ], + "97": [ + 244.01898193359375, + 573.591064453125 + ], + "101": [ + 225.75167846679688, + 577.2766723632812 + ], + "105": [ + 204.36383056640625, + 580.6864013671875 + ], + "109": [ + 181.2891387939453, + 583.6323852539062 + ], + "113": [ + 155.4034881591797, + 586.8306274414062 + ], + "117": [ + 127.4151611328125, + 591.4039306640625 + ], + "121": [ + 97.27574157714844, + 596.8723754882812 + ], + "125": [ + 65.97064971923828, + 601.3008422851562 + ] + } + }, + { + "id": 30, + "xyz": [ + -31.68172930054719, + 60.27866344900871, + -3.7072632404001795 + ], + "first_frame": 104, + "mean_error": 1.9375821317852264, + "observations": { + "104": [ + 278.2467956542969, + 570.0306396484375 + ], + "108": [ + 267.58734130859375, + 571.4390869140625 + ], + "112": [ + 255.8716583251953, + 572.787353515625 + ], + "116": [ + 244.54464721679688, + 575.2775268554688 + ], + "120": [ + 238.25001525878906, + 578.1229248046875 + ], + "124": [ + 225.58631896972656, + 581.064453125 + ], + "128": [ + 214.0, + 584.0 + ] + } + }, + { + "id": 32, + "xyz": [ + 16.532743532005366, + 41.54996395528177, + -0.008753879815118128 + ], + "first_frame": 65, + "mean_error": 3.733635514900445, + "observations": { + "65": [ + 812.01708984375, + 549.1627807617188 + ], + "69": [ + 821.8255615234375, + 549.2769775390625 + ], + "73": [ + 832.6458129882812, + 550.00341796875 + ], + "77": [ + 845.3294677734375, + 551.5936279296875 + ], + "81": [ + 856.4778442382812, + 552.8328857421875 + ], + "85": [ + 865.744873046875, + 552.6609497070312 + ], + "89": [ + 876.7263793945312, + 552.375 + ], + "93": [ + 887.5360717773438, + 551.8309326171875 + ], + "97": [ + 897.60791015625, + 553.4500732421875 + ], + "101": [ + 908.1300048828125, + 556.2278442382812 + ], + "105": [ + 918.8565673828125, + 559.9405517578125 + ], + "109": [ + 930.6382446289062, + 562.5938110351562 + ], + "113": [ + 944.4397583007812, + 565.3841552734375 + ], + "117": [ + 957.7884521484375, + 569.3570556640625 + ], + "121": [ + 973.2127685546875, + 573.050537109375 + ], + "125": [ + 988.0492553710938, + 576.971923828125 + ] + } + }, + { + "id": 34, + "xyz": [ + -24.53853348569464, + 46.664453349162486, + -1.5307558659578493 + ], + "first_frame": 90, + "mean_error": 2.0640757491987847, + "observations": { + "90": [ + 241.4256591796875, + 567.8672485351562 + ], + "94": [ + 229.20584106445312, + 567.8060302734375 + ], + "98": [ + 214.8823699951172, + 569.3187866210938 + ], + "102": [ + 199.39749145507812, + 572.5191040039062 + ], + "106": [ + 183.22605895996094, + 574.9970703125 + ], + "110": [ + 165.0706787109375, + 577.2527465820312 + ], + "114": [ + 144.54327392578125, + 579.9288940429688 + ], + "118": [ + 121.67289733886719, + 584.3726196289062 + ], + "122": [ + 95.52417755126953, + 589.1506958007812 + ], + "126": [ + 65.50390625, + 592.892822265625 + ] + } + }, + { + "id": 35, + "xyz": [ + 21.47531250608441, + 44.10048171583333, + 0.014151129147903714 + ], + "first_frame": 93, + "mean_error": 2.5792626948527118, + "observations": { + "93": [ + 930.0556030273438, + 544.5899658203125 + ], + "97": [ + 942.380615234375, + 545.9476928710938 + ], + "101": [ + 953.5330810546875, + 548.9091186523438 + ], + "105": [ + 965.6686401367188, + 552.4784545898438 + ], + "109": [ + 977.3023681640625, + 555.157470703125 + ], + "113": [ + 990.6519775390625, + 557.9130859375 + ], + "117": [ + 1005.842041015625, + 561.8584594726562 + ], + "121": [ + 1020.3134765625, + 565.8920288085938 + ], + "125": [ + 1036.23583984375, + 570.3609619140625 + ] + } + }, + { + "id": 36, + "xyz": [ + 17.37783552787301, + 39.89259712114069, + 0.19923637581992693 + ], + "first_frame": 95, + "mean_error": 3.4768944731501406, + "observations": { + "95": [ + 934.1295166015625, + 550.7807006835938 + ], + "99": [ + 944.4943237304688, + 554.1298217773438 + ], + "103": [ + 956.5597534179688, + 558.3230590820312 + ], + "107": [ + 971.0632934570312, + 562.2183227539062 + ], + "111": [ + 986.33544921875, + 565.2484741210938 + ], + "115": [ + 1002.8236083984375, + 569.40771484375 + ], + "119": [ + 1023.4544067382812, + 573.9491577148438 + ], + "123": [ + 1046.4144287109375, + 578.3164672851562 + ], + "127": [ + 1073.50634765625, + 582.0819702148438 + ] + } + }, + { + "id": 37, + "xyz": [ + -18.268602008291833, + 42.36724353687142, + -1.392689332760375 + ], + "first_frame": 65, + "mean_error": 2.5775838631355823, + "observations": { + "65": [ + 362.5631103515625, + 566.3482666015625 + ], + "69": [ + 348.3023986816406, + 567.5873413085938 + ], + "73": [ + 331.9560241699219, + 568.6796875 + ], + "77": [ + 314.319580078125, + 571.373779296875 + ], + "81": [ + 300.6988220214844, + 575.26806640625 + ], + "85": [ + 296.77337646484375, + 577.2816772460938 + ], + "89": [ + 284.1074523925781, + 578.5888061523438 + ], + "93": [ + 269.3548583984375, + 579.1993408203125 + ], + "97": [ + 254.73681640625, + 580.8576049804688 + ], + "101": [ + 239.109375, + 584.775634765625 + ], + "105": [ + 219.17860412597656, + 588.5003662109375 + ], + "109": [ + 196.8900146484375, + 591.5948486328125 + ], + "113": [ + 172.0953369140625, + 595.0863647460938 + ], + "117": [ + 146.24403381347656, + 599.982666015625 + ], + "121": [ + 118.18624114990234, + 605.802978515625 + ], + "125": [ + 87.4591064453125, + 610.8271484375 + ] + } + }, + { + "id": 38, + "xyz": [ + 17.152841359177238, + 44.95729559399675, + -0.33848552487557865 + ], + "first_frame": 65, + "mean_error": 2.0587936098985047, + "observations": { + "65": [ + 811.0684204101562, + 548.7688598632812 + ], + "69": [ + 820.30859375, + 548.7864990234375 + ], + "73": [ + 826.186279296875, + 549.3207397460938 + ], + "77": [ + 830.3638305664062, + 550.4412231445312 + ], + "81": [ + 834.90283203125, + 551.1414794921875 + ], + "85": [ + 840.9566040039062, + 550.8126831054688 + ], + "89": [ + 847.666748046875, + 550.1453857421875 + ], + "93": [ + 855.87646484375, + 549.444091796875 + ], + "97": [ + 864.3452758789062, + 550.8494262695312 + ], + "101": [ + 872.8654174804688, + 553.7958374023438 + ], + "105": [ + 882.84423828125, + 557.41796875 + ], + "109": [ + 891.7713623046875, + 559.5579833984375 + ], + "113": [ + 901.0318603515625, + 561.84912109375 + ], + "117": [ + 911.665283203125, + 565.4140014648438 + ], + "121": [ + 923.5341186523438, + 568.8925170898438 + ], + "125": [ + 937.8157348632812, + 572.1832275390625 + ] + } + }, + { + "id": 39, + "xyz": [ + -22.05623124293088, + 43.76573638087064, + -1.184353266960861 + ], + "first_frame": 92, + "mean_error": 1.1494645599974107, + "observations": { + "92": [ + 227.5913543701172, + 570.8638305664062 + ], + "96": [ + 213.20751953125, + 571.4306030273438 + ], + "100": [ + 197.01976013183594, + 574.2550659179688 + ], + "104": [ + 178.34585571289062, + 577.6053466796875 + ], + "108": [ + 157.3951416015625, + 580.3499755859375 + ], + "112": [ + 132.42396545410156, + 582.9154052734375 + ], + "116": [ + 106.17919921875, + 586.7451782226562 + ], + "120": [ + 76.74308776855469, + 592.3980712890625 + ], + "124": [ + 46.40812301635742, + 596.41943359375 + ], + "128": [ + 14.0, + 601.0 + ] + } + }, + { + "id": 40, + "xyz": [ + -18.45668570296189, + 42.302100722959565, + -1.02159454302906 + ], + "first_frame": 79, + "mean_error": 1.5241066695273082, + "observations": { + "79": [ + 306.10076904296875, + 568.58642578125 + ], + "83": [ + 296.6896667480469, + 571.3020629882812 + ], + "87": [ + 287.2956848144531, + 572.185302734375 + ], + "91": [ + 274.4422912597656, + 572.5901489257812 + ], + "95": [ + 260.634033203125, + 572.674072265625 + ], + "99": [ + 244.45584106445312, + 575.0424194335938 + ], + "103": [ + 225.09632873535156, + 578.9821166992188 + ], + "107": [ + 203.2588653564453, + 581.9393920898438 + ], + "111": [ + 179.02960205078125, + 585.0709228515625 + ], + "115": [ + 153.0006103515625, + 588.6007080078125 + ], + "119": [ + 126.32093048095703, + 594.203857421875 + ], + "123": [ + 96.43804931640625, + 598.9991455078125 + ], + "127": [ + 64.66395568847656, + 604.3619995117188 + ] + } + }, + { + "id": 41, + "xyz": [ + -26.996787985003046, + 49.559817812691996, + -1.5351882044359737 + ], + "first_frame": 88, + "mean_error": 1.3986058728260795, + "observations": { + "88": [ + 253.972900390625, + 560.8399658203125 + ], + "92": [ + 241.8340301513672, + 561.2799072265625 + ], + "96": [ + 229.73680114746094, + 561.1936645507812 + ], + "100": [ + 216.81382751464844, + 563.6595458984375 + ], + "104": [ + 202.790771484375, + 566.1686401367188 + ], + "108": [ + 187.66415405273438, + 567.77734375 + ], + "112": [ + 170.76779174804688, + 569.7195434570312 + ], + "116": [ + 152.1757049560547, + 572.565673828125 + ], + "120": [ + 132.29092407226562, + 576.8200073242188 + ], + "124": [ + 112.38335418701172, + 579.803466796875 + ], + "128": [ + 90.0, + 583.0 + ] + } + }, + { + "id": 42, + "xyz": [ + -21.552168802607415, + 45.03113682214466, + -1.2412944071301397 + ], + "first_frame": 83, + "mean_error": 3.135762100722013, + "observations": { + "83": [ + 283.53216552734375, + 565.8716430664062 + ], + "87": [ + 272.7909851074219, + 566.659912109375 + ], + "91": [ + 261.0198669433594, + 566.924560546875 + ], + "95": [ + 248.49786376953125, + 567.0904541015625 + ], + "99": [ + 234.5011444091797, + 569.2811279296875 + ], + "103": [ + 219.50575256347656, + 573.0025024414062 + ], + "107": [ + 202.74954223632812, + 575.7135620117188 + ], + "111": [ + 184.17251586914062, + 578.5416259765625 + ], + "115": [ + 162.2029571533203, + 581.9345092773438 + ], + "119": [ + 135.9560546875, + 587.1464233398438 + ], + "123": [ + 106.48422241210938, + 591.3782958984375 + ], + "127": [ + 76.5946273803711, + 596.423583984375 + ] + } + }, + { + "id": 44, + "xyz": [ + 18.50081053552883, + 38.12345551173555, + 0.4891120789175395 + ], + "first_frame": 109, + "mean_error": 0.6606397611447258, + "observations": { + "109": [ + 1049.836669921875, + 564.5640869140625 + ], + "113": [ + 1073.6766357421875, + 567.5244140625 + ], + "117": [ + 1099.3975830078125, + 571.5067138671875 + ], + "121": [ + 1127.753662109375, + 575.060546875 + ], + "125": [ + 1156.8223876953125, + 579.3914184570312 + ] + } + }, + { + "id": 45, + "xyz": [ + 20.84836033899293, + 43.35298434299465, + 0.2474882531061079 + ], + "first_frame": 97, + "mean_error": 1.3891706212142467, + "observations": { + "97": [ + 943.51171875, + 545.0374145507812 + ], + "101": [ + 954.704345703125, + 547.9575805664062 + ], + "105": [ + 966.7219848632812, + 551.2891845703125 + ], + "109": [ + 979.4242553710938, + 552.9130249023438 + ], + "113": [ + 993.4901733398438, + 554.674072265625 + ], + "117": [ + 1008.4275512695312, + 557.827392578125 + ], + "121": [ + 1023.4984130859375, + 560.8630981445312 + ], + "125": [ + 1042.49072265625, + 563.694091796875 + ] + } + }, + { + "id": 46, + "xyz": [ + 22.141464399046097, + 41.76515064747096, + 0.1706047118985036 + ], + "first_frame": 101, + "mean_error": 2.185460650863196, + "observations": { + "101": [ + 1005.3900756835938, + 552.142578125 + ], + "105": [ + 1020.20361328125, + 555.568115234375 + ], + "109": [ + 1035.6934814453125, + 558.328369140625 + ], + "113": [ + 1052.750244140625, + 560.943359375 + ], + "117": [ + 1070.615234375, + 564.7277221679688 + ], + "121": [ + 1090.7095947265625, + 568.1715698242188 + ], + "125": [ + 1117.43505859375, + 571.5155029296875 + ] + } + }, + { + "id": 47, + "xyz": [ + -19.598093282036352, + 44.95648532421724, + -1.6078129103174066 + ], + "first_frame": 76, + "mean_error": 3.036357521501476, + "observations": { + "76": [ + 322.10894775390625, + 567.6400756835938 + ], + "80": [ + 318.81024169921875, + 571.1497192382812 + ], + "84": [ + 311.6937255859375, + 573.6598510742188 + ], + "88": [ + 303.56591796875, + 574.4592895507812 + ], + "92": [ + 292.96136474609375, + 574.2608032226562 + ], + "96": [ + 280.2367248535156, + 574.734375 + ], + "100": [ + 266.59210205078125, + 577.2835083007812 + ], + "104": [ + 250.71693420410156, + 580.6236572265625 + ], + "108": [ + 231.06410217285156, + 583.3474731445312 + ], + "112": [ + 210.71189880371094, + 586.1456909179688 + ], + "116": [ + 188.4401397705078, + 590.1130981445312 + ], + "120": [ + 164.59225463867188, + 595.4266967773438 + ], + "124": [ + 143.54054260253906, + 599.41357421875 + ], + "128": [ + 127.0, + 604.0 + ] + } + }, + { + "id": 48, + "xyz": [ + 15.496808821979046, + 38.6087264128368, + 0.21741146534056793 + ], + "first_frame": 87, + "mean_error": 0.6249553828564705, + "observations": { + "87": [ + 886.0328979492188, + 555.8832397460938 + ], + "91": [ + 898.177978515625, + 555.6658325195312 + ], + "95": [ + 911.5476684570312, + 556.5069580078125 + ], + "99": [ + 926.0353393554688, + 559.4392700195312 + ], + "103": [ + 940.3031616210938, + 563.5458984375 + ], + "107": [ + 956.7512817382812, + 567.4309692382812 + ], + "111": [ + 975.3442993164062, + 570.3956298828125 + ], + "115": [ + 993.559814453125, + 574.4577026367188 + ], + "119": [ + 1014.1914672851562, + 578.9932250976562 + ], + "123": [ + 1036.744140625, + 583.2321166992188 + ], + "127": [ + 1062.3948974609375, + 587.150390625 + ] + } + }, + { + "id": 49, + "xyz": [ + -22.65674529628515, + 44.58381963306989, + -1.25014795339236 + ], + "first_frame": 91, + "mean_error": 2.169514492526233, + "observations": { + "91": [ + 233.93797302246094, + 569.5260009765625 + ], + "95": [ + 220.80789184570312, + 569.6355590820312 + ], + "99": [ + 205.41734313964844, + 571.6969604492188 + ], + "103": [ + 189.50274658203125, + 575.3366088867188 + ], + "107": [ + 170.73187255859375, + 577.6971435546875 + ], + "111": [ + 149.11553955078125, + 580.330322265625 + ], + "115": [ + 124.70336151123047, + 583.287841796875 + ], + "119": [ + 96.56758117675781, + 588.3577270507812 + ], + "123": [ + 67.08563232421875, + 592.722412109375 + ], + "127": [ + 35.68373107910156, + 597.3829345703125 + ] + } + }, + { + "id": 50, + "xyz": [ + -28.607552240489625, + 47.701565619563375, + -1.620554560070345 + ], + "first_frame": 100, + "mean_error": 1.3785644736190692, + "observations": { + "100": [ + 161.48500061035156, + 569.8181762695312 + ], + "104": [ + 143.15853881835938, + 572.4514770507812 + ], + "108": [ + 122.48681640625, + 574.59375 + ], + "112": [ + 101.18378448486328, + 576.5155029296875 + ], + "116": [ + 78.25852966308594, + 579.7111206054688 + ], + "120": [ + 51.69721221923828, + 584.6553344726562 + ], + "124": [ + 25.85906982421875, + 587.6212768554688 + ], + "128": [ + 6.0, + 590.0 + ] + } + }, + { + "id": 51, + "xyz": [ + 21.266059280580198, + 42.30099768249127, + 0.23542505943440495 + ], + "first_frame": 98, + "mean_error": 2.3754147239810566, + "observations": { + "98": [ + 966.4677124023438, + 546.5059204101562 + ], + "102": [ + 984.2881469726562, + 549.7020263671875 + ], + "106": [ + 998.01220703125, + 553.3193359375 + ], + "110": [ + 1011.9197387695312, + 555.7745361328125 + ], + "114": [ + 1027.2236328125, + 558.753662109375 + ], + "118": [ + 1043.216064453125, + 562.8291015625 + ], + "122": [ + 1061.99169921875, + 566.4115600585938 + ], + "126": [ + 1084.4708251953125, + 569.9860229492188 + ] + } + }, + { + "id": 52, + "xyz": [ + -17.390569908945043, + 49.58304746278673, + -1.714388422948873 + ], + "first_frame": 65, + "mean_error": 2.831327784919386, + "observations": { + "65": [ + 415.68389892578125, + 557.6670532226562 + ], + "69": [ + 415.4634704589844, + 557.0487670898438 + ], + "73": [ + 408.26922607421875, + 558.22314453125 + ], + "77": [ + 400.1523132324219, + 560.8299560546875 + ], + "81": [ + 392.7802429199219, + 563.6773681640625 + ], + "85": [ + 384.5328674316406, + 564.3917236328125 + ], + "89": [ + 377.0105895996094, + 564.1640014648438 + ], + "93": [ + 368.14178466796875, + 563.141357421875 + ], + "97": [ + 365.7397155761719, + 562.996337890625 + ], + "101": [ + 358.05169677734375, + 565.952880859375 + ], + "105": [ + 349.1123046875, + 568.5451049804688 + ], + "109": [ + 337.2976989746094, + 570.63623046875 + ], + "113": [ + 328.1430358886719, + 572.8989868164062 + ], + "117": [ + 314.9190368652344, + 576.9450073242188 + ], + "121": [ + 298.03662109375, + 581.6646118164062 + ], + "125": [ + 278.1358947753906, + 585.9130249023438 + ] + } + }, + { + "id": 54, + "xyz": [ + 23.17627872574728, + 42.89786672630251, + 0.20684914687030614 + ], + "first_frame": 91, + "mean_error": 2.213366348077136, + "observations": { + "91": [ + 965.462158203125, + 544.0169067382812 + ], + "95": [ + 979.2299194335938, + 543.8377075195312 + ], + "99": [ + 993.0732421875, + 547.315185546875 + ], + "103": [ + 1007.2489013671875, + 550.5166015625 + ], + "107": [ + 1022.1431274414062, + 553.3682250976562 + ], + "111": [ + 1037.7252197265625, + 555.5564575195312 + ], + "115": [ + 1054.6134033203125, + 558.8546142578125 + ], + "119": [ + 1072.30517578125, + 562.5789794921875 + ], + "123": [ + 1092.0574951171875, + 566.1558227539062 + ], + "127": [ + 1113.38671875, + 569.2803955078125 + ] + } + }, + { + "id": 55, + "xyz": [ + -19.34894174402045, + 46.150531989367416, + -1.1294595228266053 + ], + "first_frame": 106, + "mean_error": 1.5254203107433602, + "observations": { + "106": [ + 263.58026123046875, + 569.6804809570312 + ], + "110": [ + 251.69857788085938, + 571.3079833984375 + ], + "114": [ + 233.1816864013672, + 573.4764404296875 + ], + "118": [ + 212.4628448486328, + 577.4923095703125 + ], + "122": [ + 195.22805786132812, + 581.6675415039062 + ], + "126": [ + 172.43150329589844, + 585.2174072265625 + ] + } + }, + { + "id": 56, + "xyz": [ + -18.055258761013164, + 41.741339174936115, + -1.7061669850298624 + ], + "first_frame": 65, + "mean_error": 2.8020670698554144, + "observations": { + "65": [ + 360.6152648925781, + 572.092041015625 + ], + "69": [ + 346.622802734375, + 573.8156127929688 + ], + "73": [ + 330.4238586425781, + 575.5634765625 + ], + "77": [ + 312.5867919921875, + 578.9063110351562 + ], + "81": [ + 294.8673400878906, + 583.4581909179688 + ], + "85": [ + 290.3827819824219, + 585.1128540039062 + ], + "89": [ + 276.5985412597656, + 586.5015258789062 + ], + "93": [ + 261.97479248046875, + 586.8966674804688 + ], + "97": [ + 246.05775451660156, + 588.7883911132812 + ], + "101": [ + 228.5658416748047, + 593.040771484375 + ], + "105": [ + 208.32518005371094, + 597.4329833984375 + ], + "109": [ + 185.66395568847656, + 601.3983764648438 + ], + "113": [ + 158.96295166015625, + 605.6453857421875 + ], + "117": [ + 131.47784423828125, + 612.0332641601562 + ], + "121": [ + 100.41849517822266, + 619.3967895507812 + ], + "125": [ + 68.11421203613281, + 624.739013671875 + ] + } + }, + { + "id": 57, + "xyz": [ + -27.029139462365574, + 54.710817167790424, + -3.0586963153692093 + ], + "first_frame": 103, + "mean_error": 1.6458635592090098, + "observations": { + "103": [ + 275.528564453125, + 573.2672729492188 + ], + "107": [ + 265.3802185058594, + 575.01953125 + ], + "111": [ + 253.25308227539062, + 576.9498901367188 + ], + "115": [ + 239.44607543945312, + 579.2200317382812 + ], + "119": [ + 226.44247436523438, + 583.6234130859375 + ], + "123": [ + 211.07894897460938, + 586.7526245117188 + ], + "127": [ + 203.5115203857422, + 589.7481079101562 + ] + } + }, + { + "id": 58, + "xyz": [ + -21.384231450267094, + 46.129997169115526, + -1.2659309639019607 + ], + "first_frame": 78, + "mean_error": 1.0362775623720994, + "observations": { + "78": [ + 311.07171630859375, + 561.8899536132812 + ], + "82": [ + 305.0684814453125, + 564.544189453125 + ], + "86": [ + 295.50604248046875, + 565.451171875 + ], + "90": [ + 284.6340026855469, + 565.55517578125 + ], + "94": [ + 272.7060241699219, + 565.2236938476562 + ], + "98": [ + 259.4957275390625, + 566.439453125 + ], + "102": [ + 245.46685791015625, + 569.6473999023438 + ], + "106": [ + 229.4947509765625, + 572.2582397460938 + ], + "110": [ + 212.02285766601562, + 574.3248901367188 + ], + "114": [ + 192.371826171875, + 576.8543090820312 + ], + "118": [ + 170.52284240722656, + 581.2698974609375 + ], + "122": [ + 148.89242553710938, + 585.3895263671875 + ], + "126": [ + 126.62742614746094, + 588.94580078125 + ] + } + }, + { + "id": 59, + "xyz": [ + 15.28156782189065, + 39.08251149492431, + 0.13275092050707557 + ], + "first_frame": 82, + "mean_error": 0.6013008060961786, + "observations": { + "82": [ + 861.9283447265625, + 556.2703247070312 + ], + "86": [ + 872.5762939453125, + 556.5128173828125 + ], + "90": [ + 884.04443359375, + 556.05810546875 + ], + "94": [ + 897.1170654296875, + 556.4569091796875 + ], + "98": [ + 910.2999877929688, + 558.9847412109375 + ], + "102": [ + 924.0164184570312, + 562.7703247070312 + ], + "106": [ + 939.1328125, + 566.7780151367188 + ], + "110": [ + 955.291748046875, + 569.7943115234375 + ], + "114": [ + 972.2649536132812, + 573.2603149414062 + ], + "118": [ + 990.192138671875, + 577.4926147460938 + ], + "122": [ + 1010.1213989257812, + 581.4456176757812 + ], + "126": [ + 1032.50732421875, + 585.5142211914062 + ] + } + }, + { + "id": 60, + "xyz": [ + -22.284799094561706, + 47.247721118254745, + -1.143217304123062 + ], + "first_frame": 78, + "mean_error": 0.8277944140343093, + "observations": { + "78": [ + 311.71954345703125, + 558.5755615234375 + ], + "82": [ + 306.283447265625, + 561.13916015625 + ], + "86": [ + 296.9109802246094, + 561.7632446289062 + ], + "90": [ + 286.27398681640625, + 561.726806640625 + ], + "94": [ + 274.5967712402344, + 561.1482543945312 + ], + "98": [ + 261.65228271484375, + 562.2048950195312 + ], + "102": [ + 247.80650329589844, + 565.0404663085938 + ], + "106": [ + 232.9857635498047, + 567.0614624023438 + ], + "110": [ + 216.71505737304688, + 568.680908203125 + ], + "114": [ + 198.52285766601562, + 570.8416137695312 + ], + "118": [ + 179.19493103027344, + 574.3731689453125 + ], + "122": [ + 158.64129638671875, + 578.0240478515625 + ], + "126": [ + 137.65057373046875, + 580.599365234375 + ] + } + } +] \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/intersection_plane_fit.json b/astra_scene_test/Scene_04/reference/intersection_plane_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..8aed1d9e5dd61c6bc42fcc0c0285b7af5fae07ae --- /dev/null +++ b/astra_scene_test/Scene_04/reference/intersection_plane_fit.json @@ -0,0 +1,33 @@ +{ + "coefficients": [ + 0.03158888205030772, + -0.04587235220107175, + 1.5145111108674505 + ], + "ids": [ + 1, + 4, + 6, + 8, + 11, + 13, + 18, + 20, + 23, + 24, + 27, + 39, + 40, + 41, + 44, + 45, + 48, + 50, + 55, + 57, + 58, + 59, + 60 + ], + "rms": 0.30196119282013045 +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/metadata.json b/astra_scene_test/Scene_04/reference/metadata.json new file mode 100644 index 0000000000000000000000000000000000000000..bb0f0b2790f70e959feaafe7e98528770ea7e8ba --- /dev/null +++ b/astra_scene_test/Scene_04/reference/metadata.json @@ -0,0 +1,1421 @@ +{ + "width": 1280, + "height": 720, + "fps_num": 30, + "fps_den": 1, + "frame_count": 128, + "duration_seconds": 4.266666666666667, + "audio_streams": 0, + "source_sha256": "d52093fef79db4c65de71b17b177fce4df5234a30cf52e91ec8814a8b36a386b", + "measurement": "FFmpeg full decode; stream time base 1/15360; constant rate 30/1; no audio stream.", + "frames": [ + { + "frame": 1, + "time_seconds": 0.0, + "path": "reference/frames/0001.png", + "mean_rgb": [ + 70.966, + 68.467, + 52.827 + ], + "sha256": "bd77ab74b3f694e0a80c53f7927faea08079bf5b0b2876f608628bda13ea820a" + }, + { + "frame": 2, + "time_seconds": 0.03333333333333333, + "path": "reference/frames/0002.png", + "mean_rgb": [ + 69.858, + 67.814, + 51.989 + ], + "sha256": "24c579eecc6d430d9dc9ee0d2e56ad681ba8b42672582bfb6a6181b0df222bb4" + }, + { + "frame": 3, + "time_seconds": 0.06666666666666667, + "path": "reference/frames/0003.png", + "mean_rgb": [ + 68.971, + 67.021, + 50.833 + ], + "sha256": "d0194b87a761c6de09a35b5ecf4196a0e938967b1d65bda231695c313355fdc5" + }, + { + "frame": 4, + "time_seconds": 0.1, + "path": "reference/frames/0004.png", + "mean_rgb": [ + 68.539, + 66.634, + 50.282 + ], + "sha256": "18bb3bae82803195f25c3de5f751b136301f3ab86a67d91941914f215ff9fcd9" + }, + { + "frame": 5, + "time_seconds": 0.13333333333333333, + "path": "reference/frames/0005.png", + "mean_rgb": [ + 67.357, + 65.985, + 51.19 + ], + "sha256": "46e29ed536604f1fb3dd9c8c1284a5dc78f957d91ffe59f6fcaf17cfdb5ae833" + }, + { + "frame": 6, + "time_seconds": 0.16666666666666666, + "path": "reference/frames/0006.png", + "mean_rgb": [ + 67.441, + 65.658, + 49.933 + ], + "sha256": "01842c2bef7e91dd58bdad650dbb81810f0b001e36c24bc501f27adc062bd3ad" + }, + { + "frame": 7, + "time_seconds": 0.2, + "path": "reference/frames/0007.png", + "mean_rgb": [ + 66.759, + 64.841, + 49.849 + ], + "sha256": "ee00eeb5bf5295d1c0b74dfbf84d24fabf988c97a28a3d6c9ee31c368d9238c2" + }, + { + "frame": 8, + "time_seconds": 0.23333333333333334, + "path": "reference/frames/0008.png", + "mean_rgb": [ + 65.385, + 63.907, + 48.812 + ], + "sha256": "a94ba00fd7e64be4514a88ec46a80cc7b1f956947c3e128492a13c616746d9a3" + }, + { + "frame": 9, + "time_seconds": 0.26666666666666666, + "path": "reference/frames/0009.png", + "mean_rgb": [ + 64.706, + 62.734, + 46.865 + ], + "sha256": "10d35023a9b09e882a6e2ef21c0d56e2f558e305f131b7b493de688c2fa0649d" + }, + { + "frame": 10, + "time_seconds": 0.3, + "path": "reference/frames/0010.png", + "mean_rgb": [ + 65.215, + 63.14, + 47.819 + ], + "sha256": "453d6bb972a9c7366ed03f5e02181b67480e4bd9537c55380a49038aa37645ce" + }, + { + "frame": 11, + "time_seconds": 0.3333333333333333, + "path": "reference/frames/0011.png", + "mean_rgb": [ + 65.053, + 62.549, + 46.784 + ], + "sha256": "7c0a0a66b53e2ba0b672e6f7d94eedc5193e61c4577622e19c9ab51936cb58e2" + }, + { + "frame": 12, + "time_seconds": 0.36666666666666664, + "path": "reference/frames/0012.png", + "mean_rgb": [ + 63.668, + 62.472, + 47.025 + ], + "sha256": "fdd1553691dbb566b9fb1607e362a76681bd204e7b3dbff171df4dc593d8feaf" + }, + { + "frame": 13, + "time_seconds": 0.4, + "path": "reference/frames/0013.png", + "mean_rgb": [ + 64.897, + 62.404, + 46.576 + ], + "sha256": "cf97b93496af9437b666fc1a18220f0aad8ce06750df88b4a330ba883b3faed2" + }, + { + "frame": 14, + "time_seconds": 0.43333333333333335, + "path": "reference/frames/0014.png", + "mean_rgb": [ + 64.089, + 61.879, + 47.484 + ], + "sha256": "4a8e6969dd57a20718fa0b75c8ef469db3ddfb15265caf2915174478f235cf5a" + }, + { + "frame": 15, + "time_seconds": 0.4666666666666667, + "path": "reference/frames/0015.png", + "mean_rgb": [ + 63.069, + 61.362, + 46.304 + ], + "sha256": "f4c9fedc5e623548b6dfd0375b0d4d655e854738ee694f37f3f2db51a0d96466" + }, + { + "frame": 16, + "time_seconds": 0.5, + "path": "reference/frames/0016.png", + "mean_rgb": [ + 62.484, + 60.114, + 45.486 + ], + "sha256": "547c0c3ebad72e2f328a23640b6cc49917e7e660d54d580c7dab070277e3788e" + }, + { + "frame": 17, + "time_seconds": 0.5333333333333333, + "path": "reference/frames/0017.png", + "mean_rgb": [ + 61.47, + 59.243, + 45.154 + ], + "sha256": "67575874c82c407b9caa9e96641ee366cd9078c5e930408a48908f5be21d8465" + }, + { + "frame": 18, + "time_seconds": 0.5666666666666667, + "path": "reference/frames/0018.png", + "mean_rgb": [ + 61.615, + 59.071, + 45.073 + ], + "sha256": "6d2d9d5542aeb1029d97e5ad7f3a3766ec98fd6e6241f303df4b2b08b5520ee5" + }, + { + "frame": 19, + "time_seconds": 0.6, + "path": "reference/frames/0019.png", + "mean_rgb": [ + 60.521, + 57.812, + 44.055 + ], + "sha256": "6b3ad7c99d58b163e9a7aeaa995b8752464021efad2799e2fae675f83bc41f3e" + }, + { + "frame": 20, + "time_seconds": 0.6333333333333333, + "path": "reference/frames/0020.png", + "mean_rgb": [ + 61.417, + 58.485, + 44.409 + ], + "sha256": "c6a7f7de056ffb6cba7fc7f569a252e2200692850487d1f081ef70840739109d" + }, + { + "frame": 21, + "time_seconds": 0.6666666666666666, + "path": "reference/frames/0021.png", + "mean_rgb": [ + 61.621, + 58.683, + 44.414 + ], + "sha256": "95f8364a01699d9c8dd1b979dcb7d85bdad51b386d3dabc002cfc40039cc9ed8" + }, + { + "frame": 22, + "time_seconds": 0.7, + "path": "reference/frames/0022.png", + "mean_rgb": [ + 62.208, + 59.348, + 45.147 + ], + "sha256": "444df4b9a475724b218c2a341f4187d1e5392158f2a712d8216948ce5c0c4fca" + }, + { + "frame": 23, + "time_seconds": 0.7333333333333333, + "path": "reference/frames/0023.png", + "mean_rgb": [ + 59.649, + 58.057, + 46.896 + ], + "sha256": "4de2c6684eac49d753d61ae3a3946b8b21168b49e4fd4a455f05823ca4ec2b08" + }, + { + "frame": 24, + "time_seconds": 0.7666666666666667, + "path": "reference/frames/0024.png", + "mean_rgb": [ + 60.584, + 57.945, + 44.737 + ], + "sha256": "24d1bbb26fe306da6374d4296db826e9037ac0b5b228ae2d8408e51d921066c1" + }, + { + "frame": 25, + "time_seconds": 0.8, + "path": "reference/frames/0025.png", + "mean_rgb": [ + 61.465, + 58.811, + 46.229 + ], + "sha256": "aea7d5697c83d07033bd8196504ac64f1ef09cde3584dcaf319fd01e98861975" + }, + { + "frame": 26, + "time_seconds": 0.8333333333333334, + "path": "reference/frames/0026.png", + "mean_rgb": [ + 60.402, + 57.923, + 44.473 + ], + "sha256": "4873f4af7a0283fc168ae25f0ae3852e9ec56f4f350f48522558272a820a32a4" + }, + { + "frame": 27, + "time_seconds": 0.8666666666666667, + "path": "reference/frames/0027.png", + "mean_rgb": [ + 61.211, + 59.032, + 45.162 + ], + "sha256": "b945bc341bad0f7e962afd3c4ba382b9d75f5037858e7f9017edc0c6fc0661f9" + }, + { + "frame": 28, + "time_seconds": 0.9, + "path": "reference/frames/0028.png", + "mean_rgb": [ + 61.812, + 59.056, + 43.712 + ], + "sha256": "dc483afb27da57895a0c3ecd3cf070797f2b478e7eafec9beb90d1810e5a83e6" + }, + { + "frame": 29, + "time_seconds": 0.9333333333333333, + "path": "reference/frames/0029.png", + "mean_rgb": [ + 59.831, + 58.738, + 47.664 + ], + "sha256": "39cde1ded354e2f5a69d7788720070b40255c6f12708560104c5c01be8fe3b01" + }, + { + "frame": 30, + "time_seconds": 0.9666666666666667, + "path": "reference/frames/0030.png", + "mean_rgb": [ + 60.652, + 59.156, + 46.425 + ], + "sha256": "f4efa6346e31dc4b1be4889ac0315daaf993c76f8e60583fe3b7986525cb7492" + }, + { + "frame": 31, + "time_seconds": 1.0, + "path": "reference/frames/0031.png", + "mean_rgb": [ + 57.356, + 56.065, + 43.014 + ], + "sha256": "ccb6557fc0f384e1f1ec05ac498973f1261f0c487044074dc501f96dfff83ed4" + }, + { + "frame": 32, + "time_seconds": 1.0333333333333334, + "path": "reference/frames/0032.png", + "mean_rgb": [ + 59.257, + 57.121, + 43.639 + ], + "sha256": "8dcd8abafcea441b739c9a08af940016abb81103eb2ba03d19b49173d221564d" + }, + { + "frame": 33, + "time_seconds": 1.0666666666666667, + "path": "reference/frames/0033.png", + "mean_rgb": [ + 59.298, + 56.554, + 41.98 + ], + "sha256": "53c2489637a3515d206e0a4defaa0dbfbbbdd1e764e27ab9ba5a09873bf184be" + }, + { + "frame": 34, + "time_seconds": 1.1, + "path": "reference/frames/0034.png", + "mean_rgb": [ + 58.137, + 57.374, + 45.011 + ], + "sha256": "ca6bf733f19a2a61ab2c27dea17405fa3db1f4d5219caec954609731cbe7dd9c" + }, + { + "frame": 35, + "time_seconds": 1.1333333333333333, + "path": "reference/frames/0035.png", + "mean_rgb": [ + 62.22, + 59.307, + 44.551 + ], + "sha256": "84150435f6953aae2aa4e65b44baa2471a866f250e2cd29cb38f51fcd47642a6" + }, + { + "frame": 36, + "time_seconds": 1.1666666666666667, + "path": "reference/frames/0036.png", + "mean_rgb": [ + 60.994, + 59.209, + 45.119 + ], + "sha256": "d4ad37dd4ac1997a0b703e3b8ae41dd2412e36d65032b1076bced3bc4e910a86" + }, + { + "frame": 37, + "time_seconds": 1.2, + "path": "reference/frames/0037.png", + "mean_rgb": [ + 58.122, + 57.703, + 45.928 + ], + "sha256": "8c0241dd7c6aa266bce1c6abb3012aa2f27ba151c7a666b7acca0e3150db05e4" + }, + { + "frame": 38, + "time_seconds": 1.2333333333333334, + "path": "reference/frames/0038.png", + "mean_rgb": [ + 58.205, + 56.801, + 42.792 + ], + "sha256": "10913497cc5dedecce56a90326851f706f0f767e4b61fe79456a1f5e4d14c607" + }, + { + "frame": 39, + "time_seconds": 1.2666666666666666, + "path": "reference/frames/0039.png", + "mean_rgb": [ + 62.243, + 59.856, + 44.99 + ], + "sha256": "7449095f800ba25100679f53372da99b70ae8529f96a8a1f8617312edf947894" + }, + { + "frame": 40, + "time_seconds": 1.3, + "path": "reference/frames/0040.png", + "mean_rgb": [ + 61.295, + 59.73, + 45.58 + ], + "sha256": "3bba358fab0cac6a05d6a4588ab428825760beb85e14095d22a3fc27043e10c1" + }, + { + "frame": 41, + "time_seconds": 1.3333333333333333, + "path": "reference/frames/0041.png", + "mean_rgb": [ + 60.803, + 59.627, + 46.136 + ], + "sha256": "b9b4a511ff67ec7965909b3076154f3343f1106faf62c61c0166e93e36a5e395" + }, + { + "frame": 42, + "time_seconds": 1.3666666666666667, + "path": "reference/frames/0042.png", + "mean_rgb": [ + 59.705, + 59.717, + 48.222 + ], + "sha256": "c60ea9202bffc68a32f931319daae17f3700bf3e2b693e235ec0120659564d3f" + }, + { + "frame": 43, + "time_seconds": 1.4, + "path": "reference/frames/0043.png", + "mean_rgb": [ + 60.576, + 59.685, + 46.363 + ], + "sha256": "dfc766ea32a438f7f239fc008d0ff93c1cec14538d34afe76ac68351868b9a5c" + }, + { + "frame": 44, + "time_seconds": 1.4333333333333333, + "path": "reference/frames/0044.png", + "mean_rgb": [ + 60.086, + 59.898, + 47.881 + ], + "sha256": "6aaad1e340e086fbf0136cea68d4f308c41258951da8534026df57452fcdcff9" + }, + { + "frame": 45, + "time_seconds": 1.4666666666666666, + "path": "reference/frames/0045.png", + "mean_rgb": [ + 60.568, + 59.885, + 46.067 + ], + "sha256": "65bbdb23822c64ca03ec3c845be71c38bffd748f14d6f75dc9c4a78a248f1957" + }, + { + "frame": 46, + "time_seconds": 1.5, + "path": "reference/frames/0046.png", + "mean_rgb": [ + 60.649, + 59.984, + 47.301 + ], + "sha256": "0987ef0a7505c51503f269828065fc7e21dbccf33b4ace83133f7c4cdd435dd6" + }, + { + "frame": 47, + "time_seconds": 1.5333333333333334, + "path": "reference/frames/0047.png", + "mean_rgb": [ + 59.217, + 60.033, + 49.369 + ], + "sha256": "31018be6406dbca7ac5fc6975a1b4307b3151c44fcddab71b22bc460318c92d6" + }, + { + "frame": 48, + "time_seconds": 1.5666666666666667, + "path": "reference/frames/0048.png", + "mean_rgb": [ + 60.635, + 60.233, + 48.105 + ], + "sha256": "fd3005d1b78239dc3a6c267b00295cf36b19b6fc88913766bbd3ae4d59ae237f" + }, + { + "frame": 49, + "time_seconds": 1.6, + "path": "reference/frames/0049.png", + "mean_rgb": [ + 60.539, + 60.449, + 47.12 + ], + "sha256": "0fee20eef472714392a7679dfe582bc2516082c74e789eef2bc374eb4c59943d" + }, + { + "frame": 50, + "time_seconds": 1.6333333333333333, + "path": "reference/frames/0050.png", + "mean_rgb": [ + 60.033, + 60.456, + 49.431 + ], + "sha256": "afd2e7890aa727fe9afc56eb05af4f2ed78965c746767556133d9e880cdd9f72" + }, + { + "frame": 51, + "time_seconds": 1.6666666666666667, + "path": "reference/frames/0051.png", + "mean_rgb": [ + 61.123, + 61.039, + 46.575 + ], + "sha256": "85b09ee12dcf9799931fd2f21363f062b845c994c00bcf7fe75542bef3aa2a10" + }, + { + "frame": 52, + "time_seconds": 1.7, + "path": "reference/frames/0052.png", + "mean_rgb": [ + 60.723, + 61.159, + 48.181 + ], + "sha256": "5b06826acc100b3a4e142d19ecd67227faf3dbe0f9ca77d39430cba36b68c4bb" + }, + { + "frame": 53, + "time_seconds": 1.7333333333333334, + "path": "reference/frames/0053.png", + "mean_rgb": [ + 59.966, + 61.197, + 48.221 + ], + "sha256": "c799d727adeb252bacdbab1f0bd786fa1a283bbb937f32d90e1d6ecca9c37f04" + }, + { + "frame": 54, + "time_seconds": 1.7666666666666666, + "path": "reference/frames/0054.png", + "mean_rgb": [ + 60.49, + 61.329, + 48.269 + ], + "sha256": "0ba4e58ca121d6c138783e5a0b2d95e4f95a6135cda5f72e1e2e77bc1828ccb2" + }, + { + "frame": 55, + "time_seconds": 1.8, + "path": "reference/frames/0055.png", + "mean_rgb": [ + 59.555, + 61.457, + 51.276 + ], + "sha256": "ec81b25b8d93dc7c01ad442f6bb49924b1066def4dcd9d71681da17e086190cd" + }, + { + "frame": 56, + "time_seconds": 1.8333333333333333, + "path": "reference/frames/0056.png", + "mean_rgb": [ + 59.375, + 61.603, + 50.238 + ], + "sha256": "6a411f4072ddbfe20351a52b6e94884f8acdaa0136c9479cd1ec37e473c9ef1c" + }, + { + "frame": 57, + "time_seconds": 1.8666666666666667, + "path": "reference/frames/0057.png", + "mean_rgb": [ + 59.611, + 61.708, + 50.663 + ], + "sha256": "b68c83836ce7b9e71d5aada9af93e828978ca919b3ea10d10f9ca4d5142cdd7d" + }, + { + "frame": 58, + "time_seconds": 1.9, + "path": "reference/frames/0058.png", + "mean_rgb": [ + 59.547, + 61.84, + 50.986 + ], + "sha256": "5fa890e0cde37c779cfc2565a7d8418cec24b6e0d046db13aa058b2390ae333b" + }, + { + "frame": 59, + "time_seconds": 1.9333333333333333, + "path": "reference/frames/0059.png", + "mean_rgb": [ + 60.435, + 62.339, + 52.024 + ], + "sha256": "6df4b8f62375a6af416b7475e6f358e98042407d8a076fd669dccccf78a7824a" + }, + { + "frame": 60, + "time_seconds": 1.9666666666666666, + "path": "reference/frames/0060.png", + "mean_rgb": [ + 60.447, + 62.531, + 50.663 + ], + "sha256": "4c4ee690e2ef44ddb36ae4fbc407aa74421e5f3917041605ab6828e2492943a1" + }, + { + "frame": 61, + "time_seconds": 2.0, + "path": "reference/frames/0061.png", + "mean_rgb": [ + 60.865, + 62.887, + 51.533 + ], + "sha256": "c0294d6b2236f420eb31471a805828b813fa55e4b58bcb4898d53a0dd4e40622" + }, + { + "frame": 62, + "time_seconds": 2.033333333333333, + "path": "reference/frames/0062.png", + "mean_rgb": [ + 60.857, + 63.149, + 51.222 + ], + "sha256": "3151ebdc0efac71bf1adc35bd6067e67e3694b592c39a1f19c6cc79f0b150359" + }, + { + "frame": 63, + "time_seconds": 2.066666666666667, + "path": "reference/frames/0063.png", + "mean_rgb": [ + 60.665, + 63.108, + 51.894 + ], + "sha256": "add87a0620d8b222877e0ba59fb8b64a5955107e77d5b30cfaccb1dbfebdc6ec" + }, + { + "frame": 64, + "time_seconds": 2.1, + "path": "reference/frames/0064.png", + "mean_rgb": [ + 60.63, + 63.465, + 52.266 + ], + "sha256": "31c1a86265baa7645908b11f674bcea8616c5d00a9b693612c4a9a219e10b0a5" + }, + { + "frame": 65, + "time_seconds": 2.1333333333333333, + "path": "reference/frames/0065.png", + "mean_rgb": [ + 59.55, + 63.069, + 53.044 + ], + "sha256": "da57055ea3a479642dfe91a55e6da0156bd297cbc0415b95b635f5a8246eef7c" + }, + { + "frame": 66, + "time_seconds": 2.1666666666666665, + "path": "reference/frames/0066.png", + "mean_rgb": [ + 60.101, + 63.674, + 52.45 + ], + "sha256": "07df76df2a2e24c6a5786da8699451d5e5669f3895745f645db2bc3617f96b53" + }, + { + "frame": 67, + "time_seconds": 2.2, + "path": "reference/frames/0067.png", + "mean_rgb": [ + 60.201, + 63.511, + 52.824 + ], + "sha256": "bfe08e80c86ee21a8669e1cfc61b3fbf89c30ce5d7319fe02fab1ac81965b734" + }, + { + "frame": 68, + "time_seconds": 2.2333333333333334, + "path": "reference/frames/0068.png", + "mean_rgb": [ + 60.906, + 63.854, + 53.403 + ], + "sha256": "545517a2d0622bc434dd6d9637cb807de69957f4c2544c4f2a40aca6c0de1380" + }, + { + "frame": 69, + "time_seconds": 2.2666666666666666, + "path": "reference/frames/0069.png", + "mean_rgb": [ + 60.361, + 63.815, + 53.057 + ], + "sha256": "d6d31e029bd62db37ca02b9534838bfec8a139af13026c6e001abcddb5fd0c0c" + }, + { + "frame": 70, + "time_seconds": 2.3, + "path": "reference/frames/0070.png", + "mean_rgb": [ + 60.856, + 64.308, + 53.598 + ], + "sha256": "1bdfa9220d19a44af431e839bc913cfa968111afaaacff16bbc2f46923bc1328" + }, + { + "frame": 71, + "time_seconds": 2.3333333333333335, + "path": "reference/frames/0071.png", + "mean_rgb": [ + 60.769, + 64.053, + 52.625 + ], + "sha256": "f8b516cb34e18feca8c269883586cc5a009ce0be7704f9b00661204780e77ed5" + }, + { + "frame": 72, + "time_seconds": 2.3666666666666667, + "path": "reference/frames/0072.png", + "mean_rgb": [ + 61.279, + 64.668, + 53.609 + ], + "sha256": "f84b084a7d552b63df48f128db322206c784744adcbbbe7ba2f5af6c78ed4c3d" + }, + { + "frame": 73, + "time_seconds": 2.4, + "path": "reference/frames/0073.png", + "mean_rgb": [ + 61.2, + 64.319, + 52.598 + ], + "sha256": "e7b68f497a2306b5c876467c6f5e1496c2c5c41e51f841095cab47d6e7b35257" + }, + { + "frame": 74, + "time_seconds": 2.433333333333333, + "path": "reference/frames/0074.png", + "mean_rgb": [ + 60.537, + 64.464, + 53.708 + ], + "sha256": "797e0995e837f5a835401c40d24b7f37bcd38720b931aae3858eaa3cddad5928" + }, + { + "frame": 75, + "time_seconds": 2.466666666666667, + "path": "reference/frames/0075.png", + "mean_rgb": [ + 60.333, + 64.193, + 53.836 + ], + "sha256": "5ad3f60aff2af82874eea68e9697b53afafc4b9a6a83041c1bf90774c592bafc" + }, + { + "frame": 76, + "time_seconds": 2.5, + "path": "reference/frames/0076.png", + "mean_rgb": [ + 60.601, + 64.768, + 52.835 + ], + "sha256": "425802256682948e3016f2687bca9d840ab9676411101c5b4c12353a0272a619" + }, + { + "frame": 77, + "time_seconds": 2.533333333333333, + "path": "reference/frames/0077.png", + "mean_rgb": [ + 60.659, + 64.871, + 53.67 + ], + "sha256": "2da364f1a30ddc53e00996e80f2b7d3f930a02871a46bf9beca8ad75d649ce24" + }, + { + "frame": 78, + "time_seconds": 2.566666666666667, + "path": "reference/frames/0078.png", + "mean_rgb": [ + 60.661, + 64.834, + 54.041 + ], + "sha256": "c2ee10d923c5bcf9124aa15f6f8c11c9e0ed7c9c4d359e7042a43efbf726b2a2" + }, + { + "frame": 79, + "time_seconds": 2.6, + "path": "reference/frames/0079.png", + "mean_rgb": [ + 60.885, + 64.923, + 53.21 + ], + "sha256": "dc492b3343c48c972652e35dd59817e7667a224ca2ba54fc22763b9085f74aff" + }, + { + "frame": 80, + "time_seconds": 2.6333333333333333, + "path": "reference/frames/0080.png", + "mean_rgb": [ + 61.412, + 64.764, + 53.779 + ], + "sha256": "eed1fba8a9b77b41d780d3ac4da29610cf4f0fd2de99da0d0f6269139a99cfa1" + }, + { + "frame": 81, + "time_seconds": 2.6666666666666665, + "path": "reference/frames/0081.png", + "mean_rgb": [ + 61.558, + 65.305, + 53.165 + ], + "sha256": "79c2153f889612e9bbf3b79cc480d51d95da090f002978a9430ce9c9f87d4eed" + }, + { + "frame": 82, + "time_seconds": 2.7, + "path": "reference/frames/0082.png", + "mean_rgb": [ + 61.349, + 65.096, + 53.444 + ], + "sha256": "03edf019f71d4388278faa4f4141444897b4b2ec7b7e6a3de4c5d7b8e83bf730" + }, + { + "frame": 83, + "time_seconds": 2.7333333333333334, + "path": "reference/frames/0083.png", + "mean_rgb": [ + 61.562, + 65.318, + 53.504 + ], + "sha256": "c17402a973cecc0a9a702d71b64bbf194a580035e301fbdc28c0e4f942f5e770" + }, + { + "frame": 84, + "time_seconds": 2.7666666666666666, + "path": "reference/frames/0084.png", + "mean_rgb": [ + 62.074, + 65.689, + 53.405 + ], + "sha256": "173982be0b59e09448e5c0916f250ab11afeead429f31d1b1a031edeabd431dc" + }, + { + "frame": 85, + "time_seconds": 2.8, + "path": "reference/frames/0085.png", + "mean_rgb": [ + 62.201, + 65.743, + 53.534 + ], + "sha256": "151fd2dc317e700cdd2204819a5243020236c4ecf745e5aa4b1faef7a1155dd4" + }, + { + "frame": 86, + "time_seconds": 2.8333333333333335, + "path": "reference/frames/0086.png", + "mean_rgb": [ + 61.147, + 65.55, + 55.011 + ], + "sha256": "8d84314130bca75c219006604f8025fa82c30ad8abaf5bdfa6f2dc65263f2217" + }, + { + "frame": 87, + "time_seconds": 2.8666666666666667, + "path": "reference/frames/0087.png", + "mean_rgb": [ + 62.027, + 65.914, + 54.118 + ], + "sha256": "423c82a138478b1a3c7cd81637a3e5954d369ec3170fa77a474ac3393b1446a3" + }, + { + "frame": 88, + "time_seconds": 2.9, + "path": "reference/frames/0088.png", + "mean_rgb": [ + 61.963, + 65.667, + 54.17 + ], + "sha256": "2ea8a3feec5e49574835e53f9e6760ac349dd99d278c50a973d9c4fd8adf0d9b" + }, + { + "frame": 89, + "time_seconds": 2.933333333333333, + "path": "reference/frames/0089.png", + "mean_rgb": [ + 61.908, + 65.793, + 54.08 + ], + "sha256": "cd2298643f6d953a6435b826ab3e9481a5200a05ffebfce02d31f0c6100b1981" + }, + { + "frame": 90, + "time_seconds": 2.966666666666667, + "path": "reference/frames/0090.png", + "mean_rgb": [ + 62.798, + 66.354, + 54.52 + ], + "sha256": "ca827466cce7d6c9c6d5e9ac2f30ea08286057339e4fd50ca173d587f09a5ee5" + }, + { + "frame": 91, + "time_seconds": 3.0, + "path": "reference/frames/0091.png", + "mean_rgb": [ + 61.747, + 65.989, + 54.944 + ], + "sha256": "cc8060e28c7b5336042e3f2041904324de12d7b679c805098f6cfb466f762311" + }, + { + "frame": 92, + "time_seconds": 3.033333333333333, + "path": "reference/frames/0092.png", + "mean_rgb": [ + 61.62, + 65.766, + 54.4 + ], + "sha256": "9058dc0c2740bb3e3d4ba24f6d6f1efdb218fa6339fb5bf60db4f6765335ca06" + }, + { + "frame": 93, + "time_seconds": 3.066666666666667, + "path": "reference/frames/0093.png", + "mean_rgb": [ + 62.064, + 65.932, + 54.609 + ], + "sha256": "a6f45ee63606572ab514ca720f8cb92b720b4ec70625c436d5ddd49291a09567" + }, + { + "frame": 94, + "time_seconds": 3.1, + "path": "reference/frames/0094.png", + "mean_rgb": [ + 62.657, + 66.32, + 54.573 + ], + "sha256": "b0b608428ad8f5c04ddab518001054f1b92d0b2b2be2604397e76ecd02078c32" + }, + { + "frame": 95, + "time_seconds": 3.1333333333333333, + "path": "reference/frames/0095.png", + "mean_rgb": [ + 62.432, + 66.256, + 54.439 + ], + "sha256": "900ff6695c144b6f3a73ba39354143d85ad56b2094f03711ed50c006280dfe1e" + }, + { + "frame": 96, + "time_seconds": 3.1666666666666665, + "path": "reference/frames/0096.png", + "mean_rgb": [ + 63.044, + 66.307, + 53.651 + ], + "sha256": "8f4c57ee6f6733751cac22588eb36365c8fe8a8dea36736908bdca5559dd3265" + }, + { + "frame": 97, + "time_seconds": 3.2, + "path": "reference/frames/0097.png", + "mean_rgb": [ + 63.33, + 66.815, + 54.53 + ], + "sha256": "ef3445e0025574a5e875b0852e7439a09d254a4c5f304d56b61b81b190ed916c" + }, + { + "frame": 98, + "time_seconds": 3.2333333333333334, + "path": "reference/frames/0098.png", + "mean_rgb": [ + 62.484, + 66.068, + 54.582 + ], + "sha256": "b32fbab9d85d52a6b1ed9ab8a4085bab479b34f1b69edb1b77f9b414ee72f1c9" + }, + { + "frame": 99, + "time_seconds": 3.2666666666666666, + "path": "reference/frames/0099.png", + "mean_rgb": [ + 62.252, + 65.559, + 53.936 + ], + "sha256": "e7bc9b6f70e477bf8b6c4129f0c43ee9e2d87bc2ac52f399a7f75a17e28d563f" + }, + { + "frame": 100, + "time_seconds": 3.3, + "path": "reference/frames/0100.png", + "mean_rgb": [ + 62.382, + 65.518, + 54.226 + ], + "sha256": "dcae061de907e6166dc997e69e004a9a52dea4bed6bb5b377ea9a36f38157209" + }, + { + "frame": 101, + "time_seconds": 3.3333333333333335, + "path": "reference/frames/0101.png", + "mean_rgb": [ + 61.939, + 65.48, + 54.215 + ], + "sha256": "a8b7badf5f86c764aaa04e5224220b6323a0db2c4d594dfab4df4626611e9562" + }, + { + "frame": 102, + "time_seconds": 3.3666666666666667, + "path": "reference/frames/0102.png", + "mean_rgb": [ + 62.027, + 65.432, + 54.34 + ], + "sha256": "770674fe57a129fde5bcede874a4245f6114224bb11d83a057fa025eda981b26" + }, + { + "frame": 103, + "time_seconds": 3.4, + "path": "reference/frames/0103.png", + "mean_rgb": [ + 61.7, + 65.259, + 54.143 + ], + "sha256": "96ba58d74beab18ab00804a4a67676898483623c1b2c5b927a27c681d6e74310" + }, + { + "frame": 104, + "time_seconds": 3.433333333333333, + "path": "reference/frames/0104.png", + "mean_rgb": [ + 61.446, + 65.134, + 54.114 + ], + "sha256": "220a6898d7a6cf621edbf07a7a4a0430f905cf68b1be047894ceea7608266fb3" + }, + { + "frame": 105, + "time_seconds": 3.466666666666667, + "path": "reference/frames/0105.png", + "mean_rgb": [ + 61.529, + 64.901, + 54.32 + ], + "sha256": "32fcfe515afdc9aa91dfb8417da770235797764f5c458e4091926c747f9f5892" + }, + { + "frame": 106, + "time_seconds": 3.5, + "path": "reference/frames/0106.png", + "mean_rgb": [ + 61.659, + 65.057, + 54.039 + ], + "sha256": "b2e3f257f000e9a0f5166a246af134eb5b92ef3734c67a65b1c0f6c808664636" + }, + { + "frame": 107, + "time_seconds": 3.533333333333333, + "path": "reference/frames/0107.png", + "mean_rgb": [ + 63.232, + 66.557, + 55.281 + ], + "sha256": "341f416d9556e82a6f5579924122603c5c64f7b1b799c10b58ab01d77ad00c3b" + }, + { + "frame": 108, + "time_seconds": 3.566666666666667, + "path": "reference/frames/0108.png", + "mean_rgb": [ + 62.598, + 66.077, + 54.719 + ], + "sha256": "c526ff42953a3ba8e51c991019baf13763f3e5b9f159c4f697c48fa6677068db" + }, + { + "frame": 109, + "time_seconds": 3.6, + "path": "reference/frames/0109.png", + "mean_rgb": [ + 62.868, + 66.292, + 55.104 + ], + "sha256": "aaa1a8010a9c9cc855eb856e891ae07a8ce7032fd719e494ac023002e3f231ad" + }, + { + "frame": 110, + "time_seconds": 3.6333333333333333, + "path": "reference/frames/0110.png", + "mean_rgb": [ + 63.436, + 66.715, + 56.093 + ], + "sha256": "4065308bc07ad1fbf0428bcb7d967b4addf36ec997baadb6add29ee4097ad176" + }, + { + "frame": 111, + "time_seconds": 3.6666666666666665, + "path": "reference/frames/0111.png", + "mean_rgb": [ + 64.228, + 67.09, + 56.454 + ], + "sha256": "636596e85d0ee4ab1d26ae10a7a7adb93026e483321632c262aee2be4fb6cb87" + }, + { + "frame": 112, + "time_seconds": 3.7, + "path": "reference/frames/0112.png", + "mean_rgb": [ + 64.475, + 67.386, + 56.936 + ], + "sha256": "8561ba08871bb5ad0ec5a65edd22f7f43fd3743ac8c74451e7e67559e2151ccd" + }, + { + "frame": 113, + "time_seconds": 3.7333333333333334, + "path": "reference/frames/0113.png", + "mean_rgb": [ + 64.268, + 67.795, + 57.386 + ], + "sha256": "4f84b4ad9c12d57bd0fa3edea9bf8e663b92cd412e1add4a59ed3717002c7437" + }, + { + "frame": 114, + "time_seconds": 3.7666666666666666, + "path": "reference/frames/0114.png", + "mean_rgb": [ + 64.428, + 67.907, + 58.239 + ], + "sha256": "adbbfc295f5a9317d15f08eaf72944ad26c4e7d881a1d762537bbd03c93f6971" + }, + { + "frame": 115, + "time_seconds": 3.8, + "path": "reference/frames/0115.png", + "mean_rgb": [ + 64.778, + 68.283, + 57.719 + ], + "sha256": "42f8fb204095bc6c79b277c73ec41939b86e6d3070f67e6fd18beef041c5f836" + }, + { + "frame": 116, + "time_seconds": 3.8333333333333335, + "path": "reference/frames/0116.png", + "mean_rgb": [ + 64.927, + 68.501, + 58.517 + ], + "sha256": "d5f2a0f4524b1d3b836b1a835f0c5ca255e8670f46c76b0308459efeb5bfa710" + }, + { + "frame": 117, + "time_seconds": 3.8666666666666667, + "path": "reference/frames/0117.png", + "mean_rgb": [ + 65.15, + 68.601, + 58.281 + ], + "sha256": "10b124a0efcbe8dc6adc9565633522eeda3b5a5bfff31b71abae9f156f2b111b" + }, + { + "frame": 118, + "time_seconds": 3.9, + "path": "reference/frames/0118.png", + "mean_rgb": [ + 65.39, + 68.922, + 59.21 + ], + "sha256": "bcd87cd6013ea453f1ab9363a197ef47ef308e36bb4fdfed4fb2d65312b0f16c" + }, + { + "frame": 119, + "time_seconds": 3.933333333333333, + "path": "reference/frames/0119.png", + "mean_rgb": [ + 65.756, + 69.238, + 59.665 + ], + "sha256": "53e59bf696d2e5e0a815af00e6d87f51d33865261cd0cdc9e755f276d8f00e95" + }, + { + "frame": 120, + "time_seconds": 3.966666666666667, + "path": "reference/frames/0120.png", + "mean_rgb": [ + 66.687, + 69.948, + 59.896 + ], + "sha256": "47c73ac6cf4243ac6eb4109beab6be21ca830b8c9c09a79c1548ab360d4ea971" + }, + { + "frame": 121, + "time_seconds": 4.0, + "path": "reference/frames/0121.png", + "mean_rgb": [ + 66.801, + 70.134, + 60.238 + ], + "sha256": "cc3b772dea095940430ad8ce4a5654c24a90d0b8df77e29267c81563f2f64498" + }, + { + "frame": 122, + "time_seconds": 4.033333333333333, + "path": "reference/frames/0122.png", + "mean_rgb": [ + 66.718, + 70.025, + 60.019 + ], + "sha256": "39124f76990ac5cd5b192da4574aac4bc769c217975d97c7bf2e4401ec269750" + }, + { + "frame": 123, + "time_seconds": 4.066666666666666, + "path": "reference/frames/0123.png", + "mean_rgb": [ + 66.48, + 69.987, + 60.363 + ], + "sha256": "48f71f306bbf9c62169d57e3787bfe91b64991043f1e02ef51b9b3226c025f45" + }, + { + "frame": 124, + "time_seconds": 4.1, + "path": "reference/frames/0124.png", + "mean_rgb": [ + 66.864, + 70.303, + 60.085 + ], + "sha256": "2b40465001eab2e91614f4c93b30705666c6ed99f879dafed9e5fc0cc0467f40" + }, + { + "frame": 125, + "time_seconds": 4.133333333333334, + "path": "reference/frames/0125.png", + "mean_rgb": [ + 67.113, + 70.781, + 59.964 + ], + "sha256": "796a8c8447e279ce615bdfda951231dba2b9378075042a3c56d924000bc830a2" + }, + { + "frame": 126, + "time_seconds": 4.166666666666667, + "path": "reference/frames/0126.png", + "mean_rgb": [ + 66.331, + 70.173, + 60.118 + ], + "sha256": "3aa02485be56aee35d7235f9d462fa1337d4615b583bc51310070c3f0cc5aece" + }, + { + "frame": 127, + "time_seconds": 4.2, + "path": "reference/frames/0127.png", + "mean_rgb": [ + 67.903, + 70.519, + 60.702 + ], + "sha256": "7902f4692d69c432a1bfaa539d0a70bf45d2e2fb2244b940673fbb88c7834a6b" + }, + { + "frame": 128, + "time_seconds": 4.233333333333333, + "path": "reference/frames/0128.png", + "mean_rgb": [ + 69.135, + 71.14, + 61.448 + ], + "sha256": "5688d480b473772608ae25c975e70e10e7d9f762c84fcf8d8fde98b6f4ebc597" + } + ] +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/observations.md b/astra_scene_test/Scene_04/reference/observations.md new file mode 100644 index 0000000000000000000000000000000000000000..5a3089e941ad401ee69e3a1c4e1c2f4e5fc11f90 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/observations.md @@ -0,0 +1,127 @@ +# Reference observations and calibration record + +The original `night_front_wide_120fov.mp4` is the sole visual reference. Its bytes +are preserved and identified by SHA-256 in `logs/session.json`. + +FFmpeg decoded 128 frames, 1280 × 720, progressive H.264, 30/1 fps, time base +1/15360, no audio stream. Frame 1 is t=0; frame 128 is t=4.233333 s; the encoded +duration is 128/30 = 4.266667 s. All 128 decoded PNGs are retained with exact +frame-index timestamps in `metadata.json`. + +## Sequence observations + +- Opening: olive-gray humid sky occupies much of the image. A prominent left + apartment tower sits behind the nearer red brick row. The road has restrained, + uneven wet reflections. A red PARK board and silver scaffold dominate the + right foreground. A black Jeep with a rear spare wheel is parked on the right. +- Around 1 s: the PARK board and opening scaffold move out of the right edge. + Left storefront text and the white SUV grow rapidly. The source has a slight + change in camera pitch, not perfectly smooth eased motion. +- Around 2 s: the white SUV occupies the lower left, followed by a white sedan. + Construction fencing and orange/white water barriers approach on the right. + Fixed windshield smears become conspicuous around the brighter passing lamps. +- Around 3 s: the nearer left signal moves rapidly left/up; the farther right + signal remains nearer the center. Their depths cannot be represented by one + cross-street plane. The tall left tower rises out of the top of the frame. +- Ending: the intersection and side-street crosswalks enter the foreground. + The right far-side red brick corner/storefront becomes exposed. Distant + oncoming white-blue lights remain near the road's vanishing region. +- Throughout: a curved black lower windshield seal and muted silver hood sliver + stay near the bottom edge. Rain features are largely attached to the glass; + they are not independent random particles per frame. Glare intensity and shape + change when world-space lights pass behind those water features. + +## Measured motion + +`track_reference.py` uses forward/backward Lucas–Kanade checks to reject unstable +tracks. `feature_tracks.npz` retains the observations; `tracks.jpg` shows the long +trajectories. The camera fit uses a selected subset of static architectural and +signal features, with robust residuals and a continuous forward trajectory. + +The selected 120-degree pinhole fit uses focal length 369.5 pixels, principal +point (640,480), and free translation epipole approximately (640.17,514.72). +Its selected-track median residual is 0.994 px and 90th percentile 2.901 px. +A fit that forced the epipole to the visible distant road center (615,537) was +rejected: its aggregate score concealed more than 100 pixels of near-signal +vertical error late in the sequence. Cylindrical/equirectangular alternatives +and a free radial coefficient were also tested; the simple pinhole model was +retained. These are selected-point fit residuals, **not** whole-image fidelity +scores. Metric scale and exact lens distortion remain underdetermined. + +Ground contacts of the paired left lamp were subsequently used to orient the +world road plane. The current physical pitch is about 4.726 degrees, camera +height 2.966 scene units, and total travel 27.8 units. The world trajectory is +then almost level. This does not change the fitted image-space motion: all +triangulated anchors are transformed into the new world basis. A smooth inferred +downhill grade beyond the intersection brings the distant roadway/headlights +into the lower visible vanishing region. The grade is a reconstruction inference, +not a separately measured physical survey. + +Near facade windows, storefront letters, PARK boards and parked vehicle details +were triangulated separately. They exposed under-estimated facade and scaffold +depth in the initial scene, despite plausible opening-frame positions. Those +depths, roof breaks, window scale, and road contacts were revised before the +whole-sequence preview. The observed illuminated tower panes are actual emissive +mesh faces at their measured world positions. + +## Initial preview findings + +The first CPU preview exposed an inverted Blender pitch convention. Positive +upward pitch requires rotation X = 90° + pitch for a camera looking along +Y. +The original analytical overlay used the correct upward convention; the scene +camera has been corrected before further layout evaluation. The initial tower +wire overlay also shows excessive near perspective; its setback and facade +orientation require correction using the tracked windows. + +## Native appearance review, second full-sequence pass + +The 128-frame motion preview was reviewed in eight synchronized paired sheets. +The revised camera uses all128 recorded frame poses, retaining the original17 +anchor times. Actual signal emitters are now fitted separately from the original +LK feature corners. The reduced near-vehicle lengths improve their exit timing; +the canopy and crosswalk footprints are checked again at native resolution. + +Native frames1,17,33,65,97,128 from appearance_refined exposed remaining overly +plain storefront interiors, undersized PARK letters, square vehicle light +housings, and strong distant headlight points. Those drive the next changes. +The continuous road grid removed the older disconnected reflection bands. +The current lens kernels still need softer internal wipe curves and weaker +secondary copies around paired lamps. Broader glare alone increases highlight +energy too much; color, halo width, and core intensity must be checked together. + +The source's upper sky shifts from brown/olive in the opening to greener, cooler +midtones later. Uniform sky patches also have subtle blue-channel sensor noise. +A global white-balance trial improved sky color but overcooled the roadway, so it +was not selected. Noise strength was reduced after measured blue-channel noise +exceeded the reference. These are camera-response trials, not geometric fixes. + +### Native optical and contact refinement, 21:42 UTC + +The native opening and middle views still showed a clean computer-rendered response after the first complete motion review. Multi-scale source sky measurements found roughly 0.6–1.2 code values of color variation in spatial bands around 2–8 pixels, above the fine-grain model. The added deterministic correlated sensor field is independent of the fixed windshield water. Source lag-one bandpass RGB correlations were about 0.206/0.192/0.151; the field includes a modest previous-frame contribution. + +Camera-visible sky probes with background strength zero proved that the upper homogeneous volume alone exceeded the ending source sky brightness. A fixed three-layer humidity profile reduces that upper in-scattering. The camera-visible background color is then fitted from numeric mean colors at nine timestamps. This remains an inferred appearance response, not a recovered physical exposure curve. + +Parking-bay curb geometry now follows the near vehicle contacts. A three-time license-plate fit places the first dark SUV beyond the left crossing; the later row remains inferred. Its selected point residual is around one to two pixels, which is not a whole-car or whole-image fidelity score. The far-left crown was raised to improve its beginning/end silhouette. + +A bright white pavement patch was traced through native region renders with original, no-caustic, rough, and diffuse material settings. Its persistence ruled out a specular/material cause. The scene light inventory exposed restaurant ceiling lights at the fitted-building transform origin because matrix_world was read before a dependency-graph update. The builder now updates the graph before that transform, and the reopened-scene audit checks room-light height above the road. + +Still approximate: exact car body models, window and facade detail beyond tracked planes, some tree envelopes, far parking spacing, road appearance, and individual windshield caustics. The broad-scatter trials retain the small emitter cores; overly strong trials remain archived as rejected comparisons. + +### Angular signal response correction, 22:47 UTC + +The native 256-sample visor candidate made the left signal progressively too +bright and the right signal too weak at the opening. A localized chroma-energy +measurement at the independently tracked source centroids gave source/candidate +values of 7396/15106, 5833/34646, 24493/165187 for the left signal at frames +1/65/128. Right values were 40905/9873, 77359/52043, 93261/164351. These are +appearance diagnostics affected by background and saturation, not physical +radiometry. A frame65 native96 render with all auxiliary signal point lights +removed reduced left energy to29953 and right to35483; the visible lens response +remained the main cause. Inferred angular emission parameters are now stored in +`assets/signal_response.json`. They use continuous world-direction shading and +no frame-dependent material keys; native comparison remains required. + +A paired native crop of the whiteSUV atframe65 showed the fitted roof and wheel +locations were reasonably aligned, so no additional body-height change was +applied. The source has dense bright silver wheel detail and dark inner window +pillars, which replaced the candidate's sparse dark wheels and white dividers. diff --git a/astra_scene_test/Scene_04/reference/right_facade_fit_trial.json b/astra_scene_test/Scene_04/reference/right_facade_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..81e593635c89315f190562e15a553877ca639611 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/right_facade_fit_trial.json @@ -0,0 +1,570 @@ +{ + "right_68": { + "xyz": [ + 28.164073952500807, + 27.454335437630817, + 31.712728519012344 + ], + "observations": { + "1": [ + 930.0, + 203.0 + ], + "9": [ + 951.3560791015625, + 181.06112670898438 + ], + "17": [ + 975.6013793945312, + 160.9532928466797 + ], + "25": [ + 998.8346557617188, + 134.32972717285156 + ], + "33": [ + 1020.1860961914062, + 98.49620056152344 + ], + "41": [ + 1046.5966796875, + 67.38304138183594 + ], + "49": [ + 1078.5074462890625, + 33.2271728515625 + ] + }, + "projections": { + "1": [ + 929.4197120331812, + 200.78870867974518 + ], + "9": [ + 951.259062287832, + 179.5327814973894 + ], + "17": [ + 974.996497004848, + 160.1114889024342 + ], + "25": [ + 997.172757514137, + 134.70113168225413 + ], + "33": [ + 1019.3931591776368, + 99.54316444012062 + ], + "41": [ + 1047.0306594707035, + 69.71500971405368 + ], + "49": [ + 1082.1926218340823, + 33.10376731977368 + ] + }, + "mean_error_pixels": 1.9899518547375785, + "max_error_pixels": 3.6872412075816077 + }, + "right_81": { + "xyz": [ + 28.30115444344072, + 27.801150959208716, + 34.45506957238043 + ], + "observations": { + "1": [ + 924.0, + 180.0 + ], + "9": [ + 944.8445434570312, + 157.43301391601562 + ], + "17": [ + 968.5233764648438, + 136.40621948242188 + ], + "25": [ + 991.2452392578125, + 108.56942749023438 + ], + "33": [ + 1011.849609375, + 71.45540618896484 + ], + "41": [ + 1036.534912109375, + 40.006202697753906 + ], + "49": [ + 1067.1043701171875, + 5.156663417816162 + ] + }, + "projections": { + "1": [ + 924.150283245417, + 178.4450205626544 + ], + "9": [ + 945.2708485038746, + 156.15412746686854 + ], + "17": [ + 968.1191241331999, + 135.84376504783768 + ], + "25": [ + 989.4407088129258, + 109.30350609761354 + ], + "33": [ + 1010.6616892420786, + 72.65217863080426 + ], + "41": [ + 1036.566464218301, + 42.022222259632315 + ], + "49": [ + 1069.994553646233, + 4.179430896426084 + ] + }, + "mean_error_pixels": 1.7577876456737382, + "max_error_pixels": 3.0509251436947062 + }, + "right_102": { + "xyz": [ + 29.170834269645503, + 26.883622877266156, + 35.59841071701788 + ], + "observations": { + "1": [ + 940.0, + 159.0 + ], + "9": [ + 962.2224731445312, + 134.9095458984375 + ], + "17": [ + 987.5474243164062, + 112.24951171875 + ], + "25": [ + 1012.031494140625, + 82.62113952636719 + ], + "33": [ + 1034.291259765625, + 43.65916442871094 + ], + "41": [ + 1060.844482421875, + 9.848000526428223 + ] + }, + "projections": { + "1": [ + 940.0415471220175, + 158.56034599232225 + ], + "9": [ + 962.7287601378774, + 134.40222846678432 + ], + "17": [ + 987.2865356635257, + 112.21011290253887 + ], + "25": [ + 1010.5141717054051, + 83.39007480459372 + ], + "33": [ + 1033.9845714886237, + 43.61951601769863 + ], + "41": [ + 1062.2367571222849, + 9.95662650782782 + ] + }, + "mean_error_pixels": 0.8048284001091419, + "max_error_pixels": 1.7010375758703349 + }, + "right_105": { + "xyz": [ + 29.5742776844739, + 27.157593093400507, + 32.69628888665872 + ], + "observations": { + "1": [ + 945.0, + 191.0 + ], + "9": [ + 967.8318481445312, + 168.51951599121094 + ], + "17": [ + 993.9000854492188, + 147.25721740722656 + ], + "25": [ + 1019.2359008789062, + 119.6383285522461 + ], + "33": [ + 1042.791015625, + 82.47766876220703 + ], + "41": [ + 1070.8248291015625, + 50.493186950683594 + ], + "49": [ + 1104.236328125, + 16.270078659057617 + ] + }, + "projections": { + "1": [ + 945.5914015027788, + 189.31097688389377 + ], + "9": [ + 968.6681154196949, + 167.1654756121166 + ], + "17": [ + 993.7067926214829, + 146.92026860688952 + ], + "25": [ + 1017.2629637304644, + 120.50979127559498 + ], + "33": [ + 1041.0665535968055, + 83.92810582520951 + ], + "41": [ + 1070.3229698299363, + 52.842684856959636 + ], + "49": [ + 1107.6897858767854, + 14.642169971563249 + ] + }, + "mean_error_pixels": 2.057153403319035, + "max_error_pixels": 3.8179126677003175 + }, + "right_120": { + "xyz": [ + 29.293103965849763, + 26.84076697958025, + 33.98910837106282 + ], + "observations": { + "1": [ + 944.0, + 174.0 + ], + "9": [ + 966.49560546875, + 150.54212951660156 + ], + "17": [ + 992.2581787109375, + 128.60488891601562 + ], + "25": [ + 1017.1861572265625, + 100.16828918457031 + ], + "33": [ + 1040.0406494140625, + 62.25627517700195 + ], + "41": [ + 1067.5091552734375, + 29.437023162841797 + ] + }, + "projections": { + "1": [ + 943.9422407914919, + 173.4249581436335 + ], + "9": [ + 967.0282821110388, + 150.09609847154655 + ], + "17": [ + 992.0703550782074, + 128.66217598550003 + ], + "25": [ + 1015.7346380420024, + 100.80546349229013 + ], + "33": [ + 1039.700696536326, + 62.31903848069072 + ], + "41": [ + 1068.8762077365977, + 29.52289120492776 + ] + }, + "mean_error_pixels": 0.7949526773861596, + "max_error_pixels": 1.5852126171476808 + }, + "right_187": { + "xyz": [ + 27.677596814305723, + 24.509843771235484, + 18.24773604830138 + ], + "observations": { + "1": [ + 973.0, + 319.0 + ], + "9": [ + 1001.975341796875, + 303.50115966796875 + ], + "17": [ + 1035.0302734375, + 289.8284912109375 + ], + "25": [ + 1069.6700439453125, + 269.08013916015625 + ], + "33": [ + 1105.9835205078125, + 239.00192260742188 + ], + "41": [ + 1149.0711669921875, + 213.0996856689453 + ], + "49": [ + 1199.2894287109375, + 184.6190643310547 + ], + "57": [ + 1253.4111328125, + 154.2439727783203 + ] + }, + "projections": { + "1": [ + 976.2867105164453, + 318.3585997067487 + ], + "9": [ + 1004.948829490924, + 302.7888148901767 + ], + "17": [ + 1037.2408482191572, + 288.67702848046304 + ], + "25": [ + 1067.9577781721277, + 269.2201710138815 + ], + "33": [ + 1100.0374984294895, + 241.08238828556227 + ], + "41": [ + 1144.2260014077397, + 215.78139258167073 + ], + "49": [ + 1197.7319073561862, + 185.35679528500805 + ], + "57": [ + 1260.401001929787, + 150.81626657641846 + ] + }, + "mean_error_pixels": 3.995321160871291, + "max_error_pixels": 7.785078039644817 + }, + "right_273": { + "xyz": [ + 28.926562911641405, + 26.031129978599242, + 25.215874260391033 + ], + "observations": { + "1": [ + 958.0, + 258.0 + ], + "9": [ + 983.905029296875, + 238.2399444580078 + ], + "17": [ + 1013.7578125, + 219.835205078125 + ], + "25": [ + 1044.0289306640625, + 194.3040313720703 + ], + "33": [ + 1073.928955078125, + 158.7572784423828 + ], + "41": [ + 1109.5731201171875, + 128.22463989257812 + ], + "49": [ + 1151.25732421875, + 95.4827880859375 + ], + "57": [ + 1195.6387939453125, + 59.72053146362305 + ], + "65": [ + 1246.5206298828125, + 26.361682891845703 + ] + }, + "projections": { + "1": [ + 961.3155858518151, + 253.38672603056693 + ], + "9": [ + 986.8539133951642, + 234.36955707169747 + ], + "17": [ + 1015.021155924569, + 216.9319743623688 + ], + "25": [ + 1041.6034696606982, + 193.87180225370724 + ], + "33": [ + 1068.8890436875026, + 161.52877488418835 + ], + "41": [ + 1104.35291756715, + 133.02328113368065 + ], + "49": [ + 1148.1834784981893, + 98.52345646068045 + ], + "57": [ + 1196.8794430682246, + 61.07564445718725 + ], + "65": [ + 1252.8765680528745, + 23.185664992022794 + ] + }, + "mean_error_pixels": 4.6983738336353325, + "max_error_pixels": 7.105282522296129 + }, + "right_289": { + "xyz": [ + 27.02189649443526, + 24.324746438760688, + 17.20732234107166 + ], + "observations": { + "1": [ + 969.0, + 331.0 + ], + "9": [ + 998.3746948242188, + 315.389404296875 + ], + "17": [ + 1031.39453125, + 301.6976318359375 + ], + "25": [ + 1066.3258056640625, + 281.682861328125 + ], + "33": [ + 1102.835205078125, + 251.97650146484375 + ], + "41": [ + 1146.337646484375, + 227.27981567382812 + ], + "49": [ + 1196.9769287109375, + 200.24212646484375 + ], + "57": [ + 1250.9990234375, + 170.29156494140625 + ] + }, + "projections": { + "1": [ + 972.4574549271849, + 329.18509872301456 + ], + "9": [ + 1001.1080104555126, + 314.2858852330318 + ], + "17": [ + 1033.4977548570887, + 300.8407419569904 + ], + "25": [ + 1064.3293519140573, + 282.0973991547256 + ], + "33": [ + 1096.5822204184697, + 254.8232911769489 + ], + "41": [ + 1141.4358702539184, + 230.32926932226064 + ], + "49": [ + 1195.6224498521601, + 200.85208500333852 + ], + "57": [ + 1259.6224463179383, + 167.16710308843255 + ] + }, + "mean_error_pixels": 4.307945754301022, + "max_error_pixels": 9.17200545385546 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/right_tower_fit_trial.json b/astra_scene_test/Scene_04/reference/right_tower_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..5489368ecc131cfead71ad97c26e65019149dea1 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/right_tower_fit_trial.json @@ -0,0 +1,222 @@ +{ + "right_tower_20": { + "xyz": [ + 63.334365873116475, + 270.9509583926246, + 175.30622935473338 + ], + "observations": { + "1": [ + 696.0, + 319.0 + ], + "9": [ + 698.6965942382812, + 316.6335754394531 + ] + }, + "projections": { + "1": [ + 695.9363346648195, + 318.9818654923959 + ], + "9": [ + 698.7597052558851, + 316.6516302905852 + ] + }, + "mean_error_pixels": 0.06592025299640418, + "max_error_pixels": 0.06619769837156023 + }, + "right_tower_42": { + "xyz": [ + 47.43072001121142, + 243.4415296911511, + 157.2507216286171 + ], + "observations": { + "1": [ + 683.0, + 319.0 + ], + "9": [ + 685.7332763671875, + 316.543212890625 + ] + }, + "projections": { + "1": [ + 682.9972592385708, + 318.9994002895519 + ], + "9": [ + 685.7359921176818, + 316.5438103079563 + ] + }, + "mean_error_pixels": 0.0027931454950384364, + "max_error_pixels": 0.0028056061436729555 + }, + "right_tower_88": { + "xyz": [ + 63.14456605675988, + 249.02486851492836, + 145.99630044543034 + ], + "observations": { + "1": [ + 702.0, + 338.0 + ], + "9": [ + 706.976806640625, + 336.4349670410156 + ] + }, + "projections": { + "1": [ + 703.0434518092047, + 338.35376991236944 + ], + "9": [ + 705.9443548274598, + 336.0832519432736 + ] + }, + "mean_error_pixels": 1.0962535620907232, + "max_error_pixels": 1.101791645017559 + }, + "right_tower_200": { + "xyz": [ + 10.67180579347816, + 32.49477493596642, + 15.01238069590439 + ], + "observations": { + "1": [ + 729.0, + 395.0 + ], + "9": [ + 735.5307006835938, + 387.2533264160156 + ], + "17": [ + 744.096435546875, + 381.1778564453125 + ], + "25": [ + 750.9470825195312, + 370.4839172363281 + ], + "33": [ + 755.5595092773438, + 354.3482360839844 + ], + "41": [ + 763.8697509765625, + 344.31549072265625 + ], + "49": [ + 774.3069458007812, + 330.7001647949219 + ], + "57": [ + 785.5200805664062, + 317.04962158203125 + ], + "65": [ + 800.2605590820312, + 305.1573791503906 + ], + "73": [ + 816.545166015625, + 283.66912841796875 + ], + "81": [ + 834.3521728515625, + 258.90399169921875 + ], + "89": [ + 857.5203857421875, + 224.22889709472656 + ], + "97": [ + 888.4989013671875, + 182.58047485351562 + ], + "105": [ + 925.927978515625, + 137.70187377929688 + ], + "113": [ + 971.2266845703125, + 77.87835693359375 + ] + }, + "projections": { + "1": [ + 730.0075929863251, + 392.44050568268665 + ], + "9": [ + 737.65058245849, + 384.4974153379254 + ], + "17": [ + 745.8297245132167, + 378.1557711015889 + ], + "25": [ + 751.9709047147448, + 367.99011682202865 + ], + "33": [ + 756.8385770273217, + 353.298075740179 + ], + "41": [ + 765.133419000778, + 343.51674296718295 + ], + "49": [ + 775.0840030091995, + 330.51852127489667 + ], + "57": [ + 785.838297585316, + 317.60788838588303 + ], + "65": [ + 798.7625448150222, + 305.8218284070133 + ], + "73": [ + 814.4799937870712, + 285.31230816387074 + ], + "81": [ + 830.9228902377265, + 261.93317056308524 + ], + "89": [ + 854.6878201808837, + 227.71391037743513 + ], + "97": [ + 887.8379016710481, + 184.9707136471534 + ], + "105": [ + 925.3786266761325, + 138.0653615569338 + ], + "113": [ + 974.5131173990476, + 73.37908167747867 + ] + }, + "mean_error_pixels": 2.603503511446887, + "max_error_pixels": 5.571724918557732 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/right_warm_windows_trial.json b/astra_scene_test/Scene_04/reference/right_warm_windows_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..a492c642b020dde52293bdd0a009e936cc759682 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/right_warm_windows_trial.json @@ -0,0 +1,72 @@ +{ + "upper_warm_left": { + "xyz": [ + 27.124731577334103, + 29.26344576828372, + 32.061021796888525 + ], + "observations": { + "1": [ + 914, + 184 + ], + "17": [ + 967, + 146 + ], + "33": [ + 1006, + 80 + ] + }, + "predictions": { + "1": [ + 918.6034149519265, + 186.6255490338956 + ], + "17": [ + 962.9376996537841, + 143.73006470629207 + ], + "33": [ + 1006.1911962764011, + 80.05577861788169 + ] + } + }, + "upper_warm_right": { + "xyz": [ + 28.114905993348337, + 28.180852673032906, + 32.542485517819685 + ], + "observations": { + "1": [ + 940, + 172 + ], + "17": [ + 989, + 126 + ], + "33": [ + 1035, + 54 + ] + }, + "predictions": { + "1": [ + 939.0877669497763, + 171.37658672670756 + ], + "17": [ + 987.9092830981837, + 124.75433140280029 + ], + "33": [ + 1036.8208673440329, + 55.6607459327185 + ] + } + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/roof_fit_trial.json b/astra_scene_test/Scene_04/reference/roof_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..5c6ea882ad31cfa2bf5018407bbfe37fd4e897fa --- /dev/null +++ b/astra_scene_test/Scene_04/reference/roof_fit_trial.json @@ -0,0 +1,105 @@ +{ + "left_red_roof_far": { + "xyz": [ + -36.759071792031946, + 48.2937745907266, + 41.09180880174977 + ], + "observations": { + "1": [ + 350, + 245 + ], + "33": [ + 318, + 225 + ], + "65": [ + 250, + 146 + ] + }, + "projections": { + "1": [ + 352.2000815491876, + 248.4918251772228 + ], + "33": [ + 306.27951141803055, + 197.84171204533192 + ], + "65": [ + 251.26954300986347, + 147.0092962968103 + ] + }, + "mean_error_pixels": 11.776137573272608, + "max_error_pixels": 29.579426249147325 + }, + "right_roof_near": { + "xyz": [ + 32.46600711830408, + 31.67574879264241, + 48.185455586072386 + ], + "observations": { + "1": [ + 917, + 107 + ], + "33": [ + 987, + -2 + ] + }, + "projections": { + "1": [ + 916.2621332006645, + 106.5089388301543 + ], + "33": [ + 987.5842824557445, + -1.609250454833841 + ] + }, + "mean_error_pixels": 0.7946181391020805, + "max_error_pixels": 0.8863342970301022 + }, + "right_roof_far": { + "xyz": [ + 25.660842924049007, + 37.13635965006347, + 36.43352533259185 + ], + "observations": { + "1": [ + 840, + 239 + ], + "33": [ + 882, + 174 + ], + "65": [ + 937, + 96 + ] + }, + "projections": { + "1": [ + 835.7918806934088, + 238.19368645918846 + ], + "33": [ + 881.0689773829666, + 171.53659498553998 + ], + "65": [ + 940.6988146210726, + 98.88881190948808 + ] + }, + "mean_error_pixels": 3.870459345248045, + "max_error_pixels": 4.693235967800995 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/scaffold_corner_fit.json b/astra_scene_test/Scene_04/reference/scaffold_corner_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..7707a459c0cf91a464af5f1da1e728918ad7d8db --- /dev/null +++ b/astra_scene_test/Scene_04/reference/scaffold_corner_fit.json @@ -0,0 +1,28 @@ +{ + "observations": { + "1": [ + 1026, + 404 + ], + "17": [ + 1150, + 378 + ] + }, + "xyz": [ + 18.86208548, + 15.44290225, + 7.75631084 + ], + "projected": { + "1": [ + 1026.4935, + 406.1217 + ], + "17": [ + 1149.6334, + 376.5199 + ] + }, + "note": "Two-time manual canopy corner fit; retained15.5 terminal station within.06worldunits. Other canopy details are inferred." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/scaffold_fit_trial.json b/astra_scene_test/Scene_04/reference/scaffold_fit_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..f9d96e08300e7fceaa0806e2e2e08d3452175d5a --- /dev/null +++ b/astra_scene_test/Scene_04/reference/scaffold_fit_trial.json @@ -0,0 +1,1600 @@ +{ + "feature_295": { + "xyz": [ + 17.98962247251848, + 12.214667649393625, + 10.090136573359569 + ], + "observations": { + "1": [ + 1073.0, + 319.0 + ], + "3": [ + 1090.437744140625, + 311.3988037109375 + ], + "5": [ + 1108.6888427734375, + 302.650390625 + ], + "7": [ + 1128.174560546875, + 293.5535888671875 + ], + "9": [ + 1148.94189453125, + 285.13299560546875 + ], + "11": [ + 1170.5582275390625, + 275.79278564453125 + ], + "13": [ + 1193.4713134765625, + 266.57568359375 + ], + "15": [ + 1217.939697265625, + 257.54241943359375 + ], + "17": [ + 1243.6007080078125, + 248.06011962890625 + ], + "19": [ + 1270.5804443359375, + 238.4796905517578 + ] + }, + "projections": { + "1": [ + 1075.537605871427, + 317.4038034774666 + ], + "3": [ + 1091.664454772997, + 310.3441529661844 + ], + "5": [ + 1108.9489232739788, + 302.77605077519627 + ], + "7": [ + 1127.5246591323094, + 294.64077010200856 + ], + "9": [ + 1147.546706186883, + 285.87018237741995 + ], + "11": [ + 1168.9933587812156, + 277.4439722823299 + ], + "13": [ + 1192.2430598810336, + 268.2693722384183 + ], + "15": [ + 1217.5378581348486, + 258.24586853489984 + ], + "17": [ + 1245.1651471877676, + 247.25411714121927 + ], + "19": [ + 1270.9457521796828, + 235.34411344034868 + ] + }, + "mean_error_pixels": 1.7842935304852579, + "max_error_pixels": 3.156785333578243 + }, + "feature_308": { + "xyz": [ + 17.973461301536837, + 12.124462931194413, + 9.422856201060466 + ], + "observations": { + "1": [ + 1079.0, + 334.0 + ], + "3": [ + 1096.8663330078125, + 326.651123046875 + ], + "5": [ + 1115.5032958984375, + 318.5608825683594 + ], + "7": [ + 1135.580322265625, + 310.2079772949219 + ], + "9": [ + 1156.748779296875, + 301.8352966308594 + ], + "11": [ + 1178.7628173828125, + 293.06829833984375 + ], + "13": [ + 1202.04833984375, + 284.24798583984375 + ], + "15": [ + 1226.8780517578125, + 275.6227722167969 + ], + "17": [ + 1252.736083984375, + 266.79705810546875 + ] + }, + "projections": { + "1": [ + 1081.1033841356207, + 331.85854261798727 + ], + "3": [ + 1097.6305646648075, + 325.23099490418076 + ], + "5": [ + 1115.3610878509994, + 318.1206180584261 + ], + "7": [ + 1134.4358334158674, + 310.47085932537306 + ], + "9": [ + 1155.0185649491214, + 302.21597977700935 + ], + "11": [ + 1177.1168356101584, + 294.32341814489695 + ], + "13": [ + 1201.107394012406, + 285.715562950062 + ], + "15": [ + 1227.2490400492, + 276.29453712617834 + ], + "17": [ + 1255.850011436858, + 265.9437661795869 + ] + }, + "mean_error_pixels": 1.7591440914045036, + "max_error_pixels": 3.228722857431823 + }, + "feature_341": { + "xyz": [ + 17.935187588890667, + 12.174588796800322, + 8.56498847135164 + ], + "observations": { + "1": [ + 1080.0, + 354.0 + ], + "3": [ + 1098.15673828125, + 347.5583190917969 + ], + "5": [ + 1117.26416015625, + 340.69268798828125 + ], + "7": [ + 1137.2806396484375, + 333.71832275390625 + ], + "9": [ + 1158.8089599609375, + 326.8753356933594 + ], + "11": [ + 1180.95947265625, + 318.8797302246094 + ], + "13": [ + 1204.7689208984375, + 311.1215515136719 + ], + "15": [ + 1230.211669921875, + 304.0625 + ], + "17": [ + 1257.08740234375, + 296.5989074707031 + ] + }, + "projections": { + "1": [ + 1082.6268676635427, + 353.14172891154135 + ], + "3": [ + 1099.283022503511, + 347.25395220628866 + ], + "5": [ + 1117.1584348670578, + 340.93677736203176 + ], + "7": [ + 1136.3966116132174, + 334.13963778601715 + ], + "9": [ + 1157.1645000752405, + 326.80370733739954 + ], + "11": [ + 1179.5050433143065, + 319.87893351228445 + ], + "13": [ + 1203.7757672140883, + 312.31775484854273 + ], + "15": [ + 1230.2430702747426, + 304.03228404574907 + ], + "17": [ + 1259.2247288506815, + 294.91768354277735 + ] + }, + "mean_error_pixels": 1.4337507880783962, + "max_error_pixels": 2.763523653426982 + }, + "feature_168": { + "xyz": [ + 14.955577427609336, + 13.217514803426011, + 7.239519701941776 + ], + "observations": { + "1": [ + 987.0, + 395.0 + ], + "3": [ + 1000.113037109375, + 390.6627197265625 + ], + "5": [ + 1013.9102783203125, + 385.85498046875 + ], + "7": [ + 1028.848876953125, + 380.350341796875 + ], + "9": [ + 1044.7587890625, + 374.79443359375 + ], + "11": [ + 1061.2098388671875, + 369.2581787109375 + ], + "13": [ + 1079.350341796875, + 364.4077453613281 + ], + "15": [ + 1098.239990234375, + 359.47760009765625 + ], + "17": [ + 1118.3597412109375, + 354.4563903808594 + ], + "19": [ + 1138.664306640625, + 348.654541015625 + ], + "21": [ + 1160.455322265625, + 341.5187072753906 + ], + "23": [ + 1183.1505126953125, + 332.41973876953125 + ], + "25": [ + 1207.3927001953125, + 321.84259033203125 + ], + "27": [ + 1231.8936767578125, + 309.96258544921875 + ] + }, + "projections": { + "1": [ + 988.4086786101495, + 394.20038832437336 + ], + "3": [ + 1000.9444106829317, + 390.00035446692726 + ], + "5": [ + 1014.3369795158817, + 385.51546722435415 + ], + "7": [ + 1028.6813676502634, + 380.7141246279019 + ], + "9": [ + 1044.087134761508, + 375.55987472853127 + ], + "11": [ + 1060.6311887819734, + 370.8831960146496 + ], + "13": [ + 1078.51062594133, + 365.79400991478684 + ], + "15": [ + 1097.8982828513463, + 360.23887511973464 + ], + "17": [ + 1118.998159100936, + 354.15471446623064 + ], + "19": [ + 1138.4289946247188, + 347.1157227930177 + ], + "21": [ + 1159.5229006123957, + 339.51855209911423 + ], + "23": [ + 1182.5027432535155, + 331.2883799429656 + ], + "25": [ + 1207.6330735578285, + 322.33638949806414 + ], + "27": [ + 1233.1287015661478, + 311.21752102217226 + ] + }, + "mean_error_pixels": 1.207878722671208, + "max_error_pixels": 2.206814643008365 + }, + "feature_249": { + "xyz": [ + 16.128547572231426, + 13.551376728770764, + 7.7529537569667015 + ], + "observations": { + "1": [ + 1004.0, + 386.0 + ], + "3": [ + 1016.9265747070312, + 381.63446044921875 + ], + "5": [ + 1031.080810546875, + 376.7253112792969 + ], + "7": [ + 1045.8756103515625, + 371.49066162109375 + ], + "9": [ + 1061.5927734375, + 366.2908935546875 + ], + "11": [ + 1078.2686767578125, + 360.9084777832031 + ], + "13": [ + 1096.1959228515625, + 355.87994384765625 + ], + "15": [ + 1115.353759765625, + 351.0243835449219 + ], + "17": [ + 1135.5426025390625, + 345.7704772949219 + ], + "19": [ + 1156.646728515625, + 340.1642761230469 + ], + "21": [ + 1178.392822265625, + 332.8139953613281 + ], + "23": [ + 1200.85595703125, + 323.7879638671875 + ], + "25": [ + 1224.433837890625, + 313.14898681640625 + ], + "27": [ + 1248.818359375, + 301.6029968261719 + ], + "29": [ + 1274.96435546875, + 289.3661804199219 + ] + }, + "projections": { + "1": [ + 1005.0092663489024, + 386.2214622546121 + ], + "3": [ + 1017.7583321526004, + 381.88090758565573 + ], + "5": [ + 1031.3537572946097, + 377.254164504316 + ], + "7": [ + 1045.8864861490292, + 372.31045671093545 + ], + "9": [ + 1061.4609765996095, + 367.01443485192556 + ], + "11": [ + 1078.122240652651, + 362.2231913261979 + ], + "13": [ + 1096.0796486092768, + 357.02537217827563 + ], + "15": [ + 1115.4945983844448, + 351.3703014678208 + ], + "17": [ + 1136.5564371474052, + 345.1985274978128 + ], + "19": [ + 1155.866362315815, + 338.0856800586462 + ], + "21": [ + 1176.7575857573645, + 330.43270078377964 + ], + "23": [ + 1199.4324553393794, + 322.1704521370485 + ], + "25": [ + 1224.129382551098, + 313.2174748474629 + ], + "27": [ + 1249.0569403961586, + 302.1020655445752 + ], + "29": [ + 1276.3193362776724, + 290.06901140831127 + ] + }, + "mean_error_pixels": 1.1812134764812579, + "max_error_pixels": 2.888695605807202 + }, + "feature_256": { + "xyz": [ + 15.441638356253783, + 13.366073110108324, + 8.39814724500755 + ], + "observations": { + "1": [ + 990.0, + 369.0 + ], + "3": [ + 1003.1366577148438, + 363.8212890625 + ], + "5": [ + 1016.6925659179688, + 358.0599060058594 + ], + "7": [ + 1031.4591064453125, + 351.9288330078125 + ], + "9": [ + 1046.968994140625, + 346.0878601074219 + ], + "11": [ + 1063.0853271484375, + 339.6114196777344 + ], + "13": [ + 1080.462158203125, + 333.7259826660156 + ], + "15": [ + 1099.4407958984375, + 328.18060302734375 + ], + "17": [ + 1119.183349609375, + 321.9712219238281 + ], + "19": [ + 1139.7694091796875, + 315.2318115234375 + ], + "21": [ + 1160.8485107421875, + 306.912109375 + ], + "23": [ + 1183.1981201171875, + 296.94140625 + ], + "25": [ + 1206.3843994140625, + 285.2774963378906 + ], + "27": [ + 1230.3983154296875, + 272.08026123046875 + ], + "29": [ + 1256.1646728515625, + 259.22796630859375 + ] + }, + "projections": { + "1": [ + 991.7998354450299, + 369.115514749875 + ], + "3": [ + 1004.2005089742629, + 364.1632424005009 + ], + "5": [ + 1017.4297576027955, + 358.8798979926273 + ], + "7": [ + 1031.5773295815934, + 353.22959641543537 + ], + "9": [ + 1046.7464200120162, + 347.17107594710785 + ], + "11": [ + 1062.9750750388175, + 341.55291747329227 + ], + "13": [ + 1080.4746066663367, + 335.4587671509472 + ], + "15": [ + 1099.4044766176225, + 328.8288540433141 + ], + "17": [ + 1119.9519807675638, + 321.59297393188126 + ], + "19": [ + 1138.8656253518207, + 313.45498727290834 + ], + "21": [ + 1159.34979807322, + 304.684153478194 + ], + "23": [ + 1181.6084068740097, + 295.1982862873962 + ], + "25": [ + 1205.882256727109, + 284.90032824779917 + ], + "27": [ + 1230.4635786513736, + 272.3779452015125 + ], + "29": [ + 1257.3962838440982, + 258.7843013107878 + ] + }, + "mean_error_pixels": 1.3932414017941215, + "max_error_pixels": 2.6851307495607055 + }, + "feature_294": { + "xyz": [ + 16.766320053584863, + 13.90633661618298, + 7.497211712082907 + ], + "observations": { + "1": [ + 1010.0, + 397.0 + ], + "3": [ + 1023.2188110351562, + 392.7959899902344 + ], + "5": [ + 1037.414306640625, + 388.0790100097656 + ], + "7": [ + 1052.3636474609375, + 383.2801818847656 + ], + "9": [ + 1068.150390625, + 378.2850341796875 + ], + "11": [ + 1084.7109375, + 373.2574768066406 + ], + "13": [ + 1102.3514404296875, + 368.40557861328125 + ], + "15": [ + 1120.73681640625, + 364.31988525390625 + ], + "17": [ + 1139.6710205078125, + 359.15936279296875 + ], + "19": [ + 1160.00146484375, + 353.9875793457031 + ], + "21": [ + 1181.4205322265625, + 347.1698913574219 + ], + "23": [ + 1203.24609375, + 338.91339111328125 + ], + "25": [ + 1226.1016845703125, + 329.5064697265625 + ], + "27": [ + 1249.3499755859375, + 318.72113037109375 + ] + }, + "projections": { + "1": [ + 1011.2081534759116, + 395.6877469763891 + ], + "3": [ + 1023.8928913810264, + 391.7512133775588 + ], + "5": [ + 1037.4007386538321, + 387.5622297959002 + ], + "7": [ + 1051.818090632885, + 383.094274846513 + ], + "9": [ + 1067.2438717556413, + 378.3169810345037 + ], + "11": [ + 1083.7159503234702, + 374.09432832273075 + ], + "13": [ + 1101.436613427034, + 369.5196251290574 + ], + "15": [ + 1120.5572329129423, + 364.55014238527235 + ], + "17": [ + 1141.254672356907, + 359.13595504822723 + ], + "19": [ + 1160.1317017896088, + 352.76057528915527 + ], + "21": [ + 1180.5040402648533, + 345.9211540708972 + ], + "23": [ + 1202.5565089523093, + 338.56031579772355 + ], + "25": [ + 1226.5056977747226, + 330.6108229809737 + ], + "27": [ + 1250.555455072641, + 320.5696119439869 + ] + }, + "mean_error_pixels": 1.1846645718477824, + "max_error_pixels": 2.2068223576419994 + }, + "feature_309": { + "xyz": [ + 17.2352815104554, + 14.049910023896317, + 7.079769042625244 + ], + "observations": { + "1": [ + 1018.0, + 407.0 + ], + "3": [ + 1031.593505859375, + 403.18646240234375 + ], + "5": [ + 1045.891357421875, + 398.77593994140625 + ], + "7": [ + 1061.0675048828125, + 394.49224853515625 + ], + "9": [ + 1077.058349609375, + 390.16461181640625 + ], + "11": [ + 1093.50634765625, + 385.7275390625 + ], + "13": [ + 1111.3973388671875, + 381.7022399902344 + ], + "15": [ + 1129.854248046875, + 378.1448669433594 + ], + "17": [ + 1149.412109375, + 374.2394104003906 + ], + "19": [ + 1170.020263671875, + 369.8140869140625 + ], + "21": [ + 1191.5225830078125, + 364.104248046875 + ], + "23": [ + 1213.64453125, + 356.4893798828125 + ], + "25": [ + 1236.9324951171875, + 348.13916015625 + ], + "27": [ + 1260.86474609375, + 338.26300048828125 + ] + }, + "projections": { + "1": [ + 1019.3514751492403, + 406.51479940937327 + ], + "3": [ + 1032.2223904020927, + 402.95639420703577 + ], + "5": [ + 1045.9236860387598, + 399.17257856144624 + ], + "7": [ + 1060.5419424562476, + 395.139826354364 + ], + "9": [ + 1076.1762097099, + 390.8312231886298 + ], + "11": [ + 1092.8690703919415, + 387.11760187069615 + ], + "13": [ + 1110.819647288021, + 383.09348693761393 + ], + "15": [ + 1130.1794108880447, + 378.72143541901767 + ], + "17": [ + 1151.125164339639, + 373.9577420092575 + ], + "19": [ + 1170.1727599111337, + 368.19970642375364 + ], + "21": [ + 1190.7127635656925, + 362.03106676687923 + ], + "23": [ + 1212.9275469207123, + 355.401628012489 + ], + "25": [ + 1237.0304588703598, + 348.2526694536947 + ], + "27": [ + 1261.1742870079654, + 339.03683061882 + ] + }, + "mean_error_pixels": 1.1435928990703117, + "max_error_pixels": 2.2257331710158805 + }, + "feature_322": { + "xyz": [ + 15.586794064881122, + 13.402034998778944, + 9.212420477581599 + ], + "observations": { + "1": [ + 990.0, + 352.0 + ], + "3": [ + 1002.904052734375, + 346.3071594238281 + ], + "5": [ + 1016.38427734375, + 339.77484130859375 + ], + "7": [ + 1030.818603515625, + 332.8929443359375 + ], + "9": [ + 1046.192626953125, + 326.33392333984375 + ], + "11": [ + 1061.74169921875, + 319.17449951171875 + ], + "13": [ + 1078.9403076171875, + 312.1969909667969 + ], + "15": [ + 1097.499267578125, + 305.5798645019531 + ], + "17": [ + 1116.78955078125, + 298.36602783203125 + ], + "19": [ + 1137.0286865234375, + 290.6274108886719 + ], + "21": [ + 1157.943359375, + 281.4998779296875 + ], + "23": [ + 1179.5595703125, + 270.3554992675781 + ], + "25": [ + 1202.4652099609375, + 257.9054260253906 + ], + "27": [ + 1225.640380859375, + 243.79165649414062 + ], + "29": [ + 1250.7374267578125, + 229.02772521972656 + ] + }, + "projections": { + "1": [ + 991.3493169953899, + 351.20958278530225 + ], + "3": [ + 1003.6216533595157, + 345.710939214986 + ], + "5": [ + 1016.7051972348813, + 339.8468970945746 + ], + "7": [ + 1030.68687721794, + 333.5782762159606 + ], + "9": [ + 1045.6665020099522, + 326.8600910719625 + ], + "11": [ + 1061.6593159185668, + 320.55444351210934 + ], + "13": [ + 1078.8859181504654, + 313.72529606857387 + ], + "15": [ + 1097.4987822512373, + 306.30791032413697 + ], + "17": [ + 1117.676577258166, + 298.2264253445038 + ], + "19": [ + 1136.2639006693908, + 289.272900575545 + ], + "21": [ + 1156.3743805949694, + 279.62797216635886 + ], + "23": [ + 1178.2030620355927, + 269.2030825444414 + ], + "25": [ + 1201.9797776359476, + 257.89387963328056 + ], + "27": [ + 1226.0528502038405, + 244.30602979727442 + ], + "29": [ + 1252.4021491073868, + 229.55899794307385 + ] + }, + "mean_error_pixels": 1.1650365116898305, + "max_error_pixels": 2.442483490009593 + }, + "feature_355": { + "xyz": [ + 15.36456202192557, + 13.333969994164246, + 7.83176024232291 + ], + "observations": { + "1": [ + 991.0, + 381.0 + ], + "3": [ + 1004.1864013671875, + 376.3884582519531 + ], + "5": [ + 1018.0368041992188, + 371.26580810546875 + ], + "7": [ + 1032.93212890625, + 365.72723388671875 + ], + "9": [ + 1048.5843505859375, + 360.21441650390625 + ], + "11": [ + 1064.942626953125, + 354.5093994140625 + ], + "13": [ + 1082.6279296875, + 349.3219299316406 + ], + "15": [ + 1101.614501953125, + 344.12939453125 + ], + "17": [ + 1121.7669677734375, + 338.8671569824219 + ], + "19": [ + 1142.5640869140625, + 332.734619140625 + ], + "21": [ + 1164.303466796875, + 325.299560546875 + ], + "23": [ + 1186.758544921875, + 315.54986572265625 + ], + "25": [ + 1210.598876953125, + 304.6337585449219 + ], + "27": [ + 1235.084228515625, + 292.4495849609375 + ], + "29": [ + 1261.1170654296875, + 279.5980224609375 + ] + }, + "projections": { + "1": [ + 992.8392401170163, + 381.7512320945179 + ], + "3": [ + 1005.3608322925452, + 377.1898930145328 + ], + "5": [ + 1018.725922542812, + 372.3224013265717 + ], + "7": [ + 1033.0266123931685, + 367.11530343217396 + ], + "9": [ + 1048.3689183227575, + 361.53009148707923 + ], + "11": [ + 1064.8073599489062, + 356.40897284969236 + ], + "13": [ + 1082.547491608916, + 350.84704701572014 + ], + "15": [ + 1101.754486013201, + 344.7883309272443 + ], + "17": [ + 1122.6226871245115, + 338.16695410402144 + ], + "19": [ + 1141.8228130077046, + 330.6175875072206 + ], + "21": [ + 1162.6331072633511, + 322.4784725633957 + ], + "23": [ + 1185.2647970784556, + 313.6722229277996 + ], + "25": [ + 1209.9677464323245, + 304.1072974408563 + ], + "27": [ + 1234.9889225740858, + 292.350458382518 + ], + "29": [ + 1262.4247969248631, + 279.5863827101242 + ] + }, + "mean_error_pixels": 1.5195688910925758, + "max_error_pixels": 3.278511610741274 + }, + "feature_137": { + "xyz": [ + 23.44446695029657, + 15.77928454409526, + 7.774946919416613 + ], + "observations": { + "1": [ + 1095.0, + 408.0 + ], + "3": [ + 1109.7138671875, + 404.543212890625 + ], + "5": [ + 1125.1217041015625, + 400.7590026855469 + ], + "7": [ + 1141.1322021484375, + 397.2959289550781 + ], + "9": [ + 1157.7012939453125, + 394.1653747558594 + ], + "11": [ + 1175.17431640625, + 390.44342041015625 + ], + "13": [ + 1193.7574462890625, + 387.2022399902344 + ], + "15": [ + 1213.427978515625, + 384.568359375 + ], + "17": [ + 1232.89208984375, + 382.4753112792969 + ], + "19": [ + 1253.1497802734375, + 379.9324645996094 + ], + "21": [ + 1270.7276611328125, + 379.1866760253906 + ] + }, + "projections": { + "1": [ + 1097.0944686822104, + 408.1809717873506 + ], + "3": [ + 1110.8585894991277, + 405.08758940640007 + ], + "5": [ + 1125.413034362935, + 401.8218671923516 + ], + "7": [ + 1140.830609773851, + 398.36790863563215 + ], + "9": [ + 1157.1933481018282, + 394.70780291505207 + ], + "11": [ + 1174.4395351708304, + 391.8078938077326 + ], + "13": [ + 1192.814004395355, + 388.69334852238194 + ], + "15": [ + 1212.4340091559804, + 385.3418189043115 + ], + "17": [ + 1233.4336273331544, + 381.7277499462826 + ], + "19": [ + 1252.0778153601555, + 377.05717831258306 + ], + "21": [ + 1271.9458397788324, + 372.1139672702957 + ] + }, + "mean_error_pixels": 2.0064447145646063, + "max_error_pixels": 7.17684947229739 + }, + "feature_214": { + "xyz": [ + 24.607405062277973, + 16.1374396092958, + 7.99456904167137 + ], + "observations": { + "1": [ + 1107.0, + 407.0 + ], + "3": [ + 1121.506591796875, + 403.6138916015625 + ], + "5": [ + 1136.56787109375, + 399.97833251953125 + ], + "7": [ + 1152.442138671875, + 396.6143493652344 + ], + "9": [ + 1168.9974365234375, + 393.41778564453125 + ], + "11": [ + 1186.4063720703125, + 389.7631530761719 + ], + "13": [ + 1204.4112548828125, + 386.7535095214844 + ], + "15": [ + 1223.5069580078125, + 384.5106201171875 + ], + "17": [ + 1242.8184814453125, + 382.5706787109375 + ], + "19": [ + 1262.86376953125, + 379.98773193359375 + ] + }, + "projections": { + "1": [ + 1108.3283472598998, + 406.97272209439603 + ], + "3": [ + 1122.116628346644, + 403.9181704634073 + ], + "5": [ + 1136.6786837105933, + 400.6974536832456 + ], + "7": [ + 1152.0841179259319, + 397.2956048460662 + ], + "9": [ + 1168.4111417195586, + 393.695806539572 + ], + "11": [ + 1185.576647145416, + 390.87851906175473 + ], + "13": [ + 1203.8347943031654, + 387.85780441267667 + ], + "15": [ + 1223.2959692902782, + 384.613069650587 + ], + "17": [ + 1244.0859405059357, + 381.1208520616508 + ], + "19": [ + 1262.465600883454, + 376.5662972727687 + ] + }, + "mean_error_pixels": 1.239706964585737, + "max_error_pixels": 3.4445251356874764 + }, + "feature_223": { + "xyz": [ + 17.747872986961017, + 14.155382580646334, + 6.823738299293413 + ], + "observations": { + "1": [ + 1028.0, + 414.0 + ], + "3": [ + 1041.599609375, + 410.40936279296875 + ], + "5": [ + 1055.94189453125, + 406.30078125 + ], + "7": [ + 1071.159423828125, + 402.2292175292969 + ], + "9": [ + 1087.246337890625, + 398.35650634765625 + ], + "11": [ + 1103.891357421875, + 394.1748962402344 + ], + "13": [ + 1121.903564453125, + 390.56695556640625 + ], + "15": [ + 1141.0228271484375, + 387.23406982421875 + ], + "17": [ + 1161.234130859375, + 383.72625732421875 + ], + "19": [ + 1181.9163818359375, + 379.5663757324219 + ], + "21": [ + 1203.4598388671875, + 374.1496276855469 + ], + "23": [ + 1225.7567138671875, + 366.8321838378906 + ], + "25": [ + 1249.298583984375, + 358.7587585449219 + ], + "27": [ + 1274.2493896484375, + 349.83880615234375 + ] + }, + "projections": { + "1": [ + 1028.6964760530018, + 413.3312307265603 + ], + "3": [ + 1041.8035396772045, + 410.01445947471194 + ], + "5": [ + 1055.75236996083, + 406.4896366035156 + ], + "7": [ + 1070.630248985864, + 402.7351661146745 + ], + "9": [ + 1086.5369575285267, + 398.7263595433052 + ], + "11": [ + 1103.5164263124645, + 395.34361366300095 + ], + "13": [ + 1121.7685283480994, + 391.67754908520556 + ], + "15": [ + 1141.4456297651832, + 387.69419560467907 + ], + "17": [ + 1162.7254232352066, + 383.35393624825974 + ], + "19": [ + 1182.0322292458977, + 377.9927602061562 + ], + "21": [ + 1202.8376759958826, + 372.25561798164364 + ], + "23": [ + 1225.3231216844272, + 366.09699289215433 + ], + "25": [ + 1249.7004185169644, + 359.46371531247496 + ], + "27": [ + 1274.070115835153, + 350.7672780078233 + ] + }, + "mean_error_pixels": 0.992847291438635, + "max_error_pixels": 1.9935795436626036 + }, + "feature_348": { + "xyz": [ + 21.450749678835535, + 15.376224536610186, + 8.167323520880554 + ], + "observations": { + "1": [ + 1068.0, + 396.0 + ], + "3": [ + 1081.5501708984375, + 392.31146240234375 + ], + "5": [ + 1095.8375244140625, + 388.2604064941406 + ], + "7": [ + 1110.1839599609375, + 384.360107421875 + ], + "9": [ + 1125.985595703125, + 380.4214172363281 + ], + "11": [ + 1142.22119140625, + 376.236083984375 + ], + "13": [ + 1159.010986328125, + 372.8094177246094 + ], + "15": [ + 1177.9366455078125, + 369.5097961425781 + ], + "17": [ + 1197.4090576171875, + 365.88433837890625 + ], + "19": [ + 1217.65576171875, + 361.7532958984375 + ], + "21": [ + 1238.5380859375, + 356.3658142089844 + ], + "23": [ + 1259.867919921875, + 349.2958679199219 + ] + }, + "projections": { + "1": [ + 1068.0618744693672, + 396.40192111439944 + ], + "3": [ + 1081.2618879172066, + 392.8821985935425 + ], + "5": [ + 1095.2355445574942, + 389.16026754522255 + ], + "7": [ + 1110.0557756106864, + 385.21704499488044 + ], + "9": [ + 1125.8049763938025, + 381.0309716649276 + ], + "11": [ + 1142.4350491057635, + 377.54062494031683 + ], + "13": [ + 1160.1797711375384, + 373.78955248806665 + ], + "15": [ + 1179.1580360274706, + 369.74990132161577 + ], + "17": [ + 1199.5062638779373, + 365.3897123724754 + ], + "19": [ + 1217.7071673119026, + 360.03300678967076 + ], + "21": [ + 1237.1466994165578, + 354.3469347120081 + ], + "23": [ + 1257.955593198106, + 348.296715837826 + ] + }, + "mean_error_pixels": 1.3506950695263438, + "max_error_pixels": 2.4519035205266375 + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/sky_probe_layered_response_fit.json b/astra_scene_test/Scene_04/reference/sky_probe_layered_response_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..ac30763fa7be4580dd9e65cca924db474d4d9dff --- /dev/null +++ b/astra_scene_test/Scene_04/reference/sky_probe_layered_response_fit.json @@ -0,0 +1,113 @@ +{ + "1": { + "source_srgb_mean": [ + 0.26886695715316794, + 0.2553095134349205, + 0.1619215686273905 + ], + "zero_linear": [ + 0.0020528698805719614, + 0.001900062314234674, + 0.0008688705856911838 + ], + "original_linear": [ + 0.02811931073665619, + 0.02059081941843033, + 0.002912279684096575 + ], + "target_linear": [ + 0.035548978188916634, + 0.03193429512844669, + 0.013092195833721712 + ], + "gain": [ + 1.2850280632513877, + 1.6069029245618758, + 5.981829877217212 + ], + "old_control": [ + 1, + 1, + 1 + ], + "proposed_control": [ + 1.2850280632513877, + 1.6069029245618758, + 5.981829877217212 + ] + }, + "65": { + "source_srgb_mean": [ + 0.2641262164124202, + 0.28641641249085065, + 0.23202178649226193 + ], + "zero_linear": [ + 0.0025316609535366297, + 0.0025382377207279205, + 0.0015589604154229164 + ], + "original_linear": [ + 0.029938995838165283, + 0.030627254396677017, + 0.013537351042032242 + ], + "target_linear": [ + 0.0342579926513042, + 0.04058529804449659, + 0.026269379557944433 + ], + "gain": [ + 1.1575854260108982, + 1.3545173461464046, + 2.0629164562081237 + ], + "old_control": [ + 1.05, + 1.5, + 6.0 + ], + "proposed_control": [ + 1.2154646973114431, + 2.031776019219607, + 12.377498737248743 + ] + }, + "128": { + "source_srgb_mean": [ + 0.21015511982559837, + 0.23531343500350518, + 0.1962235294116668 + ], + "zero_linear": [ + 0.003622727934271097, + 0.003992745652794838, + 0.003103633178398013 + ], + "original_linear": [ + 0.019419824704527855, + 0.022201647982001305, + 0.01016236748546362 + ], + "target_linear": [ + 0.02155382708083712, + 0.02702920815486562, + 0.01884268987815366 + ], + "gain": [ + 1.135088230374114, + 1.2651208779960927, + 2.2297279560657586 + ], + "old_control": [ + 0.6, + 0.97, + 3.5 + ], + "proposed_control": [ + 0.6810529382244684, + 1.22716725165621, + 7.804047846230155 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/sky_response_probe_fit.json b/astra_scene_test/Scene_04/reference/sky_response_probe_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..210efbdc0641f23f208f8df665de36aed516371e --- /dev/null +++ b/astra_scene_test/Scene_04/reference/sky_response_probe_fit.json @@ -0,0 +1,113 @@ +{ + "1": { + "source_srgb_mean": [ + 0.26886695715316794, + 0.2553095134349205, + 0.1619215686273905 + ], + "zero_linear": [ + 0.019171401858329773, + 0.022271208465099335, + 0.016406700015068054 + ], + "original_linear": [ + 0.03514198958873749, + 0.03355832397937775, + 0.017805492505431175 + ], + "target_linear": [ + 0.03505124749877442, + 0.03143818423502139, + 0.012644012193560185 + ], + "gain": [ + 0.9943181746661522, + 0.8121628380896485, + -2.6899542622873893 + ], + "old_control": [ + 1, + 1, + 1 + ], + "proposed_control": [ + 0.9943181746661522, + 0.8121628380896485, + -2.6899542622873893 + ] + }, + "65": { + "source_srgb_mean": [ + 0.2641262164124202, + 0.28641641249085065, + 0.23202178649226193 + ], + "zero_linear": [ + 0.020974431186914444, + 0.0256173275411129, + 0.0235085841268301 + ], + "original_linear": [ + 0.037747710943222046, + 0.042497385293245316, + 0.03086157515645027 + ], + "target_linear": [ + 0.03376068906832274, + 0.04008724816965474, + 0.025779005371493947 + ], + "gain": [ + 0.7622992084538515, + 0.8572198532148915, + 0.30877519576970414 + ], + "old_control": [ + 1.05, + 1.5, + 6.0 + ], + "proposed_control": [ + 0.800414168876544, + 1.2858297798223373, + 1.8526511746182248 + ] + }, + "128": { + "source_srgb_mean": [ + 0.21015511982559837, + 0.23531343500350518, + 0.1962235294116668 + ], + "zero_linear": [ + 0.024533528834581375, + 0.030980871990323067, + 0.03217631205916405 + ], + "original_linear": [ + 0.03410160914063454, + 0.04182152822613716, + 0.03643350675702095 + ], + "target_linear": [ + 0.021072438194005574, + 0.026537788880024723, + 0.01836894358309256 + ], + "gain": [ + -0.3617330258386494, + -0.409853703839423, + -3.2433020935176393 + ], + "old_control": [ + 0.6, + 0.97, + 3.5 + ], + "proposed_control": [ + -0.21703981550318965, + -0.3975580927242403, + -11.351557327311738 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/sky_series_fit.json b/astra_scene_test/Scene_04/reference/sky_series_fit.json new file mode 100644 index 0000000000000000000000000000000000000000..30457bf00a9992595385ab3f74be290c83eab317 --- /dev/null +++ b/astra_scene_test/Scene_04/reference/sky_series_fit.json @@ -0,0 +1,811 @@ +{ + "controls": { + "1": [ + 1.2605054062517196, + 1.6010563538455556, + 5.981444461917436 + ], + "17": [ + 1.0526570456656525, + 1.4420291016719715, + 6.014321509967891 + ], + "33": [ + 1.0946919130656403, + 1.4779059156328034, + 6.252126070894234 + ], + "49": [ + 1.225149642569033, + 1.7874155565200063, + 8.326589211542156 + ], + "65": [ + 1.2242025797155145, + 2.03143319103788, + 11.878108774815308 + ], + "81": [ + 1.027097816524482, + 1.7479561324369874, + 9.746948941715356 + ], + "97": [ + 0.7570487086400081, + 1.361378012245788, + 7.215861814136287 + ], + "113": [ + 0.5682937110288511, + 1.1020568822706571, + 6.685394646675636 + ], + "128": [ + 0.6520111661770153, + 1.2056391631303078, + 7.768134709770933 + ] + }, + "measurements_srgb": [ + [ + 0.26886695715316794, + 0.2553095134349205, + 0.1619215686273905 + ], + [ + 0.2656938271604354, + 0.25413594771232745, + 0.1627182280318917 + ], + [ + 0.2650383442265127, + 0.25521060275954055, + 0.16110907770509558 + ], + [ + 0.26412984749449187, + 0.2543522149599653, + 0.15881452432819215 + ], + [ + 0.2593044299200478, + 0.25335047204057676, + 0.16322251270872504 + ], + [ + 0.26086071169201436, + 0.25303689179367306, + 0.15671227305731703 + ], + [ + 0.2633349310093827, + 0.25189760348573825, + 0.1625413217138096 + ], + [ + 0.2582688453158343, + 0.250243718227919, + 0.16097051561359219 + ], + [ + 0.25487102396506617, + 0.2475679012344513, + 0.15601176470582842 + ], + [ + 0.25384749455328004, + 0.24751590413931956, + 0.15948903413211163 + ], + [ + 0.25489237472756143, + 0.2475267973855117, + 0.1571233115467858 + ], + [ + 0.24524749455325962, + 0.2466809005082232, + 0.15927712418294757 + ], + [ + 0.25294451706597637, + 0.24870936819161785, + 0.1580090050834578 + ], + [ + 0.24845940450242218, + 0.24884008714585462, + 0.16742236746543643 + ], + [ + 0.24561437908485984, + 0.2465763253448359, + 0.1630697167755367 + ], + [ + 0.25070472040659275, + 0.24522440087132893, + 0.16361379811177443 + ], + [ + 0.24381002178637606, + 0.24234175744358719, + 0.1632499636891169 + ], + [ + 0.2449279593317608, + 0.24383776325332018, + 0.16265795206965517 + ], + [ + 0.24560697167744236, + 0.24050748002891625, + 0.16263297022506365 + ], + [ + 0.24530152505434574, + 0.24166811909936248, + 0.16032345679006307 + ], + [ + 0.24376775599116576, + 0.24161931735644548, + 0.16123427741460872 + ], + [ + 0.24692403776314567, + 0.24449251997082663, + 0.16421031227299396 + ], + [ + 0.24074901960771813, + 0.2448742193172374, + 0.17590530137973379 + ], + [ + 0.24509629629617444, + 0.24257923021047392, + 0.16374480755258738 + ], + [ + 0.2525185185184186, + 0.24802875816981654, + 0.17180159767603456 + ], + [ + 0.24957022512697535, + 0.2457673202613285, + 0.16501423384161978 + ], + [ + 0.2519247639795657, + 0.2490893246186329, + 0.16704793028315626 + ], + [ + 0.2578460421204631, + 0.2524078431371603, + 0.15967233115462498 + ], + [ + 0.24762352941165502, + 0.2510530137980035, + 0.1814055192446508 + ], + [ + 0.2528008714595973, + 0.25262193173554687, + 0.17479912854022808 + ], + [ + 0.24671604938258965, + 0.24587567175006556, + 0.1670029048655819 + ], + [ + 0.25005984023227895, + 0.24547639796646975, + 0.1656275962236096 + ], + [ + 0.2514148148147034, + 0.24362962962949797, + 0.16048772694256863 + ], + [ + 0.24437414669559293, + 0.2473657225852079, + 0.17537603485831105 + ], + [ + 0.2626708787217891, + 0.25332578068254064, + 0.16583485838773407 + ], + [ + 0.26008496732018377, + 0.2576416848219946, + 0.17012360203333618 + ], + [ + 0.2563005083513949, + 0.2551305737108699, + 0.17963471314443658 + ], + [ + 0.24593638344214386, + 0.2407677559911519, + 0.1597854756716911 + ], + [ + 0.26504081336231133, + 0.2567747276687489, + 0.16716528685541515 + ], + [ + 0.26575192447342794, + 0.26077066085685763, + 0.17487828612919024 + ], + [ + 0.2627087872185072, + 0.2597905591865541, + 0.17592926652134552 + ], + [ + 0.25576586782852123, + 0.26157211328968705, + 0.18933943355110575 + ], + [ + 0.26255061728386986, + 0.2618573710965129, + 0.18021307189534166 + ], + [ + 0.2598639070442181, + 0.26307334785758335, + 0.18872098765422796 + ], + [ + 0.26480522875810225, + 0.26384517066079494, + 0.17727160493819233 + ], + [ + 0.2636534495278819, + 0.26523151779224224, + 0.18430413943346577 + ], + [ + 0.2575912854029687, + 0.2667487291212123, + 0.1990627450979368 + ], + [ + 0.2656535947711594, + 0.268429339143003, + 0.19040130718945003 + ], + [ + 0.2668198983296358, + 0.2701586056644303, + 0.18656078431363599 + ], + [ + 0.26251474219310594, + 0.26984429920109926, + 0.20036964415385522 + ], + [ + 0.27031735657219846, + 0.27431764705876555, + 0.18478373275227405 + ], + [ + 0.26712592592586193, + 0.27426899055912723, + 0.19566114742183416 + ], + [ + 0.2650784313724821, + 0.27595410312267127, + 0.1972605664487024 + ], + [ + 0.2678872912127086, + 0.2754684095859944, + 0.19577923021050456 + ], + [ + 0.26352534495272245, + 0.2778903413216508, + 0.21380305010881911 + ], + [ + 0.2641279593318073, + 0.2784955700798229, + 0.2080248366011978 + ], + [ + 0.2649580246912833, + 0.27920856935360594, + 0.2108883079156474 + ], + [ + 0.26362062454604424, + 0.280974872912062, + 0.21252912127802756 + ], + [ + 0.2682082788670298, + 0.2819082062453956, + 0.21770631808267196 + ], + [ + 0.2677450980391465, + 0.28254495279586733, + 0.21166942628892055 + ], + [ + 0.26753086419745814, + 0.28253333333326575, + 0.21821220043561698 + ], + [ + 0.26710689905584595, + 0.2846245461146725, + 0.21902977487280006 + ], + [ + 0.2683265068989854, + 0.2861400145242566, + 0.22261176470576868 + ], + [ + 0.26381815541024073, + 0.2871973856208428, + 0.22572389251985087 + ], + [ + 0.2641262164124202, + 0.28641641249085065, + 0.23202178649226193 + ], + [ + 0.26441002178642237, + 0.2864464778503281, + 0.22912810457504548 + ], + [ + 0.2641771968045678, + 0.28577429193892706, + 0.22857937545377105 + ], + [ + 0.26974901960777087, + 0.28657879448068274, + 0.2352291938996642 + ], + [ + 0.26404328249810605, + 0.2869314451705884, + 0.22901902686989203 + ], + [ + 0.26614117647051766, + 0.28686187363827165, + 0.2293802469134619 + ], + [ + 0.2632387799563507, + 0.2857713870732763, + 0.22280595497446645 + ], + [ + 0.26318779956418736, + 0.2846897603485142, + 0.2275651416120881 + ], + [ + 0.2616978939723231, + 0.2796135076252002, + 0.21990370370358744 + ], + [ + 0.2547944807551696, + 0.2784127814087957, + 0.22021336238187642 + ], + [ + 0.25192578068254434, + 0.27502411038482905, + 0.21813914306451646 + ], + [ + 0.251239796659307, + 0.2757901234567274, + 0.21082381989822097 + ], + [ + 0.250890050835058, + 0.27487625272324484, + 0.21469905591855085 + ], + [ + 0.25033144517056566, + 0.2731193899781499, + 0.21543848946975033 + ], + [ + 0.24909978213497752, + 0.2718389251996433, + 0.2117002178648137 + ], + [ + 0.24921626724754256, + 0.2692313725489435, + 0.21205751633975978 + ], + [ + 0.24793071895415061, + 0.27089324618729027, + 0.20881612200424904 + ], + [ + 0.24346027596213732, + 0.26777051561358134, + 0.21014669571521857 + ], + [ + 0.24209949164841074, + 0.2666203340594736, + 0.20574974582415476 + ], + [ + 0.2420620188815276, + 0.26558169934632503, + 0.20123267973846343 + ], + [ + 0.24018373275225724, + 0.2644413943354332, + 0.20126608569343804 + ], + [ + 0.23211314451696083, + 0.2623179375453018, + 0.2073724037762208 + ], + [ + 0.23599883805363975, + 0.26166623093673774, + 0.202475236020234 + ], + [ + 0.23479796659394392, + 0.2598124909222087, + 0.20107131445160706 + ], + [ + 0.23109716775589434, + 0.2575799564269303, + 0.19945504720396678 + ], + [ + 0.23254625998537573, + 0.25928438634704176, + 0.19597792302096442 + ], + [ + 0.22414277414659756, + 0.2548824981843693, + 0.1996050835147894 + ], + [ + 0.22127785039931902, + 0.25193565722575473, + 0.19556993464042963 + ], + [ + 0.2215115468408594, + 0.25077022512698754, + 0.19670718954238783 + ], + [ + 0.22153202614369216, + 0.2500591140158758, + 0.19384691358015194 + ], + [ + 0.22096949891057768, + 0.24885954974572638, + 0.19040348583868916 + ], + [ + 0.22176034858377577, + 0.24664488017419525, + 0.18613725490187225 + ], + [ + 0.21895279593308686, + 0.2453416122003339, + 0.18681307189533478 + ], + [ + 0.21168061002168492, + 0.23850602759611797, + 0.18369978213499033 + ], + [ + 0.21080363108195652, + 0.23454364560627441, + 0.17808685548285288 + ], + [ + 0.2087283950616248, + 0.23200348583865973, + 0.17828598402315768 + ], + [ + 0.20573333333322652, + 0.23102236746538568, + 0.17653173565714736 + ], + [ + 0.20620348583867062, + 0.23059665940438498, + 0.1775636891792951 + ], + [ + 0.20462338416837414, + 0.2296503994189009, + 0.17730689905583846 + ], + [ + 0.20153638344216102, + 0.2293828612925422, + 0.17664705882345072 + ], + [ + 0.20099564270142076, + 0.22736761074787554, + 0.17831895424828545 + ], + [ + 0.19919143064622905, + 0.22741568627437989, + 0.1758861292664436 + ], + [ + 0.20280871459684427, + 0.22988264342761222, + 0.17777618010159027 + ], + [ + 0.1964069716774601, + 0.2250450254174468, + 0.17379215686267022 + ], + [ + 0.19699186637608054, + 0.22435395787932128, + 0.17616819172105563 + ], + [ + 0.19403805373991703, + 0.22363907044286566, + 0.18040856935358507 + ], + [ + 0.19704589687716925, + 0.22310675381251005, + 0.17885025417566347 + ], + [ + 0.19399651416112318, + 0.22365853304272046, + 0.18020261437900223 + ], + [ + 0.19214350036301264, + 0.2240008714595681, + 0.18195381263608038 + ], + [ + 0.19027160493817843, + 0.22233594771229304, + 0.1855828612925772 + ], + [ + 0.1928432824980886, + 0.22345199709500824, + 0.1800177196803831 + ], + [ + 0.1908506899054985, + 0.22291735657213302, + 0.18213013798103428 + ], + [ + 0.19315206971668, + 0.22294074074061535, + 0.1807673202613549 + ], + [ + 0.1911822803194411, + 0.22312912127801557, + 0.18604996368909205 + ], + [ + 0.19406506899046272, + 0.22418416848208195, + 0.18929847494544083 + ], + [ + 0.1990794480754251, + 0.22824008714584043, + 0.18803631082053218 + ], + [ + 0.20094582425552573, + 0.22869832970212228, + 0.1905445170659918 + ], + [ + 0.2009288307914758, + 0.23055323166290276, + 0.19050079883795992 + ], + [ + 0.20135497458232324, + 0.2302915032678423, + 0.1937827160492861 + ], + [ + 0.2029231663034549, + 0.23270312273044558, + 0.19216310820615018 + ], + [ + 0.20371924473482628, + 0.2328204793027041, + 0.1920515613651917 + ], + [ + 0.20261655773410034, + 0.23124371822790404, + 0.1950074074073094 + ], + [ + 0.20624981844579018, + 0.2341525054464929, + 0.19627392883069336 + ], + [ + 0.21015511982559837, + 0.23531343500350518, + 0.1962235294116668 + ] + ], + "fit": [ + { + "frame": 1, + "target_linear": [ + 0.03490975950140683, + 0.031825017734091084, + 0.01309140862077981 + ], + "control": [ + 1.2605054062517196, + 1.6010563538455556, + 5.981444461917436 + ] + }, + { + "frame": 17, + "target_linear": [ + 0.029621007036994617, + 0.029024931170601842, + 0.01326042803046077 + ], + "control": [ + 1.0526570456656525, + 1.4420291016719715, + 6.014321509967891 + ] + }, + { + "frame": 33, + "target_linear": [ + 0.03084657301935047, + 0.029868381566685805, + 0.01384260850971007 + ], + "control": [ + 1.0946919130656403, + 1.4779059156328034, + 6.252126070894234 + ] + }, + { + "frame": 49, + "target_linear": [ + 0.034380133386674054, + 0.03583410405886929, + 0.0181074872667727 + ], + "control": [ + 1.225149642569033, + 1.7874155565200063, + 8.326589211542156 + ] + }, + { + "frame": 65, + "target_linear": [ + 0.03448607054295511, + 0.04057887824015425, + 0.025272398217105193 + ], + "control": [ + 1.2242025797155145, + 2.03143319103788, + 11.878108774815308 + ] + }, + { + "frame": 81, + "target_linear": [ + 0.029677317120858193, + 0.03566032668608801, + 0.02146050778364473 + ], + "control": [ + 1.027097816524482, + 1.7479561324369874, + 9.746948941715356 + ] + }, + { + "frame": 97, + "target_linear": [ + 0.022933517011810737, + 0.0288020606436745, + 0.016823998362596328 + ], + "control": [ + 0.7570487086400081, + 1.361378012245788, + 7.215861814136287 + ] + }, + { + "frame": 113, + "target_linear": [ + 0.01829465172218743, + 0.024322232758808737, + 0.016186387864474967 + ], + "control": [ + 0.5682937110288511, + 1.1020568822706571, + 6.685394646675636 + ] + }, + { + "frame": 128, + "target_linear": [ + 0.020789200413248214, + 0.026625081493728858, + 0.018770261457760073 + ], + "control": [ + 0.6520111661770153, + 1.2056391631303078, + 7.768134709770933 + ] + } + ], + "note": "Camera-visible background response only. Lighting world remains constant. Coefficients inferred from separated layer-scatter/background crops." +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/source_signal_tracks.json b/astra_scene_test/Scene_04/reference/source_signal_tracks.json new file mode 100644 index 0000000000000000000000000000000000000000..b2950e5f8988e572df1c71d7b3aaed3578bd821b --- /dev/null +++ b/astra_scene_test/Scene_04/reference/source_signal_tracks.json @@ -0,0 +1,1030 @@ +{ + "left": { + "1": [ + 530.8274643912322, + 474.50536228809517 + ], + "2": [ + 530.5244857681793, + 474.1591234887042 + ], + "3": [ + 530.219084064053, + 473.94966409587687 + ], + "4": [ + 529.9713402584281, + 473.7927926252329 + ], + "5": [ + 529.3303969609101, + 473.570336829295 + ], + "6": [ + 528.7716424800882, + 472.5985089758267 + ], + "7": [ + 528.5914639908933, + 472.0268717186786 + ], + "8": [ + 527.8804917105366, + 471.55207372624034 + ], + "9": [ + 527.4075111722369, + 471.04445124583805 + ], + "10": [ + 526.6792329286989, + 470.81013299176726 + ], + "11": [ + 526.2004045617715, + 470.458491818242 + ], + "12": [ + 525.4551184575015, + 470.1013633809708 + ], + "13": [ + 524.8790153319486, + 469.8060756876257 + ], + "14": [ + 524.1525622470226, + 469.76809455072276 + ], + "15": [ + 523.8096963572335, + 469.5036953873244 + ], + "16": [ + 523.3038799596918, + 469.4982070379594 + ], + "17": [ + 522.7461435363443, + 469.50030274154517 + ], + "18": [ + 522.17562006899, + 469.3960117210161 + ], + "19": [ + 521.4859533953672, + 469.11429275748606 + ], + "20": [ + 520.4864569282028, + 468.51732418022056 + ], + "21": [ + 519.7849379413818, + 467.77367926241186 + ], + "22": [ + 518.6707567368431, + 466.9392187452801 + ], + "23": [ + 517.6760813951738, + 466.1878646372145 + ], + "24": [ + 516.7382913190811, + 465.11567515845155 + ], + "25": [ + 515.7604650747422, + 464.18746533592065 + ], + "26": [ + 514.5313303541401, + 463.02120337835214 + ], + "27": [ + 512.9936232955174, + 461.82949689701314 + ], + "28": [ + 511.7850046728006, + 460.85714807219983 + ], + "29": [ + 510.49295649599344, + 459.7578654173329 + ], + "30": [ + 509.2951786372752, + 458.6226336185982 + ], + "31": [ + 508.28061161641244, + 457.6213720634277 + ], + "32": [ + 507.03883930065876, + 457.03321567438525 + ], + "33": [ + 505.7775310668184, + 456.5438171787632 + ], + "34": [ + 504.4815550647073, + 456.28012748557325 + ], + "35": [ + 503.5315671759844, + 456.0301614091996 + ], + "36": [ + 502.16510873701674, + 455.9424072760123 + ], + "37": [ + 501.22565715726404, + 455.6817987410751 + ], + "38": [ + 500.0629145496162, + 455.4448594226584 + ], + "39": [ + 499.21082063834524, + 455.16429727111495 + ], + "40": [ + 497.9467468717775, + 455.02328309510835 + ], + "41": [ + 497.0702211747837, + 454.91754681721613 + ], + "42": [ + 496.08541936347814, + 454.93877060613573 + ], + "43": [ + 494.83025605732297, + 454.7105381210494 + ], + "44": [ + 493.5770079125901, + 454.28612884944766 + ], + "45": [ + 492.32805180682135, + 453.6490794844575 + ], + "46": [ + 491.10359710661083, + 453.1438548331015 + ], + "47": [ + 489.98602504320326, + 451.92606342787377 + ], + "48": [ + 488.58448286325296, + 450.6443898978761 + ], + "49": [ + 487.5620242801058, + 449.41114889967537 + ], + "50": [ + 486.3496178345775, + 448.4253221696501 + ], + "51": [ + 485.0915395991696, + 447.2052208912188 + ], + "52": [ + 483.878589353552, + 446.2442784776884 + ], + "53": [ + 482.32935658185374, + 446.27249501771087 + ], + "54": [ + 480.88557379800295, + 446.0355629589287 + ], + "55": [ + 479.46577329174545, + 446.02694885478974 + ], + "56": [ + 477.8755470352215, + 446.0223305563235 + ], + "57": [ + 476.6176345704041, + 446.0197448651874 + ], + "58": [ + 475.24612082107615, + 446.15112920238994 + ], + "59": [ + 473.9064954748311, + 446.22130739786934 + ], + "60": [ + 472.3509836708225, + 446.1293532728193 + ], + "61": [ + 470.9156411669908, + 446.20002730724434 + ], + "62": [ + 469.5193054066985, + 445.6917680654495 + ], + "63": [ + 467.84381504980115, + 445.0360390752064 + ], + "64": [ + 466.3487262992165, + 444.3931620752099 + ], + "65": [ + 464.77210946445894, + 443.5414443555413 + ], + "66": [ + 462.9746935379626, + 442.58125871370265 + ], + "67": [ + 461.2938647688374, + 441.41326073391843 + ], + "68": [ + 459.63322571193055, + 440.49266983702756 + ], + "69": [ + 457.7655534920947, + 439.4314662764563 + ], + "70": [ + 456.07755131752424, + 438.0256136443234 + ], + "71": [ + 453.725664861758, + 436.9761798491169 + ], + "72": [ + 451.6580622824271, + 435.9762142912473 + ], + "73": [ + 449.4785235012257, + 435.1575426685473 + ], + "74": [ + 447.4082128573904, + 434.36775177335 + ], + "75": [ + 445.0586749051566, + 433.59080085422073 + ], + "76": [ + 442.65295669307125, + 432.9326282186534 + ], + "77": [ + 440.44725446121004, + 432.4039529876186 + ], + "78": [ + 438.11860240380867, + 431.58919237808516 + ], + "79": [ + 435.7264857452912, + 430.82134829185696 + ], + "80": [ + 433.340169090518, + 430.06002106901536 + ], + "81": [ + 430.53398041773625, + 429.17289305893706 + ], + "82": [ + 427.7090481878058, + 428.06656071282174 + ], + "83": [ + 425.40267662398355, + 426.9641854682367 + ], + "84": [ + 422.5182008445275, + 425.8505860358808 + ], + "85": [ + 420.0825428684464, + 424.4462877929625 + ], + "86": [ + 417.42828076284445, + 423.1430069322171 + ], + "87": [ + 414.54970761580387, + 421.47925570185896 + ], + "88": [ + 411.3492325782604, + 420.0190395897864 + ], + "89": [ + 408.61792615198505, + 418.30625375336183 + ], + "90": [ + 405.51797197068913, + 416.55405945181195 + ], + "91": [ + 402.82264778879824, + 414.5464971665908 + ], + "92": [ + 398.8068922557439, + 412.4766292070686 + ], + "93": [ + 395.70382645132275, + 410.3623737935808 + ], + "94": [ + 392.47250765611517, + 408.12339947822227 + ], + "95": [ + 389.3843045245399, + 406.0061343005655 + ], + "96": [ + 385.6312903231487, + 404.65124713497335 + ], + "97": [ + 382.0496694128485, + 402.77606119258485 + ], + "98": [ + 378.39429310569227, + 401.1329659239203 + ], + "99": [ + 374.40843743494423, + 399.5829263835591 + ], + "100": [ + 370.42343029489984, + 398.1209723139756 + ], + "101": [ + 366.2344150692428, + 396.7124922285568 + ], + "102": [ + 361.69563971955375, + 395.1471110088826 + ], + "103": [ + 357.4674994750693, + 393.5168763192105 + ], + "104": [ + 353.0573021990487, + 391.51306515937716 + ], + "105": [ + 348.2681298086685, + 389.5859168275093 + ], + "106": [ + 343.50872607859424, + 387.70248329406826 + ], + "107": [ + 338.0795484918839, + 385.2113486863693 + ], + "108": [ + 332.86798785578026, + 382.82364632956296 + ], + "109": [ + 327.31081513831066, + 380.312703419178 + ], + "110": [ + 321.20245910768864, + 377.7912142397787 + ], + "111": [ + 315.2862513746154, + 375.0578027679985 + ], + "112": [ + 309.1869290696538, + 372.55984901773644 + ], + "113": [ + 303.0284726044948, + 369.76249826438607 + ], + "114": [ + 296.44760374275285, + 367.0043816972769 + ], + "115": [ + 289.7451759138377, + 364.2990445780973 + ], + "116": [ + 282.62644809614085, + 361.7078951599764 + ], + "117": [ + 275.36136232139273, + 359.1977092245822 + ], + "118": [ + 267.7098131368736, + 356.35210304250927 + ], + "119": [ + 259.86133586270194, + 353.49979083129773 + ], + "120": [ + 251.74378830178054, + 350.6241591842861 + ], + "121": [ + 243.49235138312363, + 347.50437104409974 + ], + "122": [ + 234.83339121829513, + 344.1076324309318 + ], + "123": [ + 226.22437437588658, + 340.39906349204443 + ], + "124": [ + 217.06327121736237, + 336.4591531399487 + ], + "125": [ + 207.97319702624858, + 332.71444143686256 + ], + "126": [ + 198.16763178490984, + 328.511435857386 + ], + "127": [ + 188.03018679135266, + 325.15225677053144 + ], + "128": [ + 177.8868142744232, + 320.78397563797586 + ] + }, + "right": { + "1": [ + 696.6114038794435, + 474.7870197078353 + ], + "2": [ + 697.2743251574282, + 474.2548391055962 + ], + "3": [ + 698.3742771758091, + 473.76380876976737 + ], + "4": [ + 699.2751914042923, + 473.5446523064039 + ], + "5": [ + 700.6250958814672, + 472.78462962608154 + ], + "6": [ + 700.8392771284119, + 472.227574203598 + ], + "7": [ + 702.0933445136086, + 471.0208630974202 + ], + "8": [ + 702.894841088713, + 469.86868961655534 + ], + "9": [ + 703.8474118216516, + 468.76067559745854 + ], + "10": [ + 703.6544368556292, + 470.1109761898246 + ], + "11": [ + 704.0589548299523, + 469.70037241903435 + ], + "12": [ + 703.7587982676824, + 470.46613470833375 + ], + "13": [ + 703.561034993854, + 471.0972334823426 + ], + "14": [ + 704.3043772168215, + 471.1352059664128 + ], + "15": [ + 705.2301786061817, + 470.90431219530404 + ], + "16": [ + 706.9819159616712, + 469.744123745171 + ], + "17": [ + 707.4539420382821, + 469.4936586363414 + ], + "18": [ + 707.7494201869096, + 470.0050261074085 + ], + "19": [ + 708.771935499065, + 468.6489559822967 + ], + "20": [ + 708.3158901497764, + 469.24262031467464 + ], + "21": [ + 708.3869746560046, + 469.035976683763 + ], + "22": [ + 707.6259096065401, + 470.20119092206886 + ], + "23": [ + 709.4410794447203, + 467.21767983722714 + ], + "24": [ + 709.0129327503406, + 467.50913858197487 + ], + "25": [ + 708.9809655168734, + 466.80726985490105 + ], + "26": [ + 709.4916002165116, + 465.14151327699017 + ], + "27": [ + 708.3493842006634, + 465.04517727713767 + ], + "28": [ + 708.5346088498272, + 463.01958227910376 + ], + "29": [ + 708.3904499619515, + 462.15856934850405 + ], + "30": [ + 709.202349351871, + 461.0147384342765 + ], + "31": [ + 711.054715825263, + 457.8102578943004 + ], + "32": [ + 710.9209886491392, + 458.16836290787245 + ], + "33": [ + 711.0631672780644, + 457.1560938569029 + ], + "34": [ + 711.7854509081621, + 456.307739237 + ], + "35": [ + 710.4182637041523, + 457.8612535940404 + ], + "36": [ + 710.6208510701682, + 457.4695893067918 + ], + "37": [ + 712.051961368402, + 456.88081973319277 + ], + "38": [ + 712.6912284091536, + 456.2642972566045 + ], + "39": [ + 712.4041165064048, + 457.5740427210542 + ], + "40": [ + 712.7500089258612, + 457.65138216401107 + ], + "41": [ + 713.3890169152669, + 457.8926266651114 + ], + "42": [ + 713.8630208504226, + 457.4365368847405 + ], + "43": [ + 714.4724195682245, + 457.5298925420514 + ], + "44": [ + 714.7348338827144, + 457.40292221872033 + ], + "45": [ + 715.4376772239192, + 456.8044414522113 + ], + "46": [ + 715.6031043080519, + 456.13738866786684 + ], + "47": [ + 716.3656881268463, + 455.08600955593727 + ], + "48": [ + 716.991952010743, + 454.5664957792037 + ], + "49": [ + 717.646381335936, + 454.1673586380901 + ], + "50": [ + 718.3534902807859, + 453.2835220057346 + ], + "51": [ + 719.0969050802481, + 452.4877274057314 + ], + "52": [ + 719.2675689526236, + 451.72994584735784 + ], + "53": [ + 719.8430768332184, + 451.60614994344166 + ], + "54": [ + 720.2779915436101, + 451.5278320108679 + ], + "55": [ + 720.7317148475049, + 451.4911496030879 + ], + "56": [ + 721.2781846829711, + 451.76071047742744 + ], + "57": [ + 721.6898738491989, + 452.14527612032106 + ], + "58": [ + 722.4954051282529, + 452.30323614547575 + ], + "59": [ + 722.9848450808323, + 453.0513253888024 + ], + "60": [ + 723.9151448166137, + 453.2071245964264 + ], + "61": [ + 724.7322890016229, + 453.2988379602866 + ], + "62": [ + 725.3285314601719, + 453.12642889520026 + ], + "63": [ + 725.9275321466084, + 453.0210474858106 + ], + "64": [ + 726.6755508893219, + 452.67445152048106 + ], + "65": [ + 727.6999736830772, + 452.29696014879016 + ], + "66": [ + 728.5762863540634, + 451.4052382867028 + ], + "67": [ + 729.4132878435198, + 450.7637646724363 + ], + "68": [ + 730.152138889176, + 450.12838455629264 + ], + "69": [ + 731.0221762077393, + 449.3811127516026 + ], + "70": [ + 731.8116940433129, + 448.83045666351444 + ], + "71": [ + 732.5619106845392, + 447.99842633191884 + ], + "72": [ + 733.1286558344204, + 447.1828785349978 + ], + "73": [ + 733.8286405734029, + 446.74085975523184 + ], + "74": [ + 734.5451020607171, + 445.75835970300267 + ], + "75": [ + 735.4525141872982, + 445.21365057559063 + ], + "76": [ + 736.133054735223, + 444.78241723907627 + ], + "77": [ + 736.7239249339359, + 444.35918204280426 + ], + "78": [ + 737.6046497843575, + 443.6395852268689 + ], + "79": [ + 738.4379381979555, + 443.18423668604134 + ], + "80": [ + 739.277218715672, + 442.6610789280367 + ], + "81": [ + 739.975941470702, + 441.74584178054624 + ], + "82": [ + 740.8047468952753, + 440.82320154719906 + ], + "83": [ + 741.8349411170525, + 439.8566037444804 + ], + "84": [ + 742.7695157786538, + 438.51469486435104 + ], + "85": [ + 743.7066170366435, + 437.4989589136406 + ], + "86": [ + 744.8104839611929, + 436.2801866048441 + ], + "87": [ + 746.0347745064572, + 435.0584938984965 + ], + "88": [ + 747.2028441739286, + 433.8354240728685 + ], + "89": [ + 748.4028742417985, + 432.3893139000828 + ], + "90": [ + 749.8918018438154, + 431.0897640376876 + ], + "91": [ + 751.197661364478, + 429.5710322354156 + ], + "92": [ + 752.683231169378, + 428.0243277353849 + ], + "93": [ + 754.2065918247346, + 426.78541635443855 + ], + "94": [ + 755.4659316707907, + 425.56788455498815 + ], + "95": [ + 757.0610478539309, + 424.1438429466543 + ], + "96": [ + 758.4809601691386, + 423.4799106212305 + ], + "97": [ + 759.9736566608785, + 422.6928525354665 + ], + "98": [ + 761.5540926454934, + 421.673584206389 + ], + "99": [ + 762.660388382358, + 421.0786745143708 + ], + "100": [ + 764.2304735925098, + 420.3262244155639 + ], + "101": [ + 765.7602340856918, + 419.778498169183 + ], + "102": [ + 767.1296110587597, + 419.12110368085536 + ], + "103": [ + 768.6651422177483, + 418.8094413876304 + ], + "104": [ + 770.788357650283, + 417.93711878979326 + ], + "105": [ + 771.989921736111, + 416.9849249702675 + ], + "106": [ + 773.5257551390818, + 415.96498353664884 + ], + "107": [ + 775.4886422232448, + 414.83599084641094 + ], + "108": [ + 777.269660548192, + 413.6460611332025 + ], + "109": [ + 778.3662108392956, + 412.2132679829246 + ], + "110": [ + 779.8691733598178, + 411.1174853518323 + ], + "111": [ + 781.6120161643012, + 409.52366369158455 + ], + "112": [ + 783.3935176287337, + 408.38499952797525 + ], + "113": [ + 785.1344040427056, + 407.1373252814078 + ], + "114": [ + 787.2579312435365, + 405.95812687596504 + ], + "115": [ + 789.2818919977028, + 405.0785809971002 + ], + "116": [ + 790.7343599668972, + 403.842155430863 + ], + "117": [ + 792.4274916274413, + 402.7655731704221 + ], + "118": [ + 794.2654790236896, + 401.57046321718303 + ], + "119": [ + 796.2230812062309, + 400.253622780149 + ], + "120": [ + 798.3028774507285, + 399.0186442490307 + ], + "121": [ + 800.1960158502851, + 397.31577734473944 + ], + "122": [ + 802.7977141522337, + 395.8810591801129 + ], + "123": [ + 805.2075067705938, + 394.2486364917493 + ], + "124": [ + 807.7271711962715, + 392.57196488797024 + ], + "125": [ + 809.8854777532586, + 390.59742865944946 + ], + "126": [ + 812.9027294777102, + 388.3946356118431 + ], + "127": [ + 814.8142473496994, + 386.57707710314025 + ], + "128": [ + 817.411827949075, + 384.31368288721086 + ] + } +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/tracks.jpg b/astra_scene_test/Scene_04/reference/tracks.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81cd82a62b3f46225ceaeb2d3fa26e8e848b41d4 Binary files /dev/null and b/astra_scene_test/Scene_04/reference/tracks.jpg differ diff --git a/astra_scene_test/Scene_04/reference/vertical_segments.json b/astra_scene_test/Scene_04/reference/vertical_segments.json new file mode 100644 index 0000000000000000000000000000000000000000..f72df3c11ab0bd18d98a1803027429c6dc65a9ad --- /dev/null +++ b/astra_scene_test/Scene_04/reference/vertical_segments.json @@ -0,0 +1,324 @@ +[ + { + "p": [ + 1274, + 338, + 1276, + 408 + ], + "line": [ + -0.9995920864606946, + 0.02855977389887699, + 1263.8271145731046 + ], + "length": 70.02856560004639 + }, + { + "p": [ + 1020, + 77, + 1028, + 125 + ], + "line": [ + -0.9863939238321437, + 0.1643989873053573, + 993.4630802862741 + ], + "length": 48.66210024238575 + }, + { + "p": [ + 1257, + 493, + 1257, + 389 + ], + "line": [ + 1.0, + 0.0, + -1257.0 + ], + "length": 104.0 + }, + { + "p": [ + 1258, + 329, + 1272, + 390 + ], + "line": [ + -0.9746597895608373, + 0.22369241071888069, + 1152.5272121410217 + ], + "length": 62.58594091327541 + }, + { + "p": [ + 12, + 380, + 20, + 336 + ], + "line": [ + 0.9838699100999074, + 0.17888543819998318, + -79.7829054371925 + ], + "length": 44.72135954999579 + }, + { + "p": [ + 1259, + 300, + 1261, + 440 + ], + "line": [ + -0.9998979747995099, + 0.014284256782850143, + 1254.586273237728 + ], + "length": 140.01428498549708 + }, + { + "p": [ + 289, + 176, + 306, + 118 + ], + "line": [ + 0.9596285438852136, + 0.28127043527670054, + -326.83624579152604 + ], + "length": 60.4400529450463 + }, + { + "p": [ + 991, + 4, + 1002, + 38 + ], + "line": [ + -0.9514445185544115, + 0.30782028541466255, + 941.6502367457631 + ], + "length": 35.73513677041127 + }, + { + "p": [ + 4, + 227, + 4, + 270 + ], + "line": [ + -1.0, + 0.0, + 4.0 + ], + "length": 43.0 + }, + { + "p": [ + 46, + 353, + 57, + 294 + ], + "line": [ + 0.9830602989442486, + 0.1832824286167243, + -109.91947105313912 + ], + "length": 60.01666435249463 + }, + { + "p": [ + 1270, + 390, + 1270, + 323 + ], + "line": [ + 1.0, + 0.0, + -1270.0 + ], + "length": 67.0 + }, + { + "p": [ + 1258, + 26, + 1260, + 98 + ], + "line": [ + -0.9996144206527183, + 0.027767067240353285, + 1256.7929974328704 + ], + "length": 72.02777242147643 + }, + { + "p": [ + 1254, + 389, + 1254, + 424 + ], + "line": [ + -1.0, + 0.0, + 1254.0 + ], + "length": 35.0 + }, + { + "p": [ + 1271, + 372, + 1271, + 333 + ], + "line": [ + 1.0, + 0.0, + -1271.0 + ], + "length": 39.0 + }, + { + "p": [ + 1272, + 372, + 1272, + 327 + ], + "line": [ + 1.0, + 0.0, + -1272.0 + ], + "length": 45.0 + }, + { + "p": [ + 1256, + 213, + 1271, + 243 + ], + "line": [ + -0.894427190999916, + 0.447213595499958, + 1028.1440560544033 + ], + "length": 33.54101966249685 + }, + { + "p": [ + 1069, + 357, + 1076, + 401 + ], + "line": [ + -0.9875803063351138, + 0.15711504873513174, + 999.6332750737947 + ], + "length": 44.55333881989093 + }, + { + "p": [ + 1124, + 191, + 1135, + 228 + ], + "line": [ + -0.9585363562790536, + 0.2849702680829619, + 1022.9655432538106 + ], + "length": 38.600518131237564 + }, + { + "p": [ + 5, + 393, + 16, + 332 + ], + "line": [ + 0.9841270174450972, + 0.17746552773600113, + -74.66458748747394 + ], + "length": 61.98386886924695 + }, + { + "p": [ + 1249, + 341, + 1249, + 376 + ], + "line": [ + -1.0, + 0.0, + 1249.0 + ], + "length": 35.0 + }, + { + "p": [ + 869, + 178, + 891, + 216 + ], + "line": [ + -0.8654262854811262, + 0.5010362705417046, + 662.8709859266752 + ], + "length": 43.9089968002003 + }, + { + "p": [ + 1273, + 386, + 1273, + 356 + ], + "line": [ + 1.0, + 0.0, + -1273.0 + ], + "length": 30.0 + }, + { + "p": [ + 1255, + 393, + 1263, + 427 + ], + "line": [ + -0.973417168333576, + 0.2290393337255473, + 1131.626088104498 + ], + "length": 34.92849839314596 + } +] \ No newline at end of file diff --git a/astra_scene_test/Scene_04/reference/white_suv_envelope_trial.json b/astra_scene_test/Scene_04/reference/white_suv_envelope_trial.json new file mode 100644 index 0000000000000000000000000000000000000000..0bf809a783cc285218d47a8c3f592a8fdd6189ec --- /dev/null +++ b/astra_scene_test/Scene_04/reference/white_suv_envelope_trial.json @@ -0,0 +1,65 @@ +{ + "parameters": { + "x": -9.665293613337354, + "y": 22.851493165101633, + "width": 2.9912764148336106, + "length": 4.201595855386751, + "height": 2.8338549329445866, + "angle": -0.0434971844242996 + }, + "observations": { + "1": [ + 407, + 514, + 495, + 566 + ], + "33": [ + 277, + 505, + 437, + 585 + ], + "65": [ + 0, + 505, + 280, + 647 + ] + }, + "predictions": { + "1": [ + 403.89897939086484, + 512.6889301765085, + 491.01906415185704, + 563.7818742390907 + ], + "33": [ + 278.47685795367727, + 505.4191828253542, + 433.06458893759384, + 582.48861577046 + ], + "65": [ + 0.0, + 505.2499006274795, + 284.2139382265613, + 666.9284375471518 + ] + }, + "residuals": [ + -3.101020609135162, + -1.3110698234914935, + -3.9809358481429626, + -2.218125760909288, + 1.4768579536772677, + 0.4191828253541985, + -3.9354110624061605, + -2.511384229539999, + 0.0, + 0.24990062747951924, + 4.213938226561311, + 19.928437547151816, + -0.8699436884859919 + ] +} \ No newline at end of file diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/animation_curves.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/animation_curves.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e458a6e611092ad1ae4b785d90c16825296482f0 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/animation_curves.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/atmosphere.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/atmosphere.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25e3b007488b8f18425b2fafd3e0843eff7c1639 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/atmosphere.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/install_optics.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/install_optics.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..348ce2795b282e11b8ef6207994dd2d3b916ef73 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/install_optics.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/install_signal_response.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/install_signal_response.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..917e592ca026daba7278f0bfafb089735f894ec6 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/install_signal_response.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/overscan.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/overscan.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8571030d98834a0169ececa069f9f1c2254fac7 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/overscan.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/photographic_materials.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/photographic_materials.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fda4660c91e55d81fd8911684c3923b98579f21 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/photographic_materials.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/render_device.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/render_device.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..870391db9dfd7c2b48801fba5924eb68045dad45 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/render_device.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/render_settings.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/render_settings.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d93f7690c50e7a347da6b5d4a203f1b3bd936a98 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/render_settings.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/__pycache__/road_surface.cpython-313.pyc b/astra_scene_test/Scene_04/scripts/__pycache__/road_surface.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fac62637671587214546cd9d8375005e2980fc2 Binary files /dev/null and b/astra_scene_test/Scene_04/scripts/__pycache__/road_surface.cpython-313.pyc differ diff --git a/astra_scene_test/Scene_04/scripts/animation_curves.py b/astra_scene_test/Scene_04/scripts/animation_curves.py new file mode 100644 index 0000000000000000000000000000000000000000..37e717ea35be6cffb072564eac4b5ac4f5c10819 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/animation_curves.py @@ -0,0 +1,20 @@ +"""Inspect legacy and layered Blender action curves without silently skipping them.""" +def curves(owner): + animation=getattr(owner,'animation_data',None) + action=getattr(animation,'action',None) + if not action:return [] + if hasattr(action,'fcurves'):return list(action.fcurves) + found=[] + for layer in action.layers: + for strip in layer.strips: + for bag in getattr(strip,'channelbags',[]):found.extend(bag.fcurves) + return found + +def linear(owner): + found=curves(owner) + if getattr(getattr(owner,'animation_data',None),'action',None) and not found: + raise RuntimeError('Animated action has no inspectable curves: '+owner.name) + for curve in found: + curve.extrapolation='LINEAR' + for key in curve.keyframe_points:key.interpolation='LINEAR' + return len(found) diff --git a/astra_scene_test/Scene_04/scripts/atmosphere.py b/astra_scene_test/Scene_04/scripts/atmosphere.py new file mode 100644 index 0000000000000000000000000000000000000000..c86ac689513cf76839134b1700aaf27adc294f9a --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/atmosphere.py @@ -0,0 +1,20 @@ +"""Stable homogeneous height layers for low-lying nighttime humidity.""" +import bpy +def install_atmosphere(parameters): + group=bpy.data.collections.get('Atmosphere') + if group is None: + group=bpy.data.collections.new('Atmosphere');bpy.context.scene.collection.children.link(group) + for ob in list(group.objects):bpy.data.objects.remove(ob,do_unlink=True) + layers=parameters.get('haze_layers',[[-20,25,1.0],[25,60,.4],[60,110,.10]]) + for index,(bottom,top,factor) in enumerate(layers): + m=bpy.data.materials.new('Humid air height layer '+str(index));m.use_nodes=True;n=m.node_tree.nodes;n.clear() + out=n.new('ShaderNodeOutputMaterial');v=n.new('ShaderNodeVolumePrincipled') + v.inputs['Density'].default_value=parameters['haze']*factor + v.inputs['Color'].default_value=(*parameters.get('haze_color',[.53,.59,.58]),1) + v.inputs['Anisotropy'].default_value=.28;m.node_tree.links.new(v.outputs['Volume'],out.inputs['Volume']) + bpy.ops.mesh.primitive_cube_add(size=1,location=(0,360,(bottom+top)/2)) + ob=bpy.context.object;ob.name='Stable atmospheric layer '+str(index);ob.dimensions=(440,900,top-bottom) + bpy.ops.object.transform_apply(location=False,rotation=False,scale=True) + for c in list(ob.users_collection):c.objects.unlink(ob) + group.objects.link(ob);ob.data.materials.append(m) + ob['density_profile']='Fixed in world space; no animated random density' diff --git a/astra_scene_test/Scene_04/scripts/audit_blend.py b/astra_scene_test/Scene_04/scripts/audit_blend.py new file mode 100644 index 0000000000000000000000000000000000000000..bbbae48fd7742bd37e77fd2d68f455c193741922 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/audit_blend.py @@ -0,0 +1,49 @@ +"""Read-only scene audit performed after opening the on-disk .blend.""" +import bpy,pathlib,json,hashlib,datetime,sys,struct +ROOT=pathlib.Path(__file__).resolve().parents[1];S=bpy.context.scene +sys.path.insert(0,str(ROOT/'scripts')) +from animation_curves import curves +from road_surface import ground_height +room_lights=[{'name':o.name,'position':list(o.matrix_world.translation),'height_above_road':o.matrix_world.translation.z-ground_height(o.matrix_world.translation.y,o.matrix_world.translation.x)} for o in S.objects if o.type=='LIGHT' and 'room ceiling' in o.name] +camera_curves=[{'path':fc.data_path,'index':fc.array_index,'keyframes':len(fc.keyframe_points),'interpolations':sorted({k.interpolation for k in fc.keyframe_points})} for fc in curves(S.camera)] +source_images=[im.filepath for im in bpy.data.images if im.source in ['MOVIE','SEQUENCE']] +reference_hashes={f['sha256'] for f in json.loads((ROOT/'reference/metadata.json').read_text())['frames']} +images=[] +for im in bpy.data.images: + digest=None;data=None + if im.packed_file:data=im.packed_file.data;digest=hashlib.sha256(data).hexdigest() + elif im.source=='FILE' and im.filepath: + path=pathlib.Path(bpy.path.abspath(im.filepath)) + if path.is_file():data=path.read_bytes();digest=hashlib.sha256(data).hexdigest() + png={'width':struct.unpack('>I',data[16:20])[0],'height':struct.unpack('>I',data[20:24])[0],'bit_depth':data[24]} if data and data[:8]==b'\x89PNG\r\n\x1a\n' else None + images.append({'name':im.name,'source':im.source,'filepath':im.filepath,'packed':bool(im.packed_file),'sha256':digest,'png_header':png}) +fonts=[{'name':font.name,'filepath':font.filepath,'packed':bool(getattr(font,'packed_file',None))} for font in bpy.data.fonts] +camera=[] +for fr in [1,17,33,49,65,81,97,113,128]: + S.frame_set(fr);camera.append({'frame':fr,'location':list(S.camera.location),'rotation':list(S.camera.rotation_euler)}) +scene_path=pathlib.Path(bpy.data.filepath) +crop=S.compositing_node_group.nodes.get('SOURCE_FRAME_CROP') if S.compositing_node_group else None +crop_data=None +if crop: + output=next(n for n in S.compositing_node_group.nodes if n.bl_idname=='NodeGroupOutput') + crop_data={'x':crop.inputs['X'].default_value,'y':crop.inputs['Y'].default_value, + 'width':crop.inputs['Width'].default_value,'height':crop.inputs['Height'].default_value, + 'alpha_crop':crop.inputs['Alpha Crop'].default_value, + 'connected_to_output':bool(output.inputs['Image'].links and output.inputs['Image'].links[0].from_node==crop)} +output_resolution=[crop_data['width'],crop_data['height']] if crop_data else [S.render.resolution_x,S.render.resolution_y] +native=S.compositing_node_group.nodes.get('SOURCE_FRAME_OUTPUT') if S.compositing_node_group else None +native_data={'format':native.format.file_format,'directory':native.directory,'items':[i.name for i in native.file_output_items], + 'connected_to_crop':any(link.from_node==crop for socket in native.inputs for link in socket.links)} if native else None +data={'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'blend_sha256':hashlib.sha256(scene_path.read_bytes()).hexdigest(), + 'filepath':str(scene_path),'frame_start':S.frame_start,'frame_end':S.frame_end,'fps':S.render.fps,'fps_base':S.render.fps_base, + 'resolution':[S.render.resolution_x,S.render.resolution_y], 'percentage':S.render.resolution_percentage, + 'output_resolution':output_resolution,'optical_crop':crop_data,'optical_overscan':S.get('optical_overscan',1), + 'native_file_output':native_data,'automatic_output_enabled':S.render.save_output, + 'camera_curves':camera_curves,'camera_samples':camera,'camera_animated':bool(S.camera.animation_data),'camera_lens_mm':S.camera.data.lens,'room_lights':room_lights, + 'mesh_object_count':sum(o.type=='MESH' for o in S.objects),'curve_object_count':sum(o.type=='CURVE' for o in S.objects), + 'material_count':len(bpy.data.materials),'collections':[c.name for c in bpy.data.collections], + 'movie_sequence_images':source_images,'reference_image_matches':[im['name'] for im in images if im['sha256'] in reference_hashes],'samples':S.cycles.samples,'adaptive_min_samples':S.cycles.adaptive_min_samples,'adaptive_threshold':S.cycles.adaptive_threshold,'images':images,'objects':len(S.objects), + 'fonts':fonts,'missing_external_fonts':[font['filepath'] for font in fonts if font['filepath'] and font['filepath']!='' and not font['packed'] and not pathlib.Path(bpy.path.abspath(font['filepath'])).exists()], + 'missing_external_images':[im.filepath for im in bpy.data.images if im.filepath and im.source=='FILE' and not im.packed_file and not pathlib.Path(bpy.path.abspath(im.filepath)).exists()]} +(ROOT/'logs/reopened_scene_audit.json').write_text(json.dumps(data,indent=2)) +print('AUDIT_COMPLETE',data['objects'],data['blend_sha256']) diff --git a/astra_scene_test/Scene_04/scripts/audit_packed_optics.py b/astra_scene_test/Scene_04/scripts/audit_packed_optics.py new file mode 100644 index 0000000000000000000000000000000000000000..2b77e01d871117a679a372b5fbd01082dd1da82c --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/audit_packed_optics.py @@ -0,0 +1,16 @@ +"""Inspect and retain packed numeric optical images from a saved checkpoint.""" +import bpy,hashlib,json,pathlib,struct +ROOT=pathlib.Path(__file__).resolve().parents[1] +folder=ROOT/'renders/optical_baseline_assets' +folder.mkdir(parents=True,exist_ok=True) +rows=[] +for im in bpy.data.images: + if not pathlib.Path(im.filepath).name.startswith(('windshield_','wet_glass_','sensor_')):continue + name=pathlib.Path(im.filepath).name + data=im.packed_file.data if im.packed_file else pathlib.Path(bpy.path.abspath(im.filepath)).read_bytes() + target=folder/name;target.write_bytes(data) + row={'name':name,'image_size':list(im.size),'colorspace':im.colorspace_settings.name,'sha256':hashlib.sha256(data).hexdigest()} + if data[:8]==b'\x89PNG\r\n\x1a\n':row['png_header']={'size':list(struct.unpack('>II',data[16:24])),'bit_depth':data[24],'color_type':data[25]} + rows.append(row) +(ROOT/'logs/packed_optical_baseline.json').write_text(json.dumps(rows,indent=2)) +print('PACKED_OPTICAL_AUDIT_COMPLETE',json.dumps(rows),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/benchmark_metalrt.py b/astra_scene_test/Scene_04/scripts/benchmark_metalrt.py new file mode 100644 index 0000000000000000000000000000000000000000..e9c5415ca60ce08f45127691234b93ec2f04d080 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/benchmark_metalrt.py @@ -0,0 +1,19 @@ +"""Test hardware traversal under the reduced memory budget; does not save the scene.""" +import bpy,pathlib,sys,json,time,os +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from render_settings import apply_quality +from render_device import configure +args=sys.argv[sys.argv.index('--')+1:] if '--' in sys.argv else [] +percent=int(args[0]) if args else 50;samples=int(args[1]) if len(args)>1 else 64 +tile=int(args[2]) if len(args)>2 else 128;frames=[int(f) for f in args[3].split(',')] if len(args)>3 else [1];mode=args[4] if len(args)>4 else 'ON' +S=bpy.context.scene;apply_quality(S,samples,percent);configure(S);S.cycles.tile_size=tile +prefs=bpy.context.preferences.addons['cycles'].preferences;prefs.metalrt=mode;S.cycles.device='GPU' +S.render.image_settings.file_format='PNG';out=ROOT/'renders/metalrt_benchmark';out.mkdir(parents=True,exist_ok=True) +rows=[] +for fr in frames: + S.frame_set(fr);S.render.filepath=str(out/f'frame{fr}_{percent}_{samples}_{mode}_tile{tile}.png');start=time.monotonic() + print('METALRT_BENCHMARK_START',fr,percent,samples,tile,mode,os.environ.get('CYCLES_METAL_WORKING_SET_PERCENT'),flush=True) + bpy.ops.render.render(write_still=True) + row={'frame':fr,'seconds':time.monotonic()-start,'samples':samples,'percent':percent,'tile':tile,'metalrt':prefs.metalrt,'working_set':os.environ.get('CYCLES_METAL_WORKING_SET_PERCENT')};rows.append(row) + (ROOT/f'logs/metalrt_benchmark_{percent}_{samples}_{mode}_tile{tile}.json').write_text(json.dumps(rows,indent=2));print('METALRT_BENCHMARK_FRAME',row,flush=True) +print('METALRT_BENCHMARK_COMPLETE',len(rows),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/build_scene.py b/astra_scene_test/Scene_04/scripts/build_scene.py new file mode 100644 index 0000000000000000000000000000000000000000..6fb87649c8f4bd03d88a6997a37c82728be0a68d --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/build_scene.py @@ -0,0 +1,1081 @@ +"""Scene 04: deterministic, editable reconstruction. Run using Blender --background. + +All visible world assets are generated as mesh/curve geometry with editable +procedural and CC0 photographed surface materials. Reference frames are used only by the external comparison scripts. +""" +import bpy, bmesh, math, random, json, pathlib, sys, time +from mathutils import Vector, Matrix, Euler, Quaternion +import bisect +from math import sin, cos, pi +ROOT=pathlib.Path(__file__).resolve().parents[1] +random.seed(404) +ARGS=sys.argv[sys.argv.index('--')+1:] if '--' in sys.argv else [] +VARIANT=ARGS[0] if ARGS else 'layout' +PARAMS={ + 'fov':120.0, 'pitch':24.8, 'yaw':4.0, 'camera_height':1.55, + 'travel':27.8, 'road_halfwidth':10.5, 'sidewalk_width':3.6, + 'intersection':36.5, 'intersection_width':12.5, + 'exposure':0.5, 'world_strength':0.28, 'haze':0.0018, + 'samples':96, 'resolution_percentage':60, +} +config=ROOT/'assets/config.json' +if config.exists(): PARAMS.update(json.loads(config.read_text())) +else: config.write_text(json.dumps(PARAMS,indent=2)) +P=PARAMS +bpy.ops.object.select_all(action='SELECT');bpy.ops.object.delete(use_global=False) +for d in list(bpy.data.materials):bpy.data.materials.remove(d) +S=bpy.context.scene +S.render.engine='CYCLES';S.cycles.samples=P['samples'];S.cycles.use_denoising=True +S.cycles.adaptive_threshold=.008 if P['samples']>=512 else .012 if P['samples']>=256 else .035 +S.cycles.adaptive_min_samples=128 if P['samples']>=512 else 64 if P['samples']>=256 else 16 +S.cycles.tile_size=256;S.cycles.debug_use_compact_bvh=True;S.cycles.denoising_use_gpu=False +S.render.use_persistent_data=False +if hasattr(S.render,'compositor_device'):S.render.compositor_device='CPU' +sys.path.insert(0,str(ROOT/'scripts')) +from render_device import configure +print('RENDER_DEVICE',configure(S,'cpu' in ARGS),flush=True) +from render_settings import apply_quality +apply_quality(S,P['samples'],P['resolution_percentage']) +S.cycles.max_bounces=8;S.cycles.transmission_bounces=6;S.cycles.transparent_max_bounces=12 +S.cycles.volume_bounces=1;S.cycles.diffuse_bounces=3;S.cycles.glossy_bounces=4 +S.cycles.sample_clamp_indirect=5 +S.render.resolution_x=1280;S.render.resolution_y=720;S.render.resolution_percentage=P['resolution_percentage'] +S.render.fps=30;S.render.fps_base=1;S.frame_start=1;S.frame_end=128 +S.render.image_settings.file_format='PNG';S.render.image_settings.color_mode='RGB';S.render.image_settings.color_depth='8' +S.render.film_transparent=False;S.render.use_motion_blur=True;S.render.motion_blur_shutter=.45 +S.view_settings.view_transform=P.get('view_transform','AgX');S.view_settings.look=P.get('look','AgX - Medium High Contrast');S.view_settings.gamma=P.get('gamma',1.0) +S.view_settings.exposure=P['exposure'] +S.world.use_nodes=True;world=S.world.node_tree +world.nodes['Background'].inputs['Color'].default_value=(*P.get('world_color',[.24,.27,.24]),1) +world.nodes['Background'].inputs['Strength'].default_value=P['world_strength'] +if P.get('sky_response'): + original=world.nodes['Background'];camera_sky=world.nodes.new('ShaderNodeBackground');camera_sky.label='Gradual calibrated camera response for the visible overcast sky' + camera_sky.inputs['Strength'].default_value=P['world_strength'] + for fr,rgb in P['sky_response'].items(): + camera_sky.inputs['Color'].default_value=(*[v*g for v,g in zip(P['world_color'],rgb)],1) + camera_sky.inputs['Color'].keyframe_insert('default_value',frame=int(fr)) + ray=world.nodes.new('ShaderNodeLightPath');mixsky=world.nodes.new('ShaderNodeMixShader') + world.links.new(ray.outputs['Is Camera Ray'],mixsky.inputs[0]);world.links.new(original.outputs[0],mixsky.inputs[1]);world.links.new(camera_sky.outputs[0],mixsky.inputs[2]) + world.links.new(mixsky.outputs[0],world.nodes['World Output'].inputs['Surface']) + +collections={} +def coll(name): + if name not in collections: + c=bpy.data.collections.new(name);S.collection.children.link(c);collections[name]=c + return collections[name] +def objlink(o,group): + for c in list(o.users_collection):c.objects.unlink(o) + coll(group).objects.link(o) + return o +def material(name,color,rough=.5,metal=0,emission=0): + m=bpy.data.materials.new(name);m.diffuse_color=(*color,1);m.use_nodes=True + p=m.node_tree.nodes.get('Principled BSDF');p.inputs['Base Color'].default_value=(*color,1) + p.inputs['Roughness'].default_value=rough;p.inputs['Metallic'].default_value=metal + if emission: + p.inputs['Emission Color'].default_value=(*color,1);p.inputs['Emission Strength'].default_value=emission + return m +def noise_surface(m,scale,strength,distance,roughrange=None): + n=m.node_tree.nodes;l=m.node_tree.links;p=n.get('Principled BSDF') + t=n.new('ShaderNodeTexNoise');t.inputs['Scale'].default_value=scale;t.inputs['Detail'].default_value=3 + co=n.new('ShaderNodeTexCoord');l.new(co.outputs['Object'],t.inputs['Vector']) + bump=n.new('ShaderNodeBump');bump.inputs['Strength'].default_value=strength;bump.inputs['Distance'].default_value=distance + l.new(t.outputs['Fac'],bump.inputs['Height']);l.new(bump.outputs['Normal'],p.inputs['Normal']) + if roughrange: + r=n.new('ShaderNodeMapRange');r.inputs['From Min'].default_value=.25;r.inputs['From Max'].default_value=.75 + r.inputs['To Min'].default_value=roughrange[0];r.inputs['To Max'].default_value=roughrange[1] + l.new(t.outputs['Fac'],r.inputs['Value']);l.new(r.outputs[0],p.inputs['Roughness']) + return t +M={} +for name,c,r,mt in [ + ('asphalt',(.044,.054,.065),.48,.02),('concrete',(.19,.20,.18),.73,0), + ('curb',(.18,.19,.175),.60,0),('stone',(.29,.27,.21),.72,0), + ('darkbrick',(.10,.064,.043),.67,0),('redbrick',(.23,.092,.05),.71,0), + ('tanbrick',(.25,.23,.16),.70,0),('mortaredstone',(.34,.32,.24),.65,0), + ('metal',(.058,.067,.060),.33,.72),('scaffold',(.39,.43,.44),.24,.8), + ('trim',(.19,.18,.14),.52,.1),('black',(.009,.012,.012),.43,0), + ('glass',(.028,.048,.044),.18,.58),('orange',(.42,.13,.027),.59,0), + ('barrier_white',(.54,.53,.45),.5,0),('roadpaint',(.34,.36,.31),.55,0), + ('signred',(.37,.025,.019),.45,0),('greenmetal',(.029,.070,.052),.45,.35), + ('tire',(.009,.011,.011),.76,0),('chrome',(.47,.50,.50),.2,.9), + ('bark',(.066,.048,.027),.9,0),('leaf',(.031,.090,.029),.73,0), + ('leaflight',(.069,.12,.043),.8,0),('leaffaded',(.1,.13,.05),.8,0), + ('hood',(.14,.16,.15),.27,.55),('rust',(.16,.061,.026),.76,.3), + ('bluebin',(.028,.12,.26),.49,0)]:M[name]=material(name,c,r,mt) +M['shopglass']=material('Actual storefront glazing',(.82,.88,.86),.10,0) +M['shopglass'].node_tree.nodes['Principled BSDF'].inputs['Transmission Weight'].default_value=.92 +M['shopglass'].node_tree.nodes['Principled BSDF'].inputs['IOR'].default_value=1.46 +M['carglass']=material('Tinted automotive glazing',(.065,.095,.072),.085,.15) +M['carglass'].node_tree.nodes['Principled BSDF'].inputs['Transmission Weight'].default_value=.45 +M['carglass'].node_tree.nodes['Principled BSDF'].inputs['IOR'].default_value=1.48 +for name,color in [('leaf',(.043,.076,.009)),('leaflight',(.067,.110,.014)),('leaffaded',(.082,.100,.020))]: + M[name].node_tree.nodes['Principled BSDF'].inputs['Base Color'].default_value=(*color,1) +for n in ['concrete','curb','stone','trim','bark']:noise_surface(M[n],6,.25,.03) +paint=M['roadpaint'];pn=paint.node_tree.nodes;pl=paint.node_tree.links;ppaint=pn.get('Principled BSDF') +pc=pn.new('ShaderNodeTexCoord');pw=pn.new('ShaderNodeTexNoise');pw.inputs['Scale'].default_value=24;pw.inputs['Detail'].default_value=3;pl.new(pc.outputs['Object'],pw.inputs['Vector']) +pr=pn.new('ShaderNodeValToRGB');pr.color_ramp.elements[0].position=.33;pr.color_ramp.elements[0].color=(.07,.085,.08,1) +pr.color_ramp.elements[1].position=.58;pr.color_ramp.elements[1].color=(.37,.39,.34,1) +pl.new(pw.outputs['Fac'],pr.inputs[0]);pl.new(pr.outputs[0],ppaint.inputs['Base Color']) +noise_surface(paint,100,.18,.002,(.42,.65)) + +noise_surface(M['asphalt'],145,.20,.003,(.22,.58)) +for name in ['redbrick','darkbrick','tanbrick']: + m=M[name];n=m.node_tree.nodes;l=m.node_tree.links;p=n.get('Principled BSDF') + tex=n.new('ShaderNodeTexBrick');tex.inputs['Color1'].default_value=m.diffuse_color + tex.inputs['Color2'].default_value=tuple(v*.62 for v in m.diffuse_color[:3])+(1,) + tex.inputs['Mortar'].default_value=(.12,.12,.10,1);tex.inputs['Scale'].default_value=1 + tex.inputs['Mortar Size'].default_value=.012;tex.inputs['Brick Width'].default_value=.28;tex.inputs['Row Height'].default_value=.11 + co=n.new('ShaderNodeTexCoord');sep=n.new('ShaderNodeSeparateXYZ');comb=n.new('ShaderNodeCombineXYZ') + l.new(co.outputs['Object'],sep.inputs[0]);l.new(sep.outputs['Y'],comb.inputs['X']);l.new(sep.outputs['Z'],comb.inputs['Y']) + l.new(comb.outputs[0],tex.inputs['Vector']);l.new(tex.outputs['Color'],p.inputs['Base Color']) + b=n.new('ShaderNodeBump');b.inputs['Strength'].default_value=.32;b.inputs['Distance'].default_value=.018 + l.new(tex.outputs['Fac'],b.inputs['Height']);l.new(b.outputs[0],p.inputs['Normal']) +for name,c,power in [('warmwindow',(.66,.40,.16),1.2),('dimwindow',(.22,.24,.16),.08), + ('coolwindow',(.42,.57,.58),1.5),('shopwhite',(.65,.77,.8),3),('shopwarm',(.8,.61,.34),1.8), + ('lamp',(.86,.80,.63),800),('headlight',(.30,.60,1),1100),('tail',(.12,.003,.001),0), + ('signalgreen',(.025,.75,.55),65),('signwhite',(.66,.75,.72),5.0),('signgold',(.60,.65,.16),5.5), + ('redneon',(.60,.015,.02),5)]:M[name]=material(name,c,.32,0,power) +M['escapeiron']=material('Weathered black fire escape iron',(.018,.022,.019),.62,.48) +M['vehiclebadge']=material('Satin gold vehicle grille badge',(.34,.25,.105),.3,.65) +M['silverwheel']=material('Brushed silver wheel backing',(.32,.34,.33),.35,.8) +M['lamp_distant']=material('Dim distant streetlamp lens',(.86,.80,.63),.32,0,70) +M['lamp_secondary']=material('Secondary paired lamp visible lens',(.86,.80,.63),.32,0,180) +M['measuredwindow']=material('Measured warm residential window',(.75,.66,.40),.35,0,2.2) + +sys.path.insert(0,str(ROOT/'scripts')) +from photographic_materials import install_material_maps,add_surface_uv +install_material_maps(M) + +# Mesh batches retain separate named architectural systems and material slots. +class Batch: + def __init__(self,name,group):self.name=name;self.group=group;self.v=[];self.f=[];self.mi=[];self.mats=[] + def face(self,pts,mat): + base=len(self.v);self.v.extend(pts);self.f.append(tuple(range(base,base+len(pts)))) + if mat not in self.mats:self.mats.append(mat) + self.mi.append(self.mats.index(mat)) + def box(self,center,size,mat,rot=0): + x,y,z=center;a,b,c=[s/2 for s in size] + pts=[] + for u,v,w in [(-a,-b,-c),(a,-b,-c),(a,b,-c),(-a,b,-c),(-a,-b,c),(a,-b,c),(a,b,c),(-a,b,c)]: + pts.append((x+u*cos(rot)-v*sin(rot),y+u*sin(rot)+v*cos(rot),z+w)) + for face in [(0,3,2,1),(4,5,6,7),(0,1,5,4),(1,2,6,5),(2,3,7,6),(3,0,4,7)]:self.face([pts[i] for i in face],mat) + def finish(self): + mesh=bpy.data.meshes.new(self.name);mesh.from_pydata(self.v,[],self.f);mesh.update() + if any(m.name in {'asphalt','redbrick','darkbrick','tanbrick'} for m in self.mats):add_surface_uv(mesh) + o=bpy.data.objects.new(self.name,mesh);coll(self.group).objects.link(o) + for m in self.mats:mesh.materials.append(m) + for p,idx in zip(mesh.polygons,self.mi):p.material_index=idx + return o +def box(name,loc,size,mat,group='Street',bevel=0): + b=Batch(name,group);b.box(loc,size,mat);o=b.finish() + if bevel: + mod=o.modifiers.new('Small manufactured edge bevel','BEVEL');mod.width=bevel;mod.segments=2 + o.modifiers.new('Corner normals','WEIGHTED_NORMAL') + return o +def path(name,coords,radius,mat,group='Street',resolution=2): + c=bpy.data.curves.new(name,'CURVE');c.dimensions='3D';c.resolution_u=resolution;c.bevel_depth=radius;c.bevel_resolution=2 + s=c.splines.new('POLY');s.points.add(len(coords)-1) + for p,co in zip(s.points,coords):p.co=(*co,1) + o=bpy.data.objects.new(name,c);coll(group).objects.link(o);c.materials.append(mat);return o +primitive_cache={} +def cylinder(name,a,b,r,mat,group='Street',vertices=12): + a,b=Vector(a),Vector(b);d=b-a;key=('cylinder',vertices,mat.name) + if key not in primitive_cache: + verts=[(cos(j*2*pi/vertices),sin(j*2*pi/vertices),z) for z in [-.5,.5] for j in range(vertices)] + faces=[tuple(reversed(range(vertices))),tuple(range(vertices,2*vertices))] + faces += [(j,(j+1)%vertices,(j+1)%vertices+vertices,j+vertices) for j in range(vertices)] + mesh=bpy.data.meshes.new('Shared '+mat.name+' cylinder');mesh.from_pydata(verts,[],faces);mesh.materials.append(mat) + primitive_cache[key]=mesh + o=bpy.data.objects.new(name,primitive_cache[key]);coll(group).objects.link(o) + o.location=(a+b)/2;o.scale=(r,r,d.length);o.rotation_euler=d.to_track_quat('Z','Y').to_euler() + return o +def sphere(name,loc,scale,mat,group='Street',segments=16,rings=8): + key=('sphere',segments,rings,mat.name) + if key not in primitive_cache: + verts=[(sin(pi*i/rings)*cos(j*2*pi/segments),sin(pi*i/rings)*sin(j*2*pi/segments),cos(pi*i/rings)) for i in range(rings+1) for j in range(segments)] + faces=[(i*segments+j,i*segments+(j+1)%segments,(i+1)*segments+(j+1)%segments,(i+1)*segments+j) for i in range(rings) for j in range(segments)] + mesh=bpy.data.meshes.new('Shared '+mat.name+' sphere');mesh.from_pydata(verts,[],faces);mesh.materials.append(mat) + for p in mesh.polygons:p.use_smooth=True + primitive_cache[key]=mesh + o=bpy.data.objects.new(name,primitive_cache[key]);coll(group).objects.link(o);o.location=loc;o.scale=scale + return o +def text_obj(name,text,loc,size,mat,side=0,group='Signs'): + c=bpy.data.curves.new(name,'FONT');c.body=text;c.size=size;c.align_x='CENTER';c.align_y='CENTER';c.extrude=.001 + o=bpy.data.objects.new(name,c);coll(group).objects.link(o);o.location=loc + # text normal faces road: local x follows street, local y is vertical + o.rotation_euler=(pi/2,0,-side*pi/2);c.materials.append(mat);return o +def wheel_torus(name,loc,major,minor,mat,group='Vehicles'): + key=('wheel_torus',major,minor,mat.name) + if key not in primitive_cache: + vertices=[];faces=[];n=32;m=10 + for j in range(n): + a=j*2*pi/n + for k in range(m): + b=k*2*pi/m;rr=major+minor*cos(b) + vertices.append((minor*sin(b),rr*cos(a),rr*sin(a))) + for j in range(n): + for k in range(m):faces.append((j*m+k,((j+1)%n)*m+k,((j+1)%n)*m+(k+1)%m,j*m+(k+1)%m)) + mesh=bpy.data.meshes.new('Shared rounded wheel section');mesh.from_pydata(vertices,[],faces);mesh.materials.append(mat) + for p in mesh.polygons:p.use_smooth=True + primitive_cache[key]=mesh + o=bpy.data.objects.new(name,primitive_cache[key]);coll(group).objects.link(o);o.location=loc;return o +def light(name,loc,color,power,kind='AREA',size=1,target=None): + d=bpy.data.lights.new(name,kind);d.energy=power;d.color=color + if kind=='AREA':d.shape='DISK';d.size=size + elif kind=='POINT':d.shadow_soft_size=size + elif kind=='SPOT':d.spot_size=math.radians(68);d.spot_blend=.65;d.shadow_soft_size=size + o=bpy.data.objects.new(name,d);coll('Lighting').objects.link(o);o.location=loc + if target is not None:o.rotation_euler=(Vector(target)-o.location).to_track_quat('-Z','Y').to_euler() + return o +def np_linspace(a,b,n):return [a+(b-a)*i/(n-1) for i in range(n)] + +# The visible street falls away beyond the intersection. The near camera path +# remains almost level; the grade explains the lower distant headlight horizon. +from road_surface import ground_height +# Shared grid vertices allow continuous terrain normals. A single wide quad +# per station produced visible reflection bands over the crossfall transition. +road_mesh=bpy.data.meshes.new('Shared continuous road grid') +rx=list(range(-70,71,2));ry=list(range(-75,1002,2));nx=len(rx) +road_mesh.from_pydata([(x,y,-.008) for y in ry for x in rx],[], + [(j*nx+i,j*nx+i+1,(j+1)*nx+i+1,(j+1)*nx+i) for j in range(len(ry)-1) for i in range(nx-1)]) +road_mesh.materials.append(M['asphalt']);road_mesh.update();add_surface_uv(road_mesh) +for poly in road_mesh.polygons:poly.use_smooth=True +road=bpy.data.objects.new('Continuous graded wet asphalt road',road_mesh);coll('Street').objects.link(road) +n=M['asphalt'].node_tree.nodes;l=M['asphalt'].node_tree.links;p=n.get('Principled BSDF') +co=n.new('ShaderNodeTexCoord');mapping=n.new('ShaderNodeVectorMath');mapping.operation='MULTIPLY';mapping.inputs[1].default_value=(.48,.28,1) +l.new(co.outputs['Object'],mapping.inputs[0]);wet=n.new('ShaderNodeTexNoise');wet.inputs['Scale'].default_value=1.6;wet.inputs['Detail'].default_value=5 +l.new(mapping.outputs[0],wet.inputs[0]);ramp=n.new('ShaderNodeValToRGB');ramp.color_ramp.elements[0].position=.3 +road_roughness=P.get('road_roughness',[.25,.58]) +ramp.color_ramp.elements[0].color=(*([road_roughness[0]]*3),1) +ramp.color_ramp.elements[1].position=.70;ramp.color_ramp.elements[1].color=(*([road_roughness[1]]*3),1) +l.new(wet.outputs['Fac'],ramp.inputs[0]);l.new(ramp.outputs[0],p.inputs['Roughness']);p.inputs['Coat Weight'].default_value=.035;p.inputs['Coat Roughness'].default_value=.28 +# Fine longitudinal water rills sit above photographed aggregate; fixed world +# coordinates keep the same patches attached to the moving road surface. +rillmap=n.new('ShaderNodeVectorMath');rillmap.operation='MULTIPLY';rillmap.inputs[1].default_value=(18,.50,2) +l.new(co.outputs['Object'],rillmap.inputs[0]);rill=n.new('ShaderNodeTexNoise');rill.inputs['Scale'].default_value=1;rill.inputs['Detail'].default_value=3 +l.new(rillmap.outputs[0],rill.inputs['Vector']) +under=p.inputs['Normal'].links[0].from_socket +rillbump=n.new('ShaderNodeBump');rillbump.inputs['Strength'].default_value=.32;rillbump.inputs['Distance'].default_value=.008 +l.new(rill.outputs['Fac'],rillbump.inputs['Height']);l.new(under,rillbump.inputs['Normal']);l.new(rillbump.outputs['Normal'],p.inputs['Normal']) +aggregate=p.inputs['Base Color'].links[0].from_socket +rillcolor=n.new('ShaderNodeMapRange');rillcolor.inputs['From Min'].default_value=.25;rillcolor.inputs['From Max'].default_value=.75 +rillcolor.inputs['To Min'].default_value=.68;rillcolor.inputs['To Max'].default_value=1.32;l.new(rill.outputs['Fac'],rillcolor.inputs['Value']) +colorproduct=n.new('ShaderNodeVectorMath');colorproduct.operation='SCALE';l.new(aggregate,colorproduct.inputs[0]);l.new(rillcolor.outputs[0],colorproduct.inputs['Scale']);l.new(colorproduct.outputs[0],p.inputs['Base Color']) + + +I=P['intersection'];IW=P['intersection_width'];RW=P['road_halfwidth'];SW=P['sidewalk_width'] +for side in [-1,1]: + crossing_start,crossing_end=(38.0,51.5) if side<0 else (34.0,46.5) + for start,end in [(-30,crossing_start),(crossing_end,250)]: + for j in range(math.ceil((end-start)/2)): + ya=start+j*2;yb=min(end,ya+2) + box('Raised sidewalk segment',(side*(RW+SW/2),(ya+yb)/2,.06),(SW,yb-ya,.24),M['concrete']) + b=Batch('Individual granite curb stones','Street') + for j in range(int((end-start)/1.1)): + b.box((side*(RW+.12),start+j*1.1+.55,.13),(.26,1.08,.3),M['curb']) + b.finish() + b=Batch('Sidewalk expansion joints','Street') + for y in range(int(start),int(end),2): b.box((side*(RW+SW/2),y,.184),(SW,.018,.005),M['black']) + b.finish() + # Orthogonal sidewalks at the intersection. + for yy in [crossing_start-1.7,crossing_end+1.7]:box('Side street sidewalk',(side*28,yy,.08),(28,3.4,.2),M['concrete']) +# Reference has conspicuous crosswalk stripes across the side streets; the +# traveled carriageway itself is predominantly unmarked in the visible interval. +crossings=json.loads((ROOT/'assets/crosswalks.json').read_text()) +for side,description in crossings.items(): + b=Batch(side.title()+' measured side-street crossing','Road markings') + for pts in description['strips']:b.face(pts,M['roadpaint']) + b.finish() +for y in [61,100]: + bpy.ops.mesh.primitive_cylinder_add(vertices=48,radius=.47,depth=.022,location=(1.8,y,.002));o=bpy.context.object;o.name='Wet cast iron manhole';o.data.materials.append(M['metal']);objlink(o,'Street') + for x in [-.25,-.1,.1,.25]:path('Manhole slots',[(1.8+x,y-.3,.016),(1.8+x,y+.3,.016)],.008,M['black']) +for side in [-1,1]: + for y in [6,23,34,53,72,94]: + box('Storm drain',(side*(RW-.3),y,.014),(.42,.87,.016),M['metal']) + for j in range(7):box('Drain slot',(side*(RW-.3),y-.35+j*.1,.024),(.35,.035,.009),M['black']) +for k in range(24): + x=random.uniform(-10,10);y=random.uniform(-8,100) + path('Irregular asphalt repair seam',[(x+random.uniform(-.15,.15),y+j*.5,.013) for j in range(random.randint(4,15))],.003,M['black'],'Road markings') + +def building(name,side,start,width,height,depth,mat,levels,cols,fire=True,store=True,xoffset=0): + face=side*(RW+SW+xoffset);cx=face+side*depth/2;center=start+width/2 + if store: + body=box(name+' masonry mass',(cx,center,(height+4)/2),(depth,width,height-4),M[mat],'Architecture') + box(name+' ground floor rear wall',(face+side*(depth/2+1.5),center,2),(depth-3,width,4),M[mat],'Architecture') + for yy in [start+.08,start+width-.08]:box(name+' ground floor return wall',(cx,yy,2),(depth,.16,4),M[mat],'Architecture') + else:body=box(name+' masonry mass',(cx,center,height/2),(depth,width,height),M[mat],'Architecture') + details=Batch(name+' recessed windows and masonry trims','Architecture') + floor=(height-4.2)/max(levels,1) + for k in range(levels): + z=4.2+(k+.47)*floor + if k==levels-1:z=min(z,height-1.4) + for j in range(cols): + y=start+(j+.5)*width/cols;tower='prominent residential tower' in name + ww=min(2.2 if tower else 1.22,width/cols*.49);hh=min(3.1 if tower else 1.9,floor*.67 if tower else floor*.58) + # Dark recess surround, glass set behind raised frame. + details.box((face-side*.016,y,z),(.045,ww+.21,hh+.20),M['black']) + wm=random.choices(['glass','dimwindow','warmwindow','coolwindow'],[.969,.03,.001,0] if 'prominent residential tower' in name else [.92,.066,.012,.002])[0] + details.box((face-side*.044,y,z),(.016,ww,hh),M[wm]) + for edge in [-1,1]:details.box((face-side*.11,y+edge*(ww/2+.055),z),(.18,.09,hh+.17),M['trim']) + for zz in [z-hh/2-.08,z+hh/2+.06]:details.box((face-side*.13,y,zz),(.24,ww+.31,.12),M['trim']) + details.box((face-side*.07,y,z),(.06,ww,.065),M['metal']) + details.box((face-side*.07,y,z),(.06,.05,hh),M['metal']) + if random.random()<.22:details.box((face-side*.28,y,z-hh*.32),(.45,ww*.58,.32),M['metal']) + if wm=='warmwindow': + details.box((face-side*.065,y+ww*.22,z),(.018,.10,hh),M['stone']) + if k%2==0:details.box((face-side*.045,center,4.2+k*floor),(.15,width,.11),M['stone']) + for z,dd,h in [(3.7,.30,.22),(height-.35,.25,.20),(height,.52,.32),(height+.28,.35,.15)]: + details.box((face-side*dd/2,center,z),(dd,width+.35,h),M['trim']) + details.box((cx,center,height+.08),(depth,width,.16),M['black']) + for yy in [start+.35,start+width-.35]:details.box((face-side*.10,yy,2),(.24,.5,4),M['stone']) + # Building end elevation faces the approaching camera and carries real windows. + for k in range(levels): + z=4.2+(k+.47)*floor + for j in range(max(2,int(depth/2.4))): + x=face+side*(j+.5)*depth/max(2,int(depth/2.4)) + details.box((x,start-.025,z),(1.1,.04,1.65),M[random.choices(['glass','dimwindow','warmwindow'],[.975,.025,0] if 'tower' in name else [.9,.07,.03])[0]]) + details.box((x,start-.09,z-.91),(1.34,.2,.13),M['trim']) + details.finish() + if store: + shop=Batch(name+' street level shop interiors','Storefronts') + for j in range(max(1,int(width/4))): + if name=='Right far intersection red brick block' and j==0:continue + y=start+(j+.5)*width/max(1,int(width/4));w=width/max(1,int(width/4))-.28 + shop.box((face-side*.15,y,1.88),(.012,w-.18,3.12),M['shopglass']) + for yi in [-w/2,0,w/2]:shop.box((face-side*.18,y+yi,1.86),(.09,.09,3.35),M['trim']) + for z in [.25,3.48]:shop.box((face-side*.16,y,z),(.09,w,.09),M['trim']) + shop.box((face+side*1.6,y,.22),(2.8,w,.05),M['concrete']) + shop.box((face+side*2.4,y,1.75),(.08,w,3.3),M['stone']) + lit_probability=.95 if 'intersection restaurant' in name or name=='Right far intersection red brick block' else .23 + if random.random().5 else 22 + light(name+' room ceiling',(face+side*.85,y,3.45),(.78,.73,.55),room_power,'AREA',1.5,(face+side*.8,y,.6)) + shop.box((face+side*1.35,y,.85),(.7,w*.7,1.3),M['darkbrick']) + for rr in range(5):shop.box((face+side*1.4,y-w*.28+rr*w*.14,1.65),(.22,.13,.35),M['trim']) + shop.finish() + if fire and width<38: + escape=Batch(name+' fire escape landings and iron balusters','Fire escapes') + for fy in [start+width*.33,start+width*.72]: + for k in range(min(levels,8)): + z=4.2+k*floor-.1 + escape.box((face-side*.65,fy,z),(1.3,2.5,.1),M['escapeiron']) + for jj in range(13):escape.box((face-side*1.24,fy-1.2+jj*.2,z+.48),(.035,.035,1),M['escapeiron']) + escape.box((face-side*1.24,fy,z+.99),(.05,2.5,.05),M['escapeiron']) + if k45 else 'glass'],'Architecture') +# The intersection gap is open here; an extra near block incorrectly hid the +# far corner tree and pub during the final second of the reference. +fitted_building('Right far intersection red brick block',1,52,29,30.5,22,'darkbrick',5,10,25,1.85) +for xx,yy,hh in [(28,53,3.0),(31.6,54.8,2.4),(36.5,57.0,3.6)]: + box('Far corner roof chimney stack',(xx,yy,30.5+hh/2),(1.10,1.32,hh),M['darkbrick'],'Architecture') + box('Roof chimney coping',(xx,yy,30.5+hh+.06),(1.36,1.55,.17),M['stone'],'Architecture') + +fitted_building('Right distant narrow stepped tower',1,202,32,126,32,'darkbrick',30,8,40,1.4,False,False) +box('Distant tower setback crown',(56,216,132),(22,23,12),M['darkbrick'],'Architecture') +box('Distant tower rooftop penthouse',(56,219,141),(12,14,8),M['darkbrick'],'Architecture') +# Three narrow illuminated windows are a persistent distant landmark. +dw=json.loads((ROOT/'assets/distant_window_row.json').read_text()) +for dx in [-3.35,0,3.35]: + box('Distant tower measured three-window row',(dw['x']+dx,dw['y']-.03,dw['z']),(1.5,.025,3.2),M['measuredwindow'],'Architecture') +box('Distant tower lower horizontal lit pane',(dw['x']+9.8,dw['y']-.03,dw['z']-11.2),(3.6,.025,1.25),M['dimwindow'],'Architecture') +for side in [-1,1]: + y=62 if side==-1 else 82 + for j in range(9): + w=random.uniform(12,22);h=random.uniform(17,35) + if side==1 and 1850:wn=-wn +middle=(wc[0]+wc[1])/2;middle.z=19.0 +bay=Batch('Right opening shallow chamfered brick bay','Architecture') +front=[middle-wu*2.4+Vector((0,0,z)) for z in [-19,19]]+[middle+wu*2.4+Vector((0,0,z)) for z in [19,-19]] +back=[q-wn*3.2 for q in front] +bay.face(front,M['tanbrick']);bay.face(back[::-1],M['tanbrick']) +for j in range(4):bay.face([front[j],front[(j+1)%4],back[(j+1)%4],back[j]],M['tanbrick']) +bay.finish() +M['observedamberwindow']=material('Observed upper right warm window',(.92,.49,.14),.35,0,.28) +for j,center in enumerate(wc): + width=.92;height=2.45 if j==0 else 3.10 + panel=Batch('Observed upper right amber pane '+str(j),'Architecture') + def corners(w,h,offset):return [center+wn*offset+wu*dx+Vector((0,0,dz)) for dx,dz in [(-w/2,-h/2),(w/2,-h/2),(w/2,h/2),(-w/2,h/2)]] + panel.face(corners(width+.22,height+.22,.035),M['black']);panel.face(corners(width,height,.060),M['observedamberwindow']);panel.finish() + for zz in [-height/2,0,height/2]:path('Tracked amber window horizontal sash',[center+wn*.075-wu*width/2+Vector((0,0,zz)),center+wn*.075+wu*width/2+Vector((0,0,zz))],.033,M['metal'],'Architecture') + path('Tracked amber window central sash',[center+wn*.078+Vector((0,0,-height/2)),center+wn*.078+Vector((0,0,height/2))],.023,M['metal'],'Architecture') + +# Specific recognizable storefront signs on left. +for name,body,key,col in [('Training studio','TRAINING STUDIO','training','signgold'),('Hair decor','HAIR DECOR','hair','signwhite')]: + q=signs[key];yy=q['y'];zz=q['z'];ww=q['width'];hh=q['height'] + box(name+' dark fascia',(q['x'],yy,zz),(.18,ww,hh),M['black'],'Storefronts') + o=text_obj(name+' luminous letters',body,(q['x']+.12,yy,zz-.20),1.30 if key=='training' else 1.0,M[col],-1) + if boldfont:o.data.font=boldfont + if key=='training':o.scale.x=.91;text_obj('Studio small header','ULTIMATE FITNESS',(q['x']+.12,yy,zz+.57),.45,M['signwhite'],-1) + # Genuine inset lit shop bay with mullions, mirrors, counter and ceiling. + box(name+' lit rear wall',(q['x']-4,yy,2.8),(.12,ww*.9,5.5),M['stone'],'Storefronts') + box(name+' rear mirror',(q['x']-3.85,yy,3.0),(.02,ww*.65,3.2),M['chrome'],'Storefronts') + light(name+' interior white light',(q['x']-2,yy,5.6),(.65,.74,.77),600,'AREA',3.5,(q['x']-1.8,yy,.4)) + box(name+' interior ceiling fixture',(q['x']-2,yy,5.9),(2.0,ww*.65,.055),M['shopwhite'],'Storefronts') + for dy in [-ww*.33,0,ww*.33]:box(name+' front window mullion',(q['x']+.05,yy+dy,2.8),(.13,.12,5.5),M['metal'],'Storefronts') + for j,dy in enumerate([-ww*.27,0,ww*.27]): + cy=yy+dy;ix=q['x']-1.65 + if key=='hair': + box('Salon chair upholstered seat',(ix,cy,1.03),(.85,.80,.23),M['black'],'Storefronts',.09) + box('Salon chair upholstered back',(ix-.29,cy,1.66),(.20,.81,1.0),M['black'],'Storefronts',.10) + cylinder('Salon hydraulic chair pedestal',(ix,cy,.18),(ix,cy,.94),.11,M['chrome'],'Storefronts') + box('Salon chair foot plate',(ix,cy,.14),(.69,.67,.08),M['chrome'],'Storefronts',.10) + box('Salon workstation counter',(q['x']-2.8,cy,1.45),(.70,ww*.23,.13),M['stone'],'Storefronts') + for k in range(4):cylinder('Salon product bottle',(q['x']-2.71,cy-.39+k*.25,1.51),(q['x']-2.71,cy-.39+k*.25,1.9),.07,M['shopwhite' if k==0 else 'glass'],'Storefronts',8) + else: + for dz in [.42,1.25,2.08]: + cylinder('Studio equipment shelf',(ix,cy-.65,dz),(ix,cy+.65,dz),.033,M['metal'],'Storefronts') + for k in range(4): + yp=cy-.45+k*.30 + cylinder('Studio dumbbell handle',(ix-.17,yp,dz+.10),(ix+.17,yp,dz+.10),.030,M['chrome'],'Storefronts',8) + for dx in [-.17,.17]:sphere('Studio dark weight',(ix+dx,yp,dz+.10),(.09,.13,.13),M['black'],'Storefronts',8,4) + for dy2 in [-.65,.65]:cylinder('Studio storage upright',(ix,cy+dy2,.18),(ix,cy+dy2,2.3),.035,M['metal'],'Storefronts') + box(name+' interior vertical strip light',(q['x']-3.55,cy-ww*.11,3.6),(.026,.06,2.65),M['shopwhite'],'Storefronts') + box(name+' reception countertop',(q['x']-1.30,yy+ww*.38,1.52),(1.15,ww*.22,.12),M['stone'],'Storefronts') + box(name+' reception dark cabinet',(q['x']-1.35,yy+ww*.38,.84),(1.0,ww*.20,1.25),M['darkbrick'],'Storefronts') + +box('Restaurant canvas awning',(-26.5,46,5.4),(2.8,13,.22),M['signred'],'Storefronts') +text_obj('Restaurant sign','BISTRO • CAFE',(-25.0,46,5.1),.30,M['signwhite'],-1) +for y in [39.7+i*.43 for i in range(30)]:sphere('Restaurant warm festoon bulb',(-25,y,5.3),(.04,.04,.04),M['shopwarm'],'Storefronts',8,4) + +# The far corner has a wrapping black pub awning, glazed front elevation and +# small warm lamps. It becomes fully visible only toward the end of the clip. +for o in list(bpy.data.objects): + if o.name.startswith('Right far intersection red brick block ground floor rear wall'): + bpy.data.objects.remove(o,do_unlink=True) + elif o.name.startswith('Right far intersection red brick block ground floor return wall'): + yy=min((o.matrix_world @ Vector(c)).y for c in o.bound_box) + if yy<52.5:bpy.data.objects.remove(o,do_unlink=True) +M['pubwood']=material('Dark varnished pub wood',(.067,.037,.022),.38) +M['bottlegreen']=material('Dark green bar bottles',(.021,.071,.042),.19,.12) +box('Corner pub floor',(29.8,56.5,.1),(9.6,9,.12),M['pubwood'],'Storefronts') +box('Corner pub ceiling',(29.8,56.5,7.3),(9.6,9,.15),M['stone'],'Storefronts') +box('Corner pub rear wall',(29.8,60.65,3.65),(9.6,.18,7.3),M['darkbrick'],'Storefronts') +box('Corner pub side wall',(34.7,56.5,3.65),(.18,9,7.3),M['darkbrick'],'Storefronts') +box('Corner residential ground elevation',(40.9,52.04,3.65),(12.2,.22,7.3),M['darkbrick'],'Architecture') +for axis in ['front','side']: + for j in range(3): + pos=26.6+j*3.2 if axis=='front' else 53.6+j*3.2 + if axis=='front': + loc=(pos,51.84,3.55);size=(2.94,.02,6.6) + box('Pub front glazed bay',loc,size,M['shopglass'],'Storefronts') + box('Pub lower painted front panel',(pos,51.79,1.0),(2.94,.08,1.65),M['greenmetal'],'Storefronts') + for xx in [pos-1.5,pos+1.5]:box('Pub front stone mullion',(xx,51.73,3.5),(.13,.17,7.0),M['trim'],'Storefronts') + for zz in [.2,1.8,6.45,7.0]:box('Pub front horizontal molding',(pos,51.72,zz),(3.12,.15,.12),M['trim'],'Storefronts') + box('Pub front lower inset border',(pos,51.69,1.0),(2.5,.025,1.30),M['trim'],'Storefronts') + box('Pub front lower inset panel',(pos,51.65,1.0),(2.30,.025,1.08),M['greenmetal'],'Storefronts') + else: + box('Pub side glazed bay',(24.86,pos,3.55),(.02,2.94,6.6),M['shopglass'],'Storefronts') + box('Pub lower painted side panel',(24.81,pos,1.0),(.08,2.94,1.65),M['greenmetal'],'Storefronts') + for yy in [pos-1.5,pos+1.5]:box('Pub side stone mullion',(24.73,yy,3.5),(.17,.13,7.0),M['trim'],'Storefronts') + for zz in [.2,1.8,6.45,7.0]:box('Pub side horizontal molding',(24.72,pos,zz),(.15,3.12,.12),M['trim'],'Storefronts') +box('Pub wrapping front black awning',(29.8,50.95,7.0),(10.0,2.1,.64),M['black'],'Storefronts') +box('Pub wrapping side black awning',(24.05,56.7,7.0),(2.0,10.2,.64),M['black'],'Storefronts') +for zz in [6.69,7.31]: + path('Pub awning pale piping',[(34.8,49.88,zz),(23.04,49.88,zz),(23.04,61.8,zz)],.025,M['trim'],'Storefronts') +for x in [26.6,29.8,33.0]: + cylinder('Pub hanging lamp stem',(x,50.5,6.7),(x,50.5,6.33),.027,M['black'],'Storefronts') + sphere('Pub warm lamp globe',(x,50.5,6.23),(.14,.14,.20),M['shopwhite'],'Storefronts') + light('Pub warm awning light',(x,50.5,6.17),(.91,.73,.45),75,'POINT',.16) +for yy in [54,57,60]: + sphere('Pub side lamp globe',(23.6,yy,6.23),(.14,.14,.20),M['shopwhite'],'Storefronts') + light('Pub side awning light',(23.6,yy,6.17),(.76,.82,.86),65,'POINT',.16) +light('Pub interior warm room',(29.5,56.5,6.8),(.95,.70,.40),1200,'AREA',3.5,(29.5,56.5,1)) +# The camera sees this side wall through the front glass. Furnish the visible +# wall as well as the rear bar, with actual shelves, mirrors and small objects. +for yy in [54.0,57.0,59.5]: + box('Pub side wall timber backing',(34.52,yy,2.7),(.10,2.7,5.0),M['pubwood'],'Storefronts') + box('Pub framed interior mirror',(34.43,yy,3.8),(.04,2.20,2.1),M['chrome'],'Storefronts') + for zz in [2.55,4.95]:box('Pub side display shelf',(34.20,yy,zz),(.50,2.7,.12),M['pubwood'],'Storefronts') + for j in range(7): + cy=yy-1.0+j*.32 + cylinder('Pub window visible bottle',(34.19,cy,2.61),(34.19,cy,3.06),.065,M['bottlegreen'],'Storefronts',8) + cylinder('Pub visible bottle neck',(34.19,cy,3.06),(34.19,cy,3.24),.025,M['bottlegreen'],'Storefronts',8) + light('Pub side display warm light',(33.9,yy,5.6),(.91,.75,.49),120,'AREA',1.2,(34.35,yy,3.0)) +box('Pub bar counter',(29.8,56.8,2.1),(7.7,1.25,.18),M['pubwood'],'Storefronts') +box('Pub bar front',(29.8,56.95,1.05),(7.4,.15,1.95),M['pubwood'],'Storefronts') +for z in [2.6,3.7,4.8]: + box('Pub bottle shelf',(29.8,60.15,z),(8.0,.5,.08),M['pubwood'],'Storefronts') + for j in range(21): + x=26.1+j*.37;hh=.42+.08*(j%3) + cylinder('Bottle body',(x,60.12,z+.05),(x,60.12,z+hh),.09,M['bottlegreen'],'Storefronts',8) + cylinder('Bottle neck',(x,60.12,z+hh),(x,60.12,z+hh+.18),.037,M['bottlegreen'],'Storefronts',8) + box('Bottle pale label',(x,60.025,z+hh*.6),(.11,.005,.13),M['barrier_white'],'Storefronts') +for xx in [38.2,42.5]: + box('Corner ground floor recessed window',(xx,51.90,4.45),(1.15,.025,3.25),M['black'],'Architecture') + box('Corner narrow warm ground window',(xx,51.87,4.45),(.72,.018,2.7),M['dimwindow'],'Architecture') +for index,x in enumerate([38.0,41.0,44.0]): + yy=51.15-.16*index;z=.69;r=.62 + for wx in [x-1.05,x+1.05]: + path('Parked bicycle tire',[(wx+r*cos(a),yy,z+r*sin(a)) for a in np_linspace(0,2*pi,41)],.036,M['tire'],'Street furniture') + path('Bicycle polished rim',[(wx+.565*cos(a),yy-.025,z+.565*sin(a)) for a in np_linspace(0,2*pi,41)],.014,M['chrome'],'Street furniture') + for a in np_linspace(0,2*pi,13):cylinder('Bicycle spoke',(wx,yy-.025,z),(wx+.555*cos(a),yy-.025,z+.555*sin(a)),.006,M['chrome'],'Street furniture',4) + rear=(x-1.05,yy,z);front=(x+1.05,yy,z);pedal=(x-.06,yy,.60);seat=(x-.31,yy,1.58);head=(x+.67,yy,1.52) + for a,b in [(rear,pedal),(rear,seat),(seat,pedal),(seat,head),(head,pedal),(head,front)]:cylinder('Bicycle diamond frame',a,b,.032,M['metal'],'Street furniture',8) + cylinder('Bicycle seatpost',seat,(x-.31,yy,1.78),.025,M['chrome'],'Street furniture',8) + box('Bicycle saddle',(x-.34,yy,1.80),(.40,.19,.10),M['black'],'Street furniture',.035) + path('Bicycle handlebar',[(x+.67,yy,1.52),(x+.79,yy,1.9),(x+.82,yy-.27,1.94)],.026,M['chrome'],'Street furniture') + +def lamp(side,y,height=8.4,arm=1.6,power=650): + x=side*(RW+.65) + cylinder('Streetlight tapered shaft',(x,y,.2),(x,y,height),.075,M['metal'],'Streetlights') + cylinder('Streetlight base',(x,y,.2),(x,y,.7),.17,M['metal'],'Streetlights') + coords=[(x,y,height-1),(x,y,height-.2),(x-side*.28,y,height+.1),(x-side*arm,y,height+.14)] + path('Streetlight curved bracket',coords,.057,M['metal'],'Streetlights') + box('Streetlight luminaire',(x-side*arm,y,height+.1),(.57,.28,.13),M['metal'],'Streetlights') + sphere('Sodium white light lens',(x-side*arm,y,height+.045),(.23,.11,.045),M['lamp_distant'],'Streetlights') + light('Yellow white street light',(x-side*arm,y,height-.02),(.88,.82,.65),power,'POINT',.20) + return (x-side*arm,y,height+.045) +lamp_positions=[] +for side,ys in [(-1,[112,154,202]),(1,[132,172,220])]: + for y in ys:lamp_positions.append(lamp(side,y,8.4 if y<100 else 8,1.65,600 if y<100 else 400)) +# The two following luminaires are specifically triangulated, not a repeated row. +distant_lights=json.loads((ROOT/'assets/distant_lights.json').read_text()) +for key,power in [('right_next_lamp',450),('right_smaller_lamp',220)]: + head=Vector(distant_lights[key]['xyz']);base=head+Vector((1.5,0,0)) + cylinder('Observed '+key+' shaft',(base.x,base.y,ground_height(base.y,base.x)),(base.x,base.y,head.z-.3),.07,M['metal'],'Streetlights') + path('Observed '+key+' arm',[(base.x,base.y,head.z-.6),(base.x,base.y,head.z+.1),tuple(head+Vector((0,0,.1)))],.05,M['metal'],'Streetlights') + sphere('Observed '+key+' lens',head,(.20,.10,.045),M['lamp_secondary' if power>300 else 'lamp_distant'],'Streetlights') + light('Observed '+key+' light',head,(.90,.85,.70),power,'POINT',.16) +anchors=json.loads((ROOT/'assets/landmarks.json').read_text()) +for name,names in [('Left paired streetlamp',['left_near_lamp','left_far_lamp']),('Right paired streetlamp',['right_near_lamp','right_secondary_lamp'])]: + heads=[Vector(anchors[n]['xyz']) for n in names];base=(heads[0]+heads[1])/2;h=min(p.z for p in heads)-.3 + cylinder(name+' shaft',(base.x,base.y,ground_height(base.y,base.x)+.16),(base.x,base.y,h),.095,M['metal'],'Streetlights') + cylinder(name+' fluted pedestal',(base.x,base.y,ground_height(base.y,base.x)+.16),(base.x,base.y,ground_height(base.y,base.x)+.85),.19,M['metal'],'Streetlights') + for j,head in enumerate(heads): + path(name+' swept arm',[(base.x,base.y,h-.9),(base.x,base.y,h-.1),tuple(head+Vector((0,0,.12)))],.063,M['metal'],'Streetlights') + box(name+' fixture '+str(j),tuple(head+Vector((0,0,.075))),(.60,.28,.15),M['metal'],'Streetlights') + secondary=name.startswith('Right') and j==1 + sphere(name+' lamp lens '+str(j),tuple(head),(.12,.06,.025),M['lamp_secondary' if secondary else 'lamp'],'Streetlights') + light(name+' light '+str(j),tuple(head-Vector((0,0,.04))),(.90,.85,.70),1100 if secondary else 2200,'POINT',.19) + lamp_positions.append(tuple(head)) +# The opening upper-left luminaire leaves the field of view immediately. +cb=Euler((math.radians(90+P['pitch']),0,math.radians(-P['yaw'])),'XYZ').to_matrix() @ Matrix.Diagonal((1,-1,-1)) +cornerlight=cb @ Vector(((5-640)/369.5*8,(20-480)/369.5*8,8))+Vector((0,0,P['camera_height'])) +sphere('Opening clipped streetlight lens',cornerlight,(.035,.035,.025),M['lamp'],'Streetlights') +light('Opening clipped streetlight',cornerlight,(.90,.84,.64),650,'POINT',.18) +def signal(side,y,arm=2.8,anchor=None): + x=side*(RW+.65);z=5.5 + if anchor: + emitter_fit=json.loads((ROOT/'assets/signal_emitters.json').read_text()) + head=Vector(emitter_fit[anchor]['housing_anchor_xyz']);z=head.z+.3 + cylinder('Signal pole',(x,y,.2),(x,y,z+.8),.073,M['metal'],'Traffic signals') + path('Signal arm',[(x,y,z+.6),(x-side*.3,y,z+.85),(x-side*arm,y,z+.85)],.063,M['metal'],'Traffic signals') + sx=x-side*arm + if anchor: + sx=head.x + # The far mast reaches over the intersection to its triangulated head. + path('Measured signal cantilever',[(x,y,z+.6),(x,y,z+.85),(sx,head.y,z+.85)],.068,M['metal'],'Traffic signals') + y=head.y + box('Signal ochre housing',(sx,y,z),(.36,.30,1.03),M['stone'],'Traffic signals',.055) + box('Signal black front plate',(sx,y-.165,z),(.31,.025,.96),M['black'],'Traffic signals') + for j in range(3): + zz=z+.30-j*.30 + lens=sphere('Green signal lens' if j==2 else 'Inactive signal lens',(sx,y-.19,zz),(.140,.038,.140),M['signalgreen' if j==2 else 'black'],'Traffic signals') + # An actual projecting visor gives the source's diminishing visible + # lens area as the camera passes obliquely beneath the signal. + hood=Batch('Traffic signal projecting lens visor','Traffic signals') + angles=np_linspace(-.30,pi+.30,25) + for a,b in zip(angles,angles[1:]): + for radius in [.151,.169]: + hood.face([(sx+radius*cos(t),yy,zz+radius*sin(t)) for t,yy in [(a,y-.205),(b,y-.205),(b,y-.50),(a,y-.50)]],M['black']) + hood.face([(sx+r*cos(t),y-.50,zz+r*sin(t)) for t,r in [(a,.151),(b,.151),(b,.169),(a,.169)]],M['black']) + hood.finish() + light('Green signal local glow',(sx,y-.27,z-.3),(.002,1,.57),35,'POINT',.12) + box('Street name plate',(x-side*.65,y-.05,3.7),(1.45,.035,.24),M['greenmetal'],'Signs') + text_obj('Street name','W 73 ST',(x-side*.65,y-.08,3.7),.11,M['signwhite'],0) +signal(-1,I-.5,2.8,'left_near_signal');signal(1,I+IW-.5,2.8,'right_far_signal') +for side,y in [(-1,100),(1,112),(-1,170),(1,180)]:signal(side,y,2) +from install_signal_response import install as install_signal_response +install_signal_response(S) + +def car(name,x,y,color='black',kind='sedan',angle=0): + bodymat=material(name+' paint',color if isinstance(color,tuple) else (.027,.035,.034),.23,.18) + bodymat.node_tree.nodes['Principled BSDF'].inputs['Coat Weight'].default_value=.5 + SUV=kind in ['suv','jeep','van'];L=4.8 if SUV else 4.55;W=1.91 if SUV else 1.8 + H=1.15 if SUV else .96;group='Vehicles' + root=bpy.data.objects.new(name,None);coll(group).objects.link(root);root.location=(x,y,0);root.rotation_euler[2]=angle + parts=[] + # The side shell follows the wheel arches instead of intersecting the tires. + shell=Batch(name+' pressed body panels and wheel openings',group) + ys=[-L/2+j*L/72 for j in range(73)] + def body_width(yy):return W/2*(1-.07*(abs(yy)/(L/2))**5) + def body_top(yy):return (1.45 if SUV else 1.035)-(.20 if SUV else .12)*(abs(yy)/(L/2))**5 + def arch_edge(yy): + z=.36 + for center in [-1.47,1.44]: + if abs(yy-center)<.425:z=max(z,.44+math.sqrt(max(0,.425**2-(yy-center)**2))) + return z + for a,b in zip(ys,ys[1:]): + def skin(yy,t,side): + zz=arch_edge(yy)*(1-t)+body_top(yy)*t;rr=zz/body_top(yy) + return (side*body_width(yy)*(1-.10*(1-rr)**2-.025*rr**8),yy,zz) + for side in [-1,1]: + for t0,t1 in zip([0,.25,.55,.82],[.25,.55,.82,1]): + shell.face([skin(a,t0,side),skin(b,t0,side),skin(b,t1,side),skin(a,t1,side)],bodymat) + shell.face([skin(a,1,-1),skin(a,1,1),skin(b,1,1),skin(b,1,-1)],bodymat) + for yy in [-L/2,L/2]:shell.face([(-body_width(yy),yy,.36),(body_width(yy),yy,.36),(body_width(yy),yy,body_top(yy)),(-body_width(yy),yy,body_top(yy))],bodymat) + body=shell.finish() + bm=bmesh.new();bm.from_mesh(body.data);bmesh.ops.remove_doubles(bm,verts=list(bm.verts),dist=.0001);bm.to_mesh(body.data);bm.free() + for poly in body.data.polygons:poly.use_smooth=True + rounding=body.modifiers.new('Pressed body edge radii','BEVEL');rounding.width=.06;rounding.segments=3;rounding.limit_method='ANGLE';rounding.angle_limit=.45 + body.modifiers.new('Body panel normals','WEIGHTED_NORMAL');parts.append(body) + parts.append(box(name+' dark underbody',(0,0,.34),(W*.86,L*.91,.23),M['black'],group,.06)) + if name in ['Prominent white SUV','Left black SUV']: + # Unlit, exposed lamp assemblies sit ahead of the bumper skin. Their + # reflector pockets and clear cover catch the observed street lighting. + lensmat=material(name+' clear headlamp polycarbonate',(.84,.92,.94),.10,0) + lensmat.node_tree.nodes['Principled BSDF'].inputs['Transmission Weight'].default_value=.91 + lensmat.node_tree.nodes['Principled BSDF'].inputs['IOR'].default_value=1.47 + for side in [-1,1]: + hx=side*.66;hy=-L/2-.059;hz=1.105 + parts.append(box(name+' upper lamp recessed housing',(hx,hy,hz),(.55,.060,.175),M['black'],group,.042)) + for j in [-1,1]: + parts.append(sphere(name+' headlamp reflector',(hx+j*.125,hy-.035,hz),(.115,.028,.057),M['chrome'],group)) + parts.append(sphere(name+' dark projector center',(hx+j*.125,hy-.060,hz),(.040,.011,.040),M['glass'],group)) + parts.append(box(name+' headlamp transparent cover',(hx,hy-.078,hz),(.535,.018,.15),lensmat,group,.036)) + parts.append(path(name+' headlamp narrow chrome brow',[(hx-.255,hy-.082,hz+.073),(hx+.255,hy-.082,hz+.073)],.009,M['chrome'],group)) + parts.append(path(name+' hood front rolled lip',[(-.88,-L/2-.018,1.215),(0,-L/2-.036,1.247),(.88,-L/2-.018,1.215)],.018,bodymat,group)) + + # Trapezoidal cabin has sloped windshield and rear window. + b=Batch(name+' cabin glazing',group) + base=1.45 if SUV else 1.035;top=1.95 if SUV else 1.49 + pts=[(-W*.46,-1.3,base),(W*.46,-1.3,base),(W*.46,1.45,base),(-W*.46,1.45,base), + (-W*.38,-.76,top),(W*.38,-.76,top),(W*.38,1.37 if kind=='jeep' else .98,top),(-W*.38,1.37 if kind=='jeep' else .98,top)] + for idx in [(0,1,5,4),(1,2,6,5),(2,3,7,6),(3,0,4,7)]:b.face([pts[k] for k in idx],M['carglass']) + b.face([pts[k] for k in [4,5,6,7]],bodymat);cabin=b.finish();parts.append(cabin) + cabinround=cabin.modifiers.new('Cabin edge radii','BEVEL');cabinround.width=.085 if SUV else .065;cabinround.segments=5 + cabin.modifiers.new('Glazing panel normals','WEIGHTED_NORMAL') + for side in [-1,1]: + lower=0 if side<0 else 1;upper=4 if side<0 else 5;rear_lower=3 if side<0 else 2;rear_upper=7 if side<0 else 6 + parts.append(path(name+' sculpted A pillar',[pts[lower],pts[upper]],.065 if SUV else .045,bodymat,group)) + parts.append(path(name+' rear roof pillar',[pts[rear_lower],pts[rear_upper]],.085 if SUV else .060,bodymat,group)) + parts.append(path(name+' window surround',[pts[lower],pts[upper],pts[rear_upper],pts[rear_lower],pts[lower]],.018,M['chrome'],group)) + parts.append(box(name+' front seat',(side*.43,-.10,1.25),(.53,.56,.65),M['black'],group,.13)) + parts.append(box(name+' front headrest',(side*.43,.06,1.56),(.30,.20,.25),M['black'],group,.07)) + if SUV:parts.append(path(name+' roof luggage rail',[(side*W*.33,-.56,top+.06),(side*W*.33,.85,top+.06)],.026,M['chrome'],group)) + parts.append(box(name+' dashboard',(0,-.96,1.13),(W*.79,.44,.16),M['black'],group,.07)) + parts.append(box(name+' rear seat bench',(0,.78,1.21),(W*.8,.52,.50),M['black'],group,.10)) + for sx in [-1,1]: + for yy in [-1.47,1.44]: + parts.append(wheel_torus(name+' rounded tire',(sx*(W/2-.01),yy,.44),.285,.089,M['tire'],group)) + parts.append(cylinder(name+' brake disc',(sx*(W/2+.040),yy,.44),(sx*(W/2+.057),yy,.44),.242,M['silverwheel' if name=='Prominent white SUV' else 'metal'],group,24)) + parts.append(wheel_torus(name+' polished rim lip',(sx*(W/2+.080),yy,.44),.244,.015,M['chrome'],group)) + parts.append(cylinder(name+' wheel center',(sx*(W/2+.058),yy,.44),(sx*(W/2+.088),yy,.44),.095 if name=='Prominent white SUV' else .075,M['chrome'],group,16)) + spoke_count=10 if name=='Prominent white SUV' else 5 + for a in range(spoke_count): + aa=a*2*pi/spoke_count + for da in ([-.035,.035] if name=='Prominent white SUV' else [0]): + parts.append(cylinder(name+' alloy wheel spoke',(sx*(W/2+.083),yy+.065*cos(aa),.44+.065*sin(aa)),(sx*(W/2+.083),yy+.23*cos(aa+.10+da),.44+.23*sin(aa+.10+da)),.0175 if name=='Prominent white SUV' else .021,M['chrome'],group,6)) + parts.append(path(name+' wheel arch rolled edge',[(sx*(body_width(yy)+.002),yy+.43*cos(a),.44+.43*sin(a)) for a in np_linspace(0,pi,18)],.012,bodymat,group)) + parts.append(path(name+' side shoulder crease',[(sx*(W/2+.009),-1.95,1.36 if SUV else .94),(sx*(W/2+.009),1.95,1.36 if SUV else .94)],.007,bodymat,group)) + parts.append(box(name+' side mirror',(sx*(W/2+.12),-.73,1.28),(.26,.32,.17),bodymat,group,.06)) + for yy in [-.56,.78]:parts.append(box(name+' door handle',(sx*(W/2+.011),yy,1.31 if SUV else 1.0),(.027,.20,.045),M['chrome'],group,.01)) + parts.append(path(name+' front door shut line',[(sx*(W/2+.004),-.25,base-.025),(sx*(W/2+.004),-.27,.44)],.005,M['black'],group)) + parts.append(path(name+' rear door contour',[(sx*(W/2+.003),.99,base-.03),(sx*(W/2+.003),1.13,.97),(sx*(W/2+.003),1.00,.48)],.004,M['black'],group)) + for yy in [-.23,.99]:parts.append(box(name+' window pillar',(sx*W*.42,yy,(base+top)/2),(.08,.07,top-base),M['black'] if name=='Prominent white SUV' else bodymat,group)) + for yy in [-2.37,2.37]:parts.append(box(name+' light cluster',(sx*.64,yy,.83),(.50,.065,.18),M['glass' if yy<0 else 'tail'],group,.025)) + for yy in [-L/2,L/2]: + parts.append(box(name+' bumper',(0,yy,.48),(W*.94,.09,.17),bodymat,group,.05)) + parts.append(box(name+' license plate',(0,yy*1.022,.65),(.44,.015,.20),M['barrier_white'],group)) + grille_w=W*(.81 if SUV else .47);grille_h=.45 if SUV else .27;grille_z=.86 if SUV else .74 + parts.append(box(name+' front grille',(0,-L/2-.025,grille_z),(grille_w,.025,grille_h),M['black'],group,.035)) + for j in range(6):parts.append(box(name+' grille bright bar',(0,-L/2-.044,grille_z-grille_h/2+(j+.5)*grille_h/6),(grille_w*.95,.022,.016),M['chrome'],group)) + if SUV: + for sx in [-1,1]:parts.append(path(name+' vertical running light surround',[(sx*.81,-L/2-.055,.92),(sx*.81,-L/2-.055,.68),(sx*.64,-L/2-.055,.66)],.018,M['chrome'],group)) + if name=='Prominent white SUV': + badge=Batch('White SUV grille bowtie badge',group) + badge.face([(xx,-L/2-.051,1.0+zz) for xx,zz in [(-.18,-.035),(-.075,-.035),(-.075,-.063),(.075,-.063),(.075,-.035),(.18,-.035),(.18,.035),(.075,.035),(.075,.063),(-.075,.063),(-.075,.035),(-.18,.035)]],M['vehiclebadge']);parts.append(badge.finish()) + if kind=='jeep': + parts.append(cylinder(name+' rear mounted spare tire',(0,2.35,1.3834),(0,2.64,1.3834),.42,M['tire'],group,24)) + parts.append(cylinder(name+' spare dark rim recess',(0,2.64,1.3834),(0,2.66,1.3834),.277,M['black'],group,32)) + parts.append(path(name+' spare polished rim lip',[(.278*cos(a),2.672,1.3834+.278*sin(a)) for a in np_linspace(0,2*pi,49)],.018,M['chrome'],group)) + parts.append(cylinder(name+' spare center hub',(0,2.661,1.3834),(0,2.697,1.3834),.083,M['chrome'],group,16)) + for k in range(5): + a=k*2*pi/5 + for da in [-.045,.045]: + parts.append(cylinder(name+' spare split alloy spoke',(.074*cos(a),2.686,1.3834+.074*sin(a)),(.262*cos(a+da),2.686,1.3834+.262*sin(a+da)),.020,M['chrome'],group,6)) + parts.append(cylinder(name+' spare lug bolt',(.058*cos(a),2.695,1.3834+.058*sin(a)),(.058*cos(a),2.709,1.3834+.058*sin(a)),.013,M['metal'],group,6)) + for o in parts:o.parent=root + return root +def parked(name,x,y,color,kind='sedan',angle=0,scale=1.5): + root=car(name,x,y,color,kind,angle);root.scale=(scale,scale,scale);root.location.z=-.066*scale;return root +parked('Opening cropped left black sedan',-12.4,8.5,(.028,.033,.028),scale=1.5) +blackfit=json.loads((ROOT/'assets/black_car_contact.json').read_text());bp=blackfit['parameters'] +blackcar=parked('Left black SUV',bp['x'],bp['y'],(.022,.032,.028),'suv',angle=bp['yaw'],scale=1) +blackcar.scale=(bp['scale_x'],bp['scale_y'],bp['scale_z']);blackcar.location.z=blackfit['tire_contact_z'] +red_pose=json.loads((ROOT/'assets/near_vehicle_landmarks.json').read_text())['Left red sedan']['parameters'] +red=parked('Left red sedan',red_pose['x'],red_pose['y'],(.24,.045,.019),angle=red_pose['yaw'],scale=1) +red.scale=(red_pose['scale_x'],red_pose['scale_y'],red_pose['scale_z']);red.location.z=red_pose['z'];red.rotation_euler.x=red_pose['pitch'] +ws=json.loads((ROOT/'assets/white_suv_landmarks.json').read_text())['parameters'] +white_suv=parked('Prominent white SUV',ws['x'],ws['y'],(.66,.69,.68),'suv',ws['yaw'],1) +white_suv.scale=(ws['scale_x'],ws['scale_y'],ws['scale_z']);white_suv.location.z=ws['z'];white_suv.rotation_euler.x=ws['pitch'] +white_suv['pose_note']='Joint wheel and roof reprojection fit. Monocular lens/metric proportions are approximate.' +parked('White sedan behind SUV',-10.8,30.6,(.47,.50,.49),scale=1.5) +jeep=parked('Right dark Jeep spare wheel',11.5340,15.7263,(.027,.038,.028),'jeep',pi,1) +jeep.scale=(1.3,.72,1.3) +jeep.location.z=-.066*1.3 +intersection_car=json.loads((ROOT/'assets/intersection_vehicle.json').read_text()) +for side in [-1,1]: + for j,y in enumerate([54,60,66,72,78,85,92,100,108,116,124,133,142,151,160,170,181]): + if side==1:y+=3 + color=random.choice([(.17,.19,.19),(.38,.41,.4),(.03,.042,.049),(.18,.20,.24),(.49,.48,.43)]) + xx=side*11.0 + if side<0: + decay=math.exp(-j/4);y+=(intersection_car['root_xy'][1]-54)*decay;xx+=(intersection_car['root_xy'][0]+11)*decay + if j==0:color=(.035,.044,.05) + parked(f'{side} parked car {j}',xx,y,color,'suv' if j%5==0 else 'sedan',pi if side>0 else 0,1.4) +# Multi-time headlight tracks explain their movement through camera parallax. +# The unconstrained moving fit was not identifiable; the parked/idling solution +# avoids adding an unsupported fourteen-unit independent translation. +traffic=json.loads((ROOT/'assets/distant_lights.json').read_text()) +for i,key in enumerate(['distant_headlight_left','distant_headlight_center','distant_headlight_far']): + xyz=Vector(traffic[key]['xyz']);sc=1.30 if i<2 else 1.18 + xx=xyz.x+.67*sc;yy=xyz.y+2.44*sc + root=car('Distant headlight vehicle '+str(i),xx,yy,(.055,.065,.072));root.scale=(sc,sc,sc) + headlamp_material=material('Measured car '+str(i)+' blue headlamp',(.65,.82,1),.32,0,[45,32,150][i]) + for sx in [-.67,.67]: + o=sphere('Distant measured headlamp',(sx,-2.44,.83),(.12,.04,.05),headlamp_material,'Vehicles');o.parent=root + lo=light('Distant headlight beam',(sx,-2.49,.82),(.33,.60,1),[20,15,80][i],'SPOT',.09,(sx,-22,.1));lo.parent=root + root['motion_evidence']='No resolved independent velocity from 128-frame reference tracks.' + +def tree(name,side,y,height=10,crown=4.3,x_override=None): + x=side*(RW+1.5) if x_override is None else x_override;base=.2 + cylinder(name+' trunk',(x,y,base),(x+.13,y,height*.68),.15,M['bark'],'Trees',10) + # Individual broad leaf clusters plus editable twigs; fixed random seed. + b=Batch(name+' leaves','Trees') + tips=[] + for j in range(24): + angle=random.uniform(0,2*pi);r=random.uniform(.4,crown*.75);z=random.uniform(height*.50,height*.83) + end=(x+r*cos(angle),y+r*sin(angle),z+1.2) + tips.append(end) + cylinder(name+' branch',(x,y,z-1.7),end,.035,M['bark'],'Trees',6) + for j in range(60000 if y<80 else 24000): + tip=random.choice(tips);cx=tip[0]+random.gauss(0,crown*.18);cy=tip[1]+random.gauss(0,crown*.18);cz=tip[2]+random.gauss(0,crown*.19) + if ((cx-x)/crown)**2+((cy-y)/(crown*1.15))**2+((cz-height*.72)/(crown*.95))**2>1.65:continue + a=random.uniform(0,2*pi);tilt=random.uniform(-1.4,1.4);sz=random.uniform(.080,.18) + du=Vector((cos(a)*cos(tilt),sin(a)*cos(tilt),sin(tilt)))*sz;dv=Vector((-sin(a),cos(a),0))*sz*.48;c=Vector((cx,cy,cz)) + b.face([c-du,c+dv,c+du,c-dv],M[random.choices(['leaf','leaflight','leaffaded'],[.7,.25,.05])[0]]) + b.finish() + box(name+' soil pit',(x,y,.19),(1.5,2.3,.025),M['bark'],'Trees') + for xx in [x-.78,x+.78]:path(name+' guard rail',[(xx,y-1.2,.2),(xx,y-1.2,.64),(xx,y+1.2,.64),(xx,y+1.2,.2)],.023,M['metal'],'Trees') +tree_layout=[(-1,17.5,12,4.8,-19),(-1,35,15.5,6.0,-21),(-1,47,17,7.0,-27),(-1,69,27,11.5,-15), + (-1,79,17,6.4,-19),(-1,101,18,6.3,-20),(-1,132,17,5.8,-20), + (1,14,27,10.5,27),(1,29,20,9.0,19.5),(1,72,18,7.0,20), + (1,96,17,6.3,20),(1,125,17,5.8,20),(1,49.73,30,10.5,31.54)] +for j,(side,y,h,c,xo) in enumerate(tree_layout):tree(f'{side} street tree {j}',side,y,h,c,xo) +# A branch extends into the road and hides the secondary right lamp early in +# the clip. Its occlusion changes by camera parallax, with no visibility keys. +branch_center=Vector((13.2,29.0,11.2));cylinder('Right lamp occluding branch',(19.5,29,9.0),branch_center,.055,M['bark'],'Trees',8) +b=Batch('Right lamp occluding leaf cluster','Trees') +for j in range(18000): + u=Vector((random.gauss(0,1.10),random.gauss(0,1.15),random.gauss(0,1.30))) + if u.length>3.5:continue + c=branch_center+u;a=random.uniform(0,2*pi);sz=random.uniform(.06,.12) + du=Vector((cos(a),sin(a),random.uniform(-.8,.8)))*sz;dv=Vector((-sin(a),cos(a),0))*sz*.5 + b.face([c-du,c+dv,c+du,c-dv],M[random.choice(['leaf','leaf','leaflight'])]) +b.finish() + + +# The closest stretch is a dark low wall; colored water barriers and the +# taller pale construction panels are concentrated at the far end. +M['constructionpanel']=material('Rain-streaked pale construction panels',(.26,.29,.27),.76,.08) +noise_surface(M['constructionpanel'],3.5,.25,.012,(.65,.88)) +for j in range(7): + y=18.5+j*2.0;x=RW-.25 + if j<4: + box('Low dark roadside retaining wall',(x+.18,y,.56),(.50,1.98,1.12),M['concrete'],'Construction',.025) + box('Retaining wall weathered cap',(x+.18,y,1.14),(.60,1.98,.13),M['curb'],'Construction',.025) + path('Low fence top rail',[(x+.2,y-.97,1.5),(x+.2,y+.97,1.5)],.03,M['greenmetal'],'Construction') + for yy in [-.95,.95]:cylinder('Low fence post',(x+.2,y+yy,.8),(x+.2,y+yy,1.53),.035,M['greenmetal'],'Construction') + else: + box('Construction barrier foot',(x,y,.20),(.86,1.92,.40),M['orange' if j%3 else 'barrier_white'],'Construction',.08) + box('Construction barrier body',(x,y,.90),(.59,1.86,1.0),M['orange' if j%3 else 'barrier_white'],'Construction',.11) + for yy in [-.59,.59]:box('Barrier molded channel',(x-.31,y+yy,.94),(.018,.12,.62),M['rust'],'Construction') + box('Construction pale temporary panel',(x+.33,y,2.43),(.10,1.91,2.06),M['constructionpanel'],'Construction') + for zz in [1.40,3.46]:box('Fence galvanized rail',(x+.24,y,zz),(.12,1.96,.07),M['scaffold'],'Construction') + cylinder('Fence upright',(x+.29,y-.95,1.15),(x+.29,y-.95,3.54),.045,M['scaffold'],'Construction') +for side,y in [(1,7),(-1,32),(1,56)]: + x=side*(RW+1) + box('Blue sidewalk refuse bin',(x,y,.68),(.52,.52,1.05),M['bluebin'],'Street furniture',.045) + box('Refuse bin lid',(x,y,1.23),(.58,.58,.12),M['metal'],'Street furniture',.03) +for side,y in [(-1,18),(1,11),(-1,54),(1,62)]: + x=side*(RW+1.1);cylinder('Parking regulation signpost',(x,y,.2),(x,y,3.5),.035,M['metal'],'Street furniture') + box('Parking regulation white sign',(x,y-.025,3.2),(.37,.05,.55),M['barrier_white'],'Signs') + text_obj('Parking restrictions','NO\nPARKING',(x,y-.06,3.2),.075,M['signred'],0) +for side,y in [(1,53),(-1,48)]: + x=side*(RW+1.1);cylinder('Fire hydrant barrel',(x,y,.18),(x,y,.76),.13,M['metal'],'Street furniture') + sphere('Hydrant cap',(x,y,.76),(.16,.16,.1),M['metal'],'Street furniture') + cylinder('Hydrant valve',(x-.23,y,.56),(x+.23,y,.56),.085,M['metal'],'Street furniture') + +# Ground contact is applied to the generated street systems once, before the +# camera rig. Calibrated lamp heads and tower tops retain their observed pose. +def near_curb_width(y,side): + # Fixed parking-bay curb geometry, fitted to the near vehicle contacts. + # Tapers into the already measured intersection without moving its corners. + knots=[(-30,18.8),(14,18.8),(21,14.5),(27,12.5),(38,RW)] if side<0 else [(-30,14.2),(22,14.2),(34,RW)] + if y<=knots[0][0]:return knots[0][1] + for (ya,xa),(yb,xb) in zip(knots,knots[1:]): + if y<=yb: + t=(y-ya)/(yb-ya);t=t*t*(3-2*t);return xa+(xb-xa)*t + return RW +bpy.context.view_layer.update() +for o in list(bpy.data.objects): + if o.parent:continue + groups={c.name for c in o.users_collection} + if 'Street' in groups or 'Road markings' in groups: + if o.type=='MESH': + if o.data.users>1:o.data=o.data.copy() + inv=o.matrix_world.inverted() + for vtx in o.data.vertices: + q=o.matrix_world @ vtx.co + if o.name.startswith(('Raised sidewalk segment','Individual granite curb stones','Sidewalk expansion joints')): + side=-1 if q.x<0 else 1;factor=max(0,min(1,(RW+SW-abs(q.x))/SW)) + q.x+=side*(near_curb_width(q.y,side)-RW)*factor + q.z+=ground_height(q.y,q.x);vtx.co=inv@q + continue + fixed_tower=('Left prominent residential tower' in o.name or 'Right distant narrow stepped tower' in o.name or 'Distant tower' in o.name or o.name.startswith('Observed tower_')) + if fixed_tower: + if o.type=='MESH': + inv=o.matrix_world.inverted() + for vtx in o.data.vertices: + q=o.matrix_world @ vtx.co + if q.z<.5:q.z+=ground_height(q.y,q.x);vtx.co=inv@q + continue + if 'paired streetlamp' in o.name or o.name.startswith('Observed right_') or 'Traffic signals' in groups:continue + if o.type=='EMPTY': + x,y=o.location.x,o.location.y;o.location.z+=ground_height(y,x) + if 'Vehicles' in groups and o.name!='Prominent white SUV': + dx=(ground_height(y,x+.1)-ground_height(y,x-.1))/.2;dy=(ground_height(y+.1,x)-ground_height(y-.1,x))/.2 + xx=Vector((1,0,dx)).normalized();normal=Vector((-dx,-dy,1)).normalized();yy=normal.cross(xx).normalized() + terrain=Matrix((xx,yy,normal)).transposed();o.rotation_euler=(terrain@o.rotation_euler.to_matrix()).to_euler() + + else: + center=sum((o.matrix_world @ Vector(c) for c in o.bound_box),Vector())/8 if o.type in {'MESH','CURVE','FONT'} else o.location.copy() + o.location.z+=ground_height(center.y,center.x) + +# Camera: all positions derive from a single continuous trajectory. +bpy.ops.object.camera_add();cam=bpy.context.object;cam.name='Source matched windshield camera';objlink(cam,'Camera rig') +S.camera=cam;cam.data.type='PERSP';cam.data.sensor_width=36;cam.data.lens=18/math.tan(math.radians(P['fov']/2));cam.data.clip_end=1200;cam.data.clip_start=.035 +cam.data.shift_y=P.get('shift_y',0) +cam.data.dof.use_dof=False;cam.data.dof.focus_distance=45;cam.data.dof.aperture_fstop=3.5 +motion_path=ROOT/'assets/camera_motion.json' +motion=json.loads(motion_path.read_text()) if motion_path.exists() else None +base_rotation=Euler((math.radians(90+P['pitch']),0,math.radians(-P['yaw'])),'XYZ').to_matrix() +cv_to_blender=Matrix.Diagonal((1,-1,-1)) +if motion: + ep=motion['epipole'];pp=motion.get('principal_point',[640,360]);focal=motion['focal_pixels'] + translation_direction=base_rotation @ cv_to_blender @ Vector(((ep[0]-pp[0])/focal,(ep[1]-pp[1])/focal,1)) + translation_direction.normalize() +else:translation_direction=Vector((0,1,0)) +def motion_at(fr): + t=(fr-1)/127 + if not motion:return .91*t+.09*t*t,Vector((0,0,0)) + fs=motion['frames'];i=max(0,min(len(fs)-2,bisect.bisect_right(fs,fr)-1));a=(fr-fs[i])/(fs[i+1]-fs[i]) + d=motion['displacement_fraction'][i]*(1-a)+motion['displacement_fraction'][i+1]*a + r=Vector(motion['rotation_vectors'][i]).lerp(Vector(motion['rotation_vectors'][i+1]),a) + return d,r +for fr in range(1,129): + t=(fr-1)/127 + fraction,rotvec=motion_at(fr);distance=P['travel']*fraction + cam.location=Vector((0,0,P['camera_height']))+translation_direction*distance + if motion: + rr=Quaternion(rotvec.normalized(),rotvec.length).to_matrix() if rotvec.length>1e-9 else Matrix.Identity(3) + cam.rotation_euler=(base_rotation @ cv_to_blender @ rr.transposed() @ cv_to_blender).to_euler('XYZ') + else:cam.rotation_euler=(math.radians(90+P['pitch']+.06*sin(t*22)),math.radians(.05*sin(t*18)),math.radians(-P['yaw']+.11*sin(t*8))) + cam.keyframe_insert(data_path='location',frame=fr);cam.keyframe_insert(data_path='rotation_euler',frame=fr) +S.frame_set(1) +for x in [-.73,.73]: + o=light('Camera car low beam',(x,1.2,1.2),(.55,.71,1.0),2300,'SPOT',.12,(x,22,-.7)) + o.data.spot_size=math.radians(88) + # Root translates only; keep headlights directed along the road. + for fr in range(1,129): + o.location=Vector((x,1.2,1.2))+translation_direction*P['travel']*motion_at(fr)[0];o.keyframe_insert(data_path='location',frame=fr) +light('Urban sky bounce across foreground',(0,15,24),(.53,.59,.48),4500,'AREA',35,(0,20,0)) +light('Intersection reflected blue-gray sky fill',(0,44,25),(.40,.57,.90),P.get('intersection_fill_watts',2600),'AREA',28,(0,44,-.5)) +light('Broad reflected city fill along street',(0,72,35),(.49,.57,.59),5000,'AREA',45,(0,65,0)) +light('Right facade reflected warm city light',(20,29,12),(.86,.69,.39),900,'AREA',10,(32,35,21)) +light('Left masonry warm street bounce',(-19,37,8),(.80,.68,.42),650,'AREA',12,(-29,38,18)) + +from animation_curves import linear +for ob in bpy.data.objects: + if ob.animation_data and ob.animation_data.action:linear(ob) + +# Camera-attached lower rubber windshield boundary and sliver of the hood. +# Geometry is authored in normalized camera image coordinates on a near plane. +def screen_mesh(name,pts,mat,depth=.6,group='Windshield'): + f=cam.data.lens/36*1280;ppy=360+cam.data.shift_y*1280;verts=[((u-640)/f*depth,(ppy-v)/f*depth,-depth) for u,v in pts] + b=Batch(name,group);b.face(verts,mat);o=b.finish();o.parent=cam;return o +boundary=[(-80,615),(0,626),(150,670),(340,697),(590,711),(820,720),(1040,708),(1210,681),(1300,641),(1360,800),(-80,800)] +screen_mesh('Curved black windshield lower seal',boundary,M['black'],.40) +M['hood'].node_tree.nodes['Principled BSDF'].inputs['Base Color'].default_value=(.27,.27,.21,1) +M['hood'].node_tree.nodes['Principled BSDF'].inputs['Metallic'].default_value=.22 +M['hood'].node_tree.nodes['Principled BSDF'].inputs['Coat Weight'].default_value=.55 +hood=Batch('Curved silver hood surface','Windshield');hf=cam.data.lens/36*1280;hppy=360+cam.data.shift_y*1280 +def hoodpoint(i,j): + u=i/20*2-1;t=j/7;px=700+u*315*(1+.18*t);py=684+70*t+25*u*u+7*u;d=2.3-.7*t + return ((px-640)/hf*d,(hppy-py)/hf*d,-d) +for j in range(7): + for i in range(20):hood.face([hoodpoint(i,j),hoodpoint(i+1,j),hoodpoint(i+1,j+1),hoodpoint(i,j+1)],M['hood']) +ho=hood.finish();ho.parent=cam +for poly in ho.data.polygons:poly.use_smooth=True + +# Millimetre-scale water beads remain attached to the lower glass. Their +# refracted highlights come from the scene, with no emissive painted glints. +water=material('Clear windshield water beads',(.97,.99,1),.025,0) +wp=water.node_tree.nodes['Principled BSDF'];wp.inputs['Transmission Weight'].default_value=1;wp.inputs['IOR'].default_value=1.333 +drop_rng=random.Random(4404);depth=.52;pixel_world=depth/hf +for j in range(76): + u=drop_rng.uniform(95,1190);v=646+34*(1-((u-640)/640)**2)+drop_rng.uniform(-4,20) + radius=drop_rng.uniform(.65,2.6);stretch=drop_rng.uniform(1.1,2.6) + droplet=sphere('Fixed lower-glass water bead',((u-640)*pixel_world,(hppy-v)*pixel_world,-depth),(radius*pixel_world,radius*stretch*pixel_world,.72*pixel_world),water,'Windshield',12,6) + droplet.parent=cam + +# Humidity is fixed in world space and concentrated near the street. +coll('Atmosphere') +from atmosphere import install_atmosphere +install_atmosphere(P) + +# Post lens response: glare from actual rendered lights, fixed subtle distortion. +S.use_nodes=True +nt=S.compositing_node_group if hasattr(S,'compositing_node_group') else S.node_tree +if nt is None: + nt=bpy.data.node_groups.new('Rainy windshield optical response','CompositorNodeTree');S.compositing_node_group=nt +nt.nodes.clear();nodes=nt.nodes;links=nt.links +rl=nodes.new('CompositorNodeRLayers');rl.location=(-500,100) +gl=nodes.new('CompositorNodeGlare');gl.inputs['Type'].default_value='Fog Glow';gl.inputs['Quality'].default_value='High';gl.inputs['Threshold'].default_value=1.2;gl.inputs['Size'].default_value=.6;gl.inputs['Strength'].default_value=.65;gl.location=(-200,100) +links.new(rl.outputs['Image'],gl.inputs['Image']) +try: + out=nodes.new('CompositorNodeComposite');links.new(gl.outputs['Image'],out.inputs['Image']) +except RuntimeError: + nt.interface.new_socket(name='Image',in_out='OUTPUT',socket_type='NodeSocketColor') + out=nodes.new('NodeGroupOutput');links.new(gl.outputs['Image'],out.inputs['Image']) + +S['reconstruction_source']='night_front_wide_120fov.mp4 (reference only, never used by scene nodes)' +S['deterministic_seed']=404;S['camera_parameters']=json.dumps(P) +S['stage']=VARIANT +if P.get('optics',False): + sys.path.insert(0,str(ROOT/'scripts')) + from install_optics import install_optics + install_optics(S,P) +S.frame_set(1);S.render.filepath=str(ROOT/'renders/previews/layout_0001.png') +bpy.ops.file.pack_all() +for resource in list(bpy.data.images)+list(bpy.data.fonts): + if getattr(resource,'filepath',''): + path=pathlib.Path(bpy.path.abspath(resource.filepath)) + if path.is_absolute() and ROOT in path.parents:resource.filepath='//'+path.relative_to(ROOT).as_posix() +S.render.filepath='//renders/final/' +bpy.ops.wm.save_as_mainfile(filepath=str(ROOT/'scene_04.blend')) +inventory={'objects':len(bpy.data.objects),'meshes':len(bpy.data.meshes),'materials':len(bpy.data.materials), + 'polygons':sum(len(m.polygons) for m in bpy.data.meshes),'collections':list(collections), 'params':P} +(ROOT/'logs/scene_inventory.json').write_text(json.dumps(inventory,indent=2)) +print('BUILD_COMPLETE',json.dumps(inventory)) +if 'render' in ARGS: + native=S.compositing_node_group.nodes.get('SOURCE_FRAME_OUTPUT') if S.compositing_node_group else None + if native:native.directory=str(ROOT/'renders/previews');native.file_name=VARIANT+'_' + for fr in [1,65,128]: + S.frame_set(fr);S.render.filepath=str(ROOT/f'renders/previews/{VARIANT}_{fr:04d}.png');bpy.ops.render.render(write_still=native is None) diff --git a/astra_scene_test/Scene_04/scripts/calibrate_sky_response.py b/astra_scene_test/Scene_04/scripts/calibrate_sky_response.py new file mode 100644 index 0000000000000000000000000000000000000000..b1a93fa0c796cb9f5f5e0920666631daef552397 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/calibrate_sky_response.py @@ -0,0 +1,18 @@ +"""Infer background control from separate rendered in-scattering/background probes.""" +from pathlib import Path +import os,json,sys,numpy as np +os.environ['OPENCV_IO_ENABLE_OPENEXR']='1' +import cv2 +ROOT=Path(__file__).resolve().parents[1];cv2.setNumThreads(1) +P=json.loads((ROOT/'assets/config.json').read_text());out={};label=sys.argv[1] if len(sys.argv)>1 else 'sky_probe' +def srgb_to_linear(v):return np.where(v<=.04045,v/12.92,((v+.055)/1.055)**2.4) +for fr in [1,65,128]: + zero=cv2.imread(str(ROOT/f'renders/{label}/{fr:04d}_zero.exr'),cv2.IMREAD_UNCHANGED)[:,:,2::-1].mean((0,1)) + orig=cv2.imread(str(ROOT/f'renders/{label}/{fr:04d}_original.exr'),cv2.IMREAD_UNCHANGED)[:,:,2::-1].mean((0,1)) + ref=cv2.imread(str(ROOT/f'reference/frames/{fr:04d}.png'))[30:210,550:700,::-1]/255 + # A saved EXR/PNG round-trip probe confirms display gamma after the Standard view. + # Invert that order, then divide by scene-linear exposure. + target=srgb_to_linear(ref.mean((0,1))**P.get('gamma',1))/2**P['exposure'] + gain=(target-zero)/np.maximum(orig-zero,1e-8) + out[fr]={'source_srgb_mean':ref.mean((0,1)).tolist(),'zero_linear':zero.tolist(),'original_linear':orig.tolist(),'target_linear':target.tolist(),'gain':gain.tolist(),'old_control':P['sky_response'][str(fr)],'proposed_control':(gain*P['sky_response'][str(fr)]).tolist()} +print(json.dumps(out,indent=2));(ROOT/f'reference/{label}_response_fit.json').write_text(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/camera_math.py b/astra_scene_test/Scene_04/scripts/camera_math.py new file mode 100644 index 0000000000000000000000000000000000000000..536108d564446f0cde6a6f1262240ae3592604e5 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/camera_math.py @@ -0,0 +1,21 @@ +"""Standalone projection shared by reference measurements, never by rendering.""" +from pathlib import Path +import json,math,numpy as np +from scipy.spatial.transform import Rotation +ROOT=Path(__file__).resolve().parents[1] +P=json.loads((ROOT/'assets/config.json').read_text());M=json.loads((ROOT/'assets/camera_motion.json').read_text()) +p,y=map(math.radians,[P['pitch'],P['yaw']]);B=np.array([[math.cos(y),math.sin(y)*math.sin(p),math.sin(y)*math.cos(p)],[-math.sin(y),math.cos(y)*math.sin(p),math.cos(y)*math.cos(p)],[0,-math.cos(p),math.sin(p)]]) +f=M['focal_pixels'];pp=np.array(M['principal_point']);d=np.r_[(np.array(M['epipole'])-pp)/f,1];d=d/np.linalg.norm(d)*P['travel'];C0=np.array([0,0,P['camera_height']]) +def camera(fr): + t=np.interp(fr,M['frames'],M['displacement_fraction']);r=np.array([np.interp(fr,M['frames'],np.array(M['rotation_vectors'])[:,i]) for i in range(3)]) + return C0+B@d*t,Rotation.from_rotvec(r).as_matrix()@B.T +def project(q,fr): + C,R=camera(fr);p=R@(np.array(q)-C);return p[:2]/p[2]*f+pp +def triangulate(obs): + from scipy.optimize import least_squares + As=[];bs=[] + for fr,uv in obs.items(): + C,R=camera(int(fr));ray=R.T@np.r_[(np.array(uv)-pp)/f,1];ray/=np.linalg.norm(ray);A=np.eye(3)-np.outer(ray,ray);As.append(A);bs.append(A@C) + q=np.linalg.lstsq(np.concatenate(As),np.concatenate(bs),rcond=None)[0] + fit=least_squares(lambda q:np.concatenate([project(q,int(fr))-uv for fr,uv in obs.items()]),q,loss='soft_l1',f_scale=3) + return fit.x diff --git a/astra_scene_test/Scene_04/scripts/collect_probe_raw.py b/astra_scene_test/Scene_04/scripts/collect_probe_raw.py new file mode 100644 index 0000000000000000000000000000000000000000..33de3a4615e6dde252682e20e8c399f0faa72d04 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/collect_probe_raw.py @@ -0,0 +1,16 @@ +"""Preserve outputs from the first Blender 5.2 single-image File Output probe.""" +from pathlib import Path +import json,time,shutil +ROOT=Path(__file__).resolve().parents[1];folder=ROOT/'renders/optics_probe/linear' +start=time.monotonic();done=set() +while time.monotonic()-start<1800: + for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines(): + row=json.loads(line) + if row['label']=='optics_probe' and row['frame'] in {1,65,128}: + fr=row['frame'];target=folder/f'{fr:04d}_Raw.exr' + if target.exists():done.add(fr);continue + source=folder/'frameRaw.exr' + if source.exists():shutil.copy2(source,target);done.add(fr);print('RAW_PRESERVED',fr,flush=True) + if done=={1,65,128}:break + time.sleep(1) +print('RAW_COLLECTION_COMPLETE',sorted(done),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/collect_usage.py b/astra_scene_test/Scene_04/scripts/collect_usage.py new file mode 100644 index 0000000000000000000000000000000000000000..8c11706b5b223fd6bfb9551bf3c131f44dd5a24f --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/collect_usage.py @@ -0,0 +1,27 @@ +"""Collect task-scoped runtime usage counters, without copying conversation text.""" +import pathlib,json,datetime +ROOT=pathlib.Path(__file__).resolve().parents[1] +runtime=pathlib.Path('/Users/wangpy11/.codex/sessions/2026/09/11') +ids={'rollout-2026-09-11T20-25-40-01a0906e-434d-7f13-9245-c473b8fed82e.jsonl':'primary', + 'rollout-2026-09-11T20-30-16-01a09072-79fb-71f3-a8b0-3d3cc1799507.jsonl':'approval_guardian'} +result={'collected_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(), + 'note':'Raw cumulative runtime counters. Input includes repeated cached context. Approval guardian is host overhead, not a delegated scene-building agent. Billing cost is not available.', + 'billing_cost':None,'sessions':[]} +for filename,role in ids.items(): + path=runtime/filename + if not path.exists():continue + entries=[] + with path.open() as f: + for line in f: + try:row=json.loads(line) + except ValueError:continue + p=row.get('payload',{}) + if row.get('type')=='event_msg' and p.get('type')=='token_count' and p.get('info'): + entries.append({'timestamp':row.get('timestamp'),'total_token_usage':p['info'].get('total_token_usage'), + 'last_token_usage':p['info'].get('last_token_usage')}) + result['sessions'].append({'role':role,'runtime_log':filename,'snapshots':entries}) +(ROOT/'logs/token_usage.json').write_text(json.dumps(result,indent=2)) +session_path=ROOT/'logs/session.json';session=json.loads(session_path.read_text()) +session['token_usage']={r['role']:r['snapshots'][-1] for r in result['sessions'] if r['snapshots']} +session['usage_note']=result['note'];session['cost']=None;session_path.write_text(json.dumps(session,indent=2)) +print('USAGE_SNAPSHOTS_SAVED',[(r['role'],len(r['snapshots'])) for r in result['sessions']]) diff --git a/astra_scene_test/Scene_04/scripts/compare.py b/astra_scene_test/Scene_04/scripts/compare.py new file mode 100644 index 0000000000000000000000000000000000000000..ef886b86df7c5dba6a3ec3f0a911d1de3c95a944 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/compare.py @@ -0,0 +1,27 @@ +"""Timestamp-matched image boards and video assembly; never alters the source.""" +import pathlib,sys,subprocess,json +from PIL import Image,ImageDraw +import numpy as np +ROOT=pathlib.Path(__file__).resolve().parents[1] +label=sys.argv[1] if len(sys.argv)>1 else 'layout' +folder=ROOT/'renders'/label +if not folder.exists():folder=ROOT/'renders/previews' +files=sorted(folder.glob('*.png')) +if folder.name=='previews':files=[p for p in files if p.name.startswith(label+'_')] +out=ROOT/'renders/comparisons';out.mkdir(exist_ok=True) +rows=[] +for p in files: + frame=int(p.stem.split('_')[-1]);a=Image.open(ROOT/f'reference/frames/{frame:04d}.png').convert('RGB');b=Image.open(p).convert('RGB') + b=b.resize(a.size);board=Image.new('RGB',(2560,752),(17,18,18));board.paste(a,(0,32));board.paste(b,(1280,32));d=ImageDraw.Draw(board) + d.text((15,10),f'SOURCE | frame {frame:03d} | {(frame-1)/30:.4f} s',fill='white') + d.text((1295,10),f'BLENDER {label} | frame {frame:03d} | {(frame-1)/30:.4f} s',fill='white') + board.save(out/f'{label}_{frame:04d}.jpg',quality=94) + aa=np.asarray(a,dtype=float);bb=np.asarray(b,dtype=float) + rows.append({'frame':frame,'mae_rgb_255':float(np.abs(aa-bb).mean()),'source_mean_rgb':aa.mean((0,1)).tolist(),'render_mean_rgb':bb.mean((0,1)).tolist()}) +(ROOT/f'logs/comparison_{label}.json').write_text(json.dumps(rows,indent=2)) +if label=='final': + assert [p.name for p in files]==[f'{fr:04d}.png' for fr in range(1,129)],'All128 completed frames required before encoding' + ff=str(ROOT/'tools/ffmpeg') + subprocess.run([ff,'-y','-hide_banner','-loglevel','error','-framerate','30','-start_number','1','-i',str(folder/'%04d.png'),'-frames:v','128','-r','30','-fps_mode','cfr','-video_track_timescale','15360','-an','-c:v','libx264','-preset','slow','-crf','16','-pix_fmt','yuv420p','-movflags','+faststart',str(ROOT/'final.mp4')],check=True) + subprocess.run([ff,'-y','-hide_banner','-loglevel','error','-i',str(ROOT/'night_front_wide_120fov.mp4'),'-i',str(ROOT/'final.mp4'),'-filter_complex','[0:v]setpts=PTS-STARTPTS[a];[1:v]setpts=PTS-STARTPTS[b];[a][b]hstack=inputs=2[v]','-map','[v]','-frames:v','128','-r','30','-fps_mode','cfr','-video_track_timescale','15360','-an','-c:v','libx264','-preset','slow','-crf','17','-pix_fmt','yuv420p','-movflags','+faststart',str(ROOT/'comparison.mp4')],check=True) +print('COMPARISON_COMPLETE',label,len(rows)) diff --git a/astra_scene_test/Scene_04/scripts/correct_initial_camera.py b/astra_scene_test/Scene_04/scripts/correct_initial_camera.py new file mode 100644 index 0000000000000000000000000000000000000000..c8cc7cb6a0117de1f2c8b0276abe89ce531172d1 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/correct_initial_camera.py @@ -0,0 +1,8 @@ +import bpy,math,pathlib,json +R=pathlib.Path(__file__).resolve().parents[1];S=bpy.context.scene;P=json.loads((R/'assets/config.json').read_text()) +for fr in range(1,129): + S.frame_set(fr);t=(fr-1)/127 + S.camera.rotation_euler.x=math.radians(90+P['pitch']+.06*math.sin(t*22)) + S.camera.keyframe_insert(data_path='rotation_euler',frame=fr) +S.frame_set(1);bpy.ops.wm.save_as_mainfile(filepath=str(R/'scene_04.blend')) +print('CAMERA_PITCH_CORRECTED',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/delivery_manifest.py b/astra_scene_test/Scene_04/scripts/delivery_manifest.py new file mode 100644 index 0000000000000000000000000000000000000000..657370f20f4ebe2e32ecc3445b226e96a01ff821 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/delivery_manifest.py @@ -0,0 +1,41 @@ +"""Record final artifact hashes, actual elapsed intervals and render provenance. + +Run only after full rendering, encoding, decoding and reopening checks complete. +This records evidence; it does not replace visual acceptance of the comparison. +""" +import datetime, hashlib, json, pathlib, statistics +from elapsed_time import measure_elapsed +ROOT = pathlib.Path(__file__).resolve().parents[1] +def read(name): return json.loads((ROOT/name).read_text()) +def sha(path): + h=hashlib.sha256() + with path.open('rb') as f: + for block in iter(lambda:f.read(1024*1024),b''):h.update(block) + return h.hexdigest() +now=datetime.datetime.now(datetime.timezone.utc) +session=read('logs/session.json') +start=datetime.datetime.fromisoformat(session['started_utc']) +timing=measure_elapsed(now);excluded=timing['excluded_seconds'] +blend_sha=sha(ROOT/'scene_04.blend') +rows={r['frame']:r for r in (json.loads(line) for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines()) if r['label']=='final'} +assert set(rows)==set(range(1,129)) +assert all(r['blend_sha256']==blend_sha for r in rows.values()) +for fr,r in rows.items():assert sha(ROOT/f'renders/final/{fr:04d}.png')==r['sha256'] +paths=[ROOT/name for name in ['scene_04.blend','final.mp4','comparison.mp4','night_front_wide_120fov.mp4','README.md','GATES.md','reproduce.sh','requirements.txt','review.html']] +paths += [ROOT/name for name in ['logs/final_review.md','logs/iteration_review.md','logs/final_acceptance.json','logs/final_gate_check.log','logs/session.json','logs/token_usage.json','logs/usage_interruption.json','logs/idle_intervals.json','logs/elapsed_time.json','logs/operations.jsonl','logs/render_operations.jsonl','logs/batch_operations.jsonl','logs/delivery_operations.jsonl','logs/automated_delivery_checks.json','logs/reopen_pixel_consistency.json','logs/reopened_scene_audit.json','logs/temporal_review_final.json']] +paths+=sorted((ROOT/'scripts').glob('*.py')) +paths+=sorted(p for p in (ROOT/'assets').rglob('*') if p.is_file()) +paths+=sorted((ROOT/'renders/final').glob('*.png')) +times=[r['seconds'] for r in rows.values()] +report={'recorded_utc':now.isoformat(),'started_utc':start.isoformat(), + 'elapsed_wall_hours':timing['wall_seconds']/3600,'excluded_quota_hours':timing['excluded_by_kind_seconds']['quota']/3600, + 'excluded_idle_hours':timing['excluded_by_kind_seconds']['idle']/3600,'elapsed_excluding_pauses_hours':timing['meaningful_seconds']/3600, + 'timing_note':timing['note'], + 'final_render_seconds_sum':sum(times),'final_render_seconds_median':statistics.median(times), + 'final_frame_count':len(rows),'source_probe':read('logs/probe_night_front_wide_120fov.json'), + 'acceptance':read('logs/final_acceptance.json'), + 'final_probe':read('logs/probe_final.json'),'comparison_probe':read('logs/probe_comparison.json'), + 'usage_latest':session['token_usage'],'billing_cost':session['cost'],'usage_note':session['usage_note'], + 'files':{str(p.relative_to(ROOT)):{'bytes':p.stat().st_size,'sha256':sha(p)} for p in paths}} +(ROOT/'logs/delivery_manifest.json').write_text(json.dumps(report,indent=2)) +print('DELIVERY_MANIFEST_WRITTEN',report['final_frame_count'],round(report['elapsed_excluding_pauses_hours'],3)) diff --git a/astra_scene_test/Scene_04/scripts/elapsed_time.py b/astra_scene_test/Scene_04/scripts/elapsed_time.py new file mode 100644 index 0000000000000000000000000000000000000000..de5018c5c97b8246e7451fed52052c0db9a961eb --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/elapsed_time.py @@ -0,0 +1,32 @@ +"""Actual elapsed time excluding recorded quota and inactive intervals.""" +import datetime,json,pathlib +ROOT=pathlib.Path(__file__).resolve().parents[1] +def measure_elapsed(now=None): + now=now or datetime.datetime.now(datetime.timezone.utc) + session=json.loads((ROOT/'logs/session.json').read_text()) + start=datetime.datetime.fromisoformat(session['started_utc']) + spans=[];by_kind={'quota':0.0,'idle':0.0} + quota=ROOT/'logs/usage_interruption.json' + if quota.exists(): + p=json.loads(quota.read_text()) + spans.append(('quota',p['interruption_after_utc'],p['resumed_utc'])) + idle=ROOT/'logs/idle_intervals.json' + if idle.exists(): + spans.extend(('idle',p['start_utc'],p['end_utc']) for p in json.loads(idle.read_text())) + clipped=[] + for kind,a,b in spans: + a=datetime.datetime.fromisoformat(a);b=datetime.datetime.fromisoformat(b) + assert a.tzinfo and b.tzinfo and b>=a + a=max(start,a);b=min(now,b) + if b>a:clipped.append((a,b));by_kind[kind]+=(b-a).total_seconds() + merged=[] + for a,b in sorted(clipped): + if merged and a<=merged[-1][1]:merged[-1]=(merged[-1][0],max(merged[-1][1],b)) + else:merged.append((a,b)) + excluded=sum((b-a).total_seconds() for a,b in merged) + wall=(now-start).total_seconds() + return {'recorded_utc':now.isoformat(),'started_utc':start.isoformat(), + 'wall_seconds':wall,'excluded_seconds':excluded,'meaningful_seconds':wall-excluded, + 'excluded_by_kind_seconds':by_kind, + 'note':'Elapsed implementation, review and rendering time, excluding recorded pauses. Not a CPU/GPU utilization measurement.'} +if __name__=='__main__':print(json.dumps(measure_elapsed(),indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/encode_preview.py b/astra_scene_test/Scene_04/scripts/encode_preview.py new file mode 100644 index 0000000000000000000000000000000000000000..a0916a4aed3b2d1901222799055d9caba503d4ca --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/encode_preview.py @@ -0,0 +1,9 @@ +"""Encode a complete numbered preview and an exactly indexed comparison.""" +from pathlib import Path +import sys,subprocess +ROOT=Path(__file__).resolve().parents[1];label=sys.argv[1];folder=ROOT/'renders'/label +assert [p.name for p in sorted(folder.glob('*.png'))]==[f'{n:04d}.png' for n in range(1,129)],'All128 ordered preview frames required' +ff=str(ROOT/'tools/ffmpeg') +subprocess.run([ff,'-y','-hide_banner','-loglevel','error','-framerate','30','-start_number','1','-i',str(folder/'%04d.png'),'-frames:v','128','-r','30','-fps_mode','cfr','-video_track_timescale','15360','-an','-c:v','libx264','-preset','slow','-crf','16','-pix_fmt','yuv420p','-movflags','+faststart',str(ROOT/'draft.mp4')],check=True) +subprocess.run([ff,'-y','-hide_banner','-loglevel','error','-i',str(ROOT/'night_front_wide_120fov.mp4'),'-i',str(ROOT/'draft.mp4'),'-filter_complex','[0:v]setpts=PTS-STARTPTS[a];[1:v]scale=1280:720:flags=lanczos,setpts=PTS-STARTPTS[b];[a][b]hstack=inputs=2[v]','-map','[v]','-frames:v','128','-r','30','-fps_mode','cfr','-video_track_timescale','15360','-an','-c:v','libx264','-preset','slow','-crf','17','-pix_fmt','yuv420p','-movflags','+faststart',str(ROOT/'draft_comparison.mp4')],check=True) +print('PREVIEW_VIDEOS_COMPLETE',label) diff --git a/astra_scene_test/Scene_04/scripts/fetch_materials.py b/astra_scene_test/Scene_04/scripts/fetch_materials.py new file mode 100644 index 0000000000000000000000000000000000000000..9ed51b65becdbb06dcc09067cdbc62fb29c05e82 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fetch_materials.py @@ -0,0 +1,18 @@ +"""Download the selected CC0 photographic material maps from Poly Haven.""" +from pathlib import Path +import subprocess,json,hashlib,datetime +ROOT=Path(__file__).resolve().parents[1];folder=ROOT/'assets/materials';folder.mkdir(parents=True,exist_ok=True) +assets={'asphalt_track':{'author':'Dimitrios Savva','physical_width_m':2.0},'brick_wall_09':{'authors':['Matterfield','Rob Tuytel'],'physical_width_m':2.0}} +records=[] +def fetch(url,path): + if not path.exists():subprocess.run(['curl','--fail','--location','--silent','--show-error','--max-time','90',url,'-o',str(path)],check=True) +for name,info in assets.items(): + metadata=folder/f'{name}_files.json';fetch(f'https://api.polyhaven.com/files/{name}',metadata);data=json.loads(metadata.read_text()) + record={'asset':name,'source':f'https://polyhaven.com/a/{name}','license':'CC0',**info,'maps':{}} + for channel,api_key,fmt in [('diff','Diffuse','jpg'),('rough','Rough','jpg'),('disp','Displacement','png')]: + entry=data[api_key]['2k'][fmt];url=entry['url'];path=folder/Path(url.split('?')[0]).name;fetch(url,path) + record['maps'][channel]={'path':str(path.relative_to(ROOT)),'url':url,'bytes':path.stat().st_size,'sha256':hashlib.sha256(path.read_bytes()).hexdigest()} + print('DOWNLOADED',name,channel,path.stat().st_size,flush=True) + records.append(record) +(folder/'manifest.json').write_text(json.dumps({'downloaded_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'assets':records},indent=2)) +print('MATERIAL_ASSETS_READY',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/final_progress.py b/astra_scene_test/Scene_04/scripts/final_progress.py new file mode 100644 index 0000000000000000000000000000000000000000..5a7f3165f36805f7b91d5870f32428a62ff46483 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/final_progress.py @@ -0,0 +1,27 @@ +"""Read current frozen render progress without changing render state.""" +from pathlib import Path +import datetime,hashlib,json,statistics +ROOT=Path(__file__).resolve().parents[1] +blend=hashlib.sha256((ROOT/'scene_04.blend').read_bytes()).hexdigest() +rows={} +for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines(): + r=json.loads(line) + if r.get('label')=='final':rows[r['frame']]=r +current=[] +for fr,r in rows.items(): + p=ROOT/f'renders/final/{fr:04d}.png' + if r.get('blend_sha256')==blend and p.exists() and hashlib.sha256(p.read_bytes()).hexdigest()==r['sha256']:current.append(r) +current.sort(key=lambda r:r['utc']) +records=[] +for line in (ROOT/'logs/final_wrap_manager.log').read_text().splitlines(): + try:records.append(json.loads(line)) + except ValueError:pass +latest=records[-1] if records else {} +seconds=statistics.median([r['seconds'] for r in current[-8:]]) if current else None +report={'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'blend_sha256':blend,'completed':len(current),'total':128, + 'latest_frame':current[-1]['frame'] if current else None,'latest_completed_utc':current[-1]['utc'] if current else None, + 'recent_median_seconds':seconds,'estimated_remaining_render_hours':(128-len(current))*seconds/3600 if seconds else None, + 'note':'Estimate excludes remaining batch startup, encoding and reopening checks; shared-machine speed varies.', + 'manager_event':latest.get('event'),'active_frames':latest.get('frames') if latest.get('event')=='batch_start' else None} +(ROOT/'logs/final_progress.json').write_text(json.dumps(report,indent=2)) +print(json.dumps(report)) diff --git a/astra_scene_test/Scene_04/scripts/finalize_delivery.py b/astra_scene_test/Scene_04/scripts/finalize_delivery.py new file mode 100644 index 0000000000000000000000000000000000000000..1bc7bef16802c900e0bd73b8dd0274ffea056e4e --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/finalize_delivery.py @@ -0,0 +1,61 @@ +"""Finish encoding and verification after the current frozen final render. + +This does not mark visual acceptance gates. Whole-sequence visual review remains +separate. Every stage stops on failure or a changed scene. +""" +import datetime, hashlib, json, os, pathlib, subprocess, sys, time +ROOT=pathlib.Path(__file__).resolve().parents[1] +PYTHON=sys.executable +BLENDER=os.environ.get('SCENE04_BLENDER','/Applications/Blender.app/Contents/MacOS/Blender') +def sha(path):return hashlib.sha256(path.read_bytes()).hexdigest() +scene_hash=sha(ROOT/'scene_04.blend') +samples=json.loads((ROOT/'assets/config.json').read_text())['samples'] +env={**os.environ,'OPENBLAS_NUM_THREADS':'1','VECLIB_MAXIMUM_THREADS':'1','OMP_NUM_THREADS':'1'} +records=[] +def event(kind,**kwargs): + row={'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'event':kind,'blend_sha256':scene_hash,**kwargs} + records.append(row) + with (ROOT/'logs/delivery_operations.jsonl').open('a') as f:f.write(json.dumps(row)+'\n') + print(json.dumps(row),flush=True) +def stable():assert sha(ROOT/'scene_04.blend')==scene_hash,'Scene changed during delivery processing' +def run(name,args): + stable();event('stage_start',stage=name);start=time.monotonic() + path=ROOT/'logs'/('delivery_'+name+'.log') + with path.open('w') as out:r=subprocess.run(args,cwd=ROOT,env=env,stdout=out,stderr=subprocess.STDOUT) + event('stage_end',stage=name,exit_code=r.returncode,seconds=time.monotonic()-start,log=str(path.relative_to(ROOT))) + assert r.returncode==0,f'{name} failed; see {path}' + stable() +event('waiting_for_verified_final_render') +deadline=time.monotonic()+12*3600 +while True: + stable();ready=False + for line in (ROOT/'logs/batch_operations.jsonl').read_text().splitlines(): + try:row=json.loads(line) + except ValueError:continue + if row.get('label')=='final' and row.get('blend_sha256')==scene_hash and row.get('event')=='sequence_verified' and row.get('count')==128:ready=True + if ready:break + assert time.monotonic()=128 +apply_quality(S,final_samples,100);device=configure(S) +for ob in bpy.data.objects: + if ob.animation_data and ob.animation_data.action:linear(ob) +assert len(curves(S.camera))==6 +S['camera_parameters']=json.dumps(P);S['stage']='final_reference_reconstruction';S.frame_set(1) +S.render.filepath='//renders/final/' +bpy.ops.file.pack_all() +for resource in list(bpy.data.images)+list(bpy.data.fonts): + if getattr(resource,'filepath',''): + path=pathlib.Path(bpy.path.abspath(resource.filepath)) + if path.is_absolute() and ROOT in path.parents:resource.filepath='//'+path.relative_to(ROOT).as_posix() +(ROOT/'assets/config.json').write_text(json.dumps(P,indent=2)) +bpy.ops.wm.save_as_mainfile(filepath=str(ROOT/'scene_04.blend')) +shutil.copy2(ROOT/'scene_04.blend',ROOT/'checkpoints/16_final_render_scene.blend') +def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest() +files=[ROOT/'scene_04.blend']+sorted((ROOT/'scripts').glob('*.py'))+sorted(p for p in (ROOT/'assets').rglob('*') if p.is_file()) +manifest={'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'device':device,'settings':P, + 'source_sha256':sha(ROOT/'night_front_wide_120fov.mp4'),'files':{str(p.relative_to(ROOT)):sha(p) for p in files}} +(ROOT/'logs/final_scene_manifest.json').write_text(json.dumps(manifest,indent=2)) +print('FINAL_SCENE_FROZEN',manifest['files']['scene_04.blend'],flush=True) diff --git a/astra_scene_test/Scene_04/scripts/fit_black_car_contact.py b/astra_scene_test/Scene_04/scripts/fit_black_car_contact.py new file mode 100644 index 0000000000000000000000000000000000000000..168ee09dc13b4500de7ec2c9355d4489ff832340 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_black_car_contact.py @@ -0,0 +1,19 @@ +"""Near black SUV fit with explicit tire contact, avoiding a buried-wheel solution.""" +from pathlib import Path +import json,sys,numpy as np,math +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import project +obs=json.loads((ROOT/'assets/near_vehicle_landmarks.json').read_text())['Left black SUV']['observations'] +coords={'front_wheel':[1.035,-1.47,.44],'rear_wheel':[1.035,1.44,.44],'roof_front':[.726,-.76,1.95],'roof_rear':[.726,.98,1.95]} +def point(a,key): + x,y,sx,sy,sz,yaw=a;xx,yy,zz=np.array(coords[key])*[sx,sy,sz] + return [x+xx*math.cos(yaw)-yy*math.sin(yaw),y+xx*math.sin(yaw)+yy*math.cos(yaw),zz-.066*sz] +def residual(a): + return np.r_[np.concatenate([project(point(a,key),int(fr))-uv for key,rows in obs.items() for fr,uv in rows.items()]),(a[2]-1.35)*3] +fit=least_squares(residual,[-12.2,13.3,1.35,1.1,1.3,-.2],bounds=([-18,9,.9,.6,.8,-.8],[-7,23,1.9,2.1,1.9,.8]),loss='soft_l1',f_scale=3) +out={'parameters':dict(zip(['x','y','scale_x','scale_y','scale_z','yaw'],fit.x.tolist())),'tire_contact_z':-.066*float(fit.x[4]), + 'observations':obs,'predictions':{key:{fr:project(point(fit.x,key),int(fr)).tolist() for fr in rows} for key,rows in obs.items()},'cost':fit.cost, + 'note':'Static pose, pitch0 and both tire bottoms on z0. Camera fixed; metric shape remains ambiguous.'} +(ROOT/'reference/black_car_contact_trial.json').write_text(json.dumps(out,indent=2)) +print(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_camera.py b/astra_scene_test/Scene_04/scripts/fit_camera.py new file mode 100644 index 0000000000000000000000000000000000000000..2159c685bc3bb6176d8e02fa5a562287e4f3313d --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_camera.py @@ -0,0 +1,66 @@ +"""Robust pure-forward bundle fit, with measured camera orientation fluctuations. + +Monocular reconstruction has an arbitrary metric scale; fix total road travel +after fitting. Intrinsics are a tested hypothesis, not recoverable uniquely from +this near-forward four-second sequence alone. +""" +import json,pathlib,sys,numpy as np +from scipy.optimize import least_squares +from scipy.spatial.transform import Rotation +root=pathlib.Path(__file__).resolve().parents[1] +tracks=np.load(root/'reference/feature_tracks.npz')['tracks'] +ids=[7,8,10,11,13,17,25,31,33,38,74,75,85,97,122,143,149,197,208,212,251,259,365,367,369] +samples=np.array(list(range(0,128,8))+[127]);N=len(ids);F=len(samples) +obs=tracks[ids][:,samples];valid=np.isfinite(obs[:,:,0]);f=float(sys.argv[1]) if len(sys.argv)>1 else 640/np.tan(np.deg2rad(60));pp=np.array([640,float(sys.argv[3]) if len(sys.argv)>3 else 360]) +prior=float(sys.argv[2]) if len(sys.argv)>2 else .03 +projection=sys.argv[4] if len(sys.argv)>4 else 'perspective' +nodist=len(sys.argv)>5 and sys.argv[5]=='nodist' +def ray_from_pixels(pixels): + uv=(np.asarray(pixels)-pp)/f + if projection=='equirectangular':return np.stack([np.tan(uv[...,0]),np.tan(uv[...,1])/np.cos(uv[...,0]),np.ones(uv.shape[:-1])],axis=-1) + if projection=='cylindrical':return np.stack([np.tan(uv[...,0]),uv[...,1]/np.cos(uv[...,0]),np.ones(uv.shape[:-1])],axis=-1) + return np.concatenate([uv,np.ones(uv.shape[:-1]+(1,))],axis=-1) +uv0=(obs[:,0]-pp)/f +z0=[] +for tr in obs: + r=np.linalg.norm(tr[-1]-[610,537])/np.linalg.norm(tr[0]-[610,537]);z0.append(np.clip(r/(r-1),1.05,30)) +x0=np.r_[610,537,np.log(z0),np.zeros((F-1)*3),np.linspace(0,1,F)[1:-1],0.0] +def unpack(x): + ep=x[:2];z=np.exp(x[2:2+N]);rot=np.r_[np.zeros(3),x[2+N:2+N+(F-1)*3]].reshape(F,3) + t=np.r_[0,x[2+N+(F-1)*3:-1],1] + return ep,z,rot,t +def project(x): + ep,z,rot,t=unpack(x);k=x[-1];uv=uv0.copy() + for _ in range(12):uv=uv0/(1+k*np.sum(uv*uv,axis=1))[:,None] + d=ray_from_pixels(ep);p=(np.c_[uv,np.ones(N)] if projection=='perspective' else ray_from_pixels(obs[:,0]))*z[:,None] + q=p[:,None,:]-t[None,:,None]*d + R=Rotation.from_rotvec(rot).as_matrix();q=np.einsum('fij,nfj->nfi',R,q) + if projection in ['equirectangular','cylindrical']: + u=np.arctan2(q[:,:,0],q[:,:,2]);hyp=np.hypot(q[:,:,0],q[:,:,2]) + v=np.arctan2(q[:,:,1],hyp) if projection=='equirectangular' else q[:,:,1]/hyp + return np.stack([u,v],axis=2)*f+pp + uv=q[:,:,:2]/q[:,:,2:] + return uv*(1+k*np.sum(uv*uv,axis=2))[:,:,None]*f+pp +def residual(x): + ep,z,rot,t=unpack(x);delta=project(x)-obs + weights=np.array([3 if n==122 else 2 if n==85 else 1.3 if n in [74,75,251] else 1 for n in ids]) + r=(delta*weights[:,None,None])[valid].ravel() + # Weak regularizers prevent a camera wobble from absorbing scene deformation. + return np.r_[r,rot.ravel()*12,np.diff(rot,n=2,axis=0).ravel()*60,np.diff(t,n=2)*4,(ep-[615,537])*prior,x[-1]*.5] +lo=np.full(len(x0),-np.inf);hi=np.full(len(x0),np.inf) +lo[-1]=-.12;hi[-1]=.3 +if projection!='perspective' or nodist:lo[-1]=-1e-8;hi[-1]=1e-8 +if prior>=100: + x0[:2]=[615,537];lo[:2]=[614.999999,536.999999];hi[:2]=[615.000001,537.000001] +fit=least_squares(residual,x0,loss='soft_l1',f_scale=2,max_nfev=700,bounds=(lo,hi)) +ep,z,rot,t=unpack(fit.x);err=np.linalg.norm(project(fit.x)-obs,axis=2) +result={'projection':projection,'focal_pixels':f,'principal_point':pp.tolist(),'horizontal_fov_degrees':float(np.degrees(1280/f) if projection!='perspective' else np.degrees(2*np.arctan(640/f))),'epipole':ep.tolist(), + 'optimizer_success':bool(fit.success),'optimizer_nfev':fit.nfev,'optimizer_message':fit.message, + 'radial_k1':float(fit.x[-1]), + 'frames':(samples+1).tolist(),'displacement_fraction':t.tolist(),'rotation_vectors':rot.tolist(), + 'track_ids':ids,'depth_in_total_travel_units':z.tolist(), + 'median_reprojection_error_pixels':float(np.nanmedian(err)), + 'p90_reprojection_error_pixels':float(np.nanpercentile(err,90)), + 'limitation':'Metric scale and exact lens distortion are not uniquely constrained. Focal length is a tested hypothesis; inspect horizontal_fov_degrees for this trial. Robust forward-motion tracks alone do not establish unique physical intrinsics.'} +(root/('reference/camera_fit.json' if len(sys.argv)<2 else f'reference/camera_fit_{projection}_f{f:.0f}_p{prior}_cy{pp[1]:.0f}'+('_nodist' if nodist else '')+'.json')).write_text(json.dumps(result,indent=2)) +print(json.dumps({k:v for k,v in result.items() if k not in ['rotation_vectors','depth_in_total_travel_units','track_ids']},indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_crosswalks.py b/astra_scene_test/Scene_04/scripts/fit_crosswalks.py new file mode 100644 index 0000000000000000000000000000000000000000..6151d10cc79b0f9aa3200bd92cafd5c0a3e657fc --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_crosswalks.py @@ -0,0 +1,35 @@ +"""Editable paint-strip footprints from the ending view and measured ground plane. +Only annotated coordinates are used, never source pixels in the scene. +""" +from pathlib import Path +import json,sys,numpy as np +from PIL import Image,ImageDraw +ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import camera,project,f,pp +from road_surface import ground_height +plane=json.loads((ROOT/'reference/intersection_plane_fit.json').read_text())['coefficients'];a,b,c=plane +C,R=camera(128) +def on_plane(uv): + d=R.T@np.r_[(np.array(uv)-pp)/f,1];t=(a*C[0]+b*C[1]+c-C[2])/(d[2]-a*d[0]-b*d[1]);return C+d*t +# Near and far crossing edges, observed through the wet glass. Extremities +# outside the frame are extrapolated along the visible stripe direction. +obs={'right':[[928,573],[1098,556],[1360,591],[1202,622]],'left':[[-100,632],[-150,595],[151,577],[218,586]]} +out={} +for side,uv in obs.items(): + q=np.array([on_plane(p) for p in uv]);n=9 + # A pair of straight 3D edges preserves one continuous crossing in all frames. + strips=[] + for j in range(n): + t0=(j+.1)/n;t1=(j+.59)/n + pts=[q[0]*(1-t0)+q[3]*t0,q[1]*(1-t0)+q[2]*t0,q[1]*(1-t1)+q[2]*t1,q[0]*(1-t1)+q[3]*t1] + strips.append([[float(p[0]),float(p[1]),.014] for p in pts]) + out[side]={'observed_end_bounds':uv,'plane_world_bounds':q.tolist(),'strips':strips} +(ROOT/'assets/crosswalks.json').write_text(json.dumps(out,indent=2)) +for fr in [65,97,113,128]: + im=Image.open(ROOT/f'reference/frames/{fr:04d}.png');draw=ImageDraw.Draw(im) + for side,d in out.items(): + for strip in d['strips']: + pts=[project([x,y,ground_height(y,x)+z],fr) for x,y,z in strip] + draw.line([tuple(p) for p in pts+[pts[0]]],fill=(255,160,20),width=1) + im.save(ROOT/f'reference/crops/crosswalk_layout_{fr:04d}.png') +print(json.dumps({k:v['plane_world_bounds'] for k,v in out.items()},indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_distant_traffic.py b/astra_scene_test/Scene_04/scripts/fit_distant_traffic.py new file mode 100644 index 0000000000000000000000000000000000000000..dff4904aac98dca4d0688e14c0d4d2c4db86817c --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_distant_traffic.py @@ -0,0 +1,25 @@ +"""Compare stationary and constant-speed explanations for three light tracks.""" +from pathlib import Path +import json,math,numpy as np +from scipy.spatial.transform import Rotation +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1];P=json.loads((ROOT/'assets/config.json').read_text());M=json.loads((ROOT/'assets/camera_motion.json').read_text());T=np.load(ROOT/'reference/feature_tracks.npz')['tracks'] +p,y=map(math.radians,[P['pitch'],P['yaw']]);B=np.array([[math.cos(y),math.sin(y)*math.sin(p),math.sin(y)*math.cos(p)],[-math.sin(y),math.cos(y)*math.sin(p),math.cos(y)*math.cos(p)],[0,-math.cos(p),math.sin(p)]]) +f=M['focal_pixels'];pp=np.array(M['principal_point']);d=np.r_[(np.array(M['epipole'])-pp)/f,1];d*=P['travel']/np.linalg.norm(d) +def ground(y):return 0 if y<=44 else (-.085*(y-44)**2/32 if y<60 else -.085*(y-52)) +def project(a,fr): + x,y,velocity=a;yy=y+velocity*(fr-1)/30;pos=np.array([x,yy,ground(yy)+1.15]) + t=np.interp(fr,M['frames'],M['displacement_fraction']);r=np.array([np.interp(fr,M['frames'],np.array(M['rotation_vectors'])[:,i]) for i in range(3)]) + R=Rotation.from_rotvec(r).as_matrix();C=B@d*t+[0,0,P['camera_height']];q=R@B.T@(pos-C);return q[:2]/q[2]*f+pp +out={} +for idx in [8,33,60]: + obs={fr:T[idx,fr-1] for fr in range(1,129,4) if np.isfinite(T[idx,fr-1]).all()} + def residual(a):return np.concatenate([project(a,fr)-uv for fr,uv in obs.items()]) + fixed=least_squares(lambda a:residual([*a,0]),[-5,140],bounds=([-35,60],[15,450]),loss='soft_l1',f_scale=2) + moving=least_squares(lambda a:np.r_[residual(a),a[2]*.25],[*fixed.x,0],bounds=([-35,60,-15],[15,450,4]),loss='soft_l1',f_scale=2) + ef=float(np.mean(np.linalg.norm(residual([*fixed.x,0]).reshape(-1,2),axis=1)));em=float(np.mean(np.linalg.norm(residual(moving.x).reshape(-1,2),axis=1))) + chosen=moving.x if ef-em>1.5 else np.r_[fixed.x,0] + out[str(idx)]={'stationary_mean_error_pixels':ef,'moving_mean_error_pixels':em,'chosen_x_y_velocity':chosen.tolist(),'moving_trial':moving.x.tolist(), + 'observations':{fr:uv.tolist() for fr,uv in obs.items()},'predictions':{fr:project(chosen,fr).tolist() for fr in obs}} +(ROOT/'assets/distant_traffic_fit.json').write_text(json.dumps(out,indent=2)) +for idx,q in out.items():print(idx,q['chosen_x_y_velocity'],'stationary',q['stationary_mean_error_pixels'],'moving',q['moving_mean_error_pixels']) diff --git a/astra_scene_test/Scene_04/scripts/fit_near_vehicles.py b/astra_scene_test/Scene_04/scripts/fit_near_vehicles.py new file mode 100644 index 0000000000000000000000000000000000000000..614912c55591997e76c51fda40685a9e0b061731 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_near_vehicles.py @@ -0,0 +1,36 @@ +"""Joint wheel/roof fits for the near parked vehicles, with camera held fixed. +Manual observations refer to reference/crops/near_car_coordinates_*.png. +These are image-space reconstructions; monocular metric dimensions are ambiguous. +""" +from pathlib import Path +import sys,json,math,numpy as np +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import project +DATA={ + 'Left black SUV':{ + 'observations':{'front_wheel':{1:[242,583],17:[114,599]},'rear_wheel':{1:[309,570],17:[217,580],33:[69,602]}, + 'roof_front':{1:[245,522],17:[147,522]},'roof_rear':{1:[306,516],17:[206,517],33:[65,521]}}, + 'coords':{'front_wheel':[1.035,-1.47,.44],'rear_wheel':[1.035,1.44,.44],'roof_front':[.726,-.76,1.95],'roof_rear':[.726,.98,1.95]}, + 'initial':[-12.2,13.3,1.35,1.35,1.35,0,0,0]}, + 'Left red sedan':{ + 'observations':{'front_wheel':{1:[377,559],17:[289,580],33:[188,591]},'rear_wheel':{1:[410,553],17:[334,565],33:[257,576]}, + 'roof_front':{1:[376,526],17:[292,529],33:[203,534]},'roof_rear':{1:[404,523],17:[323,528],33:[238,530]}}, + 'coords':{'front_wheel':[.98,-1.47,.44],'rear_wheel':[.98,1.44,.44],'roof_front':[.684,-.76,1.49],'roof_rear':[.684,.98,1.49]}, + 'initial':[-11.5,18,1.4,1.4,1.4,0,0,0]}} +OUT={} +for name,v in DATA.items(): + def point(a,key): + x,y,sx,sy,sz,yaw,pitch,z=a;xx,yy,zz=np.array(v['coords'][key])*[sx,sy,sz] + yy,zz=yy*math.cos(pitch)-zz*math.sin(pitch),yy*math.sin(pitch)+zz*math.cos(pitch) + return np.array([x+xx*math.cos(yaw)-yy*math.sin(yaw),y+xx*math.sin(yaw)+yy*math.cos(yaw),z+zz]) + def residual(a): + res=[] + for key,frames in v['observations'].items(): + for fr,uv in frames.items():res.extend(project(point(a,key),fr)-uv) + res.extend([(a[2]-1.35)*5,a[6]*12,a[7]*8]) + return res + fit=least_squares(residual,v['initial'],bounds=([-18,9,.9,.6,.8,-.6,-.1,-.3],[-7,23,1.9,2.1,1.9,.6,.1,.3]),loss='soft_l1',f_scale=3) + OUT[name]={'parameters':dict(zip(['x','y','scale_x','scale_y','scale_z','yaw','pitch','z'],fit.x.tolist())), + 'observations':v['observations'],'predictions':{key:{fr:project(point(fit.x,key),fr).tolist() for fr in frames} for key,frames in v['observations'].items()},'cost':fit.cost} +(ROOT/'assets/near_vehicle_landmarks.json').write_text(json.dumps(OUT,indent=2));print(json.dumps(OUT,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_opening_hatch.py b/astra_scene_test/Scene_04/scripts/fit_opening_hatch.py new file mode 100644 index 0000000000000000000000000000000000000000..c88df03679bd8acf1a6f3c12f9a4b44436b103b9 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_opening_hatch.py @@ -0,0 +1,32 @@ +"""Fit the cropped opening hatchback to three measured views, camera fixed. + +The rear wheel is partly obscured by wet glass. These manually placed features +are approximate, and are retained with their residuals for review. +""" +import json, math, pathlib, sys +import numpy as np +from scipy.optimize import least_squares +ROOT=pathlib.Path(__file__).resolve().parents[1] +sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import project +observations={ + 'rear_wheel':{1:[124,603],5:[89,610],9:[53,616]}, + 'roof_rear':{1:[104,542],5:[69,543],9:[33,545]}, + 'rear_bumper':{1:[145,601],5:[109,607],9:[75,615]}, + 'rear_glass_corner':{1:[131,560],5:[97,563],9:[63,568]}} +local={'rear_wheel':[.98,1.44,.44], 'roof_rear':[.684,1.10,1.70], + 'rear_bumper':[.86,2.15,.65], 'rear_glass_corner':[.80,1.87,1.30]} +def point(a,key): + x,y,sx,sy,sz,yaw=a + xx,yy,zz=np.array(local[key])*[sx,sy,sz] + return [x+xx*math.cos(yaw)-yy*math.sin(yaw),y+xx*math.sin(yaw)+yy*math.cos(yaw),zz-.066*sz] +def residual(a): + return np.r_[np.concatenate([project(point(a,key),fr)-uv for key,rows in observations.items() for fr,uv in rows.items()]), + (a[2]-1.45)*3,(a[3]-1.1)*2,a[5]*2] +fit=least_squares(residual,[-15,8,1.45,1.1,1.5,0],bounds=([-24,2,.8,.6,.8,-.8],[-9,14,2,1.9,2,.8]),loss='soft_l1',f_scale=3) +out={'parameters':dict(zip(['x','y','scale_x','scale_y','scale_z','yaw'],fit.x.tolist())), + 'tire_contact_z':-.066*float(fit.x[4]),'local_features':local,'observations':observations, + 'predictions':{key:{fr:project(point(fit.x,key),fr).tolist() for fr in rows} for key,rows in observations.items()}, + 'cost':float(fit.cost),'note':__doc__} +(ROOT/'assets/opening_hatch.json').write_text(json.dumps(out,indent=2)) +print(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_signal_emitters.py b/astra_scene_test/Scene_04/scripts/fit_signal_emitters.py new file mode 100644 index 0000000000000000000000000000000000000000..8f64bfe7c0f8526c8bbc10679dd942c3c7828e61 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_signal_emitters.py @@ -0,0 +1,12 @@ +"""Fit the visible green light centers, rather than a housing corner.""" +from pathlib import Path +import json,sys,numpy as np +ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import triangulate,project +tracks=json.loads((ROOT/'reference/source_signal_tracks.json').read_text());out={} +for side,key in [('left','left_near_signal'),('right','right_far_signal')]: + obs={int(fr):uv for fr,uv in tracks[side].items() if uv is not None};q=triangulate(obs) + errors=[float(np.linalg.norm(project(q,fr)-uv)) for fr,uv in obs.items()] + out[key]={'emitter_xyz':q.tolist(),'housing_anchor_xyz':(q+np.array([0,.19,0])).tolist(),'median_error_pixels':float(np.median(errors)),'p90_error_pixels':float(np.percentile(errors,90)),'observations':obs} +(ROOT/'assets/signal_emitters.json').write_text(json.dumps(out,indent=2)) +print(json.dumps({k:{a:b for a,b in v.items() if a!='observations'} for k,v in out.items()},indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_signs.py b/astra_scene_test/Scene_04/scripts/fit_signs.py new file mode 100644 index 0000000000000000000000000000000000000000..fc5b5734aad6de5663b5b669b40f0d78fb04fc53 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_signs.py @@ -0,0 +1,23 @@ +"""Fit the opening sign rectangles on their 3D mounting plane.""" +from pathlib import Path +import json,math,numpy as np +from scipy.optimize import least_squares +R=Path(__file__).resolve().parents[1];P=json.loads((R/'assets/config.json').read_text());M=json.loads((R/'assets/camera_motion.json').read_text()) +p,y=map(math.radians,[P['pitch'],P['yaw']]);f=M['focal_pixels'];pp=np.array(M['principal_point']) +B=np.array([[math.cos(y),math.sin(y)*math.sin(p),math.sin(y)*math.cos(p)],[-math.sin(y),math.cos(y)*math.sin(p),math.cos(y)*math.cos(p)],[0,-math.cos(p),math.sin(p)]]) +def project(q):q=B.T@(np.array(q)-[0,0,P['camera_height']]);return q[:2]/q[2]*f+pp +specs={'park':{'x':17.97,'target':[[1056,298],[1118,270],[1130,340],[1067,367]],'guess':[12,9,1.8,2.7]}, + 'park_vertical':{'x':15.5,'target':[[981,334],[996,330],[1010,394],[998,402]],'guess':[13,9,.6,3]}, + 'training':{'x':-28.25,'target':[[214,442],[294,463],[294,492],[211,470]],'guess':[30,7,7,2]}, + 'hair':{'x':-27.1,'target':[[303,466],[347,480],[348,501],[303,488]],'guess':[36,7,6,2]}} +out={} +for name,s in specs.items(): + def corners(a): + yy,z,w,h=a;sign=1 if s['x']>0 else -1 + return [(s['x'],yy+sign*w/2,z+h/2),(s['x'],yy-sign*w/2,z+h/2),(s['x'],yy-sign*w/2,z-h/2),(s['x'],yy+sign*w/2,z-h/2)] + def residual(a):return (np.array([project(c) for c in corners(a)])-s['target']).ravel() + fit=least_squares(residual,s['guess'],bounds=([2,1,.1,.1],[40,15,12,5])) + out[name]={'x':s['x'],'y':fit.x[0],'z':fit.x[1],'width':fit.x[2],'height':fit.x[3], + 'target_corners':s['target'],'projected_corners':[project(q).tolist() for q in corners(fit.x)],'rms_pixels':float(np.sqrt(np.mean(fit.fun**2)))} +(R/'assets/signs_fit.json').write_text(json.dumps(out,indent=2)) +for n,s in out.items():print(n,{k:round(v,3) for k,v in s.items() if isinstance(v,float)}) diff --git a/astra_scene_test/Scene_04/scripts/fit_sky_series.py b/astra_scene_test/Scene_04/scripts/fit_sky_series.py new file mode 100644 index 0000000000000000000000000000000000000000..2dd382bfce73814cb79ea73519e84a70d3f2ca41 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_sky_series.py @@ -0,0 +1,21 @@ +"""Calibrate a smooth sky appearance response from numeric mean-color measurements.""" +from pathlib import Path +import json,os,numpy as np +os.environ['OPENCV_IO_ENABLE_OPENEXR']='1' +import cv2 +ROOT=Path(__file__).resolve().parents[1];cv2.setNumThreads(1) +P=json.loads((ROOT/'assets/config.json').read_text()) +fit=json.loads((ROOT/'reference/sky_probe_layered_response_fit.json').read_text()) +anchors=[1,65,128];z=np.array([fit[str(f)]['zero_linear'] for f in anchors]);c=np.array([(np.array(fit[str(f)]['original_linear'])-fit[str(f)]['zero_linear'])/fit[str(f)]['old_control'] for f in anchors]) +def inverse_view(rgb): + v=rgb**P.get('gamma',1.0);return np.where(v<=.04045,v/12.92,((v+.055)/1.055)**2.4)/2**P['exposure'] +measure=[] +for fr in range(1,129): + im=cv2.imread(str(ROOT/f'reference/frames/{fr:04d}.png'))[30:210,550:700,::-1]/255;measure.append(im.mean((0,1))) +controls={};records=[] +for fr in [1,17,33,49,65,81,97,113,128]: + target=inverse_view(np.mean(measure[max(0,fr-3):min(128,fr+2)],axis=0)) + floor=np.array([np.interp(fr,anchors,z[:,j]) for j in range(3)]);coefficient=np.array([np.interp(fr,anchors,c[:,j]) for j in range(3)]) + gain=np.maximum(.01,(target-floor)/coefficient);controls[str(fr)]=gain.tolist();records.append({'frame':fr,'target_linear':target.tolist(),'control':gain.tolist()}) +(ROOT/'reference/sky_series_fit.json').write_text(json.dumps({'controls':controls,'measurements_srgb':np.array(measure).tolist(),'fit':records,'note':'Camera-visible background response only. Lighting world remains constant. Coefficients inferred from separated layer-scatter/background crops.'},indent=2)) +print(json.dumps(controls,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_suv_landmarks.py b/astra_scene_test/Scene_04/scripts/fit_suv_landmarks.py new file mode 100644 index 0000000000000000000000000000000000000000..7af0a22a1ad860bbae30f8f29abe9e9722d7f520 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_suv_landmarks.py @@ -0,0 +1,23 @@ +"""Fit SUV wheel and roof landmarks, keeping the camera trajectory fixed.""" +from pathlib import Path +import json,sys,math,numpy as np +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from camera_math import project,triangulate +obs={'front_wheel':{1:[469,554],33:[378,567],65:[132,623]},'rear_wheel':{1:[488,545],33:[425,555],65:[261,594]}, + 'roof_front':{1:[465,516],33:[379,508],65:[172,512]},'roof_rear':{1:[483,518],33:[410,510],65:[241,516]}} +coords={'front_wheel':[1.035,-1.47,.44],'rear_wheel':[1.035,1.44,.44],'roof_front':[.726,-.76,1.95],'roof_rear':[.726,.98,1.95]} +def point(a,key): + x,y,sx,sy,sz,yaw,pitch,z=a;xx,yy,zz=np.array(coords[key])*[sx,sy,sz] + yy,zz=yy*math.cos(pitch)-zz*math.sin(pitch),yy*math.sin(pitch)+zz*math.cos(pitch) + return np.array([x+xx*math.cos(yaw)-yy*math.sin(yaw),y+xx*math.sin(yaw)+yy*math.cos(yaw),z+zz]) +def residual(a): + res=[] + for key,frames in obs.items(): + q=point(a,key) + for fr,uv in frames.items():res.extend((project(q,fr)-uv)*(.65 if fr==1 else 1)) + res.extend([(a[2]-1.45)*3,a[6]*10,a[7]*5]) + return res +fit=least_squares(residual,[-10.8,23.7,1.57,1.35,1.456,0,0,0],bounds=([-15,19,1,.65,1,-.7,-.15,-.3],[-7,32,2,2.1,1.9,.7,.15,.4]),loss='soft_l1',f_scale=3) +out={'parameters':dict(zip(['x','y','scale_x','scale_y','scale_z','yaw','pitch','z'],fit.x.tolist())),'observations':obs,'predictions':{key:{fr:project(point(fit.x,key),fr).tolist() for fr in frames} for key,frames in obs.items()},'cost':fit.cost,'triangulated':{key:triangulate(frames).tolist() for key,frames in obs.items()}} +(ROOT/'assets/white_suv_landmarks.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_tower.py b/astra_scene_test/Scene_04/scripts/fit_tower.py new file mode 100644 index 0000000000000000000000000000000000000000..e78e95b3afe3b70f8ba495fa7dffa41e0450ba3e --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_tower.py @@ -0,0 +1,16 @@ +"""Fit a level tower roof and facade plane using its triangulated windows.""" +from pathlib import Path +import json,math,numpy as np +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1] +P=json.loads((ROOT/'assets/config.json').read_text());M=json.loads((ROOT/'assets/camera_motion.json').read_text());A=json.loads((ROOT/'assets/landmarks.json').read_text()) +pts=np.array([A[n]['xyz'] for n in ['tower_window_left','tower_window_right','tower_window_above']]) +slope,intercept=np.linalg.lstsq(np.c_[pts[:,0],np.ones(3)],pts[:,1],rcond=None)[0] +p,y=map(math.radians,[P['pitch'],P['yaw']]);B=np.array([[math.cos(y),math.sin(y)*math.sin(p),math.sin(y)*math.cos(p)],[-math.sin(y),math.cos(y)*math.sin(p),math.cos(y)*math.cos(p)],[0,-math.cos(p),math.sin(p)]]) +f=M['focal_pixels'];pp=np.array(M['principal_point']);targets=np.array([[307,115],[478,85]]) +def project(q): + q=B.T@(np.array(q)-[0,0,P['camera_height']]);return q[:2]/q[2]*f+pp +def corners(a):return [(x,slope*x+intercept,a[2]) for x in a[:2]] +fit=least_squares(lambda a:(np.array([project(q) for q in corners(a)])-targets).ravel(),[-76,-31,98]) +out={'left':corners(fit.x)[0],'right':corners(fit.x)[1],'height':fit.x[2],'plane_slope':slope,'plane_intercept':intercept,'target_roof_pixels':targets.tolist(),'fitted_roof_pixels':[project(q).tolist() for q in corners(fit.x)]} +(ROOT/'assets/tower_fit.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/fit_vehicles.py b/astra_scene_test/Scene_04/scripts/fit_vehicles.py new file mode 100644 index 0000000000000000000000000000000000000000..94961e9951d0079af0939a8e8d1d37a8ee462b19 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/fit_vehicles.py @@ -0,0 +1,27 @@ +"""Fit a stationary SUV envelope across several source frames. + +Dimensions are scene units. The camera remains fixed to the independently +measured trajectory; this fit cannot absorb motion by moving the parked SUV. +""" +from pathlib import Path +import json,math,numpy as np +from scipy.spatial.transform import Rotation +from scipy.optimize import least_squares +ROOT=Path(__file__).resolve().parents[1];P=json.loads((ROOT/'assets/config.json').read_text());M=json.loads((ROOT/'assets/camera_motion.json').read_text()) +p,y=map(math.radians,[P['pitch'],P['yaw']]);B=np.array([[math.cos(y),math.sin(y)*math.sin(p),math.sin(y)*math.cos(p)],[-math.sin(y),math.cos(y)*math.sin(p),math.cos(y)*math.cos(p)],[0,-math.cos(p),math.sin(p)]]) +f=M['focal_pixels'];pp=np.array(M['principal_point']);d=np.r_[(np.array(M['epipole'])-pp)/f,1];d*=P['travel']/np.linalg.norm(d) +observations={1:[407,514,495,566],33:[277,505,437,585],65:[0,505,280,647]} +def envelope(a,fr): + x,y,w,length,h,angle=a;ca=math.cos(angle);sa=math.sin(angle);pts=[] + for xx in [-w/2,w/2]: + for yy in [-length/2,length/2]: + for z in [.16*h,.66*h]:pts.append([xx*ca-yy*sa+x,xx*sa+yy*ca+y,z]) + for yy in [-length*.16,length*.205]:pts.append([xx*.8*ca-yy*sa+x,xx*.8*sa+yy*ca+y,h]) + for yy in [-length*.306,length*.30]:pts.append([xx*ca-yy*sa+x,xx*sa+yy*ca+y,.02]) + t=np.interp(fr,M['frames'],M['displacement_fraction']);r=np.array([np.interp(fr,M['frames'],np.array(M['rotation_vectors'])[:,i]) for i in range(3)]) + R=Rotation.from_rotvec(r).as_matrix();C=B@d*t+[0,0,P['camera_height']] + q=(R@B.T@(np.array(pts)-C).T).T;uv=q[:,:2]/q[:,2:]*f+pp + lo=np.maximum(uv.min(0),[0,0]);hi=np.minimum(uv.max(0),[1280,720]);return np.r_[lo,hi] +fit=least_squares(lambda a:np.r_[np.concatenate([envelope(a,fr)-obs for fr,obs in observations.items()]),a[-1]*20],[-11.1,25.4,2.87,7.2,2.93,0],bounds=([-20,19,1.8,4.2,2.0,-.4],[-7,35,5,11,4.2,.4]),loss='soft_l1',f_scale=3) +out={'parameters':dict(zip(['x','y','width','length','height','angle'],fit.x.tolist())),'observations':observations,'predictions':{fr:envelope(fit.x,fr).tolist() for fr in observations},'residuals':fit.fun.tolist()} +(ROOT/'reference/white_suv_envelope_trial.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/gpu_health_probe.py b/astra_scene_test/Scene_04/scripts/gpu_health_probe.py new file mode 100644 index 0000000000000000000000000000000000000000..9e8950ee3f355913957f3ec0e70fd853202e77bd --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/gpu_health_probe.py @@ -0,0 +1,12 @@ +"""Tiny diagnostic render to distinguish a device-wide stall from scene cost.""" +import bpy,sys,pathlib,time +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from render_device import configure +S=bpy.context.scene;S.render.engine='CYCLES';print('DEVICE',configure(S),flush=True) +prefs=bpy.context.preferences.addons['cycles'].preferences +for p in prefs.bl_rna.properties: + if 'metal' in p.identifier:print('METAL_PREF',p.identifier,getattr(prefs,p.identifier),flush=True) +if hasattr(prefs,'metalrt'):prefs.metalrt='OFF' +S.render.resolution_x=64;S.render.resolution_y=64;S.render.resolution_percentage=100;S.cycles.samples=1;S.cycles.use_denoising=False +S.render.filepath=str(ROOT/'renders/gpu_health.png');start=time.monotonic();bpy.ops.render.render(write_still=True) +print('GPU_HEALTH_COMPLETE',time.monotonic()-start,flush=True) diff --git a/astra_scene_test/Scene_04/scripts/inspect_occlusion.py b/astra_scene_test/Scene_04/scripts/inspect_occlusion.py new file mode 100644 index 0000000000000000000000000000000000000000..bdc76f029f70b143770b0640fbd14302b16a007b --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/inspect_occlusion.py @@ -0,0 +1,15 @@ +"""Read-only camera-ray audit for the corner pub and source tree landmarks.""" +import bpy,json,pathlib +from mathutils import Vector +from bpy_extras.object_utils import world_to_camera_view +R=pathlib.Path(__file__).resolve().parents[1];s=bpy.context.scene;s.frame_set(128);bpy.context.view_layer.update();deps=bpy.context.evaluated_depsgraph_get();cam=s.camera +out=[] +for target in [(31.54,49.73,.23),(31.54,49.73,8),(26.6,51.84,3.55),(29.8,51.84,3.55),(33,51.84,3.55),(29.8,56.5,4)]: + q=Vector(target);screen=world_to_camera_view(s,cam,q);origin=cam.matrix_world.translation.copy();direction=(q-origin).normalized();hits=[] + for i in range(10): + ok,loc,normal,idx,ob,matrix=s.ray_cast(deps,origin,direction,distance=200) + if not ok:break + hits.append({'object':ob.name,'point':list(loc),'material':ob.data.materials[ob.data.polygons[idx].material_index].name if ob.type=='MESH' and idx0 + delta=n.new('ShaderNodeMath');delta.operation='SUBTRACT';l.new(maximum,delta.inputs[0]);delta.inputs[1].default_value=knee + positive=n.new('ShaderNodeMath');positive.operation='MAXIMUM';l.new(delta.outputs[0],positive.inputs[0]);positive.inputs[1].default_value=0 + denom=n.new('ShaderNodeMath');denom.operation='ADD';l.new(positive.outputs[0],denom.inputs[0]);denom.inputs[1].default_value=span + fraction=n.new('ShaderNodeMath');fraction.operation='DIVIDE';l.new(positive.outputs[0],fraction.inputs[0]);l.new(denom.outputs[0],fraction.inputs[1]) + scaled=n.new('ShaderNodeMath');scaled.operation='MULTIPLY';l.new(fraction.outputs[0],scaled.inputs[0]);scaled.inputs[1].default_value=span + mapped=n.new('ShaderNodeMath');mapped.operation='ADD';l.new(scaled.outputs[0],mapped.inputs[0]);mapped.inputs[1].default_value=knee + safe=n.new('ShaderNodeMath');safe.operation='MAXIMUM';l.new(maximum,safe.inputs[0]);safe.inputs[1].default_value=1e-6 + ratio=n.new('ShaderNodeMath');ratio.operation='DIVIDE';l.new(mapped.outputs[0],ratio.inputs[0]);l.new(safe.outputs[0],ratio.inputs[1]) + limit=n.new('ShaderNodeMath');limit.operation='MINIMUM';l.new(ratio.outputs[0],limit.inputs[0]);limit.inputs[1].default_value=1 + rolled=n.new('ShaderNodeVectorMath');rolled.operation='SCALE';rolled.label='Camera highlight shoulder preserving LED chroma';l.new(combined,rolled.inputs[0]);l.new(limit.outputs[0],rolled.inputs['Scale']);combined=rolled.outputs[0] + soft=n.new('CompositorNodeBlur');soft.location=(580,-80);soft.inputs['Size'].default_value=(parameters.get('optical_softness',1.6),)*2;soft.inputs['Type'].default_value='Gaussian';l.new(combined,soft.inputs['Image']) + final=mix(combined,soft.outputs['Image'],'MIX',parameters.get('softness_mix',.55),(790,220),'Subpixel optical softness') + mask=image_node('windshield_lower_defocus.png','Near windshield seal focus falloff',(680,-450),True) + lower=n.new('CompositorNodeBlur');lower.inputs['Size'].default_value=(6.0,6.0);lower.inputs['Type'].default_value='Gaussian';l.new(final,lower.inputs['Image']) + merged=mix(final,lower.outputs['Image'],'MIX',1,(980,220),'Near seal is outside the street focus plane') + l.new(mask.outputs['Image'],merged.node.inputs[0]) + if parameters.get('camera_balance'): + response=n.new('ShaderNodeVectorMath');response.operation='MULTIPLY';response.label='Measured gradual camera white-balance response';l.new(merged,response.inputs[0]) + for fr,rgb in parameters['camera_balance'].items(): + response.inputs[1].default_value=rgb;response.inputs[1].keyframe_insert('default_value',frame=int(fr)) + merged=response.outputs[0] + scene.frame_set(scene.frame_current) + if parameters.get('sensor_noise',0)>0: + coordinates=image_node('sensor_coordinates.png','Numeric sensor pixel coordinates',(650,-850),True) + ns=n.new('ShaderNodeVectorMath');ns.operation='SCALE';ns.inputs['Scale'].default_value=1280;l.new(coordinates.outputs['Image'],ns.inputs[0]) + grain=n.new('ShaderNodeTexWhiteNoise');grain.noise_dimensions='4D';grain.label='Deterministic frame-indexed sensor noise, separate from fixed rain';l.new(ns.outputs[0],grain.inputs['Vector']) + driver=grain.inputs['W'].driver_add('default_value');driver.driver.expression='404 + frame * 13.37' + center=n.new('ShaderNodeVectorMath');center.operation='SUBTRACT';center.inputs[1].default_value=(.5,.5,.5);l.new(grain.outputs['Color'],center.inputs[0]) + color=n.new('ShaderNodeVectorMath');color.operation='MULTIPLY';color.inputs[1].default_value=parameters.get('sensor_noise_color',(1.0,.85,1.1));l.new(center.outputs[0],color.inputs[0]) + grain_sum=color.outputs[0] + correlated=color.outputs[0] + if parameters.get('sensor_correlated'): + previous=n.new('ShaderNodeTexWhiteNoise');previous.noise_dimensions='4D';l.new(ns.outputs[0],previous.inputs['Vector']) + previous.inputs['W'].driver_add('default_value').driver.expression='404 + (frame - 1) * 13.37' + prevcenter=n.new('ShaderNodeVectorMath');prevcenter.operation='SUBTRACT';prevcenter.inputs[1].default_value=(.5,.5,.5);l.new(previous.outputs['Color'],prevcenter.inputs[0]) + prevcolor=n.new('ShaderNodeVectorMath');prevcolor.operation='MULTIPLY';prevcolor.inputs[1].default_value=tuple(.22*v for v in parameters.get('sensor_noise_color',(1.0,.85,1.1)));l.new(prevcenter.outputs[0],prevcolor.inputs[0]) + correlated=mix(correlated,prevcolor.outputs[0],'ADD',1,label='Measured modest interframe sensor correlation') + # The source's camera noise has measurable multi-pixel chroma patches. + # Correlate the same deterministic sensor field; the water map stays fixed. + for radius,gain in parameters.get('sensor_correlated',[]): + blurred=n.new('CompositorNodeBlur');blurred.inputs['Size'].default_value=(radius,radius);blurred.inputs['Type'].default_value='Gaussian' + l.new(correlated,blurred.inputs['Image']) + boost=n.new('ShaderNodeVectorMath');boost.operation='SCALE';boost.inputs['Scale'].default_value=gain;l.new(blurred.outputs['Image'],boost.inputs[0]) + grain_sum=mix(grain_sum,boost.outputs[0],'ADD',1,label='Spatially correlated low-light chroma noise') + lum=n.new('ShaderNodeVectorMath');lum.operation='DOT_PRODUCT';lum.inputs[1].default_value=(.2126,.7152,.0722);l.new(merged,lum.inputs[0]) + floor=n.new('ShaderNodeMath');floor.operation='MAXIMUM';floor.inputs[1].default_value=.004;l.new(lum.outputs['Value'],floor.inputs[0]) + shot=n.new('ShaderNodeMath');shot.operation='SQRT';l.new(floor.outputs[0],shot.inputs[0]) + amount=n.new('ShaderNodeMath');amount.operation='MULTIPLY';amount.inputs[1].default_value=parameters['sensor_noise'];l.new(shot.outputs[0],amount.inputs[0]) + amplitude=n.new('ShaderNodeVectorMath');amplitude.operation='SCALE';l.new(grain_sum,amplitude.inputs[0]);l.new(amount.outputs[0],amplitude.inputs['Scale']) + merged=mix(merged,amplitude.outputs[0],'ADD',1,(1130,220),'Low-light photon/read noise, calibrated from uniform source patches') + cropped=install_crop(scene,n,l,merged) + out=n.new('NodeGroupOutput');out.location=(1400,220);l.new(cropped,out.inputs['Image']) + scene['optics_note']='Fixed procedural water map; rendered-light-driven glare kernel; no source-video images or textures.' + return nt +if __name__=='__main__': + p=json.loads((ROOT/'assets/config.json').read_text());install_optics(bpy.context.scene,p) + bpy.ops.wm.save_as_mainfile(filepath=str(ROOT/'scene_04.blend')) diff --git a/astra_scene_test/Scene_04/scripts/install_signal_response.py b/astra_scene_test/Scene_04/scripts/install_signal_response.py new file mode 100644 index 0000000000000000000000000000000000000000..572eabe9ce6bc3ff56e5bc29ddde4c0c4d20e03c --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/install_signal_response.py @@ -0,0 +1,45 @@ +"""Smooth world-direction LED emission, with no time-dependent material keys. +Blender Geometry Incoming is a world-space direction toward the viewing point: +https://docs.blender.org/manual/en/5.2/render/shader_nodes/input/geometry.html +""" +import bpy,pathlib,json +from mathutils import Vector +ROOT=pathlib.Path(__file__).resolve().parents[1] +def install(scene): + config=json.loads((ROOT/'assets/signal_response.json').read_text()) + anchors=json.loads((ROOT/'assets/signal_emitters.json').read_text()) + bpy.context.view_layer.update() + lenses=[o for o in scene.objects if o.type=='MESH' and o.name.startswith('Green signal lens')] + glows=[o for o in scene.objects if o.type=='LIGHT' and o.name.startswith('Green signal local glow')] + records=[] + for key in ['left_near_signal','right_far_signal']: + p=config[key];target=Vector(anchors[key]['emitter_xyz']) + lens=min(lenses,key=lambda o:(o.matrix_world.translation-target).length) + assert (lens.matrix_world.translation-target).length<.01 + name='Measured angular LED response '+key + mat=bpy.data.materials.get(name) or bpy.data.materials.new(name) + mat.use_nodes=True;mat.diffuse_color=(*p['color'],1) + nt=mat.node_tree;nt.nodes.clear();n=nt.nodes;l=nt.links + surface=n.new('ShaderNodeBsdfPrincipled');surface.inputs['Base Color'].default_value=(*p['color'],1) + surface.inputs['Roughness'].default_value=.32;surface.inputs['Emission Color'].default_value=(*p['color'],1) + geometry=n.new('ShaderNodeNewGeometry') + dot=n.new('ShaderNodeVectorMath');dot.operation='DOT_PRODUCT';dot.inputs[1].default_value=(0,-1,0);l.new(geometry.outputs['Incoming'],dot.inputs[0]) + cosine=n.new('ShaderNodeMath');cosine.operation='ABSOLUTE';l.new(dot.outputs['Value'],cosine.inputs[0]) + deficit=n.new('ShaderNodeMath');deficit.operation='SUBTRACT';deficit.inputs[0].default_value=1;l.new(cosine.outputs[0],deficit.inputs[1]) + angle=n.new('ShaderNodeMath');angle.operation='MULTIPLY';angle.inputs[1].default_value=-p['sharpness'];l.new(deficit.outputs[0],angle.inputs[0]) + exp=n.new('ShaderNodeMath');exp.operation='EXPONENT';l.new(angle.outputs[0],exp.inputs[0]) + amplitude=n.new('ShaderNodeMath');amplitude.operation='MULTIPLY';amplitude.inputs[1].default_value=p['peak'];l.new(exp.outputs[0],amplitude.inputs[0]) + strength=n.new('ShaderNodeMath');strength.operation='ADD';strength.inputs[1].default_value=p['floor'];l.new(amplitude.outputs[0],strength.inputs[0]) + l.new(strength.outputs[0],surface.inputs['Emission Strength']) + output=n.new('ShaderNodeOutputMaterial');l.new(surface.outputs[0],output.inputs['Surface']) + if lens.data.users>1:lens.data=lens.data.copy() + lens.data.materials.clear();lens.data.materials.append(mat) + glow=min(glows,key=lambda o:(o.matrix_world.translation-target).length) + assert (glow.matrix_world.translation-target).length<.5;glow.data.energy=p['local_glow_watts'] + records.append({'anchor':key,'object':lens.name,'glow':glow.name,'parameters':p}) + scene['signal_response']=json.dumps(config) + print('ANGULAR_SIGNAL_RESPONSE_INSTALLED',json.dumps(records),flush=True) + return records +if __name__=='__main__': + install(bpy.context.scene) + bpy.ops.wm.save_as_mainfile(filepath=str(ROOT/'scene_04.blend')) diff --git a/astra_scene_test/Scene_04/scripts/layout_overlay.py b/astra_scene_test/Scene_04/scripts/layout_overlay.py new file mode 100644 index 0000000000000000000000000000000000000000..f7e9997c1f54eec545b91def3ec27edf3743a4b6 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/layout_overlay.py @@ -0,0 +1,27 @@ +"""Analytical wire overlays for quick geometry diagnosis before expensive renders.""" +import json,pathlib,math,numpy as np +from PIL import Image,ImageDraw +ROOT=pathlib.Path(__file__).resolve().parents[1];P=json.loads((ROOT/'assets/config.json').read_text()) +f=640/math.tan(math.radians(P['fov']/2));theta=math.radians(P['pitch']);yaw=math.radians(P['yaw']) +forward=np.array([math.sin(yaw)*math.cos(theta),math.cos(yaw)*math.cos(theta),math.sin(theta)]) +right=np.array([math.cos(yaw),-math.sin(yaw),0]);up=np.cross(right,forward) +def project(p,fr): + t=(fr-1)/127;cam=np.array([0,P['travel']*(.91*t+.09*t*t),P['camera_height']]);q=np.array(p)-cam;depth=q@forward + if depth<.2:return None + return (640+f*(q@right)/depth,360-f*(q@up)/depth) +def wire(d,name,bounds,color,fr): + a,b=bounds;points=[(x,y,z) for x in [a[0],b[0]] for y in [a[1],b[1]] for z in [a[2],b[2]]];p=[project(x,fr) for x in points] + for i in range(8): + for j in range(i+1,8): + if bin(i^j).count('1')==1 and p[i] and p[j]:d.line([p[i],p[j]],fill=color,width=2) + if p[7]:d.text(p[7],name,fill=color) +for fr in [1,65,128]: + im=Image.open(ROOT/f'reference/frames/{fr:04d}.png');d=ImageDraw.Draw(im) + wire(d,'Left brick',((-27.1,-13,0),(-14.1,21,23)),(240,90,50),fr) + wire(d,'Left tower',((-39.3,23,0),(-15.3,46,61)),(80,255,255),fr) + wire(d,'Right start',((14.1,-10,0),(26.1,9,24)),(255,180,100),fr) + wire(d,'Central tower',((14.1,98,0),(32.1,116,55)),(190,100,255),fr) + for y in [P['intersection'],P['intersection']+P['intersection_width']]: + a=project((-30,y,0),fr);b=project((30,y,0),fr) + if a and b:d.line([a,b],fill='yellow',width=2) + im.save(ROOT/f'reference/layout_overlay_{fr:04d}.jpg',quality=94) diff --git a/astra_scene_test/Scene_04/scripts/measure_appearance.py b/astra_scene_test/Scene_04/scripts/measure_appearance.py new file mode 100644 index 0000000000000000000000000000000000000000..4d75f93b2bdeb03f3d5c8fa7348e660c9f97893b --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/measure_appearance.py @@ -0,0 +1,42 @@ +"""Independent photometric comparison at identical decoded frame indices. + +These are diagnostic measurements, not a claim of whole-image fidelity. +No source image is ever written into a rendering asset. +""" +from pathlib import Path +import cv2,numpy as np,json,sys +cv2.setNumThreads(1) +ROOT=Path(__file__).resolve().parents[1];label=sys.argv[1] +regions={'sky':(545,55,800,245),'road':(450,585,780,660),'right_pavement':(1050,570,1220,615)} +lights={'left':{1:(500,441),33:(477,421),65:(444,407),97:(393,373),128:(300,325)}, + 'right':{1:(727,395),33:(752,355),65:(798,307),97:(886,185)}} +def analyze(im,frame): + result={'regions':{},'lights':{}} + lum=np.sum(im*np.array([.2126,.7152,.0722]),axis=2) + assert np.isfinite(lum).all() + for name,(x0,y0,x1,y1) in regions.items(): + a=im[y0:y1,x0:x1];g=lum[y0:y1,x0:x1] + result['regions'][name]={'mean_rgb':a.mean((0,1)).tolist(),'luma_std':float(g.std())} + yy,xx=np.mgrid[:720,:1280] + for name,obs in lights.items(): + if frame not in obs:continue + x,y=obs[frame];r=np.hypot(xx-x,yy-y);region=(r<100) + background=np.median(lum[(r>105)&(r<135)]) + energy=np.clip(lum-background-10,0,None)*region + total=energy.sum();radii=np.arange(5,101,5) + cumulative=[float(energy[r1 else ['renders/intersection_refined','renders/appearance_refined']): + for fr in [1,65,128]: + p=ROOT/label/f'{fr:04d}.png' + if not p.exists():continue + im=cv2.imread(str(p)).astype(np.float32)[:,:,::-1] + for name,(x0,y0,x1,y1) in regions.items(): + patch=im[y0:y1,x0:x1];high=patch-cv2.GaussianBlur(patch,(0,0),1.3) + rows.append({'label':label,'frame':fr,'region':name,'mean_rgb':patch.mean((0,1)).tolist(), + 'highpass_std_rgb':high.std((0,1)).tolist(),'highpass_mad_rgb':np.median(np.abs(high-np.median(high,(0,1))),axis=(0,1)).tolist()}) +(ROOT/'logs/noise_measurements.json').write_text(json.dumps(rows,indent=2)) +for r in rows:print(r) diff --git a/astra_scene_test/Scene_04/scripts/measure_signal_energy.py b/astra_scene_test/Scene_04/scripts/measure_signal_energy.py new file mode 100644 index 0000000000000000000000000000000000000000..a25fd6a264f85b6711c01ec2a5f864c9fed0d79e --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/measure_signal_energy.py @@ -0,0 +1,25 @@ +"""Measure localized green-signal appearance at independently tracked positions. +Diagnostics only: background foliage, refraction and saturation affect these +values, so they are not radiometric measurements or whole-image fidelity scores. +""" +from pathlib import Path +import sys,json,numpy as np +from PIL import Image +ROOT=Path(__file__).resolve().parents[1];label=sys.argv[1] +tracks=json.loads((ROOT/'reference/source_signal_tracks.json').read_text()) +yy,xx=np.mgrid[:720,:1280];rows=[] +for path in sorted((ROOT/'renders'/label).glob('[0-9][0-9][0-9][0-9].png')): + fr=int(path.stem) + images={k:np.asarray(Image.open(p).convert('RGB').resize((1280,720)),dtype=float) for k,p in [('source',ROOT/f'reference/frames/{fr:04d}.png'),('render',path)]} + for side in ['left','right']: + if str(fr) not in tracks[side]:continue + x,y=tracks[side][str(fr)];r=np.hypot(xx-x,yy-y);row={'frame':fr,'side':side} + for key,im in images.items(): + v=np.maximum(0,im[:,:,1]-(im[:,:,0]+im[:,:,2])*.5-12)*(r<32) + row[key]={'chroma_energy':float(v.sum()),'radius_pixels':float(np.sqrt((v*r*r).sum()/max(v.sum(),1e-5))), + 'inner_median_rgb':np.median(im[r<8],axis=0).tolist()} + rows.append(row) +(ROOT/f'logs/signal_energy_{label}.json').write_text(json.dumps(rows,indent=2)) +for row in rows: + if row['frame'] in [1,65,128]:print(json.dumps(row)) +print('SIGNAL_ENERGY_MEASURED',label,len(rows)) diff --git a/astra_scene_test/Scene_04/scripts/optical_assets.py b/astra_scene_test/Scene_04/scripts/optical_assets.py new file mode 100644 index 0000000000000000000000000000000000000000..af24c770855d90ec608897b7fc3911a2419d3f39 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/optical_assets.py @@ -0,0 +1,66 @@ +"""Deterministic windshield normal field and a light-spread kernel. + +These are synthetic optical functions, never sampled from the source video. +They remain fixed across frames; rendered world lights supply temporal variation. +""" +from pathlib import Path +import numpy as np,json +from PIL import Image +ROOT=Path(__file__).resolve().parents[1];rng=np.random.default_rng(404) +W,H=1280,720;factor=json.loads((ROOT/'assets/config.json').read_text()).get('optical_overscan',1) +px=round(W*(factor-1)/2);py=round(H*(factor-1)/2) +y,x=np.mgrid[-py:H+py,-px:W+px];height=np.zeros(y.shape,np.float32) +for i in range(240): + cx=rng.uniform(-30,W+30);cy=rng.uniform(-20,H+20) + a=rng.uniform(1.4,5.2);b=a*rng.uniform(1.1,2.5) + if i<25:a*=rng.uniform(2,4);b*=rng.uniform(2,4) + d=((x-cx)/a)**2+((y-cy)/b)**2 + height+=np.maximum(0,1-d)**1.7*rng.uniform(.35,1) +for cx,cy,a,b,ang,amp in [(53,120,95,23,-.9,.20),(704,274,76,30,.35,.25), + (998,222,21,86,.2,.13),(412,473,17,126,-.25,.2), + (807,376,64,88,.45,.13),(1173,62,38,95,-.8,.28), + (635,582,72,24,.2,.09)]: + u=(x-cx)*np.cos(ang)+(y-cy)*np.sin(ang);v=-(x-cx)*np.sin(ang)+(y-cy)*np.cos(ang) + d=(u/a)**2+(v/b)**2;height+=np.maximum(0,1-d)**1.8*amp +# Wind-driven water trails are continuous functions, not frame-random noise. +for j in range(55): + cx=rng.uniform(0,W);cy=rng.uniform(0,H);length=rng.uniform(15,90);wid=rng.uniform(.6,1.6) + center=cx+.07*(y-cy)+2*np.sin((y-cy)/35) + h=np.exp(-((x-center)/wid)**2)*np.clip(1-abs((y-cy)/length),0,1)**2 + height+=h*.05 +dy,dx=np.gradient(height) +normal=np.zeros((*height.shape,4),np.float32);normal[:,:,0]=.5+dx*1.7;normal[:,:,1]=.5-dy*1.7;normal[:,:,2]=.5;normal[:,:,3]=1 +Image.fromarray((np.clip(normal,0,1)*255).astype(np.uint8),'RGBA').save(ROOT/'assets/windshield_displacement.png') +Image.fromarray((np.clip(height,0,1)*255).astype(np.uint8)).save(ROOT/'assets/windshield_water_height.png') +zones=np.zeros(height.shape,np.float32)+.05 +for cx,cy,sx,sy,amp in [(395,350,150,150,.9),(775,280,180,155,.85),(1180,110,165,190,1.0),(60,80,140,160,.25)]: + zones+=amp*np.exp(-((x-cx)/sx)**2-((y-cy)/sy)**2) +zones*=np.clip((690-y)/140,0,1) +Image.fromarray((np.clip(zones,0,1)*255).astype(np.uint8)).save(ROOT/'assets/windshield_glare_zones.png') +left_split=1/(1+np.exp((x-640)/55)) +Image.fromarray((np.clip(zones*left_split,0,1)*255).astype(np.uint8)).save(ROOT/'assets/windshield_glare_left.png') +Image.fromarray((np.clip(zones*(1-left_split),0,1)*255).astype(np.uint8)).save(ROOT/'assets/windshield_glare_right.png') +# Asymmetric, low contrast droplet-caustic point spread kernel. +n=193;v,u=np.mgrid[-96:97,-96:97];r=np.sqrt(u*u+v*v) +k=.60*np.exp(-(r/24)**2)+.25*np.exp(-(r/58)**2) +for cx,cy,a,b,ang,amp in [(-20,16,29,41,.5,.045),(24,-18,28,47,-.8,.055),(6,33,26,16,.2,.025)]: + xx=(u-cx)*np.cos(ang)+(v-cy)*np.sin(ang);yy=-(u-cx)*np.sin(ang)+(v-cy)*np.cos(ang) + rr=np.sqrt((xx/a)**2+(yy/b)**2) + k+=amp*np.exp(-((rr-1)/.11)**2) +for angle,amp in [(.42,.24),(.45,.16),(.49,.10)]: + along=u*np.cos(angle)+v*np.sin(angle);across=-u*np.sin(angle)+v*np.cos(angle) + k+=amp*np.exp(-(across/1.5)**2)*np.exp(-(along/58)**4) +k*=np.clip((97-r)/15,0,1) +rgb=np.stack([k*.98,k,k*.93],axis=2);rgb/=rgb.max() +Image.fromarray((rgb*255).astype(np.uint8),'RGB').save(ROOT/'assets/wet_glass_psf.png') +Image.fromarray((rgb[::-1]*255).astype(np.uint8),'RGB').save(ROOT/'assets/wet_glass_psf_left.png') +# Pillow converts RGB16 PNGs to RGB8 on load. That quantizes this numeric grid +# into multi-pixel blocks and greatly amplifies the correlated sensor noise. +# Preserve all 16 bits when extending the previously calibrated coordinate map. +import cv2 +cv2.setNumThreads(1) +coordinates=cv2.imread(str(ROOT/'assets/sensor_coordinates_base.png'),cv2.IMREAD_UNCHANGED) +assert coordinates.shape==(720,1280,3) and coordinates.dtype==np.uint16 +extended=np.pad(coordinates,((py,py),(px,px),(0,0)),mode='edge') +assert cv2.imwrite(str(ROOT/'assets/sensor_coordinates.png'),extended) +print('OPTICAL_ASSETS_COMPLETE',height.shape) diff --git a/astra_scene_test/Scene_04/scripts/optics_variants.py b/astra_scene_test/Scene_04/scripts/optics_variants.py new file mode 100644 index 0000000000000000000000000000000000000000..ae72905b281c8f560cd5eb03f5853795d7bebd8c --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/optics_variants.py @@ -0,0 +1,57 @@ +"""Recompute lens/camera response from raw 3D scene renders, with no source input.""" +import bpy,pathlib,sys,json,re,time,hashlib +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from install_optics import install_optics +args=sys.argv[sys.argv.index('--')+1:] if '--' in sys.argv else [] +source=ROOT/(args[0] if args else 'renders/optics_probe/linear');label=args[1] if len(args)>1 else 'response' +S=bpy.context.scene +for o in list(bpy.data.objects): + if o.type!='CAMERA':bpy.data.objects.remove(o,do_unlink=True) +if not S.camera: + bpy.ops.object.camera_add();S.camera=bpy.context.object +S.render.engine='CYCLES';S.cycles.device='CPU';S.cycles.samples=1;S.cycles.use_denoising=False +S.render.threads_mode='FIXED';S.render.threads=2;S.render.use_motion_blur=False +S.render.resolution_x=1280;S.render.resolution_y=720;S.render.resolution_percentage=100 +S.render.image_settings.file_format='PNG';S.render.image_settings.color_mode='RGB' +if hasattr(S.render,'compositor_device'):S.render.compositor_device='CPU' +S.world.use_nodes=True;S.world.node_tree.nodes['Background'].inputs['Strength'].default_value=0 +P=json.loads((ROOT/'assets/config.json').read_text());records=[] +for path in sorted(source.glob('[0-9]*.exr')): + match=re.search(r'(\d{4})\D*\.exr$',path.name) + if not match:raise RuntimeError('Cannot identify frame in '+path.name) + fr=int(match.group(1)) + if 'anchors' in args and fr not in [1,65,128]:continue + S.frame_set(fr) + for name,glow,smear in ([('broad2',P['glow_strength'],P['smear_strength']),('broad5',P['glow_strength'],P['smear_strength']),('broad10',P['glow_strength'],P['smear_strength'])] if 'broad' in args else [('scatter035',.35,.05),('scatter100',1.,.05),('scatter200',2.,.05)] if 'scatter' in args else [('cap048',P['glow_strength'],P['smear_strength']),('cap060',P['glow_strength'],P['smear_strength']),('cap085',P['glow_strength'],P['smear_strength'])] if 'shoulder' in args else [('fog_low',1.0,.05),('fog_mid',2.0,.05),('fog_high',3.5,.05)] if 'fogtest' in args else [('wet_low',.35,.035),('wet_mid',.35,.05),('wet_high',.35,.07)] if 'wet' in args else [('current',P['glow_strength'],P['smear_strength'])] if 'current' in args else [('raw',0,0)] if 'raw' in args else [('low',.35,.22),('matched',.65,.45),('medium',1.1,.65)]): + params={**P,'glow_strength':glow,'smear_strength':smear} + if 'broad' in args:params['broad_scatter']={'broad2':2,'broad5':5,'broad10':10}[name] + if 'scatter' in args: + params['sensor_correlated']=[[5,8],[14,18]] + params['smear_region_gain']={**P['smear_region_gain'],'opening':2.5} + if 'shoulder' in args:params['highlight_ceiling']={'cap048':.48,'cap060':.60,'cap085':.85}[name] + if 'fogtest' in args:params['glow_size']={'fog_low':.70,'fog_mid':.74,'fog_high':.77}[name] + if 'sensor' in args:params['sensor_noise']=.012 + if 'balance' in args:params['camera_balance']={'1':[1,1,1],'33':[.96,1.13,1.43],'65':[.90,1.26,1.80],'97':[.72,1.09,1.60],'128':[.57,.84,1.31]} + nt=install_optics(S,params) + rl=next(n for n in nt.nodes if n.bl_idname=='CompositorNodeRLayers');targets=[link.to_socket for link in nt.links if link.from_node==rl] + im=bpy.data.images.load(str(path),check_existing=True);im.colorspace_settings.name='Linear Rec.709' + nd=nt.nodes.new('CompositorNodeImage');nd.image=im;nt.nodes.remove(rl) + for target in targets:nt.links.new(nd.outputs['Image'],target) + S.view_settings.view_transform='AgX';S.view_settings.look='AgX - Medium Low Contrast';S.view_settings.exposure=.7 + start=time.monotonic();bpy.ops.render.render() + variants=[('configured',P.get('view_transform','AgX'),P['look'],P['exposure'])] if 'configured' in args else [('agx','AgX','AgX - Medium Low Contrast',.7)] + if 'views' in args:variants += [('standard_00','Standard','None',0.0),('standard_025','Standard','None',.25),('standard_05','Standard','None',.5),('neutral_025','Khronos PBR Neutral','None',.25)] + if name=='matched':variants += [('standard_05','Standard','None',.5),('standard_10','Standard','None',1.0),('standard_15','Standard','None',1.5),('neutral_10','Khronos PBR Neutral','None',1.0)] + for view_name,view,look,ev in variants: + S.view_settings.view_transform=view;S.view_settings.look=look;S.view_settings.exposure=ev;S.view_settings.gamma=P.get('gamma',1.0) if view_name=='configured' else 1.0 + out=ROOT/'renders'/f'{label}_{name}_{view_name}';out.mkdir(parents=True,exist_ok=True);target=out/f'{fr:04d}.png' + bpy.data.images['Render Result'].save_render(str(target),scene=S) + records.append({'frame':fr,'label':out.name,'glow':glow,'smear':smear,'view':view,'exposure':ev,'sha256':hashlib.sha256(target.read_bytes()).hexdigest()}) + if view_name=='standard_05': + for gamma in [1.06,1.12]: + S.view_settings.gamma=gamma;extra=ROOT/'renders'/f'{label}_{name}_standard_05_gamma{str(gamma).replace(".","")}' + extra.mkdir(parents=True,exist_ok=True);bpy.data.images['Render Result'].save_render(str(extra/f'{fr:04d}.png'),scene=S) + S.view_settings.gamma=1.0 + print('OPTICS_VARIANTS',fr,name,'seconds',time.monotonic()-start,flush=True) +(ROOT/f'logs/{label}_variants.json').write_text(json.dumps(records,indent=2)) +print('OPTICS_VARIANTS_COMPLETE',len(records),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/overscan.py b/astra_scene_test/Scene_04/scripts/overscan.py new file mode 100644 index 0000000000000000000000000000000000000000..84dccbc986082c279741456233b821469d2db2c7 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/overscan.py @@ -0,0 +1,40 @@ +"""Render an optical margin while preserving the calibrated cropped projection.""" +import math +OUTPUT=(1280,720) +def fog_glow_size(value,factor): + """Preserve degrees per pixel in Blender 5.2's Spencer glare kernel. + + The Size socket maps to 180 - 170 * cuberoot(Size) degrees, rather than + scaling a blur radius directly. See Blender's node_composite_glare.cc, + compute_fog_glow_field_of_view(), and fog_glow_kernel.cc. + """ + field_of_view=180-170*max(0,min(1,value))**(1/3) + return max(0,min(1,((180-field_of_view*factor)/170)**3)) +def configure(scene,parameters): + factor=parameters.get('optical_overscan',1.0) + assert 1<=factor<=1.5 + width,height=[round(v*factor) for v in OUTPUT] + scene.render.resolution_x=width;scene.render.resolution_y=height + camera=scene.camera.data + camera.lens=18/math.tan(math.radians(parameters['fov']/2))/factor + camera.shift_y=parameters.get('shift_y',0)/factor + scene['optical_overscan']=factor;scene['output_resolution']=list(OUTPUT) + scene['optical_margin_px']=[(width-OUTPUT[0])//2,(height-OUTPUT[1])//2] + scene.render.save_output=factor<=1 + return scene['optical_margin_px'] +def install_crop(scene,nodes,links,source): + if scene.get('optical_overscan',1)<=1:return source + crop=nodes.new('CompositorNodeCrop');crop.name='SOURCE_FRAME_CROP' + crop.label='Crop optical margin to the source frame';crop.inputs['Alpha Crop'].default_value=False + x,y=scene['optical_margin_px'] + for key,value in [('X',x),('Y',y),('Width',1280),('Height',720)]: + socket=crop.inputs[key];socket.default_value=value + driver=socket.driver_add('default_value').driver;variable=driver.variables.new();variable.name='percentage' + variable.type='SINGLE_PROP';variable.targets[0].id_type='SCENE';variable.targets[0].id=scene + variable.targets[0].data_path='render.resolution_percentage';driver.expression=f'{value}*percentage/100' + links.new(source,crop.inputs['Image']) + file=nodes.new('CompositorNodeOutputFile');file.name='SOURCE_FRAME_OUTPUT' + file.label='Native 1280 by 720 sequence output';file.directory='//renders/final';file.file_name='' + file.format.media_type='IMAGE';file.format.file_format='PNG';file.format.color_mode='RGB';file.format.color_depth='8' + file.file_output_items.new('RGBA','####');links.new(crop.outputs['Image'],file.inputs['####']) + return crop.outputs['Image'] diff --git a/astra_scene_test/Scene_04/scripts/photographic_materials.py b/astra_scene_test/Scene_04/scripts/photographic_materials.py new file mode 100644 index 0000000000000000000000000000000000000000..9529406a90a1eb751e3d8661572cc00b83d7624f --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/photographic_materials.py @@ -0,0 +1,32 @@ +"""CC0 surface microstructure, with scene-calibrated color and roughness. +The maps describe physical materials; none contains reference-video imagery. +""" +import bpy,pathlib +ROOT=pathlib.Path(__file__).resolve().parents[1] +def install_material_maps(materials): + for key,asset,mean,tile in [('asphalt','asphalt_track',.0137373,4.0),('redbrick','brick_wall_09',.255972,2.0),('darkbrick','brick_wall_09',.255972,2.0),('tanbrick','brick_wall_09',.255972,2.0)]: + m=materials[key];n=m.node_tree.nodes;l=m.node_tree.links;p=n.get('Principled BSDF') + co=n.new('ShaderNodeTexCoord');scale=n.new('ShaderNodeVectorMath');scale.operation='SCALE';scale.inputs['Scale'].default_value=1/tile;l.new(co.outputs['UV'],scale.inputs[0]) + textures={} + for channel,ext in [('diff','jpg'),('rough','jpg'),('disp','png')]: + nd=n.new('ShaderNodeTexImage');nd.label='Poly Haven CC0 '+asset+' '+channel + im=bpy.data.images.load(str(ROOT/'assets/materials'/f'{asset}_{channel}_2k.{ext}'),check_existing=True) + im.colorspace_settings.name='sRGB' if channel=='diff' else 'Non-Color';im.pack();nd.image=im;nd.extension='REPEAT';l.new(scale.outputs[0],nd.inputs['Vector']);textures[channel]=nd + bw=n.new('ShaderNodeRGBToBW');l.new(textures['diff'].outputs['Color'],bw.inputs[0]) + normalize=n.new('ShaderNodeMath');normalize.operation='DIVIDE';normalize.inputs[1].default_value=mean;l.new(bw.outputs[0],normalize.inputs[0]) + cl=n.new('ShaderNodeClamp');cl.inputs['Min'].default_value=.35;cl.inputs['Max'].default_value=2.1;l.new(normalize.outputs[0],cl.inputs['Value']) + tint=n.new('ShaderNodeVectorMath');tint.operation='SCALE';tint.inputs[0].default_value=m.diffuse_color[:3];l.new(cl.outputs[0],tint.inputs['Scale']);l.new(tint.outputs[0],p.inputs['Base Color']) + # Broad wetness stays patchy but the aggregate breaks up each reflection. + bump=n.new('ShaderNodeBump');bump.inputs['Strength'].default_value=.65 if key=='asphalt' else .42;bump.inputs['Distance'].default_value=.026 if key=='asphalt' else .025 + l.new(textures['disp'].outputs['Color'],bump.inputs['Height']);l.new(bump.outputs[0],p.inputs['Normal']) + if key!='asphalt': + rough=n.new('ShaderNodeMapRange');rough.inputs['To Min'].default_value=.52;rough.inputs['To Max'].default_value=.82;l.new(textures['rough'].outputs['Color'],rough.inputs['Value']);l.new(rough.outputs[0],p.inputs['Roughness']) + m['source']='https://polyhaven.com/a/'+asset;m['license']='CC0' +def add_surface_uv(mesh): + uv=mesh.uv_layers.new(name='Physical surface coordinates') + for poly in mesh.polygons: + normal=poly.normal;axis=max(range(3),key=lambda i:abs(normal[i])) + axes=(1,2) if axis==0 else ((0,2) if axis==1 else (0,1)) + for loop in poly.loop_indices: + pt=mesh.vertices[mesh.loops[loop].vertex_index].co + uv.data[loop].uv=(pt[axes[0]],pt[axes[1]]) diff --git a/astra_scene_test/Scene_04/scripts/probe_compositor.py b/astra_scene_test/Scene_04/scripts/probe_compositor.py new file mode 100644 index 0000000000000000000000000000000000000000..b30b65df4cf1eb667b6e6a92278bee6d6a9b54c9 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_compositor.py @@ -0,0 +1,8 @@ +import bpy +g=bpy.data.node_groups.new('Compositor API probe','CompositorNodeTree') +for k in ['ShaderNodeMix','CompositorNodeMix','CompositorNodeColorBalance','CompositorNodeLensdist','ShaderNodeMath','CompositorNodeMath','ShaderNodeVectorMath','CompositorNodeImage','CompositorNodeComposite','NodeGroupOutput']: + try: + n=g.nodes.new(k) + print(k,'inputs',[(i.name,i.bl_idname,str(getattr(i,'default_value',None))) for i in n.inputs], + 'properties',[(p.identifier,p.type) for p in n.bl_rna.properties if p.identifier not in ['inputs','outputs']],flush=True) + except Exception as e:print(k,str(e),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/probe_grain.py b/astra_scene_test/Scene_04/scripts/probe_grain.py new file mode 100644 index 0000000000000000000000000000000000000000..762b5e70820f202464bac2e80f151b2f689a841b --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_grain.py @@ -0,0 +1,6 @@ +import bpy +nt=bpy.data.node_groups.new('Sensor grain API investigation','CompositorNodeTree') +for kind in ['CompositorNodeTexture','ShaderNodeTexNoise','ShaderNodeTexWhiteNoise','CompositorNodeInputPosition','ShaderNodeTexCoord','CompositorNodeInputSceneTime']: + try: + n=nt.nodes.new(kind);print(kind,[(s.name,s.bl_idname,str(getattr(s,'default_value',None))) for s in n.inputs],[(s.name,s.bl_idname) for s in n.outputs],flush=True) + except Exception as e:print(kind,type(e).__name__,str(e),flush=True) diff --git a/astra_scene_test/Scene_04/scripts/probe_output.py b/astra_scene_test/Scene_04/scripts/probe_output.py new file mode 100644 index 0000000000000000000000000000000000000000..9b9e9b147a89f6c651d1dde1445e10ba347e5b0d --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_output.py @@ -0,0 +1,15 @@ +import bpy +S=bpy.context.scene +nt=S.compositing_node_group +if nt is None:nt=bpy.data.node_groups.new('Output probe','CompositorNodeTree');S.compositing_node_group=nt +n=nt.nodes.new('CompositorNodeOutputFile') +for p in n.bl_rna.properties: + if p.identifier not in {'rna_type','id_data'}: + print(p.identifier,p.type,str(getattr(n,p.identifier,''))[:500],flush=True) +print('INPUTS',[(i.name,i.bl_idname) for i in n.inputs],flush=True) +if hasattr(n,'file_output_items'): + print('ITEMS',[(p.identifier,p.type) for p in n.file_output_items.bl_rna.properties],flush=True) + print('METHODS',[(f.identifier,[p.identifier for p in f.parameters]) for f in n.file_output_items.bl_rna.functions],flush=True) +print('VIEW_TRANSFORMS',[(i.identifier,i.name) for i in S.view_settings.bl_rna.properties['view_transform'].enum_items],flush=True) +for p in n.format.bl_rna.properties: + if p.identifier!='rna_type':print('FORMAT',p.identifier,p.type,str(getattr(n.format,p.identifier,''))[:300],flush=True) diff --git a/astra_scene_test/Scene_04/scripts/probe_overscan_crop.py b/astra_scene_test/Scene_04/scripts/probe_overscan_crop.py new file mode 100644 index 0000000000000000000000000000000000000000..7f43bd2eaa3a959a63d909c95bf120f533f521dd --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_overscan_crop.py @@ -0,0 +1,21 @@ +"""Verify actual saved compositor dimensions using a synthetic solid image.""" +import bpy,pathlib +ROOT=pathlib.Path(__file__).resolve().parents[1];S=bpy.context.scene +S.render.engine='CYCLES';S.cycles.device='CPU';S.cycles.samples=1 +S.render.threads_mode='FIXED';S.render.threads=2 +S.render.resolution_x=2;S.render.resolution_y=2;S.render.resolution_percentage=100 +if hasattr(S.render,'compositor_device'):S.render.compositor_device='CPU' +S.use_nodes=True;nt=bpy.data.node_groups.new('Synthetic crop proof','CompositorNodeTree');S.compositing_node_group=nt +nt.interface.new_socket(name='Image',in_out='OUTPUT',socket_type='NodeSocketColor') +im=bpy.data.images.new('Synthetic solid calibration field',width=1600,height=900);im.generated_color=(.1,.4,.2,1) +n=nt.nodes.new('CompositorNodeImage');n.image=im +crop=nt.nodes.new('CompositorNodeCrop') +for k,v in [('X',160),('Y',90),('Width',1280),('Height',720),('Alpha Crop',False)]:crop.inputs[k].default_value=v +out=nt.nodes.new('NodeGroupOutput');nt.links.new(n.outputs['Image'],crop.inputs['Image']);nt.links.new(crop.outputs['Image'],out.inputs['Image']) +file=nt.nodes.new('CompositorNodeOutputFile');file.directory=str(ROOT/'renders/comparisons/crop_native_probe');file.file_name='' +file.format.media_type='IMAGE';file.format.file_format='PNG';file.format.color_depth='8';file.file_output_items.new('RGBA','####') +nt.links.new(crop.outputs['Image'],file.inputs['####']) +print('SYNTHETIC_IMAGE_SIZE',list(im.size),flush=True) +S.render.image_settings.file_format='PNG';S.render.filepath=str(ROOT/'renders/comparisons/overscan_crop_proof.png') +S.render.save_output=False;S.frame_set(5);bpy.ops.render.render(write_still=False) +print('OVERSCAN_CROP_PROOF_COMPLETE') diff --git a/astra_scene_test/Scene_04/scripts/probe_road_glint.py b/astra_scene_test/Scene_04/scripts/probe_road_glint.py new file mode 100644 index 0000000000000000000000000000000000000000..ce1c399c74d1aa1b2c4ae186903da21d1adc1ee9 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_road_glint.py @@ -0,0 +1,19 @@ +"""Native region light-transport diagnosis for the ending road highlight.""" +import bpy,pathlib,sys +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from render_settings import apply_quality +from render_device import configure +S=bpy.context.scene;S.frame_set(128);apply_quality(S,128,100);configure(S) +S.render.use_border=True;S.render.use_crop_to_border=True +S.render.border_min_x=860/1280;S.render.border_max_x=1010/1280;S.render.border_min_y=1-640/720;S.render.border_max_y=1-540/720 +S.render.use_compositing=False;S.render.use_motion_blur=False;S.render.image_settings.file_format='PNG' +P=bpy.data.materials['asphalt'].node_tree.nodes.get('Principled BSDF');nt=bpy.data.materials['asphalt'].node_tree +out=ROOT/'renders/road_glint_probe';out.mkdir(parents=True,exist_ok=True) +for name in ['original','no_caustics','rough','diffuse']: + if name=='no_caustics':S.cycles.caustics_reflective=False;S.cycles.caustics_refractive=False + if name=='rough': + for link in list(P.inputs['Roughness'].links):nt.links.remove(link) + P.inputs['Roughness'].default_value=.65;P.inputs['Coat Weight'].default_value=0 + if name=='diffuse':P.inputs['Specular IOR Level'].default_value=0;P.inputs['Metallic'].default_value=0 + S.render.filepath=str(out/(name+'.png'));bpy.ops.render.render(write_still=True);print('GLINT_PROBE',name,flush=True) +print('GLINT_PROBE_COMPLETE',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/probe_signal_local_lights.py b/astra_scene_test/Scene_04/scripts/probe_signal_local_lights.py new file mode 100644 index 0000000000000000000000000000000000000000..cdec07a777cf17c68798be10b2822a834f4809fb --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_signal_local_lights.py @@ -0,0 +1,15 @@ +"""Isolate non-geometric signal-light spill; never saves the loaded scene.""" +import bpy,pathlib,sys,json +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from render_settings import apply_quality +from render_device import configure +S=bpy.context.scene;apply_quality(S,96,100);configure(S) +changes=[] +for ob in S.objects: + if ob.type=='LIGHT' and ob.name.startswith('Green signal local glow'): + changes.append({'name':ob.name,'old_energy':ob.data.energy});ob.data.energy=0 +S.frame_set(65);S.render.image_settings.file_format='PNG' +folder=ROOT/'renders/signal_spill_probe';folder.mkdir(parents=True,exist_ok=True) +S.render.filepath=str(folder/'0065.png');bpy.ops.render.render(write_still=True) +(ROOT/'logs/signal_spill_probe.json').write_text(json.dumps({'frame':65,'samples':96,'changes':changes},indent=2)) +print('SIGNAL_SPILL_PROBE_COMPLETE') diff --git a/astra_scene_test/Scene_04/scripts/probe_sky.py b/astra_scene_test/Scene_04/scripts/probe_sky.py new file mode 100644 index 0000000000000000000000000000000000000000..88696403a52f8e7877f4015442c3898844d1ff9e --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/probe_sky.py @@ -0,0 +1,24 @@ +"""Separate the camera-visible sky and in-scattered radiance in small native crops.""" +import bpy,pathlib,sys,json,time +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from render_settings import apply_quality +from render_device import configure +S=bpy.context.scene;apply_quality(S,128,100);configure(S) +layered='layered' in sys.argv +if layered: + from atmosphere import install_atmosphere + install_atmosphere(json.loads((ROOT/'assets/config.json').read_text())) +S.render.use_border=True;S.render.use_crop_to_border=True +S.render.border_min_x=550/1280;S.render.border_max_x=700/1280 +S.render.border_min_y=1-210/720;S.render.border_max_y=1-30/720 +S.render.image_settings.file_format='OPEN_EXR';S.render.image_settings.color_depth='32' +S.render.use_compositing=False;S.render.use_motion_blur=False +sky=next(n for n in S.world.node_tree.nodes if n.label.startswith('Gradual calibrated')) +out=ROOT/('renders/sky_probe_layered' if layered else 'renders/sky_probe');out.mkdir(parents=True,exist_ok=True) +for fr in [1,65,128]: + S.frame_set(fr);strength=sky.inputs['Strength'].default_value + for label,value in [('zero',0),('original',strength)]: + sky.inputs['Strength'].default_value=value;S.render.filepath=str(out/f'{fr:04d}_{label}.exr');t=time.monotonic() + bpy.ops.render.render(write_still=True);print('SKY_PROBE',fr,label,time.monotonic()-t,flush=True) + sky.inputs['Strength'].default_value=strength +print('SKY_PROBE_COMPLETE',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/recompose_overscan.py b/astra_scene_test/Scene_04/scripts/recompose_overscan.py new file mode 100644 index 0000000000000000000000000000000000000000..031c9559f1e50fe78afc51f3c9492d0f4e2e093b --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/recompose_overscan.py @@ -0,0 +1,88 @@ +"""Trial optical response from raw scene radiance, preserving the native crop. + +Run in Blender with -- --source renders/overscan_review/linear --label opening +--frames 1,2,4,6 --opening-gains .5,1.0,1.5,2.5. Never saves the .blend. +""" +import argparse, copy, hashlib, json, pathlib, struct, sys, time +import bpy +ROOT = pathlib.Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / 'scripts')) +from install_optics import install_optics +p = argparse.ArgumentParser(description=__doc__) +p.add_argument('--source', required=True) +p.add_argument('--label', required=True) +p.add_argument('--frames', required=True) +p.add_argument('--opening-gains', default='2.5') +p.add_argument('--overrides', default='{}', help='JSON object of top-level optical parameter overrides') +a = p.parse_args(sys.argv[sys.argv.index('--') + 1:]) +assert a.label.replace('_', '').isalnum() +frames = [int(f) for f in a.frames.split(',')] +gains = [float(f) for f in a.opening_gains.split(',')] +assert all(1 <= fr <= 128 for fr in frames) and all(g >= 0 for g in gains) +S = bpy.context.scene +for obj in list(bpy.data.objects): + if obj != S.camera: + bpy.data.objects.remove(obj, do_unlink=True) +S.render.engine = 'CYCLES' +S.cycles.device = 'CPU' +S.cycles.samples = 1 +S.cycles.use_denoising = False +S.cycles.use_adaptive_sampling = False +S.render.threads_mode = 'FIXED' +S.render.threads = 2 +S.render.use_motion_blur = False +S.render.resolution_percentage = 100 +S.render.save_output = False +S.render.compositor_device = 'CPU' +S.world.use_nodes = True +S.world.node_tree.nodes.clear() +bg = S.world.node_tree.nodes.new('ShaderNodeBackground') +bg.inputs['Strength'].default_value = 0 +out = S.world.node_tree.nodes.new('ShaderNodeOutputWorld') +S.world.node_tree.links.new(bg.outputs[0], out.inputs[0]) +P = json.loads((ROOT / 'assets/config.json').read_text()) +P.update(json.loads(a.overrides)) +S.view_settings.view_transform = P['view_transform'] +S.view_settings.look = P['look'] +S.view_settings.exposure = P['exposure'] +S.view_settings.gamma = P['gamma'] +records = [] +for gain in gains: + params = copy.deepcopy(P) + params['smear_region_gain']['opening'] = gain + label = a.label + '_gain' + str(gain).replace('.', 'p') + folder = ROOT / 'renders' / label + folder.mkdir(parents=True, exist_ok=True) + for fr in frames: + source = ROOT / a.source / f'{fr:04d}_Raw.exr' + assert source.is_file(), str(source) + nt = install_optics(S, params) + raw = bpy.data.images.load(str(source), check_existing=False) + raw.colorspace_settings.name = 'Linear Rec.709' + assert tuple(raw.size) == (S.render.resolution_x, S.render.resolution_y) + rl = next(n for n in nt.nodes if n.bl_idname == 'CompositorNodeRLayers') + targets = [link.to_socket for link in nt.links if link.from_node == rl] + nd = nt.nodes.new('CompositorNodeImage') + nd.image = raw + nt.nodes.remove(rl) + for socket in targets: + nt.links.new(nd.outputs['Image'], socket) + native = nt.nodes['SOURCE_FRAME_OUTPUT'] + native.directory = str(folder) + native.file_name = '' + S.frame_set(fr) + started = time.monotonic() + bpy.ops.render.render(write_still=False) + target = folder / f'{fr:04d}.png' + data = target.read_bytes() + assert struct.unpack('>II', data[16:24]) == (1280, 720) + row = {'frame': fr, 'label': label, 'opening_gain': gain, + 'source_sha256': hashlib.sha256(source.read_bytes()).hexdigest(), + 'sha256': hashlib.sha256(data).hexdigest(), + 'seconds': time.monotonic() - started} + records.append(row) + print('RECOMPOSE_FRAME', json.dumps(row), flush=True) + nd.image = None + bpy.data.images.remove(raw) +(ROOT / 'logs' / (a.label + '_recomposition.json')).write_text(json.dumps(records, indent=2)) +print('OVERSCAN_RECOMPOSITION_COMPLETE', len(records), flush=True) diff --git a/astra_scene_test/Scene_04/scripts/reference.py b/astra_scene_test/Scene_04/scripts/reference.py new file mode 100644 index 0000000000000000000000000000000000000000..95e7a10b2d06492d0eb444dc4f3ff066c8a3fa8a --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/reference.py @@ -0,0 +1,27 @@ +import hashlib, json, pathlib, subprocess +from PIL import Image, ImageDraw +import numpy as np +ROOT = pathlib.Path(__file__).resolve().parents[1] +frames = sorted((ROOT/'reference/frames').glob('*.png')) +assert frames +rows=[] +for i,p in enumerate(frames): + im=Image.open(p).convert('RGB'); a=np.asarray(im) + rows.append({'frame':i+1,'time_seconds':i/30,'path':str(p.relative_to(ROOT)), + 'mean_rgb':a.mean(axis=(0,1)).round(3).tolist(), + 'sha256':hashlib.sha256(p.read_bytes()).hexdigest()}) +metadata={'width':im.width,'height':im.height,'fps_num':30,'fps_den':1,'frame_count':len(frames), + 'duration_seconds':len(frames)/30,'audio_streams':0, + 'source_sha256':hashlib.sha256((ROOT/'night_front_wide_120fov.mp4').read_bytes()).hexdigest(), + 'measurement':'FFmpeg full decode; stream time base 1/15360; constant rate 30/1; no audio stream.', 'frames':rows} +(ROOT/'reference/metadata.json').write_text(json.dumps(metadata,indent=2)) +for page,ids in enumerate([list(range(1,129,8)),list(range(1,129))]): + w=400 if page==0 else 240; h=w*720//1280 + cols=4 if page==0 else 8 + sheet=Image.new('RGB',(cols*w,((len(ids)+cols-1)//cols)*(h+24)),(20,20,20));d=ImageDraw.Draw(sheet) + for j,n in enumerate(ids): + x=j%cols*w; y=j//cols*(h+24) + sheet.paste(Image.open(frames[n-1]).resize((w,h)),(x,y)) + d.text((x+7,y+h+4),f'frame {n:03d} {(n-1)/30:.4f} s',fill='white') + sheet.save(ROOT/f'reference/contact_sheet_{page}.jpg',quality=95) +print('Extracted',len(frames),'timestamped frames') diff --git a/astra_scene_test/Scene_04/scripts/refine_camera_frames.py b/astra_scene_test/Scene_04/scripts/refine_camera_frames.py new file mode 100644 index 0000000000000000000000000000000000000000..bd7616b7f5329f49bdbcf2e3e8f4f12318d5b1b7 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/refine_camera_frames.py @@ -0,0 +1,49 @@ +"""Refine intermediate camera poses from all source frames; keep geometry fixed. +The baseline bundle determines scene points and metric ambiguity. This pass +estimates the source's small inter-frame fluctuations without synthetic shake. +""" +from pathlib import Path +import json,numpy as np +from scipy.optimize import least_squares +from scipy.spatial.transform import Rotation +ROOT=Path(__file__).resolve().parents[1] +M=json.loads((ROOT/'reference/camera_fit_selected.json').read_text()) +tracks=np.load(ROOT/'reference/feature_tracks.npz')['tracks'];ids=M['track_ids'];obs=tracks[ids] +f=M['focal_pixels'];pp=np.array(M['principal_point']);ep=np.array(M['epipole']);d=np.r_[(ep-pp)/f,1] +points=np.c_[(obs[:,0]-pp)/f,np.ones(len(ids))]*np.array(M['depth_in_total_travel_units'])[:,None] +frames=np.arange(1,129);old_t=np.interp(frames,M['frames'],M['displacement_fraction']);old_r=np.array([np.interp(frames,M['frames'],np.array(M['rotation_vectors'])[:,i]) for i in range(3)]).T +weights=np.array([3 if n==122 else 2 if n==85 else 1.3 if n in [74,75,251] else 1 for n in ids]) +def projection(t,r): + q=(Rotation.from_rotvec(r).as_matrix()@(points-t*d).T).T + return q[:,:2]/q[:,2:]*f+pp +new_t=old_t.copy();new_r=old_r.copy();fixed=set(M['frames']) +for j,fr in enumerate(frames): + if fr in fixed:continue + valid=np.isfinite(obs[:,j,0]);initial=np.r_[old_t[j],old_r[j]] + def residual(p): + delta=(projection(p[0],p[1:])-obs[:,j])*weights[:,None] + return np.r_[delta[valid].ravel(),(p-initial)*[12,20,20,20]] + fit=least_squares(residual,initial,loss='soft_l1',f_scale=1.5,max_nfev=60, + bounds=(initial-[.012,.012,.012,.012],initial+[.012,.012,.012,.012])) + new_t[j]=fit.x[0];new_r[j]=fit.x[1:] +# Remove isolated sub-frame tracker noise while retaining measured motion. The +# original calibrated knots and endpoints stay exact. +for arr,old in [(new_t,old_t),(new_r,old_r)]: + delta=arr-old;filtered=delta.copy();filtered[1:-1]=.18*delta[:-2]+.64*delta[1:-1]+.18*delta[2:] + arr[:]=old+filtered + for fr in fixed:arr[fr-1]=old[fr-1] +assert np.all(np.diff(new_t)>0),'Refinement broke continuous forward travel' +rows=[] +for j,fr in enumerate(frames): + before=projection(old_t[j],old_r[j]);after=projection(new_t[j],new_r[j]);valid=np.isfinite(obs[:,j,0]) + rows.append({'frame':int(fr),'median_before':float(np.median(np.linalg.norm(before[valid]-obs[valid,j],axis=1))), + 'median_after':float(np.median(np.linalg.norm(after[valid]-obs[valid,j],axis=1))), + 'max_projected_adjustment':float(np.max(np.linalg.norm(after[valid]-before[valid],axis=1)))}) +result={**M,'frames':frames.tolist(),'displacement_fraction':new_t.tolist(),'rotation_vectors':new_r.tolist(), + 'refinement':'All128 source frames; fixed3D landmarks; original17 calibration knots held exact; small isolated tracker fluctuations filtered; no artificial camera shake.'} +(ROOT/'assets/camera_motion_full.json').write_text(json.dumps(result,indent=2)) +report={'old_median_across_frames':float(np.median([r['median_before'] for r in rows])), + 'new_median_across_frames':float(np.median([r['median_after'] for r in rows])), + 'max_landmark_projection_adjustment':max(r['max_projected_adjustment'] for r in rows),'frames':rows} +(ROOT/'logs/camera_full_frame_refinement.json').write_text(json.dumps(report,indent=2)) +print(json.dumps({k:v for k,v in report.items() if k!='frames'},indent=2)) diff --git a/astra_scene_test/Scene_04/scripts/render.py b/astra_scene_test/Scene_04/scripts/render.py new file mode 100644 index 0000000000000000000000000000000000000000..8eae7b64b2bf517b826219fc2ca9c4fb0d681ae5 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/render.py @@ -0,0 +1,72 @@ +"""Render saved editable scene. Arguments: label, frames|all, samples, percent. +Example: Blender -b scene_04.blend --python scripts/render.py -- final all 768 100 +""" +import bpy,sys,pathlib,json,time,datetime,hashlib,struct +ROOT=pathlib.Path(__file__).resolve().parents[1] +args=sys.argv[sys.argv.index('--')+1:] if '--' in sys.argv else [] +label=args[0] if args else 'preview';selected=args[1] if len(args)>1 else '1,33,65,97,128' +samples=int(args[2]) if len(args)>2 else 96;percent=int(args[3]) if len(args)>3 else 60 +frames=list(range(1,129)) if selected=='all' else [int(f) for f in selected.split(',')] +S=bpy.context.scene;S.cycles.samples=samples;S.cycles.adaptive_threshold=.008 if samples>=512 else .012 if samples>=256 else .035 +S.render.resolution_percentage=percent +sys.path.insert(0,str(ROOT/'scripts')) +from render_device import configure +device_name=configure(S,'cpu' in args) +print('RENDER_DEVICE',device_name,flush=True) +S.render.image_settings.file_format='PNG';S.render.image_settings.color_mode='RGB' +if hasattr(S.render,'compositor_device'):S.render.compositor_device='CPU' +S.cycles.seed=404;S.cycles.use_animated_seed=False +S.cycles.use_auto_tile=True;S.cycles.tile_size=256 +S.cycles.debug_use_compact_bvh=True +S.cycles.denoising_use_gpu=False +S.cycles.adaptive_min_samples=128 if samples>=512 else 64 if samples>=256 else 16 +if 'clear' in args: + for o in bpy.data.collections.get('Atmosphere').objects:o.hide_render=True + S.cycles.max_bounces=4;S.cycles.use_denoising=True +from render_settings import apply_quality +apply_quality(S,samples,percent) +folder=ROOT/'renders'/label;folder.mkdir(parents=True,exist_ok=True) +native=S.compositing_node_group.nodes.get('SOURCE_FRAME_OUTPUT') if S.compositing_node_group else None +if native: + native.directory=str(folder);native.file_name='' + assert native.file_output_items[0].name=='####' +if 'raw' in args: + nt=S.compositing_node_group + raw=nt.nodes.new('CompositorNodeOutputFile');raw.label='Uncomposited scene radiance for optical comparisons' + raw.directory=str(folder/'linear');raw.file_name='frame' + raw.format.media_type='IMAGE';raw.format.file_format='OPEN_EXR';raw.format.color_depth='16';raw.format.exr_codec='ZIP' + raw.file_output_items.new('RGBA','Raw') + source=next(n for n in nt.nodes if n.bl_idname=='CompositorNodeRLayers') + nt.links.new(source.outputs['Image'],raw.inputs['Raw']) +S.render.use_persistent_data=False +scene_hash=hashlib.sha256((ROOT/'scene_04.blend').read_bytes()).hexdigest() +script_hash=hashlib.sha256(pathlib.Path(__file__).read_bytes()).hexdigest() +helper_hashes={name:hashlib.sha256((ROOT/'scripts'/name).read_bytes()).hexdigest() for name in ['render_settings.py','render_device.py']} +previous={} +operations=ROOT/'logs/render_operations.jsonl' +if operations.exists(): + for line in operations.read_text().splitlines(): + try: + row=json.loads(line) + if row.get('label')==label:previous[row['frame']]=row + except (ValueError,KeyError):continue +for frame in frames: + target=folder/f'{frame:04d}.png' + if target.exists() and 'resume' in args: + row=previous.get(frame,{}) + valid=(row.get('render_script_sha256')==script_hash and row.get('render_helper_sha256')==helper_hashes and row.get('samples')==samples and row.get('percent')==percent and row.get('blend_sha256')==scene_hash + and row.get('sha256')==hashlib.sha256(target.read_bytes()).hexdigest()) + if 'raw' in args:valid=valid and (folder/'linear'/f'{frame:04d}_Raw.exr').exists() + if valid: + print('FRAME_RESUME_VERIFIED',label,frame,flush=True);continue + print('FRAME_RESUME_REJECTED',label,frame,'Existing image lacks matching scene/settings/hash evidence',flush=True) + S.frame_set(frame);S.render.filepath=str(target);start=time.monotonic() + if 'raw' in args:raw.file_name=f'{frame:04d}_' + print('FRAME_START',label,frame,'samples',samples,'percent',percent,flush=True) + bpy.ops.render.render(write_still=native is None) + png=target.read_bytes();output_resolution=list(struct.unpack('>II',png[16:24])) + entry={'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'label':label,'frame':frame,'source_seconds':(frame-1)/30, + 'samples':samples,'percent':percent,'device':device_name,'tile_size':S.cycles.tile_size,'metal_working_set_percent':S.get('metal_working_set_percent'),'blender_version':bpy.app.version_string,'adaptive_threshold':S.cycles.adaptive_threshold,'adaptive_min_samples':S.cycles.adaptive_min_samples,'render_helper_sha256':helper_hashes,'blend_sha256':scene_hash,'render_script_sha256':script_hash,'internal_resolution':[S.render.resolution_x,S.render.resolution_y],'output_resolution':output_resolution,'seconds':time.monotonic()-start,'sha256':hashlib.sha256(png).hexdigest()} + with (ROOT/'logs/render_operations.jsonl').open('a') as f:f.write(json.dumps(entry)+'\n') + print('FRAME_COMPLETE',json.dumps(entry),flush=True) +print('SEQUENCE_COMPLETE',label,flush=True) diff --git a/astra_scene_test/Scene_04/scripts/render_device.py b/astra_scene_test/Scene_04/scripts/render_device.py new file mode 100644 index 0000000000000000000000000000000000000000..f650babaccd596c56ce56cbef3393dfffbaf16fa --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/render_device.py @@ -0,0 +1,21 @@ +"""Use an available Blender GPU, with a reproducible CPU fallback.""" +import bpy,os +def configure(scene,cpu=False): + os.environ.setdefault('CYCLES_METAL_WORKING_SET_PERCENT','20') + scene['metal_working_set_percent']=os.environ['CYCLES_METAL_WORKING_SET_PERCENT'] + scene.render.threads_mode='FIXED';scene.render.threads=4 + if not cpu: + prefs=bpy.context.preferences.addons['cycles'].preferences + for backend in ['METAL','OPTIX','CUDA','HIP','ONEAPI']: + try: + prefs.compute_device_type=backend + if backend=='METAL' and hasattr(prefs,'metalrt'): + prefs.metalrt='OFF';scene['metal_hardware_raytracing']='OFF' + prefs.get_devices() + available=[d for d in prefs.devices if d.type==backend] + if available: + for d in prefs.devices:d.use=d in available + scene.cycles.device='GPU';return backend + except (TypeError,ValueError,RuntimeError):continue + scene.cycles.device='CPU';scene.render.threads_mode='FIXED';scene.render.threads=4 + return 'CPU' diff --git a/astra_scene_test/Scene_04/scripts/render_settings.py b/astra_scene_test/Scene_04/scripts/render_settings.py new file mode 100644 index 0000000000000000000000000000000000000000..e82cbab549b3f3035a0e9076d3382ca0f2366075 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/render_settings.py @@ -0,0 +1,10 @@ +"""Common sampling settings for the saved scene, renders and verification renders.""" +def apply_quality(scene,samples,percent=100): + scene.cycles.samples=samples + scene.cycles.adaptive_threshold=.008 if samples>=512 else .012 if samples>=256 else .02 if samples>=128 else .035 + scene.cycles.adaptive_min_samples=128 if samples>=512 else 64 if samples>=256 else 32 if samples>=128 else 16 + scene.cycles.seed=404;scene.cycles.use_animated_seed=False + scene.cycles.use_denoising=True;scene.cycles.denoiser='OPENIMAGEDENOISE';scene.cycles.denoising_use_gpu=False + scene.cycles.use_auto_tile=True;scene.cycles.tile_size=512;scene.cycles.debug_use_compact_bvh=True + scene.render.use_persistent_data=False;scene.render.resolution_percentage=percent + if hasattr(scene.render,'compositor_device'):scene.render.compositor_device='CPU' diff --git a/astra_scene_test/Scene_04/scripts/review_completed_final.py b/astra_scene_test/Scene_04/scripts/review_completed_final.py new file mode 100644 index 0000000000000000000000000000000000000000..7e3dc92ce28e6afb0b850d7492034ea20fc36b9d --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/review_completed_final.py @@ -0,0 +1,24 @@ +"""Make incremental review sheets from hash-verified frozen final frames only.""" +from pathlib import Path +import hashlib,json +from PIL import Image,ImageDraw +ROOT=Path(__file__).resolve().parents[1] +sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() +blend=sha(ROOT/'scene_04.blend');rows={} +for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines(): + r=json.loads(line) + if r.get('label')=='final':rows[r['frame']]=r +valid={fr:r for fr,r in rows.items() if r.get('blend_sha256')==blend and (ROOT/f'renders/final/{fr:04d}.png').exists() and sha(ROOT/f'renders/final/{fr:04d}.png')==r['sha256']} +out=ROOT/'renders/comparisons/final_progress';out.mkdir(exist_ok=True,parents=True);ready=[] +for block in range(8): + frames=list(range(block*16+1,block*16+17)) + if not all(fr in valid for fr in frames):continue + ready.append(block+1);board=Image.new('RGB',(1280,1632),(17,18,19));draw=ImageDraw.Draw(board) + for n,fr in enumerate(frames): + x=(n%2)*640;y=(n//2)*204 + for shift,folder in [(0,'reference/frames'),(320,'renders/final')]: + with Image.open(ROOT/f'{folder}/{fr:04d}.png') as im:board.paste(im.convert('RGB').resize((320,180)),(x+shift,y+24)) + draw.text((x+7,y+6),f'{fr:03d} | {(fr-1)/30:.4f}s | SOURCE / FINAL',fill='white') + board.save(out/f'sequence_{block+1:02d}.jpg',quality=94) +(ROOT/'logs/final_progress_review.json').write_text(json.dumps({'blend_sha256':blend,'ready_blocks':ready,'frame_hashes':{str(fr):r['sha256'] for fr,r in valid.items()},'manual_review':'separate'},indent=2)) +print('VERIFIED_REVIEW_BLOCKS',ready) diff --git a/astra_scene_test/Scene_04/scripts/review_sequence.py b/astra_scene_test/Scene_04/scripts/review_sequence.py new file mode 100644 index 0000000000000000000000000000000000000000..66048d6d2a7eefc62625742fb2786aab202dfa55 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/review_sequence.py @@ -0,0 +1,36 @@ +"""Whole-sequence comparison sheets and independent temporal measurements. +Source and reconstruction are paired at identical frame indices. Optical-flow +warp residuals are diagnostics, not an oracle of visual fidelity. +""" +from pathlib import Path +import sys,json,hashlib,numpy as np,cv2 +from PIL import Image,ImageDraw +cv2.setNumThreads(1) +ROOT=Path(__file__).resolve().parents[1];label=sys.argv[1];folder=ROOT/'renders'/label +files=sorted(folder.glob('[0-9][0-9][0-9][0-9].png'));complete=len(files)==128 +out=ROOT/'renders/comparisons'/label;out.mkdir(parents=True,exist_ok=True) +records=[];prev={};hashes=[] +for n,path in enumerate(files): + fr=int(path.stem);views={key:Image.open(p).convert('RGB') for key,p in [('source',ROOT/f'reference/frames/{fr:04d}.png'),('render',path)]} + if n%16==0:board=Image.new('RGB',(1280,1632),(17,18,19));draw=ImageDraw.Draw(board) + x=(n%2)*640;y=((n%16)//2)*204 + board.paste(views['source'].resize((320,180)),(x,y+24));board.paste(views['render'].resize((320,180)),(x+320,y+24)) + draw.text((x+7,y+6),f'{fr:03d} | {(fr-1)/30:.4f}s | SOURCE / {label}',fill='white') + if n%16==15 or n==len(files)-1:board.save(out/f'sequence_{n//16+1:02d}.jpg',quality=94) + row={'frame':fr};hashes.append(hashlib.sha256(path.read_bytes()).hexdigest()) + for key,im in views.items(): + a=np.asarray(im.resize((640,360)),dtype=np.float32);gray=cv2.cvtColor(a,cv2.COLOR_RGB2GRAY);sky=a[40:100,290:320] + high=sky-cv2.GaussianBlur(sky,(0,0),1.3) + r={'sky_mean_rgb':sky.mean((0,1)).tolist(),'sky_highpass_std':float(high.std())} + if key in prev and fr==prev[key]['frame']+1: + pg=prev[key]['gray'];flow=cv2.calcOpticalFlowFarneback(pg,gray,None,.5,3,19,3,5,1.2,0) + yy,xx=np.mgrid[:360,:640];warped=cv2.remap(gray,(xx+flow[:,:,0]).astype('float32'),(yy+flow[:,:,1]).astype('float32'),cv2.INTER_LINEAR,borderMode=cv2.BORDER_REFLECT) + err=np.abs(warped-pg) + r['flow_warp_mae']=float(np.mean(err[30:335,15:625]));r['sky_mean_change']=float(np.mean(np.abs(sky-prev[key]['sky']))) + r['road_flow_median_xy']=np.median(flow[280:330,220:420],axis=(0,1)).tolist() + row[key]=r;prev[key]={'gray':gray,'sky':sky,'frame':fr} + records.append(row) +summary={'label':label,'frame_count':len(files),'complete_sequence':complete,'duplicate_frame_hash_count':len(hashes)-len(set(hashes)), + 'source_left_render_right':True,'frames':records,'interpretation':'Full indexed frame pairing; flow residuals include noise, water refraction and disocclusions. They do not certify matching geometry or real-time visual playback.'} +(ROOT/f'logs/temporal_review_{label}.json').write_text(json.dumps(summary,indent=2)) +print('SEQUENCE_REVIEW',label,'frames',len(files),'complete',complete,'duplicates',summary['duplicate_frame_hash_count']) diff --git a/astra_scene_test/Scene_04/scripts/search_glare.py b/astra_scene_test/Scene_04/scripts/search_glare.py new file mode 100644 index 0000000000000000000000000000000000000000..aac892cc6851804fb5e77e470202e49fb9ff3723 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/search_glare.py @@ -0,0 +1,23 @@ +"""Controlled glare-energy sweep using raw scene-only radiance.""" +import bpy,pathlib,sys,json +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from install_optics import install_optics +S=bpy.context.scene +for o in list(bpy.data.objects): + if o.type!='CAMERA':bpy.data.objects.remove(o,do_unlink=True) +S.render.engine='CYCLES';S.cycles.device='CPU';S.cycles.samples=1;S.cycles.use_denoising=False;S.render.threads_mode='FIXED';S.render.threads=2 +S.render.resolution_x=1280;S.render.resolution_y=720;S.render.resolution_percentage=100 +S.render.image_settings.file_format='PNG';S.render.image_settings.color_mode='RGB';S.render.use_motion_blur=False +S.view_settings.view_transform='AgX';S.view_settings.look='AgX - Medium Low Contrast';S.view_settings.exposure=.7 +P=json.loads((ROOT/'assets/config.json').read_text()) +for fr in [1,65,128]: + S.frame_set(fr) + for glow,smear in [(0.15,.02),(.35,.05),(.65,.05),(.15,.12),(.35,.12),(.65,.12)]: + nt=install_optics(S,{**P,'glow_strength':glow,'smear_strength':smear});rl=next(n for n in nt.nodes if n.bl_idname=='CompositorNodeRLayers');targets=[l.to_socket for l in nt.links if l.from_node==rl] + im=bpy.data.images.load(str(ROOT/f'renders/optics_probe/linear/{fr:04d}_Raw.exr'),check_existing=True);im.colorspace_settings.name='Linear Rec.709' + nd=nt.nodes.new('CompositorNodeImage');nd.image=im;nt.nodes.remove(rl) + for target in targets:nt.links.new(nd.outputs['Image'],target) + folder=ROOT/'renders'/f'glare_{glow:.2f}_{smear:.2f}';folder.mkdir(exist_ok=True) + S.render.filepath=str(folder/f'{fr:04d}.png');bpy.ops.render.render(write_still=True) + print('GLARE_VARIANT',fr,glow,smear,flush=True) +print('GLARE_SWEEP_COMPLETE',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/session.py b/astra_scene_test/Scene_04/scripts/session.py new file mode 100644 index 0000000000000000000000000000000000000000..d2d9214ad8a7de2576252d3912f32ffcb195ceff --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/session.py @@ -0,0 +1,21 @@ +"""Append real UTC timestamps; never synthesize elapsed time or usage.""" +import datetime, hashlib, json, pathlib, sys, time +ROOT = pathlib.Path(__file__).resolve().parents[1] +LOG = ROOT / 'logs' +LOG.mkdir(exist_ok=True) +session = LOG / 'session.json' +if not session.exists(): + source = ROOT / 'night_front_wide_120fov.mp4' + session.write_text(json.dumps({'started_utc': datetime.datetime.now(datetime.timezone.utc).isoformat(), + 'source_sha256': hashlib.sha256(source.read_bytes()).hexdigest(), + 'token_usage': None, 'cost': None, + 'usage_note': 'Host does not expose per-task token/cost counters through available tools.'}, indent=2)) +now = datetime.datetime.now(datetime.timezone.utc) +entry = {'utc': now.isoformat(), 'event': ' '.join(sys.argv[1:])} +with (LOG / 'operations.jsonl').open('a') as f: + f.write(json.dumps(entry) + '\n') +start = datetime.datetime.fromisoformat(json.loads(session.read_text())['started_utc']) +from elapsed_time import measure_elapsed +timing=measure_elapsed(now) +print(json.dumps({**entry, 'elapsed_hours': (now-start).total_seconds()/3600, + 'elapsed_excluding_pauses_hours':timing['meaningful_seconds']/3600})) diff --git a/astra_scene_test/Scene_04/scripts/set_linear_motion.py b/astra_scene_test/Scene_04/scripts/set_linear_motion.py new file mode 100644 index 0000000000000000000000000000000000000000..79f5d4dd787e86677866da92fa7db12ee732422b --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/set_linear_motion.py @@ -0,0 +1,9 @@ +"""Apply the same explicit linear interpolation used by build_scene.py.""" +import bpy,sys,pathlib +ROOT=pathlib.Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT/'scripts')) +from animation_curves import linear,curves +for ob in bpy.data.objects: + if ob.animation_data and ob.animation_data.action:linear(ob) +for curve in curves(bpy.context.scene.camera):print('CAMERA_CURVE',curve.data_path,curve.array_index,len(curve.keyframe_points),{k.interpolation for k in curve.keyframe_points},flush=True) +bpy.ops.wm.save_as_mainfile(filepath=str(ROOT/'scene_04.blend')) +print('LINEAR_MOTION_SAVED',flush=True) diff --git a/astra_scene_test/Scene_04/scripts/track_signals.py b/astra_scene_test/Scene_04/scripts/track_signals.py new file mode 100644 index 0000000000000000000000000000000000000000..71d830cd0637c1d0faf2e71954bfc9c55903d3c1 --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/track_signals.py @@ -0,0 +1,24 @@ +"""Track the visible green emission, independently of the original LK corner.""" +from pathlib import Path +import cv2,numpy as np,json,sys +cv2.setNumThreads(1) +ROOT=Path(__file__).resolve().parents[1];T=np.load(ROOT/'reference/feature_tracks.npz')['tracks'] +label=sys.argv[1] if len(sys.argv)>1 else 'reference';folder=ROOT/'reference/frames' if label=='reference' else ROOT/'renders'/label +out={} +for name,idx in [('left',122),('right',85)]: + rows={} + for fr in range(1,129): + path=folder/f'{fr:04d}.png' + if not path.exists():continue + im=cv2.resize(cv2.imread(str(path)),(1280,720))[:,:,::-1].astype(float);center=T[idx,fr-1] + xx,yy=map(int,center);x0=max(0,xx-32);x1=min(1280,xx+33);y0=max(0,yy-32);y1=min(720,yy+33) + a=im[y0:y1,x0:x1];r,g,b=np.moveaxis(a,2,0) + score=np.clip(g-r-25,0,None)+np.clip(b-r-20,0,None) + score*=((g-r)>25)&((b-r)>20)&(g>95) + gy,gx=np.mgrid[y0:y1,x0:x1];score*=np.exp(-((gx-center[0])**2+(gy-center[1])**2)/(2*18**2)) + if score.sum()<1:continue + rows[fr]=[float((gx*score).sum()/score.sum()),float((gy*score).sum()/score.sum())] + out[name]=rows +dest=ROOT/'reference/source_signal_tracks.json' if label=='reference' else ROOT/f'logs/render_signal_tracks_{label}.json';dest.write_text(json.dumps(out,indent=2)) +for name,rows in out.items(): + print(name,len(rows),{fr:np.round(rows[fr],2).tolist() for fr in [1,33,65,97,128] if fr in rows}) diff --git a/astra_scene_test/Scene_04/scripts/verify.py b/astra_scene_test/Scene_04/scripts/verify.py new file mode 100644 index 0000000000000000000000000000000000000000..17135f5a2447ccdf9d5630f1b9484a273072145c --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/verify.py @@ -0,0 +1,115 @@ +"""Independent delivery checks. Uses only stdlib and bundled FFmpeg.""" +import pathlib,sys,json,hashlib,subprocess,re,datetime,struct +from fractions import Fraction +ROOT=pathlib.Path(__file__).resolve().parents[1] +def load(p):return json.loads((ROOT/p).read_text()) +def sha(p):return hashlib.sha256((ROOT/p).read_bytes()).hexdigest() +def probe(p): + r=subprocess.run([str(ROOT/'tools/ffmpeg'),'-hide_banner','-nostdin','-xerror','-err_detect','explode','-i',str(ROOT/p),'-map','0:v:0','-vf','showinfo','-f','null','-'],capture_output=True,text=True) + assert r.returncode==0,(p,r.stderr[-3000:]) + frames=re.findall(r'\bn:\s*(\d+)\s+pts:\s*(-?\d+)\s+pts_time:([\d.\-]+).*?\bs:(\d+)x(\d+)',r.stderr) + assert frames,(p,'No decoded video frames') + fps=float(re.search(r'(\d+(?:\.\d+)?) fps',r.stderr).group(1)) + assert len({(f[3],f[4]) for f in frames})==1,'Decoded resolution changes within video' + packets=subprocess.run([str(ROOT/'tools/ffmpeg'),'-v','error','-nostdin','-i',str(ROOT/p),'-map','0:v:0','-c','copy','-f','framecrc','-'],capture_output=True,text=True) + assert packets.returncode==0,packets.stderr + tb=re.search(r'^#tb 0:\s*(\d+/\d+)',packets.stdout,re.M);assert tb,'No packet timebase' + timebase=Fraction(tb.group(1));intervals=[] + for line in packets.stdout.splitlines(): + if not line or line.startswith('#'):continue + fields=[v.strip() for v in line.split(',')] + assert fields[0]=='0' and len(fields)>=6 + intervals.append((int(fields[2])*timebase,int(fields[3])*timebase)) + intervals.sort() + assert len(intervals)==len(frames) and intervals[0][0]==0 + assert all(duration>0 for _,duration in intervals) + assert all(start+duration==following[0] for (start,duration),following in zip(intervals,intervals[1:])), 'Gap or overlap in encoded packet timeline' + result={'count':len(frames),'fps':fps,'width':int(frames[0][3]),'height':int(frames[0][4]),'timestamps':[float(f[2]) for f in frames], + 'audio_streams':len(re.findall(r'Stream #0:\d+.*Audio:',r.stderr)), + 'packet_timebase':str(timebase),'packet_intervals':[[str(t),str(d)] for t,d in intervals], + 'duration_fraction':str(sum(intervals[-1])),'duration_seconds':float(sum(intervals[-1]))} + (ROOT/f'logs/probe_{pathlib.Path(p).stem}.json').write_text(json.dumps(result,indent=2)) + return result +def same_timing(a,b): + assert a['count']==b['count'];assert a['fps']==b['fps'];assert max(abs(x-y) for x,y in zip(a['timestamps'],b['timestamps']))<.0001 + assert a['packet_intervals']==b['packet_intervals'] and a['duration_fraction']==b['duration_fraction'] +def assert_no_movie(data): + assert data['movie_sequence_images']==[],'Movie/sequence texture found' + assert data.get('reference_image_matches',[])==[],'Packed or external source frame used by scene' +def reference(): + m=load('reference/metadata.json');r=probe('night_front_wide_120fov.mp4') + assert sha('night_front_wide_120fov.mp4')==load('logs/session.json')['source_sha256'] + assert r['count']==m['frame_count']==len(m['frames']) + assert [r['width'],r['height']]==[m['width'],m['height']] + assert r['audio_streams']==m['audio_streams']==0 + for f in m['frames']:assert sha(f['path'])==f['sha256'] + assert len(list((ROOT/'reference/frames').glob('*.png')))==r['count'] + print('REFERENCE_VERIFIED') +def scene(): + a=load('logs/reopened_scene_audit.json');assert a['blend_sha256']==sha('scene_04.blend') + assert a['mesh_object_count']>100 and a['curve_object_count']>10 and a['material_count']>15 + assert a['camera_animated'];assert_no_movie(a) + assert a['room_lights'] and min(r['height_above_road'] for r in a['room_lights'])>1.5,'A room ceiling light was misplaced at street level' + cc=a['camera_curves'];assert len(cc)==6 and all(c['keyframes']==128 and c['interpolations']==['LINEAR'] for c in cc);assert not a['missing_external_images'];assert not a.get('missing_external_fonts',[]) + m=load('reference/metadata.json');assert a['frame_start']==1 and a['frame_end']==m['frame_count'] + expected=[m['width'],m['height']] + assert a.get('output_resolution',a['resolution'])==expected and a['percentage']==100 + overscan=a.get('optical_overscan',1) + assert a['resolution']==[round(v*overscan) for v in expected] + if overscan>1: + crop=a['optical_crop'];assert crop and crop['connected_to_output'] and not crop['alpha_crop'] + assert [crop['x'],crop['y']]==[(a['resolution'][i]-expected[i])//2 for i in range(2)] + native=a['native_file_output'];assert native and native['format']=='PNG' and native['connected_to_crop'] + assert native['items']==['####'] and not a['automatic_output_enabled'] + sensor=next(im for im in a['images'] if pathlib.Path(im['filepath']).name=='sensor_coordinates.png') + assert sensor['png_header']['bit_depth']==16,'Numeric sensor map was quantized to 8 bits' + assert [sensor['png_header']['width'],sensor['png_header']['height']]==a['resolution'] + assert a['fps']/a['fps_base']==30 + try:assert_no_movie({'movie_sequence_images':['positive-control.mp4']}) + except AssertionError:pass + else:raise AssertionError('Movie texture negative control did not fail') + try:assert_no_movie({'movie_sequence_images':[],'reference_image_matches':['source-frame.png']}) + except AssertionError:pass + else:raise AssertionError('Static source-frame positive control did not fail') + yy=[k['location'][1] for k in a['camera_samples']];assert all(x10000 + print('SCENE_VERIFIED') +def videos(): + a=probe('night_front_wide_120fov.mp4');b=probe('final.mp4');c=probe('comparison.mp4') + same_timing(a,b);same_timing(a,c) + assert [a['width'],a['height']]==[b['width'],b['height']] + assert [c['width'],c['height']]==[a['width']*2,a['height']] + assert a['audio_streams']==b['audio_streams']==c['audio_streams']==0 + assert len(list((ROOT/'renders/final').glob('*.png')))==a['count'] + scene_hash=sha('scene_04.blend') + config=load('assets/config.json');script_hash=sha('scripts/render.py');helpers={name:sha('scripts/'+name) for name in ['render_settings.py','render_device.py']} + rows={r['frame']:r for r in [json.loads(line) for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines()] if r['label']=='final'} + for fr in range(1,a['count']+1): + row=rows[fr];assert row['blend_sha256']==scene_hash and row['percent']==100 + assert row['samples']==config['samples'] and row['render_script_sha256']==script_hash and row['render_helper_sha256']==helpers + assert row['sha256']==sha(f'renders/final/{fr:04d}.png') + assert row.get('output_resolution')==[a['width'],a['height']] + + print('VIDEOS_VERIFIED') +def reopen(): + a=load('logs/reopened_scene_audit.json');assert a['blend_sha256']==sha('scene_04.blend') + rows={r['frame']:r for r in [json.loads(line) for line in (ROOT/'logs/render_operations.jsonl').read_text().splitlines()] if r['label']=='reopen'} + for fr in [1,65,128]: + row=rows[fr];assert row['blend_sha256']==a['blend_sha256'] and row['percent']==100 + assert row['samples']==a['samples'] and row['render_script_sha256']==sha('scripts/render.py') + assert row['render_helper_sha256']=={name:sha('scripts/'+name) for name in ['render_settings.py','render_device.py']} + assert row['sha256']==sha(f'renders/reopen/{fr:04d}.png') + p=ROOT/f'renders/reopen/{fr:04d}.png';assert p.stat().st_size>20000 + header=p.read_bytes()[:24];assert header[:8]==b'\x89PNG\r\n\x1a\n';assert struct.unpack('>II',header[16:24])==(1280,720) + assert not a['missing_external_images'];assert not a.get('missing_external_fonts',[]);print('REOPEN_VERIFIED') +def provenance(): + from elapsed_time import measure_elapsed + s=load('logs/session.json');timing=measure_elapsed();meaningful=timing['meaningful_seconds'] + assert meaningful>=5*3600,f'Only {meaningful/3600:.3f} hours excluding recorded interruptions; five hours required.' + (ROOT/'logs/elapsed_time.json').write_text(json.dumps(timing,indent=2)) + assert 'token_usage' in s and 'cost' in s + assert len((ROOT/'logs/operations.jsonl').read_text().splitlines())>=8 + assert len(list((ROOT/'checkpoints').glob('*.blend')))>=2 + for p in ['scripts/build_scene.py','scripts/render.py','scripts/compare.py','scripts/verify.py','README.md']:assert (ROOT/p).is_file() + print('PROVENANCE_VERIFIED') +if __name__=='__main__':globals()[sys.argv[1]]() diff --git a/astra_scene_test/Scene_04/scripts/water_caustics.py b/astra_scene_test/Scene_04/scripts/water_caustics.py new file mode 100644 index 0000000000000000000000000000000000000000..94793796e11b45b3a460f411bc428ab851691c1d --- /dev/null +++ b/astra_scene_test/Scene_04/scripts/water_caustics.py @@ -0,0 +1,81 @@ +"""Deterministic asymmetric light-spread fields for separate windshield regions. +Only numeric optical functions are used. Source pixels never enter these maps. +""" +from pathlib import Path +import numpy as np,json +from PIL import Image,ImageDraw,ImageFilter +ROOT=Path(__file__).resolve().parents[1];H,W=720,1280 +P=json.loads((ROOT/'assets/config.json').read_text());factor=P.get('optical_overscan',1) +px=round(W*(factor-1)/2);py=round(H*(factor-1)/2);y,x=np.mgrid[-py:H+py,-px:W+px] +def save_mask(name,m):Image.fromarray((np.clip(m,0,1)*255).astype(np.uint8)).save(ROOT/'assets'/name) +# A localized upper-left water patch becomes prominent as the paired lamp nears it. +left=.015+.95*np.exp(-((x-427)/60)**2-((y-315)/55)**2) +left*=1/(1+np.exp((x-625)/22));left*=np.clip((620-y)/100,0,1) +right=.90*np.exp(-((x-806)/90)**2-((y-306)/105)**2) +right*=1/(1+np.exp((640-x)/30));right*=np.clip((620-y)/100,0,1) +lower=.88*np.exp(-((x-512)/107)**2-((y-440)/57)**2) +opening_spread=P.get('opening_input_spread',1) +opening=np.exp(-((x-3)/(88*opening_spread))**2-((y-35)/(92*opening_spread))**2) +save_mask('windshield_glare_opening.png',opening) +save_mask('windshield_lower_defocus.png',np.clip((y-(600+65*(1-((x-640)/710)**2)))/45,0,1)) +save_mask('windshield_glare_left.png',left);save_mask('windshield_glare_right.png',right);save_mask('windshield_glare_lower.png',lower) +save_mask('windshield_glare_right_lower.png',.95*np.exp(-((x-731)/88)**2-((y-401)/76)**2)) +save_mask('windshield_glare_right_upper.png',np.exp(-((x-1180)/165)**2-((y-115)/160)**2)) +n=385;v,u=np.mgrid[-192:193,-192:193];rad=np.hypot(u,v) +def membrane(points,weight=.08): + im=Image.new('L',(n,n));d=ImageDraw.Draw(im);smooth=[];p=np.array(points,dtype=float) + for j in range(len(p)): + p0,p1,p2,p3=[p[k%len(p)] for k in [j-1,j,j+1,j+2]] + for t in np.linspace(0,1,18,endpoint=False): + q=.5*((2*p1)+(-p0+p2)*t+(2*p0-5*p1+4*p2-p3)*t*t+(-p0+3*p1-3*p2+p3)*t*t*t);smooth.append(tuple(q+192)) + d.polygon(smooth,fill=255) + broad=np.asarray(im.filter(ImageFilter.GaussianBlur(3.2)),dtype=float)/255 + edge=np.maximum(0,broad-np.asarray(im.filter(ImageFilter.GaussianBlur(8.0)),dtype=float)/255) + return broad*weight+edge*.22 +def waterline(points,amp=.12,width=1): + im=Image.new('L',(n,n));d=ImageDraw.Draw(im);p=np.array(points,dtype=float);smooth=[] + for j in range(len(p)-1): + p0,p1,p2,p3=[p[max(0,min(len(p)-1,k))] for k in [j-1,j,j+1,j+2]] + for t in np.linspace(0,1,24,endpoint=False): + q=.5*((2*p1)+(-p0+p2)*t+(2*p0-5*p1+4*p2-p3)*t*t+(-p0+3*p1-3*p2+p3)*t*t*t);smooth.append(tuple(q+192)) + smooth.append(tuple(p[-1]+192));d.line(smooth,fill=255,width=width) + return np.asarray(im.filter(ImageFilter.GaussianBlur(1.5)),dtype=float)/255*amp + +def ring(cx,cy,a,b,angle,amp): + xx=(u-cx)*np.cos(angle)+(v-cy)*np.sin(angle);yy=-(u-cx)*np.sin(angle)+(v-cy)*np.cos(angle) + theta=np.arctan2(yy/b,xx/a);r=np.hypot(xx/a,yy/b) + outline=1+.055*np.sin(theta*5+.7)+.035*np.sin(theta*9-.2) + return amp*(np.exp(-((r-outline)/.17)**2)+.46*np.exp(-r**4)) +def streak(angle,amp,length,offset=0): + along=u*np.cos(angle)+v*np.sin(angle);across=-u*np.sin(angle)+v*np.cos(angle)-offset + return amp*np.exp(-(across/1.45)**2)*np.exp(-((along+length*.28)/(length*.63))**4) +# A light core plus dimmer, displaced meniscus lobes. The asymmetry deliberately +# avoids a symmetric starburst or a solid white disk. +leftk=.08*np.exp(-(rad/19)**2)+.018*np.exp(-(rad/51)**2) +leftk+=membrane([(-66,-45),(-35,-105),(-5,-139),(12,-111),(50,-75),(103,-13),(98,16),(62,37),(15,24),(-27,3)],.05) +for k in range(6): + leftk+=waterline([(-53+k*3,-42-k*13),(-15,-59-k*12),(38,-30-k*13),(92,-6-k*4)],.11-k*.008,2) +leftk+=waterline([(-5,-139),(21,-92),(50,-61),(86,-37),(104,-9),(99,14),(70,29)],.19,2) +for angle,amp,off in [(-.43,.08,0),(-.47,.055,5),(-.51,.04,-5)]:leftk+=streak(angle,amp,120,off) +rightk=.10*np.exp(-(rad/22)**2)+.018*np.exp(-(rad/58)**2) +rightk+=membrane([(-48,13),(-86,45),(-74,100),(-42,133),(-15,89),(-21,51)],.07) +for k in range(4):rightk+=waterline([(-45-k*7,23+k*10),(-25-k*8,50+k*12),(-35-k*7,104+k*5)],.12,2) +for angle,amp,off in [(.39,.10,0),(.43,.075,6),(.48,.045,-7)]:rightk+=streak(angle,amp,148,off) +rightlowerk=.13*np.exp(-(rad/29)**2)+membrane([(9,15),(40,28),(65,73),(41,118),(12,84),(-8,38)],.07) +rightlowerk+=waterline([(15,21),(46,46),(56,80),(39,114)],.18,2) +rightupperk=.10*np.exp(-(rad/32)**2)+membrane([(32,58),(73,82),(102,158),(76,186),(46,149),(20,93)],.07) +for k in range(5):rightupperk+=waterline([(-42+k*8,-68),(2+k*8,-16),(50+k*8,39),(95+k*8,112)],.13-k*.01,2) +lowerk=.25*np.exp(-(rad/18)**2)+.02*np.exp(-(rad/42)**2) +for angle,amp,off in [(.06,.16,-2),(.12,.10,5),(.18,.07,-6)]:lowerk+=streak(angle,amp,110,off) +def save_kernel(name,k,radius): + k*=np.clip((191-radius)/18,0,1);rgb=np.stack([k,k*.995,k*.98],axis=2);rgb/=rgb.max();Image.fromarray((rgb[::-1,::-1]*255).astype(np.uint8)).save(ROOT/'assets'/name) +for name,k in [('wet_glass_psf_right_lower.png',rightlowerk),('wet_glass_psf_right_upper.png',rightupperk),('wet_glass_psf_left.png',leftk),('wet_glass_psf.png',rightk),('wet_glass_psf_lower.png',lowerk)]: + save_kernel(name,k,rad) +# The opening smear spans more sensor pixels than the smaller central caustics. +# Preserve its shape in normalized coordinates while extending physical support. +opening_scale=P.get('opening_kernel_scale',1) +extent=int(np.ceil(192*opening_scale));v,u=np.mgrid[-extent:extent+1,-extent:extent+1] +v=v/opening_scale;u=u/opening_scale;rad=np.hypot(u,v) +openingk=.12*np.exp(-(rad/25)**2)+ring(8,80,28,142,P.get('opening_ring_angle',.48),.075)+streak(-.95,.19,182,0)+streak(-.91,.08,170,7) +save_kernel('wet_glass_psf_opening.png',openingk,rad) +print('WATER_CAUSTICS_COMPLETE') diff --git a/astra_scene_test/X_03/.DS_Store b/astra_scene_test/X_03/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..57bfc816c48128b30112142490031cb8342c87d3 Binary files /dev/null and b/astra_scene_test/X_03/.DS_Store differ diff --git a/astra_scene_test/X_03/.gitignore b/astra_scene_test/X_03/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b53f5f9c08c5153d5d5c716c5f4782ff2b95f31f --- /dev/null +++ b/astra_scene_test/X_03/.gitignore @@ -0,0 +1,60 @@ +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/.vinext/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local environment +.env* + +# deployment and generated files +.vercel +next-env.d.ts +/dist/ +/.wrangler/ +/outputs/ +/work/ + +.unlazy/ +.unlazy-hook-state.json +.claude/settings.local.json +logs/visual/** +# Original scans and generated comparison assets remain available locally. +research/**/*.blend +research/**/*.blend1 +research/**/*.bin +research/**/*.gltf +research/**/*.png +research/**/*.jpg +research/**/*.jpeg +research/**/*.exr +research/**/*.zip +*.tsbuildinfo + +# Accepted compressed maps are tracked in public; duplicate pilot binaries stay local. +research/**/*.ktx2 + +# Deferred tree-bank binaries are preserved locally, outside the delivered runtime. +research/**/*.forest diff --git a/astra_scene_test/X_03/.oxfmtrc.json b/astra_scene_test/X_03/.oxfmtrc.json new file mode 100644 index 0000000000000000000000000000000000000000..2acd2356e121d5e11c54de89d0aca9da5aa54089 --- /dev/null +++ b/astra_scene_test/X_03/.oxfmtrc.json @@ -0,0 +1,13 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "singleQuote": true, + "printWidth": 80, + "sortPackageJson": false, + "ignorePatterns": [ + "package-lock.json", + "pnpm-lock.yaml", + "yarn.lock", + "bun.lock", + "bun.lockb" + ] +} diff --git a/astra_scene_test/X_03/.oxlintrc.json b/astra_scene_test/X_03/.oxlintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..b25b8b725eee93da8f12ab5099055ee07b9257c3 --- /dev/null +++ b/astra_scene_test/X_03/.oxlintrc.json @@ -0,0 +1,60 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": [ + "eslint", + "typescript", + "unicorn", + "oxc", + "react", + "import", + "jsx-a11y", + "nextjs" + ], + "categories": { + "correctness": "error" + }, + "env": { + "builtin": true, + "browser": true, + "node": true + }, + "options": { + "typeAware": true, + "typeCheck": true + }, + "ignorePatterns": [ + ".next/**", + ".vinext/**", + "out/**", + "build/**", + "dist/**", + "coverage/**", + "next-env.d.ts", + "research/**", + "components/ui/**", + "hooks/use-mobile.ts", + "public/ktx-basis/**" + ], + "rules": { + "no-array-constructor": "error", + "no-var": "error", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "import/no-anonymous-default-export": "warn", + "react/display-name": "error", + "react/jsx-no-comment-textnodes": "error", + "react/no-unescaped-entities": "error", + "react/react-compiler": "error", + "react/require-render-return": "error", + "react/rules-of-hooks": "error", + "typescript/ban-ts-comment": "error", + "typescript/no-deprecated": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-explicit-any": "error", + "typescript/no-namespace": "error", + "typescript/no-require-imports": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-function-type": "error" + } +} diff --git a/astra_scene_test/X_03/ASSETS.md b/astra_scene_test/X_03/ASSETS.md new file mode 100644 index 0000000000000000000000000000000000000000..a3b9bf5d98e760a253b49674ad7cb61e6fdcc68e --- /dev/null +++ b/astra_scene_test/X_03/ASSETS.md @@ -0,0 +1,25 @@ +# Asset provenance + +The following source assets are CC0 assets from Poly Haven. Source metadata, download checksums and transformation scripts are retained in the project research records. The forest's procedural meshes and shaders were authored for this build. + +| Source | Use and local derivation | +| --- | --- | +| [Bark Brown 02](https://polyhaven.com/a/bark_brown_02) | Bark color, normal and roughness; species-specific shading | +| [Leaves Forest Ground](https://polyhaven.com/a/leaves_forest_ground) | Forest floor color, normal and roughness with stochastic sampling | +| [Fir Tree 01](https://polyhaven.com/a/fir_tree_01) | Three scanned fir forms; restored source UVs and separate alpha; optimized distant meshes | +| [Tree Small 02](https://polyhaven.com/a/tree_small_02) | Broadleaf tree and leaf atlas; intact connected leaf components retained for both LODs | +| [Rock Moss Set 01](https://polyhaven.com/a/rock_moss_set_01) | Six rock variants, 4K surface detail, three mesh LODs | +| [Dead Tree Trunk](https://polyhaven.com/a/dead_tree_trunk) | Fallen wood, 4K surface detail, three mesh LODs | +| [Tree Stump 01](https://polyhaven.com/a/tree_stump_01) | Weathered stumps, three mesh LODs | +| [Fern 02](https://polyhaven.com/a/fern_02) | Supplementary scanned fern variants | +| [Nettle Plant](https://polyhaven.com/a/nettle_plant) | Scanned understory variation | +| [Weed Plant 02](https://polyhaven.com/a/weed_plant_02) | Small scanned weeds | +| [Moss 01](https://polyhaven.com/a/moss_01) | Curved moss shoots and an orthographic diffuse/normal bake of the same source | + +Relevant transformations include `scripts/export-trees-v2.py`, `scripts/export-fir-blend.py`, `scripts/export-intact-leaves.py`, `scripts/combine-intact-trees.mjs`, `scripts/build-asset-lods.mjs` and `scripts/bake-moss.py`. The fir export retains the source Col mask as a separate bark transition, including its authored object-space projection scale. Geometry simplification uses meshoptimizer (MIT); runtime rendering uses Three.js (MIT). Their license files remain in their installed packages. + +No AI-generated raster scenery or pre-rendered forest background is used in the real-time scene. + +The four 4K rock/deadwood color and normal maps also have full-resolution KTX2 derivatives, encoded with Khronos KTX-Software 4.4.2 (UASTC quality 3, Zstandard level 9, complete mip chains). Original JPEGs remain alongside them. `scripts/encode-prop-textures.py`, `research/compressed-props/encoding.json` and `accepted-assets.json` retain settings, sizes and hashes. The runtime selects a supported GPU texture format without lowering source dimensions. + +`public/ktx-basis/` contains the unchanged Basis Universal JavaScript/WASM decoder supplied with Three.js 0.180.0, licensed under Apache 2.0; its license and upstream reference are included in that folder. Decoder workers are released after photographic assets finish loading. diff --git a/astra_scene_test/X_03/GATES.md b/astra_scene_test/X_03/GATES.md new file mode 100644 index 0000000000000000000000000000000000000000..fcfa9554e79cea659f9b76884b0a84ece49884b7 --- /dev/null +++ b/astra_scene_test/X_03/GATES.md @@ -0,0 +1,63 @@ +# Gates: dense real-time forest + +OWNS: app/**, lib/**, public/**, scripts/**, logs/**, research/**, GATES.md, log.md, README.md, package.json, package-lock.json, vite.config.ts, next.config.ts + +Scope: One immersive browser forest, repeatedly refined for at least five meaningful hours, with honest measurements and complete source. + +- [x] G1: production assets build successfully + CHECK: npm run build + EXPECT: built in + EVIDENCE: automatic-evidence=v1; definition-sha256=46d72eccd628b28a4b0e974e69890ad856bb5d28a16876531804fc540a571513; exit=0; EXPECT=matched; output-sha256=59e3ed609be97299eea14e4340bda1978ef1cb6928beaae424f29ce3108b53fd; output-bytes=2393; shell=/bin/sh; cwd=/Users/wangpy11/Documents/blog/3D-scenes/X_03; path=a14230b513eb/5 entries + +- [x] G2: forest opens with only its full-screen canvas and no runtime errors + CHECK: node scripts/verify-browser.mjs + EXPECT: FOREST_BROWSER_VERIFIED + EVIDENCE: automatic-evidence=v1; definition-sha256=7940422d4fed4bfb7407c1b133e34f189f186ab68d94e268efbbd8a644892cd7; exit=0; EXPECT=matched; output-sha256=2c9e4dd7a58c1e710ba7daeca45738a094374b89d3d21a7c11b829ff6dae46d5; output-bytes=26; shell=/bin/sh; cwd=/Users/wangpy11/Documents/blog/3D-scenes/X_03; path=a14230b513eb/5 entries + +- [x] G3: dense varied tree crowns, branches and rooted silhouettes hold up across near and distant views + EVIDENCE: logs/final-visual-audit.md records reviewed entry, four ground edges, high canopy and flight views, supported by tree-lod-study-01 and selected outer-canopy-study-01 factor 1.35. Branching hardwoods, birches, saplings and scanned firs retain varied rooted silhouettes; rejected stretched outer crowns are documented. + +- [x] G4: grass, bushes, ferns, moss, flowers, weeds and small plants cover almost all visible forest floor + EVIDENCE: logs/final-visual-audit.md and detail-study-07 document layered grass, ferns, bramble/hazel, sorrel, moss, flowers and weeds across entry and four forest edges, with small soil/litter glimpses and no broad empty tiles. + +- [x] G5: roots, deadwood, stones, soil, leaf litter and terrain have grounded, varied materials and convincing scale + EVIDENCE: detail-study-07, surface-rooting and shadow-isolation-03 retain grounded material evidence. birch-surface-02 verifies the version 38 correction to repeating birch lenticels using the active shader profile; direct close and forest-scale inspection accepts irregular scars and weathering. Finite extreme-close texture resolution remains documented. + +- [x] G6: rich natural light, contact shadows, atmospheric depth, restrained fog and sun shafts remain convincing from many positions + EVIDENCE: Reviewed landscape/portrait, exploration-study-03 edge views and final-motion-01 show warm dappled light, cool shade, contact grounding and shadow-derived shafts; high sunward canopy is deliberately more veiled. Evidence and visual limits are in logs/final-visual-audit.md. + +- [x] G7: wind, individual foliage motion and particles animate smoothly with no obvious synchronized repetition + EVIDENCE: final-motion-01 wind start/later, walk, strafe, fast turn and settling frames were inspected with its retained video and camera trace; botanical-motion and surface-rooting checks cover anchored motion. Frame-rate performance remains separately gated by G10. + +- [x] G8: free-camera mouse, keyboard and touch exploration is smooth with stable terrain clearance + CHECK: node scripts/verify-camera.mjs + EXPECT: FOREST_CAMERA_VERIFIED + EVIDENCE: automatic-evidence=v1; definition-sha256=2609c1bc7b44325902ba6bc40908dbbf794921ea47647641db7cc59ce845848b; exit=0; EXPECT=matched; output-sha256=ebb19d57fdfd6bff4229376b81a202bc0bbe5214e86a435ad150f13faa32e1e4; output-bytes=26; shell=/bin/sh; cwd=/Users/wangpy11/Documents/blog/3D-scenes/X_03; path=a14230b513eb/5 entries + +- [x] G9: multiple recorded visual reviews expose and resolve actual weaknesses throughout the run + EVIDENCE: logs/meaningful-work-audit.json links reviewed implementation and experiment groups, including later upload, birch and compressed-texture work; iteration-01 through final-motion-01 preserve explicit defects, rejected experiments and corrections. shadow-isolation-03 proves the native trunk patch correction from the same camera; long-exploration-04 verifies the upload correction quantitatively. + +- [ ] G10: measured rendering cost and resource use permit smooth exploration on the available hardware + CHECK: node scripts/verify-performance.mjs + EXPECT: FOREST_PERFORMANCE_VERIFIED + EVIDENCE: pending + +- [x] G11: at least five hours of meaningful implementation and iteration are evidenced independently of idle waits + CHECK: node scripts/verify-accounting.mjs + EXPECT: FOREST_TIME_VERIFIED + EVIDENCE: automatic-evidence=v1; definition-sha256=23a211399ee4fa4354bd37d3b33814e4f1fa5de3a77c5521690c5c7e65d4fd51; exit=0; EXPECT=matched; output-sha256=a94aab3f2f524fc00e9e321f110bbd7b59d9fd7b0a7ef9e3be210a11d405b671; output-bytes=255; shell=/bin/sh; cwd=/Users/wangpy11/Documents/blog/3D-scenes/X_03; path=a14230b513eb/5 entries + +- [x] G12: elapsed time, available token usage, cost availability and operation history are durably saved + CHECK: node scripts/verify-logs.mjs + EXPECT: FOREST_LOGS_VERIFIED + EVIDENCE: automatic-evidence=v1; definition-sha256=af2e5e346c3d1f4fa72a5d56e6d1cf3ddb2f769010381239098795b161b22a0a; exit=0; EXPECT=matched; output-sha256=e34cd88c7262839dcfacbbf0512a1686bd53bf428919edd458fb7bd0a9ac2102; output-bytes=126; shell=/bin/sh; cwd=/Users/wangpy11/Documents/blog/3D-scenes/X_03; path=a14230b513eb/5 entries + +- [ ] G13: exact validated forest is available in a private hosted deployment + EVIDENCE: pending + +- [ ] G14: final request audit and full improvement pass find no unresolved required work + EVIDENCE: pending + +ABANDON: G10 The user requested closure with the current version on 2026-09-11 UTC. Latest accepted-runtime flight remains below the original frame-time target; no threshold was weakened, and further performance iteration is stopped at the user's request. See logs/closeout.md. +ABANDON: G13 Automatic approval review rejected uploading the private source and runtime to external Sites without explicit destination approval. The upload question was unanswered when the user requested closure; no upload or deployment occurred. Local handoff only. +ABANDON: G14 The original all-requirements-met certification is not claimed: G10 and G13 remain unachieved. The user accepted the current version and requested closure, so the final audit records these handoffs instead of continuing improvement. diff --git a/astra_scene_test/X_03/README.md b/astra_scene_test/X_03/README.md new file mode 100644 index 0000000000000000000000000000000000000000..957d4490a97eb1048010fe2cf4208cf119dc92cf --- /dev/null +++ b/astra_scene_test/X_03/README.md @@ -0,0 +1,50 @@ +# Forest + +浏览器中的实时森林,整个画面只有森林。 + +点击画面后用鼠标环顾;W/A/S/D 移动,Q/E 或空格升降,Shift 加速,R 返回起点,Escape 释放鼠标。触屏左侧拖动移动,右侧拖动环顾。 + +需要支持 WebGL 2 的现代浏览器。画面会根据持续帧耗时调整内部渲染分辨率,并以完整输出分辨率累积细节。自由相机可在中央约 210 × 210 米范围内探索,远处森林延伸到视野之外。 + +## 本地运行 + +使用 Node.js 22.13 或更新版本: + +```sh +npm ci +npm run dev +``` + +```sh +npm run build +``` + +静态输出位于 `dist/client`。构建后可用普通静态服务器运行: + +```sh +python3 -m http.server 5174 --bind 127.0.0.1 --directory dist/client +``` + +打开 http://127.0.0.1:5174/。不要直接双击 HTML 文件。 + +本地另存的最终运行包为 `outputs/forest-final.tar.gz`;解压后静态网站位于其中的 `dist/`。运行包、截图和原始研究文件保留在本机,不纳入 Git 源码提交。 + +## 实现与记录 + +树冠、枝条、草、蕨类、灌木、酢浆草、野花、落叶、菌类等使用实际三维网格;树木和植物有多级细节、独立阴影批次与空间裁剪。岩石、枯木和部分植物使用经过优化的 CC0 扫描资产。近处树叶在工作线程中细化,加载完成前保留普通树叶。 + +光照包含树冠遮蔽、接触阴影、随相机移动的太阳阴影、体积散射、薄叶透光、分层雾和细小花粉。没有额外页面、营销文字或操作面板。 + +- [操作日志](log.md) 与 [机器可读操作记录](logs/operations.jsonl) +- [耗时、token 与成本记录](logs/耗时与成本.md) +- [收尾说明与已知限制](logs/closeout.md) +- [验收账本](GATES.md) +- [资产来源](ASSETS.md) + +截图和逐轮视觉评审保存在 `logs/visual/`,自动检查结果保存在 `logs/verification/`。大体积的原始扫描文件与视觉研究保留在本地研究目录,不进入网站运行包。 + +原始 token 计数包含缓存输入,不能把缓存计数再次相加。实际账单成本没有暴露,因此记录为未知;不以估算价格冒充实际费用。墙钟时间与活动覆盖时间分别记录,不能混称纯实现工时。 + +`npm run lint` 检查活动森林实现与验证脚本;本地研究快照、原样保留的第三方解码器和未被页面引用的通用 UI 脚手架不纳入此命令,避免改写历史实验。TypeScript 检查仍可运行 `npx tsc --noEmit`。 + +当前为用户接受并要求收尾的本地版本。最新完整探索的帧耗时未达到原定性能目标,冷启动在高负载机器上可能较慢;具体测量与未发布原因见收尾说明。 diff --git a/astra_scene_test/X_03/app/globals.css b/astra_scene_test/X_03/app/globals.css new file mode 100644 index 0000000000000000000000000000000000000000..d80fb876afcbaf45da8a9d6e14eddaca243e21e7 --- /dev/null +++ b/astra_scene_test/X_03/app/globals.css @@ -0,0 +1,6 @@ +:root { color-scheme: dark; --background: #101b17; --foreground: #cbd4bc; } +* { box-sizing: border-box; } +html, body, #forest { margin: 0; width: 100%; height: 100%; overflow: hidden; background: var(--background); } +html, body { overscroll-behavior: none; } +#forest { position: fixed; inset: 0; touch-action: none; } +#forest canvas { display: block; width: 100%; height: 100%; outline: none; } diff --git a/astra_scene_test/X_03/app/icon.svg b/astra_scene_test/X_03/app/icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..deaac578c8ab38a946b10aaf8b8e3920a4d3a65e --- /dev/null +++ b/astra_scene_test/X_03/app/icon.svg @@ -0,0 +1 @@ + diff --git a/astra_scene_test/X_03/app/layout.tsx b/astra_scene_test/X_03/app/layout.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3d5cd3e2b5c70aa2a7a81c36e2c6509f2cd7d098 --- /dev/null +++ b/astra_scene_test/X_03/app/layout.tsx @@ -0,0 +1,9 @@ +import type { Metadata } from 'next'; +import './globals.css'; +export const metadata: Metadata = { + title: 'Forest', + description: 'An immersive real-time forest.', +}; +export default function RootLayout({children}: Readonly<{children: React.ReactNode}>) { + return {children}; +} diff --git a/astra_scene_test/X_03/app/page.tsx b/astra_scene_test/X_03/app/page.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e8ccdeb8078856966559ad6ea7c4c040ec5cd781 --- /dev/null +++ b/astra_scene_test/X_03/app/page.tsx @@ -0,0 +1,23 @@ +'use client'; +import { useEffect, useRef } from 'react'; + +export default function ForestPage() { + const mount = useRef(null); + useEffect(() => { + let canceled = false; + const controller = new AbortController(); + let dispose: undefined | (() => void); + import('../lib/forest/scene.js').then(async ({ createForest }) => { + if (canceled || !mount.current) return; + const forest = await createForest(mount.current, { signal: controller.signal }); + if (canceled) forest.dispose(); + else dispose = forest.dispose; + }).catch((error) => { + if (canceled || error?.name === 'AbortError') return; + console.error('Forest initialization failed', error); + if (mount.current) mount.current.dataset.error = String(error); + }); + return () => { canceled = true; controller.abort(); dispose?.(); }; + }, []); + return
; +} diff --git a/astra_scene_test/X_03/components.json b/astra_scene_test/X_03/components.json new file mode 100644 index 0000000000000000000000000000000000000000..f382eb79e22a42ad32685df41f70ea739f73d65d --- /dev/null +++ b/astra_scene_test/X_03/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "base-nova", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/astra_scene_test/X_03/components/ui/attachment.tsx b/astra_scene_test/X_03/components/ui/attachment.tsx new file mode 100644 index 0000000000000000000000000000000000000000..108ab4da821dc9d71ddb31a1f8a7e36f64e6145a --- /dev/null +++ b/astra_scene_test/X_03/components/ui/attachment.tsx @@ -0,0 +1,207 @@ +import * as React from 'react'; +import { mergeProps } from '@base-ui/react/merge-props'; +import { useRender } from '@base-ui/react/use-render'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; +import { Button } from '@/components/ui/button'; + +const attachmentVariants = cva( + 'rounded-xl w-fit focus-within:ring-1 focus-within:ring-ring/50 group/attachment relative flex max-w-full min-w-0 shrink-0 flex-wrap border bg-card text-card-foreground transition-colors has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed', + { + variants: { + size: { + default: + 'gap-2 has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2 text-sm', + sm: 'gap-2.5 has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5 text-xs', + xs: 'gap-1.5 has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1 text-xs rounded-lg', + }, + orientation: { + horizontal: 'min-w-40 items-center', + vertical: 'w-24 has-data-[slot=attachment-content]:w-30 flex-col', + }, + }, + }, +); + +function Attachment({ + className, + state = 'done', + size = 'default', + orientation = 'horizontal', + ...props +}: React.ComponentProps<'div'> & + VariantProps & { + state?: 'idle' | 'uploading' | 'processing' | 'error' | 'done'; + }) { + return ( +
+ ); +} + +const attachmentMediaVariants = cva( + "bg-muted text-foreground w-10 rounded-lg group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md [&_svg:not([class*='size-'])]:size-4 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5 group-data-[orientation=vertical]/attachment:w-full group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! relative flex aspect-square shrink-0 items-center justify-center overflow-hidden group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive [&_svg]:pointer-events-none", + { + variants: { + variant: { + icon: '', + image: + 'opacity-60 group-data-[state=idle]/attachment:opacity-100 group-data-[state=done]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover', + }, + }, + defaultVariants: { + variant: 'icon', + }, + }, +); + +function AttachmentMedia({ + className, + variant = 'icon', + ...props +}: React.ComponentProps<'div'> & VariantProps) { + return ( +
+ ); +} + +function AttachmentContent({ + className, + ...props +}: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function AttachmentTitle({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ); +} + +function AttachmentDescription({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ); +} + +function AttachmentActions({ + className, + ...props +}: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function AttachmentAction({ + className, + variant, + size = 'icon-xs', + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CarouselNext({ + className, + variant = 'outline', + size = 'icon-sm', + ...props +}: React.ComponentProps) { + const { orientation, scrollNext, canScrollNext } = useCarousel(); + + return ( + + ); +} + +export { + type CarouselApi, + Carousel, + CarouselContent, + CarouselItem, + CarouselPrevious, + CarouselNext, + useCarousel, +}; diff --git a/astra_scene_test/X_03/components/ui/checkbox.tsx b/astra_scene_test/X_03/components/ui/checkbox.tsx new file mode 100644 index 0000000000000000000000000000000000000000..990dbaf0675457cde8da3ae05ba701caf5cb8184 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/checkbox.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'; + +import { cn } from '@/lib/utils'; +import { CheckIcon } from 'lucide-react'; + +function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) { + return ( + + + + + + ); +} + +export { Checkbox }; diff --git a/astra_scene_test/X_03/components/ui/collapsible.tsx b/astra_scene_test/X_03/components/ui/collapsible.tsx new file mode 100644 index 0000000000000000000000000000000000000000..93a385188279f8fef89b26171cd11575f5513fbc --- /dev/null +++ b/astra_scene_test/X_03/components/ui/collapsible.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { Collapsible as CollapsiblePrimitive } from '@base-ui/react/collapsible'; + +function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) { + return ; +} + +function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) { + return ( + + ); +} + +function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) { + return ( + + ); +} + +export { Collapsible, CollapsibleTrigger, CollapsibleContent }; diff --git a/astra_scene_test/X_03/components/ui/command.tsx b/astra_scene_test/X_03/components/ui/command.tsx new file mode 100644 index 0000000000000000000000000000000000000000..af126f40ebefee93b580c9808786171656a0cd7f --- /dev/null +++ b/astra_scene_test/X_03/components/ui/command.tsx @@ -0,0 +1,193 @@ +'use client'; + +import * as React from 'react'; +import { Command as CommandPrimitive } from 'cmdk'; + +import { cn } from '@/lib/utils'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { InputGroup, InputGroupAddon } from '@/components/ui/input-group'; +import { SearchIcon, CheckIcon } from 'lucide-react'; + +function Command({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CommandDialog({ + title = 'Command Palette', + description = 'Search for a command to run...', + children, + className, + showCloseButton = false, + ...props +}: Omit, 'children'> & { + title?: string; + description?: string; + className?: string; + showCloseButton?: boolean; + children: React.ReactNode; +}) { + return ( + + + {title} + {description} + + + {children} + + + ); +} + +function CommandInput({ + className, + ...props +}: React.ComponentProps) { + return ( +
+ + + + + + +
+ ); +} + +function CommandList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CommandEmpty({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CommandGroup({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CommandSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function CommandItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + {children} + + + ); +} + +function CommandShortcut({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ); +} + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +}; diff --git a/astra_scene_test/X_03/components/ui/context-menu.tsx b/astra_scene_test/X_03/components/ui/context-menu.tsx new file mode 100644 index 0000000000000000000000000000000000000000..402a3a347803f3b2ed4adf37d3932bf2da9d6436 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/context-menu.tsx @@ -0,0 +1,272 @@ +'use client'; + +import * as React from 'react'; +import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu'; + +import { cn } from '@/lib/utils'; +import { ChevronRightIcon, CheckIcon } from 'lucide-react'; + +function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) { + return ; +} + +function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) { + return ( + + ); +} + +function ContextMenuTrigger({ + className, + ...props +}: ContextMenuPrimitive.Trigger.Props) { + return ( + + ); +} + +function ContextMenuContent({ + className, + align = 'start', + alignOffset = 4, + side = 'right', + sideOffset = 0, + ...props +}: ContextMenuPrimitive.Popup.Props & + Pick< + ContextMenuPrimitive.Positioner.Props, + 'align' | 'alignOffset' | 'side' | 'sideOffset' + >) { + return ( + + + + + + ); +} + +function ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) { + return ( + + ); +} + +function ContextMenuLabel({ + className, + inset, + ...props +}: ContextMenuPrimitive.GroupLabel.Props & { + inset?: boolean; +}) { + return ( + + ); +} + +function ContextMenuItem({ + className, + inset, + variant = 'default', + ...props +}: ContextMenuPrimitive.Item.Props & { + inset?: boolean; + variant?: 'default' | 'destructive'; +}) { + return ( + + ); +} + +function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) { + return ( + + ); +} + +function ContextMenuSubTrigger({ + className, + inset, + children, + ...props +}: ContextMenuPrimitive.SubmenuTrigger.Props & { + inset?: boolean; +}) { + return ( + + {children} + + + ); +} + +function ContextMenuSubContent({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function ContextMenuCheckboxItem({ + className, + children, + checked, + inset, + ...props +}: ContextMenuPrimitive.CheckboxItem.Props & { + inset?: boolean; +}) { + return ( + + + + + + + {children} + + ); +} + +function ContextMenuRadioGroup({ + ...props +}: ContextMenuPrimitive.RadioGroup.Props) { + return ( + + ); +} + +function ContextMenuRadioItem({ + className, + children, + inset, + ...props +}: ContextMenuPrimitive.RadioItem.Props & { + inset?: boolean; +}) { + return ( + + + + + + + {children} + + ); +} + +function ContextMenuSeparator({ + className, + ...props +}: ContextMenuPrimitive.Separator.Props) { + return ( + + ); +} + +function ContextMenuShortcut({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ); +} + +export { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +}; diff --git a/astra_scene_test/X_03/components/ui/dialog.tsx b/astra_scene_test/X_03/components/ui/dialog.tsx new file mode 100644 index 0000000000000000000000000000000000000000..019e0eb85b7a311fb9d7fab8e616912823020245 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/dialog.tsx @@ -0,0 +1,159 @@ +'use client'; + +import * as React from 'react'; +import { Dialog as DialogPrimitive } from '@base-ui/react/dialog'; + +import { cn } from '@/lib/utils'; +import { Button } from '@/components/ui/button'; +import { XIcon } from 'lucide-react'; + +function Dialog({ ...props }: DialogPrimitive.Root.Props) { + return ; +} + +function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) { + return ; +} + +function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) { + return ; +} + +function DialogClose({ ...props }: DialogPrimitive.Close.Props) { + return ; +} + +function DialogOverlay({ + className, + ...props +}: DialogPrimitive.Backdrop.Props) { + return ( + + ); +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: DialogPrimitive.Popup.Props & { + showCloseButton?: boolean; +}) { + return ( + + + + {children} + {showCloseButton && ( + + } + > + + Close + + )} + + + ); +} + +function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function DialogFooter({ + className, + showCloseButton = false, + children, + ...props +}: React.ComponentProps<'div'> & { + showCloseButton?: boolean; +}) { + return ( +
+ {children} + {showCloseButton && ( + }> + Close + + )} +
+ ); +} + +function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) { + return ( + + ); +} + +function DialogDescription({ + className, + ...props +}: DialogPrimitive.Description.Props) { + return ( + + ); +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +}; diff --git a/astra_scene_test/X_03/components/ui/dropdown-menu.tsx b/astra_scene_test/X_03/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1cfacf7b982db6b7b54b1f230085780f1903884e --- /dev/null +++ b/astra_scene_test/X_03/components/ui/dropdown-menu.tsx @@ -0,0 +1,272 @@ +'use client'; + +import * as React from 'react'; +import { Menu as MenuPrimitive } from '@base-ui/react/menu'; + +import { cn } from '@/lib/utils'; +import { ChevronRightIcon, CheckIcon } from 'lucide-react'; + +function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) { + return ; +} + +function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) { + return ; +} + +function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) { + return ; +} + +function DropdownMenuContent({ + align = 'start', + alignOffset = 0, + side = 'bottom', + sideOffset = 4, + className, + ...props +}: MenuPrimitive.Popup.Props & + Pick< + MenuPrimitive.Positioner.Props, + 'align' | 'alignOffset' | 'side' | 'sideOffset' + >) { + return ( + + + + + + ); +} + +function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) { + return ; +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: MenuPrimitive.GroupLabel.Props & { + inset?: boolean; +}) { + return ( + + ); +} + +function DropdownMenuItem({ + className, + inset, + variant = 'default', + ...props +}: MenuPrimitive.Item.Props & { + inset?: boolean; + variant?: 'default' | 'destructive'; +}) { + return ( + + ); +} + +function DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) { + return ; +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: MenuPrimitive.SubmenuTrigger.Props & { + inset?: boolean; +}) { + return ( + + {children} + + + ); +} + +function DropdownMenuSubContent({ + align = 'start', + alignOffset = -3, + side = 'right', + sideOffset = 0, + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + inset, + ...props +}: MenuPrimitive.CheckboxItem.Props & { + inset?: boolean; +}) { + return ( + + + + + + + {children} + + ); +} + +function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) { + return ( + + ); +} + +function DropdownMenuRadioItem({ + className, + children, + inset, + ...props +}: MenuPrimitive.RadioItem.Props & { + inset?: boolean; +}) { + return ( + + + + + + + {children} + + ); +} + +function DropdownMenuSeparator({ + className, + ...props +}: MenuPrimitive.Separator.Props) { + return ( + + ); +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ); +} + +export { + DropdownMenu, + DropdownMenuPortal, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubTrigger, + DropdownMenuSubContent, +}; diff --git a/astra_scene_test/X_03/components/ui/input.tsx b/astra_scene_test/X_03/components/ui/input.tsx new file mode 100644 index 0000000000000000000000000000000000000000..70c195a90602ff71ea730884e96dae029b87fbd3 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/input.tsx @@ -0,0 +1,20 @@ +import * as React from 'react'; +import { Input as InputPrimitive } from '@base-ui/react/input'; + +import { cn } from '@/lib/utils'; + +function Input({ className, type, ...props }: React.ComponentProps<'input'>) { + return ( + + ); +} + +export { Input }; diff --git a/astra_scene_test/X_03/components/ui/item.tsx b/astra_scene_test/X_03/components/ui/item.tsx new file mode 100644 index 0000000000000000000000000000000000000000..525610d8f9c17d24263b4d1b09a3e6e835cfa177 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/item.tsx @@ -0,0 +1,201 @@ +import * as React from 'react'; +import { mergeProps } from '@base-ui/react/merge-props'; +import { useRender } from '@base-ui/react/use-render'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; +import { Separator } from '@/components/ui/separator'; + +function ItemGroup({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function ItemSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +const itemVariants = cva( + '[a]:hover:bg-muted rounded-lg border text-sm group/item flex w-full flex-wrap items-center transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors', + { + variants: { + variant: { + default: 'border-transparent', + outline: 'border-border', + muted: 'bg-muted/50 border-transparent', + }, + size: { + default: 'gap-2.5 px-3 py-2.5', + sm: 'gap-2.5 px-3 py-2.5', + xs: 'gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +function Item({ + className, + variant = 'default', + size = 'default', + render, + ...props +}: useRender.ComponentProps<'div'> & VariantProps) { + return useRender({ + defaultTagName: 'div', + props: mergeProps<'div'>( + { + className: cn(itemVariants({ variant, size, className })), + }, + props, + ), + render, + state: { + slot: 'item', + variant, + size, + }, + }); +} + +const itemMediaVariants = cva( + 'gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start flex shrink-0 items-center justify-center [&_svg]:pointer-events-none', + { + variants: { + variant: { + default: 'bg-transparent', + icon: "[&_svg:not([class*='size-'])]:size-4", + image: + 'size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +function ItemMedia({ + className, + variant = 'default', + ...props +}: React.ComponentProps<'div'> & VariantProps) { + return ( +
+ ); +} + +function ItemContent({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function ItemTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function ItemDescription({ className, ...props }: React.ComponentProps<'p'>) { + return ( +

a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary', + className, + )} + {...props} + /> + ); +} + +function ItemActions({ className, ...props }: React.ComponentProps<'div'>) { + return ( +

+ ); +} + +function ItemHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +function ItemFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ); +} + +export { + Item, + ItemMedia, + ItemContent, + ItemActions, + ItemGroup, + ItemSeparator, + ItemTitle, + ItemDescription, + ItemHeader, + ItemFooter, +}; diff --git a/astra_scene_test/X_03/components/ui/kbd.tsx b/astra_scene_test/X_03/components/ui/kbd.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fd4e9b15dd1fd780be83c723b05ff93eac44bb1c --- /dev/null +++ b/astra_scene_test/X_03/components/ui/kbd.tsx @@ -0,0 +1,26 @@ +import { cn } from '@/lib/utils'; + +function Kbd({ className, ...props }: React.ComponentProps<'kbd'>) { + return ( + + ); +} + +function KbdGroup({ className, ...props }: React.ComponentProps<'div'>) { + return ( + + ); +} + +export { Kbd, KbdGroup }; diff --git a/astra_scene_test/X_03/components/ui/marker.tsx b/astra_scene_test/X_03/components/ui/marker.tsx new file mode 100644 index 0000000000000000000000000000000000000000..031db961e8d6ad47a44e0e8cdbf32a8c9fc8b221 --- /dev/null +++ b/astra_scene_test/X_03/components/ui/marker.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import { mergeProps } from '@base-ui/react/merge-props'; +import { useRender } from '@base-ui/react/use-render'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const markerVariants = cva( + "gap-2 text-sm text-muted-foreground [a]:hover:text-foreground [a]:underline-offset-3 [a]:underline [&_svg:not([class*='size-'])]:size-4 min-h-4 text-left group/marker relative flex w-full items-center", + { + variants: { + variant: { + default: '', + separator: + 'before:h-px before:min-w-0 before:flex-1 before:bg-border after:h-px after:min-w-0 after:flex-1 after:bg-border before:mr-1 after:ml-1', + border: 'border-b border-border pb-2', + }, + }, + }, +); + +function Marker({ + className, + variant = 'default', + render, + ...props +}: useRender.ComponentProps<'div'> & VariantProps) { + return useRender({ + defaultTagName: 'div', + props: mergeProps<'div'>( + { + className: cn(markerVariants({ variant, className })), + }, + props, + ), + render, + state: { + slot: 'marker', + variant, + }, + }); +} + +function MarkerIcon({ className, ...props }: React.ComponentProps<'span'>) { + return ( +