機(jī)器人SLAM導(dǎo)航:核心技術(shù)與實(shí)戰(zhàn)
定 價:149 元
叢書名:機(jī)器人工程技術(shù)叢書
- 作者:張虎
- 出版時間:2021/12/1
- ISBN:9787111697428
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP242
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
全書分為4部分。第1部分對基礎(chǔ)知識展開講解,包括Linux基礎(chǔ)和ROS入門。第2部分主要關(guān)注一個實(shí)際的機(jī)器人中的硬件和核心傳感器模塊的構(gòu)造,重點(diǎn)講解機(jī)器人上的傳感器、差分底盤、樹莓派主板開發(fā)方面的知識。第3部分是SLAM地圖構(gòu)建的核心算法,SLAM中的數(shù)學(xué)基礎(chǔ)、基于激光的SLAM系統(tǒng)、基于視覺的SLAM系統(tǒng)、混合SLAM系統(tǒng)、新型SLAM系統(tǒng)。第4部分是自主導(dǎo)航相關(guān)的核心技術(shù)與應(yīng)用,包括自主導(dǎo)航中的數(shù)學(xué)基礎(chǔ)、基于地圖的導(dǎo)航、基于環(huán)境探索建圖的導(dǎo)航、強(qiáng)化學(xué)習(xí)在機(jī)器人導(dǎo)航中的應(yīng)用。
通過閱讀本書,讀者不僅可以自己設(shè)計出一套SLAM導(dǎo)航機(jī)器人出來,還可以在軟硬件結(jié)合的環(huán)境中提高自己的C++/Python/Java方面的編程能力,同時還可以接觸到流行的SLAM算法的實(shí)際應(yīng)用。
互聯(lián)網(wǎng)和人工智能技術(shù)可以看成是對人類大腦的進(jìn)一步延展,而機(jī)器人技術(shù)則可以看成是對人類軀體的進(jìn)一步延展。如果人工智能技術(shù)僅僅停留在虛擬的網(wǎng)絡(luò)和數(shù)據(jù)之中,那么其挖掘并利用新知識的能力將很難擴(kuò)展開來?梢哉f,機(jī)器人是人工智能技術(shù)應(yīng)用能力的有效延展,而能自主移動的機(jī)器人更是極大地拓展了人工智能技術(shù)的應(yīng)用范圍。SLAM導(dǎo)航技術(shù)正是當(dāng)下實(shí)現(xiàn)機(jī)器人自主移動的熱門研究領(lǐng)域,也是本書內(nèi)容的核心所在。
為什么寫這本書
幫助機(jī)器人實(shí)現(xiàn)完全自主化的每一種底層技術(shù)無疑將成為“機(jī)器人時代”的基礎(chǔ)設(shè)施,其中的自主移動技術(shù)在當(dāng)下備受矚目,其實(shí)質(zhì)就是解決從地點(diǎn)A到地點(diǎn)B的問題。這個問題看似簡單,實(shí)則非常復(fù)雜。當(dāng)向機(jī)器人下達(dá)移動到地點(diǎn)B的命令后,機(jī)器人不免會問出三個頗具哲學(xué)性的問題,即“我在哪”“我將到何處去”和“我該如何去”。經(jīng)過近幾十年來的研究,業(yè)界形成了一套有效解決機(jī)器人自主移動的方案,即SLAM導(dǎo)航
方案。
目前以SLAM導(dǎo)航技術(shù)為支撐的自主移動應(yīng)用已經(jīng)十分廣泛,涵蓋航天、軍事、特種作業(yè)、工業(yè)生產(chǎn)、智慧交通、消費(fèi)娛樂等眾多領(lǐng)域。典型應(yīng)用包括火星探測車、軍事機(jī)器人、特種作業(yè)機(jī)器人、農(nóng)業(yè)領(lǐng)域機(jī)器人、自動駕駛汽車、終端物流配送機(jī)器人、機(jī)器人智慧養(yǎng)老、機(jī)器人餐廳、家庭服務(wù)機(jī)器人等。
雖然SLAM導(dǎo)航技術(shù)在許多方面取得了突破,但其仍處于發(fā)展階段且尚未真正落地。這就需要有更多的人參與到這個龐大且深奧的項(xiàng)目中來,以加快技術(shù)突破和產(chǎn)品落地的速度。而機(jī)器人是多專業(yè)知識交叉的學(xué)科,通常涉及傳感器、驅(qū)動程序、多機(jī)通信、機(jī)械結(jié)構(gòu)、算法等眾多領(lǐng)域。這就導(dǎo)致各個領(lǐng)域的研究、開發(fā)人員都在自己熟悉的領(lǐng)域內(nèi)“閉門造車”,缺乏領(lǐng)域之間的必要交流與實(shí)踐。軟件層面的開發(fā)者由于缺乏對機(jī)器人傳感器、機(jī)器人主機(jī)和機(jī)器人底盤的系統(tǒng)性認(rèn)識,因此往往會在涉及軟硬件深度優(yōu)化方面的問題時束手無策。而硬件層面的開發(fā)者由于缺乏軟件方面的基礎(chǔ),因此經(jīng)常會在理解軟件層需求時出現(xiàn)偏差。由于缺乏相關(guān)的數(shù)學(xué)理論體系,因此ROS及硬件相關(guān)領(lǐng)域的開發(fā)人員大多只能充當(dāng)“調(diào)參俠”,很難對SLAM導(dǎo)航方面的算法提出實(shí)質(zhì)性的改善建議。缺乏工程思維和實(shí)踐經(jīng)驗(yàn),SLAM算法或?qū)Ш剿惴ǚ矫娴难芯咳藛T則很難將研究成果真正落地。
可以說,機(jī)器人SLAM導(dǎo)航是一個軟硬件相結(jié)合、理論加實(shí)戰(zhàn)的浩大工程性問題。而目前各領(lǐng)域之間還存在很大的交流屏障,這無疑成了機(jī)器人SLAM導(dǎo)航技術(shù)突破與落地的突出痛點(diǎn)。我由此萌生了寫一本兼具理論性和實(shí)踐性的系統(tǒng)化圖書的想法,希望通過這樣一本書將機(jī)器人SLAM導(dǎo)航中的軟件技術(shù)、硬件技術(shù)、數(shù)學(xué)理論、工程落地等一系列問題打通。
歷經(jīng)兩年多的艱苦創(chuàng)作,這本書終于要完稿了。開始寫這本書的時候,想法其實(shí)比較簡單。當(dāng)時自以為對機(jī)器人SLAM導(dǎo)航技術(shù)很了解,因而有著強(qiáng)烈的欲望想將自己所理解的知識和經(jīng)驗(yàn)分享給更多有需要的人,為機(jī)器人SLAM導(dǎo)航技術(shù)的普及與產(chǎn)品落地貢獻(xiàn)一份力量。但隨著寫作的逐步深入,我發(fā)現(xiàn)以前的很多理解存在不少偏差和局限,所以這倒逼著自己不斷去學(xué)習(xí)更深層的知識,不斷進(jìn)行自我認(rèn)知革新。直到寫完后一章回頭望時,我發(fā)現(xiàn)自己已經(jīng)超越從前的自己很多很多了。希望大家也能以這樣的心態(tài)去學(xué)習(xí)本書,不斷進(jìn)行自我革新,等你學(xué)完整本書再回首時一定能發(fā)現(xiàn)一個全新的自己。
本書特色
本書的大亮點(diǎn)是對SLAM理論體系做了深入淺出的分析。本書先對SLAM理論做了總結(jié)性討論,這作為SLAM討論的開篇章節(jié)有利于讀者快速理清學(xué)習(xí)思路;而更深層的SLAM理論知識則放在后續(xù)具體SLAM系統(tǒng)中詳細(xì)展開討論,結(jié)合實(shí)例進(jìn)行講解,這樣的好處是能大大降低深奧理論知識的理解難度。
本書的第二大亮點(diǎn)是將SLAM與導(dǎo)航兩大研究領(lǐng)域有機(jī)地串接起來。目前很多資料只側(cè)重于討論SLAM問題,而很少談及導(dǎo)航問題。其實(shí)對自主移動機(jī)器人來說,SLAM技術(shù)只相當(dāng)于給機(jī)器人提供了一條腿,而另一條腿則是導(dǎo)航技術(shù)。由于本書前幾章對機(jī)器人硬件、系統(tǒng)、SLAM理論及具體算法實(shí)現(xiàn)做了大量鋪墊,這就為SLAM與導(dǎo)航相結(jié)合內(nèi)容的討論提供了土壤。
本書的第三大亮點(diǎn)是對機(jī)器學(xué)習(xí)所涉及的理論基礎(chǔ)進(jìn)行了全面介紹,特別是對與SLAM前沿方向密切相關(guān)的深度學(xué)習(xí)及與自主導(dǎo)航前沿方向密切相關(guān)的強(qiáng)化學(xué)習(xí)進(jìn)行了深入對比分析。深度學(xué)習(xí)和強(qiáng)化學(xué)習(xí)理論知識的講解為本書學(xué)習(xí)者后續(xù)的持續(xù)研究提供了廣闊的想象空間,為機(jī)器人實(shí)現(xiàn)強(qiáng)人工智能提供了技術(shù)路線的參考。
讀者對象
本書適合的讀者范圍極為廣泛,主要包括:
從事自主移動機(jī)器人或者無人駕駛方面工作的開發(fā)人員;
智能機(jī)器人方面的市場調(diào)研人員、產(chǎn)品經(jīng)理等;
想要轉(zhuǎn)型到機(jī)器人算法崗位的開發(fā)者;
SLAM導(dǎo)航領(lǐng)域的本科生或研究生;
從事機(jī)械設(shè)計、機(jī)器人底盤研發(fā)、AGV算法升級等方面工作的開發(fā)人員;
對SLAM導(dǎo)航感興趣的愛好者。
如何閱讀本書
本書分為四篇,共13章。
編程基礎(chǔ)篇(第1~3章)。本篇帶領(lǐng)大家了解ROS的核心概念、大型C++工程的代碼組織方式以及圖像處理方面的基礎(chǔ)知識,為后續(xù)學(xué)習(xí)打好必要的編程基礎(chǔ)。
硬件基礎(chǔ)篇(第4~6章)。本篇通過對機(jī)器人傳感器、機(jī)器人主機(jī)和機(jī)器人底盤的討論,讓缺少硬件基礎(chǔ)的開發(fā)者對機(jī)器人的硬件有一個系統(tǒng)的認(rèn)識并更好地理解軟件與硬件之間的協(xié)同關(guān)系。機(jī)器人傳感器相當(dāng)于機(jī)器人的眼耳口鼻,機(jī)器人主機(jī)相當(dāng)于機(jī)器人的大腦,而機(jī)器人底盤則相當(dāng)于集成傳感器和主機(jī)的軀干。
SLAM篇(第7~10章)。本篇首先總結(jié)式地介紹整個SLAM的理論知識體系,接著以各個具體的SLAM系統(tǒng)實(shí)現(xiàn)為例進(jìn)一步介紹SLAM算法的代碼框架及核心算法的實(shí)現(xiàn)細(xì)節(jié)。
自主導(dǎo)航篇(第11~13章)。本篇首先給出整個自主導(dǎo)航的理論體系知識的總結(jié),接著以各個具體的自主導(dǎo)航系統(tǒng)實(shí)現(xiàn)為例進(jìn)一步介紹自主導(dǎo)航算法的代碼框架以及核心算法的細(xì)節(jié)實(shí)現(xiàn),后以一個真實(shí)機(jī)器人為例介紹應(yīng)用SLAM導(dǎo)航技術(shù)進(jìn)行開發(fā)的完整流程。學(xué)完本書的全部內(nèi)容后,相信大家能夠繼續(xù)進(jìn)行SLAM導(dǎo)航技術(shù)的獨(dú)立研究和開發(fā)。
勘誤與支持
由于本人水平有限,因此書中難免會出現(xiàn)一些錯誤或者表述不嚴(yán)謹(jǐn)?shù)牡胤,懇請讀者朋友批評指正,你可以發(fā)郵件到我的郵箱(robot4xiihoo@163.com)或者添加我的個人微信號(xiaohugege277)來與我聯(lián)系。另外,我還為本書制作了配套的課件文檔和教學(xué)視頻,大家可以關(guān)注我的知乎賬號(@小虎哥哥愛學(xué)習(xí))獲取課件文檔,或者關(guān)注我的bilibili賬號(@小虎哥哥愛學(xué)習(xí))獲取教學(xué)視頻。大家還可以前往GitHub倉庫(https://github.com/xiihoo/Books_Robot_SLAM_Navigation)下載本書相關(guān)實(shí)驗(yàn)代碼以及課后習(xí)題答案。同時大家也可以加入QQ技術(shù)交流群(728661815)參與本書的話題討論,或者前往網(wǎng)站(www.xiihoo.com)獲取機(jī)器人SLAM導(dǎo)航方面的更多相關(guān)資料。
致謝
感謝機(jī)械工業(yè)出版社華章公司的高婧雅編輯在寫作方面給予我的細(xì)心指導(dǎo);感謝清華大學(xué)的高翔博士為本書作序;感謝亮風(fēng)臺首席架構(gòu)師侯曉輝、海軍工程大學(xué)吳中紅老師、香港大學(xué)博士生王斯煜對本書進(jìn)行審閱并給予高度評價;感謝廣大網(wǎng)友在本書寫作過程中提供的眾多寶貴建議;感謝在本書寫作過程中給予我極大鼓勵與關(guān)懷的親朋好友。
后,希望這本書能陪伴大家走過一段難忘的學(xué)習(xí)之旅,并收獲一份珍貴的成長經(jīng)歷。星辰大海,如你所見,如你所愿。
序
前言
編程基礎(chǔ)篇
第1章 ROS入門知識 2
1.1 ROS簡介 2
1.1.1 ROS的性能特色 2
1.1.2 ROS的發(fā)行版本 3
1.1.3 ROS的學(xué)習(xí)方法 3
1.2 ROS開發(fā)環(huán)境的搭建 3
1.2.1 ROS的安裝 4
1.2.2 ROS文件的組織方式 4
1.2.3 ROS網(wǎng)絡(luò)通信配置 5
1.2.4 集成開發(fā)工具 5
1.3 ROS系統(tǒng)架構(gòu) 5
1.3.1 從計算圖視角理解ROS架構(gòu) 6
1.3.2 從文件系統(tǒng)視角理解ROS架構(gòu) 7
1.3.3 從開源社區(qū)視角理解ROS架構(gòu) 8
1.4 ROS調(diào)試工具 8
1.4.1 命令行工具 9
1.4.2 可視化工具 9
1.5 ROS節(jié)點(diǎn)通信 10
1.5.1 話題通信方式 12
1.5.2 服務(wù)通信方式 15
1.5.3 動作通信方式 19
1.6 ROS的其他重要概念 25
1.7 ROS 2.0展望 28
1.8 本章小結(jié) 28
第2章 C++編程范式 29
2.1 C++工程的組織結(jié)構(gòu) 29
2.1.1 C++工程的一般組織結(jié)構(gòu) 29
2.1.2 C++工程在機(jī)器人中的組織結(jié)構(gòu) 29
2.2 C++代碼的編譯方法 30
2.2.1 使用g++編譯代碼 31
2.2.2 使用make編譯代碼 32
2.2.3 使用CMake編譯代碼 32
2.3 C++編程風(fēng)格指南 33
2.4 本章小結(jié) 34
第3章 OpenCV圖像處理 35
3.1 認(rèn)識圖像數(shù)據(jù) 35
3.1.1 獲取圖像數(shù)據(jù) 35
3.1.2 訪問圖像數(shù)據(jù) 36
3.2 圖像濾波 37
3.2.1 線性濾波 37
3.2.2 非線性濾波 38
3.2.3 形態(tài)學(xué)濾波 39
3.3 圖像變換 40
3.3.1 射影變換 40
3.3.2 霍夫變換 42
3.3.3 邊緣檢測 42
3.3.4 直方圖均衡 43
3.4 圖像特征點(diǎn)提取 44
3.4.1 SIFT特征點(diǎn) 44
3.4.2 SURF特征點(diǎn) 50
3.4.3 ORB特征點(diǎn) 52
3.5 本章小結(jié) 54
硬件基礎(chǔ)篇
第4章 機(jī)器人傳感器 56
4.1 慣性測量單元 56
4.1.1 工作原理 56
4.1.2 原始數(shù)據(jù)采集 60
4.1.3 參數(shù)標(biāo)定 65
4.1.4 數(shù)據(jù)濾波 73
4.1.5 姿態(tài)融合 75
4.2 激光雷達(dá) 91
4.2.1 工作原理 92
4.2.2 性能參數(shù) 94
4.2.3 數(shù)據(jù)處理 96
4.3 相機(jī) 100
4.3.1 單目相機(jī) 101
4.3.2 雙目相機(jī) 107
4.3.3 RGB-D相機(jī) 109
4.4 帶編碼器的減速電機(jī) 111
4.4.1 電機(jī) 111
4.4.2 電機(jī)驅(qū)動電路 112
4.4.3 電機(jī)控制主板 113
4.4.4 輪式里程計 117
4.5 本章小結(jié) 118
第5章 機(jī)器人主機(jī) 119
5.1 X86與ARM主機(jī)對比 119
5.2 ARM主機(jī)樹莓派3B+ 120
5.2.1 安裝Ubuntu MATE 18.04 120
5.2.2 安裝ROS melodic 122
5.2.3 裝機(jī)軟件與系統(tǒng)設(shè)置 122
5.3 ARM主機(jī)RK3399 127
5.4 ARM主機(jī)Jetson-tx2 128
5.5 分布式架構(gòu)主機(jī) 129
5.5.1 ROS網(wǎng)絡(luò)通信 130
5.5.2 機(jī)器人程序的遠(yuǎn)程開發(fā) 130
5.6 本章小結(jié) 131
第6章 機(jī)器人底盤 132
6.1 底盤運(yùn)動學(xué)模型 132
6.1.1 兩輪差速模型 132
6.1.2 四輪差速模型 136
6.1.3 阿克曼模型 140
6.1.4 全向模型 144
6.1.5 其他模型 148
6.2 底盤性能指標(biāo) 148
6.2.1 載重能力 148
6.2.2 動力性能 148
6.2.3 控制精度 150
6.2.4 里程計精度 150
6.3 典型機(jī)器人底盤搭建 151
6.3.1 底盤運(yùn)動學(xué)模型選擇 152
6.3.2 傳感器選擇 152
6.3.3 主機(jī)選擇 153
6.4 本章小結(jié) 155
SLAM篇
第7章 SLAM中的數(shù)學(xué)基礎(chǔ) 158
7.1 SLAM發(fā)展簡史 158
7.1.1 數(shù)據(jù)關(guān)聯(lián)、收斂和一致性 160
7.1.2 SLAM的基本理論 161
7.2 SLAM中的概率理論 163
7.2.1 狀態(tài)估計問題 164
7.2.2 概率運(yùn)動模型 166
7.2.3 概率觀測模型 171
7.2.4 概率圖模型 173
7.3 估計理論 182
7.3.1 估計量的性質(zhì) 182
7.3.2 估計量的構(gòu)建 183
7.3.3 各估計量對比 190
7.4 基于貝葉斯網(wǎng)絡(luò)的狀態(tài)估計 193
7.4.1 貝葉斯估計 194
7.4.2 參數(shù)化實(shí)現(xiàn) 196
7.4.3 非參數(shù)化實(shí)現(xiàn) 202
7.5 基于因子圖的狀態(tài)估計 206
7.5.1 非線性小二乘估計 206
7.5.2 直接求解方法 206
7.5.3 優(yōu)化方法 208
7.5.4 各優(yōu)化方法對比 218
7.5.5 常用優(yōu)化工具 219
7.6 典型SLAM算法 221
7.7 本章小結(jié) 221
第8章 激光SLAM系統(tǒng) 223
8.1 Gmapping算法 223
8.1.1 原理分析 223
8.1.2 源碼解讀 228
8.1.3 安裝與運(yùn)行 233
8.2 Cartographer算法 240
8.2.1 原理分析 240
8.2.2 源碼解讀 247
8.2.3 安裝與運(yùn)行 258
8.3 LOAM算法 266
8.3.1 原理分析 266
8.3.2 源碼解讀 267
8.3.3 安裝與運(yùn)行 270
8.4 本章小結(jié) 270
第9章 視覺SLAM系統(tǒng) 272
9.1 ORB-SLAM2算法 274
9.1.1 原理分析 274
9.1.2 源碼解讀 310
9.1.3 安裝與運(yùn)行 319
9.1.4 拓展 327
9.2 LSD-SLAM算法 329
9.2.1 原理分析 329
9.2.2 源碼解讀 334
9.2.3 安裝與運(yùn)行 337
9.3 SVO算法 338
9.3.1 原理分析 338
9.3.2 源碼解讀 341
9.4 本章小結(jié) 341
第10章 其他SLAM系統(tǒng) 344
10.1 RTABMAP算法 344
10.1.1 原理分析 344
10.1.2 源碼解讀 351
10.1.3 安裝與運(yùn)行 357
10.2 VINS算法 362
10.2.1 原理分析 364
10.2.2 源碼解讀 373
10.2.3 安裝與運(yùn)行 376
10.3 機(jī)器學(xué)習(xí)與SLAM 379
10.3.1 機(jī)器學(xué)習(xí) 379
10.3.2 CNN-SLAM算法 411
10.3.3 DeepVO算法 413
10.4 本章小結(jié) 414
自主導(dǎo)航篇
第11章 自主導(dǎo)航中的數(shù)學(xué)基礎(chǔ) 418
11.1 自主導(dǎo)航 418
11.2 環(huán)境感知 420
11.2.1 實(shí)時定位 420
11.2.2 環(huán)境建模 421
11.2.3 語義理解 422
11.3 路徑規(guī)劃 422
11.3.1 常見的路徑規(guī)劃算法 423
11.3.2 帶約束的路徑規(guī)劃算法 430
11.3.3 覆蓋的路徑規(guī)劃算法 434
11.4 運(yùn)動控制 435
11.4.1 基于PID的運(yùn)動控制 437
11.4.2 基于MPC的運(yùn)動控制 438
11.4.3 基于強(qiáng)化學(xué)習(xí)的運(yùn)動控制 441
11.5 強(qiáng)化學(xué)習(xí)與自主導(dǎo)航 442
11.5.1 強(qiáng)化學(xué)習(xí) 443
11.5.2 基于強(qiáng)化學(xué)習(xí)的自主導(dǎo)航 465
11.6 本章小結(jié) 467
第12章 典型自主導(dǎo)航系統(tǒng) 470
12.1 ros-navigation導(dǎo)航系統(tǒng) 470
12.1.1 原理分析 470
12.1.2 源碼解讀 475
12.1.3 安裝與運(yùn)行 479
12.1.4 路徑規(guī)劃改進(jìn) 492
12.1.5 環(huán)境探索 496
12.2 riskrrt導(dǎo)航系統(tǒng) 498
12.3 autoware導(dǎo)航系統(tǒng) 499
12.4 導(dǎo)航系統(tǒng)面臨的一些挑戰(zhàn) 500
12.5 本章小結(jié) 500
第13章 機(jī)器人SLAM導(dǎo)航綜合實(shí)戰(zhàn) 502
13.1 運(yùn)行機(jī)器人上的傳感器 502
13.1.1 運(yùn)行底盤的ROS驅(qū)動 503
13.1.2 運(yùn)行激光雷達(dá)的ROS驅(qū)動 503
13.1.3 運(yùn)行IMU的ROS驅(qū)動 504
13.1.4 運(yùn)行相機(jī)的ROS驅(qū)動 504
13.1.5 運(yùn)行底盤的urdf模型 505
13.1.6 傳感器一鍵啟動 506
13.2 運(yùn)行SLAM建圖功能 506
13.2.1 運(yùn)行激光SLAM建圖功能 507
13.2.2 運(yùn)行視覺SLAM建圖功能 508
13.2.3 運(yùn)行激光與視覺聯(lián)合建圖功能 508
13.3 運(yùn)行自主導(dǎo)航 509
13.4 基于自主導(dǎo)航的應(yīng)用 510
13.5 本章小結(jié) 511
附錄A Linux與SLAM性能優(yōu)化的探討 512
附錄B 習(xí)題 523