【全局地图mapping】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理
文章目录
- 系列文章目录
- 前言
- 一、gmapping算法建图【基于Raoo-Blackwellized粒子滤波(RBPF)算法】
- 1.gmapping理论
- (1)gmapping的工作原理
- (2)gmapping的算法流程
- (3)gmapping论文理论
- 2.gmappingROS工程框架解析
- (1)gmapping的功能包架构
- (2)gmapping订阅和发布的话题
- (3)gmapping算法建图参数
- (4)gmapping源码解读
- (5)通过二进制的方法安装gmapping软件包
- 3.gmapping需要用到的硬件数据
- 4.gmapping总结
- (1)优点
- (2)缺点
- 二、hector算法建图【高斯牛顿方法】
- 1.hector理论
- (1)hector解决的问题--利用的方法
- (2)hector论文理论
- 2.hectorROS工程框架解析
- (1)hector的工作流程图
- (2)hector节点间订阅发布话题
- (3)hector源码解读
- 3.hector需要用到的硬件数据
- 4.hector总结
- (1)优点
- (2)缺点
- 三、karto算法建图【基于spa图优化方法】
- 1.karto理论
- (1)kaeto的工作原理
- (2)kaeto论文理论
- 2.karto ROS工程框架
- (1)karto功能包架构
- (2)karto节点间关系图、订阅发布的话题
- (3)karto源码解读
- 3.karto需要用到的硬件数据
- 四、cartographer算法建图【基于图优化的方法】
- 1.cartographer工作原理
- 2.cartographerROS工程框架
- (1)cartographer功能包架构
- (2)cartographer订阅发布话题
- (3)通过二进制的方法安装slam_cartographer软件包
- 3.cartographer需要用到的硬件数据
- 4.cartographer总结
- (1)优点
- (2)缺点
- 五、2D的SLAM方案对比
- 1. Gmapping
- 2. Hector slam
- 3. KartoSLAM
- 4. Cartographer
前言
认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!
本文先对二维全局地图的开源方案及对比–gmapping、hector、karto、cartographer做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章
提示:以下是本篇文章正文内容
一、gmapping算法建图【基于Raoo-Blackwellized粒子滤波(RBPF)算法】
1.gmapping理论
(1)gmapping的工作原理
gmapping是基于Raoo-Blackwellized粒子滤波(RBPF)算法实现的开源SLAM算法,gmapping算法将定位和建图的过程分离,先通过粒子滤波算法做定位,【防盗标记–盒子君hzj】再通过粒子与以产生的地图进行匹配scan match,在通过不断校正里程计误差并添加新的scan作为地图
(2)gmapping的算法流程
从上图可以看出,ROS中的slam_gmapping功能包是依赖于开源的opemslam_gmapping功能包的,换句话说,【防盗标记–盒子君hzj】ROS的gmapping功能包是对openslam)gmapping的再次封装
伪代码如下
.
.
(3)gmapping论文理论
.
.
2.gmappingROS工程框架解析
(1)gmapping的功能包架构
gmapping功能包通过订阅机器人的深度信息、【防盗标记–盒子君hzj】IMU信息和里程计信息,同时完成一些必要的参数配置,即可创建并输出基于概率的二维栅格地图
.
.
(2)gmapping订阅和发布的话题
(1)订阅的话题
订阅了/scan话题,【防盗标记–盒子君hzj】用于获取激光雷达扫描数据
订阅了TF话题,用于雷达、底盘与里程计之间的坐标变换消息
(2)发布的话题
发布了map_metadata(nav_msgs/MapMetaData)话题,地图元数据,包括地图的宽度、高度、分辨率等,该消息会固定更新
发布了map(nav_msgs/OccupancyGrid)话题,用于地图栅格数据,一般会在rviz中以图形化的方式显示
发布了entropy(std_msgs/Float64)话题,用于机器人姿态分布熵估计(值越大,不确定性越大)
(3)gmapping算法建图参数
在官方的launch文件中进行修改
<launch><arg name="scan_topic" default="scan" /> <!-- 根据自己发布scan名称进行修改 --><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true"><param name="base_frame" value="base_footprint"/> <!-- 根据自己的基座标系名称进行修改 --><param name="odom_frame" value="odom"/> <!-- 根据自己的里程计坐标系名称进行修改 --><param name="map_update_interval" value="4.0"/><!-- Set maxUrange < actual maximum range of the Laser --><param name="maxRange" value="5.0"/><param name="maxUrange" value="4.5"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="lskip" value="0"/><param name="srr" value="0.01"/><param name="srt" value="0.02"/><param name="str" value="0.01"/><param name="stt" value="0.02"/><param name="linearUpdate" value="0.5"/><param name="angularUpdate" value="0.436"/><param name="temporalUpdate" value="-1.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="80"/><param name="xmin" value="-1.0"/><param name="ymin" value="-1.0"/><param name="xmax" value="1.0"/><param name="ymax" value="1.0"/><param name="delta" value="0.05"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/><remap from="scan" to="$(arg scan_topic)"/></node>
</launch>
(4)gmapping源码解读
(5)通过二进制的方法安装gmapping软件包
ROS提供了gmapping算法功能包,【防盗标记–盒子君hzj】这大大减少了大家使用该算法的难度,通过如下命令即可完成算法的二进制安装,前提是你已经安装了ROS
sudo apt-get install ros-kinetic-gmapping #根据您ROS的版本,自行更改即可
.
.
3.gmapping需要用到的硬件数据
里程计数据、激光雷达数据、imu数据
.
.
4.gmapping总结
室内平坦的路面的场景比较适合
(1)优点
(1)计算量小,精度较高,要求雷达的扫描频率较低,稳定性好
【gmapping有效利用了里程计的信息,【防盗标记–盒子君hzj】因此不要求激光雷达很高的扫描频率,计算量也低】
(2)gmapping可以实时构建室内环境地图
(2)缺点
(1)需要里程计数据,场景受限,无法应用在不平坦路面和空中
(2)适合在室内建立实时地图,不适合构建大场景地图
【因为随着场景增大,所需的粒子会增加,【防盗标记–盒子君hzj】每个粒子都携带者一幅地图,因此在大地图构建时所需的内存和计算量都会大大增加】【gmapping算法使用了空间复杂度换时间复杂度的方法,小地图计算量小,大地图内存吃不消的】
(3)没有回环检测,在回环闭合时可能会残生地图的错位
一般计算量小的,处理的数据就小,精度就不高,第性能的计算机就可以实现
反之,精度高的效果好的,计算量就大,需要高性能的计算及
gmapping参考资料
https://zhuanlan.zhihu.com/p/327783270
.
.
.
二、hector算法建图【高斯牛顿方法】
1.hector理论
(1)hector解决的问题–利用的方法
1)利用已经获得的地图对激光束点阵进行优化,用于估计激光点在地图的表示和占据网络的概率
2)利用高斯牛顿方法解决scan-matching问题,用于获得激光点集映射到已有地图刚体变换(x,y,theth)
3)利用多分辨率地图,【防盗标记–盒子君hzj】用于避免局部最小而非全局最优
4)利用扩展卡尔曼(EKF)滤波,用于融合惯性测量系统(IMU)精准实现导航中额状态估计
.
.
(2)hector论文理论
.
2.hectorROS工程框架解析
(1)hector的工作流程图
(2)hector节点间订阅发布话题
(1)订阅话题
1)订阅了/scan话题,用于获取激光雷达扫描数据
2)订阅了syscommand(std_msgs/String),系统命令,如果字符串为“reset”,则将地图个机器人姿态重置为器初始状态
3)订阅了TF话题,用于定位信息
(2)发布话题
1)发布了/map话题,用于发布gmapping算法建立好的地图
(3)hector源码解读
通过二进制的方法安装slam_hector软件包
3.hector需要用到的硬件数据
(1)激光雷达
(2)IMU
.
.
4.hector总结
应用的场景
应用场景较多,如不平整地面和空中,救灾的场景,可以不使用里程计
(1)优点
(1)hector使用高斯牛顿方法来解决scan-matching,可以在没有里程计信息条件下,仅仅依赖激光雷达建图,应用场景较多,如不平整地面和空中
(2)缺点
(1)在机器人快速转动时容易发生错误匹配,建立错位的地图【因为优化算法用以陷入局部最小值】
(2)要求的激光雷达扫描帧率一般要高于20hz,【防盗标记–盒子君hzj】雷达噪声小,这样才有有效的估计6个自由度
(3)初值的选择对结果的影响很大
(4)需要机器人运动速度不快的情况下才能有效建图【因为既没有里程计,也没有回环处理】
.
.
三、karto算法建图【基于spa图优化方法】
1.karto理论
(1)kaeto的工作原理
karto slam是基于图优化的方法,使用高度优化和非迭代的cholesky分解进行系数系统解耦作为解,图优化的方法表示地图,每个节点表示机器人轨迹的一个为支点和传感器测量数据集,箭头的只想的连接表示连续机器人为支点的运动,每个新节点加入【防盗标记–盒子君hzj】地图就会一依据空间中的节点箭头的约束进行更新。
(2)kaeto论文理论
2.karto ROS工程框架
(1)karto功能包架构
.
.
(2)karto节点间关系图、订阅发布的话题
(1)订阅的话题
1)订阅了/scan话题,用于获取激光雷达扫描数据
2)订阅了TF话题,用于获取机器人里程计信息
(2)发布的话题
1)发布了/map话题,用于发布karto算法建立好的地图
.
.
(3)karto源码解读
通过二进制的方法安装slam_karto软件包
.
.
3.karto需要用到的硬件数据
里程计 、激光雷达
.
.
.
四、cartographer算法建图【基于图优化的方法】
1.cartographer工作原理
cartographer是基于图优化建立地图的算法,采用google的ceres构建problem优化,支持多传感器融合建图,可以支持激光雷达、IMU、里程计等传感器数据,并根据这些数据进行地图构建。从传感器出发,Laser的数据经过两个滤波器后进行Scan Matching【防盗标记–盒子君hzj】,用来构建子图submap,而新的Laser Scan进来后也会插入到已经维护着的子图的适当位置,通过Ceres Scan Matching决定插入的最优位姿。估计出来的最优位姿也会于里程计、IMU数据融合,用于估计下一时刻的位姿。
cartographer整体可以分为两个部分:
1)local_slam部分【负责生成较好的子图】
2)Global_slam部分【负责进行全局优化,键不同的子图一最匹配的位姿贴在一起】
.
.
2.cartographerROS工程框架
(1)cartographer功能包架构
(2)cartographer订阅发布话题
在运行cartographer_ros建图算法时,需要启动cartographer_node和cartographer_occupancy_grid_node两个节点
cartographer_node节点话题:
节点功能:
该节点是算法的核心节点,负责收听scan和odom数据并输出submap_list数据
(1)订阅的话题
0)订阅了/echoes话题,用于多回波雷达数据的接收(暂未使用)
1)订阅了/scan话题,用于获取激光雷达扫描数据
2)订阅/points2话题,用于获取点云传感器数据
3)订阅/imu话题,用于获取IMU数据
4)订阅/odom话题,用于获取里程计传感器数据
(2)发布的话题
1)发布scan_matchd_points/话题,【防盗标记–盒子君hzj】用于把匹配好的2D点云数据进行scan-to-submap matching
2)发布submap_list/话题,用于发布构建好的submap
cartographer_occupancy_grid_node节点话题
节点功能
cartographer_occupancy_grid_node将输出的submap_list融合成ROS标准的map栅格地图数据话题并发布
(1)订阅submap_list/话题,用于接收算法底层地图数据
(2)发布map/话题,用于发布ROS标准格式的栅格地图
(3)通过二进制的方法安装slam_cartographer软件包
https://zhuanlan.zhihu.com/p/165398798
https://zhuanlan.zhihu.com/p/64747755
比较麻烦,因为它没有集成到ros中,不能用apt的方式安装,只能通过源码编译的方式安装【参照课件,百度一下步骤】
.
.
3.cartographer需要用到的硬件数据
里程计数据、激光雷达数据、imu数据
.
.
.
4.cartographer总结
应用的场景:
室内室外的路面,可以在没有里程计信息条件下建图,应用场景较多,特别适合手持设备
(1)优点
(1)可以在没有里程计信息条件下建图,应用场景较多
(2)使用了以时间复杂度换空间复杂度的方法,【防盗标记–盒子君hzj】计算量大,需要的内存较小,针对计算量大的问题,谷歌开发了ceres库进行优化矩阵运算
(3)cartographer可以支持激光雷达、IMU、里程计等传感器数据
(2)缺点
计算量大
五、2D的SLAM方案对比
https://blog.csdn.net/Travis_X/article/details/114856981
1. Gmapping
Gmapping是应用最为广泛的2D slam方法,基于RBPF粒子滤波算法,先定位再进行建图。
Gmapping在RBPF算法上做了两个主要的改进:改进提议分布和选择性重采样。 改进的提议分布不但考虑里程计的信息还考虑最近一次的观察(激光)信息可以使提议分布更加接近目标分布。选择性重采样通过设定阈值,【防盗标记–盒子君hzj】只有在粒子权重发生变化超过阈值时才执行重采样从而大大减少了重采样的次数。
Gmapping可以实时构建室内地图,在构建小场景地图所需的计算量较小且精度较高。相比Hector SLAM对激光雷达频率要求低、鲁棒性高(Hector 在机器人快速转向时很容易发生错误匹配,建出的地图发生错位,原因主要是优化算法容易陷入局部最小值);而相比Cartographer在构建小场景地图时,Gmapping不需要太多的粒子并且没有回环检测因此计算量小于Cartographer而精度并没有差太多。 随着场景增大所需的粒子增加,【防盗标记–盒子君hzj】因为每个粒子都携带一幅地图,因此在构建大地图时所需内存和计算量都会增加。因此不适合构建大场景地图。并且没有回环检测,因此在回环闭合时可能会造成地图错位,虽然增加粒子数目可以使地图闭合但是以增加计算量和内存为代价。 所以Gmapping不能像cartographer那样构建大的地图,虽然论文生成几万平米的地图,但实际我们使用中建的地图没有上万平米时就会发生错误。
优点:在长廊及低特征场景中建图效果好;
缺点:严重依赖里程计(odometry),无法适用无人机及地面小车不平坦区域;无回环
.
.
2. Hector slam
hector_slam通过最小二乘法匹配扫描点,且依赖高精度的激光雷达数据,因此扫描角很小且噪声较大的Kinect是不行的,匹配时会陷入局部点,地图比较混乱。
优点:无需依赖里程计,可以适应空中或者地面不平坦的情况。
缺点:对传感器要求比较高,需要更新频率较高,测量噪声小的传感器;建图过程需要缓慢移动效果才比较理想;无回环
.
.
3. KartoSLAM
KartoSLAM是基于图优化的方法,用高度优化和非迭代 cholesky矩阵进行稀疏系统解耦作为解,图优化方法利用图的均值表示地图,每个节点表示机器人轨迹的一个位置点和传感器测量数据集,箭头的指向的连接表示连续机器人位置点的运动,每个新节点加入,地图就会依据空间中的节点箭头的约束进行计算更新. KartoSLAM的ROS版本,【防盗标记–盒子君hzj】其中采用的稀疏点调整(the Spare Pose Adjustment(SPA))与扫描匹配和闭环检测相关。
优点:图优化方式相比其他方法在大环境下制图优势更大,在某些情况下KartoSLAM更有效,因为他仅包含点的图(robot pose),求得位置后再求map。
缺点:landmark越多,内存需求越大
4. Cartographer
cartographer是通过闭环检测来消除构图中产生的累计误差。用于闭环检测的基本单元是submap,一个submap由一定数量的laser scan组成,将一个laser scan插入到其对应的submap时,会基于submap已有的laser scan及其传感器数据估计其在该submap中的最佳位置。然而随着时间推移,越来越多的submap被创建后,submap的累计误差会越来越大,【防盗标记–盒子君hzj】因此需要通过闭环检测适当的优化这些submap的位姿进而消除这些累计误差,这就将问题转化为一个位姿优化问题。
当一个submap的构建完成时,也就不会有新的laser scan插入到submap中,该submap就会加入到闭环检测中,闭环检测会考虑所有的已完成创建的submap,当一个新的submap加入到地图中时,如果该laser scan的估计位姿与地图中某个submap中的某个laser scan的位姿比较接近的话,那么通过某种scan match策略就可以找到该闭环。cartographer中的scan match策略通过在新加入地图中的laser scan的估计位姿附近取一个窗口,进而在该窗口内寻找该laser scan的一个可能匹配,如果找到哟个足够好的匹配,【防盗标记–盒子君hzj】则将该匹配的闭环约束加入到位姿优化的问题中。
优点:累计误差较低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。
缺点:CPU性能要求教高。
【全局地图mapping】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer相关推荐
- 三维点云地图转二维栅格地图
文章目录 前言 一.安装octomap 二.安装map_server 三.发布.转换并保存 前言 三维点云地图转二维栅格地图的实现需要1.地图转换工具--octomap:2.栅格地图保存工具--map ...
- 三维pcd地图转二维栅格地图
1.概述 在使用导航时,通常会根据二维栅格地图做路径规划,需要将三维点云地图转化成栅格地图. 本文采用滤波及投影的方法, 主要步骤包括 对输入点云进行直通滤波,获取限定高度范围的数据 在进行半径滤波, ...
- 【全局地图mapping】三维全局地图的开源方案及对比--NDT、LOAM、LIO-SAM、ALOAM、FLOAM、Lego_loam、SC-Lego-LOAM.....
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.使用NDT构建点云地图及定位的方法 二.LOAM 三.LIO-S ...
- 【应用SLAM技术建立二维栅格化地图】
应用SLAM技术建立二维栅格化地图 一. 设计目标 二. 技术要求 三. 设计方案 1. 激光SLAM简介 2. Cartographer简介与使用 1) Cartographer简介 2) 官方de ...
- SLAM 建立局部二维栅格地图的一种方法
转载请说明出处:http://blog.csdn.net/zhubaohua_bupt/article/details/72923373 二维占据栅格地图(栅格地图)广泛应用于移动机器人导航领域中,比 ...
- 【Nav2中文网】六、插件教程(一)编写新的二维代价地图(Costmap2D)插件
本教程来自:Nav2中文网 Nav2交流社区:https://fishros.org.cn/forum ROS2/Nav2千人交流群:(QQ)139707339 更多精彩教程请关注微信公众号:鱼香RO ...
- 古月 ROS移动机器人实战 二维slam地图构建 笔记
二维slam地图构建 Gmapping功能包 一种粒子滤波算法,将定位与建图分离,先进行定位.再进行建图,适合构建小场景环境下的地图信息. 需要机器人提供里程计信息作为先验知识. 虽然可以降低对激光雷 ...
- (一)路径规划算法---Astar与C++可视化在RVIZ的二维栅格地图
Astar与C++可视化在RVIZ的二维栅格地图中 文章目录 Astar与C++可视化在RVIZ的二维栅格地图中 1.功能包介绍 2.二维栅格地图以及相关坐标系说明 2.1 世界坐标系 2.2 栅格坐 ...
- 动态开辟二维数组的两种方案及位体
动态开辟二维数组的两种方案及位体 一.在静态二维数组中查询数据 二.动态开辟二维数组空间 1.用二级指针的方式开辟 2.用结构体的方式开辟 三.位体 先来回顾一下动态开辟一位数组的方法: #inclu ...
最新文章
- Cheat—— 给Linux初学者和管理员一个终极命令行备忘单
- 打散算法的三种解决方案及其选型场景
- python异常处理优点_python自测100题(下)
- 数据压缩 第二次作业
- zabbix编译安装
- Jeecgboot Feign、分布式压测、分布式任务调度
- 帆软报表调用python脚本_帆软报表(finereport)实现自动滚屏效果
- windows功能正在搜索需要的文件_拥有高效的搜索工具Everything,可以丢开Windows的搜索功能了...
- SQL Prompt教程:使用SQL提示代码分析避免T-SQL技术债务
- mysql创建数据库_MySQL创建数据库的两种方法
- 小学生计算机课记录表,小学信息技术听课记录
- 为什么1//0.1等于9.0,而1//-0.1=-10?
- HEVC中变换(Transform)过程中的scaling操作的理解
- 韩剧TV APP案例分析
- 算法学习:134. 加油站
- Fabric架构原理总结
- Linux永久修改主机名
- 【天文】基于matlab实现GPS卫星运动仿真附matlab代码
- CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。
- linux系统主要用来做什么,linux是用来干嘛的?Linux运维平时都做什么