gmapping文库_第1页
gmapping文库_第2页
gmapping文库_第3页
gmapping文库_第4页
gmapping文库_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、gmapping(fastslam)1、 获取激光数据并处理如果是第一个激光数据,则初始化粒子,每个粒子维护一幅地图map,机器人的位姿pose,上个时刻的位姿previouspose,权重weight,权重总和weightsum。地图包括的信息有:m_center:地图中心点(x, y)、m_worldsizex:地图长度、m_worldsizey:地图宽度、m_delta:网格边长代表的长度。单位 m/cell m_xmin、m_xmax、m_ymin、m_ymax,分别对应地图横坐标最小值和最大值、纵坐标最小值和最大值。粒子初始化,初始信息都相同tnode* node = new tno

2、de(initialpose, 0, 0, 0);scanmatchermap lmap(point(xmin + xmax, ymin + ymax) * .5, xmax - xmin,ymax - ymin, delta);for (unsigned int i = 0; i size; i+) m_particles.push_back(particle(lmap);m_particles.back().pose = initialpose;m_particles.back().previouspose = initialpose;m_particles.back().setweigh

3、t(0);m_particles.back().previousindex = 0;/ this is not needed/ m_particles.back().node=new tnode(initialpose, 0, node, 0);/ we use the root directlym_particles.back().node = node;geometry_msgs/twist.msg# this expresses velocity in free space broken into its linear and angular parts.vector3 linearve

4、ctor3 angular/ 获取激光在里程计坐标系上的坐标tf:stamped odom_pose; try tf_.transformpose(odom_frame_, centered_laser_pose_, odom_pose); 处理激光数据gridslamprocessor:processscan(const rangereading & reading, int adaptparticles)对于第一条数据:1、 计算激光在每个粒子相应的位姿所扫描到的区域scanmatcher:computeactivearea(scanmatchermap& map, const orien

5、tedpoint& p, const double* readings)对每一束激光束,设start为该激光束起点,end为激光束端点(障碍物位置),使用bresenham划线算法确定激光束经过的网格,算法原理如下:设start、end所在直线方程为y = kx + b,首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|k|1时,在y方向进行单位步进。 下面以|k|1时推导bresenham算法的数学依据: 如上图,已知有一直线y = kx+b,|k|1。我们通过斜率确定了x方向为单位步进。当x = 时,y = 。那么当x 执行一个单位步进时(即x = +1

6、时),y等于还是等于+1更符合这个直线方程呢?单凭肉眼我们很难得出结论,最好的办法当然是比较和+1和真实的方程的y值的差是多少(即yreal = k*(+1)+b),看看哪一个更靠近真实的方程的y值。 我们设 dupper = + 1 - yreal = +1 - k*(+ 1)+b); 表示+1和方程真实值的差 ddown = yreal - = k*(+1)+b)- ; 表示和方程真实值的差 那就是我们要比较dupper和ddown的大小。假设diff = dupper - ddown = (+1 - k*(+1)+b) - (k*(+1)+b)- ) 令x 为线段x方向的间距(即|end

7、.x - start.x|),y 为线段y方向的间距(|end.y - start.y|)。= x* diff = 2*x* -2*y* -2*y-x*(2b-1);那么 = +2*x*(- )-2*y; = + 2*x - 2*y ( 0)其中 - 取0还是1,取决于的符号, 0取0,算法循环判断,如果小于0,则下一个点的y坐标加1。 根据等式diff = dupper - ddown = (+1 - (k*(+1)+b) - (k*(+1)+b)- )以及k = y/x,我们可以得出起始像素(x0,y0)的参数p0的值:p0 =2*x* -2*y* -2*y-x*(2b-1)= x-2*y

8、; void gridlinetraversal:gridlinecore( intpoint start, intpoint end, gridlinetraversalline *line )/ d相当于 int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag; int cnt = 0; dx = abs(end.x-start.x); dy = abs(end.y-start.y); if (dy end.x) x = end.x; y = end.y; ydirflag = (-1); xend = start

9、.x; else x = start.x; y = start.y; ydirflag = 1; xend = end.x; line-pointscnt.x=x; line-pointscnt.y=y; cnt+; if (end.y - start.y) * ydirflag) 0) while (x 0) d+=incr1; else y+; d+=incr2;line-pointscnt.x=x;line-pointscnt.y=y;cnt+; else while (x 0) d+=incr1; else y-; d+=incr2;line-pointscnt.x=x;line-po

10、intscnt.y=y;cnt+; else d = dy - 2*dx; incr1 = -2*dx; incr2 = 2 * (dy - dx); if (start.y end.y) y = end.y; x = end.x; yend = start.y; xdirflag = (-1); else y = start.y; x = start.x; yend = end.y; xdirflag = 1; line-pointscnt.x=x; line-pointscnt.y=y; cnt+; if (end.x - start.x) * xdirflag) 0) while (y

11、0) d+=incr1; else x+; d+=incr2;line-pointscnt.x=x;line-pointscnt.y=y;cnt+; else while (y 0) d+=incr1; else x-; d+=incr2;line-pointscnt.x=x;line-pointscnt.y=y;cnt+; line-num_points = cnt;2、 更新单元格被扫描过的总次数visits和被标记为障碍物的次数n,scanmatcher:registerscan(scanmatchermap& map, const orientedpoint& p, const dou

12、ble* readings)/ 匹配扫描根据bresenham算法确定激光束扫描过的单元格,所以扫描过的单元格被扫描过的次数加1,激光束末端对应的单元格障碍物标记次数加1,并累加障碍物坐标acc.x和acc.y,则障碍物的。最后单元格是障碍物的概率p = n / visits。后续激光处理后续的激光数据要与有地形进行匹配,修正每个粒子的位置,对应的函数为gridslamprocessor:scanmatch(const double* plainreading) 首先计算当前位置initpose的一个分数score:计算每束激光对应的障碍物坐标phit,再计算phit对应的网格坐标iphit,

13、激光束上与障碍物相邻的非障碍物网格为pfree,pfree的坐标由phit移动一个网格得到;然后在iphit以及周围的8个网格搜索最有可能是障碍物的网格。最有可能的判断方法为:该网格是障碍物的概率大于一个阈值,其对应的pfree是障碍物的概率小于一个阈值,并且该网格对应的障碍物坐标1.0/n * point(acc.x,acc.y)与phit的距离d最小;最后score = score + exp(-1.0 / sigma * d * d)。累加计算score,可参考ndt(normal distributions transform)算法。因为距离越大,score应越小,score较大值应集

14、中在距离最小值处,这符合正态分布模型,所以使用exp来计算每束激光的score。接着对initpose进行微调,即分别轻微调整initpose的坐标和角度,计算其分数,最后选择分数最大的对应的位姿作为修正后的位姿。amcl(自适应蒙特卡洛定位)测距仪测量模型:1、 光束模型(beam models)。1、该模型包含四种类型的误差(噪声):较小的测量噪声、动态物体带来的误差、未探测到物体带来的误差(没有探测到物体时将使用测距仪的最大测程作为测量数据,因此也有可能不正确)、随机误差。(1) 测量噪声:由测距仪的精度、大气对测量信号的影响等造成,其概率模型一般是以理想测量距离为均值的高斯模型,表示为

15、:是从在地图上从位置沿激光束方向到障碍物的实际距离,是传感器测量距离。是归一化常数:(2) 动态物体误差:由未预测到的物体(unexpected objects)带来的误差。环境是动态的,而保存的地图是静态的,即不变的。没有包含在地图里的物体的出现会产生一个令人意外的比较小的测量数据。典型的动态物体就是行人。处理这些误差的一种方法就是把它当成传感器噪声。测量到的距离越大,检测到动态物体的概率越小,且小距离对应的测量到的是动态物体的概率应远大于大距离的概率,随意概率随距离的增大呈指数下降趋势,所以其概率模型为指数分布,表示为:(3) 测量失败:有时候,传感器探测不到障碍物,比如试图探测一些吸收光线的物体,此时的探测数据将失

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论