声明:本文是深蓝学院 高翔博士主讲的《SLAM理论与实践》的学习笔记。
早期主要使用滤波器,后来发展到优化为主(滤波器类似计算机视觉中的传统方法 BA类似于DL方法 )。
早期滤波器怎么来的?
后端(Backend):从带噪声的数据估计内在状态——状态估计问题 (Estimated the inner state from noisy data) 用u,z推断x,y (x是R,t , y是地图路标点)
求解方法:
渐进式(Incremental 也叫 recursive)
批量式(Batch):给定一定规模的数据,计算该数据下的最优估计(优化)。 例如无人机上面的相机先拍了一个视频和采集了一些传感器数据,希望绘制出城市地图
运动方程和观测方程可以用一个直观的例子理解:
当我们蒙着眼走路时(对应运动方程, 每一次运动都会丢失信息, 例如使用轮式里程计 会存在累计误差):
某个时刻睁开眼睛时(对应观测方程,每一次观测都会获取新的信息,增加对状态估计的确定性, 例如)
每一次运动都会先丢失信息(PREDICTION: 运动方程的估计会有偏差增加噪声,只能确定大致范围,方差增大),然后通过观测增加确定性( UPDATE:因为观测的不确定性较小,可以修正运动估计的误差,方差减小)。
同理,可以用渐进式和批量式两种方式描述这个过程
实际上SLAM的问题还要难一些,它面对的是未知环境, 观测的路标点 事先并不确定位置(不像你在自己家里熟悉某一幅画的具体位置) ,而是一边走一边把路标地图建立出来的。
数学描述
通过数学描述能否看出,滤波器与优化方法之间 的联系与区别。
t = 0 … N 时间内,机器人的位姿为 x0...xn x 0 . . . x n 同时有路标 y1,y2...ym y 1 , y 2 . . . y m : 运动和观测方程记为:
注意:运动和观测都受噪声影响;纯视觉SLAM(比如手持相机)就没有运动方程
推导卡尔曼滤波
我们从贝叶斯滤波器方法来推导卡尔曼滤波
有了以上结果之后可以带入具体的分布形式。
在线性模型、高斯状态分布下,我们将得到卡尔曼滤波器
卡尔曼滤波器的推导: 运动方程和观测方程采用线性模型。
线性模型和高斯噪声
那么预测(k-1时刻后验通过运动方程推算k时刻先验) : 并记成 需要用到高斯分布的线性组合性质。 而且由于假设 xk−1 x k − 1 已知直接可得 P(xk|x0,u1:k,z1:k−1)=P(xk|xk−1,x0,u1:k,z1:k−1)=P(xk|xk−1,uk) P ( x k | x 0 , u 1 : k , z 1 : k − 1 ) = P ( x k | x k − 1 , x 0 , u 1 : k , z 1 : k − 1 ) = P ( x k | x k − 1 , u k )
? 就不需要求解下面的积分 ?
预备知识:高斯分布的线性变换
根据观测方程,得到似然 : 为什么不是 P(zk|xk)=N(Ckxk¯¯¯¯¯,CkPk¯¯¯¯¯¯CTk+Q) P ( z k | x k ) = N ( C k x k ¯ , C k P k ¯ C k T + Q ) ? 因为假设x已知?把x_k当常量?
根据前面的Bayes展开: 需要计算两个分布的乘积 技巧:已经两侧均是高斯分布,所以 既然都是高斯分布,我们比较指数部分的二次项和一次项部分即可。 指数部分展开 类别于scale形式的 (x−u)2/2σ ( x − u ) 2 / 2 σ : 比较 xK x K 的二次和一次项系数,对于二次项,有 再考虑一次项 比较一次项系数: 整理之 两侧同乘 Pk^ P k ^ 并定义得 称为卡尔曼滤波的更新式
对先验的均值加上一个修正量(卡尔曼增益×观测误差) 就得到后验的均值。
小结:
根据SWB恒等式可知其中K与前面的K是等价的。 经典卡尔曼滤波器的五个公式,给出了线性高斯系统的最优无偏估计
卡尔曼滤波器的假设:
在非线性模型、高斯状态分布下,可以在工作点附近线性展开,得到扩展卡尔曼滤波器
Kalman Filter的非线性扩展:EKF
在工作点附近进行一阶Taylor展开: 工作点附近使用线性系统近似
EKF优点
EKF缺点
习题里有一篇有名的综述。
Bundle Adjustment已经在之前介绍过了
事实上BA属于批量式的优化方法
给定很多个相机位姿与观测数据,计算最优的状态估计
定义每个运动/观测方程的误差,并从初始估计开始寻找梯度下降
BA问题与图结构的关系
BA虽然是个纯优化问题,但亦可以用图模型清晰地表述出来
顶点为优化变量,边为运动/观测约束
本身还有一些特殊的结构
特点:
每个观测只关系两个变量,其中一个是相机,一个是路标
纯视觉BA中,不存在相机与相机/路标与路标之间的关联
整个误差函数由许多个这样小的项组成
根据Gauss-Newton或Levernburg-Marquardt,最终我们会求解 Hx=-b 形式的方程
每一个误差项会对整体线程方程产生贡献:
而误差仅和i,j相关,导致它的雅可比为稀疏矩阵
示意图
如果对变量做好排序,例如所有相机位姿在前,路标在后,那么 H 有一定的特殊结构:
图模型与H矩阵存在对应关系:图模型中存在边=>H相应地方出现非零块
实际当中的H,路标数量远大于位姿数量(箭头形矩阵或镐子形矩阵)
边缘化加速方程求解
利用H的特殊结构,可以大幅加速Hx=-b线性方程的求解。
加速手段又称边缘化(Marginalization)[意义有很多种]
Hx=-b的结构: B:小,对角块;C,大,对角块
E和E转置:与图模型对应,可稠密
因为 C 是对角块,所以可以用C对E进行消元(高斯消元),得到:
该方程组分为两步来求:
这个做法称为Marginalization或Schur消元
从消元角度来讲,亦可使用Cholesky等其他消元方式解此稀疏方程
从Marginalization角度来讲,是我们把所有的路标信息边缘化到了相机的信息中
Marginalization(marg):
省掉3D点只对姿态进行优化,然后更新3D点就行。
实际当中BA的计算量很大
Pose Graph即是省略了特征点的Bundle Adjustment (减少计算量)
Pose Graph:
实践:Pose球的例子