我目前正在使用 ICP 来匹配 2 个点云。这些点云随时间演化,所以我不得不多次重复这个过程。我正在使用来自 scipy 的标准 KD 树进行最近邻查找。每个点云大约有 500 个点。我正在考虑使用缓存的 KD 树,但我不确定如何将 KD 树转换为缓存的 KD 树。Scipy中有实现吗?目前,python 中的 SVD 似乎足以满足我的需求,但我也愿意接受任何已知的更快的 SVD 求解器。我当前的 ICP 代码是:
>tree=spatial.KDTree(TimeStep1)
>qHat=TimeStep2
> for i in range(10):
> Phat=tree.query(qHat,eps=.15,distance_upper_bound=2)
> H = np.dot(qHat.T, TimeStep1[Phat[1]-1,:])
> U, S, Vt = np.linalg.svd(H)
> R = np.dot(Vt.T, U.T)
> if np.linalg.det(R) < 0:
> Vt[2,:] *= -1
> R = np.dot(Vt.T, U.T)
> Yes.append(1)
> Eu=rotationMatrixToEulerAngles(R)
> T=TimeStep1[Phat[1]-1,:].T-np.dot(R,qHat.T)
> T=TimeStep1[Phat[1]-1,:]-qHat
> T=T.mean(axis=0)
> qHat=np.dot(R,TimeStep2.T).T+T
> qHat=TimeStep2+T.shape