本文已参与「新人创作礼」活动,一起开启掘金创作之路。
对于相机位姿的变换可以通过旋转矩阵或者四元数进行表示,对于旋转矩阵的定义满足:
R{∣R∣=1RRT=I
即R 为正交矩阵,且行列式为1 。 旋转矩阵的行列式为什么等于1?
除了旋转矩阵外,还需要仿射矩阵,仿射矩阵是在经过线性变换后进行平移变换。因为平移变换无法用两个矩阵相乘的方式表示,因此通过齐次坐标可以很好的解决这个问题,所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。
相机的位姿变换为一个连续且平滑的过程,连续指的是左连续等于右连续,而平滑指的是存在高阶导数。那么这些连续的位姿变换再加上乘法即构成了李群SO(3)(特殊正交群)。
在后端优化的过程中,导入李代数的原因有: 关于李群与李代数的的理解与总结
(1)旋转矩阵需要满足正交矩阵的约束,额外的约束会增加优化的困难。
(2)解决李群中不存在加法运算,无法描述求导的问题。
已知旋转矩阵的导数可以用一个反对称矩阵和旋转矩阵本身表示:
R(t)˙=ϕ(t)∧R(t)
那么根据微分方程,可以得到
R(t)IdR(t)=ϕ(t)∧dt
lnR(t)=ϕ(t)∧t+c
R(t)=eϕ(t)∧t+c
且当t=0时,R为单位阵I,因此可简化得到:R(t)=eϕ(t)∧t由此便引出了李代数与李群之间的关系。
在解决旋转矩阵求导之前,需要了解BCH(baker Campbell hausdorff)公式,描述了当两个李群的矩阵相乘时,李代数如何运算。
eϕ1∧eϕ2∧=e(ϕ1+ϕ2)∧
ln(exp(ϕ1∧)exp(ϕ2∧))=ϕ1∧+ϕ2∧+21[ϕ1∧,ϕ2∧]+121[ϕ1∧,[ϕ1∧,ϕ2∧]]−121[ϕ2∧,[ϕ1∧,ϕ2∧]]⋯
其中[,]为李括号,李括号的运算为:
[ϕ1,ϕ2]=[Φ1Φ2−Φ2Φ1]∨
BCH公式中,当向量为小量时,二次以上的项都将被忽略,所以BCH公式的近似表达式为:
ln(exp(ϕ1∧)exp(ϕ2∧))≈{Jl(ϕ2)−1ϕ1+ϕ2,当ϕ1为小量时Jr(ϕ1)−1ϕ2+ϕ1,当ϕ2为小量时
近似的BCH公式按ϕ的大小不同,可以将两式分为左乘和右乘。
左乘近似雅可比可以表示成下式:
Jr=J=θsinθI+(1−θsinθ)aaT+θ1−cosθa∧
Jr−1=2θcot2θI+(1−2θcot2θ)aaT−2θa∧
右乘近似雅可比仅需要对自变量取负号:
Jr(ϕ)=Jl(−ϕ)
参考文章:李代数求导与扰动模型
在SLAM中,我们经常会构建与位姿有关的残差函数,然后讨论该函数关于位姿的雅克比,优化当前的估计值。使用李代数解决求导问题的思路分为两种:
(1)用李代数表示姿态,然后对根据李代数加法来对李代数求导。
根据导数的定义,在李代数上做加法:
exp((ϕ+Δϕ)∧=exp((JlΔϕ)∧)exp(ϕ∧)=exp(ϕ∧)exp((JrΔϕ)∧)
用李代数表示姿态:R=exp(ϕ∧)
dRd(RP)⟹dϕd(exp(ϕ∧)p)=δϕ→ 0limδϕexp(ϕ+δϕ)∧p−exp(ϕ∧)p
=δϕ→ 0limδϕexp((Jlδϕ)∧)exp(ϕ∧)p−exp(ϕ∧)p
利用极限公式:ex=1+x =limδϕ→ 0δϕ(I+(Jlδϕ)∧)exp(ϕ∧)p−exp(ϕ∧)p =limδϕ→ 0δϕ(Jlδϕ)∧exp(ϕ∧)p 根据反对称矩阵:ATB=−BTA =limδϕ→ 0δϕ(Jlδϕ)∧exp(ϕ∧)p=limδϕ→ 0δϕ−(exp(ϕ∧)p)∧Jlδϕ=−(Rp)∧Jl
(2)对李群左乘或右乘微小扰动,然后对该扰动求导,称为左扰动和右扰动模型。
把增量扰动直接添加在李群上,然后使用李代数表示此扰动(左扰动):
dφd(RP)=limφ→ 0φexp(φ∧)exp(ϕ∧)p−exp(ϕ∧)p =limφ→ 0φ(I+φ∧)exp(ϕ∧)p−exp(ϕ∧)p =limφ→ 0φφ∧exp(ϕ∧)p=limφ→ 0φφ∧Rp=limφ→ 0φ−(Rp)∧φ=−(Rp)∧ 因此,左扰动模型比微分模型要少一个雅可比矩阵。
对于如何选择右扰动还是左扰动,参考知乎文章旋转的左扰动和右扰动。
一般旋转扰动的定义是在机体body坐标系上添加一个小的旋转 θb′b ,这样扰动的旋转角比较小,可以保证比较好的线性而且避免奇异性,即 Rb′b=[θb′b]∧。
(1)当 pose 表达在 world 坐标系时,根据旋转的叠加方式,添加的是右扰动:
Rb′w=RbwRb′b=Rbw(I+[θb′b]∧)
(2)当 pose 表达在 body 坐标系时,根据旋转的叠加方式,添加的是左扰动:
Rwb′=Rbb′Rwb=(I+[θbb′]∧)Rwb=(I−[θb′b]∧)Rwb
参考博客:VINS-MONO ProjectionFactor代码分析及公式推导
在重投影误差中,以VINS为例,重投影误差计算的是单位球面切平面上的误差,单位球面模型相对于单位平面模型可以适用的相机模型更广泛。其中确定的常量为切平面基构成的矩阵B和输入的特征点l在单位相机平面的投影(Plci,Plcj),需要优化的变量包括第i、j两帧在世界坐标系下的姿态(Rbiw,Rbjw),IMU与相机之间的外参关系(Rcb,tcb),逆深度(λl)。
那么第l特征点在第j帧下的重投影坐标Plcj′为:
Plcj′=转换到第j帧相机坐标系下RcbT{转换到第j帧IMU坐标系下RbjwT[Rbiw(转换到IMU坐标系RcbλlPlci+tcb)+tbiw转换到世界坐标系]−tcb}
Eigen::Vector3d pts_camera_i = pts_i / inv_dep_i;
Eigen::Vector3d pts_imu_i = qic * pts_camera_i + tic;
Eigen::Vector3d pts_w = Qi * pts_imu_i + Pi;
Eigen::Vector3d pts_imu_j = Qj.inverse() * (pts_w - Pj);
Eigen::Vector3d pts_camera_j = qic.inverse() * (pts_imu_j - tic);
Eigen::Map<Eigen::Vector2d> residual(residuals);
因此残差公式可以表示为:
e=B∗(∥Plcj′∥2Plcj′−∥Plcj∥2Plcj)令T为待优化的变量,r表示投影前的残差,即r=∥Plcj′∥2Plcj′−∥Plcj∥2Plcj,通过链式法则,可得:∂T∂e=∂r∂e∂∥Plcj′∥2Plcj′∂r∂T∥Plcj′∥2Plcj′其中因为∥Plcj∥2Plcj为常量,因此:∂r∂e∂∥Plcj′∥2Plcj′∂r=B 化简得到:∂T∂e=B∂T∥Plcj′∥2Plcj′
综上,残差的雅可比矩阵,等于∥Plcj′∥2Plcj′的雅可比矩阵在切平面上的投影。
那么对于该雅可比矩阵如何求,设f(x)=Plcj′,由链式法则可以得到:
dxd∥f(x)∥2f(x)=(∥f(x)∥21−∥f(x)∥23)f(x)f(x)T)f′(x)
具体求导过程省略,上式中前半部分是关于重投影坐标的已知函数,因此只需要求解得到f′(x),就可以得到残差的雅可比矩阵,接下来对Plcj′求导。
上一部分已经推导出第j帧下的重投影坐标Plcj′,将该公式展开:
Plcj′=RcbTRbjwTRbiwRcbPlciλl1+RcbTRbjwTRbiwtcb+RcbTRbjwTtbiw−RcbTRbjwTtbjw−RcbTtcbT 需要优化的变量都需要进行求导。包括(Rbiw,Rbjw),(Rcb,tcb),(λl)。
(1)第i、j两帧在世界坐标系下的姿态(Rbiw,Rbjw)
(2)IMU与相机之间的外参关系(Rcb,tcb)
(3)逆深度(λl)
以第i帧为例,需要对旋转Rbiw和平移tbiw进行求导。将除此之外的变量设为 A=RcbTRbjwT 和 x=RcbPlciλl1+tcb
即化简得到(与优化量无关的后两项舍去):
Plcj′=A(Rbjwx+tbiw)
对tbiw进行求导:
∂tbiw∂Plcj′=A=RcbTRbjwT
对Rbiw进行求导,因为 pose 表达在 world 坐标系,根据旋转的叠加方式,添加的是右扰动:
∂φ∂Plci′=φ→ 0limφA(exp(ϕi∧)exp(φ∧)x+tbiw)−A(exp(ϕi∧)x+tbiw)
=φ→ 0limφAexp(ϕi∧)[exp(φ∧)−I]x
=φ→ 0limφAexp(ϕi∧)[I+φ∧−I]x
=φ→ 0limφAexp(ϕi∧)φ∧x=φ→ 0limφ−Aexp(ϕi∧)x∧φ=φ→ 0lim−Aexp(ϕi∧)x∧
将A与x带入可得到:
∂φ∂Plci′=−RcbTRbjwTRbiw(RcbPlciλl1+tcb)∧
综上重投影坐标Plcj′对位姿的求导已经推导完成,其余求导相似的方法,略略略!
扰动模型的求导可以替代关于状态量的雅可比,扰动模型F下误差状态的求导 ,将它在dx=0处做泰勒展开:
f(x0+dx)=F(dx)=F(0)+F′(0)(dx−0)=f(x0)+∂dx∂f(x0⨁dx)dx