后端之非线性优化

后端之非线性优化

前言

在后端优化中,存在着两种优化算法,一种是利用矩阵分解求得最小二乘问题解的方法,不用迭代;第二种就是利用迭代的方式,不断调整参数,使残差最小,这种算法是本章要介绍的算法,也是我们通常所说的非线性优化的方法。

非线性优化

这里有类似于机器学习中监督学习的概念,使用预测值与观测值构建出一个残差,而状态值与环境观测则是需要调节的变量。把所有残差求和,迭代更新变量值,使loss不断下降,到一个最小值时,这时的状态量就被称之为最优估计值。

这里的loss,一般会构建为观测与预测的差值的平方,所以构建的问题一般为最小二乘问题。

牛顿法

牛顿法来源于求方程解,但求极值的过程,也是求函数导数为0的过程,所以二者本质上是一样。记残差函数为:

F ( x ) = 1 2 ∣ ∣ f ( x ) ∣ ∣ 2 F(x) = \frac {1}{2}||f(x)||^2 F(x)=21∣∣f(x)∣∣2

对F(x)进行二阶泰勒展开

F ( x ) = F ( x 0 ) + F ′ ( x 0 ) ( x − x 0 ) + 1 2 F ′ ′ ( x 0 ) ( x − x 0 ) 2 + σ 2 ( x − x 0 ) 2 F(x) = F(x_0) + F^{'}(x_0)(x-x_0)+\frac{1}{2}F^{''}(x_0)(x-x_0)^2 +\sigma^2(x-x_0)^2 F(x)=F(x0)+F′(x0)(x−x0)+21F′′(x0)(x−x0)2+σ2(x−x0)2

对F(x)的泰勒展开求导:

F ′ ( x ) = F ′ ( x 0 ) + F ′ ′ ( x 0 ) ( x − x 0 ) F^{'}(x) = F^{'}(x_0)+F^{''}(x_0)(x-x_0) F′(x)=F′(x0)+F′′(x0)(x−x0)

令导数为0,得到

F ′ ′ ( x 0 ) ( x − x 0 ) = − F ′ ( x 0 ) F^{''}(x_0)(x-x_0) = -F^{'}(x_0) F′′(x0)(x−x0)=−F′(x0)

将 x − x 0 x-x_0 x−x0视作 x 0 x_0 x0基础上的增量 Δ x \Delta x Δx,则 x = x 0 + Δ x x = x_0 +\Delta x x=x0+Δx,于是原方程变为

F ′ ′ ( x 0 ) Δ x = − F ′ ( x 0 ) F^{''}(x_0)\Delta x = -F^{'}(x_0) F′′(x0)Δx=−F′(x0)

对于变量为向量的情况,这里的一阶导数与二阶导数,就变为雅克比矩阵J与海森矩阵H。上式可变为:

H ( x 0 ) Δ x = − J ( x 0 ) H(x_0)\Delta x = -J(x_0) H(x0)Δx=−J(x0)

求得增量 Δ x \Delta x Δx后,更新 x 0 x_0 x0,在计算新x下loss,重复求增量,不断迭代直到收敛,最后得到的x就是我们要求的最优变量。

上面的方程也称为增量方程。

高斯牛顿法

对于复杂函数,特别是非线性函数,求二阶导数十分困难,甚至是难以求出的,牛顿法中直接求海森矩阵的做法十分困难,因此出现了高斯牛顿法:

具体做法是对f(x)做一阶泰勒展开,原loss函数变为

F ( x ) = 1 2 ∣ ∣ f ( x ) ∣ ∣ 2 = 1 2 ∣ ∣ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) ∣ ∣ 2 = 1 2 ( ∥ f ( x 0 ) ∥ 2 + 2 f ( x 0 ) f ′ ( x 0 ) ( x − x 0 ) + f ′ ( x 0 ) 2 ( x − x 0 ) 2 ) \begin{array}{l} F(x) = \frac {1}{2}||f(x)||^2 = \frac {1}{2}||f(x_0)+f^{'}(x_0)(x-x_0)||^2 \\ =\frac{1}{2}\left(\|f(x_0)\|^{2}+2 f(x_0) f^{'}(x_0) (x-x_0)+ f^{'}(x_0)^2(x-x_0)^2 \right) \end{array} F(x)=21∣∣f(x)∣∣2=21∣∣f(x0)+f′(x0)(x−x0)∣∣2=21(∥f(x0)∥2+2f(x0)f′(x0)(x−x0)+f′(x0)2(x−x0)2)

对上式关于x求导,得:

F ′ ( x ) = f ( x 0 ) f ′ ( x 0 ) + f ′ ( x 0 ) 2 ( x − x 0 ) \begin{array}{l} F^{'}(x)= f(x_0) f^{'}(x_0) + f^{'}(x_0)^2(x-x_0) \end{array} F′(x)=f(x0)f′(x0)+f′(x0)2(x−x0)

令导数等于0,有:

f ′ ( x 0 ) 2 ( x − x 0 ) = − f ( x 0 ) f ′ ( x 0 ) f^{'}(x_0)^2(x-x_0) = -f(x_0) f^{'}(x_0) f′(x0)2(x−x0)=−f(x0)f′(x0)

同样的,令 x − x 0 x-x_0 x−x0为 Δ x \Delta x Δx,对于多元函数,一阶导为雅克比矩阵,于是原方程变为:

J ( x 0 ) J ( x 0 ) T Δ x = − f ( x 0 ) J ( x 0 ) J(x_0)J(x_0)^{T} \Delta x = -f(x_0)J(x_0) J(x0)J(x0)TΔx=−f(x0)J(x0)

同样的方法,求出增量x后,更新x,得到当前loss,不断迭代下去直到收敛。

对比于牛顿法的增量方程,可以看到高斯牛顿法左边用更容易求导的雅克比矩阵的乘积,近似代替了海森矩阵。右侧则多乘了一个 f ( x 0 ) f(x_0) f(x0)

H ( x 0 ) Δ x = − J ( x 0 ) H(x_0)\Delta x = -J(x_0) H(x0)Δx=−J(x0)

列文伯格-马夸而特法

在求增量方程的解时,涉及矩阵求逆,如下:

Δ x = − H ( x 0 ) − 1 J ( x 0 ) \Delta x = -H(x_0)^{-1}J(x_0) Δx=−H(x0)−1J(x0)

在高斯牛顿法中, H ( x 0 ) H(x_0) H(x0)对应 J ( x 0 ) J ( x 0 ) T J(x_0)J(x_0)^T J(x0)J(x0)T

但是,对于高斯牛顿法,并不能保证 H ( x 0 ) H(x_0) H(x0)可逆,另外,如果增量 Δ x \Delta x Δx过大,线性近似的误差也会很大,为了解决这两种问题,出现了列文伯格-马夸而特法,也就是LM法。

LM法是对高斯牛顿法(GN法)的改进,通过引入信赖区域的残差,对近似范围进行了限制,其中的残差为:

min ⁡ 1 2 ∥ f ( x k ) + J ( x k ) T Δ x k ∥ 2 , s.t ∥ D Δ x k ∥ 2 ≤ μ \min \frac{1}{2}\left\|f\left(x_k\right)+J\left(x_k\right)^T \Delta x_k\right\|^2, \quad \text { s.t } \quad\left\|D \Delta x_k\right\|^2 \leq \mu min21 f(xk)+J(xk)TΔxk 2, s.t ∥DΔxk∥2≤μ

增量方程的获取,构建拉格朗日函数, λ \lambda λ是系数因子:

L ( Δ x , λ ) = 1 2 ∥ f ( x ) + J ( x ) T Δ x ∥ 2 + λ 2 ( ∥ D Δ x ∥ 2 − μ ) L(\Delta x, \lambda)=\frac{1}{2}\left\|f(x)+J(x)^T \Delta x\right\|^2+\frac{\lambda}{2}\left(\|D \Delta x\|^2-\mu\right) L(Δx,λ)=21 f(x)+J(x)TΔx 2+2λ(∥DΔx∥2−μ)

这样的话,化简后求导就可以得到:

J ( x ) f ( x ) + J ( x ) J T ( x ) Δ x + λ D T D Δ x = 0 J(x) f(x)+J(x) J^T(x) \Delta x+\lambda D^T D \Delta x=0 J(x)f(x)+J(x)JT(x)Δx+λDTDΔx=0

我们化简后得到:

( J J T + λ D T D ) Δ x = − J f \left(J J^T+\lambda D^T D\right) \Delta x=-J f (JJT+λDTD)Δx=−Jf

在本文中,我们令 H = J J T , g = − J f H=J J^T, g=-J f H=JJT,g=−Jf。在实际使用中,通常用 I I I来代替 D T D D^TD DTD。所以,公式就变为:

( H + λ I ) Δ x k = g (H+\lambda I) \Delta x_k=g (H+λI)Δxk=g

这样就得到了增量方程。

LM称为置信区域法,其会对线性近似程度的好坏进行度量,通过如下系数计算:

ρ = f ( x + Δ x ) − f ( x ) J ( x ) T Δ x \rho=\frac{f(x+\Delta x)-f(x)}{J(x)^{T} \Delta x} ρ=J(x)TΔxf(x+Δx)−f(x)

该分数代表近似的准确性,在一定范围内,会认为近似是有效的,因此LM法也称为基于区域搜索的方法,及信赖区域法,可以看到其分为以下几种情况:

○ ρ 接近1,近似是好的,不需要更改;

○ ρ 太小,则实际减少的值小于近似减少的值,近似较大,需要缩小近似的范围;

○ ρ 太大,则实际减少的值大于近似减少的值,近似较小,需要扩大近似的范围。

根据ρ的值,来进行步长的动态调整,即改变增量方程中的λ值。- ρ 越大,表明 L对F的近似效果越好,所以可以增大 λ以使得LM法接近梯度下降法

相反,ρ 越小,表明 L的近似越差,所以应该减小μ以使得迭代公式接近高斯牛顿法。

由于系数矩阵中加入了λ乘以单位矩阵,可以保证系数矩阵的正定可逆。其次,通过改变λ值,可以起到调整步长的作用,当线性近似程度不好时,减小更新的步长,可以有更好的收敛性。

BA

BA是VSLAM里广泛使用的技术,它通过同时优化地图点与相机位姿,使空间3维点与相机平面观测的误差最小,每个3D点光束都能穿过观测相机的光心。BA是VSLAM里常用的后端算法,但由于其灵活性,也可以在前端使用。相比于上面几种线性代数的方法,BA一方面是非线性方法,可以最大程度使用所有匹配点数据,另一方面可以优化三维点坐标,被称为slam中万金油的方法。

BA不仅可以求两帧之间的位移,还可以求多帧的姿态。如果固定住路标点,只优化位姿,这种BA叫做运动BA。而把路标点与姿态一起优化叫做完整BA。由于优化变量数量庞大,完整BA优化比较耗时。

BA优化时需要给一个迭代的初始值,一般做法是不直接进行BA,而是先用前面介绍的PnP算法或者对极几何先获得相机位姿及3D点坐标初始值,然后把初始值交给BA做最终的优化调整。

第一步,构建残差

BA残差为特征点观测值与预测值之差的平方,其中观测值为像素坐标系下特征点坐标,预测值为3D点在该相机坐标系下的像素平面投影坐标。这里需要把3D点转换到当前相机坐标系,假设3D点为点P,相机相对旋转与平移为R,t

P ′ = R p + t P^{\prime} = Rp+t P′=Rp+t

P'在归一化平面上坐标为:

P c = [ u c , v c , 1 ] = [ P x ′ / P z ′ , P y ′ / P z ′ , 1 ] P_c = [u_c,v_c,1] = [P^{\prime}_x/P^{\prime}_z,P^{\prime}_y/P^{\prime}_z,1] Pc=[uc,vc,1]=[Px′/Pz′,Py′/Pz′,1]

通过相机镜头时,存在畸变,则畸变坐标为:

{ u c ′ = u c ( 1 + k 1 r c 2 + k 2 r c 4 ) v c ′ = v c ( 1 + k 1 r c 2 + k 2 r c 4 ) \left\{\begin{array}{l} u_{\mathrm{c}}^{\prime}=u_{\mathrm{c}}\left(1+k_{1} r_{\mathrm{c}}^{2}+k_{2} r_{\mathrm{c}}^{4}\right) \\ v_{\mathrm{c}}^{\prime}=v_{\mathrm{c}}\left(1+k_{1} r_{\mathrm{c}}^{2}+k_{2} r_{\mathrm{c}}^{4}\right) \end{array}\right. {uc′=uc(1+k1rc2+k2rc4)vc′=vc(1+k1rc2+k2rc4)

根据相机模型,最后像素坐标为:

{ u s = f x ∗ u c ′ + c x v s = f y ∗ v c ′ + c y \left\{\begin{array}{l} u_{\mathrm{s}}= f_x*u_{\mathrm{c}}^{\prime} + c_x \\ v_{\mathrm{s}}= f_y*v_{\mathrm{c}}^{\prime} + c_y \end{array}\right. {us=fx∗uc′+cxvs=fy∗vc′+cy

以上,从原始3D点,到观测点的转换,称为观测模型,这里记为:

z = h ( T , p ) z = h(T,p) z=h(T,p)

其中T为包含旋转与平移的转换矩阵。

转换过程如上图:

现在,设相机平面观测像素坐标为z',则观测误差为:

e = z ′ − h ( T , p ) e = z^{\prime} - h(T,p) e=z′−h(T,p)

将所有点的观测残差平方求和,得到如下观测残差:

1 2 ∑ i = 1 m ∑ j = 1 n ∥ e i j ∥ 2 = 1 2 ∑ i = 1 m ∑ j = 1 n ∥ z i j − h ( T i , p j ) ∥ 2 . \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}\left\|\bm{e}{ij} \right\|^2= \frac{1}{2}\sum{i=1}^{m}\sum_{j=1}^{n}\left\| \bm{z}_{ij}-h(T_i,p_j)\right\|^2. 21∑i=1m∑j=1n∥eij∥2=21∑i=1m∑j=1n∥zij−h(Ti,pj)∥2.

该残差为最小二乘残差,对其求最小化的过程,同时对位姿与3D点进行了调整,就是所谓的BA.

可以看到,这个残差也是通过3D-2D点的关联完成的。

第二步,构建增量方程

将所有待求变量,写为一个向量形式为:

x = [ T 1 , ⋯   , T m , p 1 , ⋯   , p n ] T . \bm{x}=[T_1,\cdots,T_m,p1,\cdots,p_n]^\text{T}. x=[T1,⋯,Tm,p1,⋯,pn]T.

向量中  ⁣ T  ⁣ ⁣ \!T\!\! T表示相机位姿,即旋转与平移,  ⁣ p  ⁣ \!p\! p表示3D点坐标,如果是求两帧之间相对位移,则其中  ⁣ T  ⁣ \!T\! T就只有  ⁣ T 1  ⁣ \!T_1\! T1。假设残差函数为  ⁣ f ( x )  ⁣ \!f(x)\! f(x),则当我们在 x x x上加一个增量 Δ x \Delta_x Δx时,  ⁣ f ( x )  ⁣ \!f(x)\! f(x)的变化为:

1 2 ∥ f ( x + Δ x ) ∥ 2 ≈ 1 2 ∑ i = 1 m ∑ i = 1 n ∥ e i j + F i j Δ ξ i + E i j Δ p j ∥ 2 \frac{1}{2}\| f(x+\Delta x) \|^2 \approx \frac{1}{2}\sum_{i=1}^{m}\sum_{i=1}^{n} \| e_{ij}+F_{ij}\Delta\xi_i+E_{ij}\Delta p_j \|^2 21∥f(x+Δx)∥2≈21∑i=1m∑i=1n∥eij+FijΔξi+EijΔpj∥2

其中, F F F表示整个代价函数在当前状态下对相机姿态的偏导数,而 E E E表示该函数对路标点位置的偏导。以上是对每一个点进行求和,现在把每个点及每个姿态,各自放在一起,形成一个向量,则上述式子变为:

1 2 ∥ f ( x + Δ x ) ∥ 2 = 1 2 ∥ e + F Δ x c + E Δ x p ∥ 2 \frac{1}{2}\| f(x+\Delta x) \|^2 = \frac{1}{2} \| e+F\Delta x_c+E\Delta x_p \|^2 21∥f(x+Δx)∥2=21∥e+FΔxc+EΔxp∥2

对该函数求最小值,需要用到非线性优化中的最小二乘法,不对其进行展开讨论,只说明一般形式,不管选择何种最小二乘中的高斯牛顿还是LM法,最后都需要求增量方程,该方程由上式求导数为0得来:

H Δ x = g . \bm{H}\Delta \bm{x}=\bm{g}. HΔx=g.

如果是高斯牛顿法,则增量方程如下:

J T ( x 0 ) J ( x 0 ) Δ x = − J T ( x 0 ) f ( x 0 ) J^T(x_0)J(x_0)\Delta x=-J^T(x_0)f(x_0) JT(x0)J(x0)Δx=−JT(x0)f(x0)

高斯牛顿法和列文伯格一马夸尔特方法的主要差别在于,这里的 H H H是取 J T J J^TJ JTJ还是 J T J + λ I J^TJ+\lambda I JTJ+λI的形式。由于把变量归类成了位姿和空间点两种,所以雅可比矩阵可以分块为

J = [ F    E ] J=[F\,\, E] J=[FE]

那么以高斯牛顿法为例, H H H矩阵为如下形式:

H = J T J = [ F T F F T E E T F E T E ] H=J^TJ= \begin{bmatrix} F^TF & F^TE \\ E^TF & E^TE \end{bmatrix} H=JTJ=[FTFETFFTEETE]

因为该方法包含了所有变量,一般特征点有几百个,这个 H H H矩阵会非常大,在求增量时,如果直接求矩阵的逆,其运算复杂度为 O ( n 3 ) O(n^3) O(n3),计算会非常耗时,但幸运的是, H H H矩阵本身具有稀疏性,通过这个性质,可以加速增量方程的求解。

第三步,通过边缘化求解增量方程:

H H H矩阵的稀疏性是由雅可比矩阵 J ( x ) J(x) J(x)引起的。考虑这些代价函数当中的其中一个 e  ⁣ e\! e。注意,这个误差项只描述了在 T T T看到 P P P这件事,只涉及第  ⁣ i  ⁣ \!i\! i个相机位姿和第  ⁣ j  ⁣ \!j\! j个路标点,对其余部分的变量的导数都为0。所以该误差项对应的雅可比矩阵有下面的形式:

J i j ( x ) = ( 0 2 × 6 , . . . , 0 2 × 6 , ∂ e i j ∂ T i , 0 2 × 6 , . . . , 0 2 × 3 , . . . , 0 2 × 3 , ∂ e i j ∂ p j , 0 2 × 3 , . . . , 0 2 × 3 ) . J_{ij}(x)=\left( \bm{0}{2\times6},...,\bm{0}{2\times6},\frac{\partial \bm{e}{ij}}{\partial \bm{T}i}, \bm{0}{2\times6},...,\bm{0}{2\times3},...,\bm{0}{2\times3},\frac{\partial \bm{e}{ij}}{\partial \bm{p}j}, \bm{0}{2\times3},...,\bm{0}_{2\times3} \right). Jij(x)=(02×6,...,02×6,∂Ti∂eij,02×6,...,02×3,...,02×3,∂pj∂eij,02×3,...,02×3).

其中  ⁣ 0 2 × 6  ⁣ \!\bm{0}{2\times 6}\! 02×6表示维度为  ⁣ 2  ⁣ ×  ⁣ 6  ⁣ \!2\!\times\!6\! 2×6的  ⁣ 0  ⁣ \!\bm{0}\! 0矩阵,同理,  ⁣ 0 2 × 3  ⁣ \!\bm{0}{2\times 3}\! 02×3也是一样的。该误差项对相机姿态的偏导维度为  ⁣ 2  ⁣ ×  ⁣ 6  ⁣ \!2\!\times\!6\! 2×6,对路标点的偏导维度是  ⁣ 2  ⁣ ×  ⁣ 3  ⁣ \!2\!\times\!3\! 2×3。这个误差项的雅可比矩阵,除了这两处为非零块,其余地方都为零。这体现了该误差项与其他路标和轨迹无关的特性。

以下图为例,我们设  ⁣ J i j  ⁣ \!J_{ij}\! Jij只在  ⁣ i  ⁣ ,  ⁣ j  ⁣ \!i\!,\!j\! i,j处有非零块,那么它对  ⁣ H  ⁣ \!H\! H的贡献为  ⁣ ⁣ J i j T J i j  ⁣ \!\!J_{ij}^TJ_{ij}\! JijTJij,具有图上所画的稀疏形式。这个  ⁣ J i j T J i j  ⁣ \!J_{ij}^TJ_{ij}\! JijTJij矩阵也仅有4个非零块,位于  ⁣ ( i , i ) ,  ⁣ ( i , j ) ,  ⁣ ( j , i ) ,  ⁣ ( j , j )  ⁣ \!(i,i),\!(i,j),\!(j,i),\!(j,j)\! (i,i),(i,j),(j,i),(j,j)。对于整体的  ⁣ H  ⁣ \!H\! H,有

H = ∑ i , j J i j T J i j , \bm{H}=\sum_{i,j}\bm{J}{ij}^{T}\bm{J}{ij}, H=∑i,jJijTJij,

请注意,  ⁣ i  ⁣ \!i\! i在所有相机位姿中取值,  ⁣ j  ⁣ \!j\! j在所有路标点中取值。我们把  ⁣ H  ⁣ \!H\! H进行分块:

H = [ H 11 H 12 H 21 H 22 ] . H= \begin{bmatrix} H_{11} & H_{12} \\ H_{21} & H_{22} \end{bmatrix}. H=[H11H21H12H22].

则J的稀疏性对最后  ⁣ H \!H H矩阵稀疏性的影响如下:

则对原 H H H矩阵,可以做如下划分:

于是,对应的线性方程组也可以由  ⁣ H Δ x = g \!H \Delta x = g HΔx=g变为如下形式:

[ B E E T C ] [ Δ x c Δ x p ] = [ v w ] . \begin{bmatrix} \bm{B} & \bm{E} \\ \bm{E}^T & \bm{C} \end{bmatrix} \begin{bmatrix} \Delta \bm{x}_c \\ \Delta \bm{x}_p \end{bmatrix} = \begin{bmatrix} \bm{v} \\ \bm{w} \end{bmatrix}. [BETEC][ΔxcΔxp]=[vw].

其中 B \bm{B} B是对角块矩阵,每个对角块的维度和相机参数的维度相同,对角块的个数是相机变量的个数。由于路标数量会远远大于相机变量个数,所以  ⁣ C  ⁣ \!\bm{C}\! C 往往也远大于  ⁣ B  ⁣ \!\bm{B}\! B。三维空间中每个路标点为三维,于是  ⁣ C  ⁣ \!\bm{C}\! C 矩阵为对角块矩阵,每个块为 3  ⁣ ×  ⁣ 3  ⁣ 3\!\times \!3\! 3×3 矩阵。对角块矩阵求逆的难度远小于对一般矩阵的求逆难度,因为我们只需要对那些对角线矩阵块分别求逆即可。考虑到这个特性,我们对线性方程组进行高斯消元,目标是消去右上角的非对角部分E,得

[ I − E C − 1 0 I ] [ B E E T C ] [ Δ x c Δ x p ] = [ I − E C − 1 0 I ] [ v w ] . \begin{bmatrix} \bm{I} & -\bm{EC}^{-1} \\ 0 & \bm{I} \end{bmatrix} \begin{bmatrix} \bm{B} & \bm{E} \\ \bm{E}^T & \bm{C} \end{bmatrix} \begin{bmatrix} \Delta\bm{x}_c \\ \Delta\bm{x}_p \end{bmatrix} = \begin{bmatrix} \bm{I} & -\bm{EC}^{-1} \\ 0 & \bm{I} \end{bmatrix} \begin{bmatrix} \bm{v} \\ \bm{w} \end{bmatrix}. [I0−EC−1I][BETEC][ΔxcΔxp]=[I0−EC−1I][vw].

整理,得

[ B − E C − 1 E T 0 E T C ] [ Δ x c Δ x p ] = [ v − E C − 1 w w ] . \begin{bmatrix} \bm{B}-\bm{EC}^{-1}\bm{E}^T & 0 \\ \bm{E}^T & \bm{C} \end{bmatrix} \begin{bmatrix} \Delta\bm{x}_c \\ \Delta\bm{x}_p \end{bmatrix} = \begin{bmatrix} \bm{v}-\bm{EC}^{-1}\bm{w} \\ \bm{w} \end{bmatrix}. [B−EC−1ETET0C][ΔxcΔxp]=[v−EC−1ww].

消元之后,方程组第一行变成和 Δ x \Delta\bm{x} Δx无关的项。单独把它拿出来,得到关于位姿部分的增量方程:

[ B − E C − 1 E T ] Δ x c = v − E C − 1 w . [\bm{B}-\bm{EC}^{-1}\bm{E}^T]\Delta \bm{x}_c=\bm{v}-\bm{EC}^{-1}\bm{w}. [B−EC−1ET]Δxc=v−EC−1w.

这个线性方程的维度和  ⁣ B  ⁣ \!B\! B 矩阵一样。我们的做法是先求解这个方程,然后把解得的  ⁣ Δ x  ⁣ \!\Delta\bm{x}\! Δx 代入原方程,求解  ⁣ Δ x p  ⁣ \!\Delta\bm{x}_p\! Δxp。这个过程称为Marginalization,或者Schur消元(Schur Elimination)。相比于直接解线性方程的做法,它的优势在于:

1.在消元过程中,由于  ⁣ C \!\bm{C} C为对角块,所以 C − 1  ⁣ \bm{C}^{-1}\! C−1容易解出。

2.求解了  ⁣ ⁣ Δ x c  ⁣ \!\!\Delta\bm{x}_c\! Δxc之后,路标部分的增量方程由  ⁣ Δ x p  ⁣ =  ⁣ C − 1 ( w − E T Δ x c )  ⁣ \!\Delta\bm{x}_p\!=\!\bm{C}^{-1}(\bm{w}-\bm{E}^T\Delta\bm{x}_c)\! Δxp=C−1(w−ETΔxc)给出。这依然用到了 C − 1  ⁣ \bm{C}^{-1}\! C−1易于求解的特性。

最后,在求得 x \bm{x} x的增量后,更新变量值,不断迭代直到问题收敛,最后求得最优的相机位姿及3D点坐标。需要注意的是,BA优化中需要给一个迭代的初始值,一般做法是不直接进行BA,而是先用PnP算法或者对极几何先获得相机位姿及3D点坐标初始值,然后把初始值交给BA做最终的优化调整。

相关推荐
sinovoip26 分钟前
Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
人工智能·科技·物联网·开源·risc-v
OpenAnolis小助手27 分钟前
开源生态发展合作倡议
开源·操作系统·龙蜥社区·龙蜥·openanolis
EAI-Robotics2 小时前
机器人打包物品研究现状简述
机器人
肥猪猪爸2 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
杭州奥能充电桩2 小时前
移动充储机器人“小奥”的多场景应用(上)
开源·能源
readmancynn2 小时前
二分基本实现
数据结构·算法
萝卜兽编程2 小时前
优先级队列
c++·算法
盼海2 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步2 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln3 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展