算法来自fast-lio2
1. 算法说明
1) kd tree
用途:查找邻近点。
方法描述:将数据点递归的进行二分。
2) ikd tree
用途:在kd tree的基础上进行改进,从而支持高效的插入、删除操作。
改进:1. 重建树时,使用两个线程。2. 删除点时,先标记为deleted,需删除的点达到一定比例后再重建树。3. 类似的,添加点时,先放到末端,不平衡的部分达到一定比例后再重建树。
重要功能:
- 加入点并下采样:
找出新点所属的box,只保留box中最接近中点的点,对其他点删除 - 删除点
- 重建子树(主/第二线程):
a. flatten:把子树的数据进行拷贝,这个过程阻止增删操作。这个过程也会删除deleted的点
lock incremental update -> flatten tree to V -> unlock incremental update + record requests in operation logger
b. rebuild:重建树并把新子树赋给老树,这个过程阻止增删操作
rebuild -> lock requests -> replace -> unlock requests - 查找近邻
流程:
- "Build"
- "lasermap_fov_segment" 维持地图大小
- "Add_Points":加入点并下采样
- "Criterion_Check" => "Rebuild"(主/第二线程)=> multi_thread_rebuild
-
"Nearest_Search":查找近邻