读ALOAM FLOAM源码笔记

待填坑
ALOAM源代码

FLOAM源代码

robinvista 的LOAM原理详解参考

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=T01TiPi
可以通过雷达从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点考虑

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 papb的距离做残差,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=papb(p~ipa)×(p~ipb)=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ϵ=papb(p~ipb)×(p~ipb)=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} Jdϵfϵp~idϵTp~iJ=Tfϵ=dϵfϵp~idϵTp~iJ=ξfϵ=dϵfϵp~idϵξp~i(T=exp(ξ))=dϵdϵTdϵ=2dϵT=papb1p~i(p~ipa)×(p~ipb)=papb(pbpa)=[R,t]3×4p~i=[(Rpi+t),I3×3]3×6=2dϵTpapb(pbpa)[(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~ipj)(plpj)×(pmpj)(plpj)×(pmpj)
    为方便计算和理解,改变标记,令面特征残差为 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=dH2=dHTdH=(p~ipj)(plpj)×(pmpj)(plpj)×(pmpj)=(p~ipj)T(plpj)×(pmpj)(plpj)(pmpj)=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} JdHfHp~idHTp~iJ=TfH=dHfHp~idHTp~i=dHdHTdH=2dHT=[(plpj)×(pmpj)(plpj)(pmpj)]T=[R,t]3×4p~i=[(Rpi+t),I3×3]3×6=2dHT[(plpj)×(pmpj)(plpj)(pmpj)]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+θ1cosθ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+(1cosθ)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+θ1cosθa=I+θθsinθaa+θ1cosθa=I+θ3θsinθϕϕ+θ21cosθϕ=Jρ
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值