前面介绍了基于EKF的SLAM算法。EKF算法由于状态向量,协方差矩阵的大小随着特征点(路标)的增长而迅速增长,导致其不太适合大场景的应用。本文描述基于图优化的SLAM算法。目前由于SLAM图的稀疏性得到广泛认可,这种SLAM在效果和效率上的优势非常明显。
参考文献:
[1] Probabilistic Robotics
[2] A Tutorial on Graph-Based SLAM
[3] Globally consistent range scan alignment for environment mapping. Autonomous Robots
[4] A Framework for Sparse, Non-Linear Least Squares Problems on Manifolds
[5] INTRODUCTION TO SMOOTH MANIFOLDS
Graph-based SLAM
[3]最早提出了采用全局优化的图优化SLAM算法。下图摘自[1] Probabilistic Robotics。用图G(V, E)的方式表述了SLAM问题。
上图中,表示机器人的位姿(Pose),表示路标(Landmark)的坐标。
图优化中,顶点是优化项,而边是约束项。优化过程就是通过全局调整优化项,使约束项的和最小。在上图中,
- Pose(x)与Landmark(m)构成了图的顶点集。
- 边(Edge)存在两种构成。第一种是Pose到Pose,另一种是Pose到Landmark。
- 图优化中边表示约束,Pose到Pose的边与机器人的运动模型相关,机器人从运动到,形成了这条边。同时在运动模型的作用下,可以获得机器人在,控制量为时的状态为。该值与“真实”的Pose 的差,构成了这条边的约束。由于边的约束是标量,因此取这个差的平方。R表示为运动模型的协方差。公式如下,
- Pose到Landmark的边与机器人的观测模型相关,机器人从观测到,就会形成一条边。同时在观测模型的作用下,可以获得机器人在时对m1的预测。该值与此时真正观测到的值 的差,构成了这条边的约束。同样的,取这个差的平方作为约束值。Q表示为观测模型的协方差。公式如下,
- 完整的约束为前两个约束的和,
SLAM的图优化问题就是寻找合适的Pose(x), Landmark(m),使最小。与基于EKF的SLAM算法随着机器人运动而不停的优化Pose和地图不同,Graph-based SLAM算法会首先创建图,之后再优化这个完整的图,因此也被称作"delayed" SLAM算法或"Full" SLAM。创建图的过程和传感器相关,也被称作前端(front-end)算法,优化图的算法与传感器关系不大,也称为后端(back-end)算法。
SLAM的图模型通常用信息矩阵表示。[1]第十一章Figure11.2,中给出了图模型与信息矩阵的图示。两种表达方式都包含了地图信息和路径信息。
考虑到运动模型与观测函数都不是线性的,最优化上述函数是一个非线性最小化的过程。然而直接优化上面这个函数的复杂度非常高。GraphSLAM算法进一步分解上面的信息矩阵,消去了landmark节点(m),有效降低计算复杂度。
此时,图模型中的节点仅仅是机器人的Pose。因此也被称作Pose Graph.
Pose-Graph
Pose-Graph图中的节点定义为机器人的Pose。
边有两种,
- 时间上相邻的节点存在一条边。这条边通常是运动模型提供的约束(如里程计,轮速仪等)。
- 如果在和看到了同样的路标,那么在这两个节点之间存在一条边。这条边的约束由对路标的观测模型提供。
如此一来,图中的节点大大减少。这两种边可以统称为一种"虚拟观测"(virtural measurement)。
令节点表示节点向量。是虚拟观测的均值,方差由信息矩阵表示。是已知和,对观测的预测。是似然函数的对数。
那么可由预测的观测与观测的实际值的差求出。
进一步简化这个公式,令 ,可以得到,
问题的求解变成了寻找合适的节点向量以使得F(x)得值最小。非线性最优化可采用最小二乘,牛顿高斯,Levenberg-Marquardt法。
首先,在初始guess 一阶泰勒展开, 为雅克比矩阵。
进一步代入,得到论文[2]的公式(8)~(11)。
F(x)是F(i,j)的和,
对这个二次方程求极值,可令公式(14)两边对导数,并令其导数为0。问题变成了线性系统求解。
由于矩阵H是信息矩阵,本身是稀疏的。非零数等于节点数+约束边*2。可以用cholesky分解。
得到优化的结果。
牛顿高斯算法迭代公式(14), (15),每次迭代的结果作为下次迭代的Initial Guess。
非欧几里得空间下的优化
以上是一个当x为欧式空间下的典型的非线性优化。然而现实总是残酷的,SLAM中的参数并不全都是欧式空间的。
x通常由三维空间的旋转平移构成,
两相邻结点的"观测"函数一般写作
平移变量t显然是欧式空间,而旋转变量的表达式(通常是欧拉角)属于非欧式空间。简单地讲,就是旋转或者旋转平移矩阵对加法不封闭(两个旋转矩阵相加不是旋转矩阵,两个旋转平移矩阵相加不是旋转平移矩阵)。也就是说,公式(16)的加法可能无法成立。
考虑到四元数(quaternion)表达3维空间的旋转是没有奇异性的,那么就可以使用四元组替代欧拉角表示3维旋转。然而四元数的计算和对旋转的表达有些复杂,算法也需要重新修改,这时需要一个折中的方法。借用流形的概念(Manifolds),再结合四元组的表达,就可以在不改变算法的情况下,解决奇异性问题。例如,当计算两个点在流形(非欧式空间)上的距离时,首先在其中一个点的附近建立欧式空间的映射,然后把另一个点映射过去,再计算他们的距离。这样的好处是我们完全不需要重新推导公式。只需要在原算法中定义“加”,“减”两个操作(映射),将两个操作封装,而这两个封装可以使用四元组的对数实现。更详细的内容可以参考[4]。[5]给出了关于Smooth Manifold的详细说明。
流形(Manifolds)是局部欧几里得空间化的一个拓扑空间。欧式空间就是最简单的流形。地球表面这样的球面这是一个稍微复杂的例子。
平滑流形(Smooth Manifolds), 或称微分流形(Differential Manifold),可微流形,是一个被赋予了光滑结构的拓扑流形。
坐标卡(Cooridinate chart),简称卡(Chart),是一个在流形的一个开子集和一个简单空间的映射,使得该映射及其逆都保持所要的结构。对于拓扑流形,该简单空间是某个欧几里得空间 。Chart对计算及其重要,因为它使得计算可以在简单空间(欧式空间)进行,再把结果传回流形。
优化算法需要封装下面两个操作,
首先定义流形上两个点,, 。为他们在同一个Chart上的差(Chart上可以认为是欧式空间)。
已知流形上两点求距离
- 在附近创建Chart。
- 在该Chart上计算投影的位置坐标。
- 在该Chart上计算二者的差。
已知流形上一点,和Chart上距离,求另一点的坐标
- 在附近创建Chart
- 在Chart上移动
- 回到流形,得到坐标。
[2]把上面的图优化公式重写了一下,
边的约束函数,
泰勒展开,
更新,
算法中的一次迭代,
最后,简单说明一下如何具体的定义 和,只摆一下结论,推导过程可以参考[4][5]。
定义以x为中心的chart为,
如果Manifolds是李群,那么可以采用简单一点的表示,只需要定义单位元素附近的一个chart。
以三维旋转为例,
SO(3)由3*3的正交矩阵构成,行列式为1。采用三个参数(欧拉角)表示有奇异性。可以增加一个参数,使用四元组表示。SO(3)又是一个李群,因此,可以定义上文的映射函数为,
, 其中, 表示四元组,为四元组实部,为四元组虚部。
, ,
逆函数定义为 。