主要问题还是open3d的 kdtree模块的 query相关的算法引起的。没来得及在github提issue也查不到相关issue,因为是偶发性崩溃。所以需要记录一下,防止后人踩坑。
初始化kdtree的方式如下。
sample_pcd_data = o3d.data.PCDPointCloud()
pcd = o3d.io.read_point_cloud(sample_pcd_data.path)
pcd.paint_uniform_color([0.5, 0.5, 0.5])
#
pcd_points = np.asarray(pcd.points)
pcd_tree = o3d.geometry.KDTreeFlann(pcd_points )
出现偶发性崩溃的是这类代码
pcd_tree.search_radius_vector_3d(...)
pcd_tree.search_radius_vector_xd(...)
pcd_tree.search_hybrid_vector_3d(...)
pcd_tree.search_hybrid_vector_xd(...)
点云数是1.7万,验证了不管是3d还是xd模式都会出现
大概手动刷了一下概率,大概是10分之一的样子。由于是python,底层是c++库,崩溃不抛出任何异常,python exe进程退出没有任何提示。
最后用scipy的kdtree进行代替,其中kdtree的 query_ball_point等同于search_radius_vector_xd。区别在于返回的是索引数组,其排序状态是无序的。需要注意。