天天看點

從零開始搭二維雷射SLAM --- 零基礎如何入門雷射SLAM

從零開始搭二維雷射SLAM --- 零基礎如何入門雷射SLAM

最近有幾個人加我,都說是剛開始學雷射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的實作.

總結

這一路走下來真是不容易啊,涉及到了很多元的知識,也需要花挺長的時間來探索,來入門.如果沒人帶路的話可能要花更久的時間來找到正确的路,希望上邊的步驟可以幫到你們.

繼續閱讀