pose_graph op• Datenarten: pose → table
• Aufruf: import fullseye as fs; fs.ledger.optimize_pose_graph(poses_init, edges, fix_first=True, max_iter=200) (die Implementierung direkt: import pose_graph; pose_graph.optimize_pose_graph(poses_init, edges, fix_first=True, max_iter=200); aus dem Register: ops3d.get("optimize_pose_graph"))
Optimiert die globalen Posen aus Relativposen-Constraints und Schleifenschlüssen. → dict{poses, rmse, cost}.
Optimiert die Anfangsschätzung poses_init (N,6)=[rvec|t] (mit Drift) so, dass die relativen Pose-Bedingungen in edges erfüllt werden. fix_first=True fixiert den ersten Knoten und entfernt so die Eichfreiheit (gauge).
• edges: Liste von (i, j, rvec_ij, t_ij[, w_rot, w_trans]). (rvec_ij, t_ij) ist der Messwert von "j von i aus gesehen" = T_i⁻¹ ∘ T_j (dieselbe Konvention wie relative_pose). Odometrie (i, i+1) und Schleifenschlüsse (entfernte i, j) dürfen in derselben Form gemischt werden. Ein Gewicht multipliziert das Residuum mit sqrt(w) (bei Weglassen 1).
• Das Residuum jeder Kante ist measured⁻¹ ∘ predicted, umgewandelt in 6 Dimensionen (Rotationsvektor + Translation), minimiert mit scipy.optimize.least_squares(method="lm") (max_nfev = max_iter × Anzahl der Parameter).
• Rückgabewert: poses (N,6) (mit fix_first bleibt der erste auf dem Anfangswert), rmse = mean_edge_error(poses, edges), cost = Endkosten (1/2 der Summe der 2. Potenzen der Residuen).
fail-closed: weniger als 2 Knoten, 0 Kanten oder ein Kantenindex außerhalb von [0, N) (stilles Umklappen negativer Indizes wird ebenfalls abgewiesen) führen zu ValueError. Mit fix_first=False bleibt die Eichfreiheit bestehen und die Lösung ist nicht eindeutig (LM liefert 1 Lösung nahe dem Anfangswert). Rotation ist in rad, Translation in Koordinateneinheiten; da beide im selben Residuenvektor stehen, gleicht man sie bei stark unterschiedlichen Einheiten über die Gewichte an. Weder 3D-Punkte noch beobachtete Pixel werden verwendet (die Optimierung einschließlich dieser ist bundle_adjust).
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• pose_graph_slam — py -3.11 examples_3d/pose_graph_slam.py
table als Eingabe)fuse_to_voxel · mesh_select_lod
pose_graph)relative_pose · mean_edge_error
*Provenance: pose_graph.py — 3D Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.