激光的前端配准算法(帧间匹配算法)
- 前端配准在视觉内叫做Tracking或者帧间匹配,对激光SLAM是有非常大的影响的
- 帧间匹配不一定说的是前后两帧进行匹配,也可以是任意帧之间进匹配
- 是一个Map—>Scan的过程,一个Scan和一个Map去匹配的过程
- 常用的方法有下面四种
- ICP匹配方法(对上节ICP算法的证明)
- PL-ICP匹配方法(与ICP算法相似,只是说误差是之间的)
- 基于优化的匹配方法(Hector和cartographer两种算法是基于优化的方法)
- 相关匹配方法及分支定界加速(CSM算法)
ICP匹配方法
-
ICP方法的目的:就是两帧3D点云的匹配,求解一个R和t使得下列式(误差)最小。
-
已知对应点的求解方法
就是先求一个平均点,每一个点云都求一个平均点,然后对任何一个点云进行平移操作,把它移到以P点为圆心的地方,然后构造一个矩阵W,然后对这个矩阵进行SVD分解,然后得到ICP的解R与t
下面对ICP的解 (R与t)进行证明
对加号左边与加号右边分别取极小值,所以加号右边=0时,即可得t=ux-Rup
现在来求R,现在加号左边是这样的式子
我们知道(红色字)
所以可以将加号左边写成
把两式展开
R的转置* R是=I 一个常数,a²那项也是常数,所以最后留下
所以最后就是
所以要求的就是上面这个式子的最小值,也就是求下面式子的最大值,然后得R
-
未知对应点的求解方法
上节已经推理
ICP实现过程
也就是求一个R和t,使得两个点云间的距离最短(下式(误差)最小),求解下式
t和R的求解过程忽略,得到R和t的解
然后就可以计算得两个点云间的最短距离(使得(误差)最小)
PL-ICP方法(已有开源代码—indigo下的CSM)
-
上节ICP其实别名是PP-ICP,Point-to-Point ,点到点距离的ICP匹配方法
-
PL-ICP是Point-to-Line,点到线距离的ICP匹配方法
-
他的算法流程(和PP-ICP没什么区别,就是误差形式不同,到后面也是求R和t)
基于优化的匹配方法(基于梯度,HectorSLAM是纯梯度优化方法、Cartogerepher用的是CSM+梯度优化)
-
基于优化的匹配方法实际上就是基于梯度的方法
-
示意图:其实就是求极值,按照梯度下降方向一步一步求极值
-
数学描述:T表示我们要求解的机器人的位姿,Si(T)表示把激光数据用位姿T进行转换,也就是说把激光数据(Pix、Piy)用一个T转换到世界坐标系下(地图坐标系下)得到一个二维的坐标(x,y),i表示第i个激光束。
M(x)表示得到坐标x的地图占用概率(激光数据与地图最大匹配程度),激光数据与地图匹配程度最高是1,M(x)表示最大匹配程度,那么也就是1-minM(x),所以有
这个M(x)一般会是个似然场,就是一个似然得分,目标函数就定义成如上图那样。所以我们只需要求得一个T,使得M(x)最大。
M(Si(t))表示的是我们把每个激光束都统一到我们的世界坐标系下,然后求它占用的概率(与地图的最大匹配程度)越大代表激光与地图重合程度越好,机器人的位姿也就越准确。
目标函数E(T)这个式子他是非线性的,因为我们的旋转矩阵T,要求它的梯度,但因为地图是栅格化的也就是离散的,无法进行求解梯度,所以只能对地图进行插值。
求解这个式子还有一个前提就是需要知道梯度,所以他里面肯定是包含一个梯度项的,那为了求解这个梯度项,我们就必须对地图进行插值,那怎么对地图进行插值?这就是主要要讲的内容
-
基于优化方法的求解
目标函数依然是E(T),设pi=(pix,piy)表示第i个激光点的坐标,Si(T)表示将激光点的坐标转换到世界坐标,M(Si(t))是个非线性函数,对其进行一节泰勒展开,转换成线性函数E(T+△T),下图中▽的意思是对△T进行求偏导,M(Si(T))是个常数项。得到线性函数E(T+△T),对于线性系统,求其对△T的导数,并令其等于0得到下式
然后求解上式即可得到△T,令𝑇=𝑇+Δ𝑇,不断进行迭代即可
求解过程:(用符号去代替某些式子就可简化求解)
▽M(Si(T))中的Si(T)可以看作是地图中的一个坐标,然后▽M(Si(T))就表示对地图上的这个坐标求梯度,要求它的梯度,但因为地图是栅格化的也就是离散的,无法进行求解梯度,所以只能对地图进行插值。
-
地图双线性插值(X,Y两个方向进行插值,是一维线性插值的推广)
-
拉格朗日插值法
插值的定义:使得n次多项式在每个插值点都成立,那么称Ln(x)为f(x)的插值多项式
- 一维线性插值
我们想求解这个插值方法的话,只要构造一个基函数li(xk)满足他的条件即可。
基函数求出来了,那么插值方法也就解出来了。
-
双线性插值(二维)
和一维差不多,我们有四个点就构造四个基函数就行。
然后对应之前说的▽M(Si(T))中的Si(T)可以看作是地图中的一个坐标,然后▽M(Si(T))就表示对地图上的这个坐标求梯度,然后现在▽M(Si(T))也求解出来了,△T的所有项都已知了
然后之前的方程也就解了,然后令𝑇=𝑇+Δ𝑇,不断进行迭代即可。
-
-
简化实现过程:
令目标函数(地图占用概率(激光数据与地图最大匹配程度))
目标函数是E(T),设pi=(pix,piy)表示第i个激光点的坐标,Si(T)表示将激光点的坐标转换到世界坐标,M(Si(t))表示的是我们把每个激光束都统一到我们的世界坐标系下,然后求它占用的概率(与地图的最大匹配程度)越大代表激光与地图重合程度越好,机器人的位姿也就越准确。 M(Si(t))是个非线性函数,对其进行一阶泰勒展开,转换成线性函数E(T+△T)
对于线性系统,对T求偏导等于0,就得到了最大匹配程度。求其对△T的导数,并令其等于0得到下式
但▽M(Si(T)) 表示的是对地图上的这个坐标求梯度,但地图是栅格化的也就是离散的,所以无法求梯度,只能对地图进行插值(方法有一维线性插值和双线性插值),求出插值函数之后就可以求梯度,▽M(Si(T)) 这个式子也就已知了。
插值之后即可对上图式子求解(所以位置量全部已知了)得到△T,令𝑇=𝑇+Δ𝑇,不断进行迭代即可。就是求极值,按照梯度下降方向一步一步求极值。
难点是推导的过程(插值、求解),过程就是这样。
相关匹配方法及分枝定界加速(Cartographer用的)
-
帧间匹配似然场(CSM)
暴力匹配不会出现局部极值,他的暴力之处在于三层for循环x,y,θ,计算量巨大
-
算法流程
-
构造似然场(就是高斯模糊的过程),然后在制定的搜索空间内,进行搜索,计算每一个位姿的得分(找出最优得分),根据每个位姿的最优得分,计算本次位姿匹配的方差。
-
我们不能直接使用暴力匹配,因为他的计算量太大,所以得对其进行加速
-
-
位姿搜索
-
1.暴力搜索
使用三层for循环(x,y,θ)枚举每一个位姿,分别计算每个位姿的得分,计算量巨大(指的不是循环,是他每个位姿都要进行投影,而投影则需要计算sin和cos函数两次),然后把每个位姿都投影到世界坐标系中,累加得分就得到了似然场。
-
2.预先投影搜索
先循环θ,再y,再循环x,然后我们世界坐标系转换矩阵是
cosθ -sinθ x
sinθ cosθ y
0 0 1
我们第一次循环θ之后,这个矩阵中的sinθ和cosθ就只需要计算一遍,其余的就是计算x,y了,这样就大大减少了计算量。
-
3.多分辨率搜索(CSM用的比较多的方法)
-
构造粗分辨率和细分辨率两个似然场,然后在粗分辨率似然场上先进行搜索获取最优位姿,然后再把粗分辨率的最优位姿对应栅格进行细分辨率划分,然后再进行细分辨率搜索,再次得到最优位姿。粗分辨率地图的栅格的似然值(最优值)为对应的细分辨率地图对应空间的所有栅格的最大值(上界),也就是说粗分辨率的位姿得分是细分辨率的位姿得分的上界。这个搜索方法可能会错过最优解,但最终解也一定是很接近最优解的。
-
-
-
分枝定界算法
他其实和栅格搜索很相近,栅格搜索就是分栅格,然后栅格内再分栅格,然后栅格是不能一直往下分的,就得到最终解了。而分枝定界算法就是不断地分树枝,这就是分枝部分。然后定界就是确定一个界,搜索树中的每一个节点,确定以该节点为根节点的子树的界(最小值问题确定下界,最大值问题确定上界)。
(看红色部分)
他是一个常用的树形搜索剪枝算法,它主要是为了求解整数规划的问题,解的数量为有限个。他就是把最优解求解问题转换为树形搜索问题,根节点表示整个解空间,叶子节点表示最优解,中间的节点表示解空间的某一部分子空间。
剪枝是怎么个剪枝法呢?
他就是确定了一个目前的最大得分bestscore,比如说到达了某个节点,假设此节点的上界是A,但这个A小于最大得分basescore,那么这个节点下的子树小面的所有节点都会被剪掉。
就好比搜栅格,最优解在左下角,如果从右下角开始搜,那么得分自然会很低,既然得分低也就没必要进行细分了。也就相当于剪枝了。
粗分辨率高的不一定保证细分辨率也高,然后按照得分该剪的剪,没必要细分的就不要细分了。
关键是如何定界,如何完成算法中的定界函数。
看算法代码可知,首先是选择一个节点,知判断是不是叶子节点,如果不是就score一下,看是否比最大得分还大,如果没有就是剪枝。
-
分枝定界在相关方法的加速作用
- 搜索树中的节点表示一个正方形的搜索范围
- 分枝:对于节点(cx,cy,cθ,ch),分枝为4个子节点
- 定界:其实就是score函数
-
-
作业
- PL-ICP匹配方法(与ICP算法相似,只是说误差是之间的)
- 基于优化的匹配方法(Hector和cartographer两种算法是基于优化的方法)
- 相关匹配方法及分支定界加速(CSM算法)