gicp op• Datenarten: points × points → pose
• Aufruf: import fullseye as fs; fs.ledger.gicp(source, target, max_iter: 'int' = 30, k: 'int' = 20, epsilon: 'float' = 0.001, tol: 'float' = 1e-08, init=None, reproducible: 'bool' = False) -> 'dict' (die Implementierung direkt: import gicp; gicp.gicp(source, target, max_iter: 'int' = 30, k: 'int' = 20, epsilon: 'float' = 0.001, tol: 'float' = 1e-08, init=None, reproducible: 'bool' = False) -> 'dict'; aus dem Register: ops3d.get("gicp"))
• Rückgabewert über das Register: fullseye.ledger.gicp(...) liefert nur den Wert des deklarierten Out-Typs pose (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.gicp.raw(...) oder rufe gicp.gicp direkt auf.
Schätzt die Starrkörpertransformation (R,t) mit Generalized-ICP (kovarianzgewichtetes Mahalanobis-ICP).
In jeder Iteration werden source→target-Korrespondenzen über den nächsten Nachbarn gebildet, und die Mahalanobis-Kosten Σ d_iᵀ W_i d_i, die das Residuum d_i = R·s_i + t - q_i mit dem Gewicht W_i = (C_target[q_i] + R·C_source[s_i]·Rᵀ)⁻¹ messen, werden per Gauss-Newton mit der Kleinwinkel-Linearisierung R ← (I+[ω]×)R minimiert. Aus der Jacobi-Matrix jeder Korrespondenz J_i = [-[R·s_i+t]× | I] (3×6) werden die Normalgleichungen (Σ J_iᵀ W_i J_i) x = -(Σ J_iᵀ W_i d_i) (6×6) nach dem Inkrement x=[ω|τ] gelöst, das mit Rodrigues in eine Rotation zurückgeführt und akkumuliert wird.
Die Kovarianzen sind plane-to-plane (estimate_covariances). Während point-to-plane das Residuum auf die Normalenrichtung des target projiziert (rank-1), verwendet GICP ein Gewicht aus den kombinierten vollen 3×3-Kovarianzen von source und target und ist daher robust bei flächigen, verrauschten Punktwolken.
ICP ist eine lokale Optimierung und setzt eine nahe Initialisierung voraus (ein grobes Matching oder init übergeben).
Argumente:
source (N,3): zu bewegende Punktwolke.
target (M,3): Referenz-Punktwolke (fest).
max_iter: maximale Anzahl der Iterationen.
k: Anzahl der Nachbarn für die Kovarianzschätzung.
epsilon: kleine Varianz in Normalenrichtung für plane-to-plane (0<ε<1).
tol: Konvergenzschwelle. Abbruch, wenn die inkrementelle Translation ‖τ‖ unter tol×(RMS-Radius des target) und
die inkrementelle Rotation ‖ω‖ (rad) unter tol liegt (skalenrelativ).
init: Tupel der Anfangspose (R0(3,3), t0(3,)) oder None (Einheit).
reproducible: bei True werden die N-Punkt-Summen Σ J_iᵀ W_i J_i und Σ J_iᵀ W_i d_i als Reduktionen mit ozakimm (Ozaki-Schema) berechnet,
die Anwendung der Pose elementweise und der RMSE mit math.fsum. Unabhängig von der Reihenfolge der source-Punkte und der BLAS-Threadanzahl
sind R, t und rmse bitgenau gleich (enthält die Kovarianz-Nachbarschaft Punkte mit exakt gleichem Abstand, kann sich die Auswahl der Nachbarn ändern).
Der Standard False verhält sich wie bisher.
Rückgabewert:
dict:
"R" (3,3) ndarray — Rotation, die target ≈ R·source + t erfüllt.
"t" (3,) ndarray — Translation.
"rmse" float — euklidischer RMSE über die finalen Korrespondenzen (übernommene Punkte).
"iterations" int — tatsächliche Anzahl der Iterationen.
Ausnahmen:
ValueError: ungültige Eingabeform / zu wenige Punkte / numerische Divergenz (nicht endlich) = fail-closed.
• 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.
• gicp_register — py -3.11 examples_3d/gicp_register.py
pose als Eingabe)fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error
gicp)*Provenance: gicp.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.