关于Gmapping的学习1

  slam中的gmapping看了比较久,一直有点云里雾里,对理论脉络不清楚,对代码具体实现也不清楚。现在打算就看到的一些资料进行整理记录一下学习心得。本文将已以下步骤罗列,首先罗列gmapping的相关背景资料,其次罗列gmapping的相关理论,然后罗列相关的实现代码。当然,还包括自的一点点小小见解。

一、gmapping背景相关

  GMapping是一种高效的粒子滤波器,用于根据激光距离数据得到栅格地图。(一般是使用激光和里程计数据)

  gmapping是一个比较早的算法,核心思想是粒子滤波并且需要里程计,但是不要求很高的传感器心梗,初学者一般先玩这个。不过注意的是gmapping只是建立地图mapping,定位还需要amcl(蒙特卡洛包来配合使用),最后才能介入navigation tack(来自https://www.zhihu.com/question/37143050)。

  Gmapping是2D建图算法,那么还有一些其他的2D-slam相关的算法也说明一下,其它的几种分别叫做HectorSLAM、KartoSLAM、CoreSLAM、LagoSLAM

    第一种HectorSLAM,scan-matching(Gaussian-Newton equation) 传感器的要求高,高更新频率小测量噪声的激光扫描仪。(背景介绍都是参考别人的资料,非本人自创)

      不需要使用里程计,适用于一些不需要里程计的设备比如空中无人机与在不平坦区域运行的地面小车。

      利用已经获得的地图对激光束点阵进行优化,估计激光点在地图的表示,和占据网格的概率。

      其中扫描匹配利用的是高斯牛顿的方法进行求解,找到激光点集映射到已有地图的刚体转换(x,y,theta)。

        (接触的匹配的方法还有最近邻匹配的方法ICP,gmapping代码中的scanmatcher部分有两种方法选择。)

        为了避免局部最小而非全局最优的出现,地图采用多分辨率的形式,导航中的状态估计可以加入惯性测量,进行EKF滤波。

    第二种Gmapping,

      目前激光2Dslam用得最广的方法,gmapping采用的是RBPF的方法,必须得了解粒子滤波的方法。

        问题:粒子滤波是采用大量粒子引入进行计算来获取好的结果,一方面会增加计算复杂度,在粒子权重重新分配与收敛过程中,会产生粒子耗散问题(即小权重粒子消失),

        自适应重采样集输引入可以减少这种问题,计算粒子分布的使用,参考了机器人的里程计,同时将当前的观测参考进去,减少了机器人位置在粒子滤波的不确定性。

 

    第三种 KartoSLAM

      基于图优化的一种方法,图优化的核心是矩阵的稀疏化与最小二乘,参考graphslam学习http://blog.csdn.net/zyh821351004/article/details/46521319

      图优化相比其他方法在大环境下制图的优势更大,在某些情况下KartoSLAM更有效,因为他仅包含点的图。

      (这个不是很明白,等我学习过后再来写一写)

  

    第四种 CoreSLAM

      最小化性能损失的一种slam算法。(待补充)

 

    第五种LagoSLAM

      基本的图优化slam的方法(待补充)

 

    关于几种建图方法的比较,从大小仿真环境和实际环境以及CPU消耗方面对算法进行评价,CartoSLAM 与gmapping的优势大。具体详情当然是各位去看论文啦http://download.csdn.net/detail/zyh821351004/8986339

      

 

 

 

二、gmapping原理相关

gmapping建立地图的原理是粒子滤波器,传送门:http://blog.csdn.net/heyijia0327/article/details/40899819

粒子滤波的相关理论之前看过一次,但是又忘记的差不多了,。,,那么这里就把粒子滤波的相关知识写一下把,看不懂硬着头皮看,就看懂了。

 

好了,先来一段精华描述“粒子滤波算法Particle Filter起源于二十世纪五十年代蒙特卡洛问题的研究,第一个应用性的粒子滤波算法是有93年的Gordon提出的,它利用粒子集表示概率,可以用于任何形式的状态空间模型上,核心思想是通过从后验概率中抽取随机粒子来表示分布情况,是一种顺序重要性采样法Sequential Importance Sampling”,感受到了精华吗?对于这句话,我有了几个疑问?

1.起源于蒙特卡洛问题的研究?这个不了解,不过应该算是背景问题,需要知道,但不是首要的,这个问题先放在后面解答吧。

2.粒子群表示概率,粒子的密度,粒子的权重,都表示目标出现的概率,这个没问题,可以理解。

3.状态空间模型?原谅我把现代控制理论的概念忘记干净了!这个我以后再自己复习一下吧!

4.后验概率抽取粒子表示分布情况?后验先验是一种哲学概念,先不去管它,总之就是通过自己抽取粒子计算粒子出现的概率,再由这个概率代表粒子出现的分布情况,为什么要这样做呢,因为我们不知道真实的分布函数,也许该分布函数无法表示,但是我们可以随机试验,只要次数足够多,概率就越接近真实分布。

疑问先保留,粒子滤波的应用很广泛,在目标追踪领域尤其重要,针对不同的情况问题,会有不同的粒子滤波算法,我们抽丝剥茧,先直接来看看粒子滤波到底是个什么玩意,我们从粒子滤波的过程来理解它:

粒子滤波的基本过程:初始化,概率转移,权重重计算,重采样四个阶段。

1.初始化

跟踪区域初始化:在图片上用一定的方法指定一块区域。

粒子初始化:粒子表示图像中的矩形区域(由中心坐标(x,y)与宽高(w,h)四个标量表示),然后我们指定n个(比如100个)粒子,随机或者指定的方式释放粒子,在这里,我们指定100个粒子与跟踪区域一致状态,即(x,y,w,h)相等。

(思考,因为我做的是激光雷达的建图与定位,使用粒子滤波时候是随机粒子,不是这里的指定区域,感觉有点奇怪)

2.状态转移阶段

使用粒子滤波算法对目标追踪,是通过前一次的先验概率来估算当前的后验概率密度,这个过程由粒子来完成。即有上一个帧图中粒子状态(x,y,w,h)t-1,来估计当前帧中各个粒子的状态(x,y,w,h)t,即有上一帧状态转变为当前粒子状态,该过程叫做转移transmission,粒子滤波的转移方程跟Kalman滤波的差不多(卡尔曼不懂,不知道,再看看吧):

(1)

公式解释:上面的公式是状态转移方程,下面的是观测方程,wk是高斯噪声,vk也是高斯噪声,本文中,状态xk=(x,y,w,h)k,四个变量由函数指定

 

 3.权重计算阶段

  在上一阶段,100个粒子进行了状态转移,这个函数f()转以后,粒子的位置可能落在现在真实的目标区域附近,由于高斯噪声,呈现高斯分布,我们现在想得到真实目标区域现在的坐标怎么办?可是我们不知道,我们仅仅知道100个粒子的坐标,然后我们将每个粒子所在位置的特征与目标区域所存储的特征进行相似度计算,得到一个评价分数,这个分数进行归一化后就是权重了。

4.重采样阶段

  因为100个粒子,总有粒子相似度很低,打分低,我们去掉这些低分粒子。高分的粒子会复制多个,最后会保留100个粒子,低分的粒子就去掉。

  粒子滤波的小结:其实关键点就是每个粒子计算其与目标的相似度,保留高相似度粒子等,多进行几次这样的循环,最高相似度粒子的位置就应该是目标区域的位置。(感觉自己写着写着就懂了,果然还是要边看编写才能理解)

。。。。未完待续

 

书写资料参考库:

http://m.blog.csdn.net/YHR14/article/details/52441657(粒子滤波这个写的通俗易懂,主要是参考这一篇)

http://blog.csdn.net/heyijia0327/article/details/47686523(白巧克力的博客,讲解视觉slam的图优化相关)

http://blog.csdn.net/u010545732/article/details/17462941(粒子滤波的matlab实现)

http://blog.csdn.net/roadseek_zw/article/details/53316177

http://blog.csdn.net/u010918541/article/details/52679345 概率机器人?需要仔细看看

https://github.com/ros-perception/slam_gmapping/blob/hydro-devel/gmapping/src/slam_gmapping.h   github上面的gmapping的一些源码

http://blog.csdn.net/x_r_su/article/details/52724159 几种slam算法的背景介绍

https://www.cnblogs.com/wyuzl/p/6565090.html 这个是关于卡尔曼滤波和粒子滤波的

http://www.openslam.org/ 外文资料

http://blog.csdn.net/david_han008/article/details/72171602

http://blog.csdn.net/david_han008/article/details/68926189

http://blog.csdn.net/u012116229/article/details/24424549

http://blog.csdn.net/xiahouzuoxin/article/details/39582483

http://blog.sina.com.cn/s/blog_7445c2940102whjq.html

http://blog.csdn.net/qq229596421/article/details/51419813  PID控制,比例积分微分

 

posted @ 2017-12-02 17:27  拔出萝卜带出土豆  阅读(1180)  评论(0编辑  收藏  举报