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