深蓝学院从零开始手写VIO(二)——VIO中的BA问题

深蓝学院从零开始手写VIO(二)——VIO中的BA问题

  • 最小二乘问题的求解
    • 牛顿法
    • 高斯牛顿法
    • LM法(阻尼牛顿法)
    • 鲁棒核函数
  • VIO残差的构建
    • 加权最小二乘代价函数
    • 加权估计下的VIO代价函数
      • 逆深度下的视觉重投影误差
      • 预积分形式的IMU误差

声明:本专栏文章为深蓝学院《从零开始手写VIO》课程个人学习笔记,更多学习资源请咨询深蓝学院相关课程。

最小二乘问题的求解

最小二乘问题指的是对于 n n n维变量 x ∈ R n \bm{x}\in\mathbb{R}^n xRn,寻找一个最优值 x ∗ \bm{x}^\ast x使得代价函数(cost function) F ( x ) F(\bm{x}) F(x)取最小值,而代价函数通常具有如下形式:
F ( x ) = 1 2 ∑ i = 1 n f i ( x ) 2 (1) F(\bm{x})=\frac{1}{2}\sum\limits_{i=1}^nf_i(\bm{x})^2 \tag{1} F(x)=21i=1nfi(x)2(1)

式中 f i ( x ) f_i(\bm{x}) fi(x)称为残差函数,且 m ≥ n m\geq n mn。在大多数应用中, F ( x ) F(\bm{x}) F(x)的导数是难以直接求导的,所以我们通常会寻求将其写为泰勒级数形式,从而通过求解一系列的线性方程获得极值点的位置。

此外,式(1)也可以写为矩阵形式,注意这里的 f k ( x ) f_k(\bm{x}) fk(x)为了方便我们认为其是标量函数,若 f k ( x ) f_k(\bm{x}) fk(x)为矢量函数,后续结论依旧成立,只需做对应的矢量改写即可:
F ( x ) = 1 2 f T ( x ) f ( x ) f ( x ) = [ f 1 ( x ) f 1 ( x ) ⋮ f m ( x ) ] \begin{aligned} F(\bm{x})&=\frac{1}{2}\bm{f}^T(\bm{x})\bm{f}(\bm{x})\\ \bm{f}(\bm{x})&=\left[\begin{array}{c}f_1(\bm{x}) \\ f_1(\bm{x}) \\ \vdots \\ f_m(\bm{x})\end{array}\right] \end{aligned} F(x)f(x)=21fT(x)f(x)=f1(x)f1(x)fm(x)

牛顿法

我们自然可以对代价函数 F ( x ) F(\bm{x}) F(x)求解其在初始迭代点 x 0 \bm{x}_0 x0处的泰勒级数:
F ( x 0 + Δ x ) = F ( x 0 ) + J Δ x + 1 2 Δ x T H Δ x + o ( ∥ Δ x ∥ 3 ) (2) F(\bm{x}_0+\Delta\bm{x})=F(\bm{x}_0)+\bm{J}\Delta\bm{x}+\frac{1}{2}\Delta\bm{x}^T\bm{H}\Delta\bm{x}+o(\|\Delta\bm{x}\|^3) \tag{2} F(x0+Δx)=F(x0)+JΔx+21ΔxTHΔx+o(Δx3)(2)

式中 J \bm{J} J F ( x ) F(\bm{x}) F(x)的一阶导数矩阵,称为Jacobian矩阵; H \bm{H} H F ( x ) F(\bm{x}) F(x)的二阶导数矩阵,称为Hessian矩阵。在标量函数中,一阶导数为0的点是函数的极值点,极值点中二阶导大于零的为极小值点,二阶导小于零的为极大值点,这一结论同样可以扩展到矢量函数中:

  • 使得 J = 0 \bm{J}=0 J=0 x ∗ \bm{x}^\ast x点为稳定点
  • x ∗ \bm{x}^\ast x点处的Hessian矩阵为正定矩阵,则该点为极小值点;
  • x ∗ \bm{x}^\ast x点处的Hessian矩阵为负定矩阵,则该点为极大值点;
  • x ∗ \bm{x}^\ast x点处的Hessian矩阵为即非正定矩阵亦非负定矩阵,则该点为鞍点;

我们对式(1)求一阶导数有:
∂ ∂ Δ x ( F ( x 0 ) + J Δ x + 1 2 Δ x T H Δ x ) = J T + H Δ x (3) \frac{\partial}{\partial\Delta\bm{x}}\left(F(\bm{x}_0)+\bm{J}\Delta\bm{x}+\frac{1}{2}\Delta\bm{x}^T\bm{H}\Delta\bm{x}\right)=\bm{J}^T+\bm{H}\Delta\bm{x} \tag{3} Δx(F(x0)+JΔx+21ΔxTHΔx)=JT+HΔx(3)

令一阶导数为零,则我们可以获得迭代步长 Δ x = − H − 1 J T \Delta\bm{x}=-\bm{H}^{-1}\bm{J}^T Δx=H1JT,,由于这里我们求解到了二阶Hessian,因此该方法称为二阶牛顿法;此外,若我们只求解一阶Jacobian矩阵,该方法即为我们熟悉的最速下降法,又称一阶牛顿法。

此外,在牛顿法中,有时为了避免 Δ x \Delta\bm{x} Δx过大,对添加一个惩罚项限制 Δ x \Delta\bm{x} Δx的步长,即求解一阶导数的函数变为:
∂ ∂ Δ x ( F ( x 0 ) + J Δ x + 1 2 Δ x T H Δ x + 1 2 μ Δ x T Δ x ) = J T + H Δ x + μ Δ x (4) \frac{\partial}{\partial\Delta\bm{x}}\left(F(\bm{x}_0)+\bm{J}\Delta\bm{x}+\frac{1}{2}\Delta\bm{x}^T\bm{H}\Delta\bm{x}+\frac{1}{2}\mu\Delta\bm{x}^T\Delta\bm{x}\right)=\bm{J}^T+\bm{H}\Delta\bm{x}+\mu\Delta\bm{x} \tag{4} Δx(F(x0)+JΔx+21ΔxTHΔx+21μΔxTΔx)=JT+HΔx+μΔx(4)

式中 1 2 μ Δ x T Δ x \frac{1}{2}\mu\Delta\bm{x}^T\Delta\bm{x} 21μΔxTΔx称为阻尼项,添加阻尼项之后的迭代步长变为 Δ x = − ( H + μ I ) − 1 J T \Delta\bm{x}=-(\bm{H}+\mu\bm{I})^{-1}\bm{J}^T Δx=(H+μI)1JT

高斯牛顿法

在牛顿法中,我们是通过对代价函数 F ( x ) F(\bm{x}) F(x)进行泰勒展开来获得导数零点的,但这一方式中二阶导数Hessian矩阵 H \bm{H} H的求解是较为繁琐且复杂的,因此我们可以采用另一种方式,即对残差函数 f ( x ) \bm{f}(\bm{x}) f(x)做泰勒展开(为书写方便,这里采用了矩阵写法):
f ( x 0 + Δ x ) = f ( x 0 ) + J Δ x \bm{f}(\bm{x}_0+\Delta\bm{x})=\bm{f}(\bm{x}_0)+\bm{J}\Delta\bm{x} f(x0+Δx)=f(x0)+JΔx

将其带入代价函数并求取一阶导数有:
∂ ∂ Δ x F ( x ) = ∂ ∂ Δ x 1 2 ( ( f ( x 0 ) + J Δ x ) T ( f ( x 0 ) + J Δ x ) ) = ∂ ∂ Δ x ( 1 2 F ( x 0 ) + Δ x T J T f ( x 0 ) + 1 2 Δ x T J T J Δ x ) ) = J T f ( x 0 ) + J T J Δ x (5) \begin{aligned} \frac{\partial}{\partial\Delta\bm{x}}F(\bm{x})&=\frac{\partial}{\partial\Delta\bm{x}}\frac{1}{2}\left((\bm{f}(\bm{x}_0)+\bm{J}\Delta\bm{x})^T(\bm{f}(\bm{x}_0)+\bm{J}\Delta\bm{x})\right)\\ &=\frac{\partial}{\partial\Delta\bm{x}}\left(\frac{1}{2}F(\bm{x}_0)+\Delta\bm{x}^T\bm{J}^T\bm{f}(\bm{x}_0)+\frac{1}{2}\Delta\bm{x}^T\bm{J}^T\bm{J}\Delta\bm{x})\right)\\ &=\bm{J}^T\bm{f}(\bm{x}_0)+\bm{J}^T\bm{J}\Delta\bm{x} \end{aligned} \tag{5} ΔxF(x)=Δx21((f(x0)+JΔx)T(f(x0)+JΔx))=Δx(21F(x0)+ΔxTJTf(x0)+21ΔxTJTJΔx))=JTf(x0)+JTJΔx(5)

令一阶导数有 J T J Δ x = − J T f ( x 0 ) \bm{J}^T\bm{J}\Delta\bm{x}=-\bm{J}^T\bm{f}(\bm{x}_0) JTJΔx=JTf(x0),该方程即为最小二乘问题中的正则方程(normal equation)。若 J \bm{J} J满秩,则 J T J \bm{J}^T\bm{J} JTJ正定,此时式(5)一定有非零解,即随时函数一定存在最小值(当然实际情况中很少有 J \bm{J} J为正定的,其通常为半正定)。

LM法(阻尼牛顿法)

类比于牛顿法中的阻尼项,在高斯牛顿法(GN)中,我们同样可以对其添加阻尼项以抑制过大的迭代补偿,添加阻尼项之后的正则方程为:
( J T J + μ I ) Δ x = − J T f ( x 0 ) (6) (\bm{J}^T\bm{J}+\mu\bm{I})\Delta\bm{x}=-\bm{J}^T\bm{f}(\bm{x}_0) \tag{6} (JTJ+μI)Δx=JTf(x0)(6)

阻尼因子 μ \mu μ具有如下性质:

  • μ \mu μ一定大于零,以保证式(6)所示的正则方程一定有非零解;
  • μ \mu μ很大时, μ I ≫ J T J \mu\bm{I}\gg\bm{J}^T\bm{J} μIJTJ,此时正则方程近似于一阶牛顿法,即 μ I Δ x = − J T f ( x 0 ) \mu\bm{I}\Delta\bm{x}=-\bm{J}^T\bm{f}(\bm{x}_0) μIΔx=JTf(x0)
  • μ \mu μ很小时, μ I ≪ J T J \mu\bm{I}\ll\bm{J}^T\bm{J} μIJTJ,此时正则方程近似于不存在阻尼的高斯牛顿法;

可以看到,对于LM方法来说,最重要的莫过于阻尼因子 μ \mu μ的选取,一个简单的初值选取策略为选择 J T J \bm{J}^T\bm{J} JTJ中最大的对角线元素的比例,即:
m u 0 = τ ⋅ max ⁡ ( ( J T J ) i i ) , τ ∼ [ 1 0 − 8 , 1 ] \\mu_0=\tau\cdot\max((\bm{J}^T\bm{J})_{ii}),\quad\tau\sim[10^{-8},1] mu0=τmax((JTJ)ii),τ[108,1]

而后,通过比例因子 ρ \rho ρ调节每一步的阻尼,比例因子 ρ \rho ρ定义为代价函数的实际下降值与近似下降值之间的比值:
ρ = F ( x ) − F ( x + Δ x ) ) L ( x ) − L ( x + Δ x ) \rho=\frac{F(\bm{x})-F(\bm{x}+\Delta\bm{x}))}{L(\bm{x})-L(\bm{x}+\Delta\bm{x})} ρ=L(x)L(x+Δx)F(x)F(x+Δx))

式中 L ( x ) L(\bm{x}) L(x)表示式(5)中使用泰勒展开近似的 F ( x ) F(\bm{x}) F(x)函数。记 b = − J T f ( x ) \bm{b}=-\bm{J}^T\bm{f}(\bm{x}) b=JTf(x),同时由于 L ( Δ x ) L(\Delta\bm{x}) L(Δx)中的 Δ x \Delta\bm{x} Δx满足正则方程,因此有:
L ( x ) − L ( x + Δ x ) = − Δ x T J T f ( x 0 ) − 1 2 Δ x T J T J Δ x = 1 2 Δ x T ( − 2 J T f ( x ) − ( J T J + μ I − μ I ) Δ x ) = 1 2 Δ x T ( 2 b − b + μ I Δ x ) = 1 2 Δ x T ( b + μ Δ x ) \begin{aligned} L(\bm{x})-L(\bm{x}+\Delta\bm{x})&=-\Delta\bm{x}^T\bm{J}^T\bm{f}(\bm{x}_0)-\frac{1}{2}\Delta\bm{x}^T\bm{J}^T\bm{J}\Delta\bm{x}\\ &=\frac{1}{2}\Delta\bm{x}^T\left(-2\bm{J}^T\bm{f}(\bm{x})-\left(\bm{J}^T\bm{J}+\mu\bm{I}-\mu\bm{I}\right)\Delta\bm{x}\right)\\ &=\frac{1}{2}\Delta\bm{x}^T\left(2\bm{b}-\bm{b}+\mu\bm{I}\Delta\bm{x}\right)\\ &=\frac{1}{2}\Delta\bm{x}^T\left(\bm{b}+\mu\Delta\bm{x}\right) \end{aligned} L(x)L(x+Δx)=ΔxTJTf(x0)21ΔxTJTJΔx=21ΔxT(2JTf(x)(JTJ+μIμI)Δx)=21ΔxT(2bb+μIΔx)=21ΔxT(b+μΔx)

从而我们可以根据当前的 ρ \rho ρ值调节阻尼因子 μ \mu μ,Marquardt和Nielsen分别提出了两种策略,其中Nielsen策略震荡较小,为g2o和Ceres中采用的策略:
{ μ = μ ∗ max ⁡ { 1 3 , 1 − ( 2 ρ − 1 ) 3 } , ν = 2 ; ρ > 0 μ = μ ∗ ν , ν = 2 ∗ ν ; o t h e r w i s e \left\{\begin{aligned} &\mu=\mu*\max\{\frac{1}{3},1-(2\rho-1)^3\},\quad\nu=2;\quad\rho>0\\ &\mu=\mu*\nu,\quad\nu=2*\nu;\quad otherwise \end{aligned}\right. μ=μmax{31,1(2ρ1)3},ν=2;ρ>0μ=μν,ν=2ν;otherwise

鲁棒核函数

鲁棒核函数又称为M-Estimation,其作用是为了防止在残差函数的计算中存在野值(outlier)将估计结果大幅度拉偏,附加鲁棒核函数之后的最小二乘的代价函数变为:
F ( x ) = min ⁡ x 1 2 ∑ k ρ ( ∥ f k ( x ) ∥ 2 ) F(\bm{x})=\min\limits_\bm{x}\frac{1}{2}\sum\limits_k\rho(\|f_k(\bm{x})\|^2) F(x)=xmin21kρ(fk(x)2)

s k = ∥ f k ( x ) ∥ 2 \bm{s}_k=\|f_k(\bm{x})\|^2 sk=fk(x)2,进而对 ρ ( s k ) \rho(\bm{s}_k) ρ(sk)进行二阶泰勒展开并求和,既而求解一阶导数零点,最终可以得到:
∑ k J k T ( ρ ′ I + 2 ρ ′ ′ f k ( x ) f k T ( x ) ) J k Δ x = − ∑ k ρ ′ J k T f k ( x ) ∑ k J k T W k J k Δ x = − ∑ k ρ ′ J k T f k ( x ) \begin{aligned} \sum\limits_k\bm{J}_k^T\left(\rho'\bm{I}+2\rho''f_k(\bm{x})f_k^T(\bm{x})\right)\bm{J}_k\Delta\bm{x}&=-\sum\limits_k\rho'\bm{J}_k^Tf_k(\bm{x})\\ \sum\limits_k\bm{J}_k^TW_k\bm{J}_k\Delta\bm{x}&=-\sum\limits_k\rho'\bm{J}_k^Tf_k(\bm{x}) \end{aligned} kJkT(ρI+2ρfk(x)fkT(x))JkΔxkJkTWkJkΔx=kρJkTfk(x)=kρJkTfk(x)

将上式写成矩阵形式有:
[ J 1 T J 2 T ⋯ J k T ] [ W 1 W 2 ⋱ W k ] [ J 1 J 2 ⋮ J k ] Δ x = − [ ρ 1 ′ J 1 T ρ 2 ′ J 2 T ⋯ ρ k ′ J k T ] [ f 1 ( x ) f 2 ( x ) ⋮ f k ( x ) ] ⇒ J T W J Δ x = − b \footnotesize \begin{aligned} \left[\begin{array}{cccc}\bm{J}_1^T & \bm{J}_2^T & \cdots & \bm{J}_k^T \end{array}\right] \begin{bmatrix} W_1 &&&\\ &W_2&&\\ &&\ddots&\\ &&&W_k \end{bmatrix}\left[\begin{array}{c}\bm{J}_1\\\bm{J}_2\\\vdots\\\bm{J}_k\end{array}\right]\Delta\bm{x}&=-\left[\begin{array}{cccc}\rho'_1\bm{J}_1^T & \rho'_2\bm{J}_2^T & \cdots & \rho'_k\bm{J}_k^T \end{array}\right]\left[\begin{array}{c}f_1(\bm{x})\\f_2(\bm{x})\\\vdots\\f_k(\bm{x})\end{array}\right]\\ \Rightarrow\bm{J}^T\bm{W}\bm{J}\Delta\bm{x}&=-\bm{b} \end{aligned} [J1TJ2TJkT]W1W2WkJ1J2JkΔxJTWJΔx=[ρ1J1Tρ2J2TρkJkT]f1(x)f2(x)fk(x)=b

式中对角矩阵 W \bm{W} W称为鲁棒加权系数矩阵,若 f k ( x ) f_k(x) fk(x)为标量函数,则其对角线元素 W i W_i Wi为标量;若若 f k ( x ) f_k(x) fk(x)为矢量函数,则其对角线元素 W i W_i Wi为对角矩阵。

VIO残差的构建

加权最小二乘代价函数

在基本的最小二乘中,我们认为所有变量的权值是一致的,但在实际应用中,不同的变量对于残差项的影响是不同的,自然我们应该更为相信误差更小的变量,而不相信误差更大的变量,即我们可以通过对不同变量赋予不同的权重以期获得更好的估计效果,这一过程称为加权最小二乘估计,其代价函数如下:
F ( x ) = 1 2 ∑ i = 1 n f ( x ) T Σ − 1 f ( x ) = ∥ f ( x ) ∥ Σ 2 F(\bm{x})=\frac{1}{2}\sum\limits_{i=1}^n\bm{f}(\bm{x})^T\bm{\Sigma}^{-1}\bm{f}(\bm{x})=\|\bm{f}(\bm{x})\|^2_{\bm{\Sigma}} F(x)=21i=1nf(x)TΣ1f(x)=f(x)Σ2

加权估计下的VIO代价函数

VINS_MONO中给出的VIO加权代价函数如下:
ϵ ( χ ) = min ⁡ χ { ∥ r p r i o r − H p r i o r χ ∥ 2 + ∑ k ∈ B ∥ r B ( z ^ k + 1 b k , χ ) ∥ P k + 1 b k 2 + ∑ ( l , j ) ∈ C ρ ( ∥ r C ( z ^ l c j , χ ) ∥ P l c j 2 ) } \begin{aligned} \epsilon\left(\bm{\chi}\right)=\min\limits_{\bm{\chi}}&\left\{\|\bm{r}_{prior}-\bm{H}_{prior}\bm{\chi}\|^2+\sum\limits_{k\in\mathcal{B}}\|\bm{r}_{\mathcal{B}}\left(\hat{\bm{z}}_{k+1}^{b_k},\bm{\chi}\right)\|^2_{\bm{P}_{k+1}^{b_k}}\right.\\ &\left.+\sum\limits_{\left(l,j\right)\in\mathcal{C}}\rho\left(\|\bm{r}_\mathcal{C}\left(\hat{\bm{z}}_l^{c_j},\bm{\chi}\right)\|^2_{\bm{P}_l^{c_j}}\right)\right\} \end{aligned} ϵ(χ)=χmin{rpriorHpriorχ2+kBrB(z^k+1bk,χ)Pk+1bk2+(l,j)Cρ(rC(z^lcj,χ)Plcj2)

式中 ∥ r p r i o r − H p r i o r X ∥ 2 \|\bm{r}_{prior}-\bm{H}_{prior}\bm{X}\|^2 rpriorHpriorX2先验残差,由边缘化给出; ∥ r B ( z ^ k + 1 b k , X ) ∥ P k + 1 b k 2 \|\bm{r}_{\mathcal{B}}\left(\hat{\bm{z}}_{k+1}^{b_k},\bm{X}\right)\|^2_{\bm{P}_{k+1}^{b_k}} rB(z^k+1bk,X)Pk+1bk2 r C ( z ^ l c j , X ) ∥ P l c j 2 \bm{r}_\mathcal{C}\left(\hat{\bm{z}}_l^{c_j},\bm{X}\right)\|^2_{\bm{P}_l^{c_j}} rC(z^lcj,X)Plcj2分别为IMU残差视觉残差;同时,为了减少视觉残差变化过大引起的系统不稳定,使用如下所示的Huber函数 ρ ( s ) \rho\left(s\right) ρ(s)提供阻尼:
ρ ( ⋅ ) = { s s ⩽ 1 2 s − 1 s > 1 \rho\left(\cdot\right)=\left\{\begin{aligned} &s\qquad\qquad s\leqslant1\\ &2\sqrt{s}-1\quad s>1 \end{aligned}\right. ρ()={ss12s 1s>1

逆深度下的视觉重投影误差

记一个空间点 f \bm{f} f相机坐标系 C \bm{C} C下的坐标为 f C i = [ x C i , y C i , z C i ] T \bm{f}^{C_i}=[x^{C_i},y^{C_i},z^{C_i}]^T fCi=[xCi,yCi,zCi]T,则其在归一化相机坐标系 c \bm{c} c下的坐标为 f c i = [ x c i / z c i , y c i / z c i , 1 ] T = [ u c i , v c i , 1 ] T \bm{f}^{c_i}=[x^{c_i}/z^{c_i},y^{c_i}/z^{c_i},1]^T=[u^{c_i},v^{c_i},1]^T fci=[xci/zci,yci/zci,1]T=[uci,vci,1]T,因而我们有:
f C i = z C i f c i = 1 λ f c i \bm{f}^{C_i}=\bm{z}^{C_i}\bm{f}^{c_i}=\frac{1}{\lambda}\bm{f}^{c_i} fCi=zCifci=λ1fci

这里参数 λ \lambda λ由于是深度 z C i \bm{z}^{C_i} zCi的逆,因此称为逆深度。现在我们假设特征点 f \bm{f} f在第 i i i帧下的用逆深度表示的齐次相机坐标为 f C i = [ 1 λ u c i , 1 λ v c i , 1 λ , 1 ] T \bm{f}^{C_i}=[\frac{1}{\lambda}u^{c_i},\frac{1}{\lambda}v^{c_i},\frac{1}{\lambda},1]^T fCi=[λ1uci,λ1vci,λ1,1]T,其在第 j j j帧下的重投影坐标可以表示为:
[ x C j y C j z C j 1 ] = T b c − 1 T w b j − 1 T w b i T b c [ 1 λ u c i 1 λ v c i 1 λ 1 ] \left[\begin{array}{c}x^{C_j} \\ y^{C_j} \\ z^{C_j} \\ 1\end{array}\right]=\bm{T}_{bc}^{-1}\bm{T}_{wb_j}^{-1}\bm{T}_{wb_i}\bm{T}_{bc}\left[\begin{array}{c}\frac{1}{\lambda}u^{c_i} \\ \frac{1}{\lambda}v^{c_i} \\ \frac{1}{\lambda} \\ 1\end{array}\right] xCjyCjzCj1=Tbc1Twbj1TwbiTbcλ1uciλ1vciλ11

进而视觉重投影误差可定义为:
r r e p r o j e c t = [ x C j z C j − u c j y C j z C j − v c j ] \bm{r}_{reproject}=\left[\begin{array}{c}\frac{x^{C_j}}{z^{C_j}}-u^{c_j} \\\frac{y^{C_j}}{z^{C_j}}-v^{c_j}\end{array}\right] rreproject=[zCjxCjucjzCjyCjvcj]

预积分形式的IMU误差

VIO中IMU的误差项通常采用预积分项来描述,具体推导可参见IMU预积分类,这里直接给出中值积分离散后的结果:
{ α \left\{ \bm{\alpha} \right. {α
深蓝学院从零开始手写VIO(二)——VIO中的BA问题_第1张图片

你可能感兴趣的:(从零开始手写VIO)