ikd-tree

对于ikd-tree文献阅读,理解写下文章,为后面作复习准备

在文章中,作者提出了一个是哟名嗯动量操作的kd-tree,主要解决kd-tree删除和插入新的节点时,效率低下的问题,对于效率作者也提出整体运行(建树,查询,删除,插入)时间相比kd-tree有将经一倍速度的增加。

1.data struct 

Struct TreeNode :
        // Common Attributes in Standard K-D trees
        PointType point ;
        TreeNode * leftson , rightson ;
        int axis ;
        // New Attributes in ikd-Tree
        int treesize , invalidnum ;
        bool deleted , treedeleted , pushdown ;
        flfloat range [ k ][2] ;
end

数据结构给出了树节点的数据属性leftson(左儿子), rightson(右儿子),其中点信息PointType(例如,点坐标、强度)存储在点中。由于一个点对应于k-d树上的单个节点,因此我们将交替使用点和节点。分割轴被记录在轴上。新属性后面会介绍。

2.build ikd-tree

构建增量k-d树类似于构建静态k-d树,除了为增量更新维护额外的信息之外。算法:给定一个点数组V,首先按协方差最大的划分轴(第4-5行)进行排序。然后将中间点保存到新树节点T(第6至7行)。中值下面和上面的点分别传递到T的左右子节点,用于递归构建(第9-10行)。第11-12行中的LazyLabelInit和下拉式可更新增量更新所需的所有属性(参见第3-C节中详细介绍的数据结构1,第5-7行)

 3.增量的更新

增量更新指的是增量操作,然后是第三节中详细介绍的动态重新平衡。增量操作包括插入、删除和重新插入k-d树的点。具体来说,插入操作会向k-d树附加一个新的点(即一个节点)。在删除操作中,我们使用了一个延迟的删除策略。也就是说,这些点不会立即从树中删除,而只是通过将已删除的属性(deleted)设置为true而标记为“已删除”(参见数据结构1,第6行),如果根于T的子树上的所有节点都被删除,则T的treedeleted属性设置为true。因此,deletedtreedeleted的属性被称为懒惰标签。如果稍后将标记为“删除”但未删除的点插入到树中,则称为“重新插入”,并通过将deleted的属性设置为false即可有效地实现。否则,标记为“deleted”的点将在重建过程中从树中删除。

我们的增量更新支持两种类型:点级更新(point-wise)和盒式更新(box-wise)。点级更新将在树上插入、删除或重新插入树上的单个点,而盒式更新则将插入、删除或重新插入与数据坐标轴对齐的给定框中的所有点。盒式更新可能需要删除或重新插入根节点为T的整个子树。在这种情况下,递归地更新T的所有后代节点deleteddeleted的惰性标签仍然低效。为了解决这个问题,我们使用进一步的惰策略来更新子节点的惰标签。deleteddeletedpushdown(请参见数据结构1,第6行)。在LazyLabelInit中,被删除、树化和下拉的三个标签都被初始化为false(参见算法1,第11行)。 

3.1 Pushdown and Pullup

 两个支持功能,Pushdown Pullup,被设计用于更新树节点T的属性。当属性Pushdown 为true时,Pushdown 函数将被deleted, treedeleted, 和 pushdown的标签复制到它的子节点(但不没有复制到它的的后代。

Pullup函数将基于T的子树的信息汇总给T的以下属性:treesize(见数据结构1,第5行)保存子树上所有节点数,invalidnum存储子树上标记为“删除”的节点数,range(见数据结构1,第7行)汇总子树上所有点坐标轴的范围,其中k为点维度。

3.2 点级更新

在ik-d树上的点级更新以递归的方式实现,这类似于替罪羊k-d树。对于点级插入,该算法递归地从根节点向下搜索,并将新点的除法轴上的坐标与存储在树节点上的点进行比较,直到发现一个叶节点然后追加一个新的树节点。对于删除或重新插入一个点P,该算法会查找存储该点P的树节点,并修改deleted属性。

3.3 盒更新

盒式插入是通过一个接一个地将新点插入ik-d树中来实现的。其他的框式更新(框式删除和重新插入)都是利用属性范围内的范围信息来实现的,它形成了一个框Ct,以及树节点上的惰性标签。该伪代码见算法2。给定要在植根于T的(子)树上更新的点Co框,该算法首先将其惰性标签传递给其子节点,以便在访问时进一步传递(第2行)。然后,它递归地从其根节点中搜索k-d树,并检查根于当前节点T的(子)树上的范围Ct是否与Co框有交集。如果没有交集,递归直接返回,而不更新树(第4行)。如果框Ct完全包含在框Ct中,则盒式删除设置属性deleted 和treedeleted 为true,而盒级重新插入通过UpdateLazyLabel 函数标签设置为false(第6行)。pushdown属性设置为true,表示未应用最新的增量更新到T。对于Ct相交但不包含在Co中的条件,如果当前点P包含在Co中(第11行),则首先删除或重新插入到树中,之后算法递归地查看子节点(第12-13行)并更新当前节点T的所有属性( 第15行)。第16-22行如果违反某些标准(第16行),通过在同一(第18行)或单独的(第20行)中重新构建树来重新平衡树。违反标准、重建和并行重建的功能在第三节中详细介绍。

 2.3 降采样

我们的ikd-Tree进一步支持降采样,详见算法3。对于给定的点P和降采样分辨率L,该算法将空间均匀地划分为长度为L的立方体,然后找到包含点P的boxCD(第1行)。该算法只保留最接近CD中心中心的点(第2行)。这是通过首先在k-d树上搜索CD中包含的所有点,并将它们与新的点P一起存储在一个点数组V中来实现的。通过比较V中的每个点与中心Pcenter(线5)的距离,得到最近的点。然后删除CD中存在的现有点(第6行),然后将最近的点插入到k-d树(第7行)。箱形搜索的实现类似于箱向删除和重新插入(参见算法2)。下采样的一个例子如图所示。 2.

 下表显示了在静态k-d树、动态k-d树、替罪羊k-d树和ikd树上支持的增量更新的比较。

2.4 重新平衡

我们的ikd-Tree主动监控增量k-d树的平衡属性,并通过部分重建动态地重新平衡它。1)平衡准则:平衡准则包括两个子准则:α-balanced 准则和α-deleted准则。假设增量k-d树的一个子树植根于T。当且仅当满足以下条件时,子树为α-balanced

 其中,αbal∈(0.5,1)和S(T)为节点T的treesize属性。植根于T的子树的α-deleted准则为

 其中,αdel∈(0,1)和I(T)表示子树上无效节点的数量(即节点T的invalidnum属性)。

如果增量k-d树的一个子树都满足这两个条件,则该子树是平衡的。如果所有的子树都是平衡的,那么整个树都是平衡的。违反任何一个标准都将触发重建过程,以重新平衡(子)树:α平衡标准保持(子)树的最大高度。可以很容易地证明α平衡树的最大高度为,其中n为树的大小;α-deleted标准确保删除(子)树上的无效节点(即标记为“deleted”),以减少树的大小。减少k-d树的高度和大小可以在将来实现高效的增量操作和查询。算法2中第16行的ViolateCriterion 函数如果违反任何一个标准返回true

3.5 重建

 重建:假设在子树T上触发重建,见图3,首先将子树压缩为一个点存储阵列V。标记为“deleted”的树节点在扁平化过程中被丢弃。然后,利用算法1,利用V中的所有点建立了一个新的完全平衡的k-d树。

 3.6 并行重建

并行重建:当在增量的k-d树上重建一个大的子树时,可以观察到实时能力的明显下降。为了保持较高的实时性能力,我们设计了一种双线程重建方法:主线程只重建大小小于子树预定值Nmax和第二个线程重建其余部分。关键问题是如何避免主线程和第二个线程之间的信息丢失和内存冲突。

在第二个线程上的重建算法如算法4所示。表示要在第二个线程中重建的子树为T,其根节点为T。第二个线程将锁定所有增量更新(即点插入、重新插入和删除),但不会queries此子树(第2行)。然后,第二个线程将子树T中包含的所有有效点复制到一个点数组V(即变平)中,同时对重建过程中可能的查询保持不变(第3行)。扁平化后,子树将为主线程解锁,以获取进一步的增量更新请求(第4行)。这些请求将被挂起并记录在一个名为操作记录器的队列中。一旦第二个线程从点数组V(第5行)完成构建一个新的平衡k-d树T‘,记录的更新请求将按函数IncrementalUpdates(第6-8行)执行,其中并行重建选项设置为false(因为它已经在第二个线程中)。在处理了所有挂起的请求之后,该算法从增量更新和查询中锁定节点T,并将其替换为新的T‘(第9-12行)。最后,该算法释放了原始子树(第13行)的内存。请注意,LockUpdates不会阻止查询,而查询可以在主线程中并行执行。相比之下,LockAll会阻止包括查询在内的所有访问,但它完成得非常快(即,只有一条指令),允许在主线程中及时查询。LockUpdatesLockAll功能是通过互斥(互斥锁)实现的。

3.7 K-Nearest Neighbor Search

增量k-d树上的最近搜索是精确的最近搜索[2],而不是[27]上的近似搜索[2]。在搜索植根于节点T的子树以传递其惰性标签之前,先应用Pushdown功能。我们使用属性范围来加快搜索过程,从而保持了困难的实时能力。由于空间的限制,本文没有给出k-最接近搜索算法的细节。有兴趣的读者可以参考开源库中的相关代码。ikd-Tree比静态k-d树稍慢,这可能是由于PCL库的高度优化实现。尽管查询效率略低,但ikd-Tree的总时间消耗比静态k-d树高出一个数量级.

 

 注明:所有图片均来自文献  ikd-Tree: An Incremental K-D Tree for robotic applications

  • 11
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值