最近有几个人加我,都说是刚开始学激光slam,基本都是研一,也有一些大四的(大四的都开始学SLAM了!)。
情况也都差不多,有的是课题组里只有自己做slam,有的是完全没人带,有的是完全没基础,c++都没学过的那种。
这些小白都不知道怎么进行学习,问了我好多相同的问题,所以我就将我自己的思路整理了一下,也就是这篇文章的由来.
第一部分是我自己的SLAM接触史,第二部分是为硕士小白入门写的推荐学习路线,第三部分是为了SLAM爱好者入门写的推荐学习路线.
长文,无图,做好准备.以下内容仅为我自己的观点,有可能有错误及不足,望见谅.
1 我的SLAM接触史
1.1 c++
我也是研一的时候知道自己课题是SLAM相关的。
所以就在2016年10月份的时候开始看 c++ prime plus。之前我没接触过编程,就大一时候上过c语言的课,学完了也没记得什么,之后也没再碰过代码。
这时候还不知道咋编代码,咋运行程序,所以 c++ prime plus 就是光看,没去实际编代码。
1.2 ubuntu
到了2017年3月,课题正式确定,《基于SLAM的室内移动机器人导航技术研究》。
经过同学的帮助,帮我装了人生第一个双系统,ubuntu1404,开始正式接触linux系统。
1.3 ROS
之后边学ubuntu的命令行(简单教程),边去学ROS ,ROS的wiki地址为 wiki.ros.org。
ROS的wiki上的知识实在是太多了,有太多太多的网页跳转,导致我花了太多的时间用在逛wiki上,当时存了30多个书签等着我一个一个的去看。
其实只要学完 Beginner Level 的教程就可以了,这个之后详细说明。
1.4 ROS By Example 1
之后去看了这本书《ros by example 1》,这本书对我来说真的非常重要,让我跑通了第一个ros的demo,十分有成就感。
这本书有配套的代码,可以直接运行,照着书中的步骤一步一步运行即可。学了这么久,通过这本书里的例子,终于在rviz中看到了turtlebot,并让机器人成功的动起来了,真是非常有成就感的一件事。
1.4 概率机器人
忘记了看这本书的具体时间了,只记得实验室里有这本书,然后我实习的时候借去看了一遍。这本书真的是很厉害,里边有关于机器人定位与建图的所有概念和公式。
强烈建议入门的时候不要读这本书,不要读,不要读。
因为当时我看完了一遍,真是一点都没理解,也一点没记住。这本书就是现在的我来看,也有很多不理解,读不懂的地方,更别说刚入门的小白了。
1.5 小强机器人
之后,我去公司实习,实习的时候有个机器人可以让我玩,小强机器人。这是第一次弄机器人,也是第一次在机器人上操作ROS。
实践ROS与操作机器人大概花费了我至少2个月的时间。时间很长,因为可能突然出现有些问题导致你卡住,进行不下去了。
记得很清楚,在笔记本上rviz点击下发move_base的目标点,机器人始终不动,这个问题卡了我2周的时间。原因是没有在机器人里的/etc/hosts里添加笔记本的ip。。。
所以,如果你课题组里只有自己做SLAM或者机器人相关,一定要多加几个社群,qq群也好,微信群也好,一定不要自己一个人去研究.有很多小问题在别人那只是一句话就能解决的事,自己研究可能就要耽误2周甚至更长的时间。而且,现在做社群的有很多,搜索也很容易找到。
1.6 cartographer
再之后,17年12月份开始,到18年1月份,弄了将近1个月如何使用carographer。弄懂如何跑demo之后,又开始学如何修改launch文件,如何写urdf。
再之后,就是做导航相关的了。
回顾这一年的时间,由于没人带真是走了挺多弯路,学习也没有抓住重点。当然,学过的所有知识都不是无用的,只是没到需要用的时间而已。同时,由于之前基础打的牢,学的多,所以现在我对ROS相关的理解非常深刻,操作也很流畅。
接下来,我将我认为的入门需要学的最重要的东西以及流程写下来,希望可以帮助小白们知道如何学习SLAM,以及如何做SLAM相关的科研。
2 硕士小白做激光SLAM相关课题的学习路线
硕士同学如果课题是SLAM相关的,该如何尽快入门呢?课题组只有自己一个做SLAM的该怎么办呢?
不要慌。目前大部分做SLAM的几乎都是自学的,即使是课题组有其他做SLAM的也只能是让自学的速度更快一点而已,因为知识始终是要自己理解了之后才能成为自己的。多加几个社群多交流,也是一样的.
2.1 第一步:双系统
我认为的第一步就是先要装个双系统,windows+ubuntu ,不建议使用虚拟机,虚拟机本身会有很多问题,小白根本不知道出现的问题是虚拟机本身的问题还是环境没弄好导致的问题。相信每个做SLAM的都自己装过不下1遍的双系统。
因为ubuntu系统不是十分健壮,有时候装环境,装驱动尤其是显卡驱动,很可能就把系统弄坏了。有时候强制关机也会导致进不去系统。
由于每个人的电脑配置不一样,导致装双系统的时候会出现各种小问题,花时间都是可以解决的。
装双系统这一阶段大概花费 1天到2周 不等的时间。
2.2 第二步:ubuntu的基础指令
这一步很简单,只要稍微学习下ubuntu的最基础的指令就可以了,可以照着这个简单教程进行学习,也可以在b站中找视频进行学习。
一定要记住,刚开始只需要学习最基础的指令就够了,如 如何打开终端,如何复制移动文件,如何新建文件夹等等。
不要学的太多,像shell编程,脚本编写执行等等。很多知识是会在以后的使用中,边学边查就够了,不要第一时间全都去学,基础不够的情况学了再多也不一定能理解和记住。
这一阶段会花费 1天到1周 不等的时间。
2.3 第三步:学习ROS
2.3.1 为什么要学ROS
ROS最大的贡献就是为机器人相关的开发者,统一了接口与操作方式。让开发者可以聚焦于上层的算法设计,不用每个人都去重复的去做通讯,驱动等底层的搭建。同时,ros中也提供了能让各种传感器数据可视化的软件Rviz,以及查看各个节点的关系可视化图等特别好用的工具。
而且,目前的激光SLAM,不管是二维的还是三维的,几乎都是使用ROS的接口编写的,不会用ROS你就不会启动SLAM。所以,ROS是必须要学的。
2.3.2 安装ROS
安装ROS网上有太多的教程,这里就不再说明了,一般照着ROS wiki的 安装教程 一步一步安装都会成功的。
2.3.3 怎么学ROS
ROS的wiki网站(ros.wiki.org)里有几乎所有关于ROS的教程与信息,在学习ROS的时候,最好直接看wiki上的内容,不要去找一些其他网站翻译之后的内容,这里的英文很简单,一般都能直接看懂。
能找到的翻译过的文章大都只是简单的进行翻译与复制,不一定准确不说,往往都是只翻译一个章节或者一小部分,会让人学的不够全面与透彻。
2.3.3.1 ROS Tutorials Beginner Level
首先要照着ROS的官方教学内容进行学习,也就是 ROS Tutorials 的 Beginner Level 内容进行学习,一定要保证每个章节都弄懂,保证每个章节的内容都自己跟着实践过不止1次。只有自己实际操作之后,才能真正的理解,光看是看不会的!
这20个章节真的非常重要,有的时候我也会去再重温一下这20个章节的内容,这真的是使用ROS的最核心的内容,一定要好好学习,要真正的学会,理解。
这一阶段大概花费 2周到3周 的时间。
2.3.3.2 launch文件
学完了初级教程之后,先不要去学中级教程以及其他的教程,因为其他的教程是短时间内用不到的。ROS Tutorials中有2个常用的知识点没有说,一个是用于启动多个节点的roslaunch命令与launch文件,另一个是URDF模型。
launch文件的语法可以去wiki上学一下http://wiki.ros.org/roslaunch.
wiki上的内容很多,可以不用全部学,要学的只有2个,一个是如果使用roslaunch命令启动launch文件,命令的格式如下所示
roslaunch package_name file.launch
另一个是launch文件的XML语法 http://wiki.ros.org/roslaunch/XML。
launch文件的具体教学可以在百度里搜一搜,也可以在任意一个ros的包中查看launch文件的具体内容。
这一阶段最多花费 1天 的时间。
2.3.3.3 URDF
URDF是用来描述传感器坐标系与机器人坐标系间的物理关系的,也就是坐标变换。
wiki上有更详细的介绍:http://wiki.ros.org/urdf ,也有对应的教程 http://wiki.ros.org/urdf/Tutorials.
这个文件可能第一次看感觉很复杂,又是一种新的语言格式,但是其内容模式是固定的,只需要大段的复制,简单的更改其中的坐标系名字与对应的坐标变换的具体数值,即可完成自己机器人的URDF模型的搭建。
如果没看明白完全没有关系,因为大部分SLAM算法已经编写好了对应的URDF模型,你理解了URDF的概念也是完全可以的,以后再来弄清楚。
这其中可能涉及到一些TF的知识,可以暂时不用管他,只要知道这是ROS帮助我们管理传感器坐标系与机器人坐标系间坐标变换关系的即可。TF也是十分必要的,是之后的必学项
2.4 第四步:试着跑通现有的SLAM算法
如果一切顺利的话,学到这差不多花费一个月的时间,如果你学的快的甚至不需要一个月的时间。
下一阶段为尝试在ROS下跑通现有的SLAM算法。
如果你是做二维的激光SLAM,建议优先跑通 gmapping ,因为这个SLAM算法网上能找到的教程非常多。对应的数据bag文件(bag会在 ROSTutorials 中学到)可以在 http://download.ros.org/data/gmapping/ 中获取。
如果是做三维的激光SLAM,建议优先跑通LOAM,这个SLAM的数据包及如何运行的教程网上也是非常多。
在跑demo的过程中,你会体验到如何运行launch文件,如何在launch文件中修改订阅的话题的名称,以及如何播放bag文件。同时,也要体会激光雷达的数据是什么样的,构建出的二维地图或者三维地图是什么样的。
这一阶段大概花费 1周到3周 的时间。
2.5 第五步:理解SLAM各个模块的理论概念以及调研SLAM
经过上面的步骤,相信你大致知道SLAM是干什么的了,就是为了构建地图用的,这个地图可以保存下来,用于后续的定位及导航避障中。也有一些SLAM作为里程计在使用,始终提供估计的位姿.
现在,我们可以更深入的学习下SLAM的概念了。我是觉得,只有先实际跑了下SLAM,再去看理论,才能理解SLAM到底是要干什么.要不然直接学习SLAM的各个理论概念,可能等你学完了也没有理解,过一阵时间就忘了.
目前,主流SLAM的结构基本都差不过,分为前端里程计,后端优化,回环检测三个大模块.前端的目的是始终累加位姿,作为里程计使用;后端使用图的结构模型,优化整体位姿,减小前端里程计产生的累计误差;回环检测可以提供一个更强烈的图结构的约束,能够更好的减小累计误差.
这一阶段就是理解SLAM的概念,可以在网上搜下相关的文章,也可以去看下论文,如中文的博士论文,国外的论文;推荐优先看博士论文的综述章节,以及SLAM综述相关的文章,这可以让你很快的理解SLAM各个模块的概念.
调研主流SLAM算法
理解了SLAM概念的时候,相信综述里会列举很多SLAM算法,可以顺便调研下目前的主流SLAM算法方案有哪些,每个SLAM算法的框架是什么样的.
一些传统的SLAM算法如下所示.
二维激光SLAM:hector,gmapping,karto,cartographer等等.
三维激光SLAM:LOAM,Lego-LOAM,LIO-SAM,HDL graph SLAM,cartographer等等.
还有些语义的SLAM我不太懂这里就不说了.
这一阶段大概花费 1周到2周 的时间。
2.6 第六步:阅读文献找创新点
完成以上步骤大概已经过去至少2个月了,相信这时的你已经对SLAM有了一定的理解.接下来就是要为了做课题而改进SLAM.
既然是找创新点,首先就要了解最新SLAM论文的改进点,也就是要疯狂看论文了.我是觉得,只有先理解了SLAM各个模块的理论概念,再看论文才能真正理解论文说的是啥,才能理解论文的创新点在哪.
看论文是为了找创新点,同时也要选择一个现有的SLAM框架,因为从零搭一个SLAM算法是非常难的,所以只能在现有SLAM框架上做改进.
这一阶段可能花费 1个月到2个月 的时间。
2.7 第七步:跑通选定的SLAM框架
将选定的SLAM算法跑通.
如果没有硬件的同学可以直接下载网上的数据集,将数据集和选定的SLAM算法调通.
如果是有机器人以及激光雷达的同学这一步还要多花费一些时间将选定的SLAM算法与自己的硬件及机器人调通,做好心里准备,这一步可能会出现各种问题导致你卡住.
针对自己的硬件,首先要学会如何启动雷达,如何配置雷达;如果是要做移动机器人的,还要学习一下移动机器人如何操作,也就是如何用ROS操作机器人;再之后是如何将自己的硬件与SLAM算法调通,这步网上的教程很多,一定要注意下话题的名字对不对的上.
跑通选定的SLAM算法的意思是 将数据集或者实际的传感器接入到SLAM中,并启动成功,以及保存地图.之后,要再试着改一改这个SLAM的参数,看看不同的参数更改了会带来什么影响.
这一阶段可能花费 1周到2个月 的时间。
2.8 第八步:学习C++
如果你已经找到了想要做的创新点,接下来的步骤就是要将想法通过代码实现出来.
之前的步骤并没有涉及到编程语言,因为最开始真的是用不到自己编写代码.由于ROS社区的贡献,导致机器人开发人员的编写代码量骤降,能想到的功能基本开源社区里都有,只需要跑通调参就可以了.
现在要自己实现新功能,需要自己写代码,所以这一阶段才开始学习编程语言.
语言推荐C++,因为大部分SLAM是用c++编写的.优先推荐阅读 c++ prime plus ,也可以在网上找一些其他的教程.
不管通过什么方式学习 C++ ,一定多多进行编程练习,学习编程只通过看书是永远也学不会的,只有自己多编,多练,才能让自己熟练准确的编程.
这一阶段可能花费 1个月 的时间,也可以在之前的步骤当中抽空学一下。
2.9 第九步:阅读SLAM源码
学完了C++,并不意味着你能够编写SLAM以及自己的想法了.因为编写SLAM是一件挺工程,挺需要经验的事情.
这时的你,可能会陷入到想要实现某些功能,但是完全不知道该怎么写代码的阶段.
这时候就需要你去阅读想要改进的SLAM的代码了.看代码的目的是为了学习如何将实现自己想法实现,以及自己的功能添加到SLAM的哪里.可以只看自己想要改进模块的代码,也可以将整个SLAM的代码全看了,只要知道了自己的功能如何实现了就可以.
C++ 11
由于一般的SLAM的实现都用到了很多C++ 11的新特性,所以看代码的时候也可以简单学一学 C++ 11 相关的知识,以便更好的阅读代码.
参数
看代码的时候要将每个参数在哪里使用的,这个参数具体代表什么意思弄懂,这样可以让你更好更准确的调参.
同时,也要学习下SLAM的具体实现该怎么写代码,思考自己想要实现的功能该如何写代码,该添加到SLAM的哪部分代码中,要带着问题去读代码.
2.10 第十步:编写代码,验证想法
知道了代码怎么写,在SLAM的哪个部分添加,就可以上手写代码了.
新手写代码,调试代码,这一阶段的时间可能花费的要久一点.
写完了代码之后,就是要通过与之前的SLAM算法对比轨迹精度,地图精度等等.输出图片,表格,曲线,证明你的算法更加优秀.
再之后就是写论文,发论文,写硕士论文,毕业.
有些学校要求工作量,这一点一定提前考虑好.SLAM相关功能的改进,撑死了一个改进点一个大章节,编程是不算工作量的,能算在论文里的工作只有改进之后的对比图,对比曲线.
一篇硕士论文大概4-5个大章节,其他章节的内容怎么写,一定要提前考虑好.不要编程编了2年,最后写论文发现只能算1个大章节,那就尴尬了.
3 单纯的喜欢激光SLAM,非科研,零基础如何入门
对于想转行的同学,或者是单纯的喜欢激光SLAM同学,不需要写论文,该怎么入门呢?
基本上是一样的,只是第六步可以忽略,可以不用读论文.如果不需要改代码的话第十步也是可以忽略的.而第九步,阅读源码,这一部分可以进行扩展,多阅读几个SLAM算法的源码与实现,将有助于帮你更好的理解SLAM的实现.
总结
这一路走下来真是不容易啊,涉及到了很多元的知识,也需要花挺长的时间来探索,来入门.如果没人带路的话可能要花更久的时间来找到正确的路,希望上边的步骤可以帮到你们.