
从零开始搭二维激光SLAM
文章平均质量分 87
公众号: 从零开始搭SLAM
鉴于市面上还没有一套成熟完整的二维激光SLAM的教程,而且自己不实际从0开始编写总是觉得不能够完全理解,因此,我打算从0开始搭一套二维激光slam出来,为期一年的时间,以一周一篇的频率进行更新,csdn与公众号同步更新,希望能够坚持下去。
李太白lx
公众号: 从零开始搭SLAM
展开
-
从零开始搭二维激光SLAM --- 文章索引
本节为索引页,无算法内容。1 从零开始搭二维激光SLAM — 序章https://blog.youkuaiyun.com/tiancailx/article/details/1097772762 从零开始搭二维激光SLAM — 前言https://blog.youkuaiyun.com/tiancailx/article/details/1099876303 从零开始搭二维激光SLAM — 写作计划https://blog.youkuaiyun.com/tiancailx/article/details/1100962634 从原创 2020-12-07 17:06:24 · 9260 阅读 · 4 评论 -
从零开始搭二维激光SLAM --- 总结
第一篇文章是2020年11月20号开始写的, 今天是2021年11月22号.正好一年的时间, 写完了这一个系列的文章和代码.本来是用不了这么久的, 今年4月底弄了讲cartographer代码的课, 由于cartographer的代码太多, 太复杂, 所以我只能将这系列文章的开源项目先放下. 就导致了系列文章一直拖到现在.截止21年11月22号, 从零开始搭二维激光SLAM系列一共更文25篇, github获星116个, 公众号粉丝2286人. 不算多丰富的成果.在写文章的过程中成长了很多, 也和很原创 2021-11-22 15:44:38 · 2533 阅读 · 4 评论 -
从零开始搭二维激光SLAM --- 基于gtsam的后端优化的代码实现
上一篇文章我们分析了如何使用ceres进行位姿图的优化.1 gtsam简介2 基于gtsam的后端优化的代码讲解3 运行3.1 依赖这篇文章的代码是需要依赖 4.0.2 版本的gtsam库, 如果没装gtsam的需要先安装一下.我将gtsam库的安装包放在了 工程Creating-2D-laser-slam-from-scratch/TrirdParty文件加内, 可以直接解压安装.安装的方法可以看一下 install_dependence.sh 脚本中的安装指令, 也可以直接执行这个脚本进行原创 2021-11-22 15:03:31 · 4244 阅读 · 2 评论 -
从零开始搭二维激光SLAM --- 基于ceres的后端优化的代码实现
1 ceres简介2 基于ceres的后端优化的代码讲解3 运行3.1 依赖这篇文章的代码是需要依赖3.2 运行本篇文章对应的数据包, 请在我的公众号中回复 lesson6 获得,并将launch中的bag_filename更改成您实际的目录名。我将之前使用过的数据包的链接都放在腾讯文档里了, 腾讯文档的地址如下:https://docs.qq.com/sheet/DVElRQVNlY0tHU01I?tab=BB08J2通过如下命令运行本篇文章对应的程序roslaunch lesson6原创 2021-11-16 15:54:18 · 2500 阅读 · 0 评论 -
从零开始搭二维激光SLAM --- 基于g2o的后端优化的代码实现
https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247486858&idx=1&sn=ce458d5eb6b1ad11b065d71899e31a04&chksm=97d7e81da0a0610b1e3e12415b6de1501329920c3074ab5b48e759edbb33d264a73f1a9f9faf&scene=21#wechat_redirect原创 2021-11-15 13:44:28 · 3413 阅读 · 1 评论 -
从零开始搭二维激光SLAM --- Karto后端的位姿图相关的数据结构分析
从这篇文章开始, 学习如何使用g2o, ceres, gtsam三个优化库进行后端优化.在开始使用g2o进行优化的代码讲解之前, 先分析一下karto的后端的位姿图相关的数据结构.karto 在 Mapper.h 中定义了后端优化的接口 ScanSolver, 在实现自己的优化的代码时只有对这个接口进行继承并重写就可以了.ScanSolver的定义如下/** * Graph optimization algorithm */class ScanSolver{public:原创 2021-11-14 14:33:45 · 1808 阅读 · 2 评论 -
从零开始搭二维激光SLAM --- Karto的后端优化与回环检测的实现解读
上篇通过实验对比分析了是否启用后端优化与是否启用回环检测时的建图效果,并对后端优化与回环检测的作用进行了理论分析.这篇文章将为大家解读一下后端优化以及回环检测是如何实现的.由于我之前已经写过一篇讲解karto后端优化代码的文章了,所以这篇文章只是简要说明一下后端优化的实现过程.更详细的代码解析可以去看我的这篇文章:karto探秘之open_karto 第四章 — 回环检测与后端优化:https://blog.youkuaiyun.com/tiancailx/article/details/105386965原创 2021-05-21 15:19:15 · 1814 阅读 · 0 评论 -
从零开始搭二维激光SLAM --- Karto的后端优化与回环检测功能对比测试与分析
首先看一下只用前端时的室外建图效果,分辨率为0.05再看一下启用后端,但是不启用回环的结果放大一下看看约束的效果再看看启用后端优化与回环检测的结果放大一下看看约束的效果多了一条约束有没有,这就是回环约束,优化之后的图很整齐.最终的建图效果是这样的...原创 2021-04-26 16:10:26 · 2807 阅读 · 10 评论 -
从零开始搭二维激光SLAM --- Karto的前端实现与解读
原来的计划是从这篇文章开始自己搭一个新的SLAM框架的,结果由于水平不够,代码不知道从哪下手,不知道如何设计代码结构.后来就想着先把Karto拆解成比较独立的几个模块,像Cartographer那样,分别实现扫描匹配部分,建图部分.并新增使用imu与里程计的估计值,作为激光雷达扫描匹配的先验.但是由于Karto的代码耦合度实在是太高,拆解的工作量太大了,弄了一周也没啥进展,无奈只能放弃.所以学习SLAM还是得一步一步学习,不能好高骛远.搭一套SLAM不光要对算法实现,数学模型有深入理解,同时也要对代码原创 2021-04-15 15:04:52 · 4647 阅读 · 0 评论 -
数据集链接
群里有同学问雷达的数据集,正好我写文章公开了几个。之前都是在公众号后台回复关键字获取百度云链接,导致很多人不知道。同时,群里有同学说想要做个数据集分享平台,借着这个思路,我就将我的数据集放在腾讯文档里了.腾讯文档的地址如下:https://docs.qq.com/sheet/DVElRQVNlY0tHU01I?tab=BB08J2如果哪位同学想要公开自己的数据集,可以联系我,我加到腾讯文档中。文章将在 公众号: 从零开始搭SLAM 进行同步更新,欢迎大家关注,可以在公众号中添加我的微信,进激光原创 2021-03-23 14:25:07 · 3323 阅读 · 0 评论 -
从零开始搭二维激光SLAM ---使用IMU与轮速计进行单线激光雷达的运动畸变校正
之前的文章都是只使用二维激光雷达,本篇文章将介绍两种新的传感器,IMU以及轮速计.首先对这两种传感器进行简要介绍,之后对这两种传感器数据进行简单处理,最后实现 使用这两个传感器进行单线激光雷达的运动畸变校正 的功能.本文的代码的实现借鉴于LIO-SAM中的运动畸变校正部分.1 IMU与轮速计的简介1.1 IMU1.1.1 简介IMU全称Inertial Measurement Unit,惯性测量单元,主要用来检测和测量加速度与旋转运动的传感器。IMU一般包括3个功能,3轴加速度计:测量 x原创 2021-03-18 13:35:12 · 7567 阅读 · 22 评论 -
从零开始搭二维激光SLAM --- Hector论文公式推导与相关代码解析
2.7.1 getCompleteHessianDerivs()这个函数也位于 Creating-2D-laser-slam-from-scratch/lesson4/include/lesson4/hector_mapping/map/OccGridMapUtil.h 内. /** * 使用当前pose投影dataPoints到地图,计算出 H 矩阵 b列向量, 理论部分详见Hector论文: 《A Flexible and Scalable SLAM System with Full原创 2021-02-04 15:01:43 · 3163 阅读 · 6 评论 -
从零开始搭二维激光SLAM --- 简单重写 Hector SLAM
上篇文章讲解了如何在固定位置使用Hector构建单帧的栅格地图,以及知道了SLAM的本质就是将不同时刻的scan在正确的位置上写成栅格地图.本篇文章将对 Hector 进行简单的重写,使得其代码更简单,更清晰.这也是本系列教程第一次成功建出一张比较好的地图.先放图,虽然有些瑕疵,但是整体还是不错的.话不多说,先将代码做了那些改变,然后在着重讲解一下 Hector是如何用 高斯牛顿 就进行scan match的.1 代码实现1.1 获取代码代码已经提交在github上了,如果不知道github原创 2021-02-02 10:06:45 · 3584 阅读 · 0 评论 -
从零开始搭二维激光SLAM --- 基于Hector的栅格地图的构建
上篇文章讲解了如何使用GMapping的建图方式进行单帧的地图构建.这篇文章依然进行单帧的地图构建,只不过这篇文章将使用 Hector 这个算法的建图的部分.1 Hector简介Hector是2011年开源的二维激光SLAM的项目,非常创新地使用scan-to-map的匹配方式.首先其论文提出了如何对离散的栅格地图求导,然后说明了如何使用 高斯牛顿法 进行 scan-to-map 的计算.并且使用了多分辨率地图使计算结果更加准确.hector的wiki主页为 http://wiki.ros.org/原创 2021-01-22 16:03:30 · 4287 阅读 · 2 评论 -
从零开始搭二维激光SLAM --- 基于GMapping的栅格地图的构建
上篇文章讲解了如何在ROS中发布栅格地图,以及如何向栅格地图赋值.这篇文章来讲讲如何将激光雷达的数据构建成栅格地图.雷达的数据点所在位置表示为占用,从雷达开始到这点之间的区域表示为空闲.本篇文章的代码实现是参考于 csdn博主白茶-清欢 注释简化之后的GMapping.其地址为 csdn 白茶-清欢: https://blog.youkuaiyun.com/zhao_ke_xue/article/details/1107023221 GMapping简介2 代码2.1 获取代码代码已经提交在github上原创 2021-01-05 21:26:49 · 7931 阅读 · 6 评论 -
从零开始搭二维激光SLAM --- 栅格地图的构建
上周搬家, 导致这篇文章更新的慢了点.之前的文章我们都是通过scan-to-scan的方式进行位姿变换的计算. 接下来的文章将带领大家体验scan-to-map的计算位姿变换的方式.首先, 来简要介绍一下什么是map.1 地图与占用栅格地图1.1 人眼中的地图地图对于大部分人来说, 第一时间想到的应该是高德地图中的地图, 是一副平面的或者立体的, 能够标识出从一个地点到另一个地点的可通行路径.地图对于人来说其实提供了2个方面的功能, 第一个就是提供一个可通行路径, 还有一个其实是定位.当你下了原创 2021-01-03 16:38:25 · 7916 阅读 · 5 评论 -
从零开始搭二维激光SLAM --- 基于PL-ICP的激光雷达里程计
:err: : before trimming, only 0 correspondences.:err: icp: ICP failed for some reason. [ WARN] [1608712072.514938783, 1606455702.002871441]: not Converged:err: : before trimming, only 0 correspondences.:err: icp: ICP failed for some reason. [ WA...原创 2020-12-24 12:53:18 · 6167 阅读 · 50 评论 -
零基础如何入门激光SLAM
杂谈最近有几个人加我,都说是刚开始学激光slam,基本都是研一,情况也都差不多,有的是课题组里只有自己做slam,有的是完全没人带,自己也没有基础.仔细想一想,其实入门slam真是个不容易的事.首先,编程语言,大多数使用c++,少数用python,c++你得至少能写个小demo吧.知道了如何写c++,还要准备编译环境吧,由于编译以及依赖等问题,做slam基本都用linux,还得知道如何使用ubuntu的命令行,知道怎么编译代码.关于机器人相关的大部分代码都使用ros做接口,因为接口统一,使用方式统原创 2020-12-21 13:58:54 · 21060 阅读 · 31 评论 -
从零开始搭二维激光SLAM --- 基于PL-ICP的帧间匹配
上一篇文章将了如何使用PCL中的ICP算法进行相邻帧间的坐标变换,ICP的计算时间以及精度都不太好.这篇文章我使用一种ICP的改进算法PL-ICP算法来计算相邻帧间的坐标变换.1 PL-ICPPL-ICP(Point to Line ICP) 使用点到线距离最小的方式进行ICP的计算,收敛速度快很多,同时精度也更高一些.具体的pl-icp的介绍请看其论文,作者也开源了pl-icp的代码,作者将实现pl-icp的代码命名为csm( Canonical Scan Matcher).论文与代码的详情请看原创 2020-12-18 16:31:41 · 5387 阅读 · 50 评论 -
从零开始搭二维激光SLAM --- 基于ICP的帧间匹配
上一篇文章讲解了如何将激光雷达的sensor_msgs/LaserScan格式转换成pcl::PointCloud< pcl::PointXYZ>格式, 本篇文章将要讲解如何使用这个格式调用ICP算法进行相邻2帧雷达数据间坐标变换的计算.1 ICP算法迭代最近点(Iterative Closest Point, 下简称ICP)算法是一种点云匹配算法。其求解思路为:首先对于一幅点云中的每个点,在另一幅点云中计算匹配点(最近点)极小化匹配点间的匹配误差,计算位姿然后将计算的位姿作用于点原创 2020-12-11 13:56:08 · 5420 阅读 · 16 评论 -
从零开始搭二维激光SLAM --- 使用PCL进行雷达的消息类型转换
接下来的几篇文章,我将带大家使用PCL的ICP算法搭建出一个最简单的激光里程计.介绍如何在ROS中使用PCL.#ifndef LESSON2_SCAN_TO_POINTCLOUD2_CONVERTER_H#define LESSON2_SCAN_TO_POINTCLOUD2_CONVERTER_H// ros#include <ros/ros.h>#include <sensor_msgs/LaserScan.h>// pcl_ros#include <原创 2020-12-08 10:57:28 · 4541 阅读 · 18 评论 -
从零开始搭二维激光SLAM --- 使用单线雷达实现LIO-SAM中的特征点提取
我们这篇文章将对LIO-SAM中特征点提取的部分进行二维激光雷达下的实现.LIO-SAM的项目地址为: https://github.com/TixiaoShan/LIO-SAMLIO-SAM的特征点提取部分与LOAM基本相同,只不过在算曲率值时的具体计算方式稍有不同.1 特征点提取后的效果我们首先看一下激光原始数据的样子,如下图所示:接下来,再看一下经过我们进行特征点提取之后的数据点的样子,如下图所示:可以看到,经过特征点提取之后的数据点呈现出不太直观的样子,但是分布还是停均匀的.接下来原创 2020-12-03 10:20:37 · 7371 阅读 · 28 评论 -
从零开始搭二维激光SLAM --- 了解雷达数据
终于到了写代码的阶段了,哈哈。上一篇文章我们通过实验知道了雷达数据的各种性质,但是雷达数据在代码里是如何体现的呢?本篇文章将通过新建一个ros的包来学习一下如何遍历雷达数据,以及如何对雷达数据进行处理。首先说明一下我使用的代码环境:Ubuntu版本: 16.04.01ROS: kinetic 版本编程语言: C++IDE推荐: 目前我使用的是 VS code,其如何配置会在之后的文章中讲解1 ros中激光雷达数据的消息格式通过在终端中输入如下命令可以打印处ros中激光雷达数据的消息格式r原创 2020-11-28 15:51:31 · 6979 阅读 · 26 评论 -
从零开始搭二维激光SLAM --- 激光雷达数据效果对比
我们知道,不同品牌的激光雷达产生的数据是不一样的,那这些不同点是如何影响建图效果的呢?这篇文章就是来分析这个问题,将从不同光强下的点云效果,不同夹角下的点云效果,以及1 激光雷达的技术指标激光雷达拥有几个指标:数据的最大最小距离以及扫描的角度范围(视野范围)2个数据点间的角度(角度分辨率,点数)发出数据的频率发出数据的能量强度点的跳动成都(精度)等等1.1 视野范围激光雷达的视野范围决定了这款雷达的应用场景,墙距离20m的屋子里不能可能使用视野范围为4米的雷达,根本扫不到东西。1.原创 2020-11-25 20:55:13 · 6802 阅读 · 9 评论 -
从零开始搭二维激光SLAM --- 写作计划
本系列文章的目的是从零搭一套二维激光SLAM出来,并对其中的每个模块使用多种方法进行实现,以验证一些算法,以达到学以致用的目的。当然,肯定是借鉴已有的SLAM算法,完全自己搭的话水平还不够。考虑将 gmapping,hector,karto,cartographer,hdl,loam,lis-sam 这几个SLAM算法中的某个模块抠出来重新实现一下。目前打算按照如下模块进行文章及代码的编写:1 前端里程计部分对比不同品牌的雷达的建图效果,分析雷达数据对建图的影响从零搭一个scan-to-sca.原创 2020-11-24 23:17:49 · 2410 阅读 · 11 评论 -
从零开始搭二维激光SLAM --- 前言
我眼中的SLAM从最开始接触SLAM已经3年了,从二维激光SLAM到三维激光SLAM,再到视觉SLAM,都有一些接触,现将简单梳理一下SLAM的各个模块的功能以及实现方式,为本系列文章起到个总领作用。1 SLAM是什么SLAM(simultaneous localization and mapping)的中文翻译为 同步定位与地图构建。目的有2个,一个是进行定位,一个是进行周围环境的地图的构建,二者相互依赖,只有同时进行求解才能够解决这个问题。为什么一定要同时进行求解呢?人通过眼睛,通过手部等肢体原创 2020-11-23 16:46:07 · 3558 阅读 · 8 评论 -
从零开始搭二维激光SLAM --- 序章
从17年3月开始接触SLAM,到现在已经3年了。虽然时间很长,但并不是所有时间都在单纯的搞SLAM。17年3月,研二的时候选的课题题目,基于SLAM的室内移动机器人导航技术研究。之前并没有接触过SLAM,ROS等等。就连c++都是16年研一的时候学的(大一学过以后没再接触过)。之后开始学ROS,开始了解SLAM,还看了概率机器人这本书(当时基本没看懂)。到了17年7月,去了安徽芜湖的一家公司实习,因为课题是这家公司给的。到了之后第一次接触机器人,小强机器人,学操作机器人,搭自己电脑的环境等等,用了2个月原创 2020-11-20 11:05:58 · 4260 阅读 · 8 评论