欢迎访问我的博客首页。
F-LOAM
1. 传感器模型与特征提取
1.1 传感器模型
机械式三维激光雷达有 M 个激光发射器竖直排列,称为 M 线激光雷达。扫描时,竖直排列的激光发射器沿水平方向匀速旋转,并以固定的时间间隔发射激光脉冲,通过激光脉冲的往返时间测量距离。在一个扫描周期内,激光发射器发射 N 次脉冲,采集到
M
M
M 行
N
N
N 列个点。这样的一次扫描称为一个扫描或一帧。我们把第
k
k
k 次扫描记为
P
k
P_k
Pk,采集到的每个点记为
p
k
(
m
,
n
)
{\bf p}_k^{(m, n)}
pk(m,n),其中
m
∈
[
1
,
M
]
m \in [1, M]
m∈[1,M],
n
∈
[
1
,
N
]
n \in [1, N]
n∈[1,N]。
图 1 禾 赛 64 线 激 光 雷 达 竖 直 排 列 的 64 个 激 光 发 射 器 图\ 1\quad 禾赛\ 64\ 线激光雷达竖直排列的\ 64\ 个激光发射器 图 1禾赛 64 线激光雷达竖直排列的 64 个激光发射器
Velodyne HDL64E 激光雷达的
M
=
64
,
N
=
4500
M = 64,N = 4500
M=64,N=4500,因此它扫描一次采集的点数是
64
×
4500
=
28.8
64 \times 4500 = 28.8
64×4500=28.8 万。采集过程中,这一列激光发射器绕着竖直方向旋转,旋转一周采集到的点构成了一帧点云。
图 2 威 力 登 64 线 激 光 雷 达 参 数 表 ( 左 ) 和 采 集 到 的 点 云 ( 右 ) 图\ 2\quad 威力登\ 64\ 线激光雷达参数表(左)和采集到的点云(右) 图 2威力登 64 线激光雷达参数表(左)和采集到的点云(右)
水平分辨率是 360 ÷ N = 0.08 360 \div N = 0.08 360÷N=0.08°,竖直分辨率是 26.8 ÷ 64 ≈ 0.4 26.8 \div 64 \approx 0.4 26.8÷64≈0.4°。所以点在水平方向上较稠密,在竖直方向上较稀疏。因此我们看到的点云是竖直方向上相互平行的圆环,如图 2 的右图。
1.2 特征提取
ICP 算法使用原生点云做匹配。每次扫描采集到的点有数万个,而且噪声和动态目标会使待匹配的两帧扫描点不能完全匹配。这使得 ICP 算法效率低且健壮性差。
特征点匹配算法从传感器获取的原生点云中选择平面特征和边缘特征做匹配,噪声和不重要的点被丢弃。因此,它在实践中更健壮且更高效。
传感器采集的点在竖直方向上稀疏,在水平方向上稠密,即
M
M
M 小于
N
N
N。因此,水平方向的特征更独特(distinctive),水平方向上的特征检测更不容易出现错误。于是,对每一个点云
p
k
(
m
,
n
)
{\bf p}_k^{(m,n)}
pk(m,n),F-LOAM 沿水平方向计算局部表面(可能是平面也可能是边缘)的平滑度:
σ
k
(
m
,
n
)
=
1
∣
S
k
(
m
,
n
)
∣
∑
p
k
(
m
,
j
)
∈
S
k
(
m
,
n
)
(
∣
∣
p
k
(
m
,
j
)
−
p
k
(
m
,
n
)
∣
∣
)
,
(1)
\sigma_k^{(m,n)} = \frac{1}{| {\mathcal S}_k^{(m, n)} |} \sum_{{\bf p}_k^{(m,j)} \in {\mathcal S}_k^{(m, n)}}{} (|| {\bf p}_k^{(m,j)} - {\bf p}_k^{(m,n)} ||), \tag{1}
σk(m,n)=∣Sk(m,n)∣1pk(m,j)∈Sk(m,n)∑(∣∣pk(m,j)−pk(m,n)∣∣),(1)
其中 S k ( m , n ) {\mathcal S}_k^{(m, n)} Sk(m,n) 是 p k ( m , n ) {\bf p}_k^{(m,n)} pk(m,n) 在水平方向上的临近点, ∣ S k ( m , n ) ∣ | {\mathcal S}_k^{(m, n)} | ∣Sk(m,n)∣ 是临近点的数量。根据编号 n n n 可以很容易地获取一个点的临近点 S k ( m , n ) {\mathcal S}_k^{(m, n)} Sk(m,n),且计算量比局部搜索更小。
实验中,F-LOAM 分别沿顺时针方向和逆时针方向各选 5 个点,也就是选择 p k ( m , n ± 5 ) {\bf p}_k^{(m,n \pm 5)} pk(m,n±5) 这 10 个点作为 S k ( m , n ) {\mathcal S}_k^{(m, n)} Sk(m,n),于是 ∣ S k ( m , n ) ∣ = 10 | {\mathcal S}_k^{(m, n)} | = 10 ∣Sk(m,n)∣=10。所以,此时的局部表面是一个长方形,它的高度仅容纳 1 行点,宽度容纳 10 列点。
从公式 (1)可以看出,平滑度 σ \sigma σ 在墙之类的平面处较小,在角或者边缘处较大。因此,我们可以在一个扫描平面 P k \mathcal{P}_k Pk 中,使用较小的 σ \sigma σ 值筛选出平面特征点 S k {\mathcal S}_k Sk,使用较大的 σ \sigma σ 值筛选出边缘特征点 E k {\mathcal E}_k Ek。
2. 运动估计与畸变补偿
激光雷达在一个时间周期内扫描一次,后一列点的采集时间晚于前一列。采集时,如果激光雷达相对采集场景运动,则采集到的 N N N 列点云会有 N N N 个各不相同的位姿,这就是运动畸变。
激光雷达可以提供每个点在雷达坐标系中的坐标以及采集时间戳,通常认为时间戳相同的点来自同一个坐标系(位姿相同)。
祛畸变,或者称为畸变补偿,就是求这 M × N M \times N M×N 个点在同一个坐标系中的坐标。畸变补偿的方法有:
- 使用高频里程计。如果里程计的位姿估计频率足够高,就可以在一次扫描过程中,分多次估计传感器采集到的点的位姿。这种方法对算力有较高要求。
- 使用惯性传感器 IMU。可以之间测量旋转。这种方法需要额外的传感器。
- 匀速运动模型。
LOAM 和 LeGO-LOAM 使用 scan-to-scan 匹配算法,以迭代的方式估计两个相邻扫描间的变换直到收敛,从而修正畸变。F-LOAM 使用第三种畸变补偿算法,计算量更小,精度却与迭代法相当。该算法有以下两步:
- 第一步:使用匀速运动模型得到粗略的位姿。使用粗略的位姿祛畸变,即把一次扫描采集到的点变换到同一个坐标系。使用祛畸变的点估计精确的位姿。见 2.1 和 2.2 节。
- 第二步:使用精确的位姿再次祛畸变。见第 4 节。
2.1 匀速运动模型
现在的三维激光雷达频率都高于 10 赫兹,所以两次相临扫描间的时间间隔非常短。因此,可以假设传感器在短时间内的运动是匀速运动:角速度是常量的,速度是线性的。这个假设可以帮助我们预测传感器的运动,从而修正畸变。
假设传感器在第
k
k
k 次扫描时的位姿是
T
k
{\bf T}_k
Tk。这个位姿可以是该扫描周期内任意某个时刻的位姿,这里我们采用扫描开始时的位姿。在匀速运动的假设下,
T
k
→
k
−
1
{\bf T}_{k \rightarrow k-1}
Tk→k−1 等于
T
k
−
1
→
k
−
2
{\bf T}_{k-1 \rightarrow k-2}
Tk−1→k−2:
ξ
k
−
1
k
=
l
o
g
(
T
k
→
k
−
1
)
=
l
o
g
(
T
k
−
1
→
k
−
2
)
=
l
o
g
(
T
k
−
2
−
1
T
k
−
1
)
,
(2)
\xi_{k-1}^k = log({\bf T}_{k \rightarrow k-1}) = log({\bf T}_{k-1 \rightarrow k-2}) = log({\bf T}_{k-2}^{-1} {\bf T}_{k-1}), \tag{2}
ξk−1k=log(Tk→k−1)=log(Tk−1→k−2)=log(Tk−2−1Tk−1),(2)
其中, ξ k − 1 k ∈ s e ( 3 ) \xi_{k-1}^k \in {\frak se} (3) ξk−1k∈se(3) 是 T k → k − 1 {\bf T}_{k \rightarrow k-1} Tk→k−1 的李代数表示。函数 l o g ( ⋅ ) log(\cdot) log(⋅) 是从齐次变换矩阵到李代数的映射,使用李代数表示位姿的好处是可以进行线性运算。公式(2)第 3 个等号的推导见公式(5.2)。两次扫描间的时间间隔 δ t \delta t δt 很短,其变换可以使用线性插值计算出来:
T k ( δ t ) = T k − δ t = T k − 1 T k − δ t → k − 1 = T k − 1 e x p ( N − n N ξ k − 1 k ) , (3) {\bf T}_k(\delta t) = {\bf T}_{k-{\delta t}}= {\bf T}_{k-1} {\bf T}_{k-{\delta t} \rightarrow k-1} = {\bf T}_{k-1} exp(\frac{N - n}{N} \xi_{k-1}^k), \tag{3} Tk(δt)=Tk−δt=Tk−1Tk−δt→k−1=Tk−1exp(NN−nξk−1k),(3)
其中函数 e x p ( ξ ) exp(\xi) exp(ξ) 是李代数到李群的映射。公式(3)是什么意思呢?假设 k k k 和 k − 1 k-1 k−1 分布对应时刻 t t t 和 t − 1 t-1 t−1,则 T k ( δ t ) {\bf T}_k(\delta t) Tk(δt) 表示传感器在时刻 t − 1 + δ t t-1 + \delta t t−1+δt 的位姿, p k ( m , n ) {\bf p}_k^{(m,n)} pk(m,n) 是传感器在时刻 t − 1 + δ t t-1 + \delta t t−1+δt 采集到的点,其中 0 ≤ δ t ≤ 1 0 \leq \delta t \leq 1 0≤δt≤1。
至此,我们就分别求得一个扫描内各时刻(其实是各极短时间段内)采集到的点的位姿。
2.2 祛畸变
现在我们要把一个扫描内位姿不同的点变换到同一个坐标系中,也就是本次扫描开始时的传感器坐标系中。当前扫描 P k \mathcal{P}_k Pk 的所有点在开始扫描时的传感器坐标系中的坐标计算方法如下:
P ~ k = { T k ( δ t ) p k ( m , n ) ∣ p k ( m , n ) ∈ P k } . (4) \tilde{\mathcal{P}}_k = \{ {\bf T}_k (\delta t) {\bf p}_k^{(m, n)} \, | \, {\bf p}_k^{(m, n)} \in \mathcal{P}_k \}. \tag{4} P~k={Tk(δt)pk(m,n)∣pk(m,n)∈Pk}.(4)
其中顶部的波浪线 ~ 表示祛畸变后的、无失真的。经过公式(4)的祛畸变,我们就可以使用一个位姿 T k {\bf T}_k Tk 表示第 k k k 次扫描采集到的所有点的位姿。使用祛畸变的特征有利于我们估计出更精确的位姿。
3. 位姿估计
位姿估计算法把公式(4)得到的祛畸变后的边缘特征 E ~ k {\tilde \mathcal E}_k E~k 和平面特征 S ~ k {\tilde \mathcal S}_k S~k 与全局特征地图对齐。
全局特征地图包含一个边缘特征地图和一个平面特征地图,这两个地图是被分开更新维护的。为了降低搜索代价,边缘特征地图和平面特征地图都以三维 kd 树的方式存储。
和参考文献 19 一样,全局直线和全局平面通过边缘特征地图和平面特征地图中的临近点估计出来:
对于每个边缘特征点 p E ∈ E ~ k {\bf p}_{\mathcal E} \in {\tilde \mathcal E}_k pE∈E~k,计算它在全局边缘特征地图中的临近点的协方差矩阵。如果这些点分布在一条直线上,协方差矩阵就会包含一个很大的特征值。把最大的特征值对应的特征向量 n E g {\bf n}_{\mathcal E}^{g} nEg 看作直线的方向,把直线 p E g {\bf p}_{\mathcal E}^{g} pEg 的位置看作临近点的几何中心。这样就得到一个全局直线。
类似的,对于每个平面特征点 p S ∈ S ~ k {\bf p}_{\mathcal S} \in {\tilde \mathcal S}_k pS∈S~k,使用坐标 p S g {\bf p}_{\mathcal S}^{g} pSg 和曲面法线 n S g {\bf n}_{\mathcal S}^{g} nSg 可以计算出一个全局平面。与全局直线不同的是,全局平面的法线被看作是最小特征值对应的特征向量。
一旦获得相应的最优边缘 / 平面,我们就能从 P ~ k \tilde{\mathcal{P}}_k P~k 中找到每个特征点的全局边缘或全局平面。利用这个对应关系,最小化特征点与全局边缘 / 平面间的距离,可以估计当前帧与全局地图的最优位姿。边缘特征到全局边缘的距离是:
f E ( p E ) = p n ⋅ ( ( T k p E − p E g ) × n E g ) , (5) f_{\mathcal E}({\bf p}_{\mathcal E}) = {\bf p_n} \cdot (({\bf T}_k {\bf p}_{\mathcal E} - {\bf p}_{\mathcal E}^g) \times {\bf n}_{\mathcal E}^g), \tag{5} fE(pE)=pn⋅((TkpE−pEg)×nEg),(5)
其中 ⋅ \cdot ⋅ 是点乘, p n \bf p_n pn 是单位向量:
p n = ( T k p E − p E g ) × n E g ∣ ∣ ( T k p E − p E g ) × n E g ∣ ∣ . (6) {\bf p_n} = \frac{({\bf T}_k {\bf p}_{\mathcal E} - {\bf p}_{\mathcal E}^g) \times {\bf n}_{\mathcal E}^g} {|| ({\bf T}_k {\bf p}_{\mathcal E} - {\bf p}_{\mathcal E}^g) \times {\bf n}_{\mathcal E}^g ||}. \tag{6} pn=∣∣(TkpE−pEg)×nEg∣∣(TkpE−pEg)×nEg.(6)
平面特征到全局平面的距离是:
f S ( p S ) = ( T k p S − p S g ) ⋅ n S g . (7) f_{\mathcal S}({\bf p}_{\mathcal S}) = ({\bf T}_k {\bf p}_{\mathcal S} - {\bf p}_{\mathcal S}^g) \cdot {\bf n}_{\mathcal S}^g. \tag{7} fS(pS)=(TkpS−pSg)⋅nSg.(7)
传统的特征匹配算法只优化上面提到的几何距离,并不考虑每个特征点的局部几何分布。然后我们发现,较高局部平滑度的边缘特征和较低局部平滑度的平面特征对匹配更重要。因此提出权重函数平横匹配算法。为了降低计算复杂度,使用公式(1)定义的局部平滑度定义权重函数。假设边缘点 p E {\bf p}_{\mathcal E} pE 的局部平滑度是 σ E \sigma_{\mathcal E} σE,平面点 p S {\bf p}_{\mathcal S} pS 的局部平滑度是 σ S \sigma_{\mathcal S} σS,它们的权重定义如下:
{ W ( p E ) = e x p ( − σ E ) ∑ p ( i , j ) ∈ E ~ k e x p ( − σ k ( i , j ) ) W ( p S ) = e x p ( − σ S ) ∑ p ( i , j ) ∈ S ~ k e x p ( σ k ( i , j ) ) . (8) \left\{ \begin{matrix} W({\bf p}_{\mathcal E}) &= \frac {exp(- \sigma_{\mathcal E})} {\sum_{{\bf p}^{(i,j)} \in {\tilde \mathcal E}_k}{} exp(- \sigma_k^{(i,j)})} \\ W({\bf p}_{\mathcal S}) &= \frac {exp(- \sigma_{\mathcal S})} {\sum_{{\bf p}^{(i,j)} \in {\tilde \mathcal S}_k}{} exp(\sigma_k^{(i,j)})} \end{matrix} \right.. \tag{8} ⎩⎪⎨⎪⎧W(pE)W(pS)=∑p(i,j)∈E~kexp(−σk(i,j))exp(−σE)=∑p(i,j)∈S~kexp(σk(i,j))exp(−σS).(8)
其中 E k {\mathcal E}_k Ek 和 S k {\mathcal S}_k Sk 是第 k k k 次扫描采集到的边缘特征和平面特征。新位姿通过最小化带权重的点边距离 f E ( p E ) f_{\mathcal E}({\bf p}_{\mathcal E}) fE(pE) 与点面距离 f S ( p S ) f_{\mathcal S}({\bf p}_{\mathcal S}) fS(pS) 的和计算出来:
min T k ∑ W ( p E ) f E ( p E ) + W ( p S ) f S ( p S ) . (9) \underset {{\bf T}_k}{\operatorname {min}} \sum_{}{} W({\bf p}_{\mathcal E}) f_{\mathcal E}({\bf p}_{\mathcal E}) + W({\bf p}_{\mathcal S}) f_{\mathcal S}({\bf p}_{\mathcal S}). \tag{9} Tkmin∑W(pE)fE(pE)+W(pS)fS(pS).(9)
使用高斯牛顿法求解非线性方程,即可得到最优位姿。雅可比矩阵可以用 δ ξ ∈ s e ( 3 ) \delta \xi \in {\frak se} (3) δξ∈se(3) 的左扰动模型得出:
J p = ∂ T p ∂ δ ξ = lim δ ξ → 0 e x p ( δ ξ ) T p − T p δ ξ = [ I 3 × 3 − [ T p ] × 0 1 × 3 0 1 × 3 ] , (10) {\bf J}_p = \frac {\partial {\bf Tp}} {\partial \delta \xi} = \lim\limits_{\delta \xi \rightarrow 0} \frac {exp(\delta \xi) {\bf Tp} - {\bf Tp}} {\delta \xi} = \left[\begin{matrix} {\bf I}_{3 \times 3} & -[{\bf Tp}]_{\times} \\ {\bf 0}_{1 \times 3} & {\bf 0}_{1 \times 3} \end{matrix} \right], \tag{10} Jp=∂δξ∂Tp=δξ→0limδξexp(δξ)Tp−Tp=[I3×301×3−[Tp]×01×3],(10)
其中 [ T k p k ] × [{\bf T}_k{\bf p}_k]_{\times} [Tkpk]× 把四维齐次坐标 { x , y , z , 1 } \{x,y,z,1\} {x,y,z,1} 转换成三维坐标 { x , y , z } \{x,y,z\} {x,y,z},并计算它的斜对称矩阵。边缘残差的雅可比矩阵可以这样计算:
J E = W ( p E ) ∂ f E ∂ T p ∂ T p ∂ δ ξ = W ( p E ) p n ⋅ ( n E g × J p ) , (11) {\bf J}_{\mathcal E} = W({\bf p}_{\mathcal E}) \frac {\partial f_{\mathcal E}} {\partial {\bf Tp}} \frac {\partial {\bf Tp}} {\partial \delta \xi} = W({\bf p}_{\mathcal E}) {\bf p_n} \cdot ({\bf n}_{\mathcal E}^g \times {\bf J}_p), \tag{11} JE=W(pE)∂Tp∂fE∂δξ∂Tp=W(pE)pn⋅(nEg×Jp),(11)
类似地,
J S = W ( p S ) ∂ f S ∂ T p ∂ T p ∂ δ ξ = W ( p S ) n E g ⋅ J p . (12) {\bf J}_{\mathcal S} = W({\bf p}_{\mathcal S}) \frac {\partial f_{\mathcal S}} {\partial {\bf Tp}} \frac {\partial {\bf Tp}} {\partial \delta \xi} = W({\bf p}_{\mathcal S}) {\bf n}_{\mathcal E}^g \cdot {\bf J}_p. \tag{12} JS=W(pS)∂Tp∂fS∂δξ∂Tp=W(pS)nEg⋅Jp.(12)
根据上面的公式求解非线性优化就可以得到里程计估计结果。然后使用该结果计算新的对应关系和新的里程计。反复迭代,直到收敛,即可计算出当前位姿估计 T k ∗ {\bf T}_k^* Tk∗。
4. 地图创建与畸变补偿更新
全局地图包含一个全局边缘地图和一个全局平面地图,且基于关键帧更新。当平移大于预设阈值或旋转大于预设阈值时,就会选择每一个关键帧。相比逐帧更新,基于关键帧的地图更新计算量更小。第 2 部分提到,为了降低计算量,畸变补偿基于匀速运动模型而不是迭代运动估计。但这样的精度没有迭代运动补偿高。因此,在第而阶段,基于优化后的 T k ∗ {\bf T}_k^* Tk∗ 再次计算畸变:
Δ ξ ∗ = l o g ( T k − 1 − 1 ⋅ T k ∗ ) , (13a) \Delta \xi^* = log({\bf T}_{k - 1}^{-1} \cdot {\bf T}_k^*), \tag{13a} Δξ∗=log(Tk−1−1⋅Tk∗),(13a)
P ~ k ∗ = { e x p ( N − n N ⋅ Δ ξ ∗ ) p k ( m , n ) ∣ p k ( m , n ) ∈ P k } . (13b) \tilde{\mathcal{P}}_k^* = \{ exp(\frac{N - n}{N} \cdot \Delta \xi^*) {\bf p}_k^{(m,n)} \,|\, {\bf p}_k^{(m,n)} \in {\mathcal P}_k \}. \tag{13b} P~k∗={exp(NN−n⋅Δξ∗)pk(m,n)∣pk(m,n)∈Pk}.(13b)
重新计算的祛畸变边缘特征和平面特征分别更新到全局边缘地图和全局平面地图。然后使用三维体素栅格对地图下采样,以避免内存溢出。
5. 附录
5.1 位姿变换的传递性
假设 T {\bf T} T 是 4 阶齐次变换矩阵。从坐标系 k k k 到坐标系 k − 1 k-1 k−1 的变换可以用 T k → k − 1 {\bf T}_{k \rightarrow k-1} Tk→k−1 表示,从坐标系 k k k 到世界坐标系的变换通常简写成 T k {\bf T}_k Tk。
假设坐标系
0
0
0 是世界坐标系,一个点在
k
k
k 坐标系中的坐标是
p
k
p_k
pk,则它在世界坐标系中的坐标:
p
0
=
T
k
p
k
,
(5.1)
p_0 = {\bf T}_k p_k, \tag{5.1}
p0=Tkpk,(5.1)
其中
p
0
p_0
p0 和
p
k
p_k
pk 都是 4 维齐次坐标
(
x
,
y
,
z
,
1
)
(x, y, z, 1)
(x,y,z,1)。需要注意的是,
T
k
{\bf T}_k
Tk 在
p
k
p_k
pk 左侧而不是右侧。
T
k
→
k
−
1
{\bf T}_{k \rightarrow k-1}
Tk→k−1 可以使用
T
k
{\bf T}_k
Tk 和
T
k
−
1
{\bf T}_{k-1}
Tk−1 表示:
T
k
→
k
−
1
=
T
0
→
k
−
1
T
k
→
0
=
T
k
−
1
→
0
−
1
T
k
→
0
=
T
k
−
1
−
1
T
k
.
(5.2)
{\bf T}_{k \rightarrow k-1} = {\bf T}_{0 \rightarrow k-1} {\bf T}_{k \rightarrow 0} = {\bf T}_{k-1 \rightarrow 0}^{-1} {\bf T}_{k \rightarrow 0} = {\bf T}_{k-1}^{-1} {\bf T}_{k}. \tag{5.2}
Tk→k−1=T0→k−1Tk→0=Tk−1→0−1Tk→0=Tk−1−1Tk.(5.2)