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