从零手写VIO第三讲作业(LM算法和IMU误差传递)

4 篇文章 0 订阅

一、非线性最小二乘问题

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

1.1 GN(高斯牛顿)算法

残差函数 f ( x ) \mathbf{f}(\mathbf{x}) f(x)为非线性函数,对其一阶泰勒近似有:
f ( x + Δ x ) ≈ ℓ ( Δ x ) ≡ f ( x ) + J Δ x \mathbf{f}(\mathbf{x}+\Delta \mathbf{x}) \approx \ell(\Delta \mathbf{x}) \equiv \mathbf{f}(\mathbf{x})+\mathbf{J} \Delta \mathbf{x} f(x+Δx)(Δx)f(x)+JΔx
请特别注意,这里的 J 是残差函数 f 的雅克比矩阵。代入损失函数:
F ( x + Δ x ) ≈ L ( Δ x ) ≡ 1 2 ℓ ( Δ x ) ⊤ ℓ ( Δ x ) = 1 2 f ⊤ f + Δ x ⊤ J ⊤ f + 1 2 Δ x ⊤ J ⊤ J Δ x = F ( x ) + Δ x ⊤ J ⊤ f + 1 2 Δ x ⊤ J ⊤ J Δ x ( 1 ) \begin{aligned} F(\mathbf{x}+\Delta \mathbf{x}) \approx L(\Delta \mathbf{x}) & \equiv \frac{1}{2} \ell(\Delta \mathbf{x})^{\top} \ell(\Delta \mathbf{x}) \\ &=\frac{1}{2} \mathbf{f}^{\top} \mathbf{f}+\Delta \mathbf{x}^{\top} \mathbf{J}^{\top} \mathbf{f}+\frac{1}{2} \Delta \mathbf{x}^{\top} \mathbf{J}^{\top} \mathbf{J} \Delta \mathbf{x} \\ &=F(\mathbf{x})+\Delta \mathbf{x}^{\top} \mathbf{J}^{\top} \mathbf{f}+\frac{1}{2} \Delta \mathbf{x}^{\top} \mathbf{J}^{\top} \mathbf{J} \Delta \mathbf{x} \end{aligned} (1) F(x+Δx)L(Δx)21(Δx)(Δx)=21ff+ΔxJf+21ΔxJJΔx=F(x)+ΔxJf+21ΔxJJΔx1
若直接对损失函数进行二阶泰勒展开,有
F ( x + Δ x ) ≈ L ( Δ x ) ≡ F ( x ) + J Δ x + 1 2 Δ x ⊤ H Δ x ( 2 ) F(\mathbf{x}+\Delta \mathbf{x}) \approx L(\Delta \mathbf{x}) \equiv F(\mathbf{x})+\mathbf{J} \Delta \mathbf{x}+\frac{1}{2} \Delta \mathbf{x}^{\top} \mathbf{H} \Delta \mathbf{x} (2) F(x+Δx)L(Δx)F(x)+JΔx+21ΔxHΔx2
对上述两式对比,易得
F ′ ( x ) = ( J ⊤ f ) ⊤ ,  以及  F ′ ′ ( x ) ≈ J ⊤ J F^{\prime}(\mathbf{x})=\left(\mathbf{J}^{\top} \mathbf{f}\right)^{\top}, \text { 以及 } F^{\prime \prime}(\mathbf{x}) \approx \mathbf{J}^{\top} \mathbf{J} F(x)=(Jf), 以及 F(x)JJ
令公式(1)的一阶导等于0,得到:
( J ⊤ J ) Δ x g n = − J ⊤ f ( 3 ) \left(\mathbf{J}^{\top} \mathbf{J}\right) \Delta \mathbf{x}_{\mathrm{gn}}=-\mathbf{J}^{\top} \mathbf{f} (3) (JJ)Δxgn=Jf3
GN法由此计算步长

GN法存在的问题:

1.GN法利用了函数的二阶近似,若二次函数在某点附近不能很好拟合原函数,则步长计算方式不合理
2. J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ为半正定矩阵,若 J J J不满秩,即 ∣ J ∣ = 0 |J|=0 J=0,则 J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ不可逆,则不能求出步长。

1.2 LM算法

LM算法为在GN算法的基础上添加阻尼因子 μ \mu μ
( J ⊤ J + μ I ) Δ x lm ⁡ = − J ⊤ f  with  μ ≥ 0 \left(\mathbf{J}^{\top} \mathbf{J}+\mu \mathbf{I}\right) \Delta \mathbf{x}_{\operatorname{lm}}=-\mathbf{J}^{\top} \mathbf{f} \quad \text { with } \mu \geq 0 (JJ+μI)Δxlm=Jf with μ0

阻尼因子作用:
μ > 0  保证  ( J ⊤ J + μ I )  正定,迭代朝着下降方向进行。  μ  非常大,则  Δ x l m = − 1 μ J ⊤ f = − 1 μ F ′ ( x ) ⊤ ,  接近最速下降法.  μ  比较小,则  Δ x I m ≈ Δ x g n ,  接近高斯牛顿法。  \begin{aligned} &\mu>0 \text { 保证 }\left(\mathbf{J}^{\top} \mathbf{J}+\mu \mathbf{I}\right) \text { 正定,迭代朝着下降方向进行。 }\\ &\mu \text { 非常大,则 } \Delta \mathbf{x}_{\mathrm{lm}}=-\frac{1}{\mu} \mathbf{J}^{\top} \mathbf{f}=-\frac{1}{\mu} F^{\prime}(\mathbf{x})^{\top}, \text { 接近最速下降法. }\\ &\mu \text { 比较小,则 } \Delta \mathbf{x}_{\mathrm{Im}} \approx \Delta \mathbf{x}_{\mathrm{gn}}, \text { 接近高斯牛顿法。 } \end{aligned} μ>0 保证 (JJ+μI) 正定,迭代朝着下降方向进行。 μ 非常大,则 Δxlm=μ1Jf=μ1F(x), 接近最速下降法μ 比较小,则 ΔxImΔxgn, 接近高斯牛顿法。 
阻尼因子更新策略通过比例因子来确定的:
ρ = F ( x ) − F ( x + Δ x l m ) L ( 0 ) − L ( Δ x lm ⁡ ) \rho=\frac{F(\mathbf{x})-F\left(\mathbf{x}+\Delta \mathbf{x}_{\mathrm{lm}}\right)}{L(\mathbf{0})-L\left(\Delta \mathbf{x}_{\operatorname{lm}}\right)} ρ=L(0)L(Δxlm)F(x)F(x+Δxlm)
分母表示二次近似函数步进 Δ x l m \Delta \mathbf{x}_{\mathrm{lm}} Δxlm后所下降的值,分子为原函数步进 Δ x l m \Delta \mathbf{x}_{\mathrm{lm}} Δxlm后实际下降的值。

1.2.1阻尼因子 μ \mu μ以及步长 Δ x l m \Delta \mathbf{x}_{\mathrm{lm}} Δxlm初始化

阻尼因子 μ \mu μ大小是相对于 J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ的元素而言的。半正定的信息矩阵 J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ特征值 { λ j } \left\{\lambda_{j}\right\} {λj}和对应的特征向量为 { v j } \left\{\mathbf{v}_{j}\right\} {vj}。对 J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ做特征值分解分解后有: J ⊤ J = V Λ V ⊤ \mathbf{J}^{\top} \mathbf{J}=\mathbf{V} \mathbf{\Lambda} \mathbf{V}^{\top} JJ=VΛV可得:
Δ x lm ⁡ = − ∑ j = 1 n v j ⊤ F ′ ⊤ λ j + μ v j \Delta \mathbf{x}_{\operatorname{lm}}=-\sum_{j=1}^{n} \frac{\mathbf{v}_{j}^{\top} \mathbf{F}^{\prime \top}}{\lambda_{j}+\mu} \mathbf{v}_{j} Δxlm=j=1nλj+μvjFvj
第三题证明:
( J ⊤ J + μ I ) Δ x lm ⁡ = − J ⊤ f \left(\mathbf{J}^{\top} \mathbf{J}+\mu \mathbf{I}\right) \Delta \mathbf{x}_{\operatorname{lm}}=-\mathbf{J}^{\top} \mathbf{f} (JJ+μI)Δxlm=Jf
J ⊤ J \mathbf{J}^{\top} \mathbf{J} JJ特征值分解(实对称矩阵一定可以相似对角化)
( V Λ V ⊤ + μ I ) Δ x lm ⁡ = − F ′ ⊤ V ( Λ + μ I ) V ⊤ Δ x lm ⁡ = − F ′ ⊤ Δ x lm ⁡ = − V ( Λ + μ I ) − 1 V ⊤ F ′ ⊤ \begin{array}{c} \left(\mathbf{V} \mathbf{\Lambda} \mathbf{V}^{\top}+\mu \mathbf{I}\right) \Delta \mathbf{x}_{\operatorname{lm}}=-\mathbf{F}^{\prime \top} \\ \mathbf{V}(\mathbf{\Lambda}+\mu \mathbf{I}) \mathbf{V}^{\top} \Delta \mathbf{x}_{\operatorname{lm}}=-\mathbf{F}^{\prime \top} \\ \Delta \mathbf{x}_{\operatorname{lm}}=-\mathbf{V}(\mathbf{\Lambda}+\mu \mathbf{I})^{-1} \mathbf{V}^{\top} \mathbf{F}^{\prime \top} \end{array} (VΛV+μI)Δxlm=FV(Λ+μI)VΔxlm=FΔxlm=V(Λ+μI)1VF

Δ x l m = − ∑ j = 1 n v j v j ⊤ λ j + μ F ′ ⊤ \Delta \mathbf{x}_{\mathrm{lm}}=-\sum_{j=1}^{n} \frac{\mathbf{v}_{j} \mathbf{v}_{j}^{\top}}{\lambda_{j}+\mu} \mathbf{F}^{\prime \top} Δxlm=j=1nλj+μvjvjF
因为分子后两项为标量,移到前面有
Δ x 1 m = − ∑ j = 1 n v j ⊤ F ′ ⊤ λ j + μ v j \Delta \mathbf{x}_{1 \mathrm{m}}=-\sum_{j=1}^{n} \frac{\mathbf{v}_{j}^{\top} \mathbf{F}^{\prime \top}}{\lambda_{j}+\mu} \mathbf{v}_{j} Δx1m=j=1nλj+μvjFvj
所以,一个简单的 μ 0 \mu_{0} μ0初始值的策略就是:
μ 0 = τ ⋅ max ⁡ { ( J ⊤ J ) i i } \mu_{0}=\tau \cdot \max \left\{\left(\mathbf{J}^{\top} \mathbf{J}\right)_{i i}\right\} μ0=τmax{(JJ)ii}
通常,按需设定 τ ∼ [ 1 0 − 8 , 1 ] \tau \sim\left[10^{-8}, 1\right] τ[108,1]
若初始值离最小值点较近,则二阶泰勒展开能够很好近似, τ \tau τ取小一点,否则取大一点。

1.2.2 Marquardt策略

 if  ρ < 0.25 μ : = μ ∗ 2  elseif  ρ > 0.75 μ : = μ / 3 \begin{aligned} \text { if } \rho &<0.25 \\ \mu &:=\mu * 2 \\ \text { elseif } \rho &>0.75 \\ \mu &:=\mu / 3 \end{aligned}  if ρμ elseif ρμ<0.25:=μ2>0.75:=μ/3

1.2.2.1 拟合 y = exp ⁡ ( a x 2 + b x + c ) y=\exp \left(a x^{2}+b x+c\right) y=exp(ax2+bx+c)

以估计 y = exp ⁡ ( a x 2 + b x + c ) y=\exp \left(a x^{2}+b x+c\right) y=exp(ax2+bx+c)参数a,b,c为例,
核心代码:

double rho = (currentChi_ - tempChi) / scale;
if(rho > 0 && rho < 0.25){
    currentLambda_ *= 2;
    currentChi_ = tempChi;
    return true;
}
if(rho > 0.75 && isfinite(tempChi)){
    currentLambda_ /= 3;
    currentChi_ = tempChi;
    return true;
}
else if(rho >= 0.25 && rho <= 0.75 ){
    currentLambda_ = currentLambda_;
    currentChi_ = tempChi;
    return true;
}
else if(rho < 0){
    currentLambda_ *= 2;;
    return false;
}

实验结果:
在这里插入图片描述
μ \mu μ随迭代次数变化:
在这里插入图片描述
F , ∣ F ′ ∣ , μ F, |F'| ,\mu F,F,μ随迭代次数的变化趋势(为放在同一个坐标系里,三组数据已全部做归一化处理)
在这里插入图片描述

1.2.3 Nielsen策略(论文中第三种方法)

   if ρ > 0 \rho>0 ρ>0
     μ : = μ ∗ max ⁡ { 1 3 , 1 − ( 2 ρ − 1 ) 3 } ; ν : = 2 \mu:=\mu * \max \left\{\frac{1}{3}, 1-(2 \rho-1)^{3}\right\} ; \quad \nu:=2 μ:=μmax{31,1(2ρ1)3};ν:=2
   else
       μ : = μ ∗ ν ; ν : = 2 ∗ ν \mu:=\mu * \nu ; \quad \nu:=2 * \nu μ:=μν;ν:=2ν

1.2.3.1 拟合 y = exp ⁡ ( a x 2 + b x + c ) y=\exp \left(a x^{2}+b x+c\right) y=exp(ax2+bx+c)

核心代码:

 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;
 }

实验结果:
在这里插入图片描述
μ \mu μ随迭代次数变化:在这里插入图片描述
F , ∣ F ′ ∣ , μ F, |F'| ,\mu F,F,μ随迭代次数的变化趋势(为放在同一个坐标系里,三组数据已全部做归一化处理)
在这里插入图片描述

1.2.3.2 拟合 y = a x 2 + b x + c y=a x^{2}+b x+c y=ax2+bx+c

核心代码:

 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;
 }

实验结果:
在这里插入图片描述
μ \mu μ随迭代次数变化:在这里插入图片描述
F , ∣ F ′ ∣ , μ F, |F'| ,\mu F,F,μ随迭代次数的变化趋势(为放在同一个坐标系里,三组数据已全部做归一化处理)
在这里插入图片描述

1.2.4 论文中第二种方法拟合 y = exp ⁡ ( a x 2 + b x + c ) y=\exp \left(a x^{2}+b x+c\right) y=exp(ax2+bx+c)

λ 0 = λ o max ⁡ [ diag ⁡ [ J ⊤ W J ] ] ; λ o \lambda_{0}=\lambda_{o} \max \left[\operatorname{diag}\left[\mathbf{J}^{\top} \mathbf{W} \mathbf{J}\right]\right] ; \lambda_{o} λ0=λomax[diag[JWJ]];λo is user-specified.
use eq’n (12) for h Im  \mathbf{h}_{\text {Im }} hIm  and eq’n (15) for ρ \rho ρ α = ( ( J ⊤ W ( y − y ^ ( p ) ) ) ⊤ h ) / ( ( χ 2 ( p + h ) − χ 2 ( p ) ) / 2 + 2 ( J ⊤ W ( y − y ^ ( p ) ) ) ⊤ h ) \alpha=\left(\left(\mathbf{J}^{\top} \mathbf{W}(\mathbf{y}-\hat{\mathbf{y}}(\mathbf{p}))\right)^{\top} \mathbf{h}\right) /\left(\left(\chi^{2}(\mathbf{p}+\mathbf{h})-\chi^{2}(\mathbf{p})\right) / 2+2\left(\mathbf{J}^{\top} \mathbf{W}(\mathbf{y}-\hat{\mathbf{y}}(\mathbf{p}))\right)^{\top} \mathbf{h}\right) α=((JW(yy^(p)))h)/((χ2(p+h)χ2(p))/2+2(JW(yy^(p)))h)
if ρ i ( α h ) > ϵ 4 : p ← p + α h ; λ i + 1 = max ⁡ [ λ i / ( 1 + α ) , 1 0 − 7 ] \rho_{i}(\alpha \mathbf{h})>\epsilon_{4}: \mathbf{p} \leftarrow \mathbf{p}+\alpha \mathbf{h} ; \lambda_{i+1}=\max \left[\lambda_{i} /(1+\alpha), 10^{-7}\right] ρi(αh)>ϵ4:pp+αh;λi+1=max[λi/(1+α),107]
otherwise: λ i + 1 = λ i + ∣ χ 2 ( p + α h ) − χ 2 ( p ) ∣ / ( 2 α ) \lambda_{i+1}=\lambda_{i}+\left|\chi^{2}(\mathbf{p}+\alpha \mathbf{h})-\chi^{2}(\mathbf{p})\right| /(2 \alpha) λi+1=λi+χ2(p+αh)χ2(p)/(2α)

核心代码:
bool Problem::IsGoodStepInLM() {
    ofstream out("/home/ubuntu/slam/study/vio/HW3/course3_hw_CurveFitting_LM/exp_2/exp_2.txt",ios::app);
    double scale = 0;
    // recompute residuals after update state
    // 统计所有的残差
    double tempChi = 0.0;
    for (auto edge: edges_) {
        edge.second->ComputeResidual();
        tempChi += edge.second->Chi2();
    }
    //回退
    RollbackStates();

    //计算alpha
    VecX tempDelta = delta_x_;
    alpha_ = b_.transpose() * delta_x_;
    alpha_ /= (tempChi-currentChi_)/2 + 2*b_.transpose()*delta_x_;
    alpha_ += 1e-1;
    delta_x_ = delta_x_ * alpha_;
    UpdateStates();

    tempChi = 0.0;
    for (auto edge: edges_) {
        edge.second->ComputeResidual();
        tempChi += edge.second->Chi2();
    }
    scale = delta_x_.transpose() * (currentLambda_ * delta_x_ + b_);
    scale += 1e-3;    // make sure it's non-zero :)
    double rho = (currentChi_ - tempChi) / scale;

    if (rho > 0 && isfinite(tempChi))   // last step was good, 误差在下降
    {
        currentLambda_ = max(currentLambda_/(1+alpha_),1e-7);
        currentChi_ = tempChi;
        out<<"F: "<<currentChi_<<" ";
        out<<"F': "<<sqrt(b_.transpose()*b_)<<" ";
        out<<"u: "<<currentLambda_<<" "<<endl;
        out.close();
        return true;
    } else {
        currentLambda_ += abs(tempChi-currentChi_)/(2*alpha_);
        out.close();
        return false;
    }
}

实验结果:
在这里插入图片描述
μ \mu μ随迭代次数变化:
在这里插入图片描述

F , ∣ F ′ ∣ , μ F, |F'| ,\mu F,F,μ随迭代次数的变化趋势(为放在同一个坐标系里,三组数据已全部做归一化处理)
在这里插入图片描述

对比

利用三种方法对曲线 y = exp ⁡ ( a x 2 + b x + c ) y=\exp \left(a x^{2}+b x+c\right) y=exp(ax2+bx+c)拟合结果来看,三者迭代次数相近,值得注意的是论文中第二种方法在刚开始迭代时梯度下降比其他两种快,也比其他两种方式更快收敛。

二、IMU预积分误差传递推导

2.1 IMU预积分

ω = 1 2 ( ( ω ˉ b k + n k g − b k g ) + ( ω ˉ b k + 1 + n k + 1 g − b k g ) ) q b i b k + 1 = q b i b k ⊗ [ 1 1 2 ω δ t ] a = 1 2 ( q b i b k ( a ‾ b k + n k a − b k a ) + q b i b k + 1 ( a ‾ b k + 1 + n k + 1 a − b k a ) ) α b i b k + 1 = α b i b k + β b i b k δ t + 1 2 a δ t 2 β b i b k + 1 = β b i b k + a δ t b k + 1 a = b k a + n b k a δ t b k + 1 g = b k g + n b l g δ t \begin{aligned} \omega &=\frac{1}{2}\left(\left(\bar{\omega}^{b_{k}}+\mathbf{n}_{k}^{g}-\mathbf{b}_{k}^{g}\right)+\left(\bar{\omega}^{b_{k+1}}+\mathbf{n}_{k+1}^{g}-\mathbf{b}_{k}^{g}\right)\right) \\ \mathbf{q}_{b_{i} b_{k+1}} &=\mathbf{q}_{b_{i} b_{k}} \otimes\left[\begin{array}{c} 1 \\ \frac{1}{2} \omega \delta t \end{array}\right] \\ \mathbf{a} &=\frac{1}{2}\left(\mathbf{q}_{b_{i} b_{k}}\left(\overline{\mathbf{a}}^{b_{k}}+\mathbf{n}_{k}^{a}-\mathbf{b}_{k}^{a}\right)+\mathbf{q}_{b_{i} b_{k+1}}\left(\overline{\mathbf{a}}^{b_{k+1}}+\mathbf{n}_{k+1}^{a}-\mathbf{b}_{k}^{a}\right)\right) \\ \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} \\ \boldsymbol{\beta}_{b_{i} b_{k+1}} &=\boldsymbol{\beta}_{b_{i} b_{k}}+\mathbf{a} \delta t \\ \mathbf{b}_{k+1}^{a} &=\mathbf{b}_{k}^{a}+\mathbf{n}_{\mathbf{b}_{k}^{a}} \delta t \\ \mathbf{b}_{k+1}^{g} &=\mathbf{b}_{k}^{g}+\mathbf{n}_{\mathbf{b}_{l}^{g} \delta t} \end{aligned} ωqbibk+1aαbibk+1βbibk+1bk+1abk+1g=21((ωˉbk+nkgbkg)+(ωˉbk+1+nk+1gbkg))=qbibk[121ωδt]=21(qbibk(abk+nkabka)+qbibk+1(abk+1+nk+1abka))=αbibk+βbibkδt+21aδt2=βbibk+aδt=bka+nbkaδt=bkg+nblgδt

2.2 预积分的误差传递形式

[ δ α b k + 1 δ θ b k + 1 δ β b k + 1 δ b k + 1 a δ b k + 1 g ] = F [ δ α b k δ θ b k δ β b k δ b k a δ b k g ] + G [ n k a n k g n k + 1 a n k + 1 g n b k a n b k g ] \left[\begin{array}{c} \delta \boldsymbol{\alpha}_{b_{k+1}} \\ \delta \boldsymbol{\theta}_{b_{k+1}} \\ \delta \boldsymbol{\beta}_{b_{k+1}} \\ \delta \mathbf{b}_{k+1}^{a} \\ \delta \mathbf{b}_{k+1}^{g} \end{array}\right]=\mathbf{F}\left[\begin{array}{c} \delta \boldsymbol{\alpha}_{b_{k}} \\ \delta \boldsymbol{\theta}_{b_{k}} \\ \delta \boldsymbol{\beta}_{b_{k}} \\ \delta \mathbf{b}_{k}^{a} \\ \delta \mathbf{b}_{k}^{g} \end{array}\right]+\mathbf{G}\left[\begin{array}{c} \mathbf{n}_{k}^{a} \\ \mathbf{n}_{k}^{g} \\ \mathbf{n}_{k+1}^{a} \\ \mathbf{n}_{k+1}^{g} \\ \mathbf{n}_{\mathbf{b}_{k}^{a}} \\ \mathbf{n}_{\mathbf{b}_{k}^{g}} \end{array}\right] δαbk+1δθbk+1δβbk+1δbk+1aδbk+1g=Fδαbkδθbkδβbkδbkaδbkg+Gnkankgnk+1ank+1gnbkanbkg
其中
F = [ I f 12 I δ t − 1 4 ( q b i b k + q b i b k + 1 ) δ t 2 f 15 0 I − [ ω ] × δ t 0 0 − I δ t 0 f 32 I − 1 2 ( q b i b k + q b i b k + 1 ) δ t f 35 0 0 0 I 0 0 0 0 0 I ] \mathbf{F}=\left[\begin{array}{ccccc} \mathbf{I} & \mathbf{f}_{12} & \mathbf{I} \delta t & -\frac{1}{4}\left(\mathbf{q}_{b_{i} b_{k}}+\mathbf{q}_{b_{i} b_{k+1}}\right) \delta t^{2} & \mathbf{f}_{15} \\ \mathbf{0} & \mathbf{I}-[\boldsymbol{\omega}]_{\times} \delta t & \mathbf{0} & \mathbf{0} & -\mathbf{I} \delta t \\ \mathbf{0} & \mathbf{f}_{32} & \mathbf{I} & -\frac{1}{2}\left(\mathbf{q}_{b_{i} b_{k}}+\mathbf{q}_{b_{i} b_{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] F=I0000f12I[ω]×δtf3200Iδt0I0041(qbibk+qbibk+1)δt2021(qbibk+qbibk+1)δtI0f15Iδtf350I
G = [ 1 4 q b i b k δ t 2 g 12 1 4 q b i b k + 1 δ t 2 g 14 0 0 0 1 2 I δ t 0 1 2 I δ t 0 0 1 2 q b i b k δ t g 32 1 2 q b i b k + 1 δ t g 34 0 0 0 0 0 0 I δ t 0 0 0 0 0 0 I δ t ] \mathbf{G}=\left[\begin{array}{cccccc} \frac{1}{4} \mathbf{q}_{b_{i} b_{k}} \delta t^{2} & \mathbf{g}_{12} & \frac{1}{4} \mathbf{q}_{b_{i} b_{k+1}} \delta t^{2} & \mathbf{g}_{14} & \mathbf{0} & \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} \mathbf{q}_{b_{i} b_{k}} \delta t & \mathbf{g}_{32} & \frac{1}{2} \mathbf{q}_{b_{i} b_{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] G=41qbibkδt2021qbibkδt00g1221Iδtg320041qbibk+1δt2021qbibk+1δt00g1421Iδtg3400000Iδt00000Iδt
下推导
f 15 = ∂ α b i b k + 1 ∂ δ b k g = − 1 4 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( − δ t ) \mathbf{f}_{15}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \delta \mathbf{b}_{k}^{g}}=-\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right]_{\times} \delta t^{2}\right)(-\delta t) f15=δbkgαbibk+1=41(Rbibk+1[(abk+1bka)]×δt2)(δt)
在这里插入图片描述

下推导
g 12 = ∂ α b i b k + 1 ∂ n k g = − 1 4 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( 1 2 δ t ) \mathbf{g}_{12}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \mathbf{n}_{k}^{g}}=-\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right]_{\times} \delta t^{2}\right)\left(\frac{1}{2} \delta t\right) g12=nkgαbibk+1=41(Rbibk+1[(abk+1bka)]×δt2)(21δt)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值