本書通過將ROS社區(qū)的寶貴開發(fā)經(jīng)驗(yàn)和現(xiàn)實(shí)案例相結(jié)合,為你在機(jī)器人開發(fā)過程中遇到的問題提供切實(shí)可行的指南。不論你是機(jī)器人俱樂部的學(xué)生,還是專業(yè)的機(jī)器人科學(xué)家和工程師,都可以在本書中找到你想要的內(nèi)容。書中的每部分都提供了使用ROS工具實(shí)現(xiàn)各類機(jī)器人系統(tǒng)的完整解決方案,不僅包括實(shí)現(xiàn)各種單一機(jī)器人任務(wù),也包括將不同模塊結(jié)合完成組合任務(wù)。在本書中,只要你熟悉Python,就可以開始動(dòng)手實(shí)踐。
前言ROS(Robot Operating System,機(jī)器人操作系統(tǒng)),是一個(gè)讓機(jī)器人能夠運(yùn)作起來的開源程序框架。ROS誕生的初衷是能夠?yàn)槟切┲谱骱褪褂脵C(jī)器人的人提供通用的軟件平臺。這個(gè)平臺能夠讓人們更加便捷地分享代碼與想法,這意味著你不再需要花費(fèi)經(jīng)年累月的時(shí)間去編寫軟件框架就能讓你的機(jī)器人動(dòng)起來!
ROS取得了巨大的成功。截止撰寫本書之時(shí),官方發(fā)行的ROS版本中有超過2000個(gè)軟件包,并被600多人編寫和維護(hù)。ROS支持大約80個(gè)市場上可以買到的機(jī)器人,我們還可以在至少1850篇學(xué)術(shù)文獻(xiàn)中找到ROS的蹤影。從此我們不再需要從零開始編寫所有程序,特別是當(dāng)要對眾多ROS所支持的機(jī)器人中的一個(gè)進(jìn)行開發(fā)時(shí),我們可以更加專注于機(jī)器人技術(shù)本身,而不是“位操作”或者設(shè)備驅(qū)動(dòng)。
ROS由許多部分所組成,包含如下這些:
1. 一系列可以讓你從傳感器讀取數(shù)據(jù)以及向電動(dòng)機(jī)等執(zhí)行機(jī)構(gòu)發(fā)送指令的驅(qū)動(dòng)程序,而且這些數(shù)據(jù)的格式都經(jīng)過良好的抽象與定義。ROS支持非常多的主流硬件,包括越來越多市場上可以買到的機(jī)器人系統(tǒng)。
2. 海量且日漸增多的基本機(jī)器人算法,讓你能夠輕松構(gòu)建世界地圖、在其中穿梭、表示并解析傳感器數(shù)據(jù)、規(guī)劃動(dòng)作、操縱物體,以及實(shí)現(xiàn)許多其他功能。ROS在機(jī)器人研究社區(qū)中飽受歡迎,因此許多最前沿的算法現(xiàn)在都可以在ROS中找到。
3. 充足的計(jì)算基礎(chǔ)設(shè)施,使數(shù)據(jù)能夠四處傳遞,讓眾多模塊可以連接成一個(gè)復(fù)雜的機(jī)器人系統(tǒng)并幫助你整合算法。ROS天生的分布式架構(gòu)讓你能夠輕松地將計(jì)算壓力無縫地分擔(dān)到多臺計(jì)算機(jī)上。
4. 一系列實(shí)用工具,使得對機(jī)器人及算法的可視化、錯(cuò)誤行為的調(diào)試以及傳感器數(shù)據(jù)的錄制都變得非常容易。對機(jī)器人程序的調(diào)試是極為困難的,因此也正是這一系列豐富的工具使得ROS如此強(qiáng)大。
5. 最后,ROS具有比其本身更為龐大的ROS生態(tài)系統(tǒng),它的擴(kuò)展資源眾多,包含了一個(gè)記錄整個(gè)框架方方面面的wiki文檔,一個(gè)專門用于提問與解答的網(wǎng)站,通過該網(wǎng)站你可以尋求幫助并分享自己的所學(xué),以及一個(gè)充滿使用者與開發(fā)者的欣欣向榮的社區(qū)。
那么,為什么你需要學(xué)習(xí)ROS呢?最簡單的答案就是,它將會為你節(jié)省時(shí)間。ROS包含了機(jī)器人軟件系統(tǒng)的所有部分,沒有它,你就只能自己一一編寫。ROS使你能夠更加專注于系統(tǒng)中你最關(guān)心的部分,而無須操心那些你不那么關(guān)注的部分。
為什么你需要讀這本書?ROS的wiki文檔中包含了大量內(nèi)容,涉及框架中許多方面的詳細(xì)教程。一個(gè)活躍的用戶社區(qū)(http://answers.ros.org)隨時(shí)準(zhǔn)備解答你的問題。為什么不直接通過這些資源學(xué)習(xí)ROS? 在本書中我們所做的就是以一種更加有序的方式將這些知識呈現(xiàn)給你,并給出容易理解的實(shí)例,使你知道如何使用ROS讓你的實(shí)物或仿真機(jī)器人去做些有趣的事。我們還嘗試通過提供技巧和提示來給予你各種指導(dǎo),比如如何整合代碼,如何在機(jī)器人行為不合預(yù)期時(shí)調(diào)試代碼以及如何成為ROS社區(qū)的一員。
如果你不是資深程序員,學(xué)習(xí)ROS會有些吃力,系統(tǒng)中包含了分布式計(jì)算、多線程、事件驅(qū)動(dòng)的編程以及深藏在系統(tǒng)底層的一大堆概念。如果你不怎么懂這些內(nèi)容,你的學(xué)習(xí)曲線將會非常陡峭。本書通過介紹ROS的基本概念并給出在實(shí)物或仿真機(jī)器人中的常見應(yīng)用實(shí)例來盡可能地使這條學(xué)習(xí)曲線變得平緩一些。
誰應(yīng)該閱讀本書如果你想讓你的機(jī)器人在現(xiàn)實(shí)世界中做一些事情,而又不想把時(shí)間浪費(fèi)在“重新發(fā)明輪子”上,那么這本書就是為你準(zhǔn)備的。ROS包含了讓機(jī)器人運(yùn)轉(zhuǎn)起來所需要的基礎(chǔ)架構(gòu)以及用來驅(qū)動(dòng)機(jī)器人做一些有趣事情的足夠多的算法。
如果你對某些特別的方面比如路徑規(guī)劃等感興趣,并且想在完整的機(jī)器人系統(tǒng)背景下研究它們,那么這本書就是為你準(zhǔn)備的。本書將展示如何使用ROS提供的基礎(chǔ)架構(gòu)和算法來驅(qū)動(dòng)機(jī)器人做一些有趣的事情以及如何用你自己的算法替換掉現(xiàn)有的算法。
如果你想要了解ROS基本的運(yùn)轉(zhuǎn)機(jī)制和用法,想要了解ROS大概能做哪些事情,但是又苦于wiki的內(nèi)容太過龐雜,那么這本書也是為你準(zhǔn)備的。我們將帶領(lǐng)你了解ROS的運(yùn)轉(zhuǎn)機(jī)制和一些簡單的工具。我們也會提供一些具體的、完整的例子,你可以基于這些例子進(jìn)行開發(fā),修改它們來實(shí)現(xiàn)自己的想法。
誰不適合閱讀本書雖然我們不想拒絕任何人閱讀本書,但是本書并不是對所有人都適用的資源。我們對你使用的機(jī)器人做了一些隱含的假設(shè)。它們應(yīng)該運(yùn)行Linux,有很好的計(jì)算資源(至少相當(dāng)于一臺筆記本電腦)。它們有先進(jìn)的傳感器,比如Microsoft Kinect。它們應(yīng)該是放在地上的,并且可能需要在實(shí)際環(huán)境中移動(dòng)。如果你的機(jī)器人不滿足上述這些要求,那么本書中的例子就不能立刻成功運(yùn)行,盡管程序和工具本身并沒有問題。
本書主要是關(guān)于ROS的,并不是關(guān)于機(jī)器人學(xué)的。盡管你可以從本書中學(xué)到一點(diǎn)機(jī)器人學(xué)相關(guān)的知識,但是我們不會深入地探討ROS中包含的很多算法。如果你想獲取更多關(guān)于機(jī)器人學(xué)的介紹,那么這本書不是為你準(zhǔn)備的。
你將學(xué)到什么本書想要廣泛地介紹如何使用ROS對機(jī)器人進(jìn)行編程。本書涵蓋構(gòu)成ROS核心的基本運(yùn)轉(zhuǎn)機(jī)制和簡單工具,并將展示如何使用它們創(chuàng)建控制機(jī)器人的軟件。我們將展示一些具體的例子,這些例子講述了如何使用ROS控制你的機(jī)器人做一些有趣的事情。同時(shí),我們將給出一些如何基于這些例子來創(chuàng)建你自己的機(jī)器人的建議。
除了技術(shù)內(nèi)容之外,我們還將展示如何使用ROS巨大的生態(tài)系統(tǒng),比如wiki和問答社區(qū),以及如何成為全球ROS社區(qū)的一員,與全世界的其他機(jī)器人愛好者分享代碼和新知識。
預(yù)備知識在閱讀和使用本書之前,你必須了解幾件事情。由于ROS是一個(gè)軟件框架,因此為了更好地了解ROS你非常有必要了解如何編程。雖然在ROS中可以使用很多種語言,但是在本書中我們使用Python。如果你不了解Python,那么很多代碼對你來說就沒多大意義了。幸運(yùn)的是,Python是一門易于學(xué)習(xí)的語言!有很多很不錯(cuò)的書和免費(fèi)的網(wǎng)站,你可以使用這些資源來學(xué)習(xí)Python,Python的官方網(wǎng)站是http://python.org。
最適合運(yùn)行ROS的環(huán)境是Ubuntu Linux,有一些Linux的經(jīng)驗(yàn)?zāi)軌蜃寣W(xué)習(xí)輕松一點(diǎn)。我們在講述過程中將會介紹一些必要的Linux相關(guān)內(nèi)容,但是對文件系統(tǒng)、bash命令行以及至少一種編輯器有一些基本的了解將有利于你將更多的精力放在ROS相關(guān)的內(nèi)容上。
盡管不是必要的,但是對機(jī)器人學(xué)有基本的了解也將有所幫助。了解一些機(jī)器人學(xué)所使用的基本數(shù)學(xué)知識,比如坐標(biāo)變換、傳動(dòng)鏈等,對理解書中所講述的一些ROS機(jī)制也很有幫助。再次強(qiáng)調(diào),我們將簡要介紹這些內(nèi)容,但是如果你不熟悉這些東西,你可能要額外地學(xué)習(xí)、深入機(jī)器人學(xué)的相關(guān)文獻(xiàn)來補(bǔ)充相關(guān)背景。
排版約定斜體表示新的術(shù)語、網(wǎng)址、郵件地址、目錄、路徑名、文件名以及文件擴(kuò)展名。
等寬字體(Constant width)表示程序代碼,在正文中出現(xiàn)的代碼中的元素,如變量名、函數(shù)名、命名空間、數(shù)據(jù)類型、環(huán)境變量、語句以及關(guān)鍵詞等,也用來表示命令、命令行工具以及ROS的包、節(jié)點(diǎn)、話題等。
等寬加粗(Constant width bold)表示命令以及其他一些需要用戶完全按照字面輸入的文字。
等寬斜體(Constant width italic)表示需要用戶根據(jù)自身情況替換的文字以及由上下文決定的一些值。
這個(gè)圖標(biāo)表示一般的注釋。
這個(gè)圖標(biāo)表示建議或者小貼士。
這個(gè)圖標(biāo)表示警告。
代碼示例的使用一些補(bǔ)充材料(代碼示例、練習(xí)等)可以從地址https://github.com/osrf/rosbook獲取。
本書的目的是幫助你完成工作。為了達(dá)到這個(gè)目的,上述鏈接指向的代碼倉庫中的代碼根據(jù)Apache 2.0許可證是可用的,這一許可證允許你重用代碼。
我們希望但是不強(qiáng)制你引用本書。一條引用通常包含書名、作者、出版商以及ISBN,如“Programming Robots with ROS by Morgan Quigley, Brian Gerkey, and William D. Smart (O扲eilly). Copyright 2015 Morgan Quigley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9”。
如果你感覺你對代碼的利用超出了正常使用范圍或上述許可范圍,請聯(lián)系我們:permissions@oreilly.com。
Safari在線電子書Safari Book Online是一個(gè)在線的電子圖書館,收錄了大量當(dāng)下熱門的電子圖書及配套的影像資料,涵蓋商業(yè)的技術(shù)領(lǐng)域的各個(gè)方面。得到了技術(shù)專家、軟件開發(fā)人員、網(wǎng)頁設(shè)計(jì)師和商業(yè)人士的廣泛使用和認(rèn)可。通過它,你可以獲取研究資料、解決難題、學(xué)習(xí)新知識和接受技術(shù)培訓(xùn)等。
Safari Books Online針對企業(yè)、政府和教育機(jī)構(gòu)提供了不同的購買計(jì)劃,你可以根據(jù)實(shí)際需求進(jìn)行選購。
購買Safari Books Online服務(wù)后,你就可以通過在線數(shù)據(jù)庫搜索訪問數(shù)以千計(jì)的書籍、培訓(xùn)視頻甚至是預(yù)出版的樣書。這些資料來自于包括O扲eilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等出版社。
如何聯(lián)系我們美國:
O扲eilly Media,Inc.1005 Gravenstein Highway NorthSebastopol,CA 95472中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)奧萊利技術(shù)咨詢(北京)有限公司本書也有一個(gè)配套網(wǎng)站,網(wǎng)站上的內(nèi)容包括勘誤表、代碼示例以及一些與本書相關(guān)的額外信息。網(wǎng)站的地址是:http://bit.ly/prog_robots_w_ros。
如果有關(guān)于本書的技術(shù)性疑問,請發(fā)電子郵件至bookquestions@oreilly.com。
關(guān)于本書的更多信息,如相關(guān)課程、會議、新聞等,請?jiān)L問我們的網(wǎng)站http://www.oreilly.com。
致謝首先,也是最重要的,我們要感謝O扲eilly的三位編輯Mike Loukides、Meg Blanchette 以及Dawn Schanafelt。在本書寫作過程中,他們表現(xiàn)出了極大的耐心和極高的責(zé)任心。我們還要感謝所有為本書提供反饋的人,尤其是Andreas Bihlmaier、Jon Bohren、Zach Dodds和Kat Scott。他們的評論和建議讓本書變得更好。
當(dāng)然,我們還要感謝所有幫助我們調(diào)試從而使ROS在我們的機(jī)器人上正常運(yùn)行的人。Mike Ferguson提供了Fetch示例。來自開源機(jī)器人基金會(Open Source Robotics Foundation,OSRF)的Stev
目錄
前言 1
第一部分 基礎(chǔ)知識
第1章 概述 9
簡史 9
理念 10
安裝 11
小結(jié) 12
第2章 預(yù)備知識 13
ROS圖 13
roscore 15
catkin、工作區(qū)以及ROS程序包 16
rosrun 19
命名、命名空間以及重映射 24
roslaunch 25
tab鍵 26
tf:坐標(biāo)系轉(zhuǎn)換 27
小結(jié) 30
第3章 話題 31
將消息發(fā)布到話題上 32
訂閱一個(gè)話題 36
鎖存話題 38
定義自己的消息類型 39
讓發(fā)布者和訂閱者協(xié)同工作 46
小結(jié) 47
第4章 服務(wù) 48
定義服務(wù) 48
實(shí)現(xiàn)服務(wù) 51
使用服務(wù) 54
小結(jié) 56
第5章 動(dòng)作 57
動(dòng)作的定義 58
實(shí)現(xiàn)一個(gè)基本的動(dòng)作服務(wù)器 59
動(dòng)作的使用 62
實(shí)現(xiàn)一個(gè)更復(fù)雜的動(dòng)作服務(wù)器 64
使用更復(fù)雜的動(dòng)作 66
小結(jié) 69
第6章 機(jī)器人與仿真器 71
子系統(tǒng) 71
機(jī)器人系統(tǒng)舉例 79
仿真器 83
小結(jié) 86
第7章 Wander-bot 88
創(chuàng)建包 88
讀取傳感器數(shù)據(jù) 91
感知環(huán)境并移動(dòng):Wander-bot 94
小結(jié) 96
第二部分 使用ROS驅(qū)動(dòng)機(jī)器人行走
第8章 遙控機(jī)器人 99
開發(fā)模式 100
鍵盤驅(qū)動(dòng) 100
運(yùn)動(dòng)生成器 102
參數(shù)服務(wù)器 107
速度斜坡曲線 109
開車 111
rviz 113
小結(jié) 120
第9章 創(chuàng)建環(huán)境地圖 121
ROS中的地圖 121
使用rosbag記錄數(shù)據(jù) 124
創(chuàng)建地圖 125
啟動(dòng)地圖服務(wù)器以及查看地圖 131
小結(jié) 133
第10章 在真實(shí)環(huán)境中的導(dǎo)航 135
在地圖中定位機(jī)器人 135
使用ROS的導(dǎo)航軟件包 139
在代碼中進(jìn)行導(dǎo)航 144
小結(jié) 145
第11章 下棋機(jī)器人 146
關(guān)節(jié)、連接以及傳動(dòng)鏈 147
成功的關(guān)鍵 150
安裝和運(yùn)行一臺仿真R2 152
在命令行中移動(dòng)R2 155
在棋盤上移動(dòng)R2的機(jī)械臂 156
操作機(jī)械手 158
對棋盤建模 159
重演著名的棋局 163
小結(jié) 167
第三部分 感知和行為
第12章 循線機(jī)器人 171
采集圖像 171
檢測指示線 177
循線運(yùn)動(dòng) 182
小結(jié) 184
第13章 巡航 185
簡單巡航 185
狀態(tài)機(jī) 186
用smach構(gòu)建狀態(tài)機(jī) 188
用狀態(tài)機(jī)實(shí)現(xiàn)巡航 195
小結(jié) 198
第14章 倉儲機(jī)器人 199
倉庫模擬環(huán)境 199
駛?cè)敫糸g 210
拾取物體 214
小結(jié) 224
第四部分 添加自定義ROS組件
第15章 添加你自己的傳感器和執(zhí)行器 227
添加你自己的傳感器 227
添加你自己的執(zhí)行器 234
小結(jié) 240
第16章 添加你自己的移動(dòng)機(jī)器人:第一部分 242
小龜機(jī)器人 242
ROS 消息接口 244
硬件驅(qū)動(dòng) 247
使用 URDF對機(jī)器人建模247
在 Gazebo 中進(jìn)行仿真 255
小結(jié) 261
第17章 添加你自己的移動(dòng)機(jī)器人:第二部分 262
驗(yàn)證坐標(biāo)變換信息 262
添加激光傳感器 266
配置導(dǎo)航程序棧 270
使用 rviz 定位和控制導(dǎo)航中的機(jī)器人 275
小結(jié) 278
第18章 添加你自己的機(jī)械臂 279
獵豹機(jī)械臂 279
ROS 消息接口 281
硬件驅(qū)動(dòng) 282
對機(jī)器人建模:使用 URDF 282
在 Gazebo 中進(jìn)行仿真 287
驗(yàn)證坐標(biāo)變換信息 294
配置 MoveIt 297
使用 rviz 控制機(jī)械臂 301
小結(jié) 303
第19章 添加軟件庫 305
讓你的機(jī)器人開口說話:使用 pyttsx305
小結(jié) 312
第五部分 ROS使用小知識
第20章 ROS小工具 315
主機(jī)及其相關(guān)組件:roscore315
參數(shù)管理:rosparam 316
文件系統(tǒng)導(dǎo)航:roscd 317
節(jié)點(diǎn)啟動(dòng):rosrun 318
多節(jié)點(diǎn)啟動(dòng):roslaunch 318
多節(jié)點(diǎn)系統(tǒng)測試:rostest 321
系統(tǒng)監(jiān)控:rosnode、rostopic、rosmsg、rosservice和rossrv 324
小結(jié) 327
第21章 機(jī)器人行為調(diào)試 329
日志消息: /rosout和rqt_console 329
節(jié)點(diǎn)、話題和連接:rqt_graph和rosnode 336
傳感器融合: 使用 rviz 343
繪制數(shù)據(jù)圖表:使用 rqt_plot 344
數(shù)據(jù)記錄和分析: 使用rosbag和rqt_bag 346
小結(jié) 350
第22章 ROS在線社區(qū) 351
社區(qū)的禮儀 351
ROS 維基 352
ROS Answers: 一個(gè) ROS 問答社區(qū) 353
bug 追蹤與新特性請求 354
郵件列表與ROS興趣小組 354
查找和分享代碼 354
小結(jié) 355
第23章 用C++編寫ROS程序 356
C++(或其他語言)的使用場景 356
使用catkin編譯C++ 357
在Python和C++之間來回移植程序 359
小結(jié) 364