待填坑
ALOAM源代码
1.雷达点云畸变补偿
对每个激光点坐标做补偿,补偿量为射出本激光点时,激光原点即雷达坐标相对该帧起始时刻的变化。
若起始时刻,雷达位姿为
T
0
=
[
R
0
t
0
0
1
]
T_0 = \begin{bmatrix}R_0 & t_0 \\ 0&1\end{bmatrix}
T0=[R00t01]
第i个激光点时,雷达位姿为
T
i
=
[
R
i
t
i
0
1
]
T_i = \begin{bmatrix}R_i & t_i \\ 0&1\end{bmatrix}
Ti=[Ri0ti1]
第
i
i
i个激光点的坐标为
P
i
=
[
p
i
x
,
p
i
y
,
p
i
z
]
T
P_i = \begin{bmatrix}p_{ix},p_{iy},p_{iz}\end{bmatrix}^T
Pi=[pix,piy,piz]T
第
i
i
i个激光点补偿畸变后的坐标应该为
P
i
′
=
T
0
−
1
T
i
P
i
P_i^\prime = T_0^{-1}T_iP_i
Pi′=T0−1TiPi
可以通过雷达从0到
i
i
i时刻的平均角速度和速度计算两时刻的相对旋转和平移:
R
i
=
ω
d
t
i
m
e
t
i
=
V
d
t
i
m
e
\begin{aligned} R_i &= \omega d_{time} \\ t_i&=Vd_{time} \end{aligned}
Riti=ωdtime=Vdtime
其中
ω
,
V
\omega,V
ω,V可从传感器得到,
d
t
i
m
e
d_{time}
dtime 可从下式得到
d
t
i
m
e
=
当
前
点
角
度
−
该
帧
点
云
起
点
角
度
该
帧
点
云
终
点
角
度
−
该
帧
点
云
起
点
角
度
∗
周
期
d_{time} = \frac{当前点角度 - 该帧点云起点角度}{该帧点云终点角度 - 该帧点云起点角度} * 周期
dtime=该帧点云终点角度−该帧点云起点角度当前点角度−该帧点云起点角度∗周期
2. 每帧点云找特征点
逻辑
- 按照所在线束scanId划分点云,并计算每个点相对起点的 d t i m e d_{time} dtime, i n t e n s i t y = s c a n I d + d t i m e intensity = scanId + d_{time} intensity=scanId+dtime
- 为每个点计算特征值
- 循环线束(为使特征点分散,不太过密集,在每条线束上取固定数目的sharp,less shap,flat点)
- 把每条线束按照数目分为6个区间(点云按照距起始点角度排列,相当于0-360度划分6个区间,在每个区间内取固定数目的特征点)
- 该区域按照曲率排序
- 取曲率大的固定数目点做sharp和lessSharp点,当确定取点时,改点前5个和后5个曲率较小的点不做flat点考虑
- 取曲率小的固定数目点做flat,当确定取点时,该点前5个点和后5个曲率较小的点也不做flat点考虑
- 把每条线束按照数目分为6个区间(点云按照距起始点角度排列,相当于0-360度划分6个区间,在每个区间内取固定数目的特征点)
3.前后帧点线与点面对应
逻辑
点线残差:
- 循环k+1帧sharp点
p
i
p_i
pi
- 预测k+1帧相对k帧的位姿为k帧相对k-1帧的位姿,将k+1帧上点按照预测位姿转换到k帧坐标系,为 p ~ i \tilde{p}_i p~i点
- 在k帧lesssharp中找到距 p ~ i \tilde{p}_i p~i最近的点 p a p_a pa,并得到 p a p_a pa所在的线束scanId
- 按照scanId增加的方向循环k帧中lessSharp点
- 点的线束与scanId相同,跳过
- 点的线束 - scanId > 限制范围,终止寻找
- 找距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点 做 p b p_b pb
- 按照scanId减少的方向循环k帧中lessSharp点
- 点的线束与scanId相同,跳过
- scanId -点的线束 > 限制范围,终止寻找
- 找距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点做 p b p_b pb
- 将点 p i p_i pi到线 p a − p b p_a-p_b pa−pb的距离做残差,ceres做优化
点面残差:
- 循环k+1帧flat点
p
i
p_i
pi
- 预测k+1帧相对k帧的位姿为k帧相对k-1帧的位姿,将k+1帧上点按照预测位姿转换到k帧坐标系,为 p ~ i \tilde{p}_i p~i点
- 在k帧lessflat中找到距 p ~ i \tilde{p}_i p~i最近的点 p a p_a pa,并得到 p a p_a pa所在的线束scanId
- 按照scanId增加的方向循环k帧中lessflat点
- 点的线束 - scanId > 限制范围,终止寻找
- 找同线束上,距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点做 p b p_b pb
- 找非同线束上,距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点做 p c p_c pc
- 按照scanId减少的方向循环k帧中lessflat点
- scanId -点的线束 > 限制范围,终止寻找
- 找同线束上,距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点做 p b p_b pb
- 找非同线束上,距 p ~ i \tilde{p}_i p~i距离在限制范围内最小的点做 p c p_c pc
- 将点 p i p_i pi到面 p a , p b , p c p_a,p_b,p_c pa,pb,pc的距离做残差,ceres做优化
4.点线残差、点面残差求Jacobian
- 点线残差
d ϵ = ∣ ( p ~ i − p a ) × ( p ~ i − p b ) ∣ ∣ p a − p b ∣ p ~ i = T p i = R p i + t \begin{aligned} d_\epsilon &= \frac{|(\tilde{p}_i - p_a) \times (\tilde{p}_i - p_b)|}{|p_a - p_b|} \\ \tilde{p}_i &= Tp_i = Rp_i + t \end{aligned} dϵp~i=∣pa−pb∣∣(p~i−pa)×(p~i−pb)∣=Tpi=Rpi+t
为方便计算和理解,改变标记,令线特征残差为
f
ϵ
f_\epsilon
fϵ,点线距离的平方
f
ϵ
=
∣
d
ϵ
∣
2
=
d
ϵ
T
d
ϵ
d
ϵ
=
(
p
~
i
−
p
b
)
×
(
p
~
i
−
p
b
)
∣
p
a
−
p
b
∣
p
~
i
=
T
p
i
=
R
p
i
+
t
\begin{aligned} f_\epsilon &= |d_\epsilon|^2 = d_\epsilon^Td_\epsilon\\ d_\epsilon &= \frac{(\tilde{p}_i - p_b) \times (\tilde{p}_i - p_b)}{|p_a - p_b|} \\ \tilde{p}_i &= Tp_i = Rp_i + t \end{aligned}
fϵdϵp~i=∣dϵ∣2=dϵTdϵ=∣pa−pb∣(p~i−pb)×(p~i−pb)=Tpi=Rpi+t
雅克比由链式法则求导
J
=
∂
f
ϵ
∂
T
=
∂
f
ϵ
∂
d
ϵ
∂
d
ϵ
∂
p
~
i
∂
p
~
i
∂
T
或
J
=
∂
f
ϵ
∂
ξ
=
∂
f
ϵ
∂
d
ϵ
∂
d
ϵ
∂
p
~
i
∂
p
~
i
∂
ξ
(
T
=
e
x
p
(
ξ
∧
)
)
∂
f
ϵ
∂
d
ϵ
=
∂
d
ϵ
T
d
ϵ
∂
d
ϵ
=
2
d
ϵ
T
∂
d
ϵ
∂
p
~
i
=
1
∣
p
a
−
p
b
∣
∂
(
p
~
i
−
p
a
)
×
(
p
~
i
−
p
b
)
∂
p
~
i
=
(
p
b
−
p
a
)
∧
∣
p
a
−
p
b
∣
∂
p
~
i
∂
T
=
∂
p
~
i
∂
[
R
,
t
]
3
×
4
=
[
−
(
R
p
i
+
t
)
∧
,
I
3
×
3
]
3
×
6
J
=
2
d
ϵ
T
⋅
(
p
b
−
p
a
)
∧
∣
p
a
−
p
b
∣
⋅
[
−
(
R
p
i
+
t
)
∧
,
I
3
×
3
]
3
×
6
\begin{aligned} J &= \frac{\partial f_\epsilon}{\partial T} = \frac{\partial f_\epsilon}{\partial d_\epsilon}\frac{\partial d_\epsilon}{\partial \tilde{p}_i}\frac{\partial \tilde{p}_i}{\partial T} \quad或\quad J = \frac{\partial f_\epsilon}{\partial \xi} = \frac{\partial f_\epsilon}{\partial d_\epsilon}\frac{\partial d_\epsilon}{\partial \tilde{p}_i}\frac{\partial \tilde{p}_i}{\partial \xi} (T=exp(\xi^\wedge)) \\ \frac{\partial f_\epsilon}{\partial d_\epsilon} &=\frac{\partial d_\epsilon^Td_\epsilon}{\partial d_\epsilon} = 2d_\epsilon^T \\ \frac{\partial d_\epsilon}{\partial \tilde{p}_i}&=\frac{1}{|p_a - p_b|}\frac{\partial (\tilde{p}_i - p_a) \times (\tilde{p}_i - p_b)}{\partial \tilde{p}_i} = \frac{(p_b-p_a)^\wedge}{|p_a - p_b|} \\ \frac{\partial \tilde{p}_i}{\partial T} &= \frac{\partial \tilde{p}_i}{\partial [R,t]_{3\times 4}} =[-(Rp_i + t)^\wedge,I_{3\times 3}]_{3\times 6} \\ J &= 2d_\epsilon^T \cdot \frac{(p_b-p_a)^\wedge}{|p_a - p_b|} \cdot [-(Rp_i + t)^\wedge,I_{3\times 3}]_{3\times 6} \end{aligned}
J∂dϵ∂fϵ∂p~i∂dϵ∂T∂p~iJ=∂T∂fϵ=∂dϵ∂fϵ∂p~i∂dϵ∂T∂p~i或J=∂ξ∂fϵ=∂dϵ∂fϵ∂p~i∂dϵ∂ξ∂p~i(T=exp(ξ∧))=∂dϵ∂dϵTdϵ=2dϵT=∣pa−pb∣1∂p~i∂(p~i−pa)×(p~i−pb)=∣pa−pb∣(pb−pa)∧=∂[R,t]3×4∂p~i=[−(Rpi+t)∧,I3×3]3×6=2dϵT⋅∣pa−pb∣(pb−pa)∧⋅[−(Rpi+t)∧,I3×3]3×6
- 点面残差
d H = ∣ ( p ~ i − p j ) ⋅ ( p l − p j ) × ( p m − p j ) ∣ ( p l − p j ) × ( p m − p j ) ∣ ∣ d_H = \bigg|(\tilde{p}_i - p_j)\cdot \frac{(p_l - p_j) \times (p_m - p_j)}{|(p_l - p_j) \times (p_m - p_j)|}\bigg| dH=∣∣∣∣(p~i−pj)⋅∣(pl−pj)×(pm−pj)∣(pl−pj)×(pm−pj)∣∣∣∣
为方便计算和理解,改变标记,令面特征残差为 f H f_H fH,点面距离的平方
f H = ∣ d H ∣ 2 = d H T d H d H = ( p ~ i − p j ) ⋅ ( p l − p j ) × ( p m − p j ) ∣ ( p l − p j ) × ( p m − p j ) ∣ = ( p ~ i − p j ) T ( p l − p j ) ∧ ( p m − p j ) ∣ ( p l − p j ) × ( p m − p j ) ∣ p ~ i = T p i = R p i + t \begin{aligned} f_H &= |d_H|^2 = d_H^Td_H\\ d_H&=(\tilde{p}_i - p_j)\cdot \frac{(p_l - p_j) \times (p_m - p_j)}{|(p_l - p_j) \times (p_m - p_j)|} \\ &=(\tilde{p}_i - p_j)^T \frac{(p_l - p_j) ^\wedge (p_m - p_j)}{|(p_l - p_j) \times (p_m - p_j)|}\\ \tilde{p}_i &= Tp_i = Rp_i + t \end{aligned} fHdHp~i=∣dH∣2=dHTdH=(p~i−pj)⋅∣(pl−pj)×(pm−pj)∣(pl−pj)×(pm−pj)=(p~i−pj)T∣(pl−pj)×(pm−pj)∣(pl−pj)∧(pm−pj)=Tpi=Rpi+t
雅克比由链式法则求导
J = ∂ f H ∂ T = ∂ f H ∂ d H ∂ d H ∂ p ~ i ∂ p ~ i ∂ T ∂ f H ∂ d H = ∂ d H T d H ∂ d H = 2 d H T ∂ d H ∂ p ~ i = [ ( p l − p j ) ∧ ( p m − p j ) ∣ ( p l − p j ) × ( p m − p j ) ∣ ] T ∂ p ~ i ∂ T = ∂ p ~ i ∂ [ R , t ] 3 × 4 = [ − ( R p i + t ) ∧ , I 3 × 3 ] 3 × 6 J = 2 d H T ⋅ [ ( p l − p j ) ∧ ( p m − p j ) ∣ ( p l − p j ) × ( p m − p j ) ∣ ] T ⋅ [ − ( R p i + t ) ∧ , I 3 × 3 ] 3 × 6 \begin{aligned} J &= \frac{\partial f_H}{\partial T} = \frac{\partial f_H}{\partial d_H}\frac{\partial d_H}{\partial \tilde{p}_i}\frac{\partial \tilde{p}_i}{\partial T} \\ \frac{\partial f_H}{\partial d_H} &=\frac{\partial d_H^Td_H}{\partial d_H} = 2d_H^T \\ \frac{\partial d_H}{\partial \tilde{p}_i}&=\bigg[\frac{(p_l - p_j) ^\wedge (p_m - p_j)}{|(p_l - p_j) \times (p_m - p_j)|} \bigg]^T \\ \frac{\partial \tilde{p}_i}{\partial T} &= \frac{\partial \tilde{p}_i}{\partial [R,t]_{3\times 4}} =[-(Rp_i + t)^\wedge,I_{3\times 3}]_{3\times 6} \\ J &= 2d_H^T \cdot \bigg[\frac{(p_l - p_j) ^\wedge (p_m - p_j)}{|(p_l - p_j) \times (p_m - p_j)|} \bigg]^T \cdot [-(Rp_i + t)^\wedge,I_{3\times 3}]_{3\times 6} \end{aligned} J∂dH∂fH∂p~i∂dH∂T∂p~iJ=∂T∂fH=∂dH∂fH∂p~i∂dH∂T∂p~i=∂dH∂dHTdH=2dHT=[∣(pl−pj)×(pm−pj)∣(pl−pj)∧(pm−pj)]T=∂[R,t]3×4∂p~i=[−(Rpi+t)∧,I3×3]3×6=2dHT⋅[∣(pl−pj)×(pm−pj)∣(pl−pj)∧(pm−pj)]T⋅[−(Rpi+t)∧,I3×3]3×6
因为 d H d_H dH维数是 1 × 1 1\times 1 1×1,所以标量表示的点面距离残差和矢量表示的残差无异,仅相差一个 2 d H 2d_H 2dH倍数。
5.根据李代数直接求出四元数和平移向量
- se3
S E ( 3 ) SE(3) SE(3) 元素 T = [ R t 0 1 ] T = \begin{bmatrix}R & t \\ 0 & 1 \end{bmatrix} T=[R0t1];
s e ( 3 ) se(3) se(3) 元素 ξ = [ ϕ , ρ ] 6 × 1 T \xi = [\phi,\rho]^T_{6 \times 1} ξ=[ϕ,ρ]6×1T,
e x p ( ξ ∧ ) = [ R J ρ 0 1 ] = [ R t 0 1 ] J = sin θ θ I + ( 1 − sin θ θ ) a a T + 1 − cos θ θ a ∧ \begin{aligned} exp(\xi^\wedge) &= \begin{bmatrix}R & J\rho \\0 & 1\end{bmatrix} = \begin{bmatrix}R & t \\ 0 & 1 \end{bmatrix} \\ J &=\frac{\sin \theta}{\theta} I + (1-\frac{\sin \theta}{\theta})aa^T + \frac{1-\cos \theta}{\theta}a^\wedge \end{aligned} exp(ξ∧)J=[R0Jρ1]=[R0t1]=θsinθI+(1−θsinθ)aaT+θ1−cosθa∧ - so3
S O ( 3 ) SO(3) SO(3)元素R;
s o ( 3 ) so(3) so(3)元素 ϕ , ϕ ∧ = [ 0 − ϕ 3 ϕ 2 ϕ 3 0 − ϕ 1 − ϕ 2 ϕ 1 0 ] \phi,\phi^\wedge = \begin{bmatrix}0&-\phi_3&\phi_2\\ \phi3&0&-\phi_1 \\ -\phi_2 &\phi_1 &0\end{bmatrix} ϕ,ϕ∧=⎣⎡0ϕ3−ϕ2−ϕ30ϕ1ϕ2−ϕ10⎦⎤
exp ( ϕ ∧ ) = exp ( θ a ∧ ) = cos θ I + ( 1 − cos θ ) a a T + sin θ a ∧ \exp(\phi^\wedge) = \exp(\theta a^\wedge) = \cos\theta I + (1-\cos\theta)aa^T + \sin\theta a^\wedge exp(ϕ∧)=exp(θa∧)=cosθI+(1−cosθ)aaT+sinθa∧
并且 ϕ = θ a \phi = \theta a ϕ=θa是 R R R的旋转向量, ∣ ϕ ∣ |\phi| ∣ϕ∣是 R R R的旋转角 θ \theta θ - 求解
有李代数 ξ 6 × 1 \xi_{6\times1} ξ6×1时,取 ϕ = ξ [ 0 : 3 ] , ρ = ξ [ 3 : 6 ] \phi = \xi[0:3],\rho=\xi[3:6] ϕ=ξ[0:3],ρ=ξ[3:6]- 计算旋转角
θ = ∣ ϕ ∣ = ϕ . n o r m ( ) \theta = |\phi|=\phi.norm() θ=∣ϕ∣=ϕ.norm() - 由旋转角计算四元数q
{ θ = 2 a r c cos q 0 a T = [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / sin θ 2 \begin{cases}\theta = 2arc\cos q_0\\a^T = [n_x,n_y,n_z]^T = [q_1,q_2,q_3]^T/\sin\frac{\theta}{2}\end{cases} {θ=2arccosq0aT=[nx,ny,nz]T=[q1,q2,q3]T/sin2θ
得到
{ q 0 = cos θ 2 [ q 1 , q 2 , q 3 ] T = ϕ T θ sin θ 2 \begin{cases}q_0 = \cos\frac{\theta}{2}\\\begin{bmatrix}q_1,q_2,q_3\end{bmatrix}^T =\frac{\phi^T}{\theta}\sin\frac{\theta}{2}\end{cases} {q0=cos2θ[q1,q2,q3]T=θϕTsin2θ
当 θ \theta θ不为0,直接计算q,当 θ \theta θ十分小,泰勒展开得
sin θ θ = 1 θ [ θ 2 − 1 3 ! θ 3 2 3 + 1 5 ! θ 5 2 5 ] \frac{\sin\theta}{\theta} = \frac{1}{\theta}[\frac{\theta}{2} - \frac{1}{3!}\frac{\theta^3}{2^3} + \frac{1}{5!}\frac{\theta^5}{2^5}] θsinθ=θ1[2θ−3!123θ3+5!125θ5]近似求解 - 计算平移量t
J = sin θ θ I + ( 1 − sin θ θ ) a a T + 1 − cos θ θ a ∧ = I + θ − sin θ θ a ∧ a ∧ + 1 − cos θ θ a ∧ = I + θ − sin θ θ 3 ϕ ∧ ϕ ∧ + 1 − cos θ θ 2 ϕ ∧ t = J ρ \begin{aligned}J &= \frac{\sin \theta}{\theta} I + (1-\frac{\sin \theta}{\theta})aa^T + \frac{1-\cos \theta}{\theta}a^\wedge \\ &= I + \frac{\theta - \sin \theta}{\theta}a^\wedge a^\wedge + \frac{1-\cos \theta}{\theta}a^\wedge \\ &=I + \frac{\theta - \sin \theta}{\theta^3}\phi^\wedge \phi^\wedge + \frac{1-\cos \theta}{\theta^2}\phi^\wedge \\ t&=J\rho \end{aligned} Jt=θsinθI+(1−θsinθ)aaT+θ1−cosθa∧=I+θθ−sinθa∧a∧+θ1−cosθa∧=I+θ3θ−sinθϕ∧ϕ∧+θ21−cosθϕ∧=Jρ
- 计算旋转角