機器人開發(fā)是一項復雜的系統(tǒng)工程,ROS 2為智能機器人開發(fā)提供了強有力的支持,極大地提高了機器人軟件開發(fā)效率。本書首先對ROS 2的基礎概念、通信機制、常用庫和工具進行介紹,帶領(lǐng)讀者入門ROS 2機器人開發(fā);接著引導讀者完成移動機器人的建模和仿真、建圖和導航、自定義控制器和規(guī)劃器等一系列實踐;然后在真機實戰(zhàn)環(huán)節(jié),通過制作一個基于ROS 2的真實機器人,幫助讀者打通仿真與真機之間的壁壘;最后,本書深入講解了ROS 2進階使用的相關(guān)知識,為讀者進一步在實戰(zhàn)中使用ROS 2進行機器人開發(fā)打下夯實基礎?紤]讀者基礎,書中示例均以C 和Python兩種語言實現(xiàn),同時加入了關(guān)于C 新特性、Git工具、多線程和回調(diào)函數(shù)等基礎知識的講解。
不同于其他書籍,本書更加以讀者的需求為導向。在編寫過程中,作者根據(jù)原在線教程動手學ROS 2的讀者反饋,對本書內(nèi)容進行了大量的打磨。針對很多ROS 2 初學者容易受阻的編程,本書在前面幾章穿插介紹了Linux和Git等知識;針對很多小伙伴反饋學完ROS 2不知道怎么用,本書加入了大量實踐環(huán)節(jié),例如,結(jié)合ROS 2 實現(xiàn)語音合成、人臉識別和界面繪制等,讓讀者可以真正學以致用;針對需要仿真的小伙伴,本書著重介紹了ROS 2仿真建模的過程,同時結(jié)合仿真介紹了ros2_control 的使用;針對對實體機器人硬件開發(fā)感興趣的小伙伴,本書引入了micro-ROS 框架,從零介紹了實體機器人的軟件開發(fā)流程;針對需要深入使用ROS 2 的小伙伴,本書在最后一章深入探討了ROS 2 進階相關(guān)知識,讓你可以輕松地在實際項目中使用ROS 2。
前 言
為什么寫這本書
大家好,我是本書的作者小魚。我在學生時代就開始接觸并使用ROS,隨后參加工作,在工作中又進一步使用ROS進行機器人開發(fā)。2020年一個偶然的機會,公司安排我來調(diào)查ROS的缺陷,以及替代方案,就在那時我被ROS 2的強大功能所吸引,為其提供的機器人開發(fā)工具而興奮,于是開始學習ROS 2。
在后續(xù)的學習和使用過程中,我深感ROS 2的中文資料少之又少,于是在2021年7月發(fā)起了魚香ROS社區(qū),開始分享機器人和ROS 2的相關(guān)知識。在學習ROS 2的過程中,我深知動手實踐的重要性,就發(fā)布了動手學ROS 2一系列在線教程,希望讀者可以通過動手實踐來掌握 ROS 2,同年又與睿慕課合作發(fā)布了相應的視頻教程。
隨著學習動手學ROS 2課程的小伙伴越來越多,我收到了大量的反饋,通過反饋深知初學者入門ROS 2和機器人開發(fā)的困難,以及動手學ROS 2系列課程的不足之處。恰逢此時,編輯找到我,我們一拍即合,打算從ROS 2入門角度出發(fā)寫一本書,帶領(lǐng)讀者通過學習ROS 2來入門機器人系統(tǒng)開發(fā)。所以在本書中,不僅有ROS 2的基礎知識、機器人建模和仿真知識、還有從零實現(xiàn)一個真實機器人系統(tǒng)的開發(fā)教程。
本書主要內(nèi)容
本書的內(nèi)容按照知識結(jié)構(gòu)可以分為五個部分。
第一部分對應第1~5章,主要講解ROS 2的基礎軟件庫和工具集的使用,通過該部分的學習,可以讓你快速掌握ROS 2的核心部分。
第二部分對應第6章,主要結(jié)合ROS 2常用的建模工具,從零創(chuàng)建一個移動機器人模型,然后在仿真工具中完成模型仿真,同時結(jié)合仿真機器人講解ros2_control開源框架。
第三部分對應第7章和第8章,主要介紹基于ROS 2的導航框架Navigation 2,同時在第6章仿真移動機器人的基礎上實現(xiàn)導航,最后在第8章介紹如何在Navigation 2中部署測試自定義的規(guī)劃算法和控制算法。
第四部分對應第9章,主要講解如何搭建一個實體機器人,著重介紹移動機器人控制系統(tǒng)實現(xiàn)和使用micro-ROS接入ROS 2,最后介紹實體機器人的建圖和導航實現(xiàn)方法。
第五部分對應第10章,主要介紹ROS 2進階相關(guān)知識,包括服務質(zhì)量QoS、執(zhí)行器和回調(diào)組、生命周期節(jié)點、消息過濾器和ROS 2中間件DDS的進階使用。
本書的目標讀者
對于非機器人行業(yè)中對機器人感興趣并且想要入門機器人開發(fā)的讀者,本書穿插講解了學習ROS 2所需的Linux和編程的基礎知識,讓基礎薄弱的讀者也可以輕松學習。
對于機器人從業(yè)者,不僅可以從本書中學習到ROS 2的基礎知識,還可以通過本書深入學習ROS 2,并將其應用到實際工程中。
對于機器人相關(guān)專業(yè)的高校師生,本書中每一章都涉及大量的動手實踐環(huán)節(jié),可以把本書當作機器人操作系統(tǒng)的學習實驗教材。
對于那些對機器人感興趣的讀者,可以通過本書學習如何制作屬于自己的仿真和實體移動機器人,并在此基礎上實現(xiàn)自主移動導航。
本書特色
不同于其他書籍,本書更加以讀者的需求為導向。在編寫過程中,我根據(jù)原在線教程動手學ROS 2的讀者反饋,對本書內(nèi)容進行了大量的打磨。針對很多ROS 2初學者容易受阻的編程,本書在前面幾章穿插介紹了Linux和Git等知識;針對很多小伙伴反饋學完ROS 2不知道怎么用,本書加入了大量實踐環(huán)節(jié),例如,結(jié)合ROS 2實現(xiàn)語音合成、人臉識別和界面繪制等,讓讀者可以真正學以致用;針對需要仿真的小伙伴,本書著重介紹了ROS 2仿真建模的過程,同時結(jié)合仿真介紹了ros2_control的使用;針對對實體機器人硬件開發(fā)感興趣的小伙伴,本書引入了micro-ROS框架,從零介紹了實體機器人的軟件開發(fā)流程;針對需要深入使用ROS 2的小伙伴,本書在最后一章深入探討了ROS 2進階相關(guān)知識,讓你可以輕松地在實際項目中使用ROS 2。
閱讀指南和配套資源
本書用到的部分開源庫托管到了GitHub,讀者在學習過程中如遇到網(wǎng)絡問題,可以使用本書提供的專用代理工具,工具地址為http://github.fishros.org。在本書的代碼塊中,以$ 開頭表示命令行,使用---分割命令和執(zhí)行結(jié)果,對于非命令行的代碼塊,粗體部分表示重點更新,...表示被省略掉的不重要代碼。
本書提供了大量的配套資源,如配套視頻、ROS 2中文文檔、官方資料網(wǎng)站等,這些都統(tǒng)一放到了本書的交流社區(qū):https://fishros.org.cn。ROS如此璀璨,本人自知才疏學淺,本書難免有錯誤和不足之處,讀者可以在社區(qū)中提出,除此之外,若在學習過程中遇到相關(guān)問題,也可以通過社區(qū)和我交流。
很多小伙伴都是從公眾號魚香ROS開始認識我的,小魚每天都會在公眾號分享機器人和 ROS 2相關(guān)的文章。因為篇幅所限,本書中刪減掉的內(nèi)容都會以文章的形式在公眾號中發(fā)表,歡迎訂閱獲取。
致謝
本書能夠編寫完成和出版,最要感謝的是廣大魚粉對我的支持,沒有你們的反饋和鼓勵,我很難將本書完成。其次要感謝的是一直站在我身邊的家人,感謝來自父親、母親和姐姐的鞭策,感謝幫助我整理稿件的魚嫂馬靖雯(也是本書的第一個讀者)的無條件支持。還要感謝在我的成長路上提供很大幫助的老師,他們是高中時期帶我學習編程和參加比賽的老師趙言言、大學時期的老師殷華博士、工作時的導師陳養(yǎng)斌博士,以及趙洋、蘇琦、曾凡國、覃建州等為我提供過幫助的老師。同時感謝機械工業(yè)出版社對本書的大力支持。最后要感謝的是機器人和ROS生態(tài)的前行者和趕路人,他們是張新宇教授、胡春旭老師、張瑞雷老師、金海華、張鵬、熊穎、侯燕青、李德永等。除此之外,還有很多和我一起交流成長和做出貢獻的愛好者、開發(fā)者和教育者,此處無法一一列舉,但我都感恩
在心。
小魚
2024年1月于廣東廣州
桑欣
魚香ROS機器人社區(qū)(公眾號、B站、知乎)發(fā)起人,一鍵安裝ROS等機器人開源庫作者,擁有多年機器人與自動化開發(fā)經(jīng)驗。他在網(wǎng)上發(fā)布有動手學ROS2等機器人教程,還制作了開源機器人FishBot,獲得了廣大機器人愛好者的一致好評,深受機器人開發(fā)者的喜愛。
目 錄 Contents
推薦序一
推薦序二
前言
第1章 啟程讓你的第一個
機器人動起來 1
1.1 ROS部落的自我介紹 1
1.1.1 機器人與ROS 2
1.1.2 ROS 2系統(tǒng)架構(gòu) 3
1.1.3 ROS 2的已發(fā)布版本 4
1.1.4 ROS 2機器人開發(fā)特色 4
1.2 開發(fā)環(huán)境搭建 5
1.2.1 準備所需軟件 6
1.2.2 安裝虛擬機VirtualBox 6
1.2.3 在虛擬機中安裝
Ubuntu 22.04 7
1.2.4 安裝ROS 2 11
1.3 運行你的第一個機器人 14
1.3.1 啟動海龜模擬器 14
1.3.2 使用鍵盤控制海龜 15
1.3.3 海龜例子的簡單分析 16
1.4 ROS 2基礎之Linux 17
1.4.1 Linux終端基礎操作 17
1.4.2 在Linux中安裝軟件 20
1.4.3 在Linux中編寫Python
程序 23
1.4.4 在Linux中編寫C 程序 26
1.4.5 Linux基礎之環(huán)境變量 28
1.5 小結(jié)與點評 29
第2章 ROS 2基礎入門
從第一個節(jié)點開始 30
2.1 編寫你的第一個節(jié)點 30
2.1.1 Python示例 30
2.1.2 C 示例 33
2.2 使用功能包組織Python節(jié)點 37
2.2.1 在功能包中編寫Python
節(jié)點 37
2.2.2 功能包結(jié)構(gòu)分析 40
2.3 使用功能包組織C 節(jié)點 41
2.3.1 在功能包中編寫C 節(jié)點 41
2.3.2 功能包結(jié)構(gòu)分析 44
2.4 多功能包的最佳實踐Workspace 44
2.5 ROS 2基礎之編程 46
2.5.1 面向?qū)ο缶幊獭?6
2.5.2 用得到的C 新特性 53
2.5.3 多線程與回調(diào)函數(shù) 58
2.6 小結(jié)與點評 62
第3章 訂閱和發(fā)布話題通信
探索 63
3.1 話題通信介紹 63
3.2 Python話題訂閱與發(fā)布 66
3.2.1 通過話題發(fā)布小說 66
3.2.2 訂閱小說并合成語音 69
3.3 C 話題訂閱與發(fā)布 71
3.3.1 發(fā)布速度控制海龜畫圓 71
3.3.2 訂閱Pose實現(xiàn)閉環(huán)控制 74
3.4 話題通信最佳實踐 77
3.4.1 完成工程架構(gòu)設計 77
3.4.2 自定義通信接口 78
3.4.3 系統(tǒng)信息獲取與發(fā)布 81
3.4.4 在功能包中使用Qt 83
3.4.5 訂閱數(shù)據(jù)并用Qt顯示 84
3.5 ROS 2基礎之Git入門 87
3.5.1 新建代碼倉庫 87
3.5.2 學會提交代碼 88
3.5.3 學會使用Git忽略文件 90
3.6 小結(jié)與點評 90
第4章 服務和參數(shù)深入
ROS 2通信 92
4.1 服務與參數(shù)通信介紹 92
4.1.1 服務通信介紹 92
4.1.2 基于服務的參數(shù)通信 95
4.2 用Python服務通信實現(xiàn)人臉檢測 97
4.2.1 自定義服務接口 98
4.2.2 人臉檢測 100
4.2.3 人臉檢測服務實現(xiàn) 102
4.2.4 人臉檢測客戶端的實現(xiàn) 104
4.3 用C 服務通信做一個巡邏
海龜 106
4.3.1 自定義服務接口 107
4.3.2 服務端代碼實現(xiàn) 107
4.3.3 客戶端代碼實現(xiàn) 109
4.4 在Python節(jié)點中使用參數(shù) 111
4.4.1 參數(shù)聲明與設置 112
4.4.2 訂閱參數(shù)更新 113
4.4.3 修改其他節(jié)點的參數(shù) 114
4.5 在C 節(jié)點中使用參數(shù) 116
4.5.1 參數(shù)聲明與設置 117
4.5.2 接收參數(shù)事件 117
4.5.3 修改其他節(jié)點的參數(shù) 119
4.6 使用launch啟動腳本 121
4.6.1 使用launch啟動多個節(jié)點 121
4.6.2 使用launch傳遞參數(shù) 123
4.6.3 launch使用進階 124
4.7 小結(jié)與點評 126
第5章 ROS 2常用開發(fā)工具 127
5.1 坐標變換工具介紹 127
5.1.1 通過命令行使用TF 128
5.1.2 對TF 原理的簡單探究 131
5.2 Python中的手眼坐標變換 133
5.2.1 通過Python發(fā)布靜態(tài)TF 133
5.2.2 通過Python發(fā)布動態(tài)TF 136
5.2.3 通過Python查詢TF關(guān)系 137
5.3 C 中的地圖坐標系變換 139
5.3.1 通過C 發(fā)布靜態(tài)TF 139
5.3.2 通過C 發(fā)布動態(tài)TF 141
5.3.3 通過C 查詢TF關(guān)系 143
5.4 常用可視化工具rqt與RViz 145
5.4.1 GUI框架rqt 145
5.4.2 數(shù)據(jù)可視化工具RViz 147
5.5 數(shù)據(jù)記錄工具ros2 bag 149
5.6 ROS 2基礎之Git進階 153
5.6.1 查看修改內(nèi)容 153
5.6.2 學會撤銷代碼 154
5.6.3 進階掌握Git分支 156
5.7 小結(jié)與點評 158
第6章 建模與仿真創(chuàng)建
自己的機器人 160
6.1 機器人建模與仿真概述 160
6.1.1 移動機器人的結(jié)構(gòu)介紹 160
6.1.2 常用機器人仿真平臺 161
6.2 使用URDF創(chuàng)建機器人 162
6.2.1 幫機器人創(chuàng)建一個身體 162
6.2.2 在RViz中顯示機器人 165
6.2.3 使用Xacro簡化URDF 170
6.2.4 創(chuàng)建機器人及傳感器部件 173
6.2.5 完善機器人執(zhí)行器部件 177
6.2.6 貼合地面,添加虛擬部件 179
6.3 添加物理屬性讓機器人更真實 180
6.3.1 為機器人部件添加碰撞
屬性 180
6.3.2 為機器人部件添加質(zhì)量
與慣性 181
6.4 在Gazebo中完成機器人仿真 183
6.4.1 安裝與使用Gazebo構(gòu)建
世界 184
6.4.2 在Gazebo中加載機器人
模型 189
6.4.3 使用Gazebo標簽擴展
URDF 191
6.4.4 使用兩輪差速插件控制
機器人 193
6.4.5 激光雷達傳感器仿真 197
6.4.6 慣性測量傳感器仿真 200
6.4.7 深度相機傳感器仿真 203
6.5 使用ros2_control驅(qū)動機器人 205
6.5.1 ros2_control介紹與安裝 205
6.5.2 使用Gazebo接入
ros2_control 209
6.5.3 使用關(guān)節(jié)狀態(tài)發(fā)布控制器 213
6.5.4 使用力控制器控制輪子 216
6.5.5 使用兩輪差速控制器控制
機器人 218
6.6 小結(jié)與點評 221
第7章 自主導航讓機器人
自己動起來 222
7.1 機器人導航介紹 222
7.1.1 同步定位與地圖構(gòu)建 222
7.1.2 機器人導航 224
7.2 使用slam_toolbox完成建圖 225
7.2.1 構(gòu)建第一張導航地圖 225
7.2.2 將地圖保存為文件 227
7.3 機器人導航框架Navigation 2 229
7.3.1 Navigation 2介紹與安裝 229
7.3.2 配置Navigation 2參數(shù) 231
7.3.3 編寫launch并啟動導航 232
7.3.4 進行單點與路點導航 234
7.3.5 導航過程中進行動態(tài)避障 236
7.3.6 優(yōu)化導航速度和膨脹半徑 237
7.3.7 優(yōu)化機器人到點精度 239
7.4 導航應用開發(fā)指南 240
7.4.1 使用話題初始化機器人
位姿 240
7.4.2 使用TF獲取機器人實時
位置 243
7.4.3 調(diào)用接口進行單點導航 244
7.4.4 使用接口完成路點導航 250
7.5 導航最佳實踐之做一個自動巡檢
機器人 253
7.5.1 完成機器人系統(tǒng)架構(gòu)設計 253
7.5.2 編寫巡檢控制節(jié)點 253
7.5.3 添加語音播報功能 258
7.5.4 訂閱圖像并記錄 261
7.6 ROS 2基礎之Git倉庫托管 262
7.6.1 添加自描述文件 262
7.6.2 將代碼托管在Gitee 265
7.6.3 將代碼托管在GitHub 266
7.7 小結(jié)與點評 270
第8章 使用自己的規(guī)劃器和
控制器導航 271
8.1 掌握ROS 2插件機制 271
8.1.1 pluginlib介紹與安裝 271
8.1.2 定義插件抽象類 272
8.1.3 編寫并生成第一個插件 272
8.1.4 編寫插件測試程序 275
8.2 自定義導航規(guī)劃器 276
8.2.1 自定義規(guī)劃器介紹 276
8.2.2 搭建規(guī)劃器插件框架 279
8.2.3 實現(xiàn)自定義規(guī)劃算法 283
8.2.4 配置導航參數(shù)并測試 284
8.3 自定義導航控制器 286
8.3.1 自定義控制器介紹 286
8.3.2 搭建控制器插件框架 287
8.3.3 實現(xiàn)自定義控制算法 292
8.3.4 配置導航參數(shù)并測試 294
8.4 小結(jié)與點評 295
第9章 搭建一個實體移動
機器人 296
9.1 移動機器人系統(tǒng)設計 296
9.1.1 機器人傳感器 296
9.1.2 機器人執(zhí)行器 297
9.1.3 機器人決策系統(tǒng) 298
9.2 單片機開發(fā)基礎 298
9.2.1 開發(fā)平臺介紹與安裝 298
9.2.2 第一個HelloWorld工程 301
9.2.3 使用代碼點亮LED燈 303
9.2.4 使用超聲波測量距離 304
9.2.5 使用開源庫驅(qū)動IMU 305
9.3 機器人控制系統(tǒng)的實現(xiàn) 306
9.3.1 使用開源庫驅(qū)動多路
電動機 307
9.3.2 電動機速度測量與轉(zhuǎn)換 308
9.3.3 使用PID控制輪子轉(zhuǎn)速 311
9.3.4 運動學正逆解的實現(xiàn) 315
9.3.5 機器人里程計計算 320
9.4 使用micro-ROS接入ROS 2 322
9.4.1 第一個節(jié)點 323
9.4.2 訂閱話題控制機器人 327
9.4.3 發(fā)布機器人里程計話題 329
9.5 移動機器人建圖與導航實現(xiàn) 333
9.5.1 驅(qū)動并顯示雷達點云 334
9.5.2 移動機器人的坐標系框架
介紹 337
9.5.3 準備機器人URDF 338
9.5.4 發(fā)布里程計TF 341
9.5.5 完成機器人建圖并保存
地圖 343
9.5.6 完成機器人導航 347
9.6 小結(jié)與點評 348
第10章 ROS 2使用進階 349
10.1 消息服務質(zhì)量之QoS 349
10.1.1 QoS策略介紹 349
10.1.2 QoS的兼容性 352
10.1.3 Python QoS兼容性測試 353
10.1.4 C QoS兼容性測試 354
10.2 執(zhí)行器與回調(diào)組 356
10.2.1 執(zhí)行器與回調(diào)組介紹 356
10.2.2 在Python中使用回
調(diào)組 358
10.2.3 在C 中使用回調(diào)組 361
10.3 生命周期節(jié)點 364
10.3.1 生命周期節(jié)點介紹 364
10.3.2 在Python中編寫生命
周期節(jié)點 367
10.3.3 在C 中編寫生命周期
節(jié)點 369
10.4 同一進程組織多個節(jié)點 371
10.4.1 使用執(zhí)行器組織多個
節(jié)點 371
10.4.2 使用組件運行組合
節(jié)點 375
10.4.3 編寫自己的組件 378
10.5 使用消息過濾器同步數(shù)據(jù) 380
10.5.1 消息過濾器介紹 380
10.5.2 在Python中同步傳感器
數(shù)據(jù) 380
10.5.3 在C 中同步傳感器
數(shù)據(jù) 381
10.6 DDS中間件進階 384
10.6.1 使用不同的DDS進行
通信 384
10.6.2 配置局域網(wǎng)通信 386
10.6.3 調(diào)整DDS配置 386
10.6.4 使用DDS共享內(nèi)存 388
10.7 小結(jié)與點評 390