GPT: Constraints

This commit is contained in:
chk
2026-05-29 17:20:01 +02:00
parent 1008c9f7fd
commit dd95d56790
15 changed files with 2321 additions and 145 deletions

652
markers.json Normal file
View File

@@ -0,0 +1,652 @@
[
{
"name": "Board_marker_210",
"id": 210,
"link": "Board",
"position_m": [
0.019999999552965164,
-0.019999999552965164,
0.000800000037997961
],
"position_mm": [
19.999999552965164,
-19.999999552965164,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_211",
"id": 211,
"link": "Board",
"position_m": [
0.25,
-0.009999999776482582,
0.000800000037997961
],
"position_mm": [
250.0,
-9.999999776482582,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_215",
"id": 215,
"link": "Board",
"position_m": [
0.25,
-0.09000000357627869,
0.000800000037997961
],
"position_mm": [
250.0,
-90.00000357627869,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_214",
"id": 214,
"link": "Board",
"position_m": [
0.3499999940395355,
-0.009999999776482582,
0.000800000037997961
],
"position_mm": [
349.9999940395355,
-9.999999776482582,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_208",
"id": 208,
"link": "Board",
"position_m": [
0.3499999940395355,
-0.09000000357627869,
0.000800000037997961
],
"position_mm": [
349.9999940395355,
-90.00000357627869,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_206",
"id": 206,
"link": "Board",
"position_m": [
0.6499999761581421,
-0.009999999776482582,
0.000800000037997961
],
"position_mm": [
649.9999761581421,
-9.999999776482582,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_205",
"id": 205,
"link": "Board",
"position_m": [
0.75,
-0.09000000357627869,
0.000800000037997961
],
"position_mm": [
750.0,
-90.00000357627869,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_207",
"id": 207,
"link": "Board",
"position_m": [
0.75,
-0.009999999776482582,
0.000800000037997961
],
"position_mm": [
750.0,
-9.999999776482582,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "Board_marker_217",
"id": 217,
"link": "Board",
"position_m": [
0.6499999761581421,
-0.09000000357627869,
0.000800000037997961
],
"position_mm": [
649.9999761581421,
-90.00000357627869,
0.800000037997961
],
"rotation_quaternion": [
1.0,
0.0,
0.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
{
"name": "aruco_198",
"id": 198,
"link": "Arm1",
"position_m": [
0.11999999731779099,
-0.04913388192653656,
0.10757456719875336
],
"position_mm": [
119.99999731779099,
-49.13388192653656,
107.57456719875336
],
"rotation_quaternion": [
0.9993908405303955,
-0.03489953652024269,
0.0,
0.0
],
"normal": [
0.0,
0.06975655257701874,
0.9975640773773193
]
},
{
"name": "aruco_229",
"id": 229,
"link": "Arm1",
"position_m": [
0.11999999731779099,
-0.13891464471817017,
0.11385266482830048
],
"position_mm": [
119.99999731779099,
-138.91464471817017,
113.85266482830048
],
"rotation_quaternion": [
0.9993908405303955,
-0.03489953652024269,
0.0,
0.0
],
"normal": [
0.0,
0.06975655257701874,
0.9975640773773193
]
},
{
"name": "aruco_242",
"id": 242,
"link": "Arm1",
"position_m": [
0.11999999731779099,
-0.1438673585653305,
0.04302562028169632
],
"position_mm": [
119.99999731779099,
-143.8673585653305,
43.02562028169632
],
"rotation_quaternion": [
0.024677660316228867,
0.7066760063171387,
0.7066760659217834,
-0.024677699431777
],
"normal": [
-5.21540641784668e-08,
-0.06975650042295456,
-0.9975640773773193
]
},
{
"name": "aruco_243",
"id": 243,
"link": "Arm1",
"position_m": [
0.11999999731779099,
-0.17680451273918152,
0.08091549575328827
],
"position_mm": [
119.99999731779099,
-176.80451273918152,
80.91549575328827
],
"rotation_quaternion": [
0.7313537001609802,
0.6819983124732971,
0.0,
0.0
],
"normal": [
0.0,
-0.9975640773773193,
0.06975657492876053
]
},
{
"name": "aruco_244",
"id": 244,
"link": "Ellbow",
"position_m": [
0.24549999833106995,
-0.14139100909233093,
0.0784391462802887
],
"position_mm": [
245.49999833106995,
-141.39100909233093,
78.4391462802887
],
"rotation_quaternion": [
0.6916548013687134,
-0.1470157951116562,
0.6916547417640686,
-0.1470157951116562
],
"normal": [
1.0,
1.4901162970204496e-08,
7.264316792543468e-08
]
},
{
"name": "aruco_245",
"id": 245,
"link": "Ellbow",
"position_m": [
0.21000000834465027,
-0.15583015978336334,
0.04600828140974045
],
"position_mm": [
210.00000834465027,
-155.83015978336334,
46.00828140974045
],
"rotation_quaternion": [
0.147015780210495,
0.6916548013687134,
0.6916547417640686,
-0.1470157951116562
],
"normal": [
-4.4703490686970326e-08,
-0.4067367613315582,
-0.9135454893112183
]
},
{
"name": "aruco_246",
"id": 246,
"link": "Ellbow",
"position_m": [
0.21000000834465027,
-0.12695185840129852,
0.11087001115083694
],
"position_mm": [
210.00000834465027,
-126.95185840129852,
110.87001115083694
],
"rotation_quaternion": [
0.978147566318512,
-0.20791174471378326,
0.0,
0.0
],
"normal": [
0.0,
0.4067367911338806,
0.9135454893112183
]
},
{
"name": "aruco_247",
"id": 247,
"link": "Ellbow",
"position_m": [
0.17249999940395355,
-0.12695185840129852,
0.11087001115083694
],
"position_mm": [
172.49999940395355,
-126.95185840129852,
110.87001115083694
],
"rotation_quaternion": [
0.978147566318512,
-0.20791174471378326,
0.0,
0.0
],
"normal": [
0.0,
0.4067367911338806,
0.9135454893112183
]
},
{
"name": "Arm2_marker_120",
"id": 120,
"link": "Arm2",
"position_m": [
0.23908136785030365,
-0.25199049711227417,
0.10539114475250244
],
"position_mm": [
239.08136785030365,
-251.99049711227417,
105.39114475250244
],
"rotation_quaternion": [
0.4516582787036896,
-0.09600294381380081,
0.8676275014877319,
-0.18441995978355408
],
"normal": [
0.8191521167755127,
-0.23329465091228485,
-0.5239881277084351
]
},
{
"name": "aruco_122",
"id": 122,
"link": "Arm2",
"position_m": [
0.17503933608531952,
-0.24621543288230896,
0.11836209893226624
],
"position_mm": [
175.03933608531952,
-246.21543288230896,
118.36209893226624
],
"rotation_quaternion": [
0.6287412643432617,
-0.13364310562610626,
-0.749304473400116,
0.15926963090896606
],
"normal": [
-0.9848078489303589,
-0.07062903046607971,
-0.15863528847694397
]
},
{
"name": "aruco_218",
"id": 218,
"link": "Arm2",
"position_m": [
0.24496068060398102,
-0.2412007749080658,
0.12962521612644196
],
"position_mm": [
244.96068060398102,
-241.2007749080658,
129.62521612644196
],
"rotation_quaternion": [
0.749304473400116,
-0.15926964581012726,
0.6287412643432617,
-0.13364310562610626
],
"normal": [
0.9848078489303589,
0.0706290453672409,
0.15863528847694397
]
},
{
"name": "aruco_113",
"id": 113,
"link": "Arm2",
"position_m": [
0.20470373332500458,
-0.2954392731189728,
0.17990505695343018
],
"position_mm": [
204.70373332500458,
-295.4392731189728,
179.90505695343018
],
"rotation_quaternion": [
0.9744254350662231,
-0.20712058246135712,
-0.08525115996599197,
0.018120698630809784
],
"normal": [
-0.1736481487751007,
0.40055757761001587,
0.8996666669845581
]
},
{
"name": "aruco_101",
"id": 101,
"link": "Arm2",
"position_m": [
0.23908136785030365,
-0.31593865156173706,
0.13386270403862
],
"position_mm": [
239.08136785030365,
-315.93865156173706,
133.86270403862
],
"rotation_quaternion": [
0.4516582787036896,
-0.09600294381380081,
0.8676275014877319,
-0.18441995978355408
],
"normal": [
0.8191521167755127,
-0.23329465091228485,
-0.5239881277084351
]
},
{
"name": "aruco_102",
"id": 102,
"link": "Arm2",
"position_m": [
0.18963702023029327,
-0.31948474049568176,
0.1258980929851532
],
"position_mm": [
189.63702023029327,
-319.48474049568176,
125.8980929851532
],
"rotation_quaternion": [
0.2941346764564514,
-0.06252026557922363,
-0.93287593126297,
0.1982889324426651
],
"normal": [
-0.5735765099525452,
-0.33317920565605164,
-0.7483325600624084
]
},
{
"name": "aruco_124",
"id": 124,
"link": "Arm2",
"position_m": [
0.17503933608531952,
-0.3439647853374481,
0.1618829369544983
],
"position_mm": [
175.03933608531952,
-343.9647853374481,
161.8829369544983
],
"rotation_quaternion": [
0.6287412643432617,
-0.13364310562610626,
-0.749304473400116,
0.15926963090896606
],
"normal": [
-0.9848078489303589,
-0.07062903046607971,
-0.15863528847694397
]
},
{
"name": "aruco_219",
"id": 219,
"link": "Arm2",
"position_m": [
0.24496068060398102,
-0.33895012736320496,
0.17314603924751282
],
"position_mm": [
244.96068060398102,
-338.95012736320496,
173.14603924751282
],
"rotation_quaternion": [
0.749304473400116,
-0.15926964581012726,
0.6287412643432617,
-0.13364310562610626
],
"normal": [
0.9848078489303589,
0.0706290453672409,
0.15863528847694397
]
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +1,122 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:17Z",
"schema_version": "1.1",
"stage": "initial_triangulation",
"created_utc": "2026-05-29T11:11:53Z",
"summary": {
"stage": "initial_triangulation",
"num_cameras": 3,
"num_markers": 8
"num_markers": 8,
"num_constraints": 31
},
"markers": [
{
"marker_id": 122,
"position_m": [
0.18520598113536835,
-0.21684008836746216,
0.13996362686157227
0.14895405123790784,
-0.2643844341363741,
0.16564713440852427
],
"position_mm": [
185.2059783935547,
-216.840087890625,
139.963623046875
148.95405123790783,
-264.38443413637407,
165.64713440852427
],
"link": "Arm2"
},
{
"marker_id": 198,
"position_m": [
0.12119491398334503,
-0.046654392033815384,
0.13240119814872742
0.11667067734641628,
-0.05481782829770797,
0.13564627196635054
],
"position_mm": [
121.19491577148438,
-46.65439224243164,
132.4011993408203
116.67067734641628,
-54.81782829770797,
135.64627196635055
],
"link": "Arm1"
},
{
"marker_id": 210,
"position_m": [
0.020141778513789177,
-0.01963355578482151,
7.823568921594415e-06
0.020141782836696105,
-0.019633567005699154,
7.847443788934222e-06
],
"position_mm": [
20.14177894592285,
-19.633556365966797,
0.007823568768799305
20.141782836696105,
-19.633567005699152,
0.007847443788934223
],
"link": "Board"
},
{
"marker_id": 211,
"position_m": [
0.24960945546627045,
-0.009326362982392311,
-0.0005378762143664062
0.2496094175197415,
-0.009326316290609264,
-0.0005379225707190097
],
"position_mm": [
249.6094512939453,
-9.326362609863281,
-0.5378761887550354
249.6094175197415,
-9.326316290609263,
-0.5379225707190097
],
"link": "Board"
},
{
"marker_id": 214,
"position_m": [
0.3498840034008026,
-0.009714338928461075,
-2.6824214728549123e-05
0.3498840022857963,
-0.009714324911855806,
-2.6845703214407957e-05
],
"position_mm": [
349.8840026855469,
-9.714339256286621,
-0.026824215427041054
349.8840022857963,
-9.714324911855806,
-0.026845703214407955
],
"link": "Board"
},
{
"marker_id": 215,
"position_m": [
0.2497633397579193,
-0.0896778479218483,
-0.00011857203207910061
0.24976330898445626,
-0.08967780487999989,
-0.00011862459122980862
],
"position_mm": [
249.76333618164062,
-89.67784881591797,
-0.11857203394174576
249.76330898445624,
-89.6778048799999,
-0.11862459122980862
],
"link": "Board"
},
{
"marker_id": 229,
"position_m": [
0.12001997977495193,
-0.13270698487758636,
0.14000186324119568
0.11592480843458029,
-0.1392249195451953,
0.14252312456392438
],
"position_mm": [
120.01998138427734,
-132.7069854736328,
140.00186157226562
115.9248084345803,
-139.22491954519532,
142.52312456392437
],
"link": "Arm1"
},
{
"marker_id": 243,
"position_m": [
0.11871032416820526,
-0.17057909071445465,
0.09964759647846222
0.11871032400722982,
-0.17057910506578056,
0.0996476225849942
],
"position_mm": [
118.7103271484375,
-170.57908630371094,
99.64759826660156
118.71032400722981,
-170.57910506578057,
99.6476225849942
],
"link": "Arm1"
}

View File

@@ -1,121 +1,121 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:18Z",
"schema_version": "1.1",
"created_utc": "2026-05-29T11:11:54Z",
"summary": {
"num_cameras": 3,
"num_markers": 8,
"num_constraints": 124
"num_constraints": 31
},
"markers": [
{
"marker_id": 122,
"position_m": [
0.17089422820752076,
-0.25275415714542,
0.1764152549525782
0.17089422820567965,
-0.25275415672150703,
0.17641525453920115
],
"position_mm": [
170.89422820752077,
-252.75415714541998,
176.4152549525782
170.89422820567964,
-252.75415672150703,
176.41525453920116
],
"link": "Arm2"
},
{
"marker_id": 198,
"position_m": [
0.11820089367579532,
-0.047715698531904785,
0.13484286564203027
0.0782893264155328,
-0.04392881888831051,
0.12370444588754521
],
"position_mm": [
118.20089367579533,
-47.715698531904785,
134.84286564203026
78.2893264155328,
-43.92881888831051,
123.70444588754522
],
"link": "Arm1"
},
{
"marker_id": 210,
"position_m": [
0.019901746801827637,
-0.019634665689316648,
9.617254460632054e-06
0.09810874978803365,
0.04840357531258377,
-0.061619957949719154
],
"position_mm": [
19.901746801827638,
-19.63466568931665,
0.009617254460632054
98.10874978803365,
48.40357531258377,
-61.61995794971915
],
"link": "Board"
},
{
"marker_id": 211,
"position_m": [
0.2499096083030422,
-0.00981801346837422,
7.989879950350478e-05
0.26424764035228315,
-0.0563864907759364,
0.05844872874629282
],
"position_mm": [
249.9096083030422,
-9.81801346837422,
0.07989879950350479
264.24764035228316,
-56.3864907759364,
58.448728746292815
],
"link": "Board"
},
{
"marker_id": 214,
"position_m": [
0.3499095633806716,
-0.009897723015074432,
0.00018350870717776096
0.34990989719464827,
-0.024224263154301,
0.01810457272024633
],
"position_mm": [
349.90956338067156,
-9.897723015074432,
0.18350870717776097
349.9098971946483,
-24.224263154301,
18.10457272024633
],
"link": "Board"
},
{
"marker_id": 215,
"position_m": [
0.24984585113464844,
-0.08981799168050893,
8.39071085193236e-05
0.24658646632630482,
-0.07931906684450687,
-0.016131019201613698
],
"position_mm": [
249.84585113464843,
-89.81799168050892,
0.08390710851932359
246.58646632630482,
-79.31906684450688,
-16.131019201613697
],
"link": "Board"
},
{
"marker_id": 229,
"position_m": [
0.11749065839484758,
-0.137499932562534,
0.14103531580163794
0.1138713279648291,
-0.12617149104964914,
0.1320972625673932
],
"position_mm": [
117.49065839484759,
-137.499932562534,
141.03531580163795
113.8713279648291,
-126.17149104964915,
132.09726256739322
],
"link": "Arm1"
},
{
"marker_id": 243,
"position_m": [
0.11810035461635551,
-0.17482765346898027,
0.10853212349724542
0.1181663829394805,
-0.16401370137352922,
0.1004795056960036
],
"position_mm": [
118.10035461635552,
-174.82765346898026,
108.53212349724542
118.1663829394805,
-164.01370137352922,
100.4795056960036
],
"link": "Arm1"
}

View File

@@ -0,0 +1,105 @@
#!/usr/bin/env python3
"""
check_robot_marker_uniqueness.py
Standalone checker for duplicate / invalid marker IDs in robot.json.
Use this before running bundle adjustment:
python check_robot_marker_uniqueness.py -robot robot.json
Exit codes:
0 = no duplicates found
1 = duplicates or structural problems found
"""
from __future__ import annotations
import argparse
import json
import os
import sys
from collections import defaultdict
from typing import Any, Dict, List, Tuple
def resolve_path(path: str) -> str:
path = os.path.expanduser(path)
if os.path.isabs(path):
return path
return os.path.abspath(path)
def load_json(path: str) -> Dict[str, Any]:
with open(resolve_path(path), "r", encoding="utf-8") as f:
return json.load(f)
def main() -> None:
parser = argparse.ArgumentParser(description="Check marker ID uniqueness in robot.json")
parser.add_argument("-robot", "--robot", required=True, help="Path to robot.json")
parser.add_argument(
"--strict",
action="store_true",
help="Return exit code 1 if any duplicate or invalid marker is found",
)
args = parser.parse_args()
robot = load_json(args.robot)
links = robot.get("links", {}) or {}
id_locations: Dict[int, List[Tuple[str, int, str]]] = defaultdict(list)
invalid_entries: List[str] = []
total_markers = 0
for link_name, link_data in links.items():
markers = link_data.get("markers", []) or []
for idx, marker in enumerate(markers):
total_markers += 1
marker_id = marker.get("id", None)
if marker_id is None:
invalid_entries.append(f"link='{link_name}' marker_index={idx}: missing id")
continue
try:
marker_id_int = int(marker_id)
except Exception:
invalid_entries.append(f"link='{link_name}' marker_index={idx}: non-integer id={marker_id!r}")
continue
name = str(marker.get("name", f"marker_{marker_id_int}"))
id_locations[marker_id_int].append((link_name, idx, name))
pos = marker.get("position", None)
if pos is None or not isinstance(pos, list) or len(pos) != 3:
invalid_entries.append(
f"link='{link_name}' marker_id={marker_id_int}: invalid/missing 3D position"
)
duplicates = {mid: locs for mid, locs in id_locations.items() if len(locs) > 1}
print(f"[INFO] Total marker entries: {total_markers}")
print(f"[INFO] Unique marker IDs : {len(id_locations)}")
print(f"[INFO] Duplicate IDs : {len(duplicates)}")
print(f"[INFO] Invalid entries : {len(invalid_entries)}")
if duplicates:
print("\n[DUPLICATES]")
for mid in sorted(duplicates.keys()):
print(f" marker_id={mid}")
for link_name, idx, name in duplicates[mid]:
print(f" - link='{link_name}' marker_index={idx} name='{name}'")
if invalid_entries:
print("\n[INVALID ENTRIES]")
for item in invalid_entries:
print(f" - {item}")
if duplicates or invalid_entries:
print("\n[WARN] robot.json is not clean for deterministic constraint generation.")
if args.strict:
sys.exit(1)
else:
print("\n[OK] No duplicate marker IDs found.")
if __name__ == "__main__":
main()

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:16Z",
"created_utc": "2026-05-29T11:11:52Z",
"vision_config": {
"MarkerType": "DICT_4X4_250",
"MarkerSize": 0.025
@@ -46,7 +46,7 @@
},
"detections": [
{
"observation_id": "2ee8a896-adc4-44a7-8e21-00bf2d2bdb29",
"observation_id": "3fe0abea-8ee3-488d-afdd-ca173488bac8",
"type": "aruco",
"marker_id": 124,
"marker_size_m": 0.025,
@@ -100,7 +100,7 @@
"confidence": 0.6862086405991146
},
{
"observation_id": "122847ec-48d6-477c-a833-61a1cbb5620b",
"observation_id": "4ad28655-628f-4970-aee7-ac0464a422dd",
"type": "aruco",
"marker_id": 243,
"marker_size_m": 0.025,
@@ -154,7 +154,7 @@
"confidence": 0.953171926139578
},
{
"observation_id": "4efd7b96-c897-44c5-9f63-6dfccdb0dcf0",
"observation_id": "39c9ae85-1343-4abd-a776-aead564c7ba2",
"type": "aruco",
"marker_id": 122,
"marker_size_m": 0.025,
@@ -208,7 +208,7 @@
"confidence": 0.5964639370258038
},
{
"observation_id": "c7a43ad5-e272-4673-af80-a17d11161ae4",
"observation_id": "2d4f27e1-f896-4714-bea0-d66f354f65bc",
"type": "aruco",
"marker_id": 102,
"marker_size_m": 0.025,
@@ -262,7 +262,7 @@
"confidence": 0.3578323322772018
},
{
"observation_id": "7d8958be-4ff2-4929-a78a-0e3239574df7",
"observation_id": "2b4ed846-8c7c-40a4-9d78-6dde96b7fb77",
"type": "aruco",
"marker_id": 229,
"marker_size_m": 0.025,
@@ -316,7 +316,7 @@
"confidence": 0.4396423002158715
},
{
"observation_id": "dea83763-ba79-4211-ace5-2fb4693ec614",
"observation_id": "5ce4384f-4a4e-4dfb-9e84-cfb04b1ee009",
"type": "aruco",
"marker_id": 210,
"marker_size_m": 0.025,
@@ -370,7 +370,7 @@
"confidence": 0.23718801109435655
},
{
"observation_id": "04e86e9d-49e6-4cc3-b104-8cc4bddae5e1",
"observation_id": "b0f54f4e-c981-4c68-91f4-71796b2e1b7e",
"type": "aruco",
"marker_id": 198,
"marker_size_m": 0.025,
@@ -424,7 +424,7 @@
"confidence": 0.27797680859006363
},
{
"observation_id": "d844a883-c800-4e9c-8f99-fdb379cf9d6a",
"observation_id": "2291dd23-8cfd-4fc8-8268-3f51a4f477e3",
"type": "aruco",
"marker_id": 205,
"marker_size_m": 0.025,
@@ -478,7 +478,7 @@
"confidence": 0.19676029488014599
},
{
"observation_id": "e1194640-f6cb-4af1-8fe3-41d19817b79e",
"observation_id": "1aa4305f-42cd-4a6b-bbd9-3c4779159e9f",
"type": "aruco",
"marker_id": 206,
"marker_size_m": 0.025,
@@ -532,7 +532,7 @@
"confidence": 0.23511362818048806
},
{
"observation_id": "1aa5ff5a-71ef-4362-aeb0-2f000b6c7f37",
"observation_id": "67d472aa-5a55-495c-84f3-9f9867b5e6bb",
"type": "aruco",
"marker_id": 207,
"marker_size_m": 0.025,

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:17Z",
"created_utc": "2026-05-29T11:11:53Z",
"source": {
"detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3a_aruco_detection.json",
"robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json"

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:16Z",
"created_utc": "2026-05-29T11:11:51Z",
"vision_config": {
"MarkerType": "DICT_4X4_250",
"MarkerSize": 0.025
@@ -46,7 +46,7 @@
},
"detections": [
{
"observation_id": "37e350d1-d7f5-4006-9e7c-eabb597891bb",
"observation_id": "d0acb2d6-f00e-4abb-9182-0aba44eb37b5",
"type": "aruco",
"marker_id": 243,
"marker_size_m": 0.025,
@@ -100,7 +100,7 @@
"confidence": 0.8522257252911212
},
{
"observation_id": "fb1bfc74-794b-4065-b35e-f49b5e413a94",
"observation_id": "912b4c1f-fa4d-488b-ae55-6c159b08259f",
"type": "aruco",
"marker_id": 122,
"marker_size_m": 0.025,
@@ -154,7 +154,7 @@
"confidence": 0.2874514216623714
},
{
"observation_id": "6766568d-a40c-4c97-87fd-77e5243838fb",
"observation_id": "d713f49f-d43d-4181-b2c3-802fae7ac4c6",
"type": "aruco",
"marker_id": 229,
"marker_size_m": 0.025,
@@ -208,7 +208,7 @@
"confidence": 0.5547001883002887
},
{
"observation_id": "958853a3-10c7-486a-8985-8fa8eab7fb7a",
"observation_id": "b540ca35-2454-4485-b5c9-0edcffa7d655",
"type": "aruco",
"marker_id": 208,
"marker_size_m": 0.025,
@@ -262,7 +262,7 @@
"confidence": 0.6072727689079809
},
{
"observation_id": "0ba8ce36-cbf9-42b2-8829-3c1b5adcf247",
"observation_id": "fd9ca8aa-3703-4a75-99dd-61e9d6da7096",
"type": "aruco",
"marker_id": 215,
"marker_size_m": 0.025,
@@ -316,7 +316,7 @@
"confidence": 0.6168610191628993
},
{
"observation_id": "3e48e695-6ede-4e3d-932c-161c06a03ac7",
"observation_id": "b9dfaf55-fe73-4bac-a011-9ff31f13c491",
"type": "aruco",
"marker_id": 214,
"marker_size_m": 0.025,
@@ -370,7 +370,7 @@
"confidence": 0.5524643209674667
},
{
"observation_id": "386a4b8c-7efc-4cad-a7e0-c02ce8d15271",
"observation_id": "5e971f45-cf73-466b-ade5-bd09a71a0f8e",
"type": "aruco",
"marker_id": 211,
"marker_size_m": 0.025,
@@ -424,7 +424,7 @@
"confidence": 0.5730650050844824
},
{
"observation_id": "cb63df83-5a11-4455-89ae-c741e2c649dd",
"observation_id": "48a160b7-02c3-47de-8eba-01d6c15d5d42",
"type": "aruco",
"marker_id": 198,
"marker_size_m": 0.025,
@@ -478,7 +478,7 @@
"confidence": 0.4163346774695628
},
{
"observation_id": "36b8474a-1769-40d3-86ad-98031727ad2e",
"observation_id": "3280ec54-b129-45ec-bffb-7eb3c61d3bdd",
"type": "aruco",
"marker_id": 210,
"marker_size_m": 0.025,

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:17Z",
"created_utc": "2026-05-29T11:11:52Z",
"source": {
"detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3b_aruco_detection.json",
"robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json"

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:15Z",
"created_utc": "2026-05-29T11:11:51Z",
"vision_config": {
"MarkerType": "DICT_4X4_250",
"MarkerSize": 0.025
@@ -46,7 +46,7 @@
},
"detections": [
{
"observation_id": "d51ce37d-1f1f-40ad-a6a2-a6c8f49b43ff",
"observation_id": "342af2b4-08bf-4f4c-9d28-1285278e24c1",
"type": "aruco",
"marker_id": 219,
"marker_size_m": 0.025,
@@ -100,7 +100,7 @@
"confidence": 0.7735450417034769
},
{
"observation_id": "1806bda1-4af5-4faa-b0a3-0091bd35eabc",
"observation_id": "d02166a7-4c7b-4cd0-8210-124de5d533d7",
"type": "aruco",
"marker_id": 218,
"marker_size_m": 0.025,
@@ -154,7 +154,7 @@
"confidence": 0.7950075578135153
},
{
"observation_id": "82259a28-11c6-4355-967d-d2c525cba254",
"observation_id": "e51ac6d6-f1ea-42af-b51d-903b881ddf01",
"type": "aruco",
"marker_id": 122,
"marker_size_m": 0.025,
@@ -208,7 +208,7 @@
"confidence": 0.8202207056111124
},
{
"observation_id": "97b9df19-3ff6-4315-8c74-470848b59a8e",
"observation_id": "805ea7a3-250b-4fb6-afd6-4641c83240d6",
"type": "aruco",
"marker_id": 214,
"marker_size_m": 0.025,
@@ -262,7 +262,7 @@
"confidence": 0.1700115058329765
},
{
"observation_id": "6e25efa5-9cfb-4415-8be0-1c253eb68b9c",
"observation_id": "ccb99515-0a32-410b-b271-75f6e0e0c1c8",
"type": "aruco",
"marker_id": 215,
"marker_size_m": 0.025,
@@ -316,7 +316,7 @@
"confidence": 0.9372326698512834
},
{
"observation_id": "8411563f-277d-44a1-b331-70ea22f8f316",
"observation_id": "f689811a-b001-4d21-87a2-e01ad38c1a01",
"type": "aruco",
"marker_id": 244,
"marker_size_m": 0.025,
@@ -370,7 +370,7 @@
"confidence": 0.7137086345973509
},
{
"observation_id": "20756782-3ad5-4dc0-9e2b-eea48226a4e7",
"observation_id": "cc2ffd45-0d44-4dad-83b2-46e2dec24bc0",
"type": "aruco",
"marker_id": 229,
"marker_size_m": 0.025,
@@ -424,7 +424,7 @@
"confidence": 0.8888336147757544
},
{
"observation_id": "022ae18d-f34f-420e-8117-ec22aa3f52e4",
"observation_id": "f5127d88-2b68-4a22-b216-fdf19b4d72a2",
"type": "aruco",
"marker_id": 211,
"marker_size_m": 0.025,
@@ -478,7 +478,7 @@
"confidence": 0.8902520865668376
},
{
"observation_id": "22a306fc-a02a-46c3-b9e1-d240ddb40ee6",
"observation_id": "e418b70b-2b7e-4381-b86d-b7dc425de6f0",
"type": "aruco",
"marker_id": 246,
"marker_size_m": 0.025,
@@ -532,7 +532,7 @@
"confidence": 0.7343609168978227
},
{
"observation_id": "76dba603-04ec-4e63-bc5e-8ea448020025",
"observation_id": "d8ade844-05ae-46f2-b1c1-ab84179b062f",
"type": "aruco",
"marker_id": 247,
"marker_size_m": 0.025,
@@ -586,7 +586,7 @@
"confidence": 0.72560382306579
},
{
"observation_id": "173b2222-1e89-405e-8e94-0c43f4773db1",
"observation_id": "4386d50e-2ec2-4cbb-974a-d147e3498171",
"type": "aruco",
"marker_id": 198,
"marker_size_m": 0.025,

View File

@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"created_utc": "2026-05-29T07:55:16Z",
"created_utc": "2026-05-29T11:11:52Z",
"source": {
"detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3c_aruco_detection.json",
"robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json"

View File

@@ -38,7 +38,7 @@ python 2_estimate_camera_from_observations.py -i render_3a_aruco_detection.json
echo.
echo [STEP 3] Triangulate marker positions from multi-view observations
python 3_multiview_bundle_adjustment.py ^
python 3_multiview_bundle_adjustment_v2.py ^
-det render_3a_aruco_detection.json ^
-det render_3b_aruco_detection.json ^
-det render_3c_aruco_detection.json ^

BIN
render.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -29,6 +29,8 @@ DEFAULT_MATERIALS = {
STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"]
marker_export = []
# ============================================================
# JSON LOADING
# ============================================================
@@ -691,6 +693,44 @@ for link_name, link_info in links_def.items():
else:
plate_obj.data.materials[0] = pla_mat
# Weltmatrix holen (inkl. ALLER Transformationen!)
mw = marker_obj.matrix_world
world_pos = mw.translation
world_rot = mw.to_quaternion()
# Optional: Normal in Weltkoordinaten
world_normal = (world_rot @ mathutils.Vector((0, 0, 1))).normalized()
marker_export.append({
"name": marker_name,
"id": marker_id,
"link": link_name,
"position_m": [world_pos.x, world_pos.y, world_pos.z],
# oft nützlich für Computer Vision:
"position_mm": [
world_pos.x / scale_factor,
world_pos.y / scale_factor,
world_pos.z / scale_factor
],
"rotation_quaternion": [
world_rot.w,
world_rot.x,
world_rot.y,
world_rot.z
],
"normal": [
world_normal.x,
world_normal.y,
world_normal.z
]
})
# ============================================================
# DEBUG WORLD AXES
@@ -753,4 +793,13 @@ create_axis_arrow("AxisZ", (0, 0, 1), (0, 0, 1))
# ============================================================
bpy.ops.render.render(write_still=True)
print("Finished rendering:", OUTPUT_FILE)
print("Finished rendering:", OUTPUT_FILE)
MARKER_OUTPUT = str(Path(OUTPUT_FILE).with_name("markers.json"))
with open(MARKER_OUTPUT, "w", encoding="utf-8") as f:
json.dump(marker_export, f, indent=2)
print("Saved marker positions:", MARKER_OUTPUT)

View File

@@ -362,12 +362,12 @@
],
"markers":[
{"id":124, "position":[24.75, -112, -24.75],"normal":[1,0,-1]},
{"id":120, "position":[24.75, -112, -24.75],"normal":[1,0,-1]},
{"id":122, "name": "aruco_122", "position":[-35,-112,0], "normal":[-1,0,0]},
{"id":218, "name": "aruco_218", "position":[35,-112,0], "normal":[1,0,0]},
{"id":122, "name": "aruco_122", "position":[0, -182, 30],"normal":[0,0,1]},
{"id":101, "name": "aruco_122", "position":[ 24.75, -182, -24.75],"normal":[ 1,0,-1]},
{"id":102, "name": "aruco_122", "position":[-24.75, -182, -24.75],"normal":[-1,0,-1]},
{"id":113, "name": "aruco_113", "position":[0, -182, 30],"normal":[0,0,1]},
{"id":101, "name": "aruco_101", "position":[ 24.75, -182, -24.75],"normal":[ 1,0,-1]},
{"id":102, "name": "aruco_102", "position":[-24.75, -182, -24.75],"normal":[-1,0,-1]},
{"id":124, "name": "aruco_124", "position":[-35,-219,0], "normal":[-1,0,0]},
{"id":219, "name": "aruco_219", "position":[35,-219,0], "normal":[1,0,0]}