对比几种在ROS中常用的几种SLAM算法
在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正!
文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法。 在ROS中提供的五种基于2D激光的SLAM算法分别是:HectorSLAM,Gmapping,KartoSLAM,CoreSLAM和LagoSLAM。当然最后还有比较经典的google开源的cartographer,虽然不是基于ROS的但是大牛们已经将它修改为基于ROS的版本的cartographer_ros,
ROS(Robot Operating System)是一个基于Linux的开源操作系统,目的在于构建一个能够整合不同研究成果,实现算法,代码重用的机器人软件平台。ROS是当前比较流行的机器人控制框架,它让我们节省时间构建机器人的系统框架,更专注算法层面的研究。极大的提高了开发效率。提供了包括硬件抽象描述、底层设备控制、常用功能的实现,程序间信息的传递、程序包管理以及一些可视化数据程序和软件库,并在此平台的基础上开源了很多诸如定位构图,运动与规划,感知与决策等应用软件包。
机器人爆炸式增长的一个主要问题是不能在不同的机器人平台上重复使用代码。然而,ROS中的硬件抽象层及其消息服务允许创建可用于许多不同机器人平台的新代码。而且,ROS提供了一套稳定的机器人软件包,公认的SLAM评估方法都依赖于机器人社区可用的标准数据集。 本文中研究了基于激光的主要二维SLAM算法,所有SLAM的结果都使用占用网格作为最终输出,使用地图相似性的性能指标进行分析。 重点是放在地图质量,而不是姿态估计误差,因为映射输出受到本地化问题的高度影响。 主要目标是提供ROS中所有五种算法的优缺点概述,提供简单而准确的定量比较,从而为ROS开发者定义一个通用的指导方针,以选择最符合他们需求的算法。
(1)HectorSLAM
HectorSLAM是一种结合了鲁棒性较好的扫描匹方法2D SLAM方法和使用惯性传感系统的导航技术。传感器的要求:高更新频率小测量噪声的激光扫描仪.不需要里程计,使空中无人机与地面小车在不平坦区域运行存在运用的可能性.作者利用现代激光雷达的高更新率和低距离测量噪声,通过扫描匹配实时地对机器人运动进行估计。所以当只有低更新率的激光传感器时,即便测距估计很精确,对该系统都会出现一定的问题,如下图是该系统生成的二维地图。
http://kaspar.informatik.uni-freiburg.de/~slamEvaluation/datasets.php
http://www.ros.org/wiki/hector_slam
利用已经获得的地图对激光束点阵进行优化, 估计激光点在地图的表示,和占据网格的概率.,其中扫描匹配利用的是高斯牛顿的方法进行求解. 找到激光点集映射到已有地图的刚体转换(x,y,theta).具体的公式如下:
下图二维地图是hectorSLAM 多分辨率地图的表示。 网格单元格长度(从左到右):20厘米,10厘米和5厘米 ,使用多分辨率地图表示,以避免陷入局部最小化。 这个解决方案背后的想法是在内存中有不同的地图,同时使用之前估计的姿势来更新它们。 计算成本 仍然很低,所以地图总是一致的
最后,3D空间导航状态估计是基于EKF滤波器。 但是,这种情况是仅在IMU存在时才需要,例如在空中机器人的情况下。 因此,这里我们只讨论二维的SLAM
它会将不再这项工作中使用。如下图显示了HectorSLAM方法的概述。
(2)Gmapping
Gmapping是一种基于激光的SLAM算法,它已经集成在ROS中,是移动机器人中使用最多的SLAM算法。这个算法已经由Grisetti等人提出是一种基于 Rao-Blackwellized的粒子滤波的 SLAM方法。基于粒子滤波的算法用许多加权粒子表示路径的后验概率,每个粒子都给出一个重要性因子。但是,它们通常需要大量的粒子才能获得比较好的的结果,从而增加该算法的的计算复杂性。此外,与PF重采样过程相关的粒子退化耗尽问题也降低了算法的准确性。粒子退化问题包括在重采样阶段从样本集粒子中消除大量的粒子。发生这种情况是因为它们的重要性权重可能变得微不足道。因此,这意味着有一定的小概率时间会消除正确的假设的粒子。为了避免粒子的退化问题,已经开发了自适应重采样技术。
作者还提出了一种计算精确分布的方法,不仅考虑机器人平台的运动,还考虑最近的观察。提出了在使用测距运动模型时结合观测值提出建议分布。然而,当一个移动机器人装备一个非常精确的传感器LRF时,可以使用该传感器的模型,因为它可以实现了极高的似然函数。 基于此,作者整合了最近的传感器观测zt,并且他们计算高斯分布近似有效地获得下一代粒子分布。
这种自适应重采样降低了PF预测步骤中机器人姿态的不确定性。 结果,由于扫描匹配过程,所需的粒子数量减少,因为不确定性较低。 实验中,Gmapping使用的粒子数量是30,与普通PF方法相比,这是非常低的。
(3)LagoSLAM
LagoSLAM 是线性近似图优化,不需要初始假设。基本的图优化slam的方法就是利用最小化非线性非凸代价函数.每次迭代, 解决局部凸近似的初始问题来更新图配置,过程迭代一定次数直到局部最小代价函数达到. (假设起始点经过多次迭代使得局部代价函数最小). 。假设图中每个节点的相对位置和方向都是独立的,作者求解了一个等价于非凸代价函数的方程组。为此,提出了一套基于图论的程序,通过线性定位和线性位置估计,得到非线性系统的一阶近似。
(4)KartoSLAM
KartoSLAM是基于图优化的方法,用高度优化和非迭代 cholesky矩阵进行稀疏系统解耦作为解.图优化方法利用图的均值表示地图,每个节点表示机器人轨迹的一个位置点和传感器测量数据集,箭头的指向的连接表示连续机器人位置点的运动,每个新节点加入,地图就会依据空间中的节点箭头的约束进行计算更新.
KartoSLAM的ROS版本,其中采用的稀疏点调整(the Spare Pose Adjustment(SPA))与扫描匹配和闭环检测相关.landmark越多,内存需求越大,然而图优化方式相比其他方法在大环境下制图优势更大.在某些情况下KartoSLAM更有效,因为他仅包含点的图(robot pose),求得位置后再求map.
(5)CoreSLAM
COreSLAM最小化性能损失的一种slam算法.将算法简化为距离计算与地图更新的两个过程, 第一步,每次扫描输入,基于简单的粒子滤波算法计算距离,粒子滤波的匹配器用于激光与地图的匹配,每个滤波器粒子代表机器人可能的位置和相应的概率权重,这些都依赖于之前的迭代计算. 选择好最好的假设分布,即低权重粒子消失,新粒子生成..在更新步骤,扫描得到的线加入地图中,当障碍出现时,围绕障碍点绘制调整点集,而非仅一个孤立点。
以上各种激光测距仪的SLAM的算法的对比:
(6)cartographer
cartographer是Google的实时室内建图项目,传感器安装在背包上面,可以生成分辨率为5cm的2D格网地图。获得的每一帧laser scan数据,利用scan match在最佳估计位置处插入子图(submap)中,且scan matching只跟当前submap有关。在生成一个submap后,会进行一次局部的回环(loop close),利用分支定位和预先计算的网格,所有submap完成后,会进行全局的回环。
申明以上部分内容是参考了别人的博客,如有侵权,请告知,我将删除!
关于该文档的下载http://download.csdn.net/download/u013019296/10191358
有兴趣可以关注微信公众号
对比几种在ROS中常用的几种SLAM算法的更多相关文章
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- 本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop、Storm以及Spark。
本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop.Storm以及Spark. 当前的高性能PC机.中型机等机器在处理海量数据时,其计算能力.内存容量等指标都远远无法达到要求.在大数 ...
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- .NET中常用的几种解析JSON方法
一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...
- iOS中常用的四种数据持久化方法简介
iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...
- 【转载】Python编程中常用的12种基础知识总结
Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...
- Python编程中常用的12种基础知识总结
原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...
- python中常用的九种数据预处理方法分享
Spyder Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...
- 请写出JavaScript中常用的三种事件。
请写出JavaScript中常用的三种事件. 解答: onclick,onblur,onChange
随机推荐
- Django form入门详解--2
调整form的输出格式: 默认情况下form的格式化输出是基本table的样式的.但是django中还是为form提供发别的输出样式 1.默认的table样式输出 <html> <h ...
- Hadoop创建/删除文件夹出错
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFact ...
- 批量更新MongoDB的列。
db.User.find().forEach( function(item){ db.User.update({"_id":item._id},{"$set": ...
- 关于 ASP.NET 中的 Bundle 的补充说明(草稿)
一直以来,都认为 Bundle 有可能会不正确的压缩,而导致脚本出错,所以一直将这个功能处于禁用状态. 突然发现,其实只是自己使用的不对... 目前发现 Bundle 会导致的错误分两种情况: 1.路 ...
- VS2010如何重置开发环境
在利用VS进行软件开发的过程中,我们时不时要因为各种原因,对VS的开发环境进行变动,对于很多初次接触VS这样一个十分好用方便的编程工具的人来说,更改编程环境成了一个难题,今天我们就来讲解一下,如何更改 ...
- ES6模块的import和export用法
ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...
- Duplicate <http> element detected
1.错误描写叙述 org.springframework.beans.factory.parsing.BeanDefinitionParsingException:Configuration p ...
- C和指针第13章第4题
题目:编写一个函数,它用于对一个任何类型的数组进行排序. 算法核心代码sort函数实现 /** 功能说明:sort函数可以对不同类型的数据进行排序 参数: 1.一个指向需要排序的数组的第一个值的指针. ...
- 微信JSAPI 公众号支付 H5支付以及APP支付 WEBAPI接口开发测试
统一下单入口 调用该方法入口: public void WxPayAPI() { //string PayPrice ="99.9"; ////订单号 //string Payor ...
- C++操作符的优先级 及其记忆方法
优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作 ...