diff --git a/.gitattributes b/.gitattributes
index f4d823d12e5195f81bd061aff965d3903aaa1471..c1748938270eba6430599859bd9e252bca0b81fb 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -634,3 +634,53 @@ frames/f0598.jpg filter=lfs diff=lfs merge=lfs -text
frames/f0599.jpg filter=lfs diff=lfs merge=lfs -text
frames/f0600.jpg filter=lfs diff=lfs merge=lfs -text
window.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_01.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_01.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_02.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_02.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_03.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_03.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_04.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_04.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_05.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_05.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_06.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_06.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_07.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_07.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_08.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_08.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_09.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_09.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_10.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_10.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_11.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_11.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_12.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_12.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_13.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_13.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_14.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_14.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_15.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_15.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_16.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_16.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_17.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_17.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_18.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_18.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_19.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_19.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_20.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_20.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_21.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_21.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_22.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_22.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_23.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_23.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_24.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_24.mp4 filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_25.jpg filter=lfs diff=lfs merge=lfs -text
+overlay25/clips/event_25.mp4 filter=lfs diff=lfs merge=lfs -text
diff --git a/action_sample25_overlay.html b/action_sample25_overlay.html
new file mode 100644
index 0000000000000000000000000000000000000000..e7dd112d1bf90a94f0d4d8218f97241f0b9e3278
--- /dev/null
+++ b/action_sample25_overlay.html
@@ -0,0 +1 @@
+
Mocap overlays — 25 review clips25 mocap overlay clips · Z-up · 4 seconds each
Top: raw mocap. Bottom: repair candidate, not ground truth. Both show the same measured footage in left / middle / right camera order. Dots and XYZ axes use the existing preview renderer. Calibration camera files explicitly declare Z-up and are used unchanged. Flagged events are not confirmed tracking loss. Segment-edge clips remain inside their segment; no missing context is invented.
Pose charts and original camera links · Frame ranges and calibration hashes
1. data/motherboard/meta/2026-09-11/episode_007_seg00.parquet::right:544-544:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
2. data/rope/meta/2026-09-14/episode_003_seg01.parquet::right:3960-3964:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
3. data/pushT/meta/2026-09-10/episode_003_seg02.parquet::left:10247-10248:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
4. data/toy/meta/2026-09-14/episode_000_seg00.parquet::left:6525-6529:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
5. data/validation/meta/2026-09-09/episode_001.parquet::right:1394-1397:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
6. old_data/motherboard/meta/2026-05-10/episode_000.parquet::left:6729-6729:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
7. old_data/pushT/meta/2026-06-18/episode_001.parquet::left:11024-11027:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
8. data/motherboard/meta/2026-09-11/episode_007_seg02.parquet::left:11508-11524:known_gap
robust_se3_hermite · HIGH · UNVERIFIED · 4.0s
9. data/validation/meta/2026-09-09/episode_003.parquet::right:7010-7015:branch_discontinuity
robust_se3_hermite · MEDIUM · UNVERIFIED · 4.0s
10. data/pushT/meta/2026-09-10/episode_004_seg00.parquet::left:568-571:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
11. data/rope/meta/2026-09-11/episode_000_seg00.parquet::left:2114-2116:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
12. data/toy/meta/2026-09-14/episode_000_seg00.parquet::right:5938-5938:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
13. old_data/motherboard/meta/2026-05-10/episode_002.parquet::left:10364-10364:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
14. old_data/pushT/meta/2026-06-18/episode_001.parquet::left:7981-7984:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
15. data/validation/meta/2026-09-09/episode_005.parquet::right:1081-1087:branch_discontinuity
robust_se3_hermite · MEDIUM · UNVERIFIED · 4.0s
16. data/motherboard/meta/2026-09-11/episode_007_seg04.parquet::right:24330-24330:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
17. data/pushT/meta/2026-09-10/episode_004_seg02.parquet::right:10779-10781:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
18. data/rope/meta/2026-09-11/episode_000_seg00.parquet::left:816-819:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
19. data/toy/meta/2026-09-14/episode_000_seg03.parquet::right:15106-15107:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
20. old_data/motherboard/meta/2026-05-11/episode_005.parquet::right:10454-10454:branch_discontinuity
endpoint_se3 · MEDIUM · UNVERIFIED · 4.0s
21. data/motherboard/meta/2026-09-11/episode_007_seg04.parquet::left:24381-24421:gap_with_discontinuity
unrepaired_ambiguous_branch · LOW · UNVERIFIED · 4.0s
22. old_data/motherboard/meta/2026-05-11/episode_013.parquet::left:8050-8112:known_gap
unrepaired_ambiguous_branch · LOW · UNVERIFIED · 4.0s
23. old_data/pushT/meta/2026-06-18/episode_001.parquet::left:9752-9758:branch_review
paired_body_branch_review · MEDIUM · UNVERIFIED · 4.0s
24. data/validation/meta/2026-09-09/episode_003.parquet::left:6412-6439:branch_discontinuity
unrepaired_ambiguous_branch · LOW · UNVERIFIED · 4.0s
25. old_data/motherboard/meta/2026-05-11/episode_015.parquet::left:708-768:known_gap
unrepaired_ambiguous_branch · LOW · UNVERIFIED · 4.0s
\ No newline at end of file
diff --git a/overlay25/calibration/data/motherboard/T_gel_to_rigid_left.json b/overlay25/calibration/data/motherboard/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..1841cac1133234442ca99335532512a32e25b04f
--- /dev/null
+++ b/overlay25/calibration/data/motherboard/T_gel_to_rigid_left.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/motherboard/T_gel_to_rigid_right.json b/overlay25/calibration/data/motherboard/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d1dd67c265e1bc0d24caac4eef373db2106c5ff
--- /dev/null
+++ b/overlay25/calibration/data/motherboard/T_gel_to_rigid_right.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/motherboard/T_mocap_to_cam_left.json b/overlay25/calibration/data/motherboard/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..56e9fd32527ce5590fd801fd9bb41bcc77018fc8
--- /dev/null
+++ b/overlay25/calibration/data/motherboard/T_mocap_to_cam_left.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 143.7419891357422,
+ 178.2099151611328
+ ],
+ [
+ 189.45152282714844,
+ 150.98486328125
+ ],
+ [
+ 147.97055053710938,
+ 220.66168212890625
+ ],
+ [
+ 173.2666778564453,
+ 161.04458618164062
+ ],
+ [
+ 294.1172790527344,
+ 280.3843994140625
+ ],
+ [
+ 334.7158203125,
+ 330.51019287109375
+ ],
+ [
+ 276.5556640625,
+ 373.0362854003906
+ ],
+ [
+ 306.35986328125,
+ 295.54974365234375
+ ],
+ [
+ 36.820892333984375,
+ 159.5347137451172
+ ],
+ [
+ 99.56674194335938,
+ 216.884765625
+ ],
+ [
+ 97.03021240234375,
+ 197.2443389892578
+ ],
+ [
+ 163.9508514404297,
+ 107.2503890991211
+ ],
+ [
+ 214.92898559570312,
+ 179.42526245117188
+ ],
+ [
+ 175.64276123046875,
+ 164.6315460205078
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -265.3074860572815,
+ -71.51607424020767,
+ 936.7824792861938
+ ],
+ [
+ -189.91339206695557,
+ -110.53171753883362,
+ 912.6609563827515
+ ],
+ [
+ -254.59101796150208,
+ -6.024590227752924,
+ 921.5573072433472
+ ],
+ [
+ -220.07083892822266,
+ -98.0551466345787,
+ 937.7188682556152
+ ],
+ [
+ -28.192222118377686,
+ 71.64862751960754,
+ 781.6218733787537
+ ],
+ [
+ 22.724416106939316,
+ 129.05201315879822,
+ 741.2945628166199
+ ],
+ [
+ -46.32071778178215,
+ 174.07649755477905,
+ 713.3781909942627
+ ],
+ [
+ -12.383990921080112,
+ 90.54456651210785,
+ 776.5170931816101
+ ],
+ [
+ -508.81510972976685,
+ -118.68498474359512,
+ 1108.68239402771
+ ],
+ [
+ -340.10186791419983,
+ -12.184998020529747,
+ 955.8426737785339
+ ],
+ [
+ -351.6928255558014,
+ -44.00604963302612,
+ 976.9721627235413
+ ],
+ [
+ -205.46074211597443,
+ -158.63607823848724,
+ 821.8494057655334
+ ],
+ [
+ -137.51870393753052,
+ -61.50858476758003,
+ 827.3531198501587
+ ],
+ [
+ -198.6142098903656,
+ -84.91630107164383,
+ 860.612690448761
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.5820335045117107,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.8080875343628796,
+ 0.37166043358369666,
+ 0.30035844374306286,
+ 0.16766178529659098,
+ 0.2928865608577506,
+ 0.08605706634747436,
+ 0.3712100186965587,
+ 0.3838618203482641,
+ 1.6306500334269773,
+ 0.47351243090931516,
+ 0.3479136287525737,
+ 0.3214674927609189,
+ 0.35833809787519083,
+ 0.46782397947608595
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8868154787413457,
+ -0.3021879229672767,
+ -0.3496294694065147,
+ 128.8094236392457
+ ],
+ [
+ -0.17335478597935233,
+ 0.9188568726749307,
+ -0.35447167124623546,
+ 232.76972168031767
+ ],
+ [
+ 0.4283764989385047,
+ -0.25374102299543433,
+ -0.8672422201475316,
+ 701.0505085345026
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/motherboard/T_mocap_to_cam_middle.json b/overlay25/calibration/data/motherboard/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..0156c76afb64bafc0a9b5afcae391a786cffaaa3
--- /dev/null
+++ b/overlay25/calibration/data/motherboard/T_mocap_to_cam_middle.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 419.8519287109375,
+ 242.45101928710938
+ ],
+ [
+ 361.4404602050781,
+ 281.3619689941406
+ ],
+ [
+ 388.0091552734375,
+ 190.78221130371094
+ ],
+ [
+ 379.912353515625,
+ 267.10565185546875
+ ],
+ [
+ 179.5079345703125,
+ 156.41310119628906
+ ],
+ [
+ 130.3328857421875,
+ 120.79955291748047
+ ],
+ [
+ 157.44979858398438,
+ 58.920013427734375
+ ],
+ [
+ 162.91932678222656,
+ 146.43170166015625
+ ],
+ [
+ 535.0,
+ 220.0
+ ],
+ [
+ 458.49053955078125,
+ 185.263916015625
+ ],
+ [
+ 465.74908447265625,
+ 205.1256866455078
+ ],
+ [
+ 352.8275146484375,
+ 302.9422912597656
+ ],
+ [
+ 287.23797607421875,
+ 240.01736450195312
+ ],
+ [
+ 354.85638427734375,
+ 252.9636688232422
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 111.06016486883163,
+ 3.943601157516241,
+ 774.1832137107849
+ ],
+ [
+ 36.83480620384216,
+ 53.49968001246452,
+ 774.6483087539673
+ ],
+ [
+ 72.89083302021027,
+ -63.83784860372543,
+ 799.4796633720398
+ ],
+ [
+ 61.44605576992035,
+ 35.9986275434494,
+ 788.995087146759
+ ],
+ [
+ -193.46380233764648,
+ -105.02921789884567,
+ 770.281195640564
+ ],
+ [
+ -255.4701864719391,
+ -150.01900494098663,
+ 769.7222232818604
+ ],
+ [
+ -213.37243914604187,
+ -220.24264931678772,
+ 742.4835562705994
+ ],
+ [
+ -215.60049057006836,
+ -118.30388754606247,
+ 774.4371294975281
+ ],
+ [
+ 227.43911743164062,
+ -21.76175308227539,
+ 684.0000610351562
+ ],
+ [
+ 164.66139256954193,
+ -70.76992094516754,
+ 795.8716154098511
+ ],
+ [
+ 169.54033076763153,
+ -43.598201125860214,
+ 774.821937084198
+ ],
+ [
+ 22.041086107492447,
+ 68.96940618753433,
+ 659.7349643707275
+ ],
+ [
+ -54.32060360908508,
+ 0.7992741302587092,
+ 731.2875390052795
+ ],
+ [
+ 26.847360655665398,
+ 16.35139249265194,
+ 730.736494064331
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6957969799496961,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.17269310973865823,
+ 0.34678606316542004,
+ 0.7949263280824498,
+ 0.7595155335193595,
+ 0.46703748193000916,
+ 0.4298708481893768,
+ 1.1222337545259984,
+ 1.3263655425582945,
+ 0.35087765728361514,
+ 0.6862180249885633,
+ 0.16974670365446598,
+ 0.380060158735936,
+ 0.8606992412014269,
+ 0.6995517552033408
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995314292450528,
+ 0.026616003224703866,
+ 0.015116557931100139,
+ -373.5077365832549
+ ],
+ [
+ 0.026586035283918216,
+ -0.99964415184602,
+ 0.0021800018195975604,
+ -223.2913479600006
+ ],
+ [
+ 0.015169201667326097,
+ -0.0017770909919715434,
+ -0.9998833618319598,
+ 816.5209880955446
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/motherboard/T_mocap_to_cam_right.json b/overlay25/calibration/data/motherboard/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..52f87b6c40ab63aa00ff254dd7ae2c66eb5274e1
--- /dev/null
+++ b/overlay25/calibration/data/motherboard/T_mocap_to_cam_right.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 364.28118896484375,
+ 226.3100128173828
+ ],
+ [
+ 375.09521484375,
+ 172.0719451904297
+ ],
+ [
+ 418.16552734375,
+ 239.4901885986328
+ ],
+ [
+ 372.248291015625,
+ 189.38470458984375
+ ],
+ [
+ 538.5238037109375,
+ 161.0652618408203
+ ],
+ [
+ 578.2669067382812,
+ 164.14666748046875
+ ],
+ [
+ 614.590576171875,
+ 193.21926879882812
+ ],
+ [
+ 551.4354248046875,
+ 161.53729248046875
+ ],
+ [
+ 338.0,
+ 254.0
+ ],
+ [
+ 384.0,
+ 281.0
+ ],
+ [
+ 368.0,
+ 265.0
+ ],
+ [
+ 392.0,
+ 114.0
+ ],
+ [
+ 448.0,
+ 147.0
+ ],
+ [
+ 404.0,
+ 171.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 67.61006265878677,
+ -23.48441816866398,
+ 832.8875303268433
+ ],
+ [
+ 88.18109333515167,
+ -104.7908216714859,
+ 891.2064433097839
+ ],
+ [
+ 147.3912000656128,
+ -5.622966680675745,
+ 868.4306144714355
+ ],
+ [
+ 82.71369338035583,
+ -78.13647389411926,
+ 877.4359226226807
+ ],
+ [
+ 355.0775647163391,
+ -131.134495139122,
+ 966.1950469017029
+ ],
+ [
+ 432.61927366256714,
+ -130.58704137802124,
+ 999.561607837677
+ ],
+ [
+ 461.81631088256836,
+ -77.57735252380371,
+ 937.7017617225647
+ ],
+ [
+ 380.2844285964966,
+ -132.01692700386047,
+ 978.3041477203369
+ ],
+ [
+ 26.19326400756836,
+ 12.023463249206543,
+ 689.5000610351562
+ ],
+ [
+ 91.6579360961914,
+ 49.98165512084961,
+ 807.0000610351562
+ ],
+ [
+ 67.21060180664062,
+ 27.386150360107422,
+ 770.0000610351562
+ ],
+ [
+ 102.01334381103516,
+ -171.697021484375,
+ 805.0000610351562
+ ],
+ [
+ 192.27865600585938,
+ -139.675537109375,
+ 879.0000610351562
+ ],
+ [
+ 124.037841796875,
+ -101.0892105102539,
+ 847.0000610351562
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6641288760028174,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.7334514837464046,
+ 0.45635472009079076,
+ 0.8970694696327521,
+ 0.31806234529960986,
+ 0.6865228817112038,
+ 0.21057826799310805,
+ 0.912277422276382,
+ 0.43994664737977,
+ 0.21418442105906682,
+ 1.074796181357606,
+ 0.6873076709576346,
+ 0.7207901345940971,
+ 0.8239751206098153,
+ 0.33082506738831163
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.688097867430995,
+ 0.7023816139017327,
+ 0.1821576056323592,
+ 543.5657328540357
+ ],
+ [
+ 0.5425582025081412,
+ 0.6647209947925371,
+ -0.5135918573859546,
+ -115.44031421123972
+ ],
+ [
+ -0.4818214625025037,
+ -0.2545703587121193,
+ -0.8384760048666456,
+ 1059.2626265195877
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/pushT/T_gel_to_rigid_left.json b/overlay25/calibration/data/pushT/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..1841cac1133234442ca99335532512a32e25b04f
--- /dev/null
+++ b/overlay25/calibration/data/pushT/T_gel_to_rigid_left.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/pushT/T_gel_to_rigid_right.json b/overlay25/calibration/data/pushT/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d1dd67c265e1bc0d24caac4eef373db2106c5ff
--- /dev/null
+++ b/overlay25/calibration/data/pushT/T_gel_to_rigid_right.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/pushT/T_mocap_to_cam_left.json b/overlay25/calibration/data/pushT/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..56e9fd32527ce5590fd801fd9bb41bcc77018fc8
--- /dev/null
+++ b/overlay25/calibration/data/pushT/T_mocap_to_cam_left.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 143.7419891357422,
+ 178.2099151611328
+ ],
+ [
+ 189.45152282714844,
+ 150.98486328125
+ ],
+ [
+ 147.97055053710938,
+ 220.66168212890625
+ ],
+ [
+ 173.2666778564453,
+ 161.04458618164062
+ ],
+ [
+ 294.1172790527344,
+ 280.3843994140625
+ ],
+ [
+ 334.7158203125,
+ 330.51019287109375
+ ],
+ [
+ 276.5556640625,
+ 373.0362854003906
+ ],
+ [
+ 306.35986328125,
+ 295.54974365234375
+ ],
+ [
+ 36.820892333984375,
+ 159.5347137451172
+ ],
+ [
+ 99.56674194335938,
+ 216.884765625
+ ],
+ [
+ 97.03021240234375,
+ 197.2443389892578
+ ],
+ [
+ 163.9508514404297,
+ 107.2503890991211
+ ],
+ [
+ 214.92898559570312,
+ 179.42526245117188
+ ],
+ [
+ 175.64276123046875,
+ 164.6315460205078
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -265.3074860572815,
+ -71.51607424020767,
+ 936.7824792861938
+ ],
+ [
+ -189.91339206695557,
+ -110.53171753883362,
+ 912.6609563827515
+ ],
+ [
+ -254.59101796150208,
+ -6.024590227752924,
+ 921.5573072433472
+ ],
+ [
+ -220.07083892822266,
+ -98.0551466345787,
+ 937.7188682556152
+ ],
+ [
+ -28.192222118377686,
+ 71.64862751960754,
+ 781.6218733787537
+ ],
+ [
+ 22.724416106939316,
+ 129.05201315879822,
+ 741.2945628166199
+ ],
+ [
+ -46.32071778178215,
+ 174.07649755477905,
+ 713.3781909942627
+ ],
+ [
+ -12.383990921080112,
+ 90.54456651210785,
+ 776.5170931816101
+ ],
+ [
+ -508.81510972976685,
+ -118.68498474359512,
+ 1108.68239402771
+ ],
+ [
+ -340.10186791419983,
+ -12.184998020529747,
+ 955.8426737785339
+ ],
+ [
+ -351.6928255558014,
+ -44.00604963302612,
+ 976.9721627235413
+ ],
+ [
+ -205.46074211597443,
+ -158.63607823848724,
+ 821.8494057655334
+ ],
+ [
+ -137.51870393753052,
+ -61.50858476758003,
+ 827.3531198501587
+ ],
+ [
+ -198.6142098903656,
+ -84.91630107164383,
+ 860.612690448761
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.5820335045117107,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.8080875343628796,
+ 0.37166043358369666,
+ 0.30035844374306286,
+ 0.16766178529659098,
+ 0.2928865608577506,
+ 0.08605706634747436,
+ 0.3712100186965587,
+ 0.3838618203482641,
+ 1.6306500334269773,
+ 0.47351243090931516,
+ 0.3479136287525737,
+ 0.3214674927609189,
+ 0.35833809787519083,
+ 0.46782397947608595
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8868154787413457,
+ -0.3021879229672767,
+ -0.3496294694065147,
+ 128.8094236392457
+ ],
+ [
+ -0.17335478597935233,
+ 0.9188568726749307,
+ -0.35447167124623546,
+ 232.76972168031767
+ ],
+ [
+ 0.4283764989385047,
+ -0.25374102299543433,
+ -0.8672422201475316,
+ 701.0505085345026
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/pushT/T_mocap_to_cam_middle.json b/overlay25/calibration/data/pushT/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..0156c76afb64bafc0a9b5afcae391a786cffaaa3
--- /dev/null
+++ b/overlay25/calibration/data/pushT/T_mocap_to_cam_middle.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 419.8519287109375,
+ 242.45101928710938
+ ],
+ [
+ 361.4404602050781,
+ 281.3619689941406
+ ],
+ [
+ 388.0091552734375,
+ 190.78221130371094
+ ],
+ [
+ 379.912353515625,
+ 267.10565185546875
+ ],
+ [
+ 179.5079345703125,
+ 156.41310119628906
+ ],
+ [
+ 130.3328857421875,
+ 120.79955291748047
+ ],
+ [
+ 157.44979858398438,
+ 58.920013427734375
+ ],
+ [
+ 162.91932678222656,
+ 146.43170166015625
+ ],
+ [
+ 535.0,
+ 220.0
+ ],
+ [
+ 458.49053955078125,
+ 185.263916015625
+ ],
+ [
+ 465.74908447265625,
+ 205.1256866455078
+ ],
+ [
+ 352.8275146484375,
+ 302.9422912597656
+ ],
+ [
+ 287.23797607421875,
+ 240.01736450195312
+ ],
+ [
+ 354.85638427734375,
+ 252.9636688232422
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 111.06016486883163,
+ 3.943601157516241,
+ 774.1832137107849
+ ],
+ [
+ 36.83480620384216,
+ 53.49968001246452,
+ 774.6483087539673
+ ],
+ [
+ 72.89083302021027,
+ -63.83784860372543,
+ 799.4796633720398
+ ],
+ [
+ 61.44605576992035,
+ 35.9986275434494,
+ 788.995087146759
+ ],
+ [
+ -193.46380233764648,
+ -105.02921789884567,
+ 770.281195640564
+ ],
+ [
+ -255.4701864719391,
+ -150.01900494098663,
+ 769.7222232818604
+ ],
+ [
+ -213.37243914604187,
+ -220.24264931678772,
+ 742.4835562705994
+ ],
+ [
+ -215.60049057006836,
+ -118.30388754606247,
+ 774.4371294975281
+ ],
+ [
+ 227.43911743164062,
+ -21.76175308227539,
+ 684.0000610351562
+ ],
+ [
+ 164.66139256954193,
+ -70.76992094516754,
+ 795.8716154098511
+ ],
+ [
+ 169.54033076763153,
+ -43.598201125860214,
+ 774.821937084198
+ ],
+ [
+ 22.041086107492447,
+ 68.96940618753433,
+ 659.7349643707275
+ ],
+ [
+ -54.32060360908508,
+ 0.7992741302587092,
+ 731.2875390052795
+ ],
+ [
+ 26.847360655665398,
+ 16.35139249265194,
+ 730.736494064331
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6957969799496961,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.17269310973865823,
+ 0.34678606316542004,
+ 0.7949263280824498,
+ 0.7595155335193595,
+ 0.46703748193000916,
+ 0.4298708481893768,
+ 1.1222337545259984,
+ 1.3263655425582945,
+ 0.35087765728361514,
+ 0.6862180249885633,
+ 0.16974670365446598,
+ 0.380060158735936,
+ 0.8606992412014269,
+ 0.6995517552033408
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995314292450528,
+ 0.026616003224703866,
+ 0.015116557931100139,
+ -373.5077365832549
+ ],
+ [
+ 0.026586035283918216,
+ -0.99964415184602,
+ 0.0021800018195975604,
+ -223.2913479600006
+ ],
+ [
+ 0.015169201667326097,
+ -0.0017770909919715434,
+ -0.9998833618319598,
+ 816.5209880955446
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/pushT/T_mocap_to_cam_right.json b/overlay25/calibration/data/pushT/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..52f87b6c40ab63aa00ff254dd7ae2c66eb5274e1
--- /dev/null
+++ b/overlay25/calibration/data/pushT/T_mocap_to_cam_right.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 364.28118896484375,
+ 226.3100128173828
+ ],
+ [
+ 375.09521484375,
+ 172.0719451904297
+ ],
+ [
+ 418.16552734375,
+ 239.4901885986328
+ ],
+ [
+ 372.248291015625,
+ 189.38470458984375
+ ],
+ [
+ 538.5238037109375,
+ 161.0652618408203
+ ],
+ [
+ 578.2669067382812,
+ 164.14666748046875
+ ],
+ [
+ 614.590576171875,
+ 193.21926879882812
+ ],
+ [
+ 551.4354248046875,
+ 161.53729248046875
+ ],
+ [
+ 338.0,
+ 254.0
+ ],
+ [
+ 384.0,
+ 281.0
+ ],
+ [
+ 368.0,
+ 265.0
+ ],
+ [
+ 392.0,
+ 114.0
+ ],
+ [
+ 448.0,
+ 147.0
+ ],
+ [
+ 404.0,
+ 171.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 67.61006265878677,
+ -23.48441816866398,
+ 832.8875303268433
+ ],
+ [
+ 88.18109333515167,
+ -104.7908216714859,
+ 891.2064433097839
+ ],
+ [
+ 147.3912000656128,
+ -5.622966680675745,
+ 868.4306144714355
+ ],
+ [
+ 82.71369338035583,
+ -78.13647389411926,
+ 877.4359226226807
+ ],
+ [
+ 355.0775647163391,
+ -131.134495139122,
+ 966.1950469017029
+ ],
+ [
+ 432.61927366256714,
+ -130.58704137802124,
+ 999.561607837677
+ ],
+ [
+ 461.81631088256836,
+ -77.57735252380371,
+ 937.7017617225647
+ ],
+ [
+ 380.2844285964966,
+ -132.01692700386047,
+ 978.3041477203369
+ ],
+ [
+ 26.19326400756836,
+ 12.023463249206543,
+ 689.5000610351562
+ ],
+ [
+ 91.6579360961914,
+ 49.98165512084961,
+ 807.0000610351562
+ ],
+ [
+ 67.21060180664062,
+ 27.386150360107422,
+ 770.0000610351562
+ ],
+ [
+ 102.01334381103516,
+ -171.697021484375,
+ 805.0000610351562
+ ],
+ [
+ 192.27865600585938,
+ -139.675537109375,
+ 879.0000610351562
+ ],
+ [
+ 124.037841796875,
+ -101.0892105102539,
+ 847.0000610351562
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6641288760028174,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.7334514837464046,
+ 0.45635472009079076,
+ 0.8970694696327521,
+ 0.31806234529960986,
+ 0.6865228817112038,
+ 0.21057826799310805,
+ 0.912277422276382,
+ 0.43994664737977,
+ 0.21418442105906682,
+ 1.074796181357606,
+ 0.6873076709576346,
+ 0.7207901345940971,
+ 0.8239751206098153,
+ 0.33082506738831163
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.688097867430995,
+ 0.7023816139017327,
+ 0.1821576056323592,
+ 543.5657328540357
+ ],
+ [
+ 0.5425582025081412,
+ 0.6647209947925371,
+ -0.5135918573859546,
+ -115.44031421123972
+ ],
+ [
+ -0.4818214625025037,
+ -0.2545703587121193,
+ -0.8384760048666456,
+ 1059.2626265195877
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/rope/T_gel_to_rigid_left.json b/overlay25/calibration/data/rope/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..1841cac1133234442ca99335532512a32e25b04f
--- /dev/null
+++ b/overlay25/calibration/data/rope/T_gel_to_rigid_left.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/rope/T_gel_to_rigid_right.json b/overlay25/calibration/data/rope/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d1dd67c265e1bc0d24caac4eef373db2106c5ff
--- /dev/null
+++ b/overlay25/calibration/data/rope/T_gel_to_rigid_right.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/rope/T_mocap_to_cam_left.json b/overlay25/calibration/data/rope/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..56e9fd32527ce5590fd801fd9bb41bcc77018fc8
--- /dev/null
+++ b/overlay25/calibration/data/rope/T_mocap_to_cam_left.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 143.7419891357422,
+ 178.2099151611328
+ ],
+ [
+ 189.45152282714844,
+ 150.98486328125
+ ],
+ [
+ 147.97055053710938,
+ 220.66168212890625
+ ],
+ [
+ 173.2666778564453,
+ 161.04458618164062
+ ],
+ [
+ 294.1172790527344,
+ 280.3843994140625
+ ],
+ [
+ 334.7158203125,
+ 330.51019287109375
+ ],
+ [
+ 276.5556640625,
+ 373.0362854003906
+ ],
+ [
+ 306.35986328125,
+ 295.54974365234375
+ ],
+ [
+ 36.820892333984375,
+ 159.5347137451172
+ ],
+ [
+ 99.56674194335938,
+ 216.884765625
+ ],
+ [
+ 97.03021240234375,
+ 197.2443389892578
+ ],
+ [
+ 163.9508514404297,
+ 107.2503890991211
+ ],
+ [
+ 214.92898559570312,
+ 179.42526245117188
+ ],
+ [
+ 175.64276123046875,
+ 164.6315460205078
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -265.3074860572815,
+ -71.51607424020767,
+ 936.7824792861938
+ ],
+ [
+ -189.91339206695557,
+ -110.53171753883362,
+ 912.6609563827515
+ ],
+ [
+ -254.59101796150208,
+ -6.024590227752924,
+ 921.5573072433472
+ ],
+ [
+ -220.07083892822266,
+ -98.0551466345787,
+ 937.7188682556152
+ ],
+ [
+ -28.192222118377686,
+ 71.64862751960754,
+ 781.6218733787537
+ ],
+ [
+ 22.724416106939316,
+ 129.05201315879822,
+ 741.2945628166199
+ ],
+ [
+ -46.32071778178215,
+ 174.07649755477905,
+ 713.3781909942627
+ ],
+ [
+ -12.383990921080112,
+ 90.54456651210785,
+ 776.5170931816101
+ ],
+ [
+ -508.81510972976685,
+ -118.68498474359512,
+ 1108.68239402771
+ ],
+ [
+ -340.10186791419983,
+ -12.184998020529747,
+ 955.8426737785339
+ ],
+ [
+ -351.6928255558014,
+ -44.00604963302612,
+ 976.9721627235413
+ ],
+ [
+ -205.46074211597443,
+ -158.63607823848724,
+ 821.8494057655334
+ ],
+ [
+ -137.51870393753052,
+ -61.50858476758003,
+ 827.3531198501587
+ ],
+ [
+ -198.6142098903656,
+ -84.91630107164383,
+ 860.612690448761
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.5820335045117107,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.8080875343628796,
+ 0.37166043358369666,
+ 0.30035844374306286,
+ 0.16766178529659098,
+ 0.2928865608577506,
+ 0.08605706634747436,
+ 0.3712100186965587,
+ 0.3838618203482641,
+ 1.6306500334269773,
+ 0.47351243090931516,
+ 0.3479136287525737,
+ 0.3214674927609189,
+ 0.35833809787519083,
+ 0.46782397947608595
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8868154787413457,
+ -0.3021879229672767,
+ -0.3496294694065147,
+ 128.8094236392457
+ ],
+ [
+ -0.17335478597935233,
+ 0.9188568726749307,
+ -0.35447167124623546,
+ 232.76972168031767
+ ],
+ [
+ 0.4283764989385047,
+ -0.25374102299543433,
+ -0.8672422201475316,
+ 701.0505085345026
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/rope/T_mocap_to_cam_middle.json b/overlay25/calibration/data/rope/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..0156c76afb64bafc0a9b5afcae391a786cffaaa3
--- /dev/null
+++ b/overlay25/calibration/data/rope/T_mocap_to_cam_middle.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 419.8519287109375,
+ 242.45101928710938
+ ],
+ [
+ 361.4404602050781,
+ 281.3619689941406
+ ],
+ [
+ 388.0091552734375,
+ 190.78221130371094
+ ],
+ [
+ 379.912353515625,
+ 267.10565185546875
+ ],
+ [
+ 179.5079345703125,
+ 156.41310119628906
+ ],
+ [
+ 130.3328857421875,
+ 120.79955291748047
+ ],
+ [
+ 157.44979858398438,
+ 58.920013427734375
+ ],
+ [
+ 162.91932678222656,
+ 146.43170166015625
+ ],
+ [
+ 535.0,
+ 220.0
+ ],
+ [
+ 458.49053955078125,
+ 185.263916015625
+ ],
+ [
+ 465.74908447265625,
+ 205.1256866455078
+ ],
+ [
+ 352.8275146484375,
+ 302.9422912597656
+ ],
+ [
+ 287.23797607421875,
+ 240.01736450195312
+ ],
+ [
+ 354.85638427734375,
+ 252.9636688232422
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 111.06016486883163,
+ 3.943601157516241,
+ 774.1832137107849
+ ],
+ [
+ 36.83480620384216,
+ 53.49968001246452,
+ 774.6483087539673
+ ],
+ [
+ 72.89083302021027,
+ -63.83784860372543,
+ 799.4796633720398
+ ],
+ [
+ 61.44605576992035,
+ 35.9986275434494,
+ 788.995087146759
+ ],
+ [
+ -193.46380233764648,
+ -105.02921789884567,
+ 770.281195640564
+ ],
+ [
+ -255.4701864719391,
+ -150.01900494098663,
+ 769.7222232818604
+ ],
+ [
+ -213.37243914604187,
+ -220.24264931678772,
+ 742.4835562705994
+ ],
+ [
+ -215.60049057006836,
+ -118.30388754606247,
+ 774.4371294975281
+ ],
+ [
+ 227.43911743164062,
+ -21.76175308227539,
+ 684.0000610351562
+ ],
+ [
+ 164.66139256954193,
+ -70.76992094516754,
+ 795.8716154098511
+ ],
+ [
+ 169.54033076763153,
+ -43.598201125860214,
+ 774.821937084198
+ ],
+ [
+ 22.041086107492447,
+ 68.96940618753433,
+ 659.7349643707275
+ ],
+ [
+ -54.32060360908508,
+ 0.7992741302587092,
+ 731.2875390052795
+ ],
+ [
+ 26.847360655665398,
+ 16.35139249265194,
+ 730.736494064331
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6957969799496961,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.17269310973865823,
+ 0.34678606316542004,
+ 0.7949263280824498,
+ 0.7595155335193595,
+ 0.46703748193000916,
+ 0.4298708481893768,
+ 1.1222337545259984,
+ 1.3263655425582945,
+ 0.35087765728361514,
+ 0.6862180249885633,
+ 0.16974670365446598,
+ 0.380060158735936,
+ 0.8606992412014269,
+ 0.6995517552033408
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995314292450528,
+ 0.026616003224703866,
+ 0.015116557931100139,
+ -373.5077365832549
+ ],
+ [
+ 0.026586035283918216,
+ -0.99964415184602,
+ 0.0021800018195975604,
+ -223.2913479600006
+ ],
+ [
+ 0.015169201667326097,
+ -0.0017770909919715434,
+ -0.9998833618319598,
+ 816.5209880955446
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/rope/T_mocap_to_cam_right.json b/overlay25/calibration/data/rope/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..52f87b6c40ab63aa00ff254dd7ae2c66eb5274e1
--- /dev/null
+++ b/overlay25/calibration/data/rope/T_mocap_to_cam_right.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 364.28118896484375,
+ 226.3100128173828
+ ],
+ [
+ 375.09521484375,
+ 172.0719451904297
+ ],
+ [
+ 418.16552734375,
+ 239.4901885986328
+ ],
+ [
+ 372.248291015625,
+ 189.38470458984375
+ ],
+ [
+ 538.5238037109375,
+ 161.0652618408203
+ ],
+ [
+ 578.2669067382812,
+ 164.14666748046875
+ ],
+ [
+ 614.590576171875,
+ 193.21926879882812
+ ],
+ [
+ 551.4354248046875,
+ 161.53729248046875
+ ],
+ [
+ 338.0,
+ 254.0
+ ],
+ [
+ 384.0,
+ 281.0
+ ],
+ [
+ 368.0,
+ 265.0
+ ],
+ [
+ 392.0,
+ 114.0
+ ],
+ [
+ 448.0,
+ 147.0
+ ],
+ [
+ 404.0,
+ 171.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 67.61006265878677,
+ -23.48441816866398,
+ 832.8875303268433
+ ],
+ [
+ 88.18109333515167,
+ -104.7908216714859,
+ 891.2064433097839
+ ],
+ [
+ 147.3912000656128,
+ -5.622966680675745,
+ 868.4306144714355
+ ],
+ [
+ 82.71369338035583,
+ -78.13647389411926,
+ 877.4359226226807
+ ],
+ [
+ 355.0775647163391,
+ -131.134495139122,
+ 966.1950469017029
+ ],
+ [
+ 432.61927366256714,
+ -130.58704137802124,
+ 999.561607837677
+ ],
+ [
+ 461.81631088256836,
+ -77.57735252380371,
+ 937.7017617225647
+ ],
+ [
+ 380.2844285964966,
+ -132.01692700386047,
+ 978.3041477203369
+ ],
+ [
+ 26.19326400756836,
+ 12.023463249206543,
+ 689.5000610351562
+ ],
+ [
+ 91.6579360961914,
+ 49.98165512084961,
+ 807.0000610351562
+ ],
+ [
+ 67.21060180664062,
+ 27.386150360107422,
+ 770.0000610351562
+ ],
+ [
+ 102.01334381103516,
+ -171.697021484375,
+ 805.0000610351562
+ ],
+ [
+ 192.27865600585938,
+ -139.675537109375,
+ 879.0000610351562
+ ],
+ [
+ 124.037841796875,
+ -101.0892105102539,
+ 847.0000610351562
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6641288760028174,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.7334514837464046,
+ 0.45635472009079076,
+ 0.8970694696327521,
+ 0.31806234529960986,
+ 0.6865228817112038,
+ 0.21057826799310805,
+ 0.912277422276382,
+ 0.43994664737977,
+ 0.21418442105906682,
+ 1.074796181357606,
+ 0.6873076709576346,
+ 0.7207901345940971,
+ 0.8239751206098153,
+ 0.33082506738831163
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.688097867430995,
+ 0.7023816139017327,
+ 0.1821576056323592,
+ 543.5657328540357
+ ],
+ [
+ 0.5425582025081412,
+ 0.6647209947925371,
+ -0.5135918573859546,
+ -115.44031421123972
+ ],
+ [
+ -0.4818214625025037,
+ -0.2545703587121193,
+ -0.8384760048666456,
+ 1059.2626265195877
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/toy/T_gel_to_rigid_left.json b/overlay25/calibration/data/toy/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..1841cac1133234442ca99335532512a32e25b04f
--- /dev/null
+++ b/overlay25/calibration/data/toy/T_gel_to_rigid_left.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/toy/T_gel_to_rigid_right.json b/overlay25/calibration/data/toy/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d1dd67c265e1bc0d24caac4eef373db2106c5ff
--- /dev/null
+++ b/overlay25/calibration/data/toy/T_gel_to_rigid_right.json
@@ -0,0 +1,167 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ],
+ "up_axis": "n/a (rigid-body frame)"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/toy/T_mocap_to_cam_left.json b/overlay25/calibration/data/toy/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..56e9fd32527ce5590fd801fd9bb41bcc77018fc8
--- /dev/null
+++ b/overlay25/calibration/data/toy/T_mocap_to_cam_left.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 143.7419891357422,
+ 178.2099151611328
+ ],
+ [
+ 189.45152282714844,
+ 150.98486328125
+ ],
+ [
+ 147.97055053710938,
+ 220.66168212890625
+ ],
+ [
+ 173.2666778564453,
+ 161.04458618164062
+ ],
+ [
+ 294.1172790527344,
+ 280.3843994140625
+ ],
+ [
+ 334.7158203125,
+ 330.51019287109375
+ ],
+ [
+ 276.5556640625,
+ 373.0362854003906
+ ],
+ [
+ 306.35986328125,
+ 295.54974365234375
+ ],
+ [
+ 36.820892333984375,
+ 159.5347137451172
+ ],
+ [
+ 99.56674194335938,
+ 216.884765625
+ ],
+ [
+ 97.03021240234375,
+ 197.2443389892578
+ ],
+ [
+ 163.9508514404297,
+ 107.2503890991211
+ ],
+ [
+ 214.92898559570312,
+ 179.42526245117188
+ ],
+ [
+ 175.64276123046875,
+ 164.6315460205078
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -265.3074860572815,
+ -71.51607424020767,
+ 936.7824792861938
+ ],
+ [
+ -189.91339206695557,
+ -110.53171753883362,
+ 912.6609563827515
+ ],
+ [
+ -254.59101796150208,
+ -6.024590227752924,
+ 921.5573072433472
+ ],
+ [
+ -220.07083892822266,
+ -98.0551466345787,
+ 937.7188682556152
+ ],
+ [
+ -28.192222118377686,
+ 71.64862751960754,
+ 781.6218733787537
+ ],
+ [
+ 22.724416106939316,
+ 129.05201315879822,
+ 741.2945628166199
+ ],
+ [
+ -46.32071778178215,
+ 174.07649755477905,
+ 713.3781909942627
+ ],
+ [
+ -12.383990921080112,
+ 90.54456651210785,
+ 776.5170931816101
+ ],
+ [
+ -508.81510972976685,
+ -118.68498474359512,
+ 1108.68239402771
+ ],
+ [
+ -340.10186791419983,
+ -12.184998020529747,
+ 955.8426737785339
+ ],
+ [
+ -351.6928255558014,
+ -44.00604963302612,
+ 976.9721627235413
+ ],
+ [
+ -205.46074211597443,
+ -158.63607823848724,
+ 821.8494057655334
+ ],
+ [
+ -137.51870393753052,
+ -61.50858476758003,
+ 827.3531198501587
+ ],
+ [
+ -198.6142098903656,
+ -84.91630107164383,
+ 860.612690448761
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.5820335045117107,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.8080875343628796,
+ 0.37166043358369666,
+ 0.30035844374306286,
+ 0.16766178529659098,
+ 0.2928865608577506,
+ 0.08605706634747436,
+ 0.3712100186965587,
+ 0.3838618203482641,
+ 1.6306500334269773,
+ 0.47351243090931516,
+ 0.3479136287525737,
+ 0.3214674927609189,
+ 0.35833809787519083,
+ 0.46782397947608595
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8868154787413457,
+ -0.3021879229672767,
+ -0.3496294694065147,
+ 128.8094236392457
+ ],
+ [
+ -0.17335478597935233,
+ 0.9188568726749307,
+ -0.35447167124623546,
+ 232.76972168031767
+ ],
+ [
+ 0.4283764989385047,
+ -0.25374102299543433,
+ -0.8672422201475316,
+ 701.0505085345026
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/toy/T_mocap_to_cam_middle.json b/overlay25/calibration/data/toy/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..0156c76afb64bafc0a9b5afcae391a786cffaaa3
--- /dev/null
+++ b/overlay25/calibration/data/toy/T_mocap_to_cam_middle.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 419.8519287109375,
+ 242.45101928710938
+ ],
+ [
+ 361.4404602050781,
+ 281.3619689941406
+ ],
+ [
+ 388.0091552734375,
+ 190.78221130371094
+ ],
+ [
+ 379.912353515625,
+ 267.10565185546875
+ ],
+ [
+ 179.5079345703125,
+ 156.41310119628906
+ ],
+ [
+ 130.3328857421875,
+ 120.79955291748047
+ ],
+ [
+ 157.44979858398438,
+ 58.920013427734375
+ ],
+ [
+ 162.91932678222656,
+ 146.43170166015625
+ ],
+ [
+ 535.0,
+ 220.0
+ ],
+ [
+ 458.49053955078125,
+ 185.263916015625
+ ],
+ [
+ 465.74908447265625,
+ 205.1256866455078
+ ],
+ [
+ 352.8275146484375,
+ 302.9422912597656
+ ],
+ [
+ 287.23797607421875,
+ 240.01736450195312
+ ],
+ [
+ 354.85638427734375,
+ 252.9636688232422
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 111.06016486883163,
+ 3.943601157516241,
+ 774.1832137107849
+ ],
+ [
+ 36.83480620384216,
+ 53.49968001246452,
+ 774.6483087539673
+ ],
+ [
+ 72.89083302021027,
+ -63.83784860372543,
+ 799.4796633720398
+ ],
+ [
+ 61.44605576992035,
+ 35.9986275434494,
+ 788.995087146759
+ ],
+ [
+ -193.46380233764648,
+ -105.02921789884567,
+ 770.281195640564
+ ],
+ [
+ -255.4701864719391,
+ -150.01900494098663,
+ 769.7222232818604
+ ],
+ [
+ -213.37243914604187,
+ -220.24264931678772,
+ 742.4835562705994
+ ],
+ [
+ -215.60049057006836,
+ -118.30388754606247,
+ 774.4371294975281
+ ],
+ [
+ 227.43911743164062,
+ -21.76175308227539,
+ 684.0000610351562
+ ],
+ [
+ 164.66139256954193,
+ -70.76992094516754,
+ 795.8716154098511
+ ],
+ [
+ 169.54033076763153,
+ -43.598201125860214,
+ 774.821937084198
+ ],
+ [
+ 22.041086107492447,
+ 68.96940618753433,
+ 659.7349643707275
+ ],
+ [
+ -54.32060360908508,
+ 0.7992741302587092,
+ 731.2875390052795
+ ],
+ [
+ 26.847360655665398,
+ 16.35139249265194,
+ 730.736494064331
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6957969799496961,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.17269310973865823,
+ 0.34678606316542004,
+ 0.7949263280824498,
+ 0.7595155335193595,
+ 0.46703748193000916,
+ 0.4298708481893768,
+ 1.1222337545259984,
+ 1.3263655425582945,
+ 0.35087765728361514,
+ 0.6862180249885633,
+ 0.16974670365446598,
+ 0.380060158735936,
+ 0.8606992412014269,
+ 0.6995517552033408
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995314292450528,
+ 0.026616003224703866,
+ 0.015116557931100139,
+ -373.5077365832549
+ ],
+ [
+ 0.026586035283918216,
+ -0.99964415184602,
+ 0.0021800018195975604,
+ -223.2913479600006
+ ],
+ [
+ 0.015169201667326097,
+ -0.0017770909919715434,
+ -0.9998833618319598,
+ 816.5209880955446
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/toy/T_mocap_to_cam_right.json b/overlay25/calibration/data/toy/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..52f87b6c40ab63aa00ff254dd7ae2c66eb5274e1
--- /dev/null
+++ b/overlay25/calibration/data/toy/T_mocap_to_cam_right.json
@@ -0,0 +1,264 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 364.28118896484375,
+ 226.3100128173828
+ ],
+ [
+ 375.09521484375,
+ 172.0719451904297
+ ],
+ [
+ 418.16552734375,
+ 239.4901885986328
+ ],
+ [
+ 372.248291015625,
+ 189.38470458984375
+ ],
+ [
+ 538.5238037109375,
+ 161.0652618408203
+ ],
+ [
+ 578.2669067382812,
+ 164.14666748046875
+ ],
+ [
+ 614.590576171875,
+ 193.21926879882812
+ ],
+ [
+ 551.4354248046875,
+ 161.53729248046875
+ ],
+ [
+ 338.0,
+ 254.0
+ ],
+ [
+ 384.0,
+ 281.0
+ ],
+ [
+ 368.0,
+ 265.0
+ ],
+ [
+ 392.0,
+ 114.0
+ ],
+ [
+ 448.0,
+ 147.0
+ ],
+ [
+ 404.0,
+ 171.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 67.61006265878677,
+ -23.48441816866398,
+ 832.8875303268433
+ ],
+ [
+ 88.18109333515167,
+ -104.7908216714859,
+ 891.2064433097839
+ ],
+ [
+ 147.3912000656128,
+ -5.622966680675745,
+ 868.4306144714355
+ ],
+ [
+ 82.71369338035583,
+ -78.13647389411926,
+ 877.4359226226807
+ ],
+ [
+ 355.0775647163391,
+ -131.134495139122,
+ 966.1950469017029
+ ],
+ [
+ 432.61927366256714,
+ -130.58704137802124,
+ 999.561607837677
+ ],
+ [
+ 461.81631088256836,
+ -77.57735252380371,
+ 937.7017617225647
+ ],
+ [
+ 380.2844285964966,
+ -132.01692700386047,
+ 978.3041477203369
+ ],
+ [
+ 26.19326400756836,
+ 12.023463249206543,
+ 689.5000610351562
+ ],
+ [
+ 91.6579360961914,
+ 49.98165512084961,
+ 807.0000610351562
+ ],
+ [
+ 67.21060180664062,
+ 27.386150360107422,
+ 770.0000610351562
+ ],
+ [
+ 102.01334381103516,
+ -171.697021484375,
+ 805.0000610351562
+ ],
+ [
+ 192.27865600585938,
+ -139.675537109375,
+ 879.0000610351562
+ ],
+ [
+ 124.037841796875,
+ -101.0892105102539,
+ 847.0000610351562
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6641288760028174,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.7334514837464046,
+ 0.45635472009079076,
+ 0.8970694696327521,
+ 0.31806234529960986,
+ 0.6865228817112038,
+ 0.21057826799310805,
+ 0.912277422276382,
+ 0.43994664737977,
+ 0.21418442105906682,
+ 1.074796181357606,
+ 0.6873076709576346,
+ 0.7207901345940971,
+ 0.8239751206098153,
+ 0.33082506738831163
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.688097867430995,
+ 0.7023816139017327,
+ 0.1821576056323592,
+ 543.5657328540357
+ ],
+ [
+ 0.5425582025081412,
+ 0.6647209947925371,
+ -0.5135918573859546,
+ -115.44031421123972
+ ],
+ [
+ -0.4818214625025037,
+ -0.2545703587121193,
+ -0.8384760048666456,
+ 1059.2626265195877
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z",
+ "up_axis_note": "converted from the recorded Y-up by R_x(-90): (x,y,z)->(x,-z,y). T_mocap_to_cam moved with the poses, so every projection is unchanged; the view-frame action is not."
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/validation/T_gel_to_rigid_left.json b/overlay25/calibration/data/validation/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..26e7a0aa88430a765079dee56a2605b1be2973f0
--- /dev/null
+++ b/overlay25/calibration/data/validation/T_gel_to_rigid_left.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/validation/T_gel_to_rigid_right.json b/overlay25/calibration/data/validation/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..f59bc59e69e435a25a9f2a49e72128dfe0761248
--- /dev/null
+++ b/overlay25/calibration/data/validation/T_gel_to_rigid_right.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/validation/T_mocap_to_cam_left.json b/overlay25/calibration/data/validation/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..1993b36f9182c9b834d508a92d4d2e678ddbd9cb
--- /dev/null
+++ b/overlay25/calibration/data/validation/T_mocap_to_cam_left.json
@@ -0,0 +1,263 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 143.7419891357422,
+ 178.2099151611328
+ ],
+ [
+ 189.45152282714844,
+ 150.98486328125
+ ],
+ [
+ 147.97055053710938,
+ 220.66168212890625
+ ],
+ [
+ 173.2666778564453,
+ 161.04458618164062
+ ],
+ [
+ 294.1172790527344,
+ 280.3843994140625
+ ],
+ [
+ 334.7158203125,
+ 330.51019287109375
+ ],
+ [
+ 276.5556640625,
+ 373.0362854003906
+ ],
+ [
+ 306.35986328125,
+ 295.54974365234375
+ ],
+ [
+ 36.820892333984375,
+ 159.5347137451172
+ ],
+ [
+ 99.56674194335938,
+ 216.884765625
+ ],
+ [
+ 97.03021240234375,
+ 197.2443389892578
+ ],
+ [
+ 163.9508514404297,
+ 107.2503890991211
+ ],
+ [
+ 214.92898559570312,
+ 179.42526245117188
+ ],
+ [
+ 175.64276123046875,
+ 164.6315460205078
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -265.3074860572815,
+ -71.51607424020767,
+ 936.7824792861938
+ ],
+ [
+ -189.91339206695557,
+ -110.53171753883362,
+ 912.6609563827515
+ ],
+ [
+ -254.59101796150208,
+ -6.024590227752924,
+ 921.5573072433472
+ ],
+ [
+ -220.07083892822266,
+ -98.0551466345787,
+ 937.7188682556152
+ ],
+ [
+ -28.192222118377686,
+ 71.64862751960754,
+ 781.6218733787537
+ ],
+ [
+ 22.724416106939316,
+ 129.05201315879822,
+ 741.2945628166199
+ ],
+ [
+ -46.32071778178215,
+ 174.07649755477905,
+ 713.3781909942627
+ ],
+ [
+ -12.383990921080112,
+ 90.54456651210785,
+ 776.5170931816101
+ ],
+ [
+ -508.81510972976685,
+ -118.68498474359512,
+ 1108.68239402771
+ ],
+ [
+ -340.10186791419983,
+ -12.184998020529747,
+ 955.8426737785339
+ ],
+ [
+ -351.6928255558014,
+ -44.00604963302612,
+ 976.9721627235413
+ ],
+ [
+ -205.46074211597443,
+ -158.63607823848724,
+ 821.8494057655334
+ ],
+ [
+ -137.51870393753052,
+ -61.50858476758003,
+ 827.3531198501587
+ ],
+ [
+ -198.6142098903656,
+ -84.91630107164383,
+ 860.612690448761
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.5820335045117107,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.8080875343628796,
+ 0.37166043358369666,
+ 0.30035844374306286,
+ 0.16766178529659098,
+ 0.2928865608577506,
+ 0.08605706634747436,
+ 0.3712100186965587,
+ 0.3838618203482641,
+ 1.6306500334269773,
+ 0.47351243090931516,
+ 0.3479136287525737,
+ 0.3214674927609189,
+ 0.35833809787519083,
+ 0.46782397947608595
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8868154787413457,
+ -0.3021879229672767,
+ -0.3496294694065147,
+ 128.8094236392457
+ ],
+ [
+ -0.17335478597935233,
+ 0.9188568726749307,
+ -0.35447167124623546,
+ 232.76972168031767
+ ],
+ [
+ 0.4283764989385047,
+ -0.25374102299543433,
+ -0.8672422201475316,
+ 701.0505085345026
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/validation/T_mocap_to_cam_middle.json b/overlay25/calibration/data/validation/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..a1d038f8435d3e0e5d246080c2d818027d304230
--- /dev/null
+++ b/overlay25/calibration/data/validation/T_mocap_to_cam_middle.json
@@ -0,0 +1,263 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 419.8519287109375,
+ 242.45101928710938
+ ],
+ [
+ 361.4404602050781,
+ 281.3619689941406
+ ],
+ [
+ 388.0091552734375,
+ 190.78221130371094
+ ],
+ [
+ 379.912353515625,
+ 267.10565185546875
+ ],
+ [
+ 179.5079345703125,
+ 156.41310119628906
+ ],
+ [
+ 130.3328857421875,
+ 120.79955291748047
+ ],
+ [
+ 157.44979858398438,
+ 58.920013427734375
+ ],
+ [
+ 162.91932678222656,
+ 146.43170166015625
+ ],
+ [
+ 535.0,
+ 220.0
+ ],
+ [
+ 458.49053955078125,
+ 185.263916015625
+ ],
+ [
+ 465.74908447265625,
+ 205.1256866455078
+ ],
+ [
+ 352.8275146484375,
+ 302.9422912597656
+ ],
+ [
+ 287.23797607421875,
+ 240.01736450195312
+ ],
+ [
+ 354.85638427734375,
+ 252.9636688232422
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 111.06016486883163,
+ 3.943601157516241,
+ 774.1832137107849
+ ],
+ [
+ 36.83480620384216,
+ 53.49968001246452,
+ 774.6483087539673
+ ],
+ [
+ 72.89083302021027,
+ -63.83784860372543,
+ 799.4796633720398
+ ],
+ [
+ 61.44605576992035,
+ 35.9986275434494,
+ 788.995087146759
+ ],
+ [
+ -193.46380233764648,
+ -105.02921789884567,
+ 770.281195640564
+ ],
+ [
+ -255.4701864719391,
+ -150.01900494098663,
+ 769.7222232818604
+ ],
+ [
+ -213.37243914604187,
+ -220.24264931678772,
+ 742.4835562705994
+ ],
+ [
+ -215.60049057006836,
+ -118.30388754606247,
+ 774.4371294975281
+ ],
+ [
+ 227.43911743164062,
+ -21.76175308227539,
+ 684.0000610351562
+ ],
+ [
+ 164.66139256954193,
+ -70.76992094516754,
+ 795.8716154098511
+ ],
+ [
+ 169.54033076763153,
+ -43.598201125860214,
+ 774.821937084198
+ ],
+ [
+ 22.041086107492447,
+ 68.96940618753433,
+ 659.7349643707275
+ ],
+ [
+ -54.32060360908508,
+ 0.7992741302587092,
+ 731.2875390052795
+ ],
+ [
+ 26.847360655665398,
+ 16.35139249265194,
+ 730.736494064331
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6957969799496961,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.17269310973865823,
+ 0.34678606316542004,
+ 0.7949263280824498,
+ 0.7595155335193595,
+ 0.46703748193000916,
+ 0.4298708481893768,
+ 1.1222337545259984,
+ 1.3263655425582945,
+ 0.35087765728361514,
+ 0.6862180249885633,
+ 0.16974670365446598,
+ 0.380060158735936,
+ 0.8606992412014269,
+ 0.6995517552033408
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995314292450528,
+ 0.026616003224703866,
+ 0.015116557931100139,
+ -373.5077365832549
+ ],
+ [
+ 0.026586035283918216,
+ -0.99964415184602,
+ 0.0021800018195975604,
+ -223.2913479600006
+ ],
+ [
+ 0.015169201667326097,
+ -0.0017770909919715434,
+ -0.9998833618319598,
+ 816.5209880955446
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/data/validation/T_mocap_to_cam_right.json b/overlay25/calibration/data/validation/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..ca54f7dcf90a61a225fa2056cfdac68dbac44d9b
--- /dev/null
+++ b/overlay25/calibration/data/validation/T_mocap_to_cam_right.json
@@ -0,0 +1,263 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-09-09T07:41:39",
+ "points_px": [
+ [
+ 364.28118896484375,
+ 226.3100128173828
+ ],
+ [
+ 375.09521484375,
+ 172.0719451904297
+ ],
+ [
+ 418.16552734375,
+ 239.4901885986328
+ ],
+ [
+ 372.248291015625,
+ 189.38470458984375
+ ],
+ [
+ 538.5238037109375,
+ 161.0652618408203
+ ],
+ [
+ 578.2669067382812,
+ 164.14666748046875
+ ],
+ [
+ 614.590576171875,
+ 193.21926879882812
+ ],
+ [
+ 551.4354248046875,
+ 161.53729248046875
+ ],
+ [
+ 338.0,
+ 254.0
+ ],
+ [
+ 384.0,
+ 281.0
+ ],
+ [
+ 368.0,
+ 265.0
+ ],
+ [
+ 392.0,
+ 114.0
+ ],
+ [
+ 448.0,
+ 147.0
+ ],
+ [
+ 404.0,
+ 171.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 488.36899999999997,
+ 57.99,
+ 213.979
+ ],
+ [
+ 414.978,
+ 71.545,
+ 264.012
+ ],
+ [
+ 445.764,
+ 62.361,
+ 151.468
+ ],
+ [
+ 439.02000000000004,
+ 67.27,
+ 246.459
+ ],
+ [
+ 186.969,
+ 70.75,
+ 116.05
+ ],
+ [
+ 121.782,
+ 58.125,
+ 71.44300000000001
+ ],
+ [
+ 162.31799999999998,
+ 88.897,
+ 3.545
+ ],
+ [
+ 166.59799999999998,
+ 66.914,
+ 102.365
+ ],
+ [
+ 601.8829999999999,
+ 147.483,
+ 185.12300000000002
+ ],
+ [
+ 535.076,
+ 62.782000000000004,
+ 141.016
+ ],
+ [
+ 540.51,
+ 77.084,
+ 166.62
+ ],
+ [
+ 400.7,
+ 167.358,
+ 281.313
+ ],
+ [
+ 325.52599999999995,
+ 108.166,
+ 214.644
+ ],
+ [
+ 404.015,
+ 100.877,
+ 228.85
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ 67.61006265878677,
+ -23.48441816866398,
+ 832.8875303268433
+ ],
+ [
+ 88.18109333515167,
+ -104.7908216714859,
+ 891.2064433097839
+ ],
+ [
+ 147.3912000656128,
+ -5.622966680675745,
+ 868.4306144714355
+ ],
+ [
+ 82.71369338035583,
+ -78.13647389411926,
+ 877.4359226226807
+ ],
+ [
+ 355.0775647163391,
+ -131.134495139122,
+ 966.1950469017029
+ ],
+ [
+ 432.61927366256714,
+ -130.58704137802124,
+ 999.561607837677
+ ],
+ [
+ 461.81631088256836,
+ -77.57735252380371,
+ 937.7017617225647
+ ],
+ [
+ 380.2844285964966,
+ -132.01692700386047,
+ 978.3041477203369
+ ],
+ [
+ 26.19326400756836,
+ 12.023463249206543,
+ 689.5000610351562
+ ],
+ [
+ 91.6579360961914,
+ 49.98165512084961,
+ 807.0000610351562
+ ],
+ [
+ 67.21060180664062,
+ 27.386150360107422,
+ 770.0000610351562
+ ],
+ [
+ 102.01334381103516,
+ -171.697021484375,
+ 805.0000610351562
+ ],
+ [
+ 192.27865600585938,
+ -139.675537109375,
+ 879.0000610351562
+ ],
+ [
+ 124.037841796875,
+ -101.0892105102539,
+ 847.0000610351562
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 14,
+ "rmse_px": 0.6641288760028174,
+ "num_inliers": 14,
+ "reproj_err_px": [
+ 0.7334514837464046,
+ 0.45635472009079076,
+ 0.8970694696327521,
+ 0.31806234529960986,
+ 0.6865228817112038,
+ 0.21057826799310805,
+ 0.912277422276382,
+ 0.43994664737977,
+ 0.21418442105906682,
+ 1.074796181357606,
+ 0.6873076709576346,
+ 0.7207901345940971,
+ 0.8239751206098153,
+ 0.33082506738831163
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.688097867430995,
+ 0.7023816139017327,
+ 0.1821576056323592,
+ 543.5657328540357
+ ],
+ [
+ 0.5425582025081412,
+ 0.6647209947925371,
+ -0.5135918573859546,
+ -115.44031421123972
+ ],
+ [
+ -0.4818214625025037,
+ -0.2545703587121193,
+ -0.8384760048666456,
+ 1059.2626265195877
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_left.json b/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..26e7a0aa88430a765079dee56a2605b1be2973f0
--- /dev/null
+++ b/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_left.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_right.json b/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..f59bc59e69e435a25a9f2a49e72128dfe0761248
--- /dev/null
+++ b/overlay25/calibration/old_data/motherboard/T_gel_to_rigid_right.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_left.json b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..a24560c36bc51df1c8b7ffadd3e88a3bf10e89b4
--- /dev/null
+++ b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_left.json
@@ -0,0 +1,115 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "T_mocap_to_cam": [
+ [
+ -0.810677868162443,
+ -0.4417948639462208,
+ -0.38421178048354576,
+ 158.37843079282737
+ ],
+ [
+ -0.2945501948324127,
+ 0.8748721945072194,
+ -0.3844981482430172,
+ 284.86657177938224
+ ],
+ [
+ 0.5060055106377637,
+ -0.19853448433171958,
+ -0.8393702888090293,
+ 685.6891619250176
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "num_points": 6,
+ "rmse_mm": 4.747439312142084,
+ "residuals_mm": [
+ 3.140296552809229,
+ 4.349449571685337,
+ 4.871127835377674,
+ 2.593150843339738,
+ 3.17090715166062,
+ 8.120525615331562
+ ],
+ "points_cam_mm": [
+ [
+ 16.711177825927734,
+ 89.64736938476562,
+ 786.0000610351562
+ ],
+ [
+ 90.5625228881836,
+ 48.319942474365234,
+ 766.0000610351562
+ ],
+ [
+ 83.88683319091797,
+ 15.152631759643555,
+ 811.0000610351562
+ ],
+ [
+ -216.6715087890625,
+ 79.90221405029297,
+ 928.0000610351562
+ ],
+ [
+ -252.9880828857422,
+ -4.093912601470947,
+ 944.0000610351562
+ ],
+ [
+ -326.0710144042969,
+ 26.836889266967773,
+ 940.0000610351562
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 225.43099999999998,
+ 47.395,
+ 127.916
+ ],
+ [
+ 169.44400000000002,
+ 48.577000000000005,
+ 192.14600000000002
+ ],
+ [
+ 207.466,
+ 27.64,
+ 225.561
+ ],
+ [
+ 487.104,
+ 17.412,
+ 63.24
+ ],
+ [
+ 546.218,
+ 51.876,
+ 121.794
+ ],
+ [
+ 589.725,
+ 72.872,
+ 64.61
+ ]
+ ],
+ "created_at": "2026-05-12T22:16:20",
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_middle.json b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..79b5c993e7f1da2116e2de0070e7dc49b0247ec5
--- /dev/null
+++ b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_middle.json
@@ -0,0 +1,137 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "T_mocap_to_cam": [
+ [
+ 0.9987689323019825,
+ 0.04789247635294343,
+ 0.012920161653051267,
+ -394.4763993373926
+ ],
+ [
+ 0.04826421351573066,
+ -0.9983784326630464,
+ -0.030183950818081413,
+ -270.493443209141
+ ],
+ [
+ 0.011453626590133171,
+ 0.030770373771911365,
+ -0.9994608539286934,
+ 826.019809512672
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "num_points": 8,
+ "rmse_mm": 5.298559912741648,
+ "residuals_mm": [
+ 5.6271211125758995,
+ 10.154049290401456,
+ 5.295565503833297,
+ 3.904543899485634,
+ 4.413577550470772,
+ 1.7606626889517276,
+ 3.887479237641652,
+ 2.9745783556701872
+ ],
+ "points_cam_mm": [
+ [
+ -138.17422485351562,
+ -176.80650329589844,
+ 783.0000610351562
+ ],
+ [
+ -203.81289672851562,
+ -122.2757797241211,
+ 764.0000610351562
+ ],
+ [
+ -176.41786193847656,
+ -83.21672058105469,
+ 799.0000610351562
+ ],
+ [
+ -160.75990295410156,
+ -65.39496612548828,
+ 806.0000610351562
+ ],
+ [
+ -45.515159606933594,
+ -123.39057159423828,
+ 804.0000610351562
+ ],
+ [
+ -18.994951248168945,
+ -117.36901092529297,
+ 799.0000610351562
+ ],
+ [
+ 36.103763580322266,
+ -105.6508560180664,
+ 771.0000610351562
+ ],
+ [
+ 53.24198913574219,
+ -181.49072265625,
+ 781.0000610351562
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 261.084,
+ 48.644,
+ 84.548
+ ],
+ [
+ 195.857,
+ 50.153999999999996,
+ 138.387
+ ],
+ [
+ 228.08700000000002,
+ 29.228,
+ 177.35799999999998
+ ],
+ [
+ 242.60999999999999,
+ 20.526,
+ 195.374
+ ],
+ [
+ 355.329,
+ 17.682,
+ 130.42100000000002
+ ],
+ [
+ 382.233,
+ 28.935,
+ 135.28799999999998
+ ],
+ [
+ 437.52000000000004,
+ 51.916,
+ 144.34900000000002
+ ],
+ [
+ 449.58799999999997,
+ 50.361000000000004,
+ 70.165
+ ]
+ ],
+ "created_at": "2026-05-12T20:34:29",
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_right.json b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..7c63025e8043112643cd8b97dc25ce72df884dce
--- /dev/null
+++ b/overlay25/calibration/old_data/motherboard/T_mocap_to_cam_right.json
@@ -0,0 +1,115 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "T_mocap_to_cam": [
+ [
+ -0.7060810935772296,
+ 0.6950316252373175,
+ 0.13557481039174474,
+ 605.2919096634614
+ ],
+ [
+ 0.5284341378626592,
+ 0.644604762743106,
+ -0.5524871598419762,
+ -100.86727498691573
+ ],
+ [
+ -0.47138821711422957,
+ -0.3184583799633454,
+ -0.8224216734723081,
+ 1061.7990457647895
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "num_points": 6,
+ "rmse_mm": 7.520075033441005,
+ "residuals_mm": [
+ 5.862949060495028,
+ 5.926871764374507,
+ 9.172862106825736,
+ 3.5435031927827803,
+ 8.811105858313384,
+ 9.77106902542866
+ ],
+ "points_cam_mm": [
+ [
+ 150.92872619628906,
+ 131.20069885253906,
+ 740.0000610351562
+ ],
+ [
+ 138.0159454345703,
+ 81.08906555175781,
+ 799.0000610351562
+ ],
+ [
+ 189.72586059570312,
+ 98.56414794921875,
+ 824.0000610351562
+ ],
+ [
+ 216.35919189453125,
+ 107.14408874511719,
+ 838.0000610351562
+ ],
+ [
+ 367.6980285644531,
+ -94.39984130859375,
+ 964.0000610351562
+ ],
+ [
+ 363.8806457519531,
+ -169.8037872314453,
+ 1006.0000610351562
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 589.6700000000001,
+ 72.957,
+ 64.666
+ ],
+ [
+ 545.219,
+ 53.733999999999995,
+ 120.568
+ ],
+ [
+ 506.815,
+ 28.365000000000002,
+ 92.73
+ ],
+ [
+ 487.085,
+ 17.403,
+ 63.273999999999994
+ ],
+ [
+ 225.428,
+ 47.405,
+ 127.916
+ ],
+ [
+ 169.442,
+ 48.574,
+ 192.152
+ ]
+ ],
+ "created_at": "2026-05-12T22:31:39",
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/pushT/T_gel_to_rigid_left.json b/overlay25/calibration/old_data/pushT/T_gel_to_rigid_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..26e7a0aa88430a765079dee56a2605b1be2973f0
--- /dev/null
+++ b/overlay25/calibration/old_data/pushT/T_gel_to_rigid_left.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -33.51740422401229,
+ 12.100255314675977,
+ -17.699792261606614
+ ],
+ "gelball_center_in_rigid_mm": [
+ -43.47382768891848,
+ -41.22508071829758,
+ -35.7960391945282
+ ],
+ "gel_axis_in_rigid": [
+ -0.17411894520453713,
+ -0.9324875086795467,
+ -0.31646427772731606
+ ],
+ "gel_distance_mm": 57.19086670954521,
+ "depth_offset_mm": -5.0,
+ "gel_center_in_rigid_mm": [
+ -42.603232962895795,
+ -36.56264317489985,
+ -34.21371780589162
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4971205477445346,
+ "refball_max_deviation_mm": 0.6830937323295619,
+ "refball_std_mm": [
+ 0.3822793790831837,
+ 0.14607220822214068,
+ 0.3370989262846435
+ ],
+ "gelball_mean_deviation_mm": 0.5311059103030308,
+ "gelball_max_deviation_mm": 0.7146199631539334,
+ "gelball_std_mm": [
+ 0.23387391401966107,
+ 0.402760954424785,
+ 0.30624407553769517
+ ],
+ "axis_max_angle_deg": 1.069223796324866,
+ "ball_distance_std_mm": 0.09592190067940498
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 209.704,
+ 67.29599999999999,
+ 288.7
+ ],
+ "rigid_quaternion": [
+ -0.03045,
+ 0.5291786,
+ 0.72056156,
+ 0.447052
+ ],
+ "refball_mocap_mm": [
+ 213.805,
+ 32.849000000000004,
+ 307.12899999999996
+ ],
+ "refball_rigid_mm": [
+ -33.064365762599664,
+ 12.164420770736669,
+ -17.37287066173849
+ ],
+ "gelball_mocap_mm": [
+ 247.768,
+ 13.639999999999999,
+ 265.48699999999997
+ ],
+ "gelball_rigid_mm": [
+ -43.61612381039666,
+ -40.65963065991089,
+ -36.20919744147588
+ ],
+ "ball_distance_mm": 57.0659899940411,
+ "axis_in_rigid": [
+ -0.18490449475946746,
+ -0.9256660830060691,
+ -0.33007973368558585
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 207.22,
+ 63.50699999999999,
+ 137.26
+ ],
+ "rigid_quaternion": [
+ 0.575241,
+ 0.53501,
+ -0.513944,
+ 0.344559
+ ],
+ "refball_mocap_mm": [
+ 226.556,
+ 69.48400000000001,
+ 172.275
+ ],
+ "refball_rigid_mm": [
+ -33.99941004902249,
+ 12.238224727792783,
+ -18.163744708359914
+ ],
+ "gelball_mocap_mm": [
+ 179.374,
+ 93.761,
+ 193.90099999999998
+ ],
+ "gelball_rigid_mm": [
+ -43.661251420623046,
+ -41.44844032643957,
+ -35.70194717225823
+ ],
+ "ball_distance_mm": 57.29919483727493,
+ "axis_in_rigid": [
+ -0.16862089247570416,
+ -0.936953219093185,
+ -0.3060811327926228
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 261.399,
+ 57.67,
+ 194.732
+ ],
+ "rigid_quaternion": [
+ -0.63276,
+ 0.187712,
+ 0.37411,
+ 0.65147
+ ],
+ "refball_mocap_mm": [
+ 235.038,
+ 31.395,
+ 208.37800000000001
+ ],
+ "refball_rigid_mm": [
+ -33.48843686041472,
+ 11.898120445498478,
+ -17.562761414721432
+ ],
+ "gelball_mocap_mm": [
+ 271.628,
+ 16.011,
+ 249.575
+ ],
+ "gelball_rigid_mm": [
+ -43.14410783573577,
+ -41.5671711685423,
+ -35.4769729698505
+ ],
+ "ball_distance_mm": 57.2074152973196,
+ "axis_in_rigid": [
+ -0.16878355585789684,
+ -0.9345867373341344,
+ -0.3131449211964034
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/pushT/T_gel_to_rigid_right.json b/overlay25/calibration/old_data/pushT/T_gel_to_rigid_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..f59bc59e69e435a25a9f2a49e72128dfe0761248
--- /dev/null
+++ b/overlay25/calibration/old_data/pushT/T_gel_to_rigid_right.json
@@ -0,0 +1,166 @@
+{
+ "method": "dual_ball_multi_pose",
+ "refball_center_in_rigid_mm": [
+ -17.372443520938578,
+ 0.2688573520951536,
+ 38.571757518679924
+ ],
+ "gelball_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "gel_axis_in_rigid": [
+ 0.3501488269090003,
+ -0.9248037787338816,
+ 0.148774224426762
+ ],
+ "gel_distance_mm": 58.67110647491247,
+ "depth_offset_mm": 0.0,
+ "gel_center_in_rigid_mm": [
+ 3.1680846750991996,
+ -53.986407194707084,
+ 47.297869103141956
+ ],
+ "consistency": {
+ "refball_mean_deviation_mm": 0.4043795279250868,
+ "refball_max_deviation_mm": 0.5722584634835464,
+ "refball_std_mm": [
+ 0.305325273790818,
+ 0.1894397197001601,
+ 0.23772566675184065
+ ],
+ "gelball_mean_deviation_mm": 0.7191394130923946,
+ "gelball_max_deviation_mm": 1.044514511519201,
+ "gelball_std_mm": [
+ 0.13210638866223554,
+ 0.258334234777561,
+ 0.7129747489275182
+ ],
+ "axis_max_angle_deg": 1.0670723640750364,
+ "ball_distance_std_mm": 0.1918993038441838
+ },
+ "mocap_scale": 1000.0,
+ "raw_data": [
+ {
+ "pose_id": 0,
+ "rigid_position_mm": [
+ 308.47,
+ 92.09,
+ 161.42000000000002
+ ],
+ "rigid_quaternion": [
+ 0.0631,
+ -0.18618,
+ -0.33139,
+ -0.92278
+ ],
+ "refball_mocap_mm": [
+ 307.62899999999996,
+ 91.333,
+ 203.91500000000002
+ ],
+ "refball_rigid_mm": [
+ -17.42214690726894,
+ 0.24440448450872054,
+ 38.77517786663904
+ ],
+ "gelball_mocap_mm": [
+ 359.197,
+ 63.277,
+ 203.299
+ ],
+ "gelball_rigid_mm": [
+ 2.9816863949711774,
+ -54.181252282163626,
+ 47.0400848891515
+ ],
+ "ball_distance_mm": 58.70926005324889,
+ "axis_in_rigid": [
+ 0.3475402906412716,
+ -0.927037007744752,
+ 0.14077688962552495
+ ]
+ },
+ {
+ "pose_id": 1,
+ "rigid_position_mm": [
+ 353.27599999999995,
+ 105.303,
+ 229.32
+ ],
+ "rigid_quaternion": [
+ -0.28615,
+ -0.956937,
+ 0.017508,
+ -0.045615
+ ],
+ "refball_mocap_mm": [
+ 371.03799999999995,
+ 93.362,
+ 192.52700000000002
+ ],
+ "refball_rigid_mm": [
+ -17.719051737135942,
+ 0.05003692040386909,
+ 38.70185623252837
+ ],
+ "gelball_mocap_mm": [
+ 324.832,
+ 59.405,
+ 181.358
+ ],
+ "gelball_rigid_mm": [
+ 3.272234055436968,
+ -53.6213442033486,
+ 48.27095310963361
+ ],
+ "ball_distance_mm": 58.419336233818946,
+ "axis_in_rigid": [
+ 0.35932085411852144,
+ -0.9187263085108816,
+ 0.163800164363485
+ ]
+ },
+ {
+ "pose_id": 2,
+ "rigid_position_mm": [
+ 223.578,
+ 72.762,
+ 125.58900000000001
+ ],
+ "rigid_quaternion": [
+ 0.267991,
+ -0.024821,
+ -0.319484,
+ -0.908567
+ ],
+ "refball_mocap_mm": [
+ 204.961,
+ 82.694,
+ 161.719
+ ],
+ "refball_rigid_mm": [
+ -16.976131918410857,
+ 0.5121306513728712,
+ 38.23823845687237
+ ],
+ "gelball_mocap_mm": [
+ 252.446,
+ 62.707,
+ 190.23399999999998
+ ],
+ "gelball_rigid_mm": [
+ 3.250333574889453,
+ -54.15662509860903,
+ 46.582569310640764
+ ],
+ "ball_distance_mm": 58.884723137669575,
+ "axis_in_rigid": [
+ 0.3434925803423043,
+ -0.9284030362538862,
+ 0.14170620848908067
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/pushT/T_mocap_to_cam_left.json b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_left.json
new file mode 100644
index 0000000000000000000000000000000000000000..a8880db8363e9ab9251e83098acd1e22faac8826
--- /dev/null
+++ b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_left.json
@@ -0,0 +1,242 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "104122062574",
+ "intrinsics": {
+ "fx": 608.4557495117188,
+ "fy": 608.1494750976562,
+ "ppx": 316.0635986328125,
+ "ppy": 224.6374053955078,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-06-26T01:52:08",
+ "points_px": [
+ [
+ 100.0,
+ 69.0
+ ],
+ [
+ 350.0,
+ 204.0
+ ],
+ [
+ 227.0,
+ 275.0
+ ],
+ [
+ 258.0,
+ 347.0
+ ],
+ [
+ 127.0,
+ 109.0
+ ],
+ [
+ 305.0,
+ 224.0
+ ],
+ [
+ 122.3,
+ 305.7
+ ],
+ [
+ 192.0,
+ 73.0
+ ],
+ [
+ 203.0,
+ 30.0
+ ],
+ [
+ 98.0,
+ 70.0
+ ],
+ [
+ 409.0,
+ 147.0
+ ],
+ [
+ 349.7,
+ 203.5
+ ],
+ [
+ 258.0,
+ 347.0
+ ],
+ [
+ 319.0,
+ 218.0
+ ],
+ [
+ 100.0,
+ 69.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 719.662,
+ 60.195,
+ 358.026
+ ],
+ [
+ 178.641,
+ 55.334,
+ 221.09400000000002
+ ],
+ [
+ 260.702,
+ 128.832,
+ 74.647
+ ],
+ [
+ 184.84900000000002,
+ 129.085,
+ 9.521999999999998
+ ],
+ [
+ 653.015,
+ 26.702,
+ 307.647
+ ],
+ [
+ 245.22299999999998,
+ 26.105,
+ 189.067
+ ],
+ [
+ 460.894,
+ 47.84,
+ -0.392
+ ],
+ [
+ 439.964,
+ 142.1,
+ 328.855
+ ],
+ [
+ 458.52799999999996,
+ 139.993,
+ 401.318
+ ],
+ [
+ 720.971,
+ 60.617999999999995,
+ 355.09000000000003
+ ],
+ [
+ 97.826,
+ 129.169,
+ 280.17900000000003
+ ],
+ [
+ 178.634,
+ 55.319,
+ 221.09
+ ],
+ [
+ 184.85299999999998,
+ 129.086,
+ 9.525
+ ],
+ [
+ 224.36700000000002,
+ 35.253,
+ 198.943
+ ],
+ [
+ 719.66,
+ 60.197,
+ 358.024
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -387.06072998046875,
+ -278.9524230957031,
+ 1090.0
+ ],
+ [
+ 44.36872863769531,
+ -26.995101928710938,
+ 795.5000610351562
+ ],
+ [
+ -107.58670806884766,
+ 60.86745071411133,
+ 735.0000610351562
+ ],
+ [
+ -64.89091491699219,
+ 136.81927490234375,
+ 680.0000610351562
+ ],
+ [
+ -333.7207336425781,
+ -204.21719360351562,
+ 1074.0
+ ],
+ [
+ -15.364702224731445,
+ -0.8856500387191772,
+ 845.0000610351562
+ ],
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null
+ ],
+ "method": "pnp",
+ "num_points": 15,
+ "rmse_px": 0.5178622670651918,
+ "num_inliers": 15,
+ "reproj_err_px": [
+ 0.07720112838155388,
+ 0.39466964991513753,
+ 0.4141118872484322,
+ 0.38911037571471546,
+ 0.2253485504535705,
+ 0.537972069987414,
+ 1.0862787078535614,
+ 0.39124358377078255,
+ 0.29563211945927614,
+ 0.6017703525118233,
+ 0.7524824010217374,
+ 0.48686851673849824,
+ 0.38480586619912616,
+ 0.6766925879742198,
+ 0.07775796498440735
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.8626785176564116,
+ -0.3565006619520938,
+ -0.35873814015498157,
+ 138.40490612800787
+ ],
+ [
+ -0.21989410724604602,
+ 0.9031534177192548,
+ -0.368728200251206,
+ 232.69689108641518
+ ],
+ [
+ 0.45544742481717987,
+ -0.23920949414634018,
+ -0.8575234464069488,
+ 698.0117464657184
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/pushT/T_mocap_to_cam_middle.json b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_middle.json
new file mode 100644
index 0000000000000000000000000000000000000000..4dfa6c0a66e7e1a1c42a38a86430f9f65705f153
--- /dev/null
+++ b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_middle.json
@@ -0,0 +1,293 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "217222066989",
+ "intrinsics": {
+ "fx": 609.06005859375,
+ "fy": 608.275390625,
+ "ppx": 332.47943115234375,
+ "ppy": 239.3525390625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-06-26T01:28:28",
+ "points_px": [
+ [
+ 225.7,
+ 212.0
+ ],
+ [
+ 402.5,
+ 73.6
+ ],
+ [
+ 142.1,
+ 175.5
+ ],
+ [
+ 169.5,
+ 236.7
+ ],
+ [
+ 207.8,
+ 219.1
+ ],
+ [
+ 514.0,
+ 167.0
+ ],
+ [
+ 581.7,
+ 193.0
+ ],
+ [
+ 386.0,
+ 345.0
+ ],
+ [
+ 401.0,
+ 410.0
+ ],
+ [
+ 602.0,
+ 360.0
+ ],
+ [
+ 85.0,
+ 293.0
+ ],
+ [
+ 175.0,
+ 242.0
+ ],
+ [
+ 169.0,
+ 56.0
+ ],
+ [
+ 215.0,
+ 226.0
+ ],
+ [
+ 232.0,
+ 217.7
+ ],
+ [
+ 600.0,
+ 363.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 237.281,
+ 25.998,
+ 180.44
+ ],
+ [
+ 460.894,
+ 47.84,
+ -0.392
+ ],
+ [
+ 143.892,
+ 82.0,
+ 140.107
+ ],
+ [
+ 172.231,
+ 55.411,
+ 215.355
+ ],
+ [
+ 216.828,
+ 35.16,
+ 191.24099999999999
+ ],
+ [
+ 613.479,
+ 25.656000000000002,
+ 111.227
+ ],
+ [
+ 689.639,
+ 59.382999999999996,
+ 145.195
+ ],
+ [
+ 439.964,
+ 142.1,
+ 328.855
+ ],
+ [
+ 458.52799999999996,
+ 139.993,
+ 401.318
+ ],
+ [
+ 720.971,
+ 60.617999999999995,
+ 355.09000000000003
+ ],
+ [
+ 97.826,
+ 129.169,
+ 280.17900000000003
+ ],
+ [
+ 178.634,
+ 55.319,
+ 221.09
+ ],
+ [
+ 184.85299999999998,
+ 129.086,
+ 9.525
+ ],
+ [
+ 224.36700000000002,
+ 35.253,
+ 198.943
+ ],
+ [
+ 245.226,
+ 26.088,
+ 189.045
+ ],
+ [
+ 719.66,
+ 60.197,
+ 358.024
+ ]
+ ],
+ "points_cam_mm": [
+ [
+ -143.0,
+ -37.0,
+ 816.0
+ ],
+ [
+ 90.0,
+ -214.0,
+ 786.0
+ ],
+ [
+ -241.0,
+ -81.0,
+ 770.0
+ ],
+ [
+ -208.0,
+ -3.0,
+ 777.0
+ ],
+ [
+ -165.0,
+ -27.0,
+ 808.0
+ ],
+ [
+ 243.0,
+ -97.0,
+ 815.0
+ ],
+ [
+ 321.0,
+ -60.0,
+ 785.0
+ ],
+ [
+ 60.0,
+ 119.0,
+ 686.0
+ ],
+ [
+ 78.0,
+ 194.0,
+ 691.0
+ ],
+ [
+ 344.0,
+ 154.0,
+ 777.0
+ ],
+ [
+ -281.0,
+ 61.0,
+ 692.0
+ ],
+ [
+ -200.0,
+ 3.0,
+ 772.0
+ ],
+ [
+ -186.0,
+ -209.0,
+ 693.0
+ ],
+ [
+ -155.0,
+ -18.0,
+ 802.0
+ ],
+ [
+ -134.0,
+ -29.0,
+ 815.0
+ ],
+ [
+ 346.0,
+ 160.0,
+ 785.0
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 16,
+ "rmse_px": 0.6407235248458195,
+ "num_inliers": 16,
+ "reproj_err_px": [
+ 0.2899610176069863,
+ 0.669080485021827,
+ 0.9169971259549277,
+ 0.46026596576372314,
+ 0.767195757233268,
+ 0.3998102863244082,
+ 0.2872812146824497,
+ 0.4998328294447849,
+ 0.509648740904276,
+ 0.2794799658640309,
+ 0.6248116581457764,
+ 0.644843818979843,
+ 0.6414513162756064,
+ 0.9475980184275616,
+ 0.8353900568090233,
+ 0.867068767985657
+ ],
+ "T_mocap_to_cam": [
+ [
+ 0.9995301728657404,
+ 0.02832317675053606,
+ 0.011714571684036518,
+ -371.7056116519318
+ ],
+ [
+ 0.02821090670701078,
+ -0.9995555036210926,
+ 0.009640535439073956,
+ -223.43552225722334
+ ],
+ [
+ 0.011982415188553214,
+ -0.009305527365044947,
+ -0.9998849078202487,
+ 816.8312450090789
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/calibration/old_data/pushT/T_mocap_to_cam_right.json b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_right.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ac5ca9e82f448d4a29443d201f49ab2f7de2624
--- /dev/null
+++ b/overlay25/calibration/old_data/pushT/T_mocap_to_cam_right.json
@@ -0,0 +1,249 @@
+{
+ "description": "T_mocap_to_cam: maps OptiTrack (mm) -> camera frame (mm)",
+ "camera_serial": "143322063538",
+ "intrinsics": {
+ "fx": 608.547607421875,
+ "fy": 606.7799072265625,
+ "ppx": 314.88201904296875,
+ "ppy": 243.41900634765625,
+ "width": 640,
+ "height": 480
+ },
+ "mocap_scale": 1000.0,
+ "created_at": "2026-06-26T01:28:28",
+ "points_px": [
+ [
+ 476.1643371582031,
+ 168.6651611328125
+ ],
+ [
+ 494.1025085449219,
+ 328.59747314453125
+ ],
+ [
+ 545.0,
+ 134.0
+ ],
+ [
+ 490.233642578125,
+ 124.05828857421875
+ ],
+ [
+ 480.1378479003906,
+ 155.3331756591797
+ ],
+ [
+ 351.42706298828125,
+ 348.67474365234375
+ ],
+ [
+ 294.347412109375,
+ 358.010009765625
+ ],
+ [
+ 340.0,
+ 120.0
+ ],
+ [
+ 292.0,
+ 95.0
+ ],
+ [
+ 157.60145568847656,
+ 253.61737060546875
+ ],
+ [
+ 504.0,
+ 47.0
+ ],
+ [
+ 485.0,
+ 124.0
+ ],
+ [
+ 620.0,
+ 182.0
+ ],
+ [
+ 475.0,
+ 155.0
+ ],
+ [
+ 469.9,
+ 169.1
+ ],
+ [
+ 158.0,
+ 251.0
+ ]
+ ],
+ "points_mocap_mm": [
+ [
+ 237.281,
+ 25.998,
+ 180.44
+ ],
+ [
+ 460.894,
+ 47.84,
+ -0.392
+ ],
+ [
+ 143.892,
+ 82.0,
+ 140.107
+ ],
+ [
+ 172.231,
+ 55.411,
+ 215.355
+ ],
+ [
+ 216.828,
+ 35.16,
+ 191.24099999999999
+ ],
+ [
+ 613.479,
+ 25.656000000000002,
+ 111.227
+ ],
+ [
+ 689.639,
+ 59.382999999999996,
+ 145.195
+ ],
+ [
+ 439.964,
+ 142.1,
+ 328.855
+ ],
+ [
+ 458.52799999999996,
+ 139.993,
+ 401.318
+ ],
+ [
+ 720.971,
+ 60.617999999999995,
+ 355.09000000000003
+ ],
+ [
+ 97.826,
+ 129.169,
+ 280.17900000000003
+ ],
+ [
+ 178.634,
+ 55.319,
+ 221.09
+ ],
+ [
+ 184.85299999999998,
+ 129.086,
+ 9.525
+ ],
+ [
+ 224.36700000000002,
+ 35.253,
+ 198.943
+ ],
+ [
+ 245.226,
+ 26.088,
+ 189.045
+ ],
+ [
+ 719.66,
+ 60.197,
+ 358.024
+ ]
+ ],
+ "points_cam_mm": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ [
+ 281.0,
+ -198.0,
+ 1004.0
+ ],
+ [
+ 438.0,
+ -88.0,
+ 873.0
+ ],
+ [
+ 264.0,
+ -146.0,
+ 1005.0
+ ],
+ [
+ 254.0,
+ -122.0,
+ 999.0
+ ],
+ [
+ -199.0,
+ 10.0,
+ 772.0
+ ]
+ ],
+ "method": "pnp",
+ "num_points": 16,
+ "rmse_px": 0.6773529089318477,
+ "num_inliers": 16,
+ "reproj_err_px": [
+ 0.7942859636336915,
+ 0.5964620646155961,
+ 0.5332480035534054,
+ 0.5820560730276184,
+ 1.019866973042847,
+ 0.2506705542493553,
+ 0.30316141058477153,
+ 0.5786690734086455,
+ 0.7720108630971527,
+ 0.8671502377557846,
+ 0.8289407230345537,
+ 0.29621572579504546,
+ 0.17477754603634127,
+ 0.7905926251861011,
+ 1.0375773923076859,
+ 0.5885532195519027
+ ],
+ "T_mocap_to_cam": [
+ [
+ -0.6897515335422411,
+ 0.7032236183502552,
+ 0.17239305255868395,
+ 543.1555716667916
+ ],
+ [
+ 0.5463648033253602,
+ 0.6617533812861933,
+ -0.5133887065796541,
+ -115.24517071234328
+ ],
+ [
+ -0.4751087493020592,
+ -0.2599211514106996,
+ -0.8406620435026007,
+ 1053.6128044932914
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ ],
+ "up_axis": "z"
+}
\ No newline at end of file
diff --git a/overlay25/clips/event_01.jpg b/overlay25/clips/event_01.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..45c16ff7eeda7a531e2059e3f27e7b57e57b46fb
--- /dev/null
+++ b/overlay25/clips/event_01.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3052d8c5faab34297b22386145ce0b401e0d9c903b63f9b0a96f0dcbc5c4f549
+size 191642
diff --git a/overlay25/clips/event_01.mp4 b/overlay25/clips/event_01.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..6b613ef96ca0f40cb02d353fcdf1e949a5d5c4dc
--- /dev/null
+++ b/overlay25/clips/event_01.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:136201e753977cefa0fc63708f88b834a26ed4ac6ace2f0bdd367d5f4cff6932
+size 676130
diff --git a/overlay25/clips/event_02.jpg b/overlay25/clips/event_02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..baf5a6cec728274c5c80db352a3af46b5e992c1d
--- /dev/null
+++ b/overlay25/clips/event_02.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9bd067e86bced4611d69a5bd3deb385b8a62f5b29a19bdb10e224bbef31c1e85
+size 178682
diff --git a/overlay25/clips/event_02.mp4 b/overlay25/clips/event_02.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..6c7011c461b97cbfef115b8211b74cb9c67c2e70
--- /dev/null
+++ b/overlay25/clips/event_02.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a64fd0475bd25c2554cb1d63369b011ef5f412675592a47b834bfca80bf4cc48
+size 711696
diff --git a/overlay25/clips/event_03.jpg b/overlay25/clips/event_03.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8cc67ac7ccdf28fa07af505e2df6ef127a5e33ef
--- /dev/null
+++ b/overlay25/clips/event_03.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:964b56e879e27f30e149f5d59c5addc3cc78b435116b81dbd03b05e156cc3c4e
+size 179340
diff --git a/overlay25/clips/event_03.mp4 b/overlay25/clips/event_03.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..b1ae7b6f59c04c1e13115da1358ebb8e960b08cf
--- /dev/null
+++ b/overlay25/clips/event_03.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c6a675fec0e1a0f1d5b2f7adc9f106ffe6a7552f6653aef379d6fa0448b8ae0
+size 793095
diff --git a/overlay25/clips/event_04.jpg b/overlay25/clips/event_04.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..62a77faac7eeb87b7e5d8a3196b8ec116e89d49a
--- /dev/null
+++ b/overlay25/clips/event_04.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88c8989ad56c8f2807aad9f1df5ad0e5659eb82460390a5620c7ed5e5fa6e055
+size 200617
diff --git a/overlay25/clips/event_04.mp4 b/overlay25/clips/event_04.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..066de6ab30d2f857c378ba60fd7e241a45dba33b
--- /dev/null
+++ b/overlay25/clips/event_04.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:516985e918dd5cc5f8f788fa2377eb725e8b0278d78746cea759eb4a503920c3
+size 514722
diff --git a/overlay25/clips/event_05.jpg b/overlay25/clips/event_05.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6dea9362f5483700e772c97234c7a6eeecda1fd8
--- /dev/null
+++ b/overlay25/clips/event_05.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15d2822731b3b305aa8c40fc10aa80c4f6766ee7913ceb0c244edcd231ab2005
+size 187566
diff --git a/overlay25/clips/event_05.mp4 b/overlay25/clips/event_05.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..2a7b955813cf9c7fd7af0be2ad3ec8387db410ad
--- /dev/null
+++ b/overlay25/clips/event_05.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16ce190052348590e09c0a1dc675b60326733af3e185909f143b7827ccb953fd
+size 858875
diff --git a/overlay25/clips/event_06.jpg b/overlay25/clips/event_06.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fd3c8e3608fd555f5d295a20bca0c22fa5273397
--- /dev/null
+++ b/overlay25/clips/event_06.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:05209544a534d5e8713609a06ad1584886021952b7a19290aa84403044df5564
+size 193645
diff --git a/overlay25/clips/event_06.mp4 b/overlay25/clips/event_06.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..ac11dd2a5f21dde990d6fd6281c7fefb07de9968
--- /dev/null
+++ b/overlay25/clips/event_06.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e4b8c8cd5753868da2b0c6495de7b8d7ac4bd0d246382e4cb8ca0b5fcec05845
+size 887647
diff --git a/overlay25/clips/event_07.jpg b/overlay25/clips/event_07.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9daa26bdf73edb72a7c26660201cb9efc3a66452
--- /dev/null
+++ b/overlay25/clips/event_07.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf6fc35c72b50b14567df1d5c48358fd9685f84b25ceea2e71512a2f1e51a01f
+size 184507
diff --git a/overlay25/clips/event_07.mp4 b/overlay25/clips/event_07.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..48725108e4d1b2f279aa498a87da48c98d77ffe2
--- /dev/null
+++ b/overlay25/clips/event_07.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ab284dbb6daecd3b0d8a16584034590a8c2c25a94e72996dad45acded5044a0
+size 787624
diff --git a/overlay25/clips/event_08.jpg b/overlay25/clips/event_08.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b7c933de9574d4bd6e602e167ca14d356bc11f8a
--- /dev/null
+++ b/overlay25/clips/event_08.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f278f4d6c0a008feebe72ae0fb99287c20ff81b780334a8f7b2774b7fcddfebb
+size 196047
diff --git a/overlay25/clips/event_08.mp4 b/overlay25/clips/event_08.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..c1c950ba4100932904e6747ac7bdd221f03d4bf9
--- /dev/null
+++ b/overlay25/clips/event_08.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f8884c31a1cd3597d0bb4e088660de48aaf457087e4cc6ef971592f76a9b3c79
+size 690645
diff --git a/overlay25/clips/event_09.jpg b/overlay25/clips/event_09.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..eb20c394fb2b7215fc6e4384b4404cd9e9553289
--- /dev/null
+++ b/overlay25/clips/event_09.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f977db268e434bda5f134185c92dc502ef7b36445d7fe0f6bc073806b89d837
+size 177707
diff --git a/overlay25/clips/event_09.mp4 b/overlay25/clips/event_09.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..8717590127fb5d76f99020e6a2e6370398f81d0b
--- /dev/null
+++ b/overlay25/clips/event_09.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61c23294fecda21864c23dbc7eea05e9d4140f45a53563a7885b8a384cd18b28
+size 680434
diff --git a/overlay25/clips/event_10.jpg b/overlay25/clips/event_10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b147412fdb5cbc09cb0081e4a42788ab53e47224
--- /dev/null
+++ b/overlay25/clips/event_10.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a17874a8802b7d9b9dfd8436e6f7e02469da5a45c3e88fcc0fa4a047abf0792b
+size 178284
diff --git a/overlay25/clips/event_10.mp4 b/overlay25/clips/event_10.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..1364ee67242c220a636987eb28acf3b97560a76b
--- /dev/null
+++ b/overlay25/clips/event_10.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:486c0636bd604e5fdb7a5faeb6f08001d614e95526b6ec528b286cc0fd270fb6
+size 784478
diff --git a/overlay25/clips/event_11.jpg b/overlay25/clips/event_11.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c6e81342079488c0e0c0a85fb5aeb47bd8d2c9bf
--- /dev/null
+++ b/overlay25/clips/event_11.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3063c51606e06d7878ee5ec24a653e6d2706e618b05a3535360a1f688542b23
+size 179275
diff --git a/overlay25/clips/event_11.mp4 b/overlay25/clips/event_11.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..93fee393fee6c34b68572d4343a4900af2ee76ee
--- /dev/null
+++ b/overlay25/clips/event_11.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8152cc05f78487817436e833754412decf892d96b1c8ed41cf889665156f1203
+size 625740
diff --git a/overlay25/clips/event_12.jpg b/overlay25/clips/event_12.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..eb639936eb4198e301d5715ddb9095b9af5dd971
--- /dev/null
+++ b/overlay25/clips/event_12.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3cf0ad0598a6b829710b3961cca68edd5054e9837a1d4e90a1c87b24af4b13b
+size 198858
diff --git a/overlay25/clips/event_12.mp4 b/overlay25/clips/event_12.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..d3cd27966befbc29076e2b9dc5ae66d1374657bb
--- /dev/null
+++ b/overlay25/clips/event_12.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:08ca169441ecca52f43b431ed40cadbf6f7ffc52971a8e8d5cdb55b99297e8aa
+size 656086
diff --git a/overlay25/clips/event_13.jpg b/overlay25/clips/event_13.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a1583b838137c9f73e338aae8b085d3cdddf9180
--- /dev/null
+++ b/overlay25/clips/event_13.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95d0b7998ef203ef1fd45f842a646efb742418309f2c902d2e6709e31627821a
+size 195441
diff --git a/overlay25/clips/event_13.mp4 b/overlay25/clips/event_13.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..14b539c7b30248628db7dce63533a579b7c930e6
--- /dev/null
+++ b/overlay25/clips/event_13.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:102c141518d8d46cee87c618b56cc1cfc3ada73fb8c20bf07e0450935deb98ca
+size 1111835
diff --git a/overlay25/clips/event_14.jpg b/overlay25/clips/event_14.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cb582c15b0a51e358e0066392ecde62984d9c5d8
--- /dev/null
+++ b/overlay25/clips/event_14.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf64b9856be8cd5d2c4593ab25360f87b033ddfcf9aed4599f53d849e24d68ba
+size 185623
diff --git a/overlay25/clips/event_14.mp4 b/overlay25/clips/event_14.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..26d599fc0bef5e957ef408a4ae84b01f44f6be69
--- /dev/null
+++ b/overlay25/clips/event_14.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8869902c1e5307bca37b67af62348331292c8a3eb1c379313cae9d1c1c077033
+size 755951
diff --git a/overlay25/clips/event_15.jpg b/overlay25/clips/event_15.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..451a3181d55deeaa3e8015add4b2286f00ce3eeb
--- /dev/null
+++ b/overlay25/clips/event_15.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5f45eab9cf842dc739237bbeb1921f45e623d9294f90673bb1c8b0049fb5045e
+size 187428
diff --git a/overlay25/clips/event_15.mp4 b/overlay25/clips/event_15.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..a5ead96c8598dac798785fb1423273b7703b7aaa
--- /dev/null
+++ b/overlay25/clips/event_15.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03ac5a1474d5a8e325ab95df315442f95e5fdb32b698b0f99f9be6a4b25445f3
+size 681333
diff --git a/overlay25/clips/event_16.jpg b/overlay25/clips/event_16.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3c063e4b5d990caa4657905346c789f6676b0240
--- /dev/null
+++ b/overlay25/clips/event_16.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a877a0d8e046254c8ccf815555fa56cc2230be322dd42c1432eafc9a3acba0a5
+size 196926
diff --git a/overlay25/clips/event_16.mp4 b/overlay25/clips/event_16.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..804901eb2fe5fd0085ae47db82862c2ee832bb95
--- /dev/null
+++ b/overlay25/clips/event_16.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c97431fb4bf2a323a677a086fff9f3e8ae57464a292975d57d05fe5f3777610
+size 1170384
diff --git a/overlay25/clips/event_17.jpg b/overlay25/clips/event_17.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4e15e778b0f280ace2de2aead915e71a89a3900e
--- /dev/null
+++ b/overlay25/clips/event_17.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ddfbdd1ff2987f811904b81be74c0a039b8dc4b3aebf9749c809b1b2b88ca40
+size 183387
diff --git a/overlay25/clips/event_17.mp4 b/overlay25/clips/event_17.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..34c76b4e9edb8258da0254b7508b9c34f103778b
--- /dev/null
+++ b/overlay25/clips/event_17.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd356bfefccdd3461e7aa9839bb7073c02db13d92b79f610fa6366f25455d19d
+size 693587
diff --git a/overlay25/clips/event_18.jpg b/overlay25/clips/event_18.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..dd3aebe9d095b244b28d0e8cacd7f181229cea3f
--- /dev/null
+++ b/overlay25/clips/event_18.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf6147bbf6907088712cdcc746a4c4dcc9821a2231c42bc585aeaf3b61df41db
+size 178632
diff --git a/overlay25/clips/event_18.mp4 b/overlay25/clips/event_18.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..8f342450705a309222c4c55c5d146bcbc4bd08ed
--- /dev/null
+++ b/overlay25/clips/event_18.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0640a766b42a4a642fd6ea67470375b315bb1e6a929dd3c05d0bc7a121d5fae7
+size 666886
diff --git a/overlay25/clips/event_19.jpg b/overlay25/clips/event_19.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a58a60b45d3a23ece4e2c3a682d372e6e5a42495
--- /dev/null
+++ b/overlay25/clips/event_19.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff20048e3c07af95f5cbfedb8633df931bd5ab2812bfe518407690a5be2f15e1
+size 198971
diff --git a/overlay25/clips/event_19.mp4 b/overlay25/clips/event_19.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..388227b4f95acb1f8d93a97a75732ce67ea51ab8
--- /dev/null
+++ b/overlay25/clips/event_19.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c6092b69e3547d20eb5b0d224e0089948e40e96a4fab8d72559c533f68a1307
+size 626342
diff --git a/overlay25/clips/event_20.jpg b/overlay25/clips/event_20.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..92312ac0af16b901defb644c7079a7e62dcd59f4
--- /dev/null
+++ b/overlay25/clips/event_20.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:150a072f23239f1aedccc340116ac147baf3a5d5ef522b67809ddccc733ca075
+size 188735
diff --git a/overlay25/clips/event_20.mp4 b/overlay25/clips/event_20.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..94fffc3dc568b332a74716b849506c27e992aa4c
--- /dev/null
+++ b/overlay25/clips/event_20.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:992838df398b173d41fde0aa2534499b73c74d4eebfd5cdf5b7be3aa09ceb40d
+size 1020810
diff --git a/overlay25/clips/event_21.jpg b/overlay25/clips/event_21.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4c29c7fa99bbcad2fd9eeb410f48608b781beed4
--- /dev/null
+++ b/overlay25/clips/event_21.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:daba1224069cf57ff56c2b6a4e355ebd915248a5fc3f03e608566fc26a0f611c
+size 192650
diff --git a/overlay25/clips/event_21.mp4 b/overlay25/clips/event_21.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..411ac20324a5959d87277e9f20ce6b9379a27e2b
--- /dev/null
+++ b/overlay25/clips/event_21.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b02244a52b65a38d258af8bb9f6fbeaf4d2ddd8501ef116c5aae6d0e96a7d6a2
+size 1081953
diff --git a/overlay25/clips/event_22.jpg b/overlay25/clips/event_22.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..04214f31ac6098875ab2c244bcd5b028f44b127a
--- /dev/null
+++ b/overlay25/clips/event_22.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ab95061c1d73792c03b69837060b5376deb5889456abacc7c94325d1eb60dc1b
+size 184024
diff --git a/overlay25/clips/event_22.mp4 b/overlay25/clips/event_22.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..18fd5bd6eb118104eb70da21d6329b90c72b70ed
--- /dev/null
+++ b/overlay25/clips/event_22.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:42d5753fbfa35292ed0e557bef21b849c918d20fa27d95c90972e81d494551a7
+size 627271
diff --git a/overlay25/clips/event_23.jpg b/overlay25/clips/event_23.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1375144db0814eecb4eebd679a594891e2ba60b1
--- /dev/null
+++ b/overlay25/clips/event_23.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99cc53d38adae49f3d50d365b5976f45e9b5723a55967ce0c8213a217aae56b1
+size 182550
diff --git a/overlay25/clips/event_23.mp4 b/overlay25/clips/event_23.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..50b16a127b3d0cf8298139d0ba3faf8983cc3d0e
--- /dev/null
+++ b/overlay25/clips/event_23.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a32968ee924c764648aea3155642c5bdc1325013c0cf411e2462693d43062d3
+size 776794
diff --git a/overlay25/clips/event_24.jpg b/overlay25/clips/event_24.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ec758c41df9f39e18d0a71169ba5580d9966faad
--- /dev/null
+++ b/overlay25/clips/event_24.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f9654b43b2a1dbc90f3b46b563901fe41e76ef54971c5ce08d017718a4f6e4ad
+size 176596
diff --git a/overlay25/clips/event_24.mp4 b/overlay25/clips/event_24.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..cde4fe619d496af875fbb60391b2737280facd50
--- /dev/null
+++ b/overlay25/clips/event_24.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fdb290fd03baa45f9653eeea52214810d70206a21bf509c569f0acdd38c2a554
+size 585746
diff --git a/overlay25/clips/event_25.jpg b/overlay25/clips/event_25.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..266fb4066af8a6709e34f3e5934f0c47613ab9c8
--- /dev/null
+++ b/overlay25/clips/event_25.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1d9299f050a9c5a75a4e2da388fcd1b54832d77ba51fa201804faefe6a71b5e
+size 190959
diff --git a/overlay25/clips/event_25.mp4 b/overlay25/clips/event_25.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..89c9e5536c304aefd9af36f39ee291390df1e3ba
--- /dev/null
+++ b/overlay25/clips/event_25.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc17124aaf2731a020478a372b933d57e20b9ca54c8ca2057b077001808ef4a2
+size 964918
diff --git a/overlay25/manifest.json b/overlay25/manifest.json
new file mode 100644
index 0000000000000000000000000000000000000000..677add519e030d8a5f46c5fcd3ba1e833ca897eb
--- /dev/null
+++ b/overlay25/manifest.json
@@ -0,0 +1,558 @@
+{
+ "dataset_revision": "5b1fa8596be2f73348c19c51bb2526281f8f61ab",
+ "renderer": "twm.viz.draw_projection_overlay",
+ "calibration": "Published scope-specific Z-up JSON, unchanged, require_zup validated",
+ "timing": "segment-local row / 30 fps; no capture timestamp substitution",
+ "events": [
+ {
+ "number": 1,
+ "event": "data/motherboard/meta/2026-09-11/episode_007_seg00.parquet::right:544-544:branch_discontinuity",
+ "clip": "clips/event_01.mp4",
+ "poster": "clips/event_01.jpg",
+ "start_row": 484,
+ "end_row_exclusive": 604,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/motherboard/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/motherboard/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/motherboard/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/motherboard/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/motherboard/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "136201e753977cefa0fc63708f88b834a26ed4ac6ace2f0bdd367d5f4cff6932",
+ "overlay_changed_pixels": 596462,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 2,
+ "event": "data/rope/meta/2026-09-14/episode_003_seg01.parquet::right:3960-3964:branch_discontinuity",
+ "clip": "clips/event_02.mp4",
+ "poster": "clips/event_02.jpg",
+ "start_row": 2027,
+ "end_row_exclusive": 2147,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/rope/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/rope/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/rope/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/rope/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/rope/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "a64fd0475bd25c2554cb1d63369b011ef5f412675592a47b834bfca80bf4cc48",
+ "overlay_changed_pixels": 580257,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 3,
+ "event": "data/pushT/meta/2026-09-10/episode_003_seg02.parquet::left:10247-10248:branch_discontinuity",
+ "clip": "clips/event_03.mp4",
+ "poster": "clips/event_03.jpg",
+ "start_row": 0,
+ "end_row_exclusive": 120,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/pushT/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/pushT/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/pushT/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/pushT/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/pushT/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "5c6a675fec0e1a0f1d5b2f7adc9f106ffe6a7552f6653aef379d6fa0448b8ae0",
+ "overlay_changed_pixels": 600202,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 4,
+ "event": "data/toy/meta/2026-09-14/episode_000_seg00.parquet::left:6525-6529:branch_discontinuity",
+ "clip": "clips/event_04.mp4",
+ "poster": "clips/event_04.jpg",
+ "start_row": 892,
+ "end_row_exclusive": 1012,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/toy/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/toy/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/toy/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/toy/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/toy/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "516985e918dd5cc5f8f788fa2377eb725e8b0278d78746cea759eb4a503920c3",
+ "overlay_changed_pixels": 587908,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 5,
+ "event": "data/validation/meta/2026-09-09/episode_001.parquet::right:1394-1397:branch_discontinuity",
+ "clip": "clips/event_05.mp4",
+ "poster": "clips/event_05.jpg",
+ "start_row": 1335,
+ "end_row_exclusive": 1455,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/validation/T_mocap_to_cam_left.json": "69e0b6d256f0eb531dceced8eca225bdc240d6e38127673f3105f02ca7cab2cd",
+ "calibration/data/validation/T_mocap_to_cam_middle.json": "f96b2f338829288a338c02910aaec6dc7d5f7ad0b11c2fbd50ba7ed388f70871",
+ "calibration/data/validation/T_mocap_to_cam_right.json": "2cdff94e9ecf444562ba89f3510469ea5e745ca244c901bcc9ea26b85c87807a",
+ "calibration/data/validation/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/data/validation/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "16ce190052348590e09c0a1dc675b60326733af3e185909f143b7827ccb953fd",
+ "overlay_changed_pixels": 584686,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 6,
+ "event": "old_data/motherboard/meta/2026-05-10/episode_000.parquet::left:6729-6729:branch_discontinuity",
+ "clip": "clips/event_06.mp4",
+ "poster": "clips/event_06.jpg",
+ "start_row": 6669,
+ "end_row_exclusive": 6789,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/motherboard/T_mocap_to_cam_left.json": "01f4bd9d354b4711d80dcab4e970a7fc08179b404158ae891e12cb492565e75f",
+ "calibration/old_data/motherboard/T_mocap_to_cam_middle.json": "d4a4377b581d0b992f2f33cc33a70b87644d74825cb89a2aa33eb23e34f651f0",
+ "calibration/old_data/motherboard/T_mocap_to_cam_right.json": "9fbb9854587002ac07ceb193ec8577af6f733337363104b56a0d89bf8968ac24",
+ "calibration/old_data/motherboard/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/motherboard/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "e4b8c8cd5753868da2b0c6495de7b8d7ac4bd0d246382e4cb8ca0b5fcec05845",
+ "overlay_changed_pixels": 567438,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 7,
+ "event": "old_data/pushT/meta/2026-06-18/episode_001.parquet::left:11024-11027:branch_discontinuity",
+ "clip": "clips/event_07.mp4",
+ "poster": "clips/event_07.jpg",
+ "start_row": 10965,
+ "end_row_exclusive": 11085,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/pushT/T_mocap_to_cam_left.json": "87774724298ec0e9e4b9558376b99548999bf30a9a29246d6ee8d31e2ca61636",
+ "calibration/old_data/pushT/T_mocap_to_cam_middle.json": "d19e0f9275c648bf429d8e53de01b89cb8c3f7b9ae8122088d36590c33fe2b0a",
+ "calibration/old_data/pushT/T_mocap_to_cam_right.json": "81a0e70799d6e1c10ac5476c423be64d0e1fa3cec2842c9b349c6a23841efbf4",
+ "calibration/old_data/pushT/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/pushT/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "3ab284dbb6daecd3b0d8a16584034590a8c2c25a94e72996dad45acded5044a0",
+ "overlay_changed_pixels": 598677,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 8,
+ "event": "data/motherboard/meta/2026-09-11/episode_007_seg02.parquet::left:11508-11524:known_gap",
+ "clip": "clips/event_08.mp4",
+ "poster": "clips/event_08.jpg",
+ "start_row": 5356,
+ "end_row_exclusive": 5476,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/motherboard/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/motherboard/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/motherboard/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/motherboard/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/motherboard/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "f8884c31a1cd3597d0bb4e088660de48aaf457087e4cc6ef971592f76a9b3c79",
+ "overlay_changed_pixels": 613012,
+ "method": "robust_se3_hermite",
+ "confidence": "HIGH"
+ },
+ {
+ "number": 9,
+ "event": "data/validation/meta/2026-09-09/episode_003.parquet::right:7010-7015:branch_discontinuity",
+ "clip": "clips/event_09.mp4",
+ "poster": "clips/event_09.jpg",
+ "start_row": 6952,
+ "end_row_exclusive": 7072,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/validation/T_mocap_to_cam_left.json": "69e0b6d256f0eb531dceced8eca225bdc240d6e38127673f3105f02ca7cab2cd",
+ "calibration/data/validation/T_mocap_to_cam_middle.json": "f96b2f338829288a338c02910aaec6dc7d5f7ad0b11c2fbd50ba7ed388f70871",
+ "calibration/data/validation/T_mocap_to_cam_right.json": "2cdff94e9ecf444562ba89f3510469ea5e745ca244c901bcc9ea26b85c87807a",
+ "calibration/data/validation/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/data/validation/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "61c23294fecda21864c23dbc7eea05e9d4140f45a53563a7885b8a384cd18b28",
+ "overlay_changed_pixels": 614859,
+ "method": "robust_se3_hermite",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 10,
+ "event": "data/pushT/meta/2026-09-10/episode_004_seg00.parquet::left:568-571:branch_discontinuity",
+ "clip": "clips/event_10.mp4",
+ "poster": "clips/event_10.jpg",
+ "start_row": 104,
+ "end_row_exclusive": 224,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/pushT/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/pushT/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/pushT/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/pushT/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/pushT/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "486c0636bd604e5fdb7a5faeb6f08001d614e95526b6ec528b286cc0fd270fb6",
+ "overlay_changed_pixels": 596517,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 11,
+ "event": "data/rope/meta/2026-09-11/episode_000_seg00.parquet::left:2114-2116:branch_discontinuity",
+ "clip": "clips/event_11.mp4",
+ "poster": "clips/event_11.jpg",
+ "start_row": 2055,
+ "end_row_exclusive": 2175,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/rope/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/rope/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/rope/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/rope/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/rope/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "8152cc05f78487817436e833754412decf892d96b1c8ed41cf889665156f1203",
+ "overlay_changed_pixels": 582410,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 12,
+ "event": "data/toy/meta/2026-09-14/episode_000_seg00.parquet::right:5938-5938:branch_discontinuity",
+ "clip": "clips/event_12.mp4",
+ "poster": "clips/event_12.jpg",
+ "start_row": 364,
+ "end_row_exclusive": 484,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/toy/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/toy/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/toy/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/toy/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/toy/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "08ca169441ecca52f43b431ed40cadbf6f7ffc52971a8e8d5cdb55b99297e8aa",
+ "overlay_changed_pixels": 580030,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 13,
+ "event": "old_data/motherboard/meta/2026-05-10/episode_002.parquet::left:10364-10364:branch_discontinuity",
+ "clip": "clips/event_13.mp4",
+ "poster": "clips/event_13.jpg",
+ "start_row": 10304,
+ "end_row_exclusive": 10424,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/motherboard/T_mocap_to_cam_left.json": "01f4bd9d354b4711d80dcab4e970a7fc08179b404158ae891e12cb492565e75f",
+ "calibration/old_data/motherboard/T_mocap_to_cam_middle.json": "d4a4377b581d0b992f2f33cc33a70b87644d74825cb89a2aa33eb23e34f651f0",
+ "calibration/old_data/motherboard/T_mocap_to_cam_right.json": "9fbb9854587002ac07ceb193ec8577af6f733337363104b56a0d89bf8968ac24",
+ "calibration/old_data/motherboard/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/motherboard/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "102c141518d8d46cee87c618b56cc1cfc3ada73fb8c20bf07e0450935deb98ca",
+ "overlay_changed_pixels": 593988,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 14,
+ "event": "old_data/pushT/meta/2026-06-18/episode_001.parquet::left:7981-7984:branch_discontinuity",
+ "clip": "clips/event_14.mp4",
+ "poster": "clips/event_14.jpg",
+ "start_row": 7922,
+ "end_row_exclusive": 8042,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/pushT/T_mocap_to_cam_left.json": "87774724298ec0e9e4b9558376b99548999bf30a9a29246d6ee8d31e2ca61636",
+ "calibration/old_data/pushT/T_mocap_to_cam_middle.json": "d19e0f9275c648bf429d8e53de01b89cb8c3f7b9ae8122088d36590c33fe2b0a",
+ "calibration/old_data/pushT/T_mocap_to_cam_right.json": "81a0e70799d6e1c10ac5476c423be64d0e1fa3cec2842c9b349c6a23841efbf4",
+ "calibration/old_data/pushT/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/pushT/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "8869902c1e5307bca37b67af62348331292c8a3eb1c379313cae9d1c1c077033",
+ "overlay_changed_pixels": 603429,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 15,
+ "event": "data/validation/meta/2026-09-09/episode_005.parquet::right:1081-1087:branch_discontinuity",
+ "clip": "clips/event_15.mp4",
+ "poster": "clips/event_15.jpg",
+ "start_row": 1024,
+ "end_row_exclusive": 1144,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/validation/T_mocap_to_cam_left.json": "69e0b6d256f0eb531dceced8eca225bdc240d6e38127673f3105f02ca7cab2cd",
+ "calibration/data/validation/T_mocap_to_cam_middle.json": "f96b2f338829288a338c02910aaec6dc7d5f7ad0b11c2fbd50ba7ed388f70871",
+ "calibration/data/validation/T_mocap_to_cam_right.json": "2cdff94e9ecf444562ba89f3510469ea5e745ca244c901bcc9ea26b85c87807a",
+ "calibration/data/validation/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/data/validation/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "03ac5a1474d5a8e325ab95df315442f95e5fdb32b698b0f99f9be6a4b25445f3",
+ "overlay_changed_pixels": 574932,
+ "method": "robust_se3_hermite",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 16,
+ "event": "data/motherboard/meta/2026-09-11/episode_007_seg04.parquet::right:24330-24330:branch_discontinuity",
+ "clip": "clips/event_16.mp4",
+ "poster": "clips/event_16.jpg",
+ "start_row": 241,
+ "end_row_exclusive": 361,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/motherboard/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/motherboard/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/motherboard/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/motherboard/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/motherboard/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "5c97431fb4bf2a323a677a086fff9f3e8ae57464a292975d57d05fe5f3777610",
+ "overlay_changed_pixels": 601787,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 17,
+ "event": "data/pushT/meta/2026-09-10/episode_004_seg02.parquet::right:10779-10781:branch_discontinuity",
+ "clip": "clips/event_17.mp4",
+ "poster": "clips/event_17.jpg",
+ "start_row": 1049,
+ "end_row_exclusive": 1169,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/pushT/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/pushT/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/pushT/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/pushT/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/pushT/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "bd356bfefccdd3461e7aa9839bb7073c02db13d92b79f610fa6366f25455d19d",
+ "overlay_changed_pixels": 598595,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 18,
+ "event": "data/rope/meta/2026-09-11/episode_000_seg00.parquet::left:816-819:branch_discontinuity",
+ "clip": "clips/event_18.mp4",
+ "poster": "clips/event_18.jpg",
+ "start_row": 757,
+ "end_row_exclusive": 877,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/rope/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/rope/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/rope/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/rope/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/rope/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "0640a766b42a4a642fd6ea67470375b315bb1e6a929dd3c05d0bc7a121d5fae7",
+ "overlay_changed_pixels": 594557,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 19,
+ "event": "data/toy/meta/2026-09-14/episode_000_seg03.parquet::right:15106-15107:branch_discontinuity",
+ "clip": "clips/event_19.mp4",
+ "poster": "clips/event_19.jpg",
+ "start_row": 1598,
+ "end_row_exclusive": 1718,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/toy/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/toy/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/toy/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/toy/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/toy/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "6c6092b69e3547d20eb5b0d224e0089948e40e96a4fab8d72559c533f68a1307",
+ "overlay_changed_pixels": 601839,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 20,
+ "event": "old_data/motherboard/meta/2026-05-11/episode_005.parquet::right:10454-10454:branch_discontinuity",
+ "clip": "clips/event_20.mp4",
+ "poster": "clips/event_20.jpg",
+ "start_row": 10394,
+ "end_row_exclusive": 10514,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/motherboard/T_mocap_to_cam_left.json": "01f4bd9d354b4711d80dcab4e970a7fc08179b404158ae891e12cb492565e75f",
+ "calibration/old_data/motherboard/T_mocap_to_cam_middle.json": "d4a4377b581d0b992f2f33cc33a70b87644d74825cb89a2aa33eb23e34f651f0",
+ "calibration/old_data/motherboard/T_mocap_to_cam_right.json": "9fbb9854587002ac07ceb193ec8577af6f733337363104b56a0d89bf8968ac24",
+ "calibration/old_data/motherboard/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/motherboard/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "992838df398b173d41fde0aa2534499b73c74d4eebfd5cdf5b7be3aa09ceb40d",
+ "overlay_changed_pixels": 558570,
+ "method": "endpoint_se3",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 21,
+ "event": "data/motherboard/meta/2026-09-11/episode_007_seg04.parquet::left:24381-24421:gap_with_discontinuity",
+ "clip": "clips/event_21.mp4",
+ "poster": "clips/event_21.jpg",
+ "start_row": 312,
+ "end_row_exclusive": 432,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/motherboard/T_mocap_to_cam_left.json": "d7ebe46d2ef346b5bc73f8c58051b8312f40d0b2e9662f400a246a36d4917863",
+ "calibration/data/motherboard/T_mocap_to_cam_middle.json": "90dac3d8fc32747fe5f4324f5fc06971400020e7686f96d23a01568fe7ca789d",
+ "calibration/data/motherboard/T_mocap_to_cam_right.json": "5b3c9ce676ef0203bc3f8453add9d885faee537f916cd534921fba3713d5e4f9",
+ "calibration/data/motherboard/T_gel_to_rigid_left.json": "c4db75f5a4d9732acae9042d6787ba089b55bdbe17c455162e94a5cfad9746d3",
+ "calibration/data/motherboard/T_gel_to_rigid_right.json": "bca8f57e9a6b49de7fb5a15fe54ea785570e2842fde4a2619b460685831a2d7c"
+ },
+ "sha256": "b02244a52b65a38d258af8bb9f6fbeaf4d2ddd8501ef116c5aae6d0e96a7d6a2",
+ "overlay_changed_pixels": 608144,
+ "method": "unrepaired_ambiguous_branch",
+ "confidence": "LOW"
+ },
+ {
+ "number": 22,
+ "event": "old_data/motherboard/meta/2026-05-11/episode_013.parquet::left:8050-8112:known_gap",
+ "clip": "clips/event_22.mp4",
+ "poster": "clips/event_22.jpg",
+ "start_row": 8021,
+ "end_row_exclusive": 8141,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/motherboard/T_mocap_to_cam_left.json": "01f4bd9d354b4711d80dcab4e970a7fc08179b404158ae891e12cb492565e75f",
+ "calibration/old_data/motherboard/T_mocap_to_cam_middle.json": "d4a4377b581d0b992f2f33cc33a70b87644d74825cb89a2aa33eb23e34f651f0",
+ "calibration/old_data/motherboard/T_mocap_to_cam_right.json": "9fbb9854587002ac07ceb193ec8577af6f733337363104b56a0d89bf8968ac24",
+ "calibration/old_data/motherboard/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/motherboard/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "42d5753fbfa35292ed0e557bef21b849c918d20fa27d95c90972e81d494551a7",
+ "overlay_changed_pixels": 549724,
+ "method": "unrepaired_ambiguous_branch",
+ "confidence": "LOW"
+ },
+ {
+ "number": 23,
+ "event": "old_data/pushT/meta/2026-06-18/episode_001.parquet::left:9752-9758:branch_review",
+ "clip": "clips/event_23.mp4",
+ "poster": "clips/event_23.jpg",
+ "start_row": 9695,
+ "end_row_exclusive": 9815,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/pushT/T_mocap_to_cam_left.json": "87774724298ec0e9e4b9558376b99548999bf30a9a29246d6ee8d31e2ca61636",
+ "calibration/old_data/pushT/T_mocap_to_cam_middle.json": "d19e0f9275c648bf429d8e53de01b89cb8c3f7b9ae8122088d36590c33fe2b0a",
+ "calibration/old_data/pushT/T_mocap_to_cam_right.json": "81a0e70799d6e1c10ac5476c423be64d0e1fa3cec2842c9b349c6a23841efbf4",
+ "calibration/old_data/pushT/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/pushT/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "2a32968ee924c764648aea3155642c5bdc1325013c0cf411e2462693d43062d3",
+ "overlay_changed_pixels": 599452,
+ "method": "paired_body_branch_review",
+ "confidence": "MEDIUM"
+ },
+ {
+ "number": 24,
+ "event": "data/validation/meta/2026-09-09/episode_003.parquet::left:6412-6439:branch_discontinuity",
+ "clip": "clips/event_24.mp4",
+ "poster": "clips/event_24.jpg",
+ "start_row": 6365,
+ "end_row_exclusive": 6485,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/data/validation/T_mocap_to_cam_left.json": "69e0b6d256f0eb531dceced8eca225bdc240d6e38127673f3105f02ca7cab2cd",
+ "calibration/data/validation/T_mocap_to_cam_middle.json": "f96b2f338829288a338c02910aaec6dc7d5f7ad0b11c2fbd50ba7ed388f70871",
+ "calibration/data/validation/T_mocap_to_cam_right.json": "2cdff94e9ecf444562ba89f3510469ea5e745ca244c901bcc9ea26b85c87807a",
+ "calibration/data/validation/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/data/validation/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "fdb290fd03baa45f9653eeea52214810d70206a21bf509c569f0acdd38c2a554",
+ "overlay_changed_pixels": 595921,
+ "method": "unrepaired_ambiguous_branch",
+ "confidence": "LOW"
+ },
+ {
+ "number": 25,
+ "event": "old_data/motherboard/meta/2026-05-11/episode_015.parquet::left:708-768:known_gap",
+ "clip": "clips/event_25.mp4",
+ "poster": "clips/event_25.jpg",
+ "start_row": 678,
+ "end_row_exclusive": 798,
+ "frames": 120,
+ "seconds": 4.0,
+ "up_axis": "z",
+ "calibration_sha256": {
+ "calibration/old_data/motherboard/T_mocap_to_cam_left.json": "01f4bd9d354b4711d80dcab4e970a7fc08179b404158ae891e12cb492565e75f",
+ "calibration/old_data/motherboard/T_mocap_to_cam_middle.json": "d4a4377b581d0b992f2f33cc33a70b87644d74825cb89a2aa33eb23e34f651f0",
+ "calibration/old_data/motherboard/T_mocap_to_cam_right.json": "9fbb9854587002ac07ceb193ec8577af6f733337363104b56a0d89bf8968ac24",
+ "calibration/old_data/motherboard/T_gel_to_rigid_left.json": "bbb744d64f07b211bbe568805451f508f4017d2e3353512b6e3b33edbc27dc75",
+ "calibration/old_data/motherboard/T_gel_to_rigid_right.json": "bede0bc030617c571c84b6eeb450e9161479df7bf87eec0f78668c55a199459f"
+ },
+ "sha256": "cc17124aaf2731a020478a372b933d57e20b9ca54c8ca2057b077001808ef4a2",
+ "overlay_changed_pixels": 586078,
+ "method": "unrepaired_ambiguous_branch",
+ "confidence": "LOW"
+ }
+ ]
+}
\ No newline at end of file