一、前言
新的工作需要将ikd-tree接入,之前做毕设的时候fastlio2的ikd-tree没仔细看,重新捡起来看,记录自己的心得。
看两篇文章:
1.首先把kd-tree给过一遍:
数据结构专题(一) | kd-tree 原理深入理解【看这一篇就够了】 - 知乎
2.把ikd-tree给过一遍:
https://zhuanlan.zhihu.com/p/529926254
看完这两篇文章ikd-tree就差不多了。
二、一些心得
1.SLAM究竟需要怎么样的kd-tree
做一个记录:
- 支持local map随着pose移动 → 支持高效地动态增删;
- 支持始终如一的高效 kNN&ranged-kNN搜索 → 能够始终保持tree的平衡,做到动态re-balance;
- 点的数量不要太大,点无需太过稠密 → 最好自带体素降采样功能;(辨证一下自己的想法)
2、ikd-Tree的节点数据结构
理解一下lazy delete这个概念: 高频率做:删除一个节点时,先将其标记为删除,被标记为删除的节点在 kNN 搜索时会被跳过,但在树形结构中它还是存在的。低频率做:tree结构被彻底重构时,才会借机真的把这些节点从tree结构中拿掉。
关于range-kNN:他的range是以当前节点为根节点的subtree中的所有节点,它们在三维空间中的最小包络盒。range 仅包括 subtree 中没有被删除的点,那些被标记为删除的点不在统计范围内。
3、搜索
与kd-tree一致,会判断左右两个子树的range 是否与目标解空间有重叠,只有有重叠的子树才会被继续递归搜索,没重叠的子树将直接被剪枝掉,实现搜索加速。
要是这里自己后面忘了去看看
数据结构专题(一) | kd-tree 原理深入理解【看这一篇就够了】 - 知乎
这里的这张图的解释。
至于其他的暂时自己还用不到,直接用他的API就行。