icp_point2plane — 3D refine op

• Data kinds: points × points × normals → pose

• Call: import fullseye as fs; fs.ledger.icp_point2plane(src, dst, dst_normals, iters=30, tol=1e-09, init=None, trim=None, device='cpu', reproducible=False) (implementation को सीधे call करना हो तो import match3d; match3d.icp_point2plane(src, dst, dst_normals, iters=30, tol=1e-09, init=None, trim=None, device='cpu', reproducible=False), registry से लेना हो तो ops3d.get("icp_point2plane"))

उपयोग

point-to-plane ICP (Gauss-Newton, small-angle approximation) से rigid transform को उच्च सटीकता से refine करता है।

मोटे match (integer NCC / Fourier-Mellin ±3° / Hough ±0.5voxel) के initial pose को surface point clouds की point-to-plane दूरी minimise करके कसने वाली refinement विधि। हर iteration में src के हर point को dst के nearest neighbour से जोड़ा जाता है और point-to-plane residual r_i = n_i·(R·p_i + t - q_i) को minimise किया जाता है। R को small-angle approximation R ≈ I + [ω]× से linearise करने पर हर correspondence का Jacobian J_i = [p_i×n_i | n_i] होता है (scalar triple product n·(ω×p)=ω·(p×n) से), और constant term b_i = -n_i·(p_i - q_i)। normal equations (JᵀJ)x = Jᵀb को 6×6 के रूप में हल करके increment x=[ω|t] मिलता है, जिसे Rodrigues से वापस rotation में बदलकर जोड़ा जाता है। point-to-plane tangent plane के भीतर फिसलने देता है, इसलिए point-to-point की तुलना में कम iterations में surface पर कसकर converge करता है (Low 2004)।

मापा गया (लहरदार surface N=2025, CPU float64): initial 6°/translation 0.06 से 4 iterations में euclid RMSE 1.7e-16 और rotation error 0° तक वापसी (point-to-point 17 iterations पर RMSE 4e-2 और rotation 1.9° पर अटक जाता है)। initial angle 3-20° होने पर भी 4-5 iterations में machine precision।

Arguments:

src (N,3): हिलाया जाने वाला point cloud (मोटे match के बाद का initial pose)।

dst (M,3): reference point cloud (स्थिर)।

dst_normals (M,3): dst के unit normals (normalised न हों तब भी भीतर normalise होते हैं)।

अज्ञात हों तो pointcloud.estimate_normals(dst) आदि से पहले अनुमान लगाएँ।

iters: iterations की अधिकतम संख्या।

tol: RMSE का बदलाव इस मान से कम होने पर convergence मानकर रुकता है।

init ((R0,t0)): initial pose (मोटे match के R,t दें)। None होने पर identity।

trim (float|None): [0,1) का अनुपात। हर iteration में सबसे बड़े point-to-plane residual वाले ऊपरी हिस्से को हटाने वाला

Trimmed ICP (partial overlap और outliers के प्रति robust)।

device: "cpu"/"cuda" आदि। torch device string (device पर निर्भर नहीं)।

reproducible: True होने पर normal equations के JᵀJ और Jᵀb (N points पर reduction) ozakimm (Ozaki scheme) से निकाले जाते हैं,

point-to-plane residual और pose लागू करना element-wise operations हैं, और RMSE math.fsum से। src points के क्रम और BLAS threads की संख्या से स्वतंत्र

R, t और rmse bit स्तर पर समान रहते हैं। default False पहले जैसा है (J.T @ J)।

Returns:

R (3,3), t (3,), aligned (N,3)=R·src+t, rmse (अपनाए गए points का point-to-plane RMSE),

n_iter (वास्तविक iterations की संख्या)।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• refinement — py -3.11 examples_3d/refinement.py

वे अगले ops जिनसे type जुड़ता है (pose को input के रूप में लेते हैं)

fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error

इसी category के (refine)

refine_peak_newton · refine_translation_lk · refine_lm · refine_rotation_z · icp_point2point_3d


*Provenance: match3d.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.