kd-tree是二进制空间划分树的一种特殊情况 [1]。 在激光雷达SLAM中,一般使用的是三维点云。所以,kd-tree的维度是3。 由于三维点云的数目一般都比较大,所以,使用kd-tree来进行检索,可以减少很多的时间消耗,可以确保点云的关联点寻找和配准处于实时的状态。 本篇文章将从原理层面讲解kd-tree,以便大家在使用中,...
基于上述kd-tree原理不难推测到,kd-tree结构中一个节点 (Node) 需要承载的必要信息有:父节点,两个孩子节点,自身所代表的数据,所在层的划分维度,划分值。由此,我们得到了节点的最小数据结构: /*** A minimal structure of kd-tree node.*/template<typenamePointType>TreeNode{TreeNode*father_;TreeNode*left_...
为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。 1.2 KD-Tree效率如何? 如果实例点是随机分布的,kd树搜索的平均计算复杂度是(logN),这里N是训练实例数。 kd树更适用于训练实例数远大于空间维数时的k近邻搜索。 当空间维数接近训练实例数时,它的效率会迅速下降,几乎接近线性扫描。
我们来看一下KD-Tree的具体定义,这里的K指的是K维空间,D自然就是dimension,也就是维度,也就是说KD-Tree就是K维度树的意思。 在我们构建线段树的时候,其实是一个递归的建树过程,我们每次把当前的线段一分为二,然后用分成两半的数据分别构建左右子树。我们可以简单写一下伪代码,来更直观地感受一下: classNode:d...
一、kd-tree和ball-tree在算法实现原理上的区别 KD树是对依次对K维坐标轴,以中值切分构造的树,每一个节点是一个超矩形,在维数小于20时效率较高;ball tree 是为了克服KD树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每一个节点是一个超球体。 kd 树是一个二叉树,每一个...
//创建kdtree对象,并将读取到的点云设置为输入。 pcl::KdTreeFLANN<pcl::PointXYZRGBA>kdtree; kdtree.setInputCloud(cloud); pcl::PointXYZRGBAsearchPoint; searchPoint.x=0; searchPoint.y=0; searchPoint.z=0; //可视化 boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer_plane2D(newpcl::visua...
然后方差最大的维度就作为当前节点的划分维度,这样做的原理其实就是:方差越大,说明这个维度上的数据波动越大,也就说明了他们就越不可能属于同一个空间,需要在这个维度上对点进行划分,这就是kd-tree节点选择划分维度的原理 先贴一张kd-tree的图 途中每个节点代表划分点,标示维黑体的维度就是节点的划分维度,可以看...
首先,kdtree的构建过程需要对数据进行排序,这会导致构建的时间复杂度较高。其次,由于kdtree是一个二叉树,树的平衡性对搜索效率有很大影响。如果数据分布不平衡,可能会导致搜索效率下降。此外,kdtree对于高维数据的搜索效率较低,这是由于维度的增加使得数据点在每一维上的分布更加均匀,从而导致分割超平面的效果变差。
kd-tree 是一种k维的二叉树结构,用于在k维空间中进行高效搜索。在激光雷达SLAM应用中,通常处理的是三维点云数据,因此kd-tree的维度设定为3。通过构建kd-tree,可以实现快速的点云最近邻搜索和点云配准,为后续的视觉SLAM和激光SLAM学习奠定基础。2. 原理与构建 2.1 数据结构 kd-tree的每个节点...