本書在介紹ROS總體框架和理論要點的基礎上,講解ROS的通信機制、常用組件和進階功能;同時以實踐為主,講解機器視覺、機器聽覺、SLAM與導航、機械臂控制、機器學習等多種ROS應用的主要原理和實現(xiàn)方法;并分析基于ROS的機器人系統(tǒng)設計方法和典型實例;后論述ROS2的框架特點和使用方法,剖析ROS的發(fā)展方向。
Preface 前 言
2011年年底,筆者第一次接觸ROS。當時實驗室的一個師兄在學術會議上聽說了ROS并意識到它的前景廣闊,考慮到筆者當時的研究方向,于是建議筆者進行研究。那時國內(nèi)外ROS的學習環(huán)境比較艱苦,幾乎只有Wiki的基礎教程(也沒有現(xiàn)在這么完善)。所以一開始,筆者的內(nèi)心是拒絕的,但還是硬著頭皮開始鉆研。雖然從拒絕到接受、從未知到熟悉,筆者經(jīng)歷了前所未有的磨難,但同時也收獲了前所未有的喜悅。
在這個過程中,筆者也常常思考:ROS前景無限,但是國內(nèi)還鮮有人知,即使有人知道,也會被困難嚇倒。既然筆者經(jīng)歷過,何不總結(jié)一下,讓其他人少走彎路。于是,筆者整理了自己學習過程中的一些資料和心得,在CSDN上以博客的形式發(fā)表,最終形成《ROS探索總結(jié)》系列博文,再后來轉(zhuǎn)移到個人網(wǎng)站——古月居,至今仍保持更新。
2017年11月,ROS十周歲了!在走過的第一個十年里,ROS從蹣跚學步的孩童成長為機器人領域的巨人,再華麗蛻變出ROS 2。如今,大多數(shù)知名機器人平臺和機器人公司都支持ROS,越來越多的機器人開發(fā)者也選擇ROS作為開發(fā)框架。ROS已經(jīng)逐漸成為機器人領域的事實標準,并將逐步從研發(fā)走向市場,助力機器人與人工智能的快速發(fā)展。
ROS的重要精神是分享,這也是開源軟件的精神,所以才能看到如此活躍的ROS社區(qū)和眾多軟件功能包的源碼,并且可以在此基礎上快速完成二次開發(fā)。為了促進ROS在國內(nèi)的發(fā)展,現(xiàn)在已經(jīng)有很多人及組織在積極推廣ROS,比如ROS星火計劃、ROS暑期學校,以及網(wǎng)上各種各樣的技術分享等,相信未來這個隊伍會更加龐大。
本書以《ROS探索總結(jié)》系列博文為基礎,重新整理了ROS相關基礎要點,讓讀者能夠迅速熟悉ROS的整體框架和設計原理;在此基礎上,本書以實踐為重心,講解大量機器視覺、機器語音、機械臂控制、SLAM和導航、機器學習等多方面ROS應用的實現(xiàn)原理和方法,并且翻譯了眾多ROS中的圖表、內(nèi)容,幫助讀者在實現(xiàn)ROS基礎功能的同時深入理解基于ROS的機器人開發(fā),將書中的內(nèi)容用于實踐。
本書共有14章,可以分為五個部分。
第一部分是ROS基礎(第1~4章),幫助了解ROS框架,并且熟悉ROS中的關鍵概念以及實現(xiàn)方法。這部分的內(nèi)容適合初學者,也適合作為有一定經(jīng)驗或者資深開發(fā)者的參考手冊。
第二部分介紹如何搭建真實或仿真的機器人平臺(第5~6章),幫助了解機器人系統(tǒng)的概念和組成,學習如何使用ROS實現(xiàn)機器人仿真,為后續(xù)的機器人實踐做好準備。這部分的內(nèi)容適合希望自己動手設計、開發(fā)一個完整機器人平臺的讀者。
第三部分介紹ROS中常用功能包的使用方法(第7~10章),涉及機器視覺、機器語音、機械臂控制、SLAM和導航等多個機器人研究領域。這部分的內(nèi)容適合學習ROS基礎后希望實踐的開發(fā)者,以及從事相關領域的機器人開發(fā)者。
第四部分是ROS的進階內(nèi)容(第11~13章),介紹了ROS的進階功能、ROS與機器學習的結(jié)合、搭載ROS的機器人平臺。這部分的內(nèi)容適合已經(jīng)對ROS基礎和應用有一定了解的讀者。
第五部分介紹了新一代ROS——ROS 2(第14章),涉及ROS 2的架構、原理和使用方法。這部分的內(nèi)容適合對ROS有一定了解,希望了解ROS 2、想要跟上ROS進化步伐的開發(fā)者。
因此,本書不僅適合希望了解、學習、應用ROS的機器人初學者,也適合有一定經(jīng)驗的機器人開發(fā)人員,同時也可以作為資深機器人開發(fā)者的參考手冊。
書中的部分源代碼來自社區(qū)中的ROS功能包,但是筆者在學習過程中對這些代碼進行了大量修改,并且為大部分源代碼加入了中文注釋,以方便國內(nèi)ROS初學者理解。這些代碼涉及的編程語言不局限于C++或Python中的某一種,編程語言應該服務于具體場景,所以建議讀者對這兩種語言都有所了解,在不同的應用中發(fā)揮每種語言的優(yōu)勢。關于是否需要一款實物機器人作為學習平臺,本書并沒有特別要求,書中絕大部分功能和源碼都可以在單獨的計算機或仿真平臺中運行,同時也會介紹實物機器人平臺的搭建方法并且在實物機器人上完成相應的功能。所以只需要擁有一臺運行Ubuntu系統(tǒng)的計算機,具備Linux工具的基本知識,了解C++和Python的編程方法,即可使用本書。
此外,本書創(chuàng)作過程中參考了眾多已經(jīng)出版的ROS原著、譯著,筆者也將這些內(nèi)容作為參考資料列出,并向這些著作的作者和譯者致敬,希望讀者在學習ROS的過程中,可以從這些著作中獲取更多知識:
《Mastering ROS for Robotics Programming》,Lentin Joseph《ROS By Example》(Volume 1/Volume 2),Patrick Goebel《Programming Robots with ROS:A Practical Introduction to the Robot Operating System》, Morgan Quigley, Brian Gerkey & William D. Smart《Learning ROS for Robotics Programming》,Aaron Martinez,Enrique Fernández《A Gentle Introduction to ROS》,Jason M. O’Kane《ROS Robotics Projects》,Lentin Joseph《Effective Robotics Programming with ROS》,Anil Mahtani,Luis Sanchez在ROS探索實踐與本書的創(chuàng)作過程中,離不開眾多“貴人”的幫助。
推薦序一
推薦序二
推薦序三
前言
第1章 初識ROS 1
1.1 ROS是什么 1
1.1.1 ROS的起源 1
1.1.2 ROS的設計目標 2
1.1.3 ROS的特點 3
1.2 如何安裝ROS 4
1.2.1 操作系統(tǒng)與ROS版本的選擇 4
1.2.2 配置系統(tǒng)軟件源 6
1.2.3 添加ROS軟件源 6
1.2.4 添加密鑰 7
1.2.5 安裝ROS 7
1.2.6 初始化rosdep 8
1.2.7 設置環(huán)境變量 8
1.2.8 完成安裝 9
1.3 本書源碼下載 9
1.4 本章小結(jié) 10
第2章 ROS架構 11
2.1 ROS架構設計 11
2.2 計算圖 12
2.2.1 節(jié)點 12
2.2.2 消息 13
2.2.3 話題 13
2.2.4 服務 13
2.2.5 節(jié)點管理器 14
2.3 文件系統(tǒng) 14
2.3.1 功能包 14
2.3.2 元功能包 16
2.4 開源社區(qū) 17
2.5 ROS的通信機制 17
2.5.1 話題通信機制 18
2.5.2 服務通信機制 19
2.5.3 參數(shù)管理機制 20
2.6 話題與服務的區(qū)別 20
2.7 本章小結(jié) 21
第3章 ROS基礎 22
3.1 第一個ROS例程——小烏龜仿真 23
3.1.1 turtlesim功能包 23
3.1.2 控制烏龜運動 24
3.2 創(chuàng)建工作空間和功能包 25
3.2.1 什么是工作空間 25
3.2.2 創(chuàng)建工作空間 26
3.2.3 創(chuàng)建功能包 27
3.3 工作空間的覆蓋 28
3.3.1 ROS中工作空間的覆蓋 28
3.3.2 工作空間覆蓋示例 28
3.4 搭建Eclipse開發(fā)環(huán)境 30
3.4.1 安裝Eclipse 30
3.4.2 創(chuàng)建Eclipse工程文件 30
3.4.3 將工程導入Eclipse 31
3.4.4 設置頭文件路徑 31
3.4.5 運行/調(diào)試程序 32
3.5 RoboWare簡介 35
3.5.1 RoboWare的特點 35
3.5.2 RoboWare的安裝與使用 36
3.6 話題中的Publisher與Subscriber 37
3.6.1 烏龜例程中的Publisher與Subscriber 37
3.6.2 如何創(chuàng)建Publisher 37
3.6.3 如何創(chuàng)建Subscriber 40
3.6.4 編譯功能包 41
3.6.5 運行Publisher與Subscriber 42
3.6.6 自定義話題消息 44
3.7 服務中的Server和Client 46
3.7.1 烏龜例程中的服務 46
3.7.2 如何自定義服務數(shù)據(jù) 47
3.7.3 如何創(chuàng)建Server 48
3.7.4 如何創(chuàng)建Client 49
3.7.5 編譯功能包 51
3.7.6 運行Server和Client 51
3.8 ROS中的命名空間 52
3.8.1 有效的命名 52
3.8.2 命名解析 53
3.8.3 命名重映射 54
3.9 分布式多機通信 54
3.9.1 設置IP地址 55
3.9.2 設置ROS_MASTER_URI 56
3.9.3 多機通信測試 56
3.10 本章小結(jié) 57
第4章 ROS中的常用組件 58
4.1 launch啟動文件 58
4.1.1 基本元素 58
4.1.2 參數(shù)設置 60
4.1.3 重映射機制 61
4.1.4 嵌套復用 61
4.2 TF坐標變換 62
4.2.1 TF功能包 62
4.2.2 TF工具 63
4.2.3 烏龜例程中的TF 65
4.2.4 創(chuàng)建TF廣播器 67
4.2.5 創(chuàng)建TF監(jiān)聽器 68
4.2.6 實現(xiàn)烏龜跟隨運動 70
4.3 Qt工具箱 70
4.3.1 日志輸出工具(rqt_console) 71
4.3.2 計算圖可視化工具(rqt_graph) 71
4.3.3 數(shù)據(jù)繪圖工具(rqt_plot) 72
4.3.4 參數(shù)動態(tài)配置工具(rqt_reconfigure) 73
4.4 rviz三維可視化平臺 73
4.4.1 安裝并運行rviz 74
4.4.2 數(shù)據(jù)可視化 75
4.4.3 插件擴展機制 76
4.5 Gazebo仿真環(huán)境 78
4.5.1 Gazebo的特點 78
4.5.2 安裝并運行Gazebo 78
4.5.3 構建仿真環(huán)境 81
4.6 rosbag數(shù)據(jù)記錄與回放 82
4.6.1 記錄數(shù)據(jù) 82
4.6.2 回放數(shù)據(jù) 83
4.7 本章小結(jié) 84
第5章 機器人平臺搭建 85
5.1 機器人的定義 85
5.2 機器人的組成 86
5.2.1 執(zhí)行機構 87
5.2.2 驅(qū)動系統(tǒng) 87
5.2.3 傳感系統(tǒng) 87
5.2.4 控制系統(tǒng) 87
5.3 機器人系統(tǒng)搭建 88
5.3.1 MRobot 88
5.3.2 執(zhí)行機構的實現(xiàn) 88
5.3.3 驅(qū)動系統(tǒng)的實現(xiàn) 89
5.3.4 內(nèi)部傳感系統(tǒng)的實現(xiàn) 90
5.4 基于Raspberry Pi的控制系統(tǒng)實現(xiàn) 90
5.4.1 硬件平臺Raspberry Pi 91
5.4.2 安裝Ubuntu 16.04 91
5.4.3 安裝ROS 93
5.4.4 控制系統(tǒng)與MRobot通信 94
5.4.5 PC端控制MRobot 97
5.5 為機器人裝配攝像頭 99
5.5.1 usb_cam功能包 99
5.5.2 PC端驅(qū)動攝像頭 100
5.5.3 Raspberry Pi驅(qū)動攝像頭 102
5.6 為機器人裝配Kinect 104
5.6.1 freenect_camera功能包 104
5.6.2 PC端驅(qū)動Kinect 106
5.6.3 Raspberry Pi驅(qū)動Kinect 109
5.6.4 Kinect電源改造 109
5.7 為機器人裝配激光雷達 110
5.7.1 rplidar功能包 110
5.7.2 PC端驅(qū)動rplidar 111
5.7.3 Raspberry Pi驅(qū)動rplidar 113
5.8 本章小結(jié) 113
第6章 機器人建模與仿真 114
6.1 統(tǒng)一機器人描述格式——URDF 114
6.1.1 標簽 114
6.1.2 標簽 115
6.1.3 標簽 116
6.1.4 標簽 116
6.2 創(chuàng)建機器人URDF模型 116
6.2.1 創(chuàng)建機器人描述功能包 116
6.2.2 創(chuàng)建URDF模型 117
6.2.3 URDF模型解析 120
6.2.4 在rviz中顯示模型 122
6.3 改進URDF模型 124
6.3.1 添加物理和碰撞屬性 124
6.3.2 使用xacro優(yōu)化URDF 125
6.3.