SLAM基础 —— 视觉与IMU融合(VIO基础理论)
1. 基于Bundle Adjustment的VIO融合
1.1 为什么需要融合
一、IMU 与视觉定位方案优势与劣势对比:
视觉和 IMU 定位方案存在一定互补性质:
IMU 适合计算短时间、快速的运动;视觉适合计算长时间、慢速的运动。同时,可利用视觉定位信息来估计 IMU 的零偏,减少 IMU 由零偏导致的发散和累积误差;反之, IMU 可以为视觉提供快速运动时的定位。
1.2 视觉与IMU融合两类方案:
一、松耦合:
将 IMU 定位与视觉/GNSS 的位姿直接进行融合,融合过程对二者本身不产生影响,作为后处理方式输出。典型方案为卡尔曼滤波器。
二、紧耦合:
融合过程本身会影响视觉和 IMU 中的参数(如 IMU 的零偏和视觉的尺度)。典型方案为 MSCKF 和非线性优化。
三、松耦合和紧耦合对比:
- 单纯凭(单目)视觉或 IMU 都不具备估计 Pose 的能力:视觉存
在尺度不确定性、 IMU 存在零偏导致漂移 - 松耦合中,视觉内部 BA 没有 IMU 的信息,在整体层面来看不是
最优的 - 紧耦合可以一次性建模所有的运动和测量信息,更容易达到最优。
1.3 视觉SLAM中的BA问题
在视觉SLAM中,我们通过最小化路标点的重投影误差,实现对相机位姿的约束。(路标点为跟踪的特征点或者光流点)
对于VSLAM中的BA问题,有以下已知条件:
状态量的初始值: 特征点的三维坐标;相机的位姿
系统测量值: 特征点在不同图像上的像素坐标
BA问题就是利用测量值来实现对初始状态量的最优估计。
构建误差函数,利用最小二乘得到状态量的最优估计,使重投影误差最小。
1.4 VIO信息融合考虑的问题
将IMU融入到视觉里程计中,除了要最小化特征点的重投影误差以外,还需要考虑如下问题:
- 相机与IMU的外参,包括旋转和平移
- 相机和IMU的帧率不同,如何实现两者数据上的融合
- IMU从 b 1 b_1 b1 到 b 2 b_2 b2 时,有测量值 z b 1 b 2 z_{b_1 b_2} zb1b2,如何构建IMU的测量误差函数
- 位姿的来源有IMU测量和视觉测量,如何设定多个信息源权重
- 对于融合信息后构建的误差函数,如何求解
2.VIO残差函数的构建
2.1 最小二乘问题
目的是找到一个
n
n
n 维的变量
n
∗
∈
R
n
n^* \in \mathbb{R}^n
n∗∈Rn,使得损失函数
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=1∑m(fi(x))2 其中
f
i
f_i
fi 是残差函数,如测量值和预测值之间的差,且有
m
≥
n
m \geq n
m≥n即观测数量大于变量的维度,使问题具有很好的约束(一般为超定方程)。局部最小值指对任意
∣
∣
x
−
x
∗
∣
∣
<
δ
||x-x^*||<\delta
∣∣x−x∗∣∣<δ,有
F
(
x
∗
)
≤
F
(
x
)
F(x^*) \leq F(x)
F(x∗)≤F(x)。
2.2 带权重(方差)的权重计算
为了将不同传感器的信息有效的融合在一起,将残差方程变为如下形式:
r
=
∣
∣
f
(
x
)
∣
∣
Σ
2
=
f
T
(
x
)
Σ
−
1
f
(
x
)
r = ||\mathrm{f}(x)||_\Sigma^2 = \mathrm{f}^T(x) \Sigma^{-1} \mathrm{f}(x)
r=∣∣f(x)∣∣Σ2=fT(x)Σ−1f(x) 其中,
f
(
x
)
\mathrm{f}(x)
f(x) 服从高斯分布,其协方差为
Σ
\Sigma
Σ。这里乘上协方差矩阵的逆。
协方差反应了一个测量数据的不确定度,如果协方差
Σ
\Sigma
Σ 越小,代表数据不确定度越小,可信度越高,在优化的过程中我们更应该关注可信度高的数据。
Σ
\Sigma
Σ 越小,
Σ
−
1
\Sigma^{-1}
Σ−1越大,则该项测量误差在总的残差方程
r
r
r 中的权重也就越大。
2.3 基于滑动窗口的VIO Bundle Adjustment
在滑动窗口的VIO BA中,设定各个参数的符号如上图所示。
为了节约计算量,采用滑动窗口的形式去计算 Bundle Adjustment。滑动窗口中只负责优化一定数量帧的数据,在窗口中帧的数量达到设定值后,每新增一帧,都要丢到窗口中最前面的一帧。但是最前面的一帧不能直接丢掉,因为其存在有效的观测数据和信息。这里就需要将之前观测的信息整合成一个先验的信息,一起放到后面的数据优化中。
一、基于滑窗的VIO优化方程:
m
i
n
X
ρ
(
∣
∣
r
p
−
J
p
X
∣
∣
Σ
p
2
)
⏟
p
r
i
o
r
+
∑
i
∈
B
ρ
(
∣
∣
r
b
(
z
b
i
b
i
+
1
,
X
)
∣
∣
Σ
b
i
b
i
+
1
2
)
⏟
I
M
U
e
r
r
o
r
+
∑
(
i
,
j
)
∈
F
ρ
(
∣
∣
r
f
(
z
f
j
c
i
,
X
)
∣
∣
Σ
f
j
c
i
2
)
⏟
I
m
a
g
e
e
r
r
o
r
\mathop{min}\limits_\mathcal{X} \underbrace{ \rho(||r_p - J_p\mathcal{X}||^2_{\Sigma_p}) }_{prior} + \sum_{i \in B} \underbrace{ \rho(||r_b(z_{b_i b_{i+1}},\mathcal{X})||^2_{\Sigma_{b_i b_{i+1}}}) }_{IMU \ error} \\ + \underbrace{ \sum_{(i,j) \in F} \rho (||r_f(z_{f_j}^{c_i},\mathcal{X})||^2_{\Sigma_{f_j}^{c_i}}) }_{Image \ error}
Xminprior
ρ(∣∣rp−JpX∣∣Σp2)+i∈B∑IMU error
ρ(∣∣rb(zbibi+1,X)∣∣Σbibi+12)+Image error
(i,j)∈F∑ρ(∣∣rf(zfjci,X)∣∣Σfjci2)
通过最小化这些状态量残差值的和,以达到估计最优位姿的目的。
二、系统需要优化的状态量
系统状态量定义如下:
X
=
[
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
]
T
,
i
∈
[
n
,
n
+
N
]
\mathcal{X} = [x_n,x_{n+1}, \ ... \ , 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}]^T, i \in [n, n+N]
X=[xn,xn+1, ... ,xn+N,λm,λm+1, ... ,λm+M]xi=[pwbi,qwbi,viw,babi,bgbi]T,i∈[n,n+N] 其中
x
x
x 为相机的姿态,
λ
\lambda
λ为观测到的路标点。
x
i
x_i
xi 包括
i
i
i 时刻 IMU 机体在惯性坐标系中的位置
p
p
p、姿态
q
q
q、速度
v
v
v,以及 IMU 机体坐标系中的加速度偏置量估计
b
a
b_a
ba 和角速度的偏置量估计
b
g
b_g
bg。
n
,
m
n,m
n,m 分别时机体状态量和路标在滑动窗口里的起始时刻,即滑动窗口从第
n
n
n 帧 第
m
m
m 个路标为起始点。
N
N
N 为滑动窗口中关键帧数量,
M
M
M 是被滑动窗口内所有关键帧观测到的路标数量。
2.4 视觉重投影误差
一、重投影误差的定义:
定义一个特征点在归一化相机坐标系下的估计值与观测值的差为重投影误差。
r
c
=
[
x
z
−
u
y
z
−
v
]
r_c = \begin{bmatrix} \frac{x}{z} - u \\ \frac{y}{z} - v\end{bmatrix}
rc=[zx−uzy−v]其中,待估计的状态量为特征点的三维空间坐标
(
x
,
y
,
z
)
T
(x, y, z)^T
(x,y,z)T,观测值
(
u
,
v
)
T
(u, v)^T
(u,v)T 为特征在相机归一化平面的坐标。
二、逆深度参数化:
特征点在归一化相机坐标系与在相机坐标系下的坐标关系为:
[
x
y
z
]
=
1
λ
[
u
v
1
]
\begin{bmatrix} x \\ y \\ z \end{bmatrix} = \frac{1}{\lambda} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
⎣⎡xyz⎦⎤=λ1⎣⎡uv1⎦⎤ 其中,
λ
=
1
/
z
\lambda = 1/z
λ=1/z 称为逆深度。之所以使用
1
/
z
1/z
1/z 逆深度的方式来表达,是因为当
z
→
∞
z \rightarrow \infty
z→∞ 时,
x
/
z
,
y
/
z
x/z,y/z
x/z,y/z 无法表示,而使用逆深度有
λ
→
0
\lambda \rightarrow 0
λ→0,可以很好的表示任何值。且使用逆深度时,重投影误差函数更接近于高斯分布。
三、VIO中基于逆深度的重投影误差:
特征点逆深度在第
i
i
i 帧中第一次被观测到,之后又在第
j
j
j 帧中又被观测到,预测其在第
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
]
\begin{bmatrix} x_{c_j} \\ y_{c_j} \\ z_{c_j} \\ 1 \end{bmatrix} = T_{bc}^{-1} T_{wb_j}^{-1} T_{wb_i} T_{bc} \begin{bmatrix} \frac{1}{\lambda}u_{c_i} \\ \frac{1}{\lambda}v_{c_i} \\ \frac{1}{\lambda} \\ 1 \end{bmatrix}
⎣⎢⎢⎡xcjycjzcj1⎦⎥⎥⎤=Tbc−1Twbj−1TwbiTbc⎣⎢⎢⎡λ1uciλ1vciλ11⎦⎥⎥⎤ 式中,
T
b
c
T_{bc}
Tbc 为相机坐标系到 IMU坐标系的外参,
T
w
b
i
T_{wb_i}
Twbi 和
T
w
b
j
T_{wb_j}
Twbj 分别为第
i
i
i 帧和第
j
j
j 帧的 IMU坐标系到世界坐标系的变换矩阵。(运算逻辑为:第
i
i
i 帧中特征点的在相机坐标系中的坐标,转换到第
i
i
i 帧的 body 坐标系,转换到世界坐标系,再转换到第
j
j
j 帧的body 坐标系,再根据外参由 body 坐标系转换到第
j
j
j 帧的相机坐标系)
以上式由第
i
i
i 帧特征点在相机坐标系中的坐标,推算出其在第
j
j
j 帧相机坐标系中的坐标为预测值,以 第
j
j
j 帧中特征点的像素坐标系为观测值。则视觉重投影误差为:
r
c
=
[
x
c
j
z
c
j
−
u
c
j
y
c
j
z
c
j
−
v
c
j
]
r_c = \begin{bmatrix} \frac{x_{c_j}}{z_{c_j}} - u_{c_j} \\ \frac{y_{c_j}}{z_{c_j}} - v_{c_j}\end{bmatrix}
rc=⎣⎡zcjxcj−ucjzcjycj−vcj⎦⎤
四、重投影误差协方差矩阵的选择
通常,我们假设特征点观测值为
f
f
f ,其误差为 1 个像素。则假设观测服从正态分布
N
(
f
,
1
)
\mathcal{N} (f,1)
N(f,1)。可以以算出对应的协方差矩阵
Σ
\Sigma
Σ 。则对于残差
r
r
r 有:
r
=
r
c
T
Σ
−
1
r
c
r = r_c^T \Sigma^{-1} r_c
r=rcTΣ−1rc
2.5 IMU误差
VIO中需要融合 IMU 积分的误差,那么首先我们要对 IMU 积分的误差进行建模,见下一节。
3 IMU预积分模型与误差处理
3.1 IMU测量值积分
IMU的真实值为
ω
,
a
\omega, a
ω,a,测量值为
ω
~
,
a
~
\tilde{\omega},\tilde{a}
ω~,a~,根据 IMU 的测量模型,则有:
ω
~
b
=
ω
b
+
b
g
+
n
g
a
~
b
=
q
b
w
(
a
w
+
g
w
)
+
b
a
+
n
a
\tilde{\omega}^b = \omega^b + b^g + n^g \\ \tilde{a}^b = q_{bw}(a^w+g^w) + b^a + n^a
ω~b=ωb+bg+nga~b=qbw(aw+gw)+ba+na 上标
g
g
g 表示 gyro,
a
a
a 表示 acc,
w
w
w 表示在世界坐标系 world,
b
b
b 表示 imu 本体坐标系 body。IMU 的真实值为
ω
,
a
\omega,a
ω,a,测量值为
ω
~
,
a
~
\tilde{\omega},\tilde{a}
ω~,a~
P(ose),v(elocity),q(uaternion) 对时间的导数可写成:
P
˙
w
b
t
=
v
t
w
v
˙
t
w
=
a
t
w
q
˙
w
b
t
=
q
w
b
t
⊗
[
0
1
2
ω
b
t
]
\dot{P}_{wb_t} = \mathrm{v}_t^w \\ \dot{\mathrm{v}}_t^w = a_t^w \\ \dot{q}_{wb_t} = q_{wb_t} \otimes \begin{bmatrix} 0 \\ \frac{1}{2}\omega^{b_t}\end{bmatrix}
P˙wbt=vtwv˙tw=atwq˙wbt=qwbt⊗[021ωbt]
从第
i
i
i 时刻的 PVQ 对 IMU 的测量值进行积分得到第
j
j
j 时刻的 PVQ:
P
w
b
j
=
P
w
b
i
+
v
i
w
Δ
t
+
∬
t
∈
[
i
,
j
]
(
q
w
b
t
a
b
t
−
g
w
)
d
t
2
v
j
w
=
v
i
w
+
∫
t
∈
[
i
,
j
]
(
q
w
b
t
a
b
t
−
g
w
)
d
t
q
w
b
j
=
∫
t
∈
[
i
,
j
]
q
w
b
i
⊗
[
0
1
2
ω
b
t
]
d
t
P_{wb_j} = P_{wb_i} + \mathrm{v}_i^w \Delta t + \iint_{t\in[i,j]}(q_{wb_t}a^{b_t} - g^w)dt^2 \\ \mathrm{v}_j^w = \mathrm{v}_i^w + \int_{t\in[i,j]} (q_{wb_t}a^{b_t}-g^w)dt \\ q_{wb_j} = \int_{t \in [i,j]}q_{wb_i} \otimes \begin{bmatrix} 0 \\ \frac{1}{2} \omega^{b_t} \end{bmatrix} dt
Pwbj=Pwbi+viwΔt+∬t∈[i,j](qwbtabt−gw)dt2vjw=viw+∫t∈[i,j](qwbtabt−gw)dtqwbj=∫t∈[i,j]qwbi⊗[021ωbt]dt 这样一步步的积分,在优化过程中,每次
q
w
b
t
q_{wb_t}
qwbt 优化更新后,都需要重新进行积分(re-propagation),运算量较大。
3.2 IMU预积分
利用如下公式,将IMU积分模型转换为预积分模型:
q
w
b
t
=
q
w
b
i
⊗
q
b
i
b
t
q_{wb_t} = q_{wb_i} \otimes q_{b_i b_t}
qwbt=qwbi⊗qbibt 其含义为:将IMU积分模型分为
q
w
b
i
q_{wb_i}
qwbi 和
q
b
i
b
t
q_{b_i b_t}
qbibt,
q
w
b
i
q_{wb_i}
qwbi为
i
i
i 时刻 IMU 坐标系到相机坐标系的变换,
q
b
i
b
t
q_{b_i b_t}
qbibt 为
t
t
t 时刻 IMU 坐标系相对于
i
i
i 时刻 IMU 坐标系的变换。这样就把本来相互关联的 IMU 积分轨迹进行分段,然后再根据
q
w
b
i
q_{wb_i}
qwbi 进行拼接即可。
可以算出
q
b
i
b
t
q_{b_i b_t}
qbibt,其只与IMU的积分有关,与世界坐标系无关,所以这一部分值是固定的,不参与优化。这样我们优化
q
w
b
i
q_{wb_i}
qwbi 就可以优化
q
w
b
t
q_{wb_t}
qwbt ,则不需要重新计算整个积分公式。
则由 3.1 中的积分公式,将PVQ积分公式中的积分项变成
j
j
j 时刻相对于
i
i
i 时刻的姿态,而不是相对于世界坐标系。可以推导出预积分公式:
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
j
a
b
t
)
d
t
2
v
j
w
=
v
i
w
−
g
w
Δ
t
+
q
w
b
i
∫
t
∈
[
i
,
j
]
(
q
b
i
b
j
a
b
t
)
d
t
2
q
w
b
j
=
q
w
b
i
∫
t
∈
[
i
,
j
]
q
b
i
b
t
⊗
[
0
1
2
ω
b
t
]
d
t
\begin{aligned} & P_{wb_j} = P_{wb_i} + v_i^w \Delta t - \frac{1}{2}g^w \Delta t^2 + q_{wb_i} \iint_{t \in [i,j]} (q_{b_i b_j} a^{b_t}) dt^2 \\ & v_j^w = v_i^w - g^w \Delta t + q_{wb_i} \int_{t \in [i,j]} (q_{b_i b_j} a^{b_t}) dt^2 \\ & q_{wb_j} = q_{wb_i} \int_{t \in [i,j]} q_{b_i b_t} \otimes \begin{bmatrix} 0 \\ \frac{1}{2} \omega^{b_t} \end{bmatrix} dt \end{aligned}
Pwbj=Pwbi+viwΔt−21gwΔt2+qwbi∬t∈[i,j](qbibjabt)dt2vjw=viw−gwΔt+qwbi∫t∈[i,j](qbibjabt)dt2qwbj=qwbi∫t∈[i,j]qbibt⊗[021ωbt]dt 预积分的含义:
每次IMU的积分都是
t
(
i
<
t
<
=
j
)
t_{(i<t<=j)}
t(i<t<=j) 时刻相对于
i
i
i 时刻的IMU姿态的积分,而与世界坐标系无关。IMU积分都在IMU坐标系中完成,当需要其相对于世界坐标系的位姿关系时,再乘上
i
i
i 时刻的变换
q
w
b
i
q_{wb_i}
qwbi 即可。这样就将IMU积分从世界坐标系中分离。我们对比 3.1 节和 3.2 节的公式,可以发现
q
w
b
t
q_{wb_t}
qwbt 从积分公式中分离了出来,不再参与积分。
个人理解为:
本来IMU积分是在世界坐标系中进行积分,一旦一个 IMU相对于世界坐标系的变换
q
w
b
t
q_{wb_t}
qwbt 发生了改变,比如在积分完成后、优化过程中,
q
w
b
0
q_{wb_0}
qwb0 发生了改变,则由于后面所有的积分量在
q
w
b
0
q_{wb_0}
qwb0 所定义的变换中,则需要从
q
w
b
0
q_{wb_0}
qwb0 时刻利用积分公式一个一个的重新积分,这个过程为重传播。
但是利用预积分,相当于实在第
i
i
i 时刻和第
j
j
j 时刻之间的积分量视为一个数据段,这个数据段只保留这一段数据内的积分量,即 IMU 在body坐标系中的相对变换关系。这样相当于将整个 IMU 积分曲线进行了分段处理,这样在曲线某一点位置发生变化时,我们只需要对不同时刻的位置节点
q
w
b
i
q_{wb_i}
qwbi 进行相对位置关系的调整即可,则不要进行重积分。相当于 IMU 的预积分提供了不同节点
q
w
b
i
q_{wb_i}
qwbi 之间的约束关系。
3.3 预积分量
预积分量只与 IMU 测量值有关,它将一段时间内的 IMU 测量数据直接积分起来就得到了预积分量:
α
b
i
b
j
=
∬
t
∈
[
i
,
j
]
(
q
b
i
b
j
a
b
t
)
d
t
2
β
b
i
b
j
=
∫
t
∈
[
i
,
j
]
(
q
b
i
b
j
a
b
t
)
d
t
q
b
i
b
j
=
∫
t
∈
[
i
,
j
]
q
b
i
b
t
⊗
[
0
1
2
ω
b
t
]
d
t
\begin{aligned} & \alpha_{b_i b_j} = \iint_{t \in [i,j]} (q_{b_i b_j} a^{b_t}) dt^2 \\ & \beta_{b_i b_j} = \int_{t \in [i,j]} (q_{b_i b_j} a^{b_t}) dt \\ & q_{b_i b_j} = \int_{t \in [i,j]} q_{b_i b_t} \otimes \begin{bmatrix} 0 \\ \frac{1}{2} \omega^{b_t} \end{bmatrix} dt \end{aligned}
αbibj=∬t∈[i,j](qbibjabt)dt2βbibj=∫t∈[i,j](qbibjabt)dtqbibj=∫t∈[i,j]qbibt⊗[021ωbt]dt 式中,
α
b
i
b
j
\alpha_{b_i b_j}
αbibj 表示两时刻间位移的变化,
β
b
i
b
j
\beta_{b_i b_j}
βbibj 表示速度的变化,
q
b
i
b
j
q_{b_i b_j}
qbibj 表示姿态的变化。
重新整理 PVQ 的预积分公式,有:
[
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
]
\begin{bmatrix} P_{wb_j} \\ v_j^w \\ q_{wb_j} \\ b_j^a \\ b_j^g \end{bmatrix} = \begin{bmatrix} P_{wb_i} + v_i^w \Delta t - \frac{1}{2}g^w \Delta t^2 + q_{wb_i} \cdot \alpha_{b_i b_j} \\ v_i^w - g^w \Delta t + q_{wb_i} \cdot \beta_{b_i b_j} \\ q_{wb_i} \otimes q_{b_i b_j} \\ b_i^a \\ b_i^g \end{bmatrix}
⎣⎢⎢⎢⎢⎡Pwbjvjwqwbjbjabjg⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡Pwbi+viwΔt−21gwΔt2+qwbi⋅αbibjviw−gwΔt+qwbi⋅βbibjqwbi⊗qbibjbiabig⎦⎥⎥⎥⎥⎤
b
a
,
b
g
b^a,b^g
ba,bg 为偏置
b
i
a
s
bias
bias,同时由于
i
i
i 时刻和
j
j
j 时刻间隔很短,假设两时刻间
b
i
a
s
bias
bias 不变,则有
b
j
a
=
b
i
a
,
b
j
g
=
b
i
g
b_j^a = b_i^a,b_j^g = b_i^g
bja=bia,bjg=big。
(积分公式中的是点乘和
⊗
\otimes
⊗的问题,具体看代码)
P.S. 这里有
−
1
2
g
w
Δ
t
2
- \frac{1}{2}g^w \Delta t^2
−21gwΔt2 和
−
g
w
Δ
t
- g^w \Delta t
−gwΔt 是要减去两个时刻之间世界坐标系下的重力加速度分量对位移和速度的影响。
3.4 IMU预积分误差
利用一段时间内 IMU 构建的预积分量作为测量值,利用两个时刻之间的状态量的约束,构建误差:
[
r
p
r
q
r
v
r
b
a
r
b
g
]
15
×
1
=
[
q
b
i
w
(
P
w
b
j
−
P
w
b
i
−
v
i
w
Δ
t
+
1
2
g
w
Δ
t
2
)
−
α
b
i
b
j
2
[
q
b
j
b
i
⊗
(
q
b
i
w
⊗
q
w
b
j
)
]
x
y
z
q
b
i
w
(
v
j
w
−
v
i
w
+
g
w
Δ
t
)
−
β
b
i
b
j
b
j
a
−
b
i
a
b
j
g
−
b
i
g
]
\begin{bmatrix} r_p\\ r_q \\ r_v \\ r_ {b_a}\\ r_{b_g} \end{bmatrix}_{15\times1}= \begin{bmatrix}q_{b_i w}(P_{wb_j} - P_{wb_i} - v_i^w \Delta t + \frac{1}{2}g^w \Delta t^2) - \alpha_{b_i b_j} \\ 2[q_{b_j b_i} \otimes (q_{b_i w} \otimes q_{wb_j}) ]_{xyz} \\ q_{b_i w}(v_j^w - v_i^w + g^w\Delta t ) - \beta_{b_i b_j}\\ b_j^a - b_i^a \\ b_j^g - b_i^g\end{bmatrix}
⎣⎢⎢⎢⎢⎡rprqrvrbarbg⎦⎥⎥⎥⎥⎤15×1=⎣⎢⎢⎢⎢⎡qbiw(Pwbj−Pwbi−viwΔt+21gwΔt2)−αbibj2[qbjbi⊗(qbiw⊗qwbj)]xyzqbiw(vjw−viw+gwΔt)−βbibjbja−biabjg−big⎦⎥⎥⎥⎥⎤ 式中,所有与世界坐标系有关的量是待优化量,所以可以构建出相应的误差函数。
上面误差中位移,速度,偏置都是直接相减得到。而关于四元数的旋转误差
r
q
r_q
rq,使用
[
⋅
]
x
y
z
[\cdot]_{xyz}
[⋅]xyz 表示只取四元数的虚部
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)组成的三维向量。 这里之所以将虚部取出来×2,是因为我们在假设旋转角度很小时,四元数的实部接近 1,则用虚部就可以表达旋转。
3.5 预积分的离散形式
采用中值积分方法,即使用相邻两个时刻
k
k
k 和
k
+
1
k+1
k+1 时刻的测量值的平均值来计算积分。
则有:
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
)
]
q
b
i
b
k
+
1
=
q
b
i
b
k
⊗
[
0
1
2
ω
δ
t
]
α
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
k
g
δ
t
\begin{aligned} a &= \frac{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)] \\ \omega &= \frac{1}{2} [(\omega^{b_k} - b_k^g) + (\omega^{b_{k+1}} - b_k^g)] \\ q_{b_i b_{k+1}} &= q_{b_i b_k} \otimes \begin{bmatrix} 0 \\ \frac{1}{2} \omega \delta t \end{bmatrix} \\ \alpha_{b_i b_{k+1}} &= \alpha_{b_i b_k} + \beta_{b_i b_k} \delta t + \frac{1}{2} a \delta t^2 \\ \beta_{b_i b_{k+1}} & = \beta_{b_i b_k} + a \delta t \\ b^a_{k+1} & = b^a_k + n_{b^a_k} \delta t \\ b^g_{k+1} & = b^g_k + n_{b^g_k} \delta t \end{aligned}
aωqbibk+1αbibk+1βbibk+1bk+1abk+1g=21[qbibk(abk−bka)+qbibk+1(abk+1−bka)]=21[(ωbk−bkg)+(ωbk+1−bkg)]=qbibk⊗[021ωδt]=αbibk+βbibkδt+21aδt2=βbibk+aδt=bka+nbkaδt=bkg+nbkgδt
3.6 预积分的协方差传递
IMU 的测量是具有噪声的(高斯白噪声),在一段时间内,具有多个 IMU 测量值,如0.1s内有20个 IMU 的测量值。在使用时,我们使用这20个测量值积分成的一个测量值,那么这一个积分值也是有噪声的,这个积分值的噪声我们如何得到,它是如何由一个个测量值的噪声传递过来的呢?
一、协方差传递:
假设由线性系统
y
=
A
x
y=Ax
y=Ax ,
x
∈
N
(
0
,
Σ
x
)
x \in \mathcal{N}(0,\Sigma_x)
x∈N(0,Σx) ,则有
Σ
y
=
A
Σ
x
A
T
\Sigma_y=A \Sigma_x A^T
Σy=AΣxAT
Σ
y
=
E
(
(
A
x
)
(
A
x
)
T
)
=
E
(
A
x
x
T
A
)
=
A
Σ
x
A
T
\begin{aligned} \Sigma_y & = E((Ax)(Ax)^T) \\ &= E(Axx^TA) \\ & = A \Sigma_x A^T \end{aligned}
Σy=E((Ax)(Ax)T)=E(AxxTA)=AΣxAT
二、误差的线性传递方程:
假设已知相邻时刻误差的线性传递方程:
η
i
k
=
F
k
−
1
η
i
k
−
1
+
G
k
−
1
n
k
−
1
\eta_{ik} = F_{k-1} \eta_{i k-1} + G_{k-1} n_{k-1}
ηik=Fk−1ηik−1+Gk−1nk−1 比如:状态量误差为
η
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^g_k,n^a_k]
nk=[nkg,nka]。
误差的传递由两部分组成:1、上一时刻的误差传递给当前时刻;2、上一时刻的测量噪声传递给当前时刻。
则误差传递的协方差矩阵为:
Σ
i
k
=
F
k
−
1
Σ
i
k
−
1
F
k
−
1
T
+
G
k
−
1
Σ
n
G
k
−
1
T
\Sigma_{ik}=F_{k-1} \Sigma_{i k-1} F_{k-1}^T+ G_{k-1} \Sigma_n G_{k-1}^T
Σik=Fk−1Σik−1Fk−1T+Gk−1ΣnGk−1T 其中,
Σ
n
\Sigma_n
Σn 是测量噪声的协方差矩阵,通过 IMU 标定得到;方差
Σ
i
k
−
1
\Sigma_{ik-1}
Σik−1 从
i
i
i 时刻开始进行递推,
Σ
i
i
=
0
\Sigma_{ii}=0
Σii=0。
三、基于一阶泰勒展开的误差递推方程:
对于线性高斯系统,我们通过线性传递公式得到误差的传递方程。但是 VIO 系统是一个高度非线性的系统,要得到误差传递公式,首先要对系统进行一阶泰勒线性近似。
令状态量为
x
=
x
^
+
δ
x
x=\hat{x} + \delta x
x=x^+δx,其中,
x
^
\hat{x}
x^ 为真值,
δ
x
\delta x
δx 为误差。
假设非线性系统的输入量为
u
u
u,其噪声为
n
n
n,则对于非线性系统
x
k
=
f
(
x
k
−
1
,
u
k
−
1
)
x_k = f(x_{k-1}, u_{k-1})
xk=f(xk−1,uk−1),对其进行一阶泰勒展开,得到:
x
k
=
f
(
x
k
−
1
,
u
k
−
1
)
x
^
k
+
δ
x
k
=
f
(
x
^
k
−
1
+
δ
x
k
−
1
,
u
^
k
−
1
+
n
k
+
1
)
x
^
k
+
δ
x
k
=
f
(
x
^
k
−
1
,
u
^
k
)
+
F
δ
x
k
−
1
+
G
n
k
−
1
\begin{aligned} x_k &= f(x_{k-1}, u_{k-1}) \\ \hat{x}_k + \delta x_k &= f(\hat{x}_{k-1}+\delta x_{k-1}, \hat{u}_{k-1}+n_{k+1}) \\ \hat{x}_k + \delta x_k &= f(\hat{x}_{k-1}, \hat{u}_{k}) + F \delta x_{k-1} + G n_{k-1} \end{aligned}
xkx^k+δxkx^k+δxk=f(xk−1,uk−1)=f(x^k−1+δxk−1,u^k−1+nk+1)=f(x^k−1,u^k)+Fδxk−1+Gnk−1 这样,我们就有误差的传递方程:
δ
x
k
=
F
δ
x
k
−
1
+
G
n
k
−
1
\delta x_k = F \delta x_{k-1} + G n_{k-1}
δxk=Fδxk−1+Gnk−1 其中
F
F
F 是状态量
x
k
x_k
xk 对状态量
x
k
−
1
x_{k-1}
xk−1 的雅可比矩阵,
G
G
G 是状态量
x
k
x_k
xk 对输入量
u
k
u_k
uk 的雅可比矩阵。
计算出两个雅可比矩阵
F
F
F 和
G
G
G 的形式,就可以得到误差的传递方程。
四、雅可比矩阵的形式:
将测量噪声加入到预积分公式中去,得到:
ω
=
1
2
[
(
ω
ˉ
b
k
+
n
k
g
−
b
k
g
)
+
(
ω
ˉ
b
k
+
1
+
n
k
+
1
g
−
b
k
g
)
]
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
)
]
q
b
i
b
k
+
1
=
q
b
i
b
k
⊗
[
0
1
2
ω
δ
t
]
α
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
k
g
δ
t
\begin{aligned} \omega &= \frac{1}{2} [(\bar{\omega}^{b_k} + n_k^g - b_k^g) + (\bar{\omega}^{b_{k+1}} + n_{k+1}^g - b_k^g)] \\ a &= \frac{1}{2}[ q_{b_i b_k}(\bar{a}^{b_k} + n^a_k - b_k^a) + q_{b_i b_{k+1}}(a^{b_{k+1}} + n^a_{k+1} -b_k^a)] \\ q_{b_i b_{k+1}} &= q_{b_i b_k} \otimes \begin{bmatrix} 0 \\ \frac{1}{2} \omega \delta t \end{bmatrix} \\ \alpha_{b_i b_{k+1}} &= \alpha_{b_i b_k} + \beta_{b_i b_k} \delta t + \frac{1}{2} a \delta t^2 \\ \beta_{b_i b_{k+1}} & = \beta_{b_i b_k} + a \delta t \\ b^a_{k+1} & = b^a_k + n_{b^a_k} \delta t \\ b^g_{k+1} & = b^g_k + n_{b^g_k} \delta t \end{aligned}
ωaqbibk+1αbibk+1βbibk+1bk+1abk+1g=21[(ωˉbk+nkg−bkg)+(ωˉbk+1+nk+1g−bkg)]=21[qbibk(aˉbk+nka−bka)+qbibk+1(abk+1+nk+1a−bka)]=qbibk⊗[021ωδt]=αbibk+βbibkδt+21aδt2=βbibk+aδt=bka+nbkaδt=bkg+nbkgδt 构建的误差传递方程为:
[
δ
α
b
k
+
1
δ
θ
b
k
+
1
δ
β
b
k
+
1
δ
b
b
k
+
1
a
δ
b
b
k
+
1
g
]
=
F
[
δ
α
b
k
δ
θ
b
k
δ
β
b
k
δ
b
b
k
a
δ
b
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
]
\begin{bmatrix} \delta \alpha_{b_{k+1}} \\ \delta \theta_{b_{k+1}} \\ \delta \beta_{b_{k+1}} \\ \delta b^a_{b_{k+1}} \\ \delta b^g_{b_{k+1}} \end{bmatrix} = F \begin{bmatrix} \delta \alpha_{b_{k}} \\ \delta \theta_{b_{k}} \\ \delta \beta_{b_{k}} \\ \delta b^a_{b_{k}} \\ \delta b^g_{b_{k}} \end{bmatrix} +G \begin{bmatrix} n_k^a \\ n_k^g \\ n^a_{k+1} \\ n^g_{k+1} \\ n_{b^a_k} \\ n_{b^g_k} \end{bmatrix}
⎣⎢⎢⎢⎢⎡δαbk+1δθbk+1δβbk+1δbbk+1aδbbk+1g⎦⎥⎥⎥⎥⎤=F⎣⎢⎢⎢⎢⎡δαbkδθbkδβbkδbbkaδbbkg⎦⎥⎥⎥⎥⎤+G⎣⎢⎢⎢⎢⎢⎢⎡nkankgnk+1ank+1gnbkanbkg⎦⎥⎥⎥⎥⎥⎥⎤ 其中
F
F
F 和
G
G
G 的形式如下:
4.VIO系统残差Jacobian
(还未理解,未来补)