【VIO】第2讲 基于优化的IMU

第2讲 基于优化的 IMU 与视觉信息融合

1.最小二乘问题求解

(1)最小二乘基础概念

​ 1 定义:找到一个n维的变量 x ∈ R n x \in R^n xRn ,使得损失函数 F ( x ) F(x) F(x) 取得局部最小值:
F ( x ) = 1 2 ∑ i = 1 m ( f i ( x ) ) 2 F(x) = \frac{1}{2} \sum_{i=1}^m (f_i(x))^2 F(x)=21i=1m(fi(x))2

2 cost function 泰勒展开

F ( x + Δ x ) = F ( x ) + J Δ x + 1 2 Δ x T H Δ x + O ( ∣ ∣ Δ x ∣ ∣ 3 ) F(x + \Delta x) = F(x) + J \Delta x + \frac{1}{2} \Delta x^TH \Delta x + O(||\Delta x||^3) F(x+Δx)=F(x)+JΔx+21ΔxTHΔx+O(∣∣Δx3)

​ 3 迭代法

​ 找一个下降方向使得损失函数随x的迭代逐渐减小,直到x收敛到 x ∗ x^* x
F ( x k + 1 ) < F ( x k ) F(x_{k+1}) < F(x_k) F(xk+1)<F(xk)
​ 第一步:找下降方向单位向量 d,第二步:确定下降步长 α \alpha α

​ 假设 α \alpha α 足够小,对 F ( x ) F(x) F(x) 进行一阶泰勒展开:
F ( x + α d ) ≈ F ( x ) + α J d F(x+ \alpha d) \thickapprox F(x) + \alpha Jd F(x+αd)F(x)+αJd
​ 所以只需要寻找下降方向,满足:
J d < 0 Jd < 0 Jd<0

(2)最速下降法和牛顿法

​ 1)最速下降法

​ 下降方向的条件:$Jd = ||J||cos\theta $ , θ \theta θ 表示下降方向和梯度方向的夹角。当 θ = π \theta = \pi θ=π时:
d = − J T ∣ ∣ J ∣ ∣ d = \frac{-J^T}{||J||} d=∣∣J∣∣JT
​ 即梯度的负方向为最速下降方向。

​ 2)牛顿法
J + H Δ x = 0 = > H Δ x = − J J+H \Delta x = 0 \\ => H \Delta x = -J J+HΔx=0=>HΔx=J
​ 求解线性方程,便得到了增量。

​ 3)阻尼法

​ 记:
F ( x + Δ x ) ≈ L ( Δ x ) ≡ F ( x ) + J Δ x + 1 2 Δ x T H Δ x F(x + \Delta x) \thickapprox L(\Delta x) \equiv F(x) + J\Delta x + \frac{1}{2}\Delta x^TH\Delta x F(x+Δx)L(Δx)F(x)+JΔx+21ΔxTHΔx
​ 求以下函数的最小化:
Δ x ≡ a r g    m i n { L ( Δ x ) + 1 2 μ Δ x T Δ x } \Delta x \equiv arg\;min\{L(\Delta x) + \frac{1}{2}\mu \Delta x^T \Delta x \} Δxargmin{L(Δx)+21μΔxTΔx}

求导,并整理:

( H + μ I ) Δ x = − J T (H + \mu I) \Delta x = -J^T (H+μI)Δx=JT

(3)高斯牛顿法

( J T J ) Δ x = − J T f = > H Δ x = b (J^TJ)\Delta x = -J^T f \\ => H \Delta x = b (JTJ)Δx=JTf=>HΔx=b

(4)LM

​ 对高斯牛顿法进行了改进,求解过程中引入了阻尼因子:
( J T J + μ I ) Δ x = − J T f              μ > 0 (J^TJ + \mu I)\Delta x = -J^Tf \;\;\;\;\;\; \mu > 0 (JTJ+μI)Δx=JTfμ>0
​ 阻尼因子 μ \mu μ 的作用:

​ 1 μ > 0 \mu > 0 μ>0 保证迭代朝着下降方向

​ 2 μ \mu μ 非常大,则 Δ x = − 1 μ J T f = − 1 μ F ′ ( x ) T \Delta x = -\frac{1}{\mu} J^T f = -\frac{1}{\mu}F^ \prime (x)^T Δx=μ1JTf=μ1F(x)T,接近最速下降法

​ 3 μ \mu μ 非常小,则 接近高斯牛顿法

​ 简单的 μ 0 \mu_0 μ0 初始值选取策略:
μ 0 = τ    m a x { ( J T J ) i i } \mu_0 = \tau \;max\{(J^TJ)_{ii} \} μ0=τmax{(JTJ)ii}
​ 通常, τ ∈ [ 1 0 − 8 , 1 ] \tau \in [10^{-8}, 1] τ[108,1]

​ 阻尼因子 μ \mu μ 的更新策略:

​ 定义比例因子
ρ = F ( x ) − F ( x + Δ x ) L ( 0 ) − L ( Δ x ) L ( 0 ) − L ( Δ x ) = 1 2 Δ x T ( μ Δ x − J T f ) \rho = \frac{F(x) - F(x + \Delta x)}{L(0) - L(\Delta x)} \\ L(0) - L(\Delta x) = \frac{1}{2}\Delta x^T(\mu \Delta x - J^Tf) ρ=L(0)L(Δx)F(x)F(x+Δx)L(0)L(Δx)=21ΔxT(μΔxJTf)
​ Marquardt 策略
i f      ρ < 0.25 μ : = u ∗ 2 e l s e      i f      ρ > 0.75 μ : = μ / 3 if \;\; \rho < 0.25 \\ \mu :=u * 2 \\ else\;\; if\;\;\rho > 0.75\\ \mu :=\mu/3 ifρ<0.25μ:=u2elseifρ>0.75μ:=μ/3
​ Nielsen策略
i f      ρ > 0 μ : = u ∗ m a x { 1 3 , 1 − ( 2 ρ − 1 ) 3 } ;      v : = 2 e l s e                    μ : = μ ∗ 3 ; v : = 2 ∗ v if \;\; \rho > 0\\ \mu :=u * max\{\frac{1}{3}, 1-(2\rho-1)^3 \}; \;\; v :=2\\ else\;\;\;\;\;\;\;\;\;\\ \mu :=\mu * 3; v:=2*v ifρ>0μ:=umax{31,1(2ρ1)3};v:=2elseμ:=μ3;v:=2v
​ Nielsen策略实现代码:

/// LM
void Problem::ComputeLambdaInitLM() {
    ni_ = 2.;
    currentLambda_ = -1.;
    currentChi_ = 0.0;
    // TODO:: robust cost chi2
    for (auto edge: edges_) {
        currentChi_ += edge.second->Chi2();
    }
    if (err_prior_.rows() > 0)
        currentChi_ += err_prior_.norm();

    stopThresholdLM_ = 1e-6 * currentChi_;          // 迭代条件为 误差下降 1e-6 倍

    double maxDiagonal = 0;
    ulong size = Hessian_.cols();
    assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");
    for (ulong i = 0; i < size; ++i) {
        maxDiagonal = std::max(fabs(Hessian_(i, i)), maxDiagonal);
    }
    double tau = 1e-5;
    currentLambda_ = tau * maxDiagonal;
}

void Problem::AddLambdatoHessianLM() {
    ulong size = Hessian_.cols();
    assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");
    for (ulong i = 0; i < size; ++i) {
        Hessian_(i, i) += currentLambda_;
    }
}

void Problem::RemoveLambdaHessianLM() {
    ulong size = Hessian_.cols();
    assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");
    // TODO:: 这里不应该减去一个,数值的反复加减容易造成数值精度出问题?而应该保存叠加lambda前的值,在这里直接赋值
    for (ulong i = 0; i < size; ++i) {
        Hessian_(i, i) -= currentLambda_;
    }
}

bool Problem::IsGoodStepInLM() {
    double scale = 0;
    scale = delta_x_.transpose() * (currentLambda_ * delta_x_ + b_);
    scale += 1e-3;    // make sure it's non-zero :)

    // recompute residuals after update state
    // 统计所有的残差
    double tempChi = 0.0;
    for (auto edge: edges_) {
        edge.second->ComputeResidual();
        tempChi += edge.second->Chi2();
    }

    double rho = (currentChi_ - tempChi) / scale;
    if (rho > 0 && isfinite(tempChi))   // last step was good, 误差在下降
    {
        double alpha = 1. - pow((2 * rho - 1), 3);
        alpha = std::min(alpha, 2. / 3.);
        double scaleFactor = (std::max)(1. / 3., alpha);
        currentLambda_ *= scaleFactor;
        ni_ = 2;
        currentChi_ = tempChi;
        return true;
    } else {
        currentLambda_ *= ni_;
        ni_ *= 2;
        return false;
    }
}
(5)鲁棒核函数

2. VIO残差函数的构建

(1)系统需要优化的状态量

χ = [ x n , x n + 1 , ⋯   , x n + N , λ m , λ m + 1 , λ m + M ] x i = [ p w b i , q w b i , v i w , b a b i , b g b i ] , i ∈ [ n , n + N ] \chi = [x_n, x_{n+1}, \cdots, x_{n+N}, \lambda_m, \lambda_{m+1}, \lambda_{m+M}]\\ x_i = [p_{wb_i}, q_{wb_i}, v_i^w, b_a^{b_i}, b_g^{b_i}] , i \in[n, n+N] χ=[xn,xn+1,,xn+N,λm,λm+1,λm+M]xi=[pwbi,qwbi,viw,babi,bgbi]i[n,n+N]

其中: x i x_i xi 包含 i i i 时刻IMU机体在惯性坐标系中的位置,姿态,速度以及IMU机体坐标系中的加速度和角速度的偏置量估计;

n , m n, m n,m 分别是机体状态量,路标在滑动窗口里的起始时刻;

​ N 滑动窗口中关键帧数量;

​ M 被滑动窗口内所有关键帧观测到的;路标数量。

(2)基于逆深度的重投影误差

​ 特征点逆深度在第 i i i 帧中初始化得到,在第 j j j 帧又被观测到,预测其在第 j j j 帧中的坐标:
[ x c j , y c j , z c j , 1 ] T = 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 ] T [x_{c_j}, y_{c_j}, z_{c_j}, 1]^T = T_{bc}^{-1} T_{wb_j}^{-1} T_{wb_i}T_{bc}[\frac{1}{\lambda}u_{c_i}, \frac{1}{\lambda}v_{c_i}, \frac{1}{\lambda}, 1]^T [xcj,ycj,zcj,1]T=Tbc1Twbj1TwbiTbc[λ1uci,λ1vci,λ1,1]T
​ 思考公式的含义:本质上还是相机那一套,只不过IMU的 body 坐标系充当了一个桥梁的作用。(上个时刻的计算得到的像素坐标通过上个时刻的逆深度来估计此时刻的3维世界坐标值)

(3)IMU预积分

p w b j = p w b i + v i w Δ t − 1 2 g w Δ t 2 + q w b i ∬ t ∈ [ i , j ] ( q b i b t a b t ) δ t 2 ⏟ α \mathbf{p}_{w b_{j}}=\mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \underbrace{\iint_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t^{2}}_{\mathbf{\alpha}} pwbj=pwbi+viwΔt21gwΔt2+qwbiα t[i,j](qbibtabt)δt2

v j w = v i w − g w Δ t + q w b i ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t ⏟ β \mathbf{v}_{j}^{w}=\mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}}\underbrace{\int_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t}_{\mathbf{\beta}} vjw=viwgwΔt+qwbiβ t[i,j](qbibtabt)δt

q w b j = q w b i ∫ t ∈ [ i , j ] q b i b t ⊗ [ 0 1 2 ω b t ] δ t ⏟ γ \mathbf{q}_{w b_{j}}=\mathbf{q}_{w b_{i}}\underbrace{\int_{t \in[i, j]} \mathbf{q}_{b_{i} b_{t}} \otimes\left[\begin{array}{c}0 \\ \frac{1}{2} \boldsymbol{\omega}^{b_{t}}\end{array}\right] \delta t}_{\mathbf{\gamma}} qwbj=qwbiγ t[i,j]qbibt[021ωbt]δt

​ 预积分量:
α b i b j = ∬ t ∈ [ i , j ] ( q b i b t a b t ) δ t 2 \boldsymbol{\alpha}_{b_{i} b_{j}}=\iint_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t^{2} αbibj=t[i,j](qbibtabt)δt2

β b i b j = ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t \boldsymbol{\beta}_{b_{i} b_{j}}=\int_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t βbibj=t[i,j](qbibtabt)δt

q b i b j = ∫ t ∈ [ i , j ] q b i b t ⊗ [ 0 1 2 ω b t ] δ t \mathbf{q}_{b_{i} b_{j}}=\int_{t \in[i, j]} \mathbf{q}_{b_{i} b_{t}} \otimes \left[ \begin{array}{c} 0 \\ \frac{1}{2} \boldsymbol{\omega}^{b_{t}} \end{array} \right] \delta t qbibj=t[i,j]qbibt[021ωbt]δt

​ 基于预积分量的导航状态更新公式:

[ p w b j v j w q w b j b j a b j g ] = [ p w b i + v i w Δ t − 1 2 g w Δ t 2 + q w b i α b i b j v i w − g w Δ t + q w b i β b i b j q w b i q b i b j b i a b i g ] \left[ \begin{array}{c} \mathbf{p}_{w b_{j}} \\ \mathbf{v}_{j}^{w} \\ \mathbf{q}_{w b_{j}} \\ \mathbf{b}_{j}^{a} \\ \mathbf{b}_{j}^{g} \end{array} \right] =\left[ \begin{array}{c} \mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ \mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{q}_{w b_{i}} \mathbf{q}_{b_{i} b_{j}} \\ \mathbf{b}_{i}^{a} \\ \mathbf{b}_{i}^{g} \end{array} \right] pwbjvjwqwbjbjabjg = pwbi+viwΔt21gwΔt2+qwbiαbibjviwgwΔt+qwbiβbibjqwbiqbibjbiabig

(4)预积分误差
(5)预积分的离散形式

​ 采用中值积分法
ω = 1 2 [ ( ω b k − b k g ) + ( ω b k + 1 − b k g ) ] \boldsymbol{\omega}=\frac{1}{2}\left[\left(\boldsymbol{\omega}^{b_{k}}-\mathbf{b}_{k}^{g}\right)+\left(\boldsymbol{\omega}^{b_{k+1}}-\mathbf{b}_{k}^{g}\right)\right] ω=21[(ωbkbkg)+(ωbk+1bkg)]

a = 1 2 [ q b i b k ( a b k − b k a ) + q b i b k + 1 ( a b k + 1 − b k a ) ] \mathbf{a}=\frac{1}{2}\left[\mathbf{q}_{b_{i} b_{k}}\left(\mathbf{a}^{b_{k}}-\mathbf{b}_{k}^{a}\right)+\mathbf{q}_{b_{i} b_{k+1}}\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] a=21[qbibk(abkbka)+qbibk+1(abk+1bka)]

α b i b k + 1 = α b i b k + β b i b k δ t + 1 2 a δ t 2 \boldsymbol{\alpha}_{b_{i} b_{k+1}}=\boldsymbol{\alpha}_{b_{i} b_{k}}+\boldsymbol{\beta}_{b_{i} b_{k}} \delta t+\frac{1}{2} \mathbf{a} \delta t^{2} αbibk+1=αbibk+βbibkδt+21aδt2

β b i b k + 1 = β b i b k + a δ t \boldsymbol{\beta}_{b_{i} b_{k+1}}=\boldsymbol{\beta}_{b_{i} b_{k}}+\mathbf{a} \delta t βbibk+1=βbibk+aδt

q b i b k + 1 = q b i b k ⊗ [ 1 1 2 ω δ t ] \mathbf{q}_{b_{i} b_{k+1}}=\mathbf{q}_{b_{i} b_{k}} \otimes \left[ \begin{array}{c} 1 \\ \frac{1}{2} \boldsymbol{\omega} \delta t \end{array} \right] qbibk+1=qbibk[121ωδt]

b k + 1 a = b k a + n b k a δ t b_{k+1}^a = b_k^a + n_{b_k^a} \delta t bk+1a=bka+nbkaδt

b k + 1 g = b k g + n b k g δ t b_{k+1}^g = b_k^g + n_{b_k^g} \delta t bk+1g=bkg+nbkgδt

(6)预积分量的方差

误差的传递由两部分组成:当前时刻的误差传递给下一时刻,当前时刻的测量噪声传递给下一时刻。

假设已知相邻时刻误差的线性传递方程:
η i k = F k − 1 η i k − 1 + G k − 1 n k − 1 \eta_{ik} = F_{k-1}\eta_{ik-1} + G_{k-1}n_{k-1} ηik=Fk1ηik1+Gk1nk1
其中:状态误差为 η i k = [ δ θ i k , δ v i k , δ p i k ] \eta_{ik} = [\delta \theta_{ik}, \delta v_{ik}, \delta p_{ik}] ηik=[δθik,δvik,δpik],测量噪声为 n k = [ n K g , n k a ] n_k = [n_K^g, n_k^a] nk=[nKg,nka]

预积分量的协方差矩阵通过递推得到:
Σ i , k = F k − 1 Σ i , k − 1 F k − 1 ⊤ + G k − 1 Σ n G k − 1 ⊤ \boldsymbol{\Sigma}_{i, k}=\mathbf{F}_{k-1} \boldsymbol{\Sigma}_{i, k-1} \mathbf{F}_{k-1}^{\top}+\mathbf{G}_{k-1} \boldsymbol{\Sigma_n} \mathbf{G}_{k-1}^{\top} Σi,k=Fk1Σi,k1Fk1+Gk1ΣnGk1
​ 其中: Σ n \Sigma_n Σn 为测量噪声的协方差矩阵,方差从 i i i 时刻开始递推,F,G是离散时间下的状态转移矩阵

​ 现在需要求F和G

(7)预积分微分方程

​ 基于误差时间变化的递推方程

​ 已知连续时间下的微分方程形式为:
X ˙ = F t X + G t N \dot{\boldsymbol{X}}=\boldsymbol{F}_{t} \boldsymbol{X}+\boldsymbol{G}_{t} \boldsymbol{N} X˙=FtX+GtN
其中:
X = [ δ α t b k δ θ t b k δ β t b k δ b a t δ b w t ] \boldsymbol{X}= \left[ \begin{array}{l} \delta \boldsymbol{\alpha}_{t}^{b_{k}} \\ \delta \boldsymbol{\theta}_{t}^{b_{k}} \\ \delta \boldsymbol{\beta}_{t}^{b_{k}} \\ \delta \boldsymbol{b}_{a_{t}} \\ \delta \boldsymbol{b}_{w_{t}} \end{array} \right] X= δαtbkδθtbkδβtbkδbatδbwt

N = [ n a n w n b a n b w ] \boldsymbol{N}= \left[ \begin{array}{l} \boldsymbol{n}_{a} \\ \boldsymbol{n}_{w} \\ \boldsymbol{n}_{b_{a}} \\ \boldsymbol{n}_{b_{w}} \end{array} \right] N= nanwnbanbw

​ 不推了,暂时只记结论:
δ θ ˙ = − [ ω t − b ω t ] × δ θ + n ω − δ b ω t \delta \dot{\boldsymbol{\theta}}=-\left[\boldsymbol{\omega}_{t}-\boldsymbol{b}_{\omega_{t}}\right]_{\times} \delta \boldsymbol{\theta}+\boldsymbol{n}_{\omega}-\delta \boldsymbol{b}_{\omega_{t}} δθ˙=[ωtbωt]×δθ+nωδbωt

δ β ˙ = R t [ δ θ ] × ( a t − b a t ) + R t ( n a − δ b a t ) = − R t [ a t − b a t ] × δ θ + R t ( n a − δ b a t ) \begin{aligned}\delta \dot{\boldsymbol{\beta}}=\boldsymbol{R}_{t}[\delta \boldsymbol{\theta}]_{\times}\left(\boldsymbol{a}_{t}-\boldsymbol{b}_{a_{t}}\right)+\boldsymbol{R}_{t}\left(\boldsymbol{n}_{a}-\delta \boldsymbol{b}_{a_{t}}\right) \\ =-\boldsymbol{R}_{t}\left[\boldsymbol{a}_{t}-\boldsymbol{b}_{a_{t}}\right]_{\times} \delta \boldsymbol{\theta}+\boldsymbol{R}_{t}\left(\boldsymbol{n}_{a}-\delta \boldsymbol{b}_{a_{t}}\right) \end{aligned} δβ˙=Rt[δθ]×(atbat)+Rt(naδbat)=Rt[atbat]×δθ+Rt(naδbat)

δ α ˙ = δ β \delta \dot{\boldsymbol{\alpha}}=\delta \boldsymbol{\beta} δα˙=δβ

(8)预积分离散时间递推方程

X k + 1 = F k X k + G k N k \boldsymbol{X}_{k+1}=\boldsymbol{F}_{k} \boldsymbol{X}_{k}+\boldsymbol{G}_{k} \boldsymbol{N}_{k} Xk+1=FkXk+GkNk

其中:
X k + 1 = [ δ α k + 1 δ θ k + 1 δ β k + 1 δ b a k + 1 δ b ω k + 1 ] X k = [ δ α k δ θ k δ β k δ b a k δ b ω k ] N k = [ n a k n w k n a k + 1 n w k + 1 n b a n b w ] \boldsymbol{X}_{k+1}=\left[\begin{array}{c} \delta \boldsymbol{\alpha}_{k+1} \\ \delta \boldsymbol{\theta}_{k+1} \\ \delta \boldsymbol{\beta}_{k+1} \\ \delta \boldsymbol{b}_{a_{k+1}} \\ \delta \boldsymbol{b}_{\omega_{k+1}} \end{array}\right] \quad \boldsymbol{X}_{k}=\left[\begin{array}{c} \delta \boldsymbol{\alpha}_{k} \\ \delta \boldsymbol{\theta}_{k} \\ \delta \boldsymbol{\beta}_{k} \\ \delta \boldsymbol{b}_{a_{k}} \\ \delta \boldsymbol{b}_{\omega_{k}} \end{array}\right] \quad \boldsymbol{N}_{k}=\left[\begin{array}{c} \boldsymbol{n}_{a_{k}} \\ \boldsymbol{n}_{w_{k}} \\ \boldsymbol{n}_{a_{k+1}} \\ \boldsymbol{n}_{w_{k+1}} \\ \boldsymbol{n}_{b_{a}} \\ \boldsymbol{n}_{b_{w}} \end{array}\right] Xk+1= δαk+1δθk+1δβk+1δbak+1δbωk+1 Xk= δαkδθkδβkδbakδbωk Nk= naknwknak+1nwk+1nbanbw
​ 结论:
δ θ k + 1 = [ I − [ ω ‾ ] × δ t ] δ θ k + δ t 2 n ω k + δ t 2 n ω k + 1 − δ t δ b ω k \delta \boldsymbol{\theta}_{k+1}=\left[\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right] \delta \boldsymbol{\theta}_{k}+\frac{\delta t}{2} \boldsymbol{n}_{\omega_{k}}+\frac{\delta t}{2} \boldsymbol{n}_{\omega_{k+1}}-\delta t \delta \boldsymbol{b}_{\omega_{k}} δθk+1=[I[ω]×δt]δθk+2δtnωk+2δtnωk+1δtδbωk

δ α k + 1 = δ α k + δ α ˙ k δ t = δ α k + δ t δ β k − δ t 2 4 [ R k [ a k − b a k ] × + R k + 1 [ a k + 1 − b a k ] × ( I − [ ω ‾ ] × δ t ) ] δ θ k − δ t 3 8 R k + 1 [ a k + 1 − b a k ] × n ω k − δ t 3 8 R k + 1 [ a k + 1 − b a k ] × n ω k + 1 + δ t 3 4 R k + 1 [ a k + 1 − b a k ] × δ b ω k + δ t 2 4 R k n a k + δ t 2 4 R k + 1 n a k + 1 − δ t 2 4 ( R k + R k + 1 ) δ b a k \begin{aligned} \delta \boldsymbol{\alpha}_{k+1}= & \enspace \delta \boldsymbol{\alpha}_{k} + \delta \dot{\boldsymbol{\alpha}}_{k} \delta t \\ =& \enspace \delta \boldsymbol{\alpha}_{k} +\delta t \delta \boldsymbol{\beta}_{k} \\ &-\frac{\delta t^{2}}{4}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \delta \boldsymbol{\theta}_{k} \\ &-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k}} \\ &-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k+1}} \\ &+\frac{\delta t^{3}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &+\frac{\delta t^{2}}{4} \boldsymbol{R}_{k} \boldsymbol{n}_{a_{k}} \\ &+\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1} \boldsymbol{n}_{a_{k+1}} \\ &-\frac{\delta t^{2}}{4}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta \boldsymbol{b}_{a_{k}} \end{aligned} δαk+1==δαk+δα˙kδtδαk+δtδβk4δt2[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]δθk8δt3Rk+1[ak+1bak]×nωk8δt3Rk+1[ak+1bak]×nωk+1+4δt3Rk+1[ak+1bak]×δbωk+4δt2Rknak+4δt2Rk+1nak+14δt2(Rk+Rk+1)δbak

δ β k + 1 = δ β k + δ β ˙ k δ t = δ β k − δ t 2 [ R k [ a k − b a k ] × + R k + 1 [ a k + 1 − b a k ] × ( I − [ ω ‾ ] × δ t ) ] δ θ k − δ t 2 4 R k + 1 [ a k + 1 − b a k ] × n ω k − δ t 2 4 R k + 1 [ a k + 1 − b a k ] × n ω k + 1 + δ t 2 2 R k + 1 [ a k + 1 − b a k ] × δ b ω k + δ t 2 R k n a k + δ t 2 R k + 1 n a k + 1 − δ t 2 ( R k + R k + 1 ) δ b a k \begin{aligned} \delta \boldsymbol{\beta}_{k+1} = & \enspace \delta \boldsymbol{\beta}_{k} + \delta \dot{\boldsymbol{\beta}}_{k} \delta t \\ =& \enspace \delta \boldsymbol{\beta}_{k} \\ &-\frac{\delta t}{2}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \delta \boldsymbol{\theta}_{k} \\ &-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k}} \\ &-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k+1}} \\ &+\frac{\delta t^{2}}{2} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &+\frac{\delta t}{2} \boldsymbol{R}_{k} \boldsymbol{n}_{a_{k}} \\ &+\frac{\delta t}{2} \boldsymbol{R}_{k+1} \boldsymbol{n}_{a_{k+1}} \\ &-\frac{\delta t}{2}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta \boldsymbol{b}_{a_{k}} \end{aligned} δβk+1==δβk+δβ˙kδtδβk2δt[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]δθk4δt2Rk+1[ak+1bak]×nωk4δt2Rk+1[ak+1bak]×nωk+1+2δt2Rk+1[ak+1bak]×δbωk+2δtRknak+2δtRk+1nak+12δt(Rk+Rk+1)δbak

(9)F,G

F k = [ I f 12 I δ t − 1 4 ( R k + R k + 1 ) δ t 2 f 15 0 I − [ ω ‾ ] × δ t 0 0 − I δ t 0 f 32 I − 1 2 ( R k + R k + 1 ) δ t f 35 0 0 0 I 0 0 0 0 0 I ] \mathbf{F}_{k}=\left[\begin{array}{ccccc} \mathbf{I} & \mathbf{f}_{12} & \mathbf{I} \delta t & -\frac{1}{4}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta t^{2} & \mathbf{f}_{15} \\ \mathbf{0} & \mathbf{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t & \mathbf{0} & \mathbf{0} & -\mathbf{I} \delta t \\ \mathbf{0} & \mathbf{f}_{32} & \mathbf{I} & -\frac{1}{2}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta t & \mathbf{f}_{35} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \end{array}\right] Fk= I0000f12I[ω]×δtf3200Iδt0I0041(Rk+Rk+1)δt2021(Rk+Rk+1)δtI0f15Iδtf350I

f 12 = − δ t 2 4 [ R k [ a k − b a k ] × + R k + 1 [ a k + 1 − b a k ] × ( I − [ ω ‾ ] × δ t ) ] f 15 = δ t 3 4 R k + 1 [ a k + 1 − b a k ] × δ b ω k f 32 = − δ t 2 [ R k [ a k − b a k ] × + R k + 1 [ a k + 1 − b a k ] × ( I − [ ω ‾ ] × δ t ) ] f 35 = δ t 2 2 R k + 1 [ a k + 1 − b a k ] × \begin{aligned} &\boldsymbol{f}_{12}=-\frac{\delta t^{2}}{4}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \\ &\boldsymbol{f}_{15}=\frac{\delta t^{3}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &\boldsymbol{f}_{32}=-\frac{\delta t}{2}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \\ &\boldsymbol{f}_{35}=\frac{\delta t^{2}}{2} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \end{aligned} f12=4δt2[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]f15=4δt3Rk+1[ak+1bak]×δbωkf32=2δt[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]f35=2δt2Rk+1[ak+1bak]×

G k = [ 1 4 R k δ t 2 g 12 1 4 R k + 1 δ t 2 g 14 0 a m p ; 0 0 1 2 I δ t 0 1 2 I δ t 0 0 1 2 R k δ t g 32 1 2 R k + 1 δ t g 34 0 0 0 0 0 0 I δ t 0 0 0 0 0 0 I δ t ] \mathbf{G}_{k}=\left[\begin{array}{cccccc} \frac{1}{4} \boldsymbol{R}_{k} \delta t^{2} & \mathbf{g}_{12} & \frac{1}{4} \boldsymbol{R}_{k+1} \delta t^{2} & \mathbf{g}_{14} & \mathbf{0} &amp; \mathbf{0} \\ \mathbf{0} & \frac{1}{2} \mathbf{I} \delta t & \mathbf{0} & \frac{1}{2} \mathbf{I} \delta t & \mathbf{0} & \mathbf{0} \\ \frac{1}{2} \boldsymbol{R}_{k} \delta t & \mathbf{g}_{32} & \frac{1}{2} \boldsymbol{R}_{k+1} \delta t & \mathbf{g}_{34} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \delta t & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \delta t \end{array}\right] Gk= 41Rkδt2021Rkδt00g1221Iδtg320041Rk+1δt2021Rk+1δt00g1421Iδtg3400000Iδt0amp;0000Iδt

g 12 = − δ t 3 8 R k + 1 [ a k + 1 − b a k ] × g 14 = − δ t 3 8 R k + 1 [ a k + 1 − b a k ] × g 32 = − δ t 2 4 R k + 1 [ a k + 1 − b a k ] × g 34 = − δ t 2 4 R k + 1 [ a k + 1 − b a k ] × \begin{aligned} &\boldsymbol{g}_{12}=-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{14}=-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{32}=-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{34}=-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \end{aligned} g12=8δt3Rk+1[ak+1bak]×g14=8δt3Rk+1[ak+1bak]×g32=4δt2Rk+1[ak+1bak]×g34=4δt2Rk+1[ak+1bak]×

计算得到矩阵 F k F_k Fk G k G_k Gk后,即可按照上述公式来计算方差。

3.预积分残差关于待求状态量的雅可比

在优化时,需要求出残差对于求解的状态量的雅可比。

已知基于预积分量的状态更新如下:
[ p w b j q w b j v j w b j a b j g ] = [ p w b i + v i w Δ t − 1 2 g w Δ t 2 + q w b i α b i b j q w b i q b i b j v i w − g w Δ t + q w b i β b i b j b i a b i g ] \left[\begin{array}{c} \mathbf{p}_{w b_{j}} \\ \mathbf{q}_{w b_{j}} \\ \mathbf{v}_{j}^{w} \\ \mathbf{b}_{j}^{a} \\ \mathbf{b}_{j}^{g} \end{array}\right]=\left[\begin{array}{c} \mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ \mathbf{q}_{w b_{i}} \mathbf{q}_{b_{i} b_{j}} \\ \mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{b}_{i}^{a} \\ \mathbf{b}_{i}^{g} \end{array}\right] pwbjqwbjvjwbjabjg = pwbi+viwΔt21gwΔt2+qwbiαbibjqwbiqbibjviwgwΔt+qwbiβbibjbiabig
把上式左侧状态移到右侧,在理想的情况下左侧应该只剩下0,但是由于误差的存在,可以使用残差小量r代替,因此有:
[ r p r q r v r b a r b g ] = [ p w b j − p w b i − v i w Δ t + 1 2 g w Δ t 2 − q w b i α b i b j 2 [ q b i b j ∗ ⊗ ( q w b i ∗ ⊗ q w b j ) ] x y z v j w − v i w + g w Δ t − q w b i β b i b j b j a − b i a b j g − b i g ] \left[\begin{array}{c} \mathbf{r}_{p} \\ \mathbf{r}_{q} \\ \mathbf{r}_{v} \\ \mathbf{r}_{b a} \\ \mathbf{r}_{b g} \end{array}\right]=\left[\begin{array}{c} \mathbf{p}_{w b_{j}}-\mathbf{p}_{w b_{i}}-\mathbf{v}_{i}^{w} \Delta t+\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}-\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ 2\left[\mathbf{q}_{b_{i} b_{j}}^{*} \otimes\left(\mathbf{q}_{w b_{i}}^{*} \otimes \mathbf{q}_{w b_{j}}\right)\right]_{x y z} \\ \mathbf{v}_{j}^{w}-\mathbf{v}_{i}^{w}+\mathbf{g}^{w} \Delta t-\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{b}_{j}^{a}-\mathbf{b}_{i}^{a} \\ \mathbf{b}_{j}^{g}-\mathbf{b}_{i}^{g} \end{array}\right] rprqrvrbarbg = pwbjpwbiviwΔt+21gwΔt2qwbiαbibj2[qbibj(qwbiqwbj)]xyzvjwviw+gwΔtqwbiβbibjbjabiabjgbig
更加复杂。。。。

练习2

样例代码给出使用LM算法估计曲线 y = e ( a x 2 + b x + c ) y = e^{(ax^2 + bx +c)} y=e(ax2+bx+c) 参数a,b,c 的完整过程。

(1)绘制样例代码中LM阻尼因子 μ \mu μ 随迭代变化的曲线图。

​ 运行代码,即可看到输出,将结果导入matlab即可绘制图象

(2)将曲线函数改成 y = ( a x 2 + b x + c ) y = (ax^2 + bx +c) y=(ax2+bx+c) 修改代码

(3)其他阻尼因子更新策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值