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 线性化后,各对应的雅可比矩阵为 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.