Gmapping——从原理到实践

  • 概述

在SLAM中,机器人位姿和地图都是状态变量,我们需要同时对这两个状态变量进行估计,即机器人获得一张环境地图的同时确定自己相对于该地图的位置。我们用x表示机器人状态,m表示环境地图,z表示传感器观测情况,u表示输入控制,下标表示时刻,则对

进行估计。而由条件贝叶斯法则,可以得到

这一分解相当于把SLAM分离为定位和构建地图两步,大大降低的SLAM问题的复杂度。基于此,Gmaping算法的大致过程为用上一时刻的地图和运动模型预测当前时刻的位姿,然后根据传感器观测值计算权重,重采样,更新粒子的地图,如此往复。ROS中实现的Gmapping算法框架大致如下,后面讲述原理时将说明对应的代码模块:

  • 定位

Gmapping算法基于粒子滤波,因此定位部分和粒子滤波大致相同:粒子状态预测,测量,更新,重采样。接下来分别说明:

1、状态预测(draw from motion)

  当前时刻粒子的状态首先由运动模型进行更新,在初始值上增加高斯采样的噪声,进行一个粗略状态估计。

  在Gmapping算法中,则采用以下算法对运动进行采样:

2、测量(scan match)

    这一步是在粗略估计的基础上做一次扫描匹配,找到一个使当前观测最贴合地图的位姿,以改进基于里程计模型的提议分布。基本思路是在基于运动模型预测的位姿,向负x,正x,负y,正y,左旋转,右旋转一共六个状态移动预测位姿,计算每个状态下的匹配得分,选择最高得分对应的位姿为最优位姿。

扫描匹配的重点就在于如何计算匹配得分。所谓匹配,是将当前采集的激光数据与环境地图进行对准:1)激光点的坐标转换至网格地图坐标;2)分别处理六个状态:当确定激光点网格坐标的地图值为障碍物时,进行打分(原理与NDT类似,距离越小,分数越大);3)得分最高的位姿为最优位姿。

   获得最优粒子位姿后,可以把粒子采样范围从又扁又宽的区域更改到激光雷达观测模型所代表的尖峰区域L,新的粒子分布就可以更贴近于真实分布。

     扫描匹配之后,我们就找到了L所代表的尖峰区域,接下来的任务是确定

该尖峰区域所代表的高斯分布的均值和方差。作者的方法是,在L中随机采样K个点,根据这K个点的里程计和观测模型计算均值和方差,如下式所示。

3、计算权重

     然后,对于每个粒子,我们需要计算它的权重,以供后续的重采样步骤使用。由于在前面我们利用激光数据对提议分布进行了优化:

     那么粒子的权重公式变成了:

    这里还有一个问题就是权重计算,权重描述的是目标分布和提议分布之间的差别。因此我们在计算权重时就是计算我们模拟出的提议分布和目标分布的不同。而这种不同体现在我们是由有限的采样模拟出目标分布,因此权重的计算公式为:

4、重采样(update Tree Weights)

    在执行重采样之前计算了每个粒子的权重,有时会因为环境相似度高或是由于测量噪声的影响会使接近正确状态的粒子数权重较小而错误状态的粒子的权重反而会大。重采样是依据粒子权重来重新采粒子的,这样正确的粒子就很有可能会被丢弃,频繁的重采样更加剧了正确但权重较小粒子被丢弃的可能性。

Gmapping算法中,作者采用权重值离差的量度进行重采样的判定。

Neff越大,粒子权重差距越小。想象极端情况,当所有粒子权重都一样的时候(比如重采样之后),这些粒子恰好可以表示真实分布(类似于按照某个分布随机采样的结果)。当Neff降低到某个阈值以下,说明粒子的分布与真实分布差距很大,在粒子层面表现为某些粒子离真实值很近,而很多粒子离真实值较远,这时候恰好进行重采样。

  • 建图

Gmapping算法会构建一个栅格地图,对二维环境进行了栅格尺度划分,而假设每一个栅格的状态是独立的。

对于环境中的一个点,我们用 来表示它是Free状态的概率,用 来表示它是Occupied状态的概率,当然两者的和为1。为了更方便的表示,我们用 作为该点的状态,比值越大说明该点约可能是障碍物。

对于一个点,对于一个点,新来了一个测量值z之后我们需要更新它的状态。假设测量值来之前,该点的状态为 ,我们要更新它为:

由贝叶斯公式计算可得:

为了方便计算,我们对两边取对数:

在没有任何测量值的初始状态下,一个点的初始状态为0,而这一部分关键的地方在于 的计算,我们称这个比值为测量值的模型,标记为lomeas。实际上测量值的模型只有两种:  ,而且都是定值。这样每获得一次测量值,我们都能用加减法对点状态进行更新。从而完成更新地图的工作。以下图为例:

x是真实世界中的坐标, 为栅格地图中的坐标,r为一格的长度,1/r表示分辨率,则 。则二维情况下: 。假设图中机器人的位姿为(x,y, ),我们可以很容易计算障碍物的位置:

其中,d为测量得到的距离, 为激光线与机器人位姿角的夹角。我们得到两个坐标后能计算出两点在栅格地图的位置(i,j )与( )。

然后,我们利用bresenham算法(compute active area)来计算非障碍物格点的集合。然后利用上文所述结论,更新栅格地图即可。

Bresenham算法基本思想是采用递推步进的办法,令每次最大变化方向的坐标步进一个像素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个像素。举例说明:

由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个像素点坐标为(xi,yi),它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设直线斜率小于1)。那么,直线上下一个像素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。由图中可以知道,在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离像素点(xi+1,yi)和像素点(xi+1,yi+1)的距离分别是d1和d2: 

 这两个距离差是

分析d1-d2,有以下三种情况:

  1. 当此值为正时,d1>d2,说明直线上理论点离(xi+1,yi+1) 像素较近,下一个像素点应取(xi+1,yi+1)。
  2. 当此值为负时,d1<d2,说明直线上理论点离(xi+1,yi) 像素较近,则下一个像素点应取(xi+1,yi)。
  3. 当此值为零时,说明直线上理论点离上、下两个像素点的距离相等,取哪个点都行,算法规定这种情况下取(xi+1,yi+1)作为下一个像素点。

因此只要利用(d1-d2)的符号就可以决定下一个像素点的选择。

参考文献

  1. https://blog.csdn.net/qq_36355662/article/details/90301219
  2. https://blog.csdn.net/shixiaolu63/article/details/93739379
  3. https://www.jianshu.com/p/f044da681454
  4. https://blog.csdn.net/liuyanpeng12333/article/details/81946841
  5. https://www.cnblogs.com/yhlx125/p/5634128.html
  6. 概率机器人
  7. 粒子滤波:从推导到应用
  8. Improved Techniques for Grid Mapping with Rao-Blackwellized Particle Filters

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习经典算法源码分析系列】-- 逻辑回归

1.逻辑回归&#xff08;Logistic Regression&#xff09;又常被成为“逻辑斯蒂回归”&#xff0c;实质上是一个二元分类问题。 逻辑回归代价函数&#xff1a; 代价函数导数&#xff1a; Matlab实现&#xff1a; 采用matlab中自带的无约束最小化函数fminunc来代替梯度下降法&…

ROS——不同版本间ROS进行通信

在相同版本间的ROS进行通信不在赘述了&#xff0c;修改/etc/hosts文件即可。 最近项目遇到在Ubuntu16.04 与Ubuntu18.04两个系统间进行ROS通信&#xff0c;ROS版本分别为Kinetic和Melodic。配置网络后&#xff0c;两边都能够ping通&#xff0c;但是在获取ros数据是&#xff0c…

大数据开发实战:数据流图及相关数据技术

1、大数据流程图 2、大数据各个环节主要技术 2.1、数据处理主要技术 Sqoop&#xff1a;&#xff08;发音&#xff1a;skup&#xff09;作为一款开源的离线数据传输工具&#xff0c;主要用于Hadoop(Hive) 与传统数据库&#xff08;MySql,PostgreSQL&#xff09;间的数据传递。它…

跨时钟域电路设计——亚稳态及双锁存器

一、同步电路 定义&#xff1a;电路中所有受时钟控制的单元&#xff0c;全部由一个统一的时钟控制。 优点&#xff1a;在同步设计中&#xff0c;EDA工具可以保证电路系统的时序收敛&#xff0c;避免电路设计中的竞争冒险。 缺点&#xff1a;时钟树综合需要加入大量延迟单元&…

跨时钟域电路设计——单bit信号

前面提到了简单的双电平锁存器&#xff0c;下面是一些单bit同步电路。 一、慢时钟域向快时钟域 边沿检测同步器 将慢时钟域的脉冲搬移并缩小为快时钟域的脉冲。 既可以检测上升沿&#xff0c;也可以检测下降沿。 如上图&#xff0c;慢时钟下一个有效脉冲的最短周期为慢时钟的…

C语言100例01 PHP版(练习)

题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 代码&#xff1a; 1 for($i1;$i&l…

跨时钟域电路设计——结绳法

信号从快时钟域到慢时钟域过渡时&#xff0c;慢时钟可能无法对快时钟变化太快的信号进行采样。 之前的同步器法对两个时钟间的关系有要求&#xff0c;结绳法适用于任何时钟域之间的过渡。 结绳法的原理是将快时钟信号的脉冲周期延长&#xff0c;等到慢时钟周期采样后再“解绳”…

我之理解---计时器setTimeout 和clearTimeout

今天在写个图片切换的问题 有动画滞后的问题&#xff0c;才动手去查setTimeout 和clearTimeout。之前写的图片播放器也有类似的问题&#xff0c;有自动start按钮 和stop按钮&#xff0c; 其他都正常&#xff0c;问题出在每次多次快速的点击start按钮时&#xff0c;图片播放的速…

关于二维码分块上色(彩色二维码)的算法研究

原文:关于二维码分块上色&#xff08;彩色二维码&#xff09;的算法研究众所周知&#xff0c;二维码通常是黑白的&#xff0c;而且是由若干个长方形或正方形小块平铺而成。但从人们的审美角度来看&#xff0c;常见的黑白二维码不免让人审美疲劳。本文试着从分块上色的角度对二维…

20145309信息安全系统设计基础第12周学习总结后篇

指针与声明 声明 1、C语言中变量的声明 类型&#xff08;type&#xff09; 声明符&#xff08;declarator&#xff09; 2、最简单的声明是变量 3、指针数组 指针数组是一个数组数组里的元素都是指针例&#xff1a;int *daytab[13]4、数组指针 数组指针是一个指针指针指向一个类…

跨时钟域电路设计——多bit信号FIFO

多个bit信号的跨时钟域仅仅通过简单的同步器同步时不安全的。 如下图&#xff1a; 虽然信号都同步到目的时钟域&#xff0c;可完成的功能却与设计的初衷不相符。 解决方案之一为对信号进行格雷码编码&#xff0c;但此方案只适用于连续变化的信号。另一种方案为增加新的控制信号…

WPF 打印实例

原文:WPF 打印实例在WPF 中可以通过PrintDialog 类方便的实现应用程序打印功能&#xff0c;本文将使用一个简单实例进行演示。首先在VS中编辑一个图形&#xff08;如下图所示&#xff09;。 将需要打印的内容放入同一个<Canvas>中&#xff0c;并起名为“printArea”&…

静态时序分析——基础概念

一、简述 静态时序分析是检查系统时序是否满足要求的主要手段。以往时序的验证依赖于仿真&#xff0c;采用仿真的方法&#xff0c;覆盖率跟所施加的激励有关&#xff0c;有些时序违例会被忽略。此外&#xff0c;仿真方法效率非常的低&#xff0c;会大大延长产品的开发周期。静…

静态时序分析——单周期

一、建立时间的检查 建立时间的检查是指检查电路里每一个触发器的数据和时钟的关系是否满足建立时间的要求。 我们以上图为例进行建立时间检查。由图可知&#xff0c;我们主要针对第二个触发器UFF1进行检查。我们可以梳理时序关系如下&#xff1a; 通过这个图&#xff0c;我们…

自己搭建的CISCO实验环境

交换机&#xff1a;设备型号&#xff1a; CISCO 3750 24-TS 3台CISCO 3750 48-PS 1台路由器&#xff1a;设备型号&#xff1a;1.CISCO 2821 3台2.CISCO 3745 3台 物理拓扑图如下&#xff1a; 转载于:https://blog.51cto.com/zxs3026/2156424

CMOS组合逻辑

1. 静态互补CMOS 实际上就是静态CMOS反相器扩展为具有多个输入。更反相器一样具有良好的稳定性&#xff0c;性能和功耗。 静态的概念&#xff1a;每一时刻每个门的输出通过低阻抗路径连到VDD或VSS上。任何时候输出即为布尔函数值。动态电路通常依赖把信号暂存在高阻抗节点的电…

绘制泰森多边形

使用到的数据文件&#xff0c;内容如图&#xff1a; 代码&#xff1a; clc; clear; close all; % 导入需要的坐标数据成矩阵 a load(test.txt); x a(:,1); y a(:,2); x x;%获取坐标的横坐标 y y;%获取坐标的纵坐标 %根据点 绘制泰森多边形 voronoi(x,y); %设定x轴的边界 x…

(八)限定某个目录禁止解析php、限制user_agent和PHP相关配置

2019独角兽企业重金招聘Python工程师标准>>> 限定某个目录禁止解析php 对于使用php语言编写的网站&#xff0c;有一些目录是有需求上传文件的。如果网站代码有漏洞&#xff0c;让黑客上传了一个用PHP写的木马&#xff0c;由于网站可以执行PHP程序&#xff0c;最终会…

静态时序分析——多周期、半周期和伪路径

一、多周期 multicycle paths 在一些情况下&#xff0c;如下图所示&#xff0c;两个寄存器之间的组合电路传输的逻辑延时超过一个时钟周期。在这样的情况下&#xff0c;这个组合路径被定义为多周期路径&#xff08;multicycle path&#xff09;。尽管后一个寄存器会在每一个的…

网络七层协议之物理层

我们以一个非常简单的例子开始&#xff1a; 两服务器通讯问题 如上图&#xff0c;有两台服务器&#xff0c;分别是 Server 1 和 Server 2 。 我们先做一个假设&#xff1a;计算机网络现在还没有被发明出来&#xff0c; 作为计算机科学家的你&#xff0c;想在这两台服务器间传递…