目录
0. 前言
从接触SLAM开始,多传感器融合一直是该领域的核心,自己也对这块充满了好奇。下面就讲一个自己最开始接触传感器融合的故事吧。
- 导入
在大学期间,第一次做平衡车开始,需要让小车保持平衡,就需要对平衡车进行倾斜角的测量,用到了常见的MEMS惯性传感器MPU6050,里面有XYZ三轴的加速度计,还有XYZ三轴的陀螺仪也就是角速度计,按照常理而言,直接对各个轴的角速度进行积分可以计算出倾角,但是由于设备低廉,你不能保证它静止的时候角速度测量值真的为0度/s,直接积分容易出问题。 - 转机
于是各种查资料,得知物体一直受到重力影响,而加速度刚好又是专门测量加速度的。那么就开始了假设,物体在匀速运动过程中,通过倾斜过程中测量得到的重力加速度在各个轴的分量,可以计算出倾角的大小【狂喜】。实现的过程中发现,物体并不是永远匀速只受到重力加速度,小车稍微的电机振动,就偏差大的不得了。 - 加权融合
加速度测量得到的角度有部分真实可信,但是角速度直接积分又容易出问题。于是又查资料得知,在每次角速度积分的过程中,将加速度测量的角度进行加权,作为本次积分的最终结果,发现效果还不错。于是小车的倾角测量也就终于解决了,后面就是如何根据倾角控制小车平衡了。 - 心得
说实话,不断的查资料解决各种问题让我很有成就感,然后我也就慢慢接触融合相关的内容了。最后,不断的有中想法,就是有没有更好的方案,后面了解到了卡尔曼滤波,然后就是EKF、UKF、ESKF、IEKF。截至目前要讲的非线性优化融合。但是需要注意的是,截至到下面介绍非线性的方案之前,困扰我的是如何使得迭代更加准确,然而融合优化的过程很多时候不一定对实时有那么高的要求,而是对全局的误差最小。
1. 非线性优化融合简介
- 这套理论是基于最小二乘法的,里面的有些相关内容与EKF很相似,但又有些思想不太一样。EKF是将非线性测量系统进行了一阶泰勒展开,然后根据变换后的观测先验与真实观测的残差进行状态的优化,需要自己看完这方面后自己总结。
- 下面这方面的内容,假设你已经对最小二乘的拟合、求解已经有了初步的认识。
- 下面我是基于 IMU 与 Camera 来讲述的。我们将从一个从顶向下的逻辑认识,也就是由简单到复杂的过程。
2. 基于最小二乘法的多传感器融合步骤
2.1 优化的对象:全局 or 局部
进行优化之前,你需要明确你是要全局整体误差最小,还是考虑要求实时性较高的局部最优,这二者的思想有些不太一样。
,这篇文章主要对全局优化进行介绍。
-
将全局的观测数据进行最优化
:这个一般会对所有的边和节点,结合所有观测的误差信息,整体计算一次
,得到每一个节点的状态
的最优状态。这个的实现有两种
,一种是每新增一个数据就重新计算
。另一种就是每新增一个数据,内部自动保留以前的结果,增量更新,就不用手动添加全部节点,只需要增量假如新节点,这个也会更新全部节点
,如ISAM2,适合实时性较高的场景。两种的优化结果理论上一致
,能够使得全局优化保持一致。 -
具有先验信息的局部最优化
:这种一般会将以前的优化信息总结为先验信息
,包括先验状态、先验协方差等信息,然后结合当前的测量信息以及观测信息
,进行后验估计
,包含后验状态、后验协方差。然后作为下一次迭代优化的先验信息
。这种是迭代优化方案,具有局部最优,无法保证全局最优
。如EKF、ESKF、UKF等
2.2. 定义系统需要优化状态
- 在进行优化之前,我们必须知道系统需要最终优化的变量是什么,在SLAM系统中一般需要对机器人位置姿态进行计算。由于我们系统使用了IMU,那么再加一项状态就是关于IMU的测量偏差的估计
b
i
a
s
bias
bias,最终系统的状态量如下,注意它是一个列向量
x = [ P w b j , Q w b j , V j w , b a b j , b g b j ] T ( 式2-1) x=[P_{wbj},Q_{wbj},V_{j}^w,b_a^{bj},b_g^{bj}]^T \tag{ 式2-1} x=[Pwbj,Qwbj,Vjw,babj,bgbj]T( 式2-1)
2.2 构造优化函数
- 与传统单项最小二乘法不同的是,多传感器融合涵盖不同传感器,这些传感器之间不会相互影响,因此传感器之间是不相关的,那么就可以单独考虑每个传感器单独构造的代价函数。
- 因为需要多传感器融合,而且最终的目的只有一个就是得到最优状态,那么就需要设计一个
含全部信息的代价优化函数
,也就是 F F F,这个 F F F需要包含IMU的信息,也要包含Camera的信息。实际上,这两个传感器,各自单独都可以估计我们最终的状态
,那挺好,我们就根据他们各自独立的代价优化函数,最后给加起来就行。 - 假如IMU的独立代价优化函数为
F
i
m
u
F_{imu}
Fimu,相机的代价优化函数为
F
c
a
m
F_{cam}
Fcam,由此我们得到一个包含全部信息的代价优化函数
F
F
F
F = F i m u + F c a m = ∑ i = 1 m ∣ ∣ f i m u i ∣ ∣ 2 + ∑ i = 1 n ∣ ∣ f c a m i ∣ ∣ 2 = f i m u T ⋅ f i m u + f c a m T ⋅ f c a m ( 式2-2) \begin{align} F &=F_{imu}+F_{cam} \\ &= \sum_{i=1}^{m}||f_{imu}^i||^2+\sum_{i=1}^{n}||f_{cam}^i||^2\\ &=f^T_{imu} \cdot f_{imu}+f^T_{cam} \cdot f_{cam} \end{align} \tag{ 式2-2} F=Fimu+Fcam=i=1∑m∣∣fimui∣∣2+i=1∑n∣∣fcami∣∣2=fimuT⋅fimu+fcamT⋅fcam( 式2-2) - 需要解释的是,
f
i
m
u
f_{imu}
fimu是IMU构建的残差向量,具体表示如下,在优化的过程中,IMU的
i
i
i到
j
j
j时刻的
预积分量
α b i b j \alpha_{b_ib_j} αbibj、 q b j b i q_{b_jb_i} qbjbi、 β b j b i \beta b_jb_i βbjbi是已知的,而且上一时刻状态
p w b i p_{wb_i} pwbi、 q b i w q_{b_iw} qbiw、 v i w v_i^w viw、 b i a b_i^a bia、 b i g b_i^g big也是已知的,剩下的也就是需要优化的状态量
x = [ P w b j , Q w b j , V j w , b a b j , b g b j ] x=[P_{wbj},Q_{wbj},V_{j}^w,b_a^{bj},b_g^{bj}] x=[Pwbj,Qwbj,Vjw,babj,bgbj]是可变的,不过它是有初值的
。【插一嘴】:残差向量函数中的残差项,实际上是由状态量进行变换后,与观测量如预积分之间的差值。这与EKF中的残差构建很像。
f i m u = [ f i m u 1 f i m u 2 f i m u 3 f i m u 4 f i m u 5 ] = [ r p r q r v r b a r b g ] = [ 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 ) ] 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 ] (式2-3) f_{imu}= \begin{bmatrix} f_{imu}^1 \\ \\ f_{imu}^2 \\ \\ f_{imu}^3 \\ \\ f_{imu}^4 \\ \\ f_{imu}^5 \end{bmatrix} = \begin{bmatrix} r_p \\\\ r_q \\\\ r_v \\\\ r_{ba} \\\\ r_{bg} \end{bmatrix} = \begin{bmatrix} q_{b_iw} (p_{wb_j} - p_{wb_i}-v_i^w\triangle t+\frac{1}{2}g^w\triangle t^2) -\alpha_{b_ib_j}\\\\ 2[q_{b_jb_i} \otimes(q_{b_iw} \otimes q_{wb_j})] \\\\ q_{b_iw}(v_j^w - v_i^w + g^w \triangle t) - \beta_{b_ib_j} \\\\ b_j^a-b_i^a \\\\ b_j^g - b_i^g \end{bmatrix} \tag{式2-3} fimu= fimu1fimu2fimu3fimu4fimu5 = rprqrvrbarbg = qbiw(pwbj−pwbi−viw△t+21gw△t2)−αbibj2[qbjbi⊗(qbiw⊗qwbj)]qbiw(vjw−viw+gw△t)−βbibjbja−biabjg−big (式2-3)
2.3 状态变量的优化更新
- 根据代价函数的雅可比矩阵,来优化状态变量,已经有了相关算法研究,这里介绍最简单的最速梯度下降。需要注意
x
k
x_k
xk可以看作有值的。
x k + 1 − x k = − J k T (式2-4) x_{k+1} - x_k = -J_k^T \tag{式2-4} xk+1−xk=−JkT(式2-4) - 本次更新中,每迭代更新都需要更新雅可比矩阵
J
k
J_k
Jk,这个
J
k
J_k
Jk是
总的代价优化函数F 关于 状态x 的雅可比矩阵
,计算表达式如下,最终的结果为两部分独立代价函数对状态的雅可比矩阵之和。
J k = ∂ F ∂ x = ∂ F i m u ∂ x + ∂ F c a m ∂ x = [ ∂ F i m u ∂ x 1 , ∂ F i m u ∂ x 2 . . . ∂ F i m u ∂ x n ] + [ ∂ F c a m ∂ x 1 , ∂ F c a m ∂ x 2 . . . ∂ F c a m ∂ x n ] (式2-5) \begin{align} J_k &= \frac{\partial F}{\partial x} \\\\ &= \frac{\partial F_{imu}}{\partial x} + \frac{\partial F_{cam}}{\partial x} \\\\ &= [ \frac{\partial F_{imu}}{\partial x_1}, \frac{\partial F_{imu}}{\partial x_2} ... \frac{\partial F_{imu}}{\partial x_n} ] + [ \frac{\partial F_{cam}}{\partial x_1}, \frac{\partial F_{cam}}{\partial x_2} ... \frac{\partial F_{cam}}{\partial x_n} ] \end{align} \tag{式2-5} Jk=∂x∂F=∂x∂Fimu+∂x∂Fcam=[∂x1∂Fimu,∂x2∂Fimu...∂xn∂Fimu]+[∂x1∂Fcam,∂x2∂Fcam...∂xn∂Fcam](式2-5) - 实际应用中,
每一部分如
∂ F i m u ∂ x \frac{\partial F_{imu}}{\partial x} ∂x∂Fimu是相对计算的
,如 LM优化中,它会先
计算残差向量函数 f i m u f_{imu} fimu关于状态的雅可比矩阵 J f i m u J_{f_{imu}} Jfimu,以及未更新状态前的残差向量值 f i m u f_{imu} fimu,然后通过等价形式得到 F i m u F_{imu} Fimu关于状态的雅可比矩阵。
∂ F i m u ∂ x = ( J f i m u T ⋅ f i m u ) T ,且 J f i m u T = ∂ f i m u ∂ x = [ J 1 x J 2 x . . . J 5 x ] (式2-6) \frac{\partial F_{imu}}{\partial x}= (J^T_{f_{imu}} \cdot {f_{imu}})^T,且J^T_{f_{imu}}=\frac{\partial f_{imu}}{\partial x}= \begin{bmatrix} J_1{x} \\\\ J_2{x} \\\\ ... \\\\ J_5{x} \end{bmatrix} \tag {式2-6} ∂x∂Fimu=(JfimuT⋅fimu)T,且JfimuT=∂x∂fimu= J1xJ2x...J5x (式2-6)
2.4 引入各自协方差作为更新权重
-
在因子图中,每一个因子的分布都是一个多维高斯分布,因此
不同观测因子有着不同的协方差
,那么该观测因子对于节点状态的更新权重不一样
。此时需要考虑 IMU和Camera 各自协方差。
p ( x ) = 1 ∣ 2 π Σ ∣ ⋅ e x p − 1 2 ( x − u ) T Σ − 1 ( x − u ) p(x)=\frac{1}{\sqrt{|2\pi \Sigma|}}\cdot exp^{ -\frac{1}{2}(x-u)^T \Sigma^{-1} (x-u) } p(x)=∣2πΣ∣1⋅exp−21(x−u)TΣ−1(x−u) -
信息矩阵:它是协方差矩阵的逆
,内部的元素代表变量之间影响程度,0代表二者不影响,这玩意源自多元正态分布;协方差矩阵某元素为0,其对应信息矩阵元素不一定为0。对信息矩阵的元素进行操作时,需要了解边缘化、舒尔补
。 -
假如IMU预积分量的协方差为 Σ i m u \Sigma_{imu} Σimu ,在IMU的代价优化函数中,对于状态量引入信息矩阵的解为
J f i m u T ⋅ Σ i m u − 1 ⋅ J f i m u ⏟ I M U 预积分的贡献 ⋅ △ x = − J f i m u T ⋅ Σ i m u − 1 ⋅ f i m u ⏟ I M U 预积分的贡献 \underbrace{J^T_{f_{imu}}\cdot \Sigma_{imu}^{-1}\cdot J_{f_{imu}}}_{IMU预积分的贡献} \cdot \triangle x=- \underbrace{J^T_{f_{imu}}\cdot \Sigma^{-1}_{imu}\cdot f_{imu}}_{IMU预积分的贡献} IMU预积分的贡献 JfimuT⋅Σimu−1⋅Jfimu⋅△x=−IMU预积分的贡献 JfimuT⋅Σimu−1⋅fimu -
对于
多个因子的更新累加形式
,自己推的话有些地方还是需要注意下,已核查的正确如下:
( ∑ i = 1 J f i T ⋅ Σ i − 1 ⋅ J f i ) ⋅ △ x = ( ∑ J f i T ⋅ Σ i − 1 ⋅ f i ) (\sum_{i=1} J^T_{f_{i}}\cdot \Sigma_{i}^{-1}\cdot J_{f_{i}}) \cdot \triangle x = (\sum J^T_{f_{i}}\cdot \Sigma^{-1}_{i}\cdot f_{i}) (i=1∑JfiT⋅Σi−1⋅Jfi)⋅△x=(∑JfiT⋅Σi−1⋅fi)
3. IMU预积分相关知识
3.1 IMU预积分的残差
- 这部分内容实际上为了构建系统需要估计的状态与IMU预积分量之间的残差,实际上是为了服务状态估计的。只不过状态量为系统状态量,也就是待估计状态,然后预积分量作为观测,从而构建残差。
- IMU的残差构建如(式子2-3)
3.2 残差关于状态的雅可比矩阵
- 优化的过程中,待估计的状态 x x x 一般是有初值的,变换后与观测量存在差值,此时需要通过差值更新状态 x x x,因此需要计算残差项关于状态的雅可比矩阵。
3.3 IMU预积分过程的协方差
- 在IMU进行预积分的过程中,加速度计和角速度计都是有噪声的,那么它的每一次积分都会使得误差累积,因此需要考量:
1. 之前预积分的协方差如何变化
,2.当前积分过程中噪声对方差的变化
. - 噪声传播:因此期望得到下面在每次预积分迭代过程中,关于噪声的传播如下,
a
a
a 代表加速度计,
g
g
g 代表角速度计;
δ
\delta
δ 代表误差,
n
n
n 代表测量噪声。
[ δ α k + 1 δ θ k + 1 δ β k + 1 δ b a k + 1 δ b g k + 1 ] = F ⋅ [ δ α k δ θ k δ β k δ b a k δ b g k ] + G ⋅ [ n a n g n a n b a n b g ] \begin{bmatrix} \delta \alpha_{k+1} \\\\ \delta \theta_{k+1} \\\\ \delta \beta_{k+1} \\\\ \delta b_{a_{k+1}} \\\\ \delta b_{g_{k+1}} \end{bmatrix} =F\cdot \begin{bmatrix} \delta \alpha_k \\\\ \delta \theta_k \\\\ \delta \beta_k \\\\ \delta b_{a_k} \\\\ \delta b_{g_k} \end{bmatrix}+ G\cdot \begin{bmatrix} n_a \\\\ n_g \\\\ n_a \\\\ n_{b_a} \\\\ n_{b_g} \end{bmatrix} δαk+1δθk+1δβk+1δbak+1δbgk+1 =F⋅ δαkδθkδβkδbakδbgk +G⋅ nangnanbanbg - 噪声传播得到协方差传播,注意这是
预积分量的协方差
。除非你起始就开始积分,才代表状态量。注意,刚开始时
Σ k = 0 \Sigma_k=0 Σk=0
Σ k = F k − 1 ⋅ Σ k − 1 ⋅ F k − 1 T + G k − 1 ⋅ Σ n ⋅ G k − 1 \Sigma_k=F_{k-1} \cdot \Sigma_{k-1} \cdot F^T_{k-1} + G_{k-1} \cdot \Sigma_n \cdot G_{k-1} Σk=Fk−1⋅Σk−1⋅Fk−1T+Gk−1⋅Σn⋅Gk−1
4. 相机相关知识
4.1 BA(Bundle Adjustment)
- 简介:BA是针对
一段时间内
相机与被观测点构成的观测关系,进行相机Pose、被观测点LandMark的Pose最优化的问题
5. 推荐链接:
- 知乎:从零开始做自动驾驶定位
- CSDN:自制SLAM框架