VSLAM(7):后端优化---滤波器方法和BA图优化

在视觉里程计完成每次的位姿估计后,可以实时地得到一个短时间内的轨迹和地图点,但是由于估计本身具有误差,这个误差会一直保持并不断累加。所以可以构建一个尺度和规模更大的优化问题,来计算一段长时间内的最有轨迹和地图。

一, 后端优化综述

SLAM问题可以由运动方程和观测方程描述,设从t=0到t=N这个时间段内,机器人经过了x_0x_N的位姿点,观测到了y_1,...,y_M这么多的特征点,那么有:

视觉前段往往在某一时刻会观测很多的特征点,所以实际中观测方程的数量会远远多于运动方程的数量;同时,机器人系统本身没有测量运动设备,可能不具备运动方程,这时候的优化问题就由很多个观测方程组成。

后端(backend)实现的是其实本质上是一个状态估计问题,从带噪声的估计数据(noisy data)中估计内在状态(inner state)。在前端的数据进来后,本身带有误差,而后端要处理的就是将这个误差最小化。如果我们考虑k时刻之前的所有状态关系,此时就可以使用非线性优化的方法在一定数据规模内构造非线性问题来求解最优解,这种方法称为批量式(Batch)。另一种方法称为渐进式(incremental),是基于马尔可夫性,假设当前时刻的状态只跟上一刻的状态有关。这类方法最具代表性的就是基于卡尔曼滤波器。

二,渐进式

2.1 线性系统与KF

当一个系统是线性系统,并且它的运动模型和观测模型符合高斯分布,那这时候就可以用卡尔曼滤波对状态进行最有估计。卡尔曼滤波的原理是基于贝叶斯公式和高斯分布相乘还是高斯分布的特性推导出来的,具体的推到公式网上很多。

2.2 非线性系统和EKF

当系统是一个非线性系统时,为了使卡尔曼滤波继续成立,可以利用一节泰勒展开来对系统做近似线性化,再对线性化后的系统使用卡尔曼滤波,得到最优估计。这种方法叫做扩展卡尔曼滤波,也称为EKF(extend Kalman Filter)。

2.3 其他滤波器方法

上溯两种最基础的滤波器方法都是基于噪声符合高斯分布的假设下,但是实际的噪声分布往往是各种模型甚至没有具体的模型。对于已知的噪声分布,往往可以使用粒子滤波的方法来对状态进行估计。粒子滤波器是假设噪声分布符合一定规律,这时候就可以按照这个噪声分布撒n个粒子来近似噪声的分布,同时每个粒子的权重与它与均值之间的距离成反比。每个周期对粒子权重进行更新,同时将权重过小的粒子剔除并撒进行新的粒子代替。具体的解释可以参考

除了粒子滤波,还有滑动窗口(sliding window filter)和MSCKF(multiple state Kalman)等基于滤波器的方法。

三,批量式

3.1 Bundle Adjustment

BA(Bundle Adjustment)是基于观测到的一定量的数据,书写多个关于位姿和路标的等式,利用非线性优化的方法求解最优值。相机的观测模型记作:

其中x为相机位姿的李代数,y为路标的三位坐标。而观测数据则是路标的像素坐标。设相机在z_{ij}处观测到了路标p_{j},那么整个BA优化的代价函数就可以定义为:

待优化的变量为:

 就像之前介绍的优化方法,我们需要求解每次循环的增量来逼近最优值,目标函数就变成了:

 其中代表整个代价函数在当前状态下对相机位姿的偏导数,而代表代价函数在当前状态下对路标点的偏导数。

求解优化增量,需要求解增量线性方程,对于G-N和L-M方法,有:

 两种方法的区别就是H的定义不一样,一个是H=J^TJ,另一个是H = J^TJ +\lambda I。但是雅可比矩阵的定义是一样的,都是:

但是因为需要同时优化位姿和路标,矩阵的维度往往会很大,对H的求导往往很复杂。

3.2 稀疏性和边缘化

考虑一个误差项e_{ij},他表示机器人在第i个位姿下观测到了第j个路标,那么这个误差项就只跟这两项有关,其他项求偏导就为零,所以该误差的格式如下:

 这个误差项除了两处为非零块,其他均为零。这体现了该误差项和其他路标和轨迹无关的特性。假设使用高斯牛顿的方法求解非线性最优值,那么此时就有H=J^TJ,根据雅可比矩阵的性质,我们可以将H进行分块:

H = \begin{bmatrix} H_{11} &H_{12} \\ H_{21} & H_{22} \end{bmatrix}.

左上角是误差关于位姿的雅可比矩阵,右下角是关于路标点的。在遍历这个矩阵的时候,不管i和j怎么变,H_{11}都是一个对角阵,只有在H_{ii}处非零;同样的H_{22}也只在H_{JJ}处非零。对于另外两个矩阵H_{12}H_{21},他们由具体的观测情况而定,如过每次观测都可以观测到很多的路标,那么他们就是稠密的,反之则是稀疏的。

这里高博举了一个例子来更好的说明H的稀疏性。假设机器人经过2个位姿点,观测到了6个路标点。在位姿1处观测到了P1-4,而在位姿二处观测到了P3-6,这个场景的图结构如下图所示:

 那么此时的我们需要优化的BA目标函数就是:

\frac{1}{2}(||e_{11}||^2+||e_{12}|^2|+||e_{13}||^2+||e_{14}||^2+||e_{23}||^2+||e_{24}||^2+||e_{25}||^2+||e_{26}||^2)

e_{11} 为例,这个误差函数代表了相机在位姿点1初观测到路标点1这个事件的误差,因为只跟路标点1和位姿点1有关,所以他的雅可比矩阵定义如下:

J_{11} = \frac{\partial e_{11}}{\partial x } = (\frac{\partial e_{11}}{\partial C_1}, 0_{2* 6}, \frac{\partial e_{11}}{\partial p_1}, 0_{2*3}, 0_{2*3}, 0_{2*3},0_{2*3},0_{2*3},)

可以直观的看到这个雅可比矩阵中只有两个非零块,大小分别是2*6和2*3,用图来表示就是:

 当我们把每个误差项都进行这样的操作后就得到一个8*8个矩阵块的雅可比矩阵,同时根据高斯牛顿法其对应的H矩阵也会有类似的结构:

 在实际情况中,路标数量往往会远大于位姿点数量,这就导致右上角H_{11}的维度远小于H_{22}的,整个H的形状会像箭头一样,成为箭头形(Arrow-like)矩阵,如下图:

 这样我们就可以这个性质来加速计算求解线性方程H \Delta x =g,加速手段又称为边缘化(Marginalization)或则叫做Schur消元(Schur trick)。将H矩阵按以下区域划分:

\begin{bmatrix} B &E \\ E^T & C \end{bmatrix} \begin{bmatrix} \Delta x_c \\ \Delta x_P \end{bmatrix} = \begin{bmatrix} v\\ w \end{bmatrix}

 其中B和C是对角块矩阵,B的每个对角块的维度和位姿点维度一样,对角块个数和位姿点个数一样,C代表路标点,同理,每个块的维度为3*3,数量为路边点总数。对角块矩阵的求逆难度往往远小于一般矩阵的求逆难度,所以可以分开求逆。利用高斯消元可以将右上角的E消去,然后就可以先解第一行关于位姿的增量方程,把解出来的位姿增量\Delta x_c代入到原方程求解路标增量\Delta x_p。具体的计算过程如下:

\begin{bmatrix} I & -EC^{-1}\\ 0&I \end{bmatrix} \begin{bmatrix} B & E\\ E^T&C \end{bmatrix} \begin{bmatrix} \Delta x_c \\ \Delta x_p \end{bmatrix} = \begin{bmatrix} I & -EC^{-1}\\ 0&I \end{bmatrix} \begin{bmatrix} v \\ w \end{bmatrix}

整理得

\begin{bmatrix} B-EC^{-1}E^T & 0\\ E^T &C \end{bmatrix} \begin{bmatrix} \Delta x_c\\ \Delta x_p \end{bmatrix} = \begin{bmatrix} v-EC^{-1}w\\ w \end{bmatrix}

将第一行提取出来得到

[B-EC^{-1}E^T] \Delta x_c = v-EC^{-1}w

可以看到,这个方程需要求解C^{-1},因为C是对角块矩阵这个性质,求解会容易很多。同时在求解出\Delta x_c后,利用方程\Delta x_p = C^{-1}(w-E^T \Delta x_c)就可以求解出路标增量\Delta x_p。这个过程称为Marginalization或则Schur消元。下图展示了一个上面线性方程系数矩阵S的实例,可以看出它并不是稀疏的:

同时这个矩阵也是有一定意义的:它的非对角线上的非零矩阵块,表示了该处对应两个相机变量之间存在共视(co-visiblity)关系,即他们共同观测到某个路标点。反之为零则表示没有共同观测

在实践当中,例如 ORB_SLAM 中的 Local Mapping 环节,在做 BA 的时候刻意选择那些具有共同观测的帧作为关键帧,在这种情况下 Schur 消元后得到的 S 就是稠密矩阵。不过,由于这个模块并不是实时执行,所以这种做法也是可以接受的。但是在另一些方法里面,例如 DSO, OKVIS 等,它们采用了滑动窗口方法( Sliding Window )。这类方法对每 一帧都要求做一次 BA 来防止误差的累积,因此它们也必须采用一些技巧来保持 S 矩阵的稀疏性。

从概率角度来解释边缘化,实际是把同时求解(\Delta x_c,\Delta x_p)变成了先求解\Delta x_c再求解\Delta x_p。相当是求解条件概率:

 3.3 鲁棒核函数

因为实际情况中往往存在误匹配的情况,导致加入一些本应该没有的边加入图优化中。这边的误差很大的时候往往会抹平其他正确变得影响,使得最终的优化结果与正确值偏差很大。因为上面对于优化函数定义为误差的平方(即二范数),这在误差比较大时会增长很快,为了解决这个问题,引入核函数来保证每条边的误差不会过大,导致最终结果偏差大。

把原先的优化函数从误差的二次方替换为一个其他函数。这个替换的函数需要增长没有那么快,同时保证自己的光滑性,使得整个优化过程更加鲁棒。这个函数成为鲁棒核函数(Robust Kernal)

常见的鲁棒核函数由Huber核:

 这个核函数表示的是当误差不超过阈值时候,还是按照二范数来定义,但是如果大于阈值,就由二次型转换为了一次型,限制了增长速度。同时Huber函数也是光滑的,便于求导。下图是Huber函数与二次函数的对比:

 除了Huber核,还有Cauthy核,Tukey核,在g2o和ceres函数库中有定义。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RGB-D视觉里程计是一种利用RGB-D相机的深度信息来进行定位和导航的技术。它通过同时使用RGB像和深度像来估计相机的运动和环境的结构。引用\[2\]中提到了一些研究人员利用RGB-D相机的深度信息来提高纯VIO/VI-SLAM系统的性能。深度信息对VIO的初始化和优化过程都有好处,并且可以提高在低纹理环境下的鲁棒性。此外,引用\[3\]中介绍了一种名为S-VIO的RGB-D视觉惯性里程计算法,它充分利用了多传感器测量、异质地标和环境的结构规则来获得鲁棒准确的定位结果。S-VIO算法在实验中表现出比传统的VIO算法和RGB-D VIO算法更好的精度和鲁棒性。因此,RGB-D视觉里程计是一种有潜力的技术,可以在各种应用中提供更准确和鲁棒的定位和导航能力。 #### 引用[.reference_title] - *1* [5、RGB-D— 视觉里程计 Visual Odometry](https://blog.csdn.net/Discoverhfub/article/details/78591698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vslam论文18:S-VIO:利用的结构约束的RGB-D视觉惯性里程计(RAL 2023)](https://blog.csdn.net/xsyaoxuexi/article/details/131571846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值