ROS 2機(jī)器人編程實(shí)戰(zhàn):基于現(xiàn)代C++和Python 3
定 價(jià):¥119
中 教 價(jià):¥70.21 (5.90折)促銷
庫 存 數(shù): 0
叢 書 名:計(jì)算機(jī)前沿技術(shù)叢書
本書介紹了基于ROS 2編程所需的各方面知識(shí),并通過結(jié)合基本概念、設(shè)計(jì)思想、工程實(shí)踐、編程調(diào)試和應(yīng)用技巧等多面一體進(jìn)行闡述,使讀者可以更加快速地掌握ROS 2機(jī)器人編程的核心思想。書中包含大量的代碼和實(shí)戰(zhàn)案例,同時(shí)還會(huì)講述開源項(xiàng)目及其相關(guān)規(guī)范和注意事項(xiàng),結(jié)合作者實(shí)際的工程經(jīng)驗(yàn)、與時(shí)俱進(jìn)的 ROS 2設(shè)計(jì)思想和源碼案例,讀者可以學(xué)習(xí)到不拘泥于軟件版本與軟件環(huán)境的編程知識(shí)。此外,本書的*后一章還給出了ROS 2在實(shí)際項(xiàng)目中落地的應(yīng)用策略和實(shí)用建議。書中所有源碼都已按照ROS 2的相關(guān)規(guī)范進(jìn)行開源,并與讀者共同維護(hù)。本書為讀者提供了全部案例源代碼下載和高清學(xué)習(xí)視頻,讀者可以直接掃描二維碼觀看。本書適合機(jī)械、自動(dòng)化、機(jī)器人、計(jì)算機(jī)、自動(dòng)駕駛和人工智能等行業(yè)的從業(yè)者、學(xué)生和研究人員,以及 DIY 愛好者和極客等閱讀學(xué)習(xí)。
《ROS 2機(jī)器人編程實(shí)戰(zhàn):基于現(xiàn)代C 和Python 3》融合了一線機(jī)器人工程師多年工作經(jīng)驗(yàn),精心選取的大量實(shí)例項(xiàng)目,手把手帶領(lǐng)讀者玩轉(zhuǎn)ROS 2。循序漸進(jìn)、由淺入深,書中配有二維碼視頻,使讀者身臨其境,迅速、深入地掌握各種經(jīng)驗(yàn)和技巧。
前言歡迎閱讀本書!本書將帶領(lǐng)讀者了解ROS 2的方方面面,幫助讀者從0到1掌握ROS 2的編程知識(shí)。本書編寫目的ROS 2的悄然興起,帶來了許多令人興奮的新功能,但與 ROS 相比,ROS 2的相關(guān)學(xué)習(xí)資料卻相對(duì)缺失,中文資料更是如此。我們成書的目的在于提供一本較為通用的ROS 2編程資料,結(jié)合基本概念、設(shè)計(jì)思想、工程實(shí)踐、調(diào)試與應(yīng)用技巧等多面一體進(jìn)行闡述,讓讀者能夠快速地掌握ROS 2設(shè)計(jì)與使用的核心方法,從而實(shí)現(xiàn)心中所想。初學(xué)者能通過閱讀本書循序漸進(jìn)地學(xué)習(xí)并掌握ROS 2的基本功能與應(yīng)用;具備一定技術(shù)基礎(chǔ)的開發(fā)者,也能通過閱讀本書獲得新的見解和啟發(fā),從而得到提升。全書貫穿了ROS 2是持續(xù)發(fā)展的這一概念,并對(duì)一些可能會(huì)發(fā)生變化的功能和實(shí)現(xiàn)進(jìn)行了提醒。希望能夠引導(dǎo)讀者以發(fā)展的眼光來看待ROS 2,并以發(fā)展的理念來學(xué)習(xí)并設(shè)計(jì)自己的項(xiàng)目。希望讀者在實(shí)踐學(xué)習(xí)的過程中,不要過度拘泥于軟件的版本與環(huán)境,甚至不拘泥于現(xiàn)有的功能,這就是開源的魅力所在。本書還在講解中貫穿介紹有關(guān)ROS開源項(xiàng)目的相關(guān)規(guī)范和注意事項(xiàng),目的在于引導(dǎo)讀者在參與開源項(xiàng)目的過程中,遵守基本的規(guī)則,共建良好的開源環(huán)境。在嘗試使用ROS 2的過程中,筆者尋找過諸多資源。期間也發(fā)現(xiàn)了很多優(yōu)秀的英文資料,包括ROS 2的官方文檔、ROS Discourse論壇上熱心開發(fā)者分享的資料,以及 GitHub社區(qū)的項(xiàng)目README和issue。雖然這些資料都提供了足夠凝練且概括性的基礎(chǔ)知識(shí)和基本使用技巧,但是這些資料都過于片面化或淺顯化,零零散散不成體系,除非開發(fā)者能夠以此為引,通過反復(fù)閱讀源碼掌握ROS 2的精髓并靈活應(yīng)用;否則,單純閱讀文檔或是通過某一個(gè)或幾個(gè)GitHub的項(xiàng)目主頁去了解ROS 2的一些基礎(chǔ)功能的使用方法,無異于管中窺豹。由于ROS 2相關(guān)的API網(wǎng)站是直接通過Doxygen生成的,所以也并沒有給出除注釋之外的介紹和講解,這就導(dǎo)致了如果某個(gè)函數(shù)接口沒有注釋且沒有文檔介紹,那么了解其中的含義的途徑便只有閱讀源碼了。所以本書也會(huì)夾雜著一些ROS 2源程序代碼的內(nèi)容,借此做更詳細(xì)、更扎實(shí)的介紹,以便讀者更好地學(xué)習(xí)和理解。由于本書篇幅有限,所以這里并沒有講解基于ROS 2實(shí)現(xiàn)的任何一個(gè)大型應(yīng)用框架,而是著重講解ROS 2中的每一個(gè)關(guān)鍵基礎(chǔ)及其細(xì)節(jié),力求使本書在具備一定廣度的同時(shí)也具備一定深度,而不是泛泛地將知識(shí)一帶而過。在講述知識(shí)的同時(shí),書中也附有大量的源代碼示例幫助讀者理解相關(guān)的內(nèi)容。希望讀者在閱讀此書時(shí)也同步進(jìn)行編程練習(xí),以加深理解。只有通過不斷練習(xí)和理解,才能夠真正掌握這些知識(shí)。本書結(jié)構(gòu)本書共8章,前5章為基礎(chǔ)內(nèi)容,建議讀者先按照順序完成學(xué)習(xí)。第6~8章是擴(kuò)展知識(shí)章節(jié),相對(duì)獨(dú)立,讀者可挑選感興趣的章節(jié)直接閱讀。第 1 章將帶領(lǐng)讀者從無到有構(gòu)建和部署一個(gè)完整的ROS 2。ROS 2是一個(gè)包括上百個(gè)功能包的軟件堆棧,所謂安裝ROS 2大部分指的是安裝ROS 2的 Core、Base 或 Desktop 版本的集合,本章將會(huì)對(duì)這些內(nèi)容進(jìn)行詳細(xì)區(qū)分和講解。第2章會(huì)從ROS 2基礎(chǔ)、基本的單位(功能包和節(jié)點(diǎn))開始,講解ROS 2是如何實(shí)現(xiàn)功能的模塊化抽象的。其中,功能包是ROS 2構(gòu)建過程中的zui小單位,節(jié)點(diǎn)是ROS 2運(yùn)行過程中的zui小單位。第3章將著重介紹節(jié)點(diǎn)的各類體系化的擴(kuò)展功能,包括日志系統(tǒng)、啟動(dòng)系統(tǒng)、參數(shù)系統(tǒng)、插件系統(tǒng)和組件系統(tǒng)等。正是由于這些擴(kuò)展功能的存在,才使得ROS 2能夠適用于各類豐富多樣的應(yīng)用場(chǎng)景中。第4章和第5章介紹了ROS 2的基礎(chǔ)通信和擴(kuò)展通信的內(nèi)容。所謂基礎(chǔ)通信,指的是ROS 2中基本的通信單位,即基于發(fā)布訂閱模式的 topic 通信和基于主從式架構(gòu)的 service 通信。所謂擴(kuò)展通信,指的是基于基礎(chǔ)通信開發(fā)的通信模式,如 action 和 tf2 等。前5章每章的都會(huì)有實(shí)戰(zhàn)的內(nèi)容,讀者可以根據(jù)當(dāng)前章節(jié)講述的內(nèi)容進(jìn)行實(shí)戰(zhàn)拓展。第6章是面向調(diào)試和測(cè)試的實(shí)戰(zhàn)內(nèi)容,其中會(huì)介紹ROS 2的一些調(diào)試方法和技巧,以及ROS 2中規(guī)范的自動(dòng)化測(cè)試流程及其實(shí)現(xiàn),包括基于 GDB 的調(diào)試、基于 rosbag2 的調(diào)試和ROS 2的自動(dòng)化測(cè)試程序編寫。第7章是面向擴(kuò)展功能的實(shí)戰(zhàn)內(nèi)容。ROS 2的擴(kuò)展可謂千變?nèi)f化,本章僅選擇了具有代表性的三點(diǎn):面向功能性的擴(kuò)展構(gòu)建ROS 2的vendor功能包、面向接口規(guī)范化的擴(kuò)展使用通用傳感器接口面向診斷功能的擴(kuò)展diagnostics。第8章是面向ROS 2產(chǎn)品化的實(shí)戰(zhàn)綜述,匯集了作者對(duì)ROS 2在實(shí)際項(xiàng)目中落地的應(yīng)用策略和實(shí)用建議。在ROS 2的許多公開示例和教程中,以及ROS 2的諸多擴(kuò)展功能中,大部分都是面向原型機(jī)的設(shè)計(jì)和實(shí)現(xiàn),這也使得許多工程師在ROS 2的落地過程屢屢碰壁,本章旨在幫助讀者解決這個(gè)困擾。使用方法和書中約定建議讀者準(zhǔn)備一臺(tái)基于x86-64或者ARM64架構(gòu)的計(jì)算機(jī);谶@些計(jì)算機(jī),讀者便可以在其中嘗試本書所講述的所有功能,并且可以在不同架構(gòu)、不同操作系統(tǒng)、不同版本操作系統(tǒng),甚至不同版本編譯器和解釋器的操作系統(tǒng)的計(jì)算機(jī)上嘗試。除了學(xué)習(xí)本書外,ROS官方的一系列網(wǎng)站和平臺(tái)都是值得讀者瀏覽和了解的,包括:主頁(ros.org):該網(wǎng)頁匯總了主要的ROS平臺(tái)鏈接,相當(dāng)于導(dǎo)航主頁。l論壇(discourse.ros.org):該網(wǎng)站基于開源框架Discourse搭建,是一個(gè)純技術(shù)類論壇,所有 ROS 相關(guān)的發(fā)布、技術(shù)討論和公開說明都會(huì)在論壇上進(jìn)行。l問答平臺(tái)(answers.ros.org):該網(wǎng)站基于開源框架Askbot搭建,是一個(gè)問答社區(qū),任何人都可以在這里發(fā)出有關(guān)ROS的提問,也可在這里回答任何人提出的問題。l文檔(docs.ros.org):該網(wǎng)站收集了ROS 2的所有重要文檔,包括當(dāng)下長(zhǎng)期支持版本和開發(fā)版本,以及開發(fā)文檔和API文檔等。l希望讀者在閱讀本書的同時(shí),深度探索ROS社區(qū)的每個(gè)部分,實(shí)際上,不少初學(xué)者,甚至經(jīng)驗(yàn)豐富的工程師,都會(huì)忽略社區(qū)的重要性。由于ROS 2是開源軟件,無論是更新大版本,還是修復(fù)小問題,都會(huì)通過社區(qū)的不同渠道進(jìn)行發(fā)布和討論。所以作為參與者加入社區(qū),可以跟進(jìn)ROS 2大大小小的改動(dòng)。這樣可以從根本上了解到ROS 2的方方面面,如新特性的從無到有,或某些功能的不足之處等。所以,如果只是一味地看書、讀博客和參閱二手翻譯的文章,是永遠(yuǎn)無法跟上時(shí)代zui新步伐的。這與想了解領(lǐng)域內(nèi)zui新的研究成果需要通過閱讀和發(fā)表論文,以及參與會(huì)議交流是異曲同工的。本書對(duì)于代碼有一些特別的約定1. 在普通的腳本代碼中會(huì)使用注釋后的…代表省略了不重要的部分,并代表此處應(yīng)有其他代碼或日志存在。在shell中,#開頭為注釋。l會(huì)使用代表分割線,用于分隔不同指令執(zhí)行后的執(zhí)行結(jié)果。l以$開頭的指令均執(zhí)行自普通權(quán)限的用戶,以#開頭的指令均執(zhí)行自超級(jí)用戶(root)。l2. 在程序源代碼中會(huì)使用注釋后的…代表省略了不重要的部分,并代表此處應(yīng)有其他代碼或日志存在。在C 中,以//開頭為注釋;在Python中,以#開頭為注釋。前置知識(shí)如果讀者掌握了如下知識(shí),則學(xué)習(xí)本書會(huì)事半功倍。C 編程基礎(chǔ):了解基本的面向?qū)ο缶幊毯湍0寮纯桑軌蛄私馇宄﨏 各個(gè)版本(03、11、14和 17 等)的不同之處。lPython 3 的編程基礎(chǔ)。l機(jī)器人學(xué)基礎(chǔ)。如果沒有系統(tǒng)學(xué)過,可以簡(jiǎn)單了解一些空間描述、坐標(biāo)變換、正運(yùn)動(dòng)學(xué)和逆運(yùn)動(dòng)學(xué)相關(guān)的知識(shí)。lLinux 系統(tǒng)操作基礎(chǔ)。能夠使用簡(jiǎn)單的指令,如 cd、ls、mkdir、cat、grep 和 find 等。l版本管理基礎(chǔ)。了解如何使用 GIT 工具管理軟件的版本,如如何拉取、提交和合并。當(dāng)然zui好使用過GitHub,并且了解開源項(xiàng)目運(yùn)作的基本原理,如了解 issue 和 pull request 等基本概念。l筆者在開發(fā)鐵蛋(CYBERDOG)項(xiàng)目時(shí)與ROS 2結(jié)下了不解之緣,自此也深知開源對(duì)于人類科技發(fā)展的重要性。ROS 生態(tài)能有今天的盛況,完全得益于開源,我們希望未來持續(xù)為開源做出貢獻(xiàn),也希望廣大讀者能加入其中,為人類的未來添磚加瓦。本書有大量的代碼需要讀者去嘗試,并且已經(jīng)將代碼開源至GitHub的homalozoa/ros2_for_beginners_code(這是對(duì)GitHub開源倉庫的一種縮寫,在第1章會(huì)有講解),也歡迎讀者來社區(qū)交流,為本書或本項(xiàng)目提出寶貴建議和意見。本書還提供了高清學(xué)習(xí)視頻,讀者可以直接掃描二維碼觀看。
徐海望,機(jī)器人軟硬件研發(fā)工程師、社區(qū)貢獻(xiàn)者、機(jī)器人愛好者。曾就職于小米機(jī)器人實(shí)驗(yàn)室,鐵蛋創(chuàng)始團(tuán)隊(duì)成員之一,曾參與若干機(jī)器人的設(shè)計(jì)、研發(fā),并負(fù)責(zé)鐵蛋的開源社區(qū)運(yùn)營(yíng)。擅長(zhǎng)移動(dòng)機(jī)器人的軟硬件架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)。高佳麗,機(jī)器人軟硬件研發(fā)工程師,機(jī)器人愛好者。曾就職于小米,鐵蛋創(chuàng)始團(tuán)隊(duì)成員之一,并參與多項(xiàng)小米自研穿戴類產(chǎn)品開發(fā)。擅長(zhǎng)嵌入式軟件驅(qū)動(dòng)的開發(fā),多傳感器系統(tǒng)中間件的開發(fā)與調(diào)試;擅長(zhǎng)機(jī)器人上層應(yīng)用的設(shè)計(jì)與實(shí)現(xiàn)。
第1章 構(gòu)建與部署ROS 21.1 ROS 2的開發(fā)環(huán)境配置1.1.1 ROS 2的發(fā)行方式1.1.2 解決依賴問題1.1.3 從源碼安裝ROS 2的技巧1.1.4 便于開發(fā)的環(huán)境配置1.2 ROS 2的架構(gòu)體系1.2.1 核心組件1.2.2 機(jī)器人基礎(chǔ)應(yīng)用組件1.2.3 可視化組件、示例組件和擴(kuò)展組件1.3 ROS 2的構(gòu)建體系1.3.1 vcstool的使用1.3.2 colcon工具鏈的簡(jiǎn)介1.3.3 colcon的構(gòu)建、測(cè)試和查閱1.4 實(shí)戰(zhàn):定制特定功能的ROS 2軟件堆棧第2章 模塊化的功能包和節(jié)點(diǎn)2.1 軟件功能包的構(gòu)建2.1.1 功能包的配置方法2.1.2 功能包的構(gòu)建與測(cè)試流程2.1.3 運(yùn)行指定功能包中的程序2.2 節(jié)點(diǎn)的構(gòu)建方法與基本操作2.2.1 節(jié)點(diǎn)與節(jié)點(diǎn)執(zhí)行器2.2.2 建立節(jié)點(diǎn)的方法2.2.3 調(diào)試節(jié)點(diǎn)的方法2.2.4 進(jìn)程、線程與節(jié)點(diǎn)的關(guān)系2.3 節(jié)點(diǎn)的常見擴(kuò)展功能2.3.1 DDS的作用域2.3.2 ROS的命名空間2.3.3 生命周期節(jié)點(diǎn)2.4 實(shí)戰(zhàn):功能包的打包與發(fā)行第3章 節(jié)點(diǎn)的體系化與擴(kuò)展3.1 節(jié)點(diǎn)的日志系統(tǒng)3.1.1 日志的基本分類3.1.2 收集和查閱歷史日志3.1.3 日志的應(yīng)用技巧3.2 使用啟動(dòng)腳本3.2.1 構(gòu)建啟動(dòng)系統(tǒng)3.2.2 同時(shí)運(yùn)行多個(gè)進(jìn)程3.2.3 配置啟動(dòng)腳本3.3 節(jié)點(diǎn)的參數(shù)系統(tǒng)3.3.1 為節(jié)點(diǎn)加入?yún)?shù)3.3.2 YAML的基本語法3.3.3 在launch文件中引入?yún)?shù)3.4 通用的插件系統(tǒng)3.4.1 創(chuàng)建插件3.4.2 動(dòng)態(tài)加載插件3.4.3 插件的使用案例3.5 ROS 2的組件系統(tǒng)3.5.1 單組件的實(shí)現(xiàn)流程3.5.2 實(shí)現(xiàn)自定義的組件3.5.3 使用組件容器加載多個(gè)組件3.6 實(shí)戰(zhàn):RealSense與ROS的橋接第4章 ROS 2的基礎(chǔ)通信4.1 基于發(fā)布訂閱模式的topic通信4.1.1 嘗試發(fā)布和訂閱4.1.2 調(diào)試topic的方法4.1.3 消息的服務(wù)質(zhì)量4.1.4 進(jìn)程內(nèi)高效通信4.1.5 嘗試共享內(nèi)存4.1.6 統(tǒng)計(jì)Topic狀態(tài)4.2 基于主從式架構(gòu)的service通信4.2.1 實(shí)現(xiàn)service服務(wù)端和客戶端4.2.2 在客戶端處理應(yīng)答4.2.3 service的局限性4.3 實(shí)戰(zhàn):級(jí)聯(lián)生命周期節(jié)點(diǎn)第5章 ROS 2的擴(kuò)展通信5.1 基于主從式架構(gòu)的action通信5.1.1 實(shí)現(xiàn)action服務(wù)端和客戶端5.1.2 在客戶端獲取反饋、狀態(tài)和結(jié)果5.1.3 action的搶占和隊(duì)列5.2 接口的使用及其自定義5.2.1 自定義接口5.2.2 使用自定義接口5.2.3 消息編寫的基本規(guī)范5.2.4 接口的使用技巧5.3 基于topic實(shí)現(xiàn)的坐標(biāo)系統(tǒng)5.3.1 廣播靜態(tài)坐標(biāo)變換5.3.2 廣播動(dòng)態(tài)坐標(biāo)變換5.3.3 監(jiān)聽坐標(biāo)變換5.4 實(shí)戰(zhàn):模塊化的導(dǎo)航功能框架第6章 面向ROS 2的調(diào)試與測(cè)試6.1 調(diào)試ROS 2的代碼6.1.1 使用GDB調(diào)試6.1.2 使用ros2_tracing6.2 使用rosbag2實(shí)現(xiàn)持久記錄6.2.1 使用ros2bag錄制消息6.2.2 播放和處理bag文件6.2.3 在程序中調(diào)用rosbag2的API6.3 實(shí)現(xiàn)單元測(cè)試6.3.1 編寫簡(jiǎn)單的單元測(cè)試6.3.2 斷言的種類6.3.3 統(tǒng)計(jì)測(cè)試覆蓋率第7章 探索ROS 2的擴(kuò)展功能7.1 了解開源協(xié)議與版權(quán)7.1.1 開源協(xié)議介紹7.1.2 版權(quán)信息的重要性7.1.3 項(xiàng)目中的Notice文件7.2 構(gòu)建ROS 2的vendor功能包7.2.1 辨識(shí)項(xiàng)目的構(gòu)建方式7.2.2 CMake項(xiàng)目的引入7.2.3 Autoconf項(xiàng)目的引入7.3 使用ROS 2規(guī)范傳感器接口7.3.1 傳感器數(shù)據(jù)的分類7.3.2 同步多源數(shù)據(jù)7.4 實(shí)現(xiàn)軟硬件診斷系統(tǒng)7.4.1 更新診斷數(shù)據(jù)7.4.2 分析診斷數(shù)據(jù)第8章 ROS 2的產(chǎn)品落地指導(dǎo)8.1 架構(gòu)設(shè)計(jì)與硬件選型8.1.1 硬件平臺(tái)與外設(shè)的選型8.1.2 軟件架構(gòu)的層次化8.2 軟件實(shí)現(xiàn)的注意事項(xiàng)8.2.1 支持ROS 2的軟件平臺(tái)8.2.2 原型環(huán)境與交付環(huán)境8.2.3 自啟動(dòng)與下電保護(hù)8.3 集成與交付8.3.1 構(gòu)建環(huán)境的可重復(fù)部署8.3.2 持續(xù)集成與持續(xù)交付8.3.3 開放平臺(tái)中的CI/CD