在3D点云中定位由于从3D数据中提取信息的复杂度的缘由是很是挑战的。咱们提出了一个增量的方法来高效的解决这个问题。算法
咱们展示说这个增量方案能够在10Hz的urban场景下进行全局定位,比起batch solution快了7.1倍。数据结构
感知能力是很重要的。因此移动机器人常常会配备3D的time-of-filght的传感器来产生环境的精准重建。咱们专一于3D点云的定位。能够在3D数据中作全局关联使得咱们能够重建要给unified表达方式,不须要假设low drife,或者已知的相对起始点。app
Contributionside
a) Incremental point cloud segmentation测试
[3]提出了稠密点云分割的区域生长方法。 对每一个输入点云,分割只会作一次,还有后续的融合步骤。这里只会考虑平面的分割,而咱们的方案更泛化。【5】提出分割深度图。上述的全部方案都没有基于分割结果提出retrieving models的方案。优化
b) Efficient geometric verificationspa
在stereo images的时候,有提出减小匹配数量的策略。【7】提出了RANSAC只能作空间一致性的检查。上述的方法都有图像的视差的假设,全部他们的精度受高disparity和视角强烈变化的影响。rest
持续的3D点云输入被filtered,而后再一个Local cloud里用voxel的方法累积。咱们没有用每次有新观测的时候更新整个local cloud的batch voxel filtering方法,而是更新只有被新的点云影响的voxel。咱们用DVG,一个高效的数据结构可以支持动态的插入和移除。code
被占的voxel会被保存在一个vector里,每一个voxel保存它的index,centroid和包含的点数。为了减小噪声,一个voxel会在有特定数量的点数的时候被认为是active。orm
1) Voxel Indexing
一个voxel就是一个大小是\(l\times w \times h\), 每个voxel有惟一的index(再区间\([0, l\cdot w \cdot h - 1]\)。 grid有一个固定的分辨率\(r\),一个rigid T从是世界系到grid系 \(T_{mg}\)。为了计算的高效,咱们要grid的大小是2的倍数,\(l=2^{l_{bits}}\), \(w=2^{w_{bits}}\), \(h=2^{h_{bits}}\)
2)Insertion and Removal
当新的点被插入的时候,DVG会计算它的indices,而后根据voxel id的增序排列。考虑到排列有\(\mathcal{O}(n\log(n))\)的复杂度,因此用batch voxelization来排序就很重要。当\(m\)个点\(q_i\)被插入到要给voxel(centroid是\(p\)是从\(n\)个点降采样)的时候,咱们有:
\(p \leftarrow\left(n \cdot p+\sum_{i=1}^{m} q_{i}\right) \cdot \frac{1}{n+m}, \quad n \leftarrow n+m\)
3) Rigid Transformation
当回环检测的时候,。。。
一个点\(p_i\)在3D点云里计算它的normal的时候,一般是用neighborhood点集\(\mathcal{N}(p_i)\)的协方差矩阵\(M\)来衡量的。在用fixed-radius Nearest Neighbors(NN)找到邻居后,\(M_{i}:=\overline{\left(\nu_{j}-\bar{\nu}\right)\left(\nu_{j}-\bar{\nu}\right)^{\top}}\)
normal的估计等于\(M_i\)的normalized eigenvector。curvature是\(\sigma=\lambda_{0}\left(\lambda_{0}+\lambda_{1}+\lambda_{2}\right)^{-1}\),这里\(\lambda_{0}<\lambda_{1}<\lambda_{2}\)是\(M_i\)的eigenvalues。
这里咱们作了两个主要的优化步骤。协方差矩阵\(M_i\)是增量算的,而且只有被新扫到的点影响的normal才会被更新。
1)Incremental Updates 重看一遍
2) Rigid Transform
region growing policies 区域生长策略
1)Clusters merging:
2)Growing policies
在准备阶段,PREPARESEEDS会搜集经过CANBESEED测试的点的id,而后把他们经过curvature的增序排列。这样保证区域生长的起始点是最平坦的点,减小segments的数量。
CANGROWTO会返回true,若是seed的normal和邻居点是平行的。由于normals的旋转未知,这个大概经过点乘来确认。另一个max阈值是点的curvature,为了经过CANBESEED测试。
欧氏距离policies很容易理解,由于增量的区域生长已经基于欧氏距离找到邻居candidate。因此,CANGROWTO和CANBESEED总会返回true,PREPARESEEDS只是搜集尚未被assign的点的id。
3) Segment Tracking
cluster ID仅仅是临时的值来定义点归属于一样的cluster,segment ID是lingtime-long的定义。segmentation的阶段可以让咱们鲁棒的跟踪segments和他们在局部地图的持续的views,这也会带来不少好处。
在【1】中,多views不能和同一个segment联系,也会得到不一样的IDs,从而致使目标地图的insertion of segment duplicates。
从局部点云中提取的segments会被一个generic feature vector描述(【13】中eigenvalue-based descriptor)。局部和target map的segments的候选匹配就会被经过NN搜索找到。若是一个对\(c_i, c_j\)的segment centorids的欧式举例少于一个阈值,那么就是几何一致的。在咱们的方案中,咱们用graph problem来描述recognition的问题,来定义个Maximum Pairwise Consistent Set (MPCS).
咱们也利用了章节3-C.3的segment tracking。
\(\mathcal{S}\left(c_{i}\right)=\left\{c_{j} \in V | j \leq i \wedge \Delta\left(c_{i}, c_{j}\right) \leq \theta_{\Delta}+\epsilon\right\}\)
1)Cache Maintenance
若是一个匹配\(c_i\)第一次被找到,\(\mathcal{S}(c_i)\)就会被计算保存。若是这个匹配没有再被观测,那么就会被删掉。
2)Consistent candidates set identification
为了让两个匹配一致,他们的target segments的举例必须小于等于local map的直径。
3)Consistency Graph Construction
4)MPCS Identification
当一个MPCS的大小大于一个阈值的时候,咱们认为一个recognition是成功的。
用来比较的baseline是原版的SegMatch[1],是用标注的PCL库组成的。batch voxel filtering是由pcl::VoxelGrid
,而batch normals estimation是用pcl::NormalEstimation
. Batch Segmentation使用pcl::EuclidianClusterExtraction
和pcl::RegionGrowing
. Recognition是用pcl::GeometricConsistencyGrouping
.
1)硬件: 全部实验都是再32GB的RAM,Intel i7-6700K上完成的。RAM的使用历来没有超过1.6G.
。。。
咱们突出了3D点云定位的incremental的方案。跟以前的不一样,这个方案会维护一个segmented local map,而后用增量的几何验证。这个加速能够达到10Hz,能够支持实时。