optimize_pose_graph — 3D 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"))

Verwendung

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).

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• pose_graph_slam — py -3.11 examples_3d/pose_graph_slam.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

fuse_to_voxel · mesh_select_lod

Gleiche Kategorie (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.