本書是針對ROS(機器人操作系統(tǒng))初學(xué)者的入門教程,內(nèi)容聚焦于ROS的使用和開發(fā)。以Ubuntu操作系統(tǒng)安裝和使用為起點,依次介紹了ROS安裝、實體/仿真機器人搭建、機器視覺、SLAM建圖、導(dǎo)航、多機器人系統(tǒng)等知識,*終引導(dǎo)讀者獨立完成機器人應(yīng)用開發(fā)的任務(wù)。本書中的實驗環(huán)境和代碼基于ROS的Noetic版本。
本書為讀者提供了全部案例源代碼和學(xué)習(xí)資料,讀者可以直接掃描二維碼下載。
本書適合ROS用戶及其編程開發(fā)人員使用,也可以作為高等學(xué);蚺嘤(xùn)學(xué)校相關(guān)專業(yè)的參考教材。
實操性高,以案例形式深入淺出地介紹了ROS開發(fā)相關(guān)知識和具體流程。
配套資源豐富,提供了全部案例源代碼和學(xué)習(xí)資料,讀者可以直接掃描二維碼下載。
隨著科技的發(fā)展,機器人已經(jīng)從科幻小說走進了人們的日常生活中,如房間里用來清潔地板的掃地機器人,餐廳中穿梭往來送餐的服務(wù)機器人,商場中引導(dǎo)顧客的引導(dǎo)機器人,園區(qū)中配送快遞的無人快遞配送車,道路上的自動駕駛汽車等。伴隨而來的是行業(yè)對于機器人相關(guān)技術(shù)人才的需求愈加旺盛。而面對著功能各異、形態(tài)千差萬別的機器人,它們之間有著什么差異?有著什么共性?應(yīng)該從哪里開始了解它們?怎樣才能掌握機器人開發(fā)相關(guān)的技術(shù)?
機器人操作系統(tǒng)(Robot Operating System,ROS)就是一個很好的入手方向,ROS是一套應(yīng)用于機器人開發(fā)的軟件框架,開始應(yīng)用于科學(xué)研究領(lǐng)域,由于其強大的功能、開源的特性和良好的社區(qū)環(huán)境,逐漸被越來越多的商業(yè)公司應(yīng)用到產(chǎn)品開發(fā)中。ROS經(jīng)過了多年的發(fā)展,已經(jīng)成為機器人行業(yè)的事實標準。
提到ROS的學(xué)習(xí),人們常聽到的一個說法是學(xué)習(xí)曲線很陡峭,這是指ROS在入門學(xué)習(xí)階段比較艱難。而結(jié)合相關(guān)的學(xué)習(xí)經(jīng)驗和眾多學(xué)生的反饋,可以發(fā)現(xiàn)導(dǎo)致 ROS 學(xué)習(xí)入門難的幾個原因如下:
1)ROS目前主流使用的操作系統(tǒng)平臺為Linux操作系統(tǒng)的發(fā)行版,例如 Ubuntu,而多數(shù)非計算機專業(yè)的學(xué)生在此前并沒有了解過Linux操作系統(tǒng),加上Linux中的主要操作都是通過終端命令行輸入指令完成的,和日常廣泛使用的Windows操作系統(tǒng)依賴圖形化界面的操作方式有很大的區(qū)別,這就導(dǎo)致了很多用戶沒法熟練地使用,而Linux操作系統(tǒng)是ROS運行的基礎(chǔ)環(huán)境,不能熟練使用必然會給ROS的學(xué)習(xí)帶來很大的阻礙。
2)對于ROS中常用的工具掌握不熟練,甚至不知道有這些工具的存在,正所謂工欲善其事必先利其器,而利其器的前提則是知有器,ROS 為開發(fā)者提供了很多用于調(diào)試和診斷問題的工具,每種工具有各自擅長分析和解決的問題,不會靈活地使用各類工具來輔助機器人的開發(fā)和調(diào)試,必然會極大地影響開發(fā)和學(xué)習(xí)的效率。
3)目前很多 ROS 相關(guān)的教程是基于仿真軟件或者一款特定的機器人硬件而展開的,對于仿真軟件中的機器人與實體機器人之間的區(qū)別和聯(lián)系,以及怎樣去移植和適配,并沒有做出很好的闡述,這就使用戶在學(xué)習(xí)完成后想要搭建自己的機器人平臺或者將教程中的軟件移植到其他機器人平臺上時存在一定的難度。
第四,現(xiàn)在已經(jīng)有很多個人或組織開源了自己所開發(fā)的ROS功能包軟件并配套了詳細的使用教程,初學(xué)者可以根據(jù)文檔或視頻教程去運行這些軟件實現(xiàn)相應(yīng)的功能,或者基于開源的軟件做一些修改來快速實現(xiàn)自己的功能,但是當初學(xué)者想要實現(xiàn)一些新的功能,并且沒有現(xiàn)成的開源軟件可以參考時就會無從下手。究其原因是對 ROS 的編程思想缺乏了解,開源的軟件通常只是給出了一套實現(xiàn)功能的代碼和使用教程,但是對于功能實現(xiàn)的分析過程和思路卻鮮有提及,即告訴了怎么做但沒有告訴為什么這樣做。
針對以上幾個問題,本書在內(nèi)容選取和結(jié)構(gòu)編排上做了一些針對性的設(shè)計。
第 1 章為學(xué)習(xí)ROS必備的Linux知識,介紹Linux操作系統(tǒng)的安裝、使用,為后面在Linux中使用ROS打下基礎(chǔ)。
第 2 章為認識ROS,介紹ROS的安裝,梳理ROS中眾多概念的聯(lián)系,通過官方提供的例程來熟悉各種工具的使用。
第 3 章為ROS編程基礎(chǔ),介紹ROS開發(fā)環(huán)境的搭建和編程的基本方式,鞏固第2章中的ROS概念和工具知識點。
第 4 章為ROS機器人平臺搭建,介紹ROS機器人的主要構(gòu)成部件和選型參考,以及組建一套可以用于開發(fā)學(xué)習(xí)的機器人。
第 5 章為機器人仿真環(huán)境搭建,介紹在機器人仿真軟件中搭建機器人仿真平臺以及與實體機器人和仿真環(huán)境中機器人的區(qū)別與聯(lián)系,為第6、7、8三個章節(jié)中的機器人例程運行做準備。
第 6 章為ROS中的OpenCV和機器視覺,介紹機器人中的機器視覺,機器視覺是目前機器人研究中一個重要的組成部分,本章介紹ROS和OpenCV結(jié)合方法以及經(jīng)典的機器視覺實驗。
第 7 章為激光雷達SLAM建圖和自主導(dǎo)航,介紹機器人使用激光雷達完成SLAM構(gòu)建地圖和在地圖中導(dǎo)航的實驗。
第8章為ROS多機器人系統(tǒng),介紹該系統(tǒng)的搭建和控制。
第 9 章為自己編寫程序控制機器人,結(jié)合實例分析ROS機器人應(yīng)用開發(fā)的思路,以及相關(guān)API接口的查找、使用方法,并編寫代碼來實現(xiàn)相應(yīng)功能。
由于作者水平有限,書中難免有疏漏之處,敬請讀者批評指正。
前言
二維碼清單
第1章 學(xué)習(xí)ROS必備的Linux知識1
1.1 Linux操作系統(tǒng)介紹1
1.1.1 Linux的誕生1
1.1.2 Linux、UNIX、系統(tǒng)、內(nèi)核和發(fā)行版2
1.2 Ubuntu環(huán)境搭建3
1.2.1 VMWare的安裝使用3
1.2.2 安裝Ubuntu系統(tǒng)5
1.3 Ubuntu桌面使用10
1.3.1 Ubuntu的桌面布局10
1.3.2 安裝VMware Tools工具11
1.4 shell和常用命令12
1.4.1 shell、終端和命令12
1.4.2 常用shell命令14
1.5 Ubuntu安裝和卸載軟件17
1.5.1 使用國內(nèi)軟件源提升下載速度17
1.5.2 通過apt管理軟件19
1.5.3 通過應(yīng)用商店安裝卸載軟件19
1.6 vim編輯器使用21
1.7 Linux文件系統(tǒng)22
1.7.1 Linux文件系統(tǒng)結(jié)構(gòu)22
1.7.2 目錄內(nèi)容存放規(guī)則24
1.8 root用戶和權(quán)限管理24
1.8.1 Linux中的權(quán)限概念25
1.8.2 文件/目錄權(quán)限查看和修改25
1.8.3 啟用root用戶26
1.9 嵌入式單板計算機和Linux27
第2章 認識ROS30
2.1 ROS是什么30
2.1.1 ROS從何而來30
2.1.2 為什么要使用ROS31
2.2 如何安裝ROS32
2.3 ROS通信結(jié)構(gòu)37
2.3.1 節(jié)點和主節(jié)點38
2.3.2 話題(Topic)39
2.3.3 服務(wù)(Service)40
2.3.4 動作(Action)41
2.3.5 參數(shù)服務(wù)器42
2.4 ROS常用shell命令43
2.5 ROS常用圖形工具50
2.5.1 rqt工具箱51
2.5.2 rviz52
2.6 ROS坐標系和tf變換53
2.6.1 ROS中的坐標定義53
2.6.2 ROS中的tf變換54
2.7 ROS工作空間56
2.7.1 ROS工作空間是什么57
2.7.2 創(chuàng)建并使用一個工作空間58
第3章 ROS編程基礎(chǔ)60
3.1 ROS開發(fā)環(huán)境搭建60
3.1.1 Ubuntu下安裝VSCode60
3.1.2 VSCode常用插件安裝61
3.2 新建一個ROS功能包62
3.3 編寫一對發(fā)布訂閱節(jié)點(C )64
3.3.1 編寫發(fā)布節(jié)點(C )64
3.3.2 編寫訂閱節(jié)點(C )66
3.4 編寫一對發(fā)布訂閱節(jié)點(Python)67
3.4.1 編寫發(fā)布節(jié)點(Python)67
3.4.2 編寫訂閱節(jié)點(Python)68
3.5 編寫launch文件用于啟動節(jié)點70
3.5.1 通過launch文件啟動C 編譯的節(jié)點70
3.5.2 通過launch文件啟動Python節(jié)點71
3.5.3 在launch文件中調(diào)用launch文件72
3.6 創(chuàng)建新消息類型并編寫節(jié)點發(fā)布消息73
3.6.1 編寫自定義消息74
3.6.2 驗證消息正常產(chǎn)生75
3.6.3 編寫節(jié)點發(fā)布自定義消息類型(C )76
3.6.4 編寫節(jié)點訂閱自定義消息類型(Python)76
3.7 創(chuàng)建一個服務(wù)類型并編寫服務(wù)端/客戶端節(jié)點77
3.7.1 定義并編寫一個自定義服務(wù)77
3.7.2 通過rossrv驗證服務(wù)產(chǎn)生78
3.7.3 編寫自定義服務(wù)的服務(wù)端(C )79
3.7.4 編寫自定義服務(wù)的服務(wù)端(Python)80
3.7.5 編寫自定義服務(wù)的客戶端(C )80
3.7.6 編寫自定義服務(wù)的客戶端(Python)81
3.8 tf變換編程入門82
3.8.1 通過static_transform_publisher發(fā)布靜態(tài)坐標變換82
3.8.2 編寫節(jié)點實現(xiàn)動態(tài)tf變換(Python)84
3.8.3 編寫節(jié)點實現(xiàn)動態(tài)tf變換(C )85
第4章 ROS機器人平臺搭建87
4.1 機器人系統(tǒng)的典型構(gòu)成87
4.2 幾種常見的機器人底盤運動學(xué)模型88
4.2.1 差速轉(zhuǎn)向結(jié)構(gòu)89
4.2.2 阿克曼轉(zhuǎn)向結(jié)構(gòu)90
4.2.3 全向運動結(jié)構(gòu)92
4.3 驅(qū)動和電池系統(tǒng)95
4.3.1 驅(qū)動系統(tǒng)電動機95
4.3.2 電池系統(tǒng)97
4.4 控制系統(tǒng)底盤控制器98
4.5 控制系統(tǒng)車載計算機100
4.5.1 車載計算機需要實現(xiàn)的功能100
4.5.2 車載計算機的選擇100
4.5.3 將車載計算機和底盤控制器連接起來102
4.6 機器人上常用的傳感器105
4.6.1 獲取機器人運動狀態(tài)編碼器和IMU105
4.6.2 讓機器人看見世界攝像頭107
4.6.3 讓機器人感知世界的深淺立體相機108
4.6.4 讓機器人具備全向感知能力激光雷達109
4.7 遠程連接車載計算機111
4.7.1 路由模式和WiFi模式111
4.7.2 SSH遠程登錄112
4.7.3 使用遠程桌面連接機器人113
4.8 底盤啟動和控制115
4.8.1 啟動底盤驅(qū)動節(jié)點115
4.8.2 控制機器人運動116
4.8.3 向launch文件中傳入變量118
4.9 機器人底盤ROS節(jié)點源碼解析119
4.9.1 base_control功能包文件結(jié)構(gòu)120
4.9.2 base_control.launch文件解讀120
4.9.3 base_control.py源碼解讀122
4.9.4 bash腳本與udev規(guī)則131
4.10 ROS分布式通信配置132
4.10.1 分布式通信配置條件檢查133
4.10.2 分布式通信配置和測試驗證135
第5章 機器人仿真環(huán)境搭建137
5.1 為什么要有機器人仿真環(huán)境137
5.1.1 機器人仿真主要解決的問題137
5.1.2 仿真環(huán)境中的機器人和真實機器人的聯(lián)系138
5.2 在Stage仿真器中創(chuàng)建機器人139
5.2.1 Stage仿真器簡介139
5.2.2 創(chuàng)建Stage仿真器地圖和機器人模型140
5.2.3 控制Stage仿真器中的機器人143
5.3 在Gazebo仿真器中創(chuàng)建機器人144
5.3.1 Gazebo仿真器簡介144
5.3.2 Gazebo仿真器中的環(huán)境模型147
5.4 機器人模型和URDF文件150
5.4.1 URDF文件150
5.4.2 xacro文件和Gazebo插件155
5.4.3 通過Solidworks 創(chuàng)建機器人模型157
第6章 ROS中的OpenCV和機器視覺159
6.1 攝像頭的驅(qū)動和圖像話題訂閱159
6.1.1 啟動攝像頭159
6.1.2 訂閱攝像頭圖像并顯示161
6.1.3 攝像