本書以ROS 2核心原理為主線,以機器人開發(fā)實踐為重心,在詳細講解ROS 2核心概念、組件工具的基礎(chǔ)上,介紹ROS 2構(gòu)建仿真/實物機器人系統(tǒng)的方法,剖析ROS 2用于視覺識別、地圖構(gòu)建、自主導(dǎo)航等應(yīng)用的方法,配有大量圖表、源碼等,幫助讀者在實現(xiàn)ROS 2基礎(chǔ)功能的同時,深入理解基于ROS 2的機器人開發(fā)方法,從而將書中的內(nèi)容用于實踐。 本書采用最新穩(wěn)定版本ROS 2系統(tǒng)和全新一代Gazebo機器人仿真平臺,讀者只需準備一臺計算機,就可以快速上手學(xué)習(xí)。同時,本書介紹了實物機器人的搭建方法及相應(yīng)功能的實現(xiàn),書中源碼都加入了中文注釋,并針對核心內(nèi)容提供C++和Python兩個版本。為方便讀者閱讀和學(xué)習(xí)本書,筆者團隊還專門創(chuàng)建了一個網(wǎng)頁,供讀者下載配套源碼、查看操作指令、學(xué)習(xí)配套視頻教程。
胡春旭,ROS機器人社區(qū)“古月居”創(chuàng)始人,D-Robotics開發(fā)者生態(tài)負責(zé)人。專注于機器人操作系統(tǒng)及人工智能相關(guān)技術(shù)的推廣與應(yīng)用,撰寫了《ROS機器人開發(fā)實踐》《移動機器人原理與應(yīng)用(基于ROS操作系統(tǒng))》等多本暢銷技術(shù)書。主導(dǎo)了基于RDK機器人開發(fā)者套件的全新機器人開發(fā)范式的研發(fā)工作,任教于多所高校及機器人/人工智能教育平臺。曾獲2019 ROS全球十大影響力人物、ROS布道師等榮譽稱號。李喬龍,ROS機器人社區(qū)“古月居”負責(zé)人,負責(zé)古月居社區(qū)生態(tài)的推廣、建設(shè)和產(chǎn)品研發(fā)。主導(dǎo)設(shè)計了古月居Origin系列機器人套件。曾負責(zé)全國大學(xué)生智能汽車競賽地平線賽項策劃與推廣,學(xué)生時期獲得過多項全國機器人國家級獎項。目前專注于機器人技術(shù)和人工智能技術(shù)的推廣與應(yīng)用。
第1部分 ROS 2 基礎(chǔ)原理
1 ROS:智能機器人的靈魂 2
1.1 智能機器人時代 2
1.2 ROS 發(fā)展歷程 3
1.2.1 ROS 的起源 3
1.2.2 ROS 的發(fā)展 4
1.2.3 ROS 的特點 6
1.3 ROS 2 與 ROS 1 7
1.3.1 ROS 1 的局限性 7
1.3.2 全新的 ROS 2 8
1.3.3 ROS 2 與 ROS 1 的對比 10
1.4 ROS 2 安裝方法 13
1.4.1 Linux 是什么 14
1.4.2 Ubuntu 是什么 14
1.4.3 Ubuntu 操作系統(tǒng)安裝 15
1.4.4 ROS 2 系統(tǒng)安裝 18
1.5 ROS 2 命令行操作 20
1.5.1 Linux 中的命令行 21
1.5.2 海龜仿真實踐 25
1.5.3 ROS 2 中的命令行 26
1.6 本章小結(jié) 31
2 ROS 2 核心原理:構(gòu)建機器人的基石 32
2.1 ROS 2 機器人開發(fā)流程 32
2.2 工作空間:機器人開發(fā)的大本營 34
2.2.1 工作空間是什么 34
2.2.2 創(chuàng)建工作空間 35
2.2.3 編譯工作空間 36
2.2.4 設(shè)置環(huán)境變量 37
2.3 功能包:機器人功能分類 37
2.3.1 功能包是什么 38
2.3.2 創(chuàng)建功能包 38
2.3.3 功能包的結(jié)構(gòu) 39
2.3.4 編譯功能包 44
2.4 節(jié)點:機器人的工作細胞 45
2.4.1 節(jié)點是什么 46
2.4.2 節(jié)點編程方法(Python) 47
2.4.3 節(jié)點編程方法(C++) 49
2.4.4 節(jié)點的命令行操作 51
2.4.5 節(jié)點應(yīng)用示例:目標檢測 52
2.5 話題:節(jié)點間傳遞數(shù)據(jù)的橋梁 54
2.5.1 話題是什么 55
2.5.2 話題通信模型 55
2.5.3 話題通信編程示例 57
2.5.4 話題發(fā)布者編程方法(Python) 58
2.5.5 話題訂閱者編程方法(Python) 59
2.5.6 話題發(fā)布者編程方法(C++) 60
2.5.7 話題訂閱者編程方法(C++) 62
2.5.8 話題的命令行操作 63
2.5.9 話題應(yīng)用示例:目標檢測(周期式) 64
2.6 服務(wù):節(jié)點間的你問我答 68
2.6.1 服務(wù)是什么 68
2.6.2 服務(wù)通信模型 69
2.6.3 服務(wù)通信編程示例 70
2.6.4 客戶端編程方法(Python) 71
2.6.5 服務(wù)端編程方法(Python) 72
2.6.6 客戶端編程方法(C++) 73
2.6.7 服務(wù)端編程方法(C++) 75
2.6.8 服務(wù)的命令行操作 76
2.6.9 服務(wù)應(yīng)用示例:目標檢測(請求式) 77
2.7 通信接口:數(shù)據(jù)傳遞的標準結(jié)構(gòu) 80
2.7.1 通信接口是什么 80
2.7.2 通信接口的定義方法 82
2.7.3 通信接口的命令行操作 85
2.7.4 服務(wù)接口應(yīng)用示例:請求目標檢測的坐標 86
2.7.5 話題接口應(yīng)用示例:周期性發(fā)布目標檢測的坐標 89
2.8 動作:完整行為的流程管理 93
2.8.1 動作是什么 93
2.8.2 動作通信模型 93
2.8.3 動作通信編程示例 95
2.8.4 動作接口的定義方法 96
2.8.5 服務(wù)端編程方法(Python) 97
2.8.6 客戶端編程方法(Python) 99
2.8.7 客戶端編程方法(C++) 101
2.8.8 服務(wù)端編程方法(C++) 104
2.8.9 動作的命令行操作 107
2.9 參數(shù):機器人系統(tǒng)的全局字典 107
2.9.1 參數(shù)是什么 108
2.9.2 參數(shù)通信模型 108
2.9.3 參數(shù)的命令行操作 109
2.9.4 參數(shù)編程方法(Python) 111
2.9.5 參數(shù)編程方法(C++) 112
2.9.6 參數(shù)應(yīng)用示例:設(shè)置目標檢測的閾值 113
2.10 數(shù)據(jù)分發(fā)服務(wù)(DDS):機器人的神經(jīng)網(wǎng)絡(luò) 116
2.10.1 DDS 是什么 116
2.10.2 DDS 通信模型 118
2.10.3 質(zhì)量服務(wù)策略 QoS 120
2.10.4 命令行中配置 DDS 的 QoS 123
2.10.5 DDS 編程示例 125
2.11 分布式通信 128
2.11.1 分布式通信是什么 128
2.11.2 SSH 遠程網(wǎng)絡(luò)連接 128
2.11.3 分布式數(shù)據(jù)傳輸 130
2.11.4 分布式網(wǎng)絡(luò)分組 132
2.11.5 海龜分布式通信示例 133
2.12 本章小結(jié) 133
3 ROS 2 常用工具:讓機器人開發(fā)更便捷 134
3.1 Launch:多節(jié)點啟動與配置腳本 134
3.1.1 多節(jié)點啟動方法 136
3.1.2 命令行參數(shù)配置 137
3.1.3 資源重映射 139
3.1.4 ROS 參數(shù)設(shè)置 141
3.1.5 Launch 啟動文件嵌套包含 143
3.2 tf:機器人坐標系管理系統(tǒng) 144
3.2.1 機器人中的坐標系 145
3.2.2 tf 命令行操作 146
3.2.3 靜態(tài) tf 廣播(Python) 149
3.2.4 靜態(tài) tf 廣播(C++) 151
3.2.5 動態(tài) tf 廣播(Python) 153
3.2.6 動態(tài) tf 廣播(C++) 155
3.2.7 tf 監(jiān)聽(Python) 157
3.2.8 tf 監(jiān)聽(C++) 160
3.2.9 tf 綜合應(yīng)用示例:海龜跟隨(Python) 163
3.2.10 tf 綜合應(yīng)用示例:海龜跟隨(C++) 168
3.3 Gazebo:機器人三維物理仿真平臺 172
3.3.1 Gazebo 介紹 172
3.3.2 機器人仿真示例 175
3.3.3 傳感器仿真示例 177
3.4 RViz:數(shù)據(jù)可視化平臺 178
3.4.1 RViz 介紹 178
3.4.2 數(shù)據(jù)可視化操作流程 181
3.4.3 應(yīng)用示例一:tf 數(shù)據(jù)可視化 182
3.4.4 應(yīng)用示例二:圖像數(shù)據(jù)可視化 184
3.4.5 Gazebo 與 RViz 的關(guān)系 186
3.5 rosbag:數(shù)據(jù)記錄與回放 186
3.5.1 記錄數(shù)據(jù) 187
3.5.2 回放數(shù)據(jù) 188
3.6 rqt:模塊化可視化工具箱 189
3.6.1 rqt 介紹 189
3.6.2 日志顯示 190
3.6.3 圖像顯示 191
3.6.4 發(fā)布話題/服務(wù)數(shù)據(jù) 192
3.6.5 繪制數(shù)據(jù)曲線 193
3.6.6 數(shù)據(jù)包管理 193
3.6.7 節(jié)點可視化 194
3.7 ROS 2 開發(fā)環(huán)境配置 195
3.7.1 版本管理軟件 git 195
3.7.2 集成開發(fā)環(huán)境 VSCode 196
3.8 本章小結(jié) 198
第 2 部分 ROS 2 機器人設(shè)計
4 ROS 2 機器人仿真:零成本玩轉(zhuǎn)機器人 200
4.1 機器人的定義與組成 200
4.2 URDF 機器人建模 203
4.2.1 連桿的描述 204
4.2.2 關(guān)節(jié)的描述 206
4.2.3 完整機器人模型 208
4.3 創(chuàng)建機器人URDF模型 209
4.3.1 機器人模型功能包 209
4.3.2 機器人模型可視化 209
4.3.3 機器人模型解析 213
4.4 XACRO機器人模型優(yōu)化 217
4.4.1 XACRO文件常見語法 218
4.4.2 機器人模型優(yōu)化 219
4.4.3 機器人模型可視化 223
4.5 完善機器人仿真模型 223
4.5.1 完善物理參數(shù) 224
4.5.2 添加控制器插件 225
4.6 Gazebo 機器人仿真 226
4.6.1 在Gazebo中加載機器人模型 226
4.6.2 機器人運動控制仿真 230
4.6.3 RGB相機仿真與可視化 232
4.6.4 RGBD相機仿真與可視化 236
4.6.5 激光雷達仿真與可視化 241
4.7 本章小結(jié) 244
5 ROS 2 機器人構(gòu)建:從仿真到實物 245
5.1 機器人從仿真到實物 245
5.1.1 案例剖析 245
5.1.2 機器人設(shè)計 247
5.1.3 軟件架構(gòu)設(shè)計 248
5.1.4 計算機端開發(fā)環(huán)境配置 249
5.1.5 機器人仿真測試 251
5.2 驅(qū)動系統(tǒng)設(shè)計:讓機器人動得了 251
5.2.1 電機驅(qū)動原理:從PWM到H橋 251
5.2.2 電機正反轉(zhuǎn)控制編程 255
5.3 底盤運動控制:讓機器人動得穩(wěn) 261
5.3.1 電機編碼器測速原理 261
5.3.2 編碼器測速編程 262
5.3.3 電機閉環(huán)控制方法 266
5.3.4 電機閉環(huán)控制編程 272
5.4 運動學(xué)正逆解:讓機器人動得準 275
5.4.1 機常見器人運動學(xué)模型 275
5.4.2 差速運動學(xué)原理 281
5.4.3 差速運動學(xué)逆解:計算兩個輪子的轉(zhuǎn)速 283
5.4.4 差速運動學(xué)正解:計算機器人整體的速度 284
5.5 運動控制器中還有什么 284
5.5.1 電源管理:一個輸入多種輸出 285
5.5.2 IMU:測量機器人的姿態(tài)變化 287
5.5.3 人機交互:底層狀態(tài)清晰明了 291
5.6 機器人控制系統(tǒng):從“肌肉”到“大腦” 292
5.6.1 控制系統(tǒng)的計算平臺 293
5.6.2 控制系統(tǒng)的燒寫與配置 293
5.7 本章小結(jié) 300
6 ROS 2 控制與感知:讓機器人動得了、看得見 301
6.1 機器人通信協(xié)議開發(fā) 301
6.1.1 通信協(xié)議設(shè)計 302
6.1.2 通信協(xié)議示例解析 303
6.1.3 運動控制器端協(xié)議開發(fā)(下位機) 306
6.1.4 應(yīng)用處理器端協(xié)議開發(fā)(上位機) 314
6.2 機器人 ROS 2 底盤驅(qū)動開發(fā) 318
6.2.1 機器人 ROS 2 底盤驅(qū)動 318
6.2.2 速度控制話題的訂閱 321
6.2.3 里程計話題與 tf 的維護 324
6.2.4 機器人狀態(tài)的動態(tài)監(jiān)控 333
6.3 機器人運動編程與可視化 336
6.3.1 ROS 2 速度控制消息定義 337
6.3.2 運動編程與可視化 338
6.4 相機驅(qū)動與圖像數(shù)據(jù) 339
6.4.1 常用相機類型 340
6.4.2 相機驅(qū)動與可視化 341
6.4.3 ROS 2 圖像消息定義 343
6.4.4 三維相機驅(qū)動與可視化 346
6.4.5 ROS 2 點云消息定義 347
6.5 激光雷達驅(qū)動與可視化 348
6.5.1 常見激光雷達類型 348
6.5.2 ROS 2 雷達消息定義 349
6.5.3 激光雷達驅(qū)動與數(shù)據(jù)可視化 351
6.6 IMU 驅(qū)動與數(shù)據(jù)可視化 354
6.6.1 ROS 2 IMU 消息定義 354
6.6.2 IMU 驅(qū)動與可視化 354
6.7 本章小結(jié) 356
第 3 部分 ROS 2 機器人應(yīng)用
7 ROS 2 視覺應(yīng)用:讓機器人看懂世界 358
7.1 機器視覺原理簡介 358
7.2 ROS 2 相機標定 361
7.2.1 安裝相機標定功能包 361
7.2.2 運行相機標定節(jié)點 362
7.2.3 相機標定流程 362
7.2.4 相機標定文件的使用 366
7.2.5 雙目相機標定 370
7.3 OpenCV 圖像處理 371
7.3.1 安裝 OpenCV 371
7.3.2 在 ROS 2 中使用 OpenCV 371
7.4 視覺應(yīng)用一:視覺巡線 374
7.4.1 基本原理與實現(xiàn)框架 374
7.4.2 機器人視覺巡線仿真 376
7.4.3 真實機器人視覺巡線 381
7.5 視覺應(yīng)用二:二維碼識別 382
7.5.1 二維碼掃描庫——Zbar 382
7.5.2 相機識別二維碼 383
7.5.3 真實機器人相機識別二維碼 387
7.5.4 真實機器人二維碼跟隨 388
7.6 機器學(xué)習(xí)應(yīng)用一:深度學(xué)習(xí)視覺巡線 389
7.6.1 基本原理與實現(xiàn)框架 390
7.6.2 深度學(xué)習(xí)視覺巡線應(yīng)用 390
7.6.3 數(shù)據(jù)采集與模型訓(xùn)練 392
7.6.4 模型效果評估測試 395
7.6.5 在機器人中部署模型 396
7.7 機器學(xué)習(xí)應(yīng)用二:YOLO 目標檢測 399
7.7.1 基本原理與實現(xiàn)框架 399
7.7.2 YOLO 目標檢測部署 401
7.7.3 數(shù)據(jù)采集與模型訓(xùn)練 403
7.7.4 機器人目標檢測與跟隨 406
7.8 本章小結(jié) 407
8 ROS 2 地圖構(gòu)建:讓機器人理解環(huán)境 408
8.1 SLAM 地圖構(gòu)建原理 408
8.1.1 SLAM 是什么 408
8.1.2 SLAM 基本原理 411
8.1.3 SLAM 后端優(yōu)化 412
8.2 SLAM Toolbox 地圖構(gòu)建 414
8.2.1 算法原理介紹 415
8.2.2 安裝與配置方法 415
8.2.3 仿真環(huán)境中的 SLAM Toolbox 地圖構(gòu)建 416
8.2.4 真實機器人 SLAM Toolbox 地圖構(gòu)建 418
8.3 Cartographer:二維地圖構(gòu)建 420
8.3.1 算法原理介紹 421
8.3.2 安裝與配置方法 . 422
8.3.3 仿真環(huán)境中的 Cartographer 地圖構(gòu)建 423
8.3.4 真實機器人 Cartographer 地圖構(gòu)建 427
8.4 ORB:視覺地圖構(gòu)建 430
8.4.1 算法原理介紹 430
8.4.2 安裝與配置方法 . 432
8.4.3 真實機器人 ORB 地圖構(gòu)建 434
8.5 RTAB:三維地圖構(gòu)建 435
8.5.1 算法原理介紹 436
8.5.2 安裝與配置方法 436
8.5.3 仿真環(huán)境中的RTAB地圖構(gòu)建 438
8.5.4 真實機器人RTAB地圖構(gòu)建 441
8.6 本章小結(jié) 443
9 ROS 2 自主導(dǎo)航:讓機器人運動自由 444
9.1 機器人自主導(dǎo)航原理 444
9.2 Nav2 自主導(dǎo)航框架 445
9.2.1 系統(tǒng)框架 445
9.2.2 全局導(dǎo)航 447
9.2.3 局部導(dǎo)航 448
9.2.4 定位功能 450
9.3 Nav2安裝與體驗 452
9.3.1 Nav2安裝方法 452
9.3.2 Nav2案例體驗 452
9.4 機器人自主導(dǎo)航仿真 455
9.4.1 Nav2參數(shù)配置 455
9.4.2 Launch啟動文件配置 456
9.4.3 機器人自主導(dǎo)航仿真 458
9.5 機器人自主導(dǎo)航實踐 461
9.5.1 導(dǎo)航地圖配置 461
9.5.2 Nav2 參數(shù)與Launch啟動文件配置 462
9.5.3 機器人自主導(dǎo)航實踐 464
9.6 機器人自主導(dǎo)航編程 467
9.6.1 功能運行 467
9.6.2 編程方法(C++) 468
9.6.3 編程方法(Python) 469
9.7 機器人自主探索應(yīng)用 470
9.7.1 Nav2+SLAM Toolbox 自主探索應(yīng)用 470
9.7.2 Nav2+Cartographer 自主探索應(yīng)用 473
9.8 本章小結(jié) 476