我是靠谱客的博主 听话柜子,最近开发中收集的这篇文章主要介绍SLAM--VICP(Velocity Updating Iterative Closest Point Algorithm)学习笔记参考资料:简介ICP算法VICP,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

参考资料:

《VICP: Velocity Updating Iterative Closest Point Algorithm》–Seungpyo Hong Heedong Ko Jinwook Kim
《视觉SLAM十四讲从理论到实践》–高翔

简介

追踪机器人的位姿是移动机器人领域的关键问题,ICP算法通过迭代3D空间中最近的点来求解位姿,而VICP算法在ICP算法的基础上引入了速度的更新,目的是解决运动畸变。

ICP算法

假设 X = { x i } X={x_i} X={xi}是第一帧扫描中所得到的数据点, Y = { y i } Y={y_i} Y={yi}是第二次扫描中所得到的数据点,且两帧中的数据已经进行了配对。那么优化中目标函数可以被表示为
min ⁡ R , t J = 1 2 ∑ i = 1 n ∥ ( p i − ( R p i ′ + t ) ) ∥ 2 2 min _{R, t} J=frac{1}{2} sum_{i=1}^{n}left|left( p _{i}-left( R p _{i}{ }^{prime}+ t right)right)right|_{2}^{2} R,tminJ=21i=1n(pi(Rpi+t))22
定义质心
p = 1 n ∑ i = 1 n ( p i ) , p ′ = 1 n ∑ i = 1 n ( p i ′ ) p =frac{1}{n} sum_{i=1}^{n}left( p _{i}right), quad p ^{prime}=frac{1}{n} sum_{i=1}^{n}left( p _{i}^{prime}right) p=n1i=1n(pi),p=n1i=1n(pi)
对函数进行一下变形,加一个 ( − p + R p ′ + p − R p ′ ) (-p+R p^{prime}+p-R p^{prime}) (p+Rp+pRp)这个部分
1 2 ∑ i = 1 n ∥ p i − ( R p i ′ + t ) ∥ 2 = 1 2 ∑ i = 1 n ∥ p i − R p i ′ − t − p + R p ′ + p − R p ′ ∥ 2 = 1 2 ∑ i = 1 n ∥ ( p i − p − R ( p i ′ − p ′ ) ) + ( p − R p ′ − t ) ∥ 2 = 1 2 ∑ i = 1 n ( ∥ p i − p − R ( p i ′ − p ′ ) ∥ 2 + ∥ p − R p ′ − t ∥ 2 + 2 ( p i − p − R ( p i ′ − p ′ ) ) T ( p − R p ′ − t ) ) begin{aligned} frac{1}{2} sum_{i=1}^{n}left| p _{i}-left( R p _{i}^{prime}+ t right)right|^{2}=& frac{1}{2} sum_{i=1}^{n}left| p _{i}- R p _{i}{ }^{prime}- t - p + R p ^{prime}+ p - R p ^{prime}right|^{2} \ =& frac{1}{2} sum_{i=1}^{n}left|left( p _{i}- p - R left( p _{i}^{prime}- p ^{prime}right)right)+left( p - R p ^{prime}- t right)right|^{2} \ =& frac{1}{2} sum_{i=1}^{n}left(left| p _{i}- p - R left( p _{i}^{prime}- p ^{prime}right)right|^{2}+left| p - R p ^{prime}- t right|^{2}+right. left.2left( p _{i}- p - R left( p _{i}^{prime}- p ^{prime}right)right)^{T}left( p - R p ^{prime}- t right)right) end{aligned} 21i=1npi(Rpi+t)2===21i=1npiRpitp+Rp+pRp221i=1n(pipR(pip))+(pRpt)221i=1n(pipR(pip)2+pRpt2+2(pipR(pip))T(pRpt))
这样凑得关键目的是 ( p i − p − R ( p i ′ − p ′ ) ) left( p _{i}- p - R left( p _{i}{ }^{prime}- p ^{prime}right)right) (pipR(pip))在求和后是等于0的,如下
∑ i = 1 n 2 ( p i − p − R ( p i ′ − p ′ ) ) T ( p − R p ′ − t ) ) = 2 ( ∑ i = 1 n p i − n p ⏟ = 0 − R ( ∑ i = 1 n p i − n p ) ⏟ = 0 ) T ( p − R p ′ − t ) = 0 begin{aligned} & sum_{i=1}^{n} 2left(p_{i}-p-Rleft(p_{i}^{prime}-p^{prime} )right)^Tleft(p-R p^{prime}-tright)right) \ =&2(underbrace{sum_{i=1}^{n} p_{i}-n p}_{=0}-Runderbrace{left(sum_{i=1}^{n} p_{i}-n pright)}_{=0})^Tleft(p-R p^{prime}-tright)\ =& 0 end{aligned} ==i=1n2(pipR(pip))T(pRpt))2(=0 i=1npinpR=0 (i=1npinp))T(pRpt)0
所以,此时优化问题可以变为
min ⁡ R , t J = 1 2 ∑ i = 1 n ∥ p i − p − R ( p i ′ − p ′ ) ∥ 2 + ∥ p − R p ′ − t ∥ 2 min _{R, t} J=frac{1}{2} sum_{i=1}^{n}left| p _{i}- p - R left( p _{i}^{prime}- p ^{prime}right)right|^{2}+left| p - R p ^{prime}- t right|^{2} R,tminJ=21i=1npipR(pip)2+pRpt2
观察函数可以发现,两个式子中,前一个式子含有优化变量R,后一个式子中含有R,t,所以我们可以先优化前一个式子,得到R,再令 t = p − R p ′ t=p-Rp^{prime} t=pRp,使得后一个式子为最小值0。
即,此时优化问题变为
min ⁡ R , t J = 1 2 ∑ i = 1 n ∥ p i − p − R ( p i ′ − p ′ ) ∥ 2 min _{R, t} J=frac{1}{2} sum_{i=1}^{n}left| p _{i}- p - R left( p _{i}^{prime}- p ^{prime}right)right|^{2} R,tminJ=21i=1npipR(pip)2
为了使描述简单,定义去质心坐标, q i = p i − p , q i ′ = p i ′ − p ′ q _{i}= p _{i}- p , quad q _{i}^{prime}= p _{i}^{prime}- p ^{prime} qi=pip,qi=pip,将上式子展开,有
1 2 ∑ i = 1 n ∥ q i − R q i ′ ∥ 2 = 1 2 ∑ i = 1 n q i T q i + q i ′ T R T R q i ′ − 2 q i T R q i ′ frac{1}{2} sum_{i=1}^{n}left| q _{i}- R q _{i}^{prime}right|^{2}=frac{1}{2} sum_{i=1}^{n} q _{i}^{T} q _{i}+ q _{i}^{prime T} R ^{T} R q _{i}^{prime}-2 q _{i}^{T} R q _{i}^{prime} 21i=1nqiRqi2=21i=1nqiTqi+qiTRTRqi2qiTRqi
第一项和优化变量无关,利用旋转矩阵的正交性, R T R = I R^TR=I RTR=I,所以第二项也和优化变量无关,所以,优化问题可以转变为
∑ i = 1 n − q i T R q i ′ = ∑ i = 1 n − tr ⁡ ( R q i ′ q i T ) = − tr ⁡ ( R ∑ i = 1 n q i ′ q i T ) sum_{i=1}^{n}- q _{i}^{T} R q _{i}^{prime}=sum_{i=1}^{n}-operatorname{tr}left( R q _{i}^{prime} q _{i}^{T}right)=-operatorname{tr}left( R sum_{i=1}^{n} q _{i}^{prime} q _{i}^{T}right) i=1nqiTRqi=i=1ntr(RqiqiT)=tr(Ri=1nqiqiT)
这里用到的小技巧是一个行向量与一个列向量的乘积等于行向量与列向量乘积的迹。
后续证明较复杂,这里给出结论,定义
W = ∑ i = 1 n q i q i ′ T W =sum_{i=1}^{n} q _{i} q _{i}^{prime T} W=i=1nqiqiT
现在的问题即为
m i n ( − t r ( R W ) ) = m a x   t r ( R W ) min(-tr(RW))=max tr(RW) min(tr(RW))=max tr(RW)
先给出一个定理: 假设矩阵A为正定对称矩阵,则对于任意的正交矩阵B,都有: t r ( A ) ≥ t r ( B A ) tr(A) ge tr(BA) tr(A)tr(BA)
对W做SVD分解以后有
W = U Λ V T X = V U T  —–正交矩阵  X W = V U T U Λ V T = V Λ V T  ——正定对称  begin{aligned} &W=U Lambda V^{T} quad X=V U^{T} text { -----正交矩阵 }\ &X W=V U^{T} U Lambda V^{T}=V Lambda V^{T}text { ------正定对称 } end{aligned} W=UΛVTX=VUT —–正交矩阵 XW=VUTUΛVT=VΛVT ——正定对称 
利用上面的定理: t r ( X W ) ≥ t r ( B X W ) tr(XW) ge tr(BXW) tr(XW)tr(BXW)
tips :这里的关键在于B是任意的正交矩阵,X也是正交矩阵,所以BX可以是任意正交矩阵。可以从刚体变换的角度理解,任意一次旋转变换都可以拆分为一个固定的旋转变换X和一个特定的旋转变换B。

所以,优化的结果为
R = U V T R=UV^T R=UVT

ICP算法伪代码

在这里插入图片描述

VICP

问题提出

由于激光雷达在测距的过程中采取旋转扫描的方式获取距离,所以测量到的每一个点并不是同时采集到的,如果在测量的过程中激光雷达(机器人)发生了移动的话,所测到的数据就会发生扫描失真。如下图所示,一个逆时针旋转的激光雷达在测距时发生了向前运动,那么偏左侧的数据将会测量到更短的距离,从而导致测量失真。
在这里插入图片描述

推导过程

将问题形式化,用 X i X^i Xi表示 t i t_i ti 时刻采集到的的数据,同样的 X i − 1 X^{i-1} Xi1表示 t i − 1 t_{i-1} ti1时刻采集到的数据,两个数据之间的时间间隔为 Δ t Delta t Δt,每一次扫描 X i X^i Xi都有自己的变换矩阵 T i T_i Ti
X i X^i Xi这次扫描的坐标系相对于 X i − 1 X^{i-1} Xi1的坐标系的位姿变换矩阵可以表示为 T i − 1 − 1 T i T^{-1}_{i-1}T_{i} Ti11Ti,所以可以得到下面这样一个各次扫描之间刚体变换的递推式
x k i − 1 = T i − 1 − 1 T i x k i , k = 1 , ⋯   , n x_{k}^{i-1}=T_{i-1}^{-1} T_{i} x_{k}^{i} quad, k=1, cdots, n xki1=Ti11Tixki,k=1,,n
这里有点没看懂,我一直觉得是这样的 x k i = T i − 1 − 1 T i x k i − 1 , k = 1 , ⋯   , n x_{k}^{i}=T_{i-1}^{-1} T_{i} x_{k}^{i-1} quad, k=1, cdots, n xki=Ti11Tixki1,k=1,,n

两次扫描过程中速度可以用下面这个式子计算:
V i = T i − 1 T ˙ i ≈ 1 Δ t log ⁡ T i − 1 − 1 T i V_{i}=T_{i}^{-1} dot{T}_{i} approx frac{1}{Delta t} log T_{i-1}^{-1} T_{i} Vi=Ti1T˙iΔt1logTi11Ti
这个式子用到了李群和李代数之间的转换关系,是时候祭出14讲中的这张图了。对其次矩阵T取对数以后会得到 [ ρ ϕ ] left[begin{array}{l}rho \ phiend{array}right] [ρϕ],也就是沿三个轴的平移量和旋转量,除以时间就得到了沿三个轴的速度和角速度的近似。
在这里插入图片描述
有了各帧数据之间的速度以后,我们开始处理同样一帧数据之间各个点由于激光雷达运动而产生的畸变。
下图显示了激光雷达的简化模型,假设在一帧激光雷达的数据中有n个点,每两个点之间的时间差定义为 Δ t s = Δ t / n Delta t_s=Delta t/n Δts=Δt/n,那么第 j j j个点 ( j = 0 , 1 , 2... , n − 1 ) (j=0,1,2...,n-1) (j=0,1,2...,n1)的位姿为
T ( t i + j Δ t s ) = T i e j Δ t s V i T(t_i+jDelta t_s)=T_ie^{jDelta t_sV_i} T(ti+jΔts)=TiejΔtsVi
这里实际上是假设在在激光雷达在打每一个点的过程中是匀速运动的,这个速度用两帧数据之间的速度, j Δ t s V i jDelta t_s V_i jΔtsVi就是打第 j j j个点时距离第一个点激光雷达所移动的距离和角度,然后用一个指数映射将齐转换为位姿变换矩阵。之所以将齐乘在 T i T_i Ti右侧是因为这个变换是相对于连体坐标系(第一个点的位姿)的变换,运用口诀:右乘连体左乘基。

在这里插入图片描述

采用这种方法对数据进行修正,每个点的修正后坐标为
x ˉ ⋆ = { e j Δ V i P j ∣ j = 0 , . . . , n − 1 } bar x^{star}={e^{jDelta Vi}P_j |j=0,...,n-1} xˉ={ejΔViPjj=0,...,n1}
就是每个点的坐标在匀速运动的假设下每个点补偿一个自己时间段内的刚体变换。

Tips

文章中的V都是广义v,实际上是由沿三个轴的速度和沿三个轴的角速度所组成的6维向量,也就是 se ⁡ ( 3 ) operatorname{se}(3) se(3)的导数。

这里的 j j j是代表第 j j j个点,不是虚数单位,第一次看的时候自动脑补了欧拉公式 e j θ e^{jtheta} ejθ,看半天没看懂。

向前修正与向后修正

上面的式子是基于向前修正,就是把后续测量到的点做一个补偿修正,另外一个方法是做一个后向修正,就是把先采集到的数据做一个预先补偿,好处是可以减少延时?(没看懂怎样减少)。

在这里插入图片描述

向后修正的补偿公式为
X ˉ i = { e ( n − j ) Δ t s ( − V i ) x j ∣ j = 0 , … , n } bar{X}^{i}=left{e^{(n-j) Delta t_{s}left(-V_{i}right)} x_{j} mid j=0, ldots, nright} Xˉi={e(nj)Δts(Vi)xjj=0,,n}

VICP算法伪代码

在这里插入图片描述

Tips

两帧数据之间的位姿变换矩阵调用ICP算法计算,每一帧数据的补偿中用到的速度实际是调用上帧和上上帧数据计算得到的。

用for循环迭代计算位姿变换矩阵,可以减少计算量。

最后

以上就是听话柜子为你收集整理的SLAM--VICP(Velocity Updating Iterative Closest Point Algorithm)学习笔记参考资料:简介ICP算法VICP的全部内容,希望文章能够帮你解决SLAM--VICP(Velocity Updating Iterative Closest Point Algorithm)学习笔记参考资料:简介ICP算法VICP所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部