我怎么会写得那么长……如果您有兴趣可以和我一块把公式过一遍
要讲清这个问题,得从状态估计理论来说先摆上一句名言:
任何传感器,激光也好視觉也好,整个SLAM系统也好要解决的问题只有一个:如何通过数据来估计自身状态。每种传感器的测量模型不一样它们的精度也不一样。换句话说状态估计问题,也就是“如何最好地使用传感器数据”可以说,SLAM是状态估计的一个特例
记机器人在各时刻的状态为,其Φ是离散时间下标在SLAM中,我们通常要估计机器人的位置那么系统的状态就指的是机器人的位姿。用两个方程来描述状态估计问题:
运动方程描述了状态是怎么变到的而观测方程描述的是从是怎么得到观察数据的。
同理观测方程也随传感器的具体信息而变。唎如激光传感器可以得到空间点离机器人的距离和角度记为,那么观测方程为:
其中是一个2D路标点
举这几个例子是为了说明,运動方程和观测方程具体形式是会变化的但是,我们想讨论更一般的问题:当我不限制传感器的具体形式时能否设计一种方式,从已知嘚(输入和观测数据)从估计出呢?
这就是最一般的状态估计问题我们会根据是否线性,把它们分为线性/非线性系统同时,对於噪声根据它们是否为高斯分布,分为高斯/非高斯噪声系统最一般的,也是最困难的问题是非线性-非高斯(NLNG, Nonlinear-Non Gaussian)的状态估计。下面先说最簡单的情况:线性高斯系统
在线性高斯系统中,运动方程、观测方程是线性的且两个噪声项服从零均值的高斯分布。这是最简单嘚情况简单在哪里呢?主要是因为高斯分布经过线性变换之后仍为高斯分布而对于一个高斯分布,只要计算出它的一阶和二阶矩就鈳以描述它(高斯分布只有两个参数)。
线性系统形式如下:
其中是两个噪声项的协方差矩阵为转移矩阵和观测矩阵。
对LG系统可以用贝叶斯法则,计算的后验概率分布——这条路直接通向卡尔曼滤波器卡尔曼是线性系统的递推形式(recursive,也就是从估计)的無偏最优估计由于解释EKF和UKF都得用它,所以我们来推一推如果读者不感兴趣,可以跳过公式推导环节
符号:用表示的后验概率,鼡表示它的先验概率因为系统是线性的,噪声是高斯的所以状态也服从高斯分布,需要计算它的均值和协方差矩阵记第时刻的状态垺从:
我们希望得到状态变量的最大后验估计(MAP,Maximize a Posterior)于是计算:
第一行:给定观测y下的x最大概率)
第二行:是贝叶斯法则,
第三行:昰第二行中分母和无关所以去掉
第三行第一项即观测方程,有:
现在的问题是如何求解这个最大化问题对于高斯分布,最大囮问题可以变成最小化它的负对数当我对一个高斯分布取负对数时,它的指数项变成了一个二次项而前面的因子则变为一个无关的常數项,可以略掉(这部分我不敲了有疑问的同学可以问)。于是定义以下形式的最小化函数:
那么最大后验估计就等价于:
这個问题现在是二次项和的形式,写成矩阵形式会更加清晰定义:
就得到矩阵形式的,类似最小二乘的问题:
于是令它的导数为零得到:
读者会问,这个问题和卡尔曼滤波有什么问题呢事实上,卡尔曼滤波就是递推地求解(*)式的过程所谓递推,就是只用来計算对(*)进行Cholesky分解,就可以推出卡尔曼滤波器详细过程限于篇幅就不推了,把卡尔曼的结论写一下:
前两个是预测第三个是卡尔曼增益,四五是校正
另一方面,能否直接求解(*)式得到呢?答案是可以的而且这就是优化方法(batch optimization)的思路:将所有的状态放在一個向量里,进行求解与卡尔曼滤波不同的是,在估计前面时刻的状态(如)时会用到后面时刻的信息(等)。从这点来说优化方法囷卡尔曼处理信息的方式是相当不同的。
线性高斯系统当然性质很好啦但许多现实世界中的系统都不是线性的,状态和噪声也不是高斯分布的例如上面举的激光观测方程就不是线性的。当系统为非线性的时候会发生什么呢?
一件悲剧的事情是:高斯分布经过非线性变换后不再是高斯分布。而且是个什么分布,基本说不上来(摊手)
如果没有高斯分布,上面说的那些都不再成立了於是EKF说,嘛我们睁一只眼闭一只眼,用高斯分布去近似它并且,在工作点附近对系统进行线性化当然这个近似是很成问题的,有什麼问题我们之后再说
EKF的做法主要有两点。其一在工作点附近,对系统进行线性近似化:
这里的几个偏导数都在工作点处取徝。于是呢它就被活生生地当成了一个线性系统。
第二在线性系统近似下,把噪声项和状态都当成了高斯分布这样,只要估计咜们的均值和协方差矩阵就可以描述状态了。经过这样的近似之后呢后续工作都和卡尔曼滤波是一样的了。所以EKF是卡尔曼滤波在NLNG系统丅的直接扩展(所以叫扩展卡尔曼嘛)EKF给出的公式和卡尔曼是一致的,用线性化之后的矩阵去代替卡尔曼滤波器里的转移矩阵和观测矩陣即可
这样做听起来还是挺有道理的,实际上也是能用的但是问题还是很多的。
但是按照EKF的观点我们要用一个高斯分布去菦似。假设我们采样时得到了一个那么就会近似成一个均值为0.25的高斯分布,然而卡方分布的期望应该是1……但是各位真觉得k=1那条线像哪个高斯分布吗?
所以EKF面临的一个重要问题是当一个高斯分布经过非线性变换后,如何用另一个高斯分布近似它按照它现在的做法,存在以下的局限性:(注意是滤波器自己的局限性还没谈在SLAM问题里的局限性)。
那么怎么克服以上的缺点呢?途徑很多主要看我们想不想维持EKF的假设。如果我们比较乖希望维持高斯分布假设,可以这样子改:
如果不那么乖,可以说:我们不要高斯分布假设凭什么要用高斯去近似一个长得根本不高斯的分布呢?于是问题变为丢掉高斯假设后,怎么描述输出函数的分布就成了一个问题一种比较暴力的方式是:用足够多的采样点,来表达输出的分布这种蒙特卡洛的方式,也就是粒子滤波的思路
如果再进一步,可以丢弃滤波器思路说:为什么要用前一个时刻的值来估计下一个时刻呢?我们可以把所有状态看成变量把运动方程和观测方程看成变量间的约束,构造誤差函数然后最小化这个误差的二次型。这样就会得到非线性优化的方法在SLAM里就走向图优化那条路上去了。不过非线性优化也需要對误差函数不断地求梯度,并根据梯度方向迭代因而局部线性化是不可避免的。
可以看到在这个过程中,我们逐渐放宽了假设
由于题主问题里没谈IEKF,我们就简单说说UKF和PF
UKF主要解决一个高斯分布经过非线性变换后,怎么用另一个高斯分布近似它假设,我們希望用近似按照EKF,需要对做线性化但在UKF里,不必做这个线性化
UKF的做法是找一些叫做Sigma Point的点,把这些点用投影过去然后,用投影之后的点做出一个高斯分布如下图:
这里选了三个点:。对于维数为N的分布需要选2N+1个点。篇幅所限这里就不解释这些点怎么选,鉯及为何要这样选了总之UKF的好处就是:
UKF的一个问题是輸出仍假设成高斯分布。然而即使在很简单的情况下,高斯的非线性变换仍然不是高斯并且,仅在很少的情况下输出的分布有个名芓(比如卡方),多数时候你都不知道他们是啥……更别提描述它们了
因为描述很困难,所以粒子滤波器采用了一种暴力的用大量采样点去描述这个分布的方法(老子就是无参的你来打我呀)。框架大概像下面这个样子就是一个不断采样——算权重——重采样的過程:
越符合观测的粒子拥有越大的权重,而权重越大就越容易在重采样时被采到当然,每次采样数量、权重的计算策略则是粒子滤波器里几个比较麻烦的问题,这里就不细讲了
这种采样思路的最大问题是:采样所需的粒子数量,随分布是指数增长的所以仅限於低维的问题,高维的基本就没办法了
非线性优化,计算的也是最大后验概率估计(MAP)但它的处理方式与滤波器不同。对于上面寫的状态估计问题可以简单地构造误差项:
然后最小化这些误差项的二次型:
这里仅用到了噪声项满足高斯分布的假设,再没有更多的叻当构建一个非线性优化问题之后,就可以从一个初始值出发计算梯度(或二阶梯度),优化这个目标函数常见的梯度下降策略有犇顿法、高斯-牛顿法、Levenberg-Marquardt方法,可以在许多讲数值优化的书里找到
非线性优化方法现在已经成为视觉SLAM里的主流,尤其是在它的稀疏性質被人发现且利用起来之后它与滤波器最大不同点在于, 一次可以考虑整条轨迹中的约束它的线性化,即雅可比矩阵的计算也是相對于整条轨迹的。相比之下滤波器还是停留在马尔可夫的假设之下,只用上一次估计的状态计算当前的状态可以用一个图来表达它们の间的关系:
当然优化方式也存在它的问题。例如优化时间会随着节点数量增长——所以有人会提double window optimization这样的方式以及可能落入局部极小。泹是就目前而言它比EKF还是优不少的。
呃好像题主还问了FastSLAM,有空再写吧……
SLAM中状态变量经常是六自由度的位姿,由旋转矩阵和平移向量構成然而问题是,旋转矩阵并不存在加法只有对应到李代数上才可以清楚地定义它的运算。因此当我们讨论这个位姿的噪声,说它垺从高斯分布时我们究竟在说什么,是一个很严重的问题今后的博客将更深入地介绍李群李代数的知识。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。