GN和LM算法
一、非线性最小二乘问题
定义:找到一个 n 维的变量,
x
∗
∈
R
n
\mathbf{x}^{*} \in \mathbb{R}^{n}
x∗∈Rn,使得损失函数
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=1∑m(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)=21f⊤f+Δx⊤J⊤f+21Δx⊤J⊤JΔx=F(x)+Δx⊤J⊤f+21Δx⊤J⊤JΔx(1)
若直接对损失函数进行二阶泰勒展开,有
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Δx⊤HΔx(2)
对上述两式对比,易得
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)=(J⊤f)⊤, 以及 F′′(x)≈J⊤J
令公式(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)
(J⊤J)Δxgn=−J⊤f(3)
GN法由此计算步长
GN法存在的问题:
1.GN法利用了函数的二阶近似,若二次函数在某点附近不能很好拟合原函数,则步长计算方式不合理
2.
J
⊤
J
\mathbf{J}^{\top} \mathbf{J}
J⊤J为半正定矩阵,若
J
J
J不满秩,即
∣
J
∣
=
0
|J|=0
∣J∣=0,则
J
⊤
J
\mathbf{J}^{\top} \mathbf{J}
J⊤J不可逆,则不能求出步长。
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
(J⊤J+μI)Δxlm=−J⊤f 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 保证 (J⊤J+μI) 正定,迭代朝着下降方向进行。 μ 非常大,则 Δxlm=−μ1J⊤f=−μ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}
J⊤J的元素而言的。半正定的信息矩阵
J
⊤
J
\mathbf{J}^{\top} \mathbf{J}
J⊤J特征值
{
λ
j
}
\left\{\lambda_{j}\right\}
{λj}和对应的特征向量为
{
v
j
}
\left\{\mathbf{v}_{j}\right\}
{vj}。对
J
⊤
J
\mathbf{J}^{\top} \mathbf{J}
J⊤J做特征值分解分解后有:
J
⊤
J
=
V
Λ
V
⊤
\mathbf{J}^{\top} \mathbf{J}=\mathbf{V} \mathbf{\Lambda} \mathbf{V}^{\top}
J⊤J=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=1∑nλj+μvj⊤F′⊤vj
第三题证明:
(
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}
(J⊤J+μI)Δxlm=−J⊤f
对
J
⊤
J
\mathbf{J}^{\top} \mathbf{J}
J⊤J特征值分解(实对称矩阵一定可以相似对角化)
(
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=−F′⊤V(Λ+μI)V⊤Δxlm=−F′⊤Δxlm=−V(Λ+μI)−1V⊤F′⊤
有
Δ
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=1∑nλj+μvjvj⊤F′⊤
因为分子后两项为标量,移到前面有
Δ
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=1∑nλj+μvj⊤F′⊤vj
所以,一个简单的
μ
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{(J⊤J)ii}
通常,按需设定
τ
∼
[
1
0
−
8
,
1
]
\tau \sim\left[10^{-8}, 1\right]
τ∼[10−8,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[J⊤WJ]];λ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)
α=((J⊤W(y−y^(p)))⊤h)/((χ2(p+h)−χ2(p))/2+2(J⊤W(y−y^(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:p←p+αh;λi+1=max[λi/(1+α),10−7]
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+nkg−bkg)+(ωˉbk+1+nk+1g−bkg))=qbibk⊗[121ωδt]=21(qbibk(abk+nka−bka)+qbibk+1(abk+1+nk+1a−bka))=α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⎦⎥⎥⎥⎥⎤+G⎣⎢⎢⎢⎢⎢⎢⎡nkankgnk+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δt0I00−41(qbibk+qbibk+1)δt20−21(qbibk+qbibk+1)δtI0f15−Iδ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+1−bka)]×δ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+1−bka)]×δt2)(21δt)