从零开始手写VIO 第5期(Lesson 3)
呀,之前有别的事情,所以更新被耽误了,本文是VIO课程的第三节课,权当自己的总结,由于github可能比较慢,所以放在了gitee,链接参见之前的博文,欢迎大家参考,更新不易,如需转载,请著名出处,谢谢。
课程内容回顾
第三节主要讲解了VIO中基于优化的 IMU 与视觉信息融合,首先回顾了最小二乘问题,包括最速下降法,牛顿法,高斯牛顿,LM等;然后讲解了VIO残差函数的构建,以及预计分量的构建和模型;最后推导了残差Jacobian
1 作业1
作业1是编程题,主要是记录下每一次LM迭代的
μ
\mu
μ值,用于绘制最后的曲线;最后就是根据
《The Levenberg-Marquardt method for nonlinear least squares curve-fitting problems》里面的三种方法替换LM里的
μ
\mu
μ的迭代过程。
这里记录一下结果:
实现其他更优秀的阻尼因子策略,并给出实验对比
作业中实现了论文里的三种方法,根据参数进行选择即可,以exp
函数为例,设置噪声方差sigma = 0.1,得到结果如下:
-
方法1: Levenberg-Marquardt lambda update
代码实现在函数
Problem::IsGoodStepInLM()
中lambda_update_type_ == 0
的条件结果:
优化结果 Lambda曲线 -
方法2: Quadratic update
代码实现在函数
Problem::IsGoodStepInLM()
中lambda_update_type_ == 1
的条件结果:
优化结果 Lambda曲线 -
方法3: Nielsen’s lambda update equations
代码实现在函数
Problem::IsGoodStepInLM()
中lambda_update_type_ == 2
的条件结果:
优化结果 Lambda曲线 结果说明: 对比发现在指数函数情况下,三种方法都能得到相近的解,
Levenberg-Marquardt lambda update
和Nielsen's lambda update equations
方法的迭代次数少,收敛快,但是Lambda变化曲线跳动较大,Quadratic update
方法迭代次数多,但是Lambda变化更加平滑;此外,将噪声方差设置为1的时候,也得到相似的结果
2 作业2 公式推导
2.1 f 15 f_{15} f15推导
根据PPT
的公式有
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
)
)
ω
=
1
2
(
ω
b
k
−
b
k
g
)
+
(
ω
b
k
+
1
−
b
k
g
)
)
=
1
2
(
ω
b
k
+
ω
b
k
+
1
)
−
b
k
g
α
b
i
b
k
+
1
=
α
b
i
b
k
+
β
b
i
b
k
∗
δ
t
+
1
2
a
∗
δ
t
2
而
b
k
g
与
ω
相
关
,
与
其
它
的
无
关
,
所
以
\bold a= \frac{1}{2}(q_{b_ib_k}(\bold a^{b_k} -\bold b_k^a) + q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a))\\\bold \omega = \frac{1}{2}(\bold \omega^{b_k} -\bold b_k^g) + (\bold \omega^{b_{k+1}} -\bold b_k^g)) = \frac{1}{2}(\bold \omega^{b_k}+ \bold \omega^{b_{k+1}})-\bold b_k^g\\\bold \alpha_{b_ib_{k+1}} = \bold \alpha_{b_ib_k} +\bold \beta_{b_ib_k}*\delta t + \frac{1}{2}\bold a*{\delta t}^2\\而 \bold b_k^g与\bold \omega相关,与其它的无关,所以\\
a=21(qbibk(abk−bka)+qbibk+1(abk+1−bka))ω=21(ωbk−bkg)+(ωbk+1−bkg))=21(ωbk+ωbk+1)−bkgαbibk+1=αbibk+βbibk∗δt+21a∗δt2而bkg与ω相关,与其它的无关,所以
f
15
=
∂
α
b
i
b
k
+
1
∂
δ
b
k
g
=
∂
1
2
a
∗
δ
t
2
∂
δ
b
k
g
=
∂
1
4
(
q
b
i
b
k
(
a
b
k
−
b
k
a
)
+
q
b
i
b
k
+
1
(
a
b
k
+
1
−
b
k
a
)
)
∗
δ
t
2
∂
δ
b
k
g
=
1
4
∂
q
b
i
b
k
+
1
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
∂
δ
b
k
g
=
1
4
∂
q
b
i
b
k
⨂
[
1
0.5
∗
(
ω
−
δ
b
k
g
)
∗
δ
t
]
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
∂
δ
b
k
g
=
1
4
∂
R
b
i
b
k
e
x
p
(
[
(
ω
−
δ
b
k
g
)
∗
δ
t
]
×
)
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
∂
δ
b
k
g
=
1
4
∂
R
b
i
b
k
e
x
p
(
[
ω
∗
δ
t
]
×
)
e
x
p
(
[
−
J
r
(
ω
δ
t
)
∗
δ
b
k
g
∗
δ
t
)
]
×
)
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
∂
δ
b
k
g
≈
1
4
∂
R
b
i
b
k
e
x
p
(
[
ω
∗
δ
t
]
×
)
e
x
p
(
[
−
δ
b
k
g
∗
δ
t
)
]
×
)
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
∂
δ
b
k
g
=
−
1
4
∂
R
b
i
b
k
+
1
[
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
]
×
(
−
δ
b
k
g
∗
δ
t
)
∂
δ
b
k
g
=
−
1
4
R
b
i
b
k
+
1
[
(
a
b
k
+
1
−
b
k
a
)
∗
δ
t
2
]
×
(
−
δ
t
)
f_{15}=\frac{\partial \alpha_{b_ib_{k+1}}}{\partial \delta b_k^g} = \frac{\partial \frac{1}{2}\bold a*{\delta t}^2}{\partial \delta b_k^g} = \frac{\partial \frac{1}{4}(q_{b_ib_k}(\bold a^{b_k} -\bold b_k^a) + q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a))*{\delta t}^2}{\partial \delta b_k^g} \\ =\frac{1}{4} \frac{\partial q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta b_k^g} \\ = \frac{1}{4} \frac{\partial q_{b_ib_{k}}\bigotimes \left[\begin{matrix} 1 \\ 0.5*(\omega - \delta b_k^g)*\delta t\end{matrix}\right] (\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta b_k^g} \\ =\frac{1}{4} \frac{\partial R_{b_ib_k}exp([(\omega - \delta b_k^g)*\delta t]_\times) (\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta b_k^g} \\ =\frac{1}{4}\frac{\partial R_{b_ib_k}exp([\omega*\delta t]_\times)exp([-J_r(\bold \omega \delta t)*\delta b_k^g*\delta t)]_\times)(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta b_k^g} \\ \approx \frac{1}{4} \frac{\partial R_{b_ib_k}exp([\omega*\delta t]_\times)exp([-\delta b_k^g*\delta t)]_\times) (\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta b_k^g} \\ = -\frac{1}{4} \frac{\partial R_{b_ib_{k+1}}[(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2]_\times(-\delta b_k^g*\delta t)}{\partial \delta b_k^g} \\ =-\frac{1}{4}{R_{b_ib_{k+1}}[(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2]_\times(-\delta t)}
f15=∂δbkg∂αbibk+1=∂δbkg∂21a∗δt2=∂δbkg∂41(qbibk(abk−bka)+qbibk+1(abk+1−bka))∗δt2=41∂δbkg∂qbibk+1(abk+1−bka)∗δt2=41∂δbkg∂qbibk⨂[10.5∗(ω−δbkg)∗δt](abk+1−bka)∗δt2=41∂δbkg∂Rbibkexp([(ω−δbkg)∗δt]×)(abk+1−bka)∗δt2=41∂δbkg∂Rbibkexp([ω∗δt]×)exp([−Jr(ωδt)∗δbkg∗δt)]×)(abk+1−bka)∗δt2≈41∂δbkg∂Rbibkexp([ω∗δt]×)exp([−δbkg∗δt)]×)(abk+1−bka)∗δt2=−41∂δbkg∂Rbibk+1[(abk+1−bka)∗δt2]×(−δbkg∗δt)=−41Rbibk+1[(abk+1−bka)∗δt2]×(−δt)
2.2 g 12 g_{12} g12推导
根据PPT
公式有
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
)
)
ω
=
1
2
(
ω
b
k
~
+
n
k
g
−
b
k
g
)
+
(
ω
b
k
+
1
~
+
n
k
+
1
g
−
b
k
g
)
)
所
以
,
在
n
k
g
上
有
一
个
扰
动
,
相
当
于
加
上
一
个
δ
n
k
g
α
b
i
b
k
+
1
=
α
b
i
b
k
+
β
b
i
b
k
∗
δ
t
+
1
2
a
∗
δ
t
2
而
n
k
g
与
ω
相
关
,
与
其
它
的
无
关
,
所
以
\bold a= \frac{1}{2}(q_{b_ib_k}(\bold a^{b_k} -\bold b_k^a) + q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a)) \\ \bold \omega = \frac{1}{2}(\widetilde {\bold \omega^{b_k}} + \bold n_k^g -\bold b_k^g) + (\widetilde {\bold \omega^{b_{k+1}}} + \bold n_{k+1}^g -\bold b_k^g)) \\ 所以,在\bold n_k^g上有一个扰动,相当于加上一个\delta \bold n_k^g \\ \\ \bold \alpha_{b_ib_{k+1}} = \bold \alpha_{b_ib_k} +\bold \beta_{b_ib_k}*\delta t + \frac{1}{2}\bold a*{\delta t}^2 \\ 而 \bold n_k^g与\bold \omega相关,与其它的无关,所以 \\
a=21(qbibk(abk−bka)+qbibk+1(abk+1−bka))ω=21(ωbk
+nkg−bkg)+(ωbk+1
+nk+1g−bkg))所以,在nkg上有一个扰动,相当于加上一个δnkgαbibk+1=αbibk+βbibk∗δt+21a∗δt2而nkg与ω相关,与其它的无关,所以
g 12 = ∂ α b i b k + 1 ∂ δ n k g = ∂ 1 2 a ∗ δ t 2 ∂ δ n k g = ∂ 1 4 ( q b i b k ( a b k − b k a ) + q b i b k + 1 ( a b k + 1 − b k a ) ) ∗ δ t 2 ∂ δ n k g = 1 4 ∂ q b i b k + 1 ( a b k + 1 − b k a ) ∗ δ t 2 ∂ δ n k g = 1 4 ∂ q b i b k ⨂ [ 1 0.5 ∗ ( ω + 0.5 ∗ δ n k g ) ∗ δ t ] ( a b k + 1 − b k a ) ∗ δ t 2 ∂ δ n k g = 1 4 ∂ R b i b k e x p ( [ ( ω + 0.5 ∗ δ n k g ) ∗ δ t ] × ) ( a b k + 1 − b k a ) ∗ δ t 2 ∂ δ n k g = 1 4 ∂ R b i b k e x p ( [ ω ∗ δ t ] × ) e x p ( [ J r ( ω δ t ) ∗ ( 0.5 ∗ δ n k g ) ∗ δ t ] × ) ( a b k + 1 − b k a ) ∗ δ t 2 ∂ δ n k g ≈ 1 4 ∂ R b i b k e x p ( [ ω ∗ δ t ] × ) e x p ( [ ( 0.5 ∗ δ n k g ) ∗ δ t ] × ) ( a b k + 1 − b k a ) ∗ δ t 2 ∂ δ n k g = − 1 4 ∂ R b i b k + 1 [ ( a b k + 1 − b k a ) ∗ δ t 2 ] × ( 0.5 ∗ δ n k g ∗ δ t ) ∂ δ n k g = − 1 4 R b i b k + 1 [ ( a b k + 1 − b k a ) ∗ δ t 2 ] × ( 1 2 δ t ) g_{12} = \frac{\partial \alpha_{b_ib_{k+1}}}{\partial \delta \bold n_k^g}= \frac{\partial \frac{1}{2}\bold a*{\delta t}^2}{\partial \delta \bold n_k^g} = \frac{\partial \frac{1}{4}(q_{b_ib_k}(\bold a^{b_k} -\bold b_k^a) + q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a))*{\delta t}^2}{\partial \delta \bold n_k^g} \\ =\frac{1}{4} \frac{\partial q_{b_ib_{k+1}}(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta \bold n_k^g} \\ = \frac{1}{4} \frac{\partial q_{b_ib_{k}}\bigotimes \left[\begin{matrix} 1 \\ 0.5*(\omega + 0.5*\delta \bold n_k^g)*\delta t\end{matrix}\right] (\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta \bold n_k^g} \\ =\frac{1}{4} \frac{\partial R_{b_ib_k}exp([(\omega + 0.5*\delta \bold n_k^g)*\delta t]_\times) (\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta \bold n_k^g} \\ =\frac{1}{4} \frac{\partial R_{b_ib_k}exp([\omega*\delta t]_\times)exp([J_r(\bold \omega \delta t)*(0.5*\delta \bold n_k^g)*\delta t]_\times)(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta \bold n_k^g} \\ \approx \frac{1}{4} \frac{\partial R_{b_ib_k}exp([\omega*\delta t]_\times)exp([(0.5*\delta \bold n_k^g)*\delta t]_\times)(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2}{\partial \delta \bold n_k^g} \\ = -\frac{1}{4} \frac{\partial R_{b_ib_{k+1}}[(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2]_\times(0.5*\delta \bold n_k^g*\delta t)}{\partial \delta \bold n_k^g} \\ =-\frac{1}{4}{R_{b_ib_{k+1}}[(\bold a^{b_{k+1}} -\bold b_k^a)*{\delta t}^2]_\times(\frac{1}{2}\delta t)} g12=∂δnkg∂αbibk+1=∂δnkg∂21a∗δt2=∂δnkg∂41(qbibk(abk−bka)+qbibk+1(abk+1−bka))∗δt2=41∂δnkg∂qbibk+1(abk+1−bka)∗δt2=41∂δnkg∂qbibk⨂[10.5∗(ω+0.5∗δnkg)∗δt](abk+1−bka)∗δt2=41∂δnkg∂Rbibkexp([(ω+0.5∗δnkg)∗δt]×)(abk+1−bka)∗δt2=41∂δnkg∂Rbibkexp([ω∗δt]×)exp([Jr(ωδt)∗(0.5∗δnkg)∗δt]×)(abk+1−bka)∗δt2≈41∂δnkg∂Rbibkexp([ω∗δt]×)exp([(0.5∗δnkg)∗δt]×)(abk+1−bka)∗δt2=−41∂δnkg∂Rbibk+1[(abk+1−bka)∗δt2]×(0.5∗δnkg∗δt)=−41Rbibk+1[(abk+1−bka)∗δt2]×(21δt)
3 证明题
证明式(9)
证明:
根据 Levenberg-Marquardt Method方法,可以得到:
(
J
T
J
+
μ
I
)
Δ
x
l
m
=
−
J
T
f
,
μ
≥
0
(\bold J^T\bold J+\mu I)\Delta \bold x_{lm} = -\bold J^T\bold f,\quad\quad\quad\quad \mu \geq 0
(JTJ+μI)Δxlm=−JTf,μ≥0
将
J
T
J
J^TJ
JTJ进行特征值分解,可以得到
J
T
J
=
V
Λ
V
T
\bold J^T\bold J=\bold V\bold \Lambda \bold V^T
JTJ=VΛVT,
其中
V
=
[
v
1
,
.
.
.
,
v
n
]
为
正
交
矩
阵
,
v
1
,
.
.
.
,
v
n
为
特
征
向
量
Λ
=
[
λ
1
.
.
.
λ
n
]
,
为
对
角
矩
阵
,
对
角
线
上
的
元
素
为
特
征
值
\bold V = \left[\begin{matrix} \bold v_1,...,\bold v_n \end{matrix}\right]为正交矩阵,\bold v_1,...,\bold v_n为特征向量 \\ \bold \Lambda = \left[\begin{matrix} \lambda_1 & & \\& ... & \\& & \lambda_n \end{matrix}\right],为对角矩阵,对角线上的元素为特征值
V=[v1,...,vn]为正交矩阵,v1,...,vn为特征向量Λ=⎣⎡λ1...λn⎦⎤,为对角矩阵,对角线上的元素为特征值
所以有:
(
J
T
J
+
μ
I
)
Δ
x
l
m
=
(
V
Λ
V
T
+
V
μ
V
T
)
Δ
x
l
m
=
(
[
v
1
,
.
.
.
,
v
n
]
[
λ
1
+
μ
.
.
.
λ
n
+
μ
]
[
v
1
T
.
.
.
v
n
T
]
)
Δ
x
l
m
=
−
J
T
f
=
−
F
′
T
(\bold J^T\bold J+\mu \bold I)\Delta \bold x_{lm} = (\bold V\bold \Lambda \bold V^T+\bold V\mu \bold V^T)\Delta \bold x_{lm} \\ =(\left[\begin{matrix} \bold v_1,...,\bold v_n \end{matrix}\right] \left[\begin{matrix} \lambda_1+\mu & & \\& ... & \\& & \lambda_n+\mu \end{matrix}\right]\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right]) \Delta \bold x_{lm} = -\bold J^T\bold f=-\bold F'^T \\
(JTJ+μI)Δxlm=(VΛVT+VμVT)Δxlm=([v1,...,vn]⎣⎡λ1+μ...λn+μ⎦⎤⎣⎡v1T...vnT⎦⎤)Δxlm=−JTf=−F′T
所以可以得到:
=
=
>
[
λ
1
+
μ
.
.
.
λ
n
+
μ
]
[
v
1
T
.
.
.
v
n
T
]
Δ
x
l
m
=
−
[
v
1
T
.
.
.
v
n
T
]
F
′
T
=
=
>
[
v
1
T
.
.
.
v
n
T
]
Δ
x
l
m
=
−
[
λ
1
+
μ
.
.
.
λ
n
+
μ
]
−
1
[
v
1
T
.
.
.
v
n
T
]
F
′
T
=
=
>
Δ
x
l
m
=
−
[
v
1
,
.
.
.
,
v
n
]
[
λ
1
+
μ
.
.
.
λ
n
+
μ
]
−
1
[
v
1
T
.
.
.
v
n
T
]
F
′
T
=
−
∑
j
=
1
n
v
j
v
j
T
λ
j
+
μ
F
′
T
因
为
v
j
是
列
向
量
,
F
′
T
是
列
向
量
,
所
以
有
v
j
T
F
′
T
=
c
是
一
个
数
,
所
以
v
j
(
v
j
T
F
′
T
)
=
(
v
j
T
F
′
T
)
v
j
−
∑
j
=
1
n
v
j
v
j
T
λ
j
+
μ
F
′
T
=
−
∑
j
=
1
n
v
j
T
F
′
T
λ
j
+
μ
v
j
==>\left[\begin{matrix} \lambda_1+\mu & & \\& ... & \\& & \lambda_n+\mu \end{matrix}\right]\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right] \Delta \bold x_{lm} = -\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right]\bold F'^T \\ ==>\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right] \Delta \bold x_{lm}=-\left[\begin{matrix} \lambda_1+\mu & & \\& ... & \\& & \lambda_n+\mu \end{matrix}\right]^{-1}\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right]\bold F'^T \\ ==> \Delta \bold x_{lm}=-\left[\begin{matrix} \bold v_1,...,\bold v_n \end{matrix}\right]\left[\begin{matrix} \lambda_1+\mu & & \\& ... & \\& & \lambda_n+\mu \end{matrix}\right]^{-1}\left[\begin{matrix} \bold v_1^T\\...\\\bold v_n^T \end{matrix}\right]\bold F'^T \\ =-\sum_{j=1}^n\frac{\bold v_j\bold v_j^T}{\lambda_j + \mu}\bold F'^T \\ 因为\bold v_j是列向量,\bold F'^T是列向量,所以有\bold v_j^T\bold F'^T =c是一个数,所以\bold v_j\bold(v_j^T\bold F'^T) = (\bold v_j^T\bold F'^T)\bold v_j \\ -\sum_{j=1}^n\frac{\bold v_j\bold v_j^T}{\lambda_j + \mu}\bold F'^T=-\sum_{j=1}^n\frac{\bold v_j^T\bold F'^T}{\lambda_j + \mu}\bold v_j
==>⎣⎡λ1+μ...λn+μ⎦⎤⎣⎡v1T...vnT⎦⎤Δxlm=−⎣⎡v1T...vnT⎦⎤F′T==>⎣⎡v1T...vnT⎦⎤Δxlm=−⎣⎡λ1+μ...λn+μ⎦⎤−1⎣⎡v1T...vnT⎦⎤F′T==>Δxlm=−[v1,...,vn]⎣⎡λ1+μ...λn+μ⎦⎤−1⎣⎡v1T...vnT⎦⎤F′T=−j=1∑nλj+μvjvjTF′T因为vj是列向量,F′T是列向量,所以有vjTF′T=c是一个数,所以vj(vjTF′T)=(vjTF′T)vj−j=1∑nλj+μvjvjTF′T=−j=1∑nλj+μvjTF′Tvj
所以式(9)得证。
总结
参考链接
[1] 深蓝学院SLAM/VIO课程