李群李代数及BA优化的一点理解

概要

咸鱼了好久,为了个1024徽章还是上传点什么吧…
SLAM知识点很多,李群李代数和BA优化是其中比较重要的点. 本文主要是将<<视觉SLAM14讲>>中的一些相关内容按自己的思路整理了一下.

李群李代数

从实用角度讲,李群李代数主要是讲旋转矩阵或变换矩阵与向量之间的映射关系,只要理解了下面两张图以及扰动方程即可. 以旋转矩阵R为例,它组成了李群SO(3).而旋转矩阵由与三个坐标轴的夹角确定,所以有三个自由度,因此旋转矩阵可由一个三维向量 ϕ \phi ϕ表示,此三维向量称为旋转矩阵的旋转向量,此旋转向量组成的空间也就是李群SO(3)对应的李代数小so(3),也就是 R = exp ⁡ ( ϕ   ^   ) R=\exp(\phi\ \hat{ }\ ) R=exp(ϕ ^ ),其中 ^ \hat{} ^表示向量的反对称矩阵或称向量的叉乘矩阵,更具体映射关系如下图:
在这里插入图片描述
其中: θ \theta θ ϕ \phi ϕ的向量长度, a a a ϕ \phi ϕ的方向向量, 同样的由变换矩阵T组成的李群SE(3)与6维向量组成的李代数se(3)的映射关系如下:
在这里插入图片描述
李群李代数的出现是为了解决旋转矩阵或变换矩阵的求导问题: 以李群SE(3)为列,假设我们对一个空间点进行旋转和平移,得到了Tp.要计算变换之后的坐标相对于变换矩阵的导数,我们不严谨地记为.
∂ T p ∂ T \frac{\partial Tp}{\partial T} TTp
因为变换矩阵T对乘法封闭,对加法不封闭.即变换矩阵乘以变换矩阵还是变换矩阵,但变换矩阵加上变换矩阵不一定还是变换矩阵,所以无法用导数的定义进行求导,因此需要转成李代数(李代数由向量组成,显然对加法封闭),如下:
∂ T p ∂ T = ∂ ( e x p ( ξ   ^ p ) ) ∂ ξ \frac{\partial Tp}{\partial T}= \frac{\partial(exp(\xi\ \hat{}p))}{\partial \xi} TTp=ξ(exp(ξ ^p))
所谓扰动模型是指另一种求导方式,比如左振动模型就是在左乘一个 Δ T = exp ⁡ ( δ ξ ) \Delta T=\exp(\delta \xi) ΔT=exp(δξ)如:

∂ T p ∂ T = lim ⁡ Δ T → 0 Δ T ⋅ T p − T p Δ T = lim ⁡ δ ξ → 0 exp ⁡ ( δ ξ   ^   ) exp ⁡ ( ξ   ^   ) p − exp ⁡ ( ξ   ^   ) p δ ξ \frac{\partial Tp}{\partial T} =\lim\limits_{\Delta T \rightarrow 0}\frac{\Delta T \cdot Tp-Tp}{\Delta T}\\ =\lim\limits_{\delta \xi \rightarrow 0}\frac{\exp(\delta \xi\ \hat{}\ )\exp(\xi\ \hat{}\ )p -\exp(\xi\ \hat{}\ )p}{\delta \xi} TTp=ΔT0limΔTΔTTpTp=δξ0limδξexp(δξ ^ )exp(ξ ^ )pexp(ξ ^ )p
化简后最终可得:
∂ T p ∂ T = [ I − ( R p + t )   ^ 0 T 0 T ] \frac{\partial Tp}{\partial T} = \begin{bmatrix} I & -(Rp+t)\ \hat{ } \\ 0^T & 0^T \\ \end{bmatrix} TTp=[I0T(Rp+t) ^0T]
实际应用中,变换矩阵的求导都是利用振动方程, 例如BA求解时雅可比矩阵J的计算.

从实际应用了解Bundle Adjustment(BA)

我们直接从实际应用来了解Bundle Adjustment,首先定义一个通用观测方程为:
u = h ( ξ , p ) u=h(\xi,p) u=h(ξ,p)
其中 ξ \xi ξ为变换矩阵T对应的李代数,指代此时相机的位姿, p 为各个路标点的三维点坐标,而观测数据u则是像素坐标。以最小二乘的角度来考虑,那么可以列写关于此次观测的误差:
e = u − h ( ξ , p ) e=u-h(\xi,p) e=uh(ξ,p)
然后,把其他时刻的观测量也考虑进来:设 u i j u_{ij} uij为在位姿 ξ i \xi_i ξi 处观察路标 p j p_j pj产生的数据,那么整体的代价函数为:
1 2 ∑ i = 1 m ∑ j = 1 n ∣ ∣ e i j ∣ ∣ 2 2 = 1 2 ∑ i = 1 m ∑ j = 1 n ∣ ∣ u i j − h ( ξ i , p j ) ∣ ∣ 2 2 ( 1 ) \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}||e_{ij}||_2^2= \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}||u_{ij}-h(\xi_i,p_j)||_2^2 \qquad (1) 21i=1mj=1neij22=21i=1mj=1nuijh(ξi,pj)22(1)
对这个最小二乘进行求解,即寻找最好的相机位姿和路标点使误差最小,相当于对位姿和路标同时作了调整,也就是所谓的 BA, 上式的求解在SLAM中属于全局BA, 如果只考虑两帧的时间,这个问题就可以当成PNP问题,也就是局部BA.

BA求解思路

在上面的观测方程中,我们把自变量定义成所有待优化的变量,即令:
x = [ ξ 1 , . . . , ξ m , p 1 , . . . , p n ] T e = f ( x ) x= [\xi_1,...,\xi_m,p_1,...,p_n]^T\\ e=f(x)\\ x=[ξ1,...,ξm,p1,...,pn]Te=f(x)
则式(1)BA问题可以看成一个基本的最小二乘问题:
x = arg ⁡ min ⁡ x 1 2 ∣ ∣ f ( x ) ∣ ∣ 2 2 x=\arg\min\limits_{x}\frac{1}{2}||f(x)||_2^2 x=argxmin21f(x)22
大部分情况下, f f f较为复杂,不方便使用求导法直接求解,而是采取迭代的方法,类似于梯度下降. 这里介绍使用Gauss-Newton方法:
首先将 f ( x ) f(x) f(x)一阶泰勒展开:
f ( x + Δ x ) ≈ f ( x ) + J ( x ) Δ x f(x+\Delta x)\approx f(x)+J(x)\Delta x f(x+Δx)f(x)+J(x)Δx
注意这时 f f f x x x都是多元的,因此J(x)实际上是m*n的矩阵,也就是一个雅可比矩阵(一阶偏导数以一定方式排列成的矩阵).
当前的目标是为了寻找下降矢量 Δ x \Delta x Δx,使得 ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 ||f(x + \Delta x )||^2 f(x+Δx)2 达到最小。为了求 ∆x,我们需要解一个线性的最小二乘问题:
Δ x ∗ = arg ⁡ min ⁡ Δ x ∣ ∣ f ( x ) + J ( x ) Δ x ) ∣ ∣ 2 2 \Delta x^*=\arg\min\limits_{\Delta x}||f(x) + J(x)\Delta x)||_2^2 Δx=argΔxminf(x)+J(x)Δx)22
将上述目标函数 ∣ ∣ f ( x ) + J ( x ) Δ x ) ∣ ∣ 2 ||f(x) + J(x)\Delta x)||^2 f(x)+J(x)Δx)2 Δ x \Delta x Δx求导,并令导数为零,省略计算过程 ,可得如下方程组:
J ( x ) T J ( x ) Δ x = − J ( x ) T f ( x ) J(x)^TJ(x)\Delta x = -J(x)^Tf(x) J(x)TJ(x)Δx=J(x)Tf(x)
我们将此方程称为增量方程,通过它可以直接求解 Δ x \Delta x Δx,因此Gauss-Newton 的算法步骤可以写成:

  1. 给定初始值 x 0 x_0 x0

  2. 对于第 k 次迭代,求出当前的雅可比矩阵 J ( x k ) J (x_k) J(xk)和误差 f ( x k ) f (x_k ) f(xk)

  3. 求解增量方程: J ( x k ) T J ( x k ) Δ x k = − J ( x k ) T f ( x k ) J(x_k)^TJ(x_k)\Delta x_k = -J(x_k)^Tf(x_k) J(xk)TJ(xk)Δxk=J(xk)Tf(xk).

  4. Δ x k \Delta x_k Δxk足够小,则停止。否则,令 x k + 1 = x k + Δ x k x_{k+1} = x_k + \Delta x_k xk+1=xk+Δxk,返回 2.

因此问题的关键在于求解雅可比矩阵 J ( x ) J (x) J(x), 因为x由各时刻的 ξ \xi ξ和p组成, 易得:
∣ ∣ f ( x + Δ x ) ∣ ∣ 2 2 = ∣ ∣ f ( x ) + F Δ ξ + E Δ p ∣ ∣ 2 2 ||f(x+\Delta x)||_2^2=||f(x)+F \Delta \xi +E \Delta p||_2^2 f(x+Δx)22=f(x)+FΔξ+EΔp22
其中F,E分别为f(x)关于 ξ \xi ξ和p的偏导,由分块矩阵, 雅可比矩阵J可由F和E拼凑起来, 即 J = [ F E ] J=[F E] J=[FE]. 由相机模型和振动方程可得(视觉SLAM14讲7.73):
F = − [ f x Z ′ 0 − f x X ′ Z ′ 2 − f x X ′ Y ′ Z ′ 2 f x + f x X 2 Z ′ 2 − f x Y ′ Z ′ 0 f y Z ′ − f y Y ′ Z ′ 2 − f y + f y Y 2 Z ′ 2 f y X ′ Y ′ Z ′ 2 − f y X ′ Z ′ ] F=- \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{f_xX'}{Z'^2} & -\frac{f_xX'Y'}{Z'^2} & f_x+\frac{f_xX^2}{Z'^2}& -\frac{f_xY'}{Z'}\\ 0 & \frac{f_y}{Z'} & -\frac{f_yY'}{Z'^2} & -f_y+\frac{f_yY^2}{Z'^2}& \frac{f_yX'Y'}{Z'^2}& -\frac{f_yX'}{Z'}\\ \end{bmatrix} F=[Zfx00ZfyZ2fxXZ2fyYZ2fxXYfy+Z2fyY2fx+Z2fxX2Z2fyXYZfxYZfyX]

E = − [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] R E=- \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{f_xX'}{Z'^2} \\ 0 & \frac{f_y}{Z'} & -\frac{f_yY'}{Z'^2} \\ \end{bmatrix}R E=[Zfx00ZfyZ2fxXZ2fyY]R

其中 f x , f y f_x,f_y fx,fy指的是相机内参的参数而不是偏导.R为旋转矩阵, [ X ′ , Y ′ , Z ′ ] [X',Y',Z'] [X,Y,Z]为点P在相机坐标系下的坐标,即
[ X ′ , Y ′ , Z ′ ] = T P [X',Y',Z']=TP [X,Y,Z]=TP
至此, Gauss-Newton 的算法步骤中的每一步都可计算,因此就可以计算出BA的解了. 当然实际求解时,由于雅可比矩阵J过大, 需要利用矩阵的稀疏性和边缘性来加速运算,这时就要用到g2o 和 Ceres 两个库.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值