Robust plane detection
Split phase
- 使用 BVH 树拆分点云成尽量小的 patch
- 小 patch 因为噪声的存在,可能不被判定为一个平面
- 回溯的时候,如果小 patch 不是平面,测试父亲 patch 是不是平面,此时噪声可能占总点云数目比例变小了,容易符合平面判定
Robust planarity test 鲁棒平面测试
平面定义 : 平面上各坐标轴中点 : 方向向量中点
1. Plane-sample distance test
2. Plane-sample normal deviation test
3. Outlier percentage test
Growth phase
- 对 point 建立连接图
- 将检测得到的小 patch 吸收周围 point 进行生长(基于 robust statistics 的区域生长)
Grow
- 根据噪声度量
min_normal_diff_
从小到大排序 queue
取出噪声最小的 patch,每个patch
和point
只使用一次- 判断内点
patch
和point
法向量点乘大于min_normal_diff
- 距离小于
max_point_dist_
- 根据噪声度量
Merge phase
patches 合并
- 三个指标判断两两 patch 是否应该合并
- 并查集合并 patch
Merge
函数入口 对所有
patch
建图,计算它们间的相关关系- 首先判断法向量点乘差异是否满足阈值
- 遍历所有平面
patch
-> 平面包含的点的index
-> 每个点的 kdtree 的邻居 - 并查集计算
- 默认顺序建立并查集树,此时根节点没有物理意义,任意
patch
都有可能是根节点 - 使用
largest_planes
记录成为了根节点的patch
叶子节点里面包含point
最多的patch
- 后续合并就使用
largest_planes
指向的点最多的patch
作为初始,合并其余的patch
- 默认顺序建立并查集树,此时根节点没有物理意义,任意
- 合并共面
patch
根据现有点重新计算max_point_dist_
和min_normal_diff_
的值
Iterative grow-merge procedure
如果有合并更新,就重新进行 Growth phase 和 Merge phase