typedef KDTreeSingleIndexAdaptor<L2_Simple_Adaptor<double, PointCloud_flann<double> >, PointCloud_flann<double>, 3> my_kd_tree;
pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud(new pcl::PointCloud<pcl::PointXYZ>);
// pcl kdtree
pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr pcltree(new pcl::KdTreeFLANN<pcl::PointXYZ>);
pcltree->setInputCloud(p_cloud);
double SearchRadius = 0.3;
float ppp = clock();
for (int i = 0; i < 100000; i++)
{
std::vector<int> k_indices; std::vector<float> distance;
pcltree->radiusSearch(p_cloud->at(i), SearchRadius, k_indices, distance);
}
// nanoflann tree
PointCloud_flann<double> cloud_flann;
cloud_flann.pts.resize(p_cloud->size());
for (int i = 0; i < p_cloud->size(); i++)
{
cloud_flann.pts[i].x = p_cloud->points[i].x;
cloud_flann.pts[i].y = p_cloud->points[i].y;
cloud_flann.pts[i].z = p_cloud->points[i].z;
}
my_kd_tree kd_tree(3, cloud_flann, KDTreeSingleIndexAdaptorParams(10));
kd_tree.buildIndex();
const double query_radius_sq = 0.3*0.3;
for (int i = 0; i < 100000; i++)
{
double query_p[3] = { cloud_flann.pts[i].x, cloud_flann.pts[i].y, cloud_flann.pts[i].z };
std::vector<std::pair<size_t, double>> matches;
nanoflann::SearchParams searchparams;
kd_tree.radiusSearch(query_p, query_radius_sq, matches, searchparams);
}
结果:nanoflann的速度比pcl的kdtree会快点,10w个点差33ms