icp_point2plane — 3D refine op

• 資料種類:points × points × normals → pose

• 呼叫: 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)(要直接呼叫實作,import match3d; match3d.icp_point2plane(src, dst, dst_normals, iters=30, tol=1e-09, init=None, trim=None, device='cpu', reproducible=False);從台帳取用則 ops3d.get("icp_point2plane"))

用法

用點-面 ICP(Gauss-Newton,小角近似)高精度精化剛體變換。

將粗匹配(整數 NCC / Fourier-Mellin ±3° / Hough ±0.5voxel)的初始位姿透過最小化表面點雲的點-面距離來收緊的精化方法。每次迭代將 src 各點與 dst 最近鄰對應,最小化 點-面殘差 r_i = n_i·(R·p_i + t - q_i)。以小角近似 R ≈ I + [ω]× 將 R 線性化後,各對應的 Jacobian 矩陣為 J_i = [p_i×n_i | n_i](由純量三重積 n·(ω×p)=ω·(p×n) 得出), 常數項 b_i = -n_i·(p_i - q_i)。以 6×6 求解正規方程 (JᵀJ)x = Jᵀb 得到增量 x=[ω|t],再以 Rodrigues 還原為旋轉並累積。點-面允許在切平面內滑動,因此比 point-to-point 以更少的迭代緊密地收斂到表面(Low 2004)。

實測(波浪狀表面 N=2025,CPU float64):初始 6°/平移 0.06 經 4 次迭代恢復到 euclid RMSE 1.7e-16、旋轉誤差 0°(point-to-point 在 17 次迭代時以 RMSE 4e-2、旋轉 1.9° 停滯)。初始角 3〜20° 時也在 4〜5 次迭代內達到機器精度。

參數:

src (N,3): 被移動側的點雲(粗匹配後的初始位姿)。

dst (M,3): 參照側的點雲(固定)。

dst_normals (M,3): dst 的單位法線(即使未正規化也會在內部正規化)。

未知時以 pointcloud.estimate_normals(dst) 等事先估計。

iters: 最大迭代次數。

tol: RMSE 變化小於此值時判定收斂並終止。

init ((R0,t0)): 初始位姿(傳入粗匹配的 R,t)。None 時為單位。

trim (float|None): [0,1) 的比例。每次迭代捨棄點-面殘差最大的前若干部分的

Trimmed ICP(對部分重疊、離群值穩健)。

device: "cpu"/"cuda" 等。torch device 字串(與 device 無關)。

reproducible: 為 True 時以 ozakimm(Ozaki 方案)計算正規方程的 JᵀJ、Jᵀb(N 點的歸約),

點-面殘差、位姿的套用為逐元素運算,RMSE 用 math.fsum。不依賴 src 點的順序、BLAS 執行緒數,

R、t、rmse 逐位元相同。預設 False 與以往相同(J.T @ J)。

回傳值:

R (3,3), t (3,), aligned (N,3)=R·src+t, rmse(採用點的點-面 RMSE),

n_iter(實際迭代次數)。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• refinement — py -3.11 examples_3d/refinement.py

型別可銜接的下一個運算子(可接受 pose 作為輸入)

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

同類別(refine)

refine_peak_newton · refine_translation_lk · refine_lm · refine_rotation_z · icp_point2point_3d


*Provenance: match3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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