機器人學(xué)Robotics學(xué)習(xí)資料 | 我的SLAM入門路線分享
1、前言
可能因為進入了新學(xué)期,本人遇到了幾次身邊小學(xué)弟和網(wǎng)友的提問:機器人學(xué)和SLAM該怎么入門好?由于回答了幾次問題,就借著這個機會把問題的回答整理歸納下。這篇分享僅是根據(jù)本人入門Robitics和SLAM的親身經(jīng)歷,基于一步一個腳印摸索而來的路線來盡可能避免小伙伴們走我的彎路,文章內(nèi)容的廣度和深度應(yīng)該是不如網(wǎng)上其他大佬們整理出來的綜述,但貴在真實可靠,希望對求學(xué)的伙伴們有些幫助,文章內(nèi)容若有不當(dāng)之處希望讀者朋友們勘誤。
本人當(dāng)初的情況:本科專業(yè)是機械設(shè)計制造及其自動化,語言僅僅是C語言基礎(chǔ)入門,工具軟件也就用Matlab做了3次機械相關(guān)的大作業(yè)、電機的簡單PID控制和畢設(shè)時的實驗數(shù)據(jù)輸出處理。讀研時專業(yè)才轉(zhuǎn)到了機器人學(xué),開始了較為系統(tǒng)地學(xué)習(xí)相關(guān)知識,而本科時常用的軟件如Solidwork、AutoCAD和Inventor、Ansys這些讀研后就再也沒用過了。
前置學(xué)習(xí)條件:高等數(shù)學(xué)、線性代數(shù)、概率論、C/C++基礎(chǔ)、外加一個英語四級?針對有時間可以系統(tǒng)性學(xué)習(xí)的相關(guān)理論的同學(xué)可以從第二部分開始閱讀,針對時間不太夠的朋友,可以以文章第三部分的內(nèi)容為主。
來源:微信公眾號「3D視覺工坊」??
2、機器人學(xué)Robotics學(xué)習(xí)分類
回到正題,機器人學(xué)相關(guān)學(xué)習(xí)本人認為可以分成兩個大部分:理論知識和語言能力。
語言能力單指C++,并不是說Python語言學(xué)了沒有用,只是機器人學(xué)學(xué)術(shù)界和工業(yè)上的應(yīng)用主要還是以C++為主。針對Robotics機器人學(xué)的理論知識,從場景類型的應(yīng)用分類就有工業(yè)機械臂,移動機器人,無人機,手持式設(shè)備和無人船,從知識內(nèi)容分類有運動控制:Kinematics運動學(xué),Dynamics動力學(xué),非線性系統(tǒng)控制理論;路徑規(guī)劃:Global Planning和Local Planning;定位建圖:貝葉斯網(wǎng)絡(luò)及原理,基于濾波的方法,基于優(yōu)化的方法,各類點云配準(zhǔn)算法,地圖構(gòu)建算法,etc;還有感知的各個算法,決策的框架等。但綜合考慮所涉及的知識點無非就是李群李代數(shù)、狀態(tài)估計、濾波算法和非線性優(yōu)化理論、控制理論和一些具體算法。
2.1、理論知識:李群李代數(shù)和狀態(tài)估計
Robotics和SLAM中的狀態(tài)估計是貫穿始終的,而狀態(tài)估計的學(xué)習(xí)又肯定離不開高等數(shù)學(xué)、線性代數(shù)、概率論和李群李代數(shù),其中李群李代數(shù)應(yīng)該是絕大多數(shù)初學(xué)者遇到的第一個難題,對李群李代數(shù)的理論知識理解很難深刻,公式的理解和推導(dǎo)過程又是乏味的。此處學(xué)習(xí)的重點本人認為是在于可以根據(jù)實際的應(yīng)用場景來感受李群李代數(shù)在具體問題中的應(yīng)用,故而推薦以下關(guān)鍵的學(xué)習(xí)資料:
·Joan Sola的《A micro Lie theory for state estimate on robotics》,論文內(nèi)容十分精煉,這是為機器人學(xué)狀態(tài)估計量身定做的一篇“Math Preliminaries”,必看,首推,并建議邊讀邊推導(dǎo)和做筆記,真正做到理解其中的大部分內(nèi)容;
·Timothy D. Barfoot的《State Estimation for Robotics》,書中第二部分:Three-Dimensional Machinery詳細講解了3D位姿變換并引入李群的概念以用作分析3D位姿變換。我個人感覺內(nèi)容比《概率機器人Probabilistic Robotics》一書更適合入門,因為它不僅有引入概率的狀態(tài)估計基礎(chǔ),而且不像《概率機器人》注重2D平面的應(yīng)用,而是直接從3D的狀態(tài)和位姿變換入手,本書最后還有一個完整的章節(jié)結(jié)合前兩章的理論內(nèi)容來分析實際應(yīng)用的問題,內(nèi)容不晦澀,很生動。
·Richard M. Murray、Zexiang Li的《A Mathematical Introduction to Robotic Manipulation》,這本書可以說是想從事工業(yè)機器人、機械臂相關(guān)領(lǐng)域的關(guān)鍵教材了,內(nèi)容中是詳細地包括基礎(chǔ)理論,剛體運動變換理論、機械臂正逆運動學(xué)、動力學(xué)、機械臂運動規(guī)劃和控制。雖然沒有針對移動機器人相關(guān)的應(yīng)用講解,但是在3D位姿變換和李群李代數(shù)的運用上是相通的。
·中文教材,首推高翔博士的《視覺十四講》,本人雖然沒有完整地品讀過《十四講》的全部內(nèi)容,但是學(xué)習(xí)中是參考了其中g(shù)2o和ceres的教程與代碼示例,在我入門ceres時的幫助是很大的。
2.2、理論知識:非線性優(yōu)化問題算法與濾波算法
·K. Madsen, H.B. Nielsen, O. Tingleff的《METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS》,個人認為這篇著作對于非線性優(yōu)化問題的幫助好比與上文中提到的《A micro Lie theory for state estimate on robotics》對狀態(tài)估計問題的幫助,必看,首推,還是建議邊讀邊推導(dǎo)和做筆記。
·Timothy D. Barfoot的《State Estimation for Robotics》,書中第一部分:Estimation Machinery介紹了貝葉斯理論和解釋了狀態(tài)量變量的不確定性,然后詳細講解了基礎(chǔ)的KF與EKF,雖然介紹的基礎(chǔ)濾波算法,但有詳細地數(shù)學(xué)推導(dǎo)和證明,推薦跟著書中內(nèi)容一起推算理解。
·Joan Sola的另一篇《Quaternion kinematics for the error-state Kalman Filter》,ESKF可以說是學(xué)習(xí)LIO 、VIO的必看論文,甚至后期算得上是“工具書”了。
2.3、理論知識:非線性優(yōu)化與控制理論
這部分的內(nèi)容是針對移動機器熱或無人機的運動控制了,還有一小部分的軌跡規(guī)劃內(nèi)容。本人也僅僅是學(xué)習(xí)了三門相關(guān)的課程,課程中老師推薦的教輔資料就整理在這小節(jié)中了。
·H.K.Khalil的《Nonlinear-Systems》,這本教材是詳細講解了非線性系統(tǒng)中系統(tǒng)定義、穩(wěn)定性分析和控制問題的相關(guān)解法,本人當(dāng)時學(xué)習(xí)非線性系統(tǒng)控制時就是靠老師講解和這本書入門的。
·Donald E. Kirk的《Optimal Control Theory: An Introduction》這本書老師在講解時是引用了書中對系統(tǒng)的描述,對優(yōu)化問題處理效果的分析,Dynamic Programming動態(tài)規(guī)劃和最優(yōu)控制法則,和書中第五節(jié)the variational approach to optimal control problem“最優(yōu)控制問題的變分方法”的內(nèi)容
·A E. Bryson.的《Applied Optimal Control: Optimization, Estimation, and Control》,這本書好像是美國高校里“動態(tài)系統(tǒng)控制和分析”的常見教材,除了介紹基礎(chǔ)的優(yōu)化問題定義和優(yōu)化問題解法,書中注重針對各種場景條件下的動態(tài)優(yōu)化問題解法的工程應(yīng)用,當(dāng)時學(xué)這門課時可沒少被課程中的各種lab作業(yè)折磨。
(跑一下火車:想當(dāng)初做優(yōu)化控制問題相關(guān)的應(yīng)用時,最頭疼的就是評估系統(tǒng)的優(yōu)化條件,推導(dǎo)系統(tǒng)的優(yōu)化方程及最后系統(tǒng)+控制結(jié)果的穩(wěn)定性,回想當(dāng)初雖然痛苦,但對個人成長的幫助還是挺大的。)
2.4、理論知識:運動規(guī)劃
·Howie Choset,Kevin M. Lynch,etc的《Principles of Robot Motion Theory, Algorithms, and Implementations》,這本算得上是學(xué)習(xí)機器人運動規(guī)劃入門最好的教材之一了,涵蓋了經(jīng)典的運動、路徑規(guī)劃算法,同時還有針對各種場景的應(yīng)用示例,很友好的著作,書中甚至還有一些簡單位姿估計和優(yōu)化控制的介紹。
·Steven M. LaValle的《PLANNING ALGORITHMS》,書中介紹了路徑規(guī)劃和運動規(guī)劃中常見的算法,從離散的基于圖的搜索(Graph Search Algorithms):D算法、A*算法,到Geometric Representations幾何表示和The Configuration Space配置空間的定義,再到基于采用的搜索(Sampling Based Planning)和組合運動規(guī)劃:Probablistic Road Map,RRT(RRT*),Cell Decomposition,Potential Field Method和Visibility Graph等。
2.5、語言能力
雖然我不是科班出身的,但還是想推薦一下幾本C++相關(guān)的資料,供大家學(xué)習(xí)參考。下面分享的書籍都是我完整研讀過,并其中幾本是反復(fù)閱讀的,個人認為不僅是可以作為學(xué)習(xí)入門,還可以用作工具書使用。
·《Effective C++:改善程序設(shè)計的55個具體做法》
·《深入應(yīng)用C++11:代碼優(yōu)化與工程級應(yīng)用》
·《Effective STL》·《數(shù)據(jù)結(jié)構(gòu)與算法之美》
3、機器人學(xué)工程能力提升相關(guān)
3.1、ROS系統(tǒng)
機器人學(xué)的工程能力和應(yīng)用能力,除了需要C++的語言能力外,就是需要熟悉ROS環(huán)境和系統(tǒng)了。本人的ROS學(xué)習(xí)入門只使用了一本教材那就是大名鼎鼎的《ROS Robot Programming:From the basic concept to practical programming and robot application》和其配套的ROS wiki網(wǎng)站,當(dāng)時學(xué)習(xí)起來都是不分晝夜地實現(xiàn)書中一個一個的教程示例,Linux系統(tǒng)和ROS系統(tǒng)及環(huán)境經(jīng)歷崩潰和重裝不知道多少次,是真實地在痛苦中快速成長。
·ROS wiki:http://wiki.ros.org/cn
·ROS Moveit:https://docs.ros.org/en/kinetic/api/moveit_tutorials/html/index.html
·魚香ROS,一鍵ROS安裝、環(huán)境配置,重裝系統(tǒng)神器,不允許大家不知道:http://www.fishros.com/#/fish_home
3.2、SLAM工程能力提升方法論
本小節(jié)以SLAM工程能力的提升出發(fā),因為本人畢業(yè)后的工作內(nèi)容是多傳感器融合和建圖定位,機器人的控制和運動規(guī)劃就沒再深耕了。
根據(jù)上文中每個分類里的模塊,根據(jù)實際的需求和應(yīng)用情況還需熟悉各類經(jīng)典的處理策略和邏輯方法論。再者,拋開上層的各類算法和應(yīng)用,若是想更進一步除了需要對模塊內(nèi)的知識有深入的研究和理解,最好還需清楚各類傳感器的原理和特性以便于進行問題的建模和解算設(shè)計,若是滿足于調(diào)調(diào)參,跑跑demo和簡單應(yīng)用應(yīng)用,恐怕人就死在Robotics這片汪洋里了。
具體的提升其實還是依賴在相關(guān)模塊的深耕,所以說本人認為至少得深入研究和熟悉2個及以上的經(jīng)典SLAM工程,如果沒有時間參照第二部分中的學(xué)習(xí)路線來系統(tǒng)學(xué)習(xí)相關(guān)的理論知識的話,也可以直接從工程代碼開始,本人覺得至少得做到以下幾點:
1)清楚其中每一個模塊、每一個函數(shù)、每一行代碼的設(shè)計目的和實現(xiàn)細節(jié),這個是必須要做到的;
2)相關(guān)的SLAM工程中必然有配套的論文,對照著論文中的理論部分和代碼中的實現(xiàn)部分,可以加強對兩個方面的理解和能力的提升,同時在論文中若有不理解的公式推導(dǎo),則可以專項地查詢相關(guān)的理論依據(jù),實時補充不足;
3)另外還有一個就是,需要在深入研讀代碼后,比對一下代碼中有但是相對應(yīng)論文中沒有說明部分,這塊內(nèi)容就是一些作者自己的工程經(jīng)驗和一些小技巧的體現(xiàn)了,都是可以學(xué)習(xí)的地方。最后就整理一下經(jīng)典的SLAM算法系統(tǒng),供大家學(xué)習(xí)參考:
2D LiDAR SLAM: Cartographer;github鏈接:https://github.com/cartographer-project/cartographer;相關(guān)論文:《Real-Time Loop Closure in 2D LIDAR SLAM》,《Real-Time Correlative Scan Matching》,《Efficient Sparse Pose Adjustment for 2D Mapping》。
Carto是一個非常非常好的基于圖優(yōu)化的SLAM系統(tǒng),非常完整。系統(tǒng)模塊中包含相對魯棒的前端,基于submap和node約束獨立的pose graph后端及各類評測工具。模塊化、系統(tǒng)化、工程化程度很高, 封裝很完善。但是若覺得cartographer的代碼量實在太大,短期想簡單了解下的話,可以選擇平替的SLAM系統(tǒng)Karto。
·3D LiDAR SLAM: LOAM\Lego-LOAM\LIO-SAM;github鏈接:https://github.com/cuitaixiang/LOAM_NOTED;https://github.com/wykxwyc/LeGO-LOAM_NOTED/tree/master/src;https://github.com/TixiaoShan/LIO-SAM;相關(guān)論文:《LOAM: Lidar Odometry and Mapping in Real-time.》,《LeGO-LOAM: Lightweight and Groundoptimized Lidar Odometry and Mapping on Variable Terrain》,《LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping》。3D激光SLAM的系統(tǒng),其實也是可以看看cartograppher,但更好的選擇應(yīng)該還得是LOAM系列相關(guān)的SLAM系統(tǒng)。
·Visual SLAM:可能有些人會推薦ORB-SLAM系列,但我這邊首推VINS系列中的VINS-Fusion。Github鏈接:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion;相關(guān)論文:《A General Optimization-based Framework for Global Pose Estimation with Multiple Sensors》,《VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator》,《VINS on Wheels》,《On-Manifold Preintegration for Real-Time Visual-Inertial Odometry》,《Online Temporal Calibration for Monocular Visual-Inertial Systems》。
其實上述的經(jīng)典SLAM系統(tǒng),只要花時間和精力,理解通透一個系統(tǒng)后,其他SLAM系統(tǒng)的上手也就快了,畢竟背后的理論知識都是一樣的,一通百通。最后附上一篇SLAM技術(shù)的綜述文章,詳見鏈接:https://zhuanlan.zhihu.com/p/501102444。
4、SLAM領(lǐng)域研究方向討論
可詳見文章:https://zhuanlan.zhihu.com/p/539375248
5、小結(jié)
最后,希望讀者朋友們能從本文中獲取有價值的內(nèi)容,望與各位技術(shù)同僚共勉,一同在SLAM技術(shù)道路上高歌猛進,完成我們未竟的事業(yè)。
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
3D視覺工坊精品課程官網(wǎng):3dcver.com
1.面向自動駕駛領(lǐng)域的3D點云目標(biāo)檢測全棧學(xué)習(xí)路線!(單模態(tài)+多模態(tài)/數(shù)據(jù)+代碼)
2.徹底搞透視覺三維重建:原理剖析、代碼講解、及優(yōu)化改進
3.國內(nèi)首個面向工業(yè)級實戰(zhàn)的點云處理課程
4.激光-視覺-IMU-GPS融合SLAM算法梳理和代碼講解
5.徹底搞懂視覺-慣性SLAM:基于VINS-Fusion正式開課啦
6.徹底搞懂基于LOAM框架的3D激光SLAM: 源碼剖析到算法優(yōu)化
7.徹底剖析室內(nèi)、室外激光SLAM關(guān)鍵算法原理、代碼和實戰(zhàn)(cartographer+LOAM +LIO-SAM)
8.從零搭建一套結(jié)構(gòu)光3D重建系統(tǒng)[理論+源碼+實踐]
9.單目深度估計方法:算法梳理與代碼實現(xiàn)
10.自動駕駛中的深度學(xué)習(xí)模型部署實戰(zhàn)
11.相機模型與標(biāo)定(單目+雙目+魚眼)
12.重磅!四旋翼飛行器:算法與實戰(zhàn)
13.ROS2從入門到精通:理論與實戰(zhàn)
14.國內(nèi)首個3D缺陷檢測教程:理論、源碼與實戰(zhàn)
15.基于Open3D的點云處理入門與實戰(zhàn)教程
16.透徹理解視覺ORB-SLAM3:理論基礎(chǔ)+代碼解析+算法改進
17.不斷更新中......
重磅!粉絲學(xué)習(xí)交流群已成立
交流群主要有3D視覺、CV&深度學(xué)習(xí)、SLAM、三維重建、點云后處理、自動駕駛、多傳感器融合、CV入門、三維測量、VR/AR、3D人臉識別、醫(yī)療影像、缺陷檢測、行人重識別、目標(biāo)跟蹤、視覺產(chǎn)品落地、視覺競賽、車牌識別、硬件選型、ORB-SLAM系列源碼交流、深度估計、TOF、求職交流等方向。
添加小助理微信(dddvisiona),一定要備注:研究方向+學(xué)校/公司+昵稱,例如:”3D視覺 + 上海交大 + 靜靜“。請按照格式備注,可快速通過且邀請進群。? ? ? ? ? ? ?