( x i , y i , z i ) = > ( r i , c i , h i ) (x_i, y_i, z_i)=>(r_i, c_i, h_i) (xi,yi,zi)=>(ri,ci,hi)
r i = x i / f x + c x c i = y i / f y + c y h i = z i r_i = x_i/f_x+c_x \ \ \ c_i = y_i/f_y+c_y \ \ \ h_i = z_i ri=xi/fx+cx ci=yi/fy+cy hi=zi
参数代表栅格的分辨率和汽车中心位置的坐标。点云的高度期望用高度的平均值表示,梯度计算如下。
g r a d ( q i ) i r = μ ( q i ) i r + 1 − μ ( q i ) i r grad(q_i)_i^r = \mu(q_i)_i^{r+1} - \mu(q_i)_i^r grad(qi)ir=μ(qi)ir+1−μ(qi)ir
g r a d ( q i ) i c = μ ( q i ) i c + 1 − μ ( q i ) i c grad(q_i)_i^c = \mu(q_i)_i^{c+1} - \mu(q_i)_i^c grad(qi)ic=μ(qi)ic+1−μ(qi)ic
栅格化之后,直接匹配。假设障碍物的高度是不变的,height difference error(HDE):
e i k = z i k − μ ( m ( T i ∗ p i − 1 ) ) i k e_i^k = z_i^k-\mu(m(T_i*p_{i-1}))_i^k eik=zik−μ(m(Ti∗pi−1))ik
将第i-1帧点经过坐标变换和投影,计算第k个栅格的高度平均值,与第i帧的同一栅格的差值,表示为HDE。
最小二乘问题,优化的参数为T,优化的目标函数如下
J i = ∑ k ∈ C e i k ( T i ) T Ω e i k ( T i ) J_i=\sum_{k\in C} e_i^k(T_i)^T\Omega e_i^k(T_i) Ji=k∈C∑eik(Ti)TΩeik(Ti)
C表示第i帧所有栅格构成的集合,omega表示误差的协方差矩阵的逆矩阵。
误差对李代数求偏导的雅克比矩阵:
J i k = δ e i k δ ξ i = − δ μ i δ q i δ q i δ p i δ p i δ ξ i J_i^k = {\delta e_i^k \over \delta \xi_i} = -{\delta \mu_i \over \delta q_i}{\delta q_i \over \delta p_i}{\delta p_i \over \delta \xi_i} Jik=δξiδeik=−δqiδμiδpiδqiδξiδpi
三者分别表示栅格的梯度、3D空间投影到栅格的偏导、3D点对李代数的偏导。
最后通过高斯牛顿方法求解最小二乘问题。
2.5D地图的直接匹配不能应用于回环检测和优化,因为这要求一个比较准确的初值。
本文从2.5D地图中提取segments来实现回环。
在本文中,每个segment有五种描述,principal direction, height gradient, curvature, omni-variance and eigen entropy。
c r = λ 3 λ 1 + λ 2 + λ 3 / c r e cr = {\lambda_3 \over \lambda_1+\lambda_2+\lambda_3} / cre cr=λ1+λ2+λ3λ3/cre
o v = ( λ 1 λ 2 λ 3 ) 1 / 3 / o v e ov = (\lambda_1\lambda_2\lambda_3)^{1/3} / ove ov=(λ1λ2λ3)1/3/ove
e e = ( λ 1 l o g ( λ 1 ) + λ 2 l o g ( λ 2 ) + λ 3 l o g ( λ 3 ) ) / e e e ee = (\lambda_1 log(\lambda_1) + \lambda_2 log(\lambda_2) + \lambda_3 log(\lambda_3)) / eee ee=(λ1log(λ1)+λ2log(λ2)+λ3log(λ3))/eee
因此,每个栅格有一个多维向量用于回环检测。
f = ( v 1 T , v 2 T , v 3 T , h g T , c r , o v , e e ) f = (v_1^T, v_2^T, v_3^T, hg^T, cr, ov, ee) f=(v1T,v2T,v3T,hgT,cr,ov,ee)
回环检测的方法,用一个评价函数进行打分,计算segment特征向量的欧几里得距离:
s c o r e i j = ∑ k = 1 m ( f i ( k ) − f j ( k ) ) 2 score_{ij} = \sum_{k=1}^m(f_i(k) - f_j(k))^2 scoreij=k=1∑m(fi(k)−fj(k))2
预先设置一个得分阈值和时间差阈值来进行回环检测额,得分小于一定值并且两帧之间的时间差足够大即认为检测到回环。
使用g2o 构建位姿图,以HDE为约束边,以位姿为顶点。
J i = ∑ k ∈ C e i k ( x i , p i − 1 , p i ) T Ω e i k ( x i , p i − 1 , p i ) J_i = \sum_{k\in C}e_i^k(x_i,p_{i-1},p_i)^T \Omega e_i^k(x_i,p_{i-1},p_i) Ji=k∈C∑eik(xi,pi−1,pi)TΩeik(xi,pi−1,pi)
假设在 x i x_i xi和 x j x_j xj之间检测到回环,误差函数:
J i r = e i r ( x i , p i , p j ) T R e i r ( x i , p i , p j ) J_{ir} = e_i^r(x_i,p_i,p_j)^T R e_i^r(x_i,p_i,p_j) Jir=eir(xi,pi,pj)TReir(xi,pi,pj)
最终优化的目标函数为:
x i ∗ = a r g m i n x i ( J i r + J i ) x_i^* = argmin_{x_i}(J_{ir}+J_i) xi∗=argminxi(Jir+Ji)
全程使用无IMU校正的Velodyne数据。在KITTI数据集上的表现要由于DLO和LOAM。
三种SLAM方法KITTI轨迹的比较。
三种SLAM方法误差比较(6Dof)。
整体误差比DLO和LOAM小很多,运行时间比LOAM少,比DLO稍长。
改进:
提出了一种利用显著性的关键点检测方法,该方法基于可微分描述子的梯度响应和场景的几何特征。
因为使用的是梯度响应而不是真实点,SKD对不同场景的鲁棒性强,在更换场景后不用重新训练网络。
在Oxford和KITTI的数据集的表现,两倍的匹配准确率和140%的相对重复率。(重复率:在同一场景的不同观测时,提取出相同关键点的能力)
给出原始点云和一个预训练特征描述网络,从该网络的特定的一层提取出梯度。规定该层和该层梯度的乘积为显著性。
S ( P ) = F l P . ▽ F l P S(P) = F_l^P. \triangledown F_l^P S(P)=FlP.▽FlP
理解:特定位置的梯度较大,说明该位置的点云特征性更强,在前端更容易被匹配。
上图可以看出,从中心到四周的点云密度不同,对不同密度进行补偿。
本文设计了一个网络可以综合三个模块:
点云的显著性。
PCA降维产生更平滑的特征,可以改善最终的结果。
point cloud context 4个卷积层和2个全连接层。
σ k ( m , n ) = 1 λ 2 . ∑ p k ( i , j ) ∈ S k ( m , n ) ( ∣ ∣ p k ( i , j ) ∣ ∣ − ∣ ∣ p k ( m , n ) ∣ ∣ ) \sigma_k^{(m,n)} = {1 \over \lambda^2} . \sum_{p_k^{(i,j)}\in S_k^{(m,n)}}(||p_k^{(i,j)}|| - ||p_k^{(m,n)}||) σk(m,n)=λ21.pk(i,j)∈Sk(m,n)∑(∣∣pk(i,j)∣∣−∣∣pk(m,n)∣∣)
S k ( m , n ) = { p k ( i , j ) ∣ i ∈ [ m − λ , m − λ ] , j ∈ [ n − λ , n + λ ] } S_k^{(m,n)} = \{ p_k^{(i,j)} | i\in [m-\lambda, m-\lambda],j\in[n-\lambda, n+\lambda] \} Sk(m,n)={pk(i,j)∣i∈[m−λ,m−λ],j∈[n−λ,n+λ]}
σ k ( m , n ) \sigma_k^{(m,n)} σk(m,n)越大表示该点越锋利,为edge feature,反之为plane feature。
T k 0 = T k − 1 . T k − 2 k − 1 = T k − 1 . T k − 2 − 1 . T k − 1 T_k^0 = T_{k-1}.T_{k-2}^{k-1} = T_{k-1}.T_{k-2}^{-1}.T_{k-1} Tk0=Tk−1.Tk−2k−1=Tk−1.Tk−2−1.Tk−1
使用关键帧进行全局地图的更新,使用octree加速查找。
概率更新公式: P ( n ∣ z 1 : t ) = [ 1 + 1 − P ( n ∣ z t ) P ( n ∣ z t ) . 1 − P ( n ∣ z 1 : t ) P ( n ∣ z 1 : t ) . P ( n ) 1 − P ( n ) ] − 1 P(n|z_{1:t}) = {[1+{1-P(n|z_t) \over P(n|z_t)} . {1-P(n|z_{1:t}) \over P(n|z_{1:t})} . {P(n) \over 1-P(n)}]}^{-1} P(n∣z1:t)=[1+P(n∣zt)1−P(n∣zt).P(n∣z1:t)1−P(n∣z1:t).1−P(n)P(n)]−1
提取由高概率立方体组成的关键区域,通过利用历史信息和提取几何特征来有效去除冗余和动态点云。
使用无参数滤波器精确有效地近似关键区域的分布。
验证ROI点云和多种主流的雷达里程计和基于地图的定位,实验表明该方法可在密集的城市环境中实现更好的准确性和速度。
输入:原始点云数据和IMU数据。
输出:目标点云(ROI-cloud)。
最新的雷达扫描经过一个快速的特征提取模块,将提取出的特征作为当前的观测。
同时,在贝叶斯滤波的框架中,前一时间步长的粒子分布包含先验信息,并结合IMU/里程计预测当前的ROI。
预测的ROI经过重采样和蒙特卡洛采样作为输出的点云。
假设机器人很少发生roll和pitch的变化,提取出地面点。
计算点的几何光滑度,(考虑同一条扫描线的前后几个点):
ξ i = 1 ∣ S i ∣ . ∣ ∣ p i l ∣ ∣ . ∣ ∣ ∑ j ∈ S i , j ≠ i ( p j l − p i l ) ∣ ∣ \xi_i = {1 \over |S_i|.||p_i^l||}.||\sum_{j\in S_i, j\neq i}(p_j^l-p_i^l)|| ξi=∣Si∣.∣∣pil∣∣1.∣∣j∈Si,j=i∑(pjl−pil)∣∣
对得到的光滑度取对数得到一条新的分布曲线,从曲线的左边开始搜索edge point和planar point,取代LeGO-LOAM中排序算法,复杂度明显降低。
将特征点云栅格化,求每个栅格内所有点的协方差矩阵,对协方差矩阵进行特征值分解求得三个特征值,如下公式计算此cube的重要性:
f c k = λ 1 e ∑ j ∈ ∑ e λ j e ∣ P c k e ∣ + η λ 1 p + λ 2 p ∑ j ∈ ∑ e λ j e ∣ P c k p ∣ f_{ck}={\lambda_1^e \over \sum_{j\in \sum^e}\lambda_j^e}|P_{c_k}^e|+\eta{\lambda_1^p+\lambda_2^p \over \sum_{j\in \sum^e}\lambda_j^e}|P_{c_k}^p| fck=∑j∈∑eλjeλ1e∣Pcke∣+η∑j∈∑eλjeλ1p+λ2p∣Pckp∣
∣ P c k e ∣ |P_{c_k}^e| ∣Pcke∣表示cube内边特征的个数, ∣ P c k p ∣ |P_{c_k}^p| ∣Pckp∣表示cube内面特征的个数, η \eta η是边特征和面特征之间的平衡因子。
cube的重要性通过应用粒子滤波器进行更新,每个粒子代表cube的特定位置。
ROI-cloud的初始分布是通过在整个3D空间上随机均匀绘制的一组粒子。随着新测量的到来,粒子将逐渐在关键区域附近积累。因为每一次更新都会综合考虑上一帧的粒子分布和当前帧的观测,所以对于动态的障碍物比较好过滤,论文中讲了很多统计学的应用,读起来比较吃力。
最后,重采样将统一的权重重新分配给粒子集,然后增加靠近关键区域的粒子数目,使这些立方体成为高概率。
初始时,粒子是均匀分布的。1s内,收到10帧扫描数据,粒子在关键区域聚集。显然,粒子的数目会影响提取ROI-cloud的时间,而且粒子过多灰造成不应该的区域被关注,因此应使用适当是粒子数目。
可以看出有些类似语义分割的效果,但实际上并没有语义信息被识别,贝叶斯框架只是判断出这个区域有更多的特征信息。使用ROI-cloud之后,NDT匹配时间减少72.35%,位姿误差减小7.65%。
在作者自行收集的数据集上的效果好到离谱,不太可信。
Map generation部分使用LOAM框架,特征提取的方式与LOAM一致,在匹配方法上有一个改进,解决了小FoV激光雷达突然转向的匹配漂移问题。
假设所有扫描到的对象在一定范围内都看成是一个面。对于边特征,首先在global map上寻找与其最近的五个edge point,计算五个点的协方差矩阵,只要最大的特征值比第二大的特征值大三倍,这五个edge point就被认为是共线的。(类似PCA主成分分析)
m = ( P s − P 1 e ) × ( P s − P 2 e ) ∣ P s e − P 1 e ∣ . ∣ P s e − P 2 e ∣ m = {(P_s-P_1^e) \times (P_s-P_2^e) \over |P_s^e-P_1^e|.|P_s^e-P_2^e|} m=∣Pse−P1e∣.∣Pse−P2e∣(Ps−P1e)×(Ps−P2e)
n = ( P s − P 2 e ) × ( P s − P 5 e ) ∣ P s e − P 2 e ∣ . ∣ P s e − P 5 e ∣ n = {(P_s-P_2^e) \times (P_s-P_5^e) \over |P_s^e-P_2^e|.|P_s^e-P_5^e|} n=∣Pse−P2e∣.∣Pse−P5e∣(Ps−P2e)×(Ps−P5e)
m, n分别是经过 P s , P 1 e , P 2 e P_s,P_1^e, P_2^e Ps,P1e,P2e和 P s , P 1 e , P 2 e P_s,P_1^e, P_2^e Ps,P1e,P2e平面的法向量,优化目标函数:
r e = m × n m ⋅ n r_e={m\times n \over m\cdot n} re=m⋅nm×n
对于面特征,同样是计算五个最邻近点的协方差矩阵,如果最小的特征值小于第二小特征值的三分之一,就认为五点共面,优化目标函数:
r p = ( P S − P 1 l ) T ( ( P 3 l − P 5 l ) × ( P 3 l − P 1 l ) ) ∣ ( P 3 l − P 5 l ) × ( P 3 l − P 1 l ) ∣ r_p={(P_S-P_1^l)^T((P_3^l-P_5^l)\times (P_3^l-P_1^l))\over |(P_3^l-P_5^l)\times (P_3^l-P_1^l)|} rp=∣(P3l−P5l)×(P3l−P1l)∣(PS−P1l)T((P3l−P5l)×(P3l−P1l))
最后的目标函数为所有edge point和planar point的 r e r_e re和 r p r_p rp之和。
重定位使用的是LOAM中的特征点匹配的方式:
不同点:在目标函数里面加入了权重,权重的计算运用到了intensity,强度越大的点在优化时权重越大:
W i = s ⋅ e x p ( − ∑ i = 1 c ∣ I ( P i ) − I ( P O ) ∣ I a v e ) W_i = s\cdot exp(-\sum_{i=1}^c{|I(P_i)-I(P_O)|\over I_{ave}}) Wi=s⋅exp(−i=1∑cIave∣I(Pi)−I(PO)∣)
转弯时的轨迹预测不会漂移,因为FoV很小,Loam_Livox容易发生漂移。
和Livox_Loam比较,重定位的误差小。
在位姿预测部分,对于面特征,计算的还是距离,而对于线特征, r e r_e re的物理意义不清楚。重定位部分与LOAM的区别只有是否加权的区别,为什么本文不会产生漂移。
在LOAM的雷达里程计部分,对于特征匹配的两种特征也可以使用强度来加权。(下文就是针对这个)
d i = ( X i − X L ) T ( X i − X L ) d_i=\sqrt{(X_i-X^L)^T(X_i-X^L)} di=(Xi−XL)T(Xi−XL)
d i I = ∣ ∣ I i − I ˉ ∣ ∣ d_i^I=||I_i-\bar{I}|| diI=∣∣Ii−Iˉ∣∣
w i o = e − ( d i + d i I ) w_i^o = e^{-(d_i+d_i^I)} wio=e−(di+diI)
相邻的有相同强度的点被设置更高的权重,更有可能成为特征点,在优化时也具有更大的权重。
w i m = e x p − ∣ ∣ I i − I ˉ ∣ ∣ w_i^m=exp^{-||I_i-\bar{I}||} wim=exp−∣∣Ii−Iˉ∣∣
协方差矩阵:
M ∗ = 1 ∑ i = 1 N w i m ( ( X i − X ˉ ) T ( X i − X ˉ ) ) M^*={1\over \sum_{i=1}^N} w_i^m((X_i-\bar{X})^T(X_i-\bar{X})) M∗=∑i=1N1wim((Xi−Xˉ)T(Xi−Xˉ))
优化目标函数:
a r g m i n β ∑ i = 1 m w i m ∣ y i − ∑ j = 1 n x i j β j ∣ 2 argmin_{\beta}\sum_{i=1}^m w_i^m|y_i-\sum_{j=1}^n x_{ij}\beta_j|^2 argminβi=1∑mwim∣yi−j=1∑nxijβj∣2
本文是一个经典带回环检测的LOAM框架,高频里程计和低频建图。
每一帧雷达扫描数据都经过IMU预匹配,然后投影到球体距离图(Spherical Range)上,由球体坐标系定义,转换公式:
[ r θ ϕ ] = [ x 2 + y 2 + z 2 a r c t a n ( x / z ) a r c s i n ( y / x 2 + y 2 + z 2 ) ] \left[ \begin{matrix} r\\ \theta\\ \phi \end{matrix} \right] \ = \ \left[ \begin{matrix} \sqrt{x^2+y^2+z^2}\\ arctan(x/z)\\ arcsin(y/\sqrt{x^2+y^2+z^2}) \end{matrix} \right] ⎣⎡rθϕ⎦⎤ = ⎣⎡x2+y2+z2arctan(x/z)arcsin(y/x2+y2+z2)⎦⎤
表面法向量计算。常用的计算表面法向量的方法是整体线性最小二乘法,但是会非常消耗计算资源。本文采用的方法是先用一个小矩形窗口确定临近点,然后用临近点预测每个点的法向量。
求球坐标系下的全微分:
Δ = x ( ∂ ∂ r s i n θ c o s ϕ + ∂ ∂ θ c o s θ r c o s ϕ − ∂ ∂ ϕ s i n θ s i n ϕ r ) + y ( ∂ ∂ r s i n ϕ + ∂ ∂ ϕ c o s ϕ r ) + z ( ∂ ∂ r c o s θ c o s ϕ + ∂ ∂ θ s i n θ r c o s ϕ − ∂ ∂ ϕ c o s θ s i n ϕ r ) \Delta = x({\partial \over \partial r}sin\theta cos\phi + {\partial \over \partial \theta}{cos\theta \over rcos\phi}-{\partial\over \partial \phi}{sin\theta sin\phi \over r})+y({\partial \over \partial r}sin\phi+{\partial\over \partial\phi}{cos\phi\over r})+z({\partial\over \partial r}cos\theta cos\phi+{\partial\over\partial \theta}{sin\theta\over rcos\phi}-{\partial \over\partial\phi}{cos\theta sin\phi \over r}) Δ=x(∂r∂sinθcosϕ+∂θ∂rcosϕcosθ−∂ϕ∂rsinθsinϕ)+y(∂r∂sinϕ+∂ϕ∂rcosϕ)+z(∂r∂cosθcosϕ+∂θ∂rcosϕsinθ−∂ϕ∂rcosθsinϕ)
SRI面方程为 r = s ( θ , ϕ ) r=s(\theta, \phi) r=s(θ,ϕ),应用全微分可求得法向量为:
n = Δ s ( θ , ϕ ) = [ z x y ] R θ , ϕ [ 1 1 r c o s ϕ ∂ r ∂ θ q r ∂ r ∂ ϕ ] n=\Delta s(\theta,\phi)=[z\ \ x\ \ y]R_{\theta, \phi} \left[ \begin{matrix} 1\\ {1\over rcos\phi}{\partial r\over \partial \theta}\\ {q\over r}{\partial r\over \partial \phi} \end{matrix} \right] n=Δs(θ,ϕ)=[z x y]Rθ,ϕ⎣⎡1rcosϕ1∂θ∂rrq∂ϕ∂r⎦⎤
R θ , ϕ R_{\theta, \phi} Rθ,ϕ是方位角和俯仰角的旋转矩阵,可提前计算得到。偏导数是通过在SRI上应用标准图像处理卷积核获得的(这通常用于图像中的边缘提取),然后应用Prewitt算子。 至此,就计算出了每个点的法向量。
分割和特征提取。首先聚类获得点云簇,然后对每个簇运用主成分分析法来获取线特征和面特征。在聚类部分使用基于区域增长的方法,区域生长时的条件是生长点和种子的距离小于阈值,两个点对应的法向量夹角小于阈值,否则舍弃生长点,并且舍弃点数目过少的类。
聚类之后,对每个类运用PCA算法,计算每个类的协方差矩阵,求解特征值和特征向量,判断特征值的大小关系就能确定类是否属于边特征或者面特征。
结合特征向量确定拟合直线或者平面,最终满足一下条件的特征才能留下:
边 特 征 : λ 1 c + λ 2 c λ 1 c + λ 2 c + λ 3 c < ϵ l , e = 1 ∣ c i ∣ ∑ p j ∈ c i d ( L i , p j ) < ϵ p 2 l 边特征:{\lambda_1^c+\lambda_2^c\over \lambda_1^c+\lambda_2^c+\lambda_3^c}<\epsilon_l,\ e={1\over |c_i|}\sum_{p_j\in c_i}d(L_i,p_j)<\epsilon_{p2l} 边特征:λ1c+λ2c+λ3cλ1c+λ2c<ϵl, e=∣ci∣1pj∈ci∑d(Li,pj)<ϵp2l
面 特 征 : λ 1 c + λ 2 c λ 1 c + λ 2 c + λ 3 c < ϵ l , e = 1 ∣ c i ∣ ∑ p j ∈ c i d ( L i , p j ) < ϵ p 2 l 面特征:{\lambda_1^c+\lambda_2^c\over \lambda_1^c+\lambda_2^c+\lambda_3^c}<\epsilon_l,\ e={1\over |c_i|}\sum_{p_j\in c_i}d(L_i,p_j)<\epsilon_{p2l} 面特征:λ1c+λ2c+λ3cλ1c+λ2c<ϵl, e=∣ci∣1pj∈ci∑d(Li,pj)<ϵp2l
至此,就是特征提取的全步骤,效果如下:
在高频雷达里程计部分,同样是计算点到线的距离和点到面的距离来构造一个非线性最小二乘问题,本文再用了LM优化方法。
在建图部分,本文采用和LEGO-LOAM一样的方法,构建关键帧地图减小计算的压力,并且构建位姿图进行优化。
LOAM易受环境中草和树叶的影响,本文的方法不会。
回环检测也比较准确。
经典的点云匹配方法ICP、NDT都需要一个较为准确的初值,没有IMU这是很难做到的,因此本文给出一个基于平面特征的点云匹配方法。
本文推到了一种考虑了传感器噪声模型的基于修正重整化的算法,并将其用于精确的平面拟合和协方差计算。
使用了基于体素增长的有效的平面分割算法来提取平面特征。
使用了一种新颖的基于投影图像的快速平面属性计算,并且利用单个平面的属性和平面之间的约束进行匹配。
针对数据集研究了归一化和不同变换估计方法对扫描配准精度的影响。
首先通过滤波、光滑、下采样以及其他预处理。然后经过平面分割,得到很多平面片。对平面片进行过滤,保留下适合进行匹配的平面片。最后就是加权和位姿预测。
ρ j ~ = d / n ⋅ m ~ \tilde{\rho_j}=d/n \cdot \tilde{m} ρj~=d/n⋅m~
本文有大段的理论公式推导,实在理解困难,就此作罢。