C++樹莓派機器人開發(fā)實戰(zhàn)指南
定 價:198 元
- 作者:(美)勞埃德·布朗巴赫(Lloyd Brombach) 著
- 出版時間:2024/4/1
- ISBN:9787122446138
- 出 版 社:化學(xué)工業(yè)出版社
- 中圖法分類:TP312.8-62
- 頁碼:327
- 紙張:
- 版次:01
- 開本:16開
本書深入淺出地介紹了構(gòu)建移動機器人平臺所需的綜合知識,涵蓋了硬件和軟件諸多方面。本書以清晰的學(xué)習(xí)路徑和全面的底層邏輯為基石,幫助讀者輕松地構(gòu)建和編程機器人,避免了深入每個科目復(fù)雜部分的困難。書中聚焦于樹莓派與硬件交互的編程,全面覆蓋了從選用機器人控制器的微計算機(即樹莓派)到為車輪驅(qū)動電機供電等系統(tǒng)性知識。讀者可了解并掌握如何利用傳感器檢測障礙物、訓(xùn)練機器人建立地圖并規(guī)劃避障路徑,以及實現(xiàn)代碼的模塊化和與其他機器人項目進(jìn)行代碼互換。此外,本書還詳細(xì)闡述了如何運用樹莓派的GPIO硬件接口端子和現(xiàn)有庫,把樹莓派轉(zhuǎn)變成一個經(jīng)濟(jì)實用且性能卓越的機器人。
本書適合從事自動化、智能機器人、智能硬件、IOT領(lǐng)域的工程師以及樹莓派愛好者閱讀參考,無論是零基礎(chǔ)的初學(xué)者,還是具備計算機科學(xué)、電氣工程或機械工程背景的工程師或者高校師生,都能從本書中獲益。你不僅能學(xué)習(xí)到驅(qū)動電機控制器的編程,還能了解從激光雷達(dá)數(shù)據(jù)構(gòu)建地圖、編寫和實施自主路徑規(guī)劃算法、獨立編寫代碼向電機驅(qū)動控制器發(fā)送路徑點,以及更深入地學(xué)習(xí)機器人建圖和導(dǎo)航的相關(guān)知識。
緒論 001
第1章 選擇并構(gòu)建一個機器人計算機 002
1.1 什么是樹莓派? 002
1.1.1 樹莓派和微控制器有什么區(qū)別呢? 003
1.1.2 樹莓派是機器人控制器的唯一選擇嗎? 003
1.1.3 難道樹莓派只是為學(xué)校、愛好者和玩具而設(shè)計的嗎? 003
1.2 樹莓派型號的概念和應(yīng)用以及為什么不是所有型號都能適合我們的需求 004
1.2.1 為什么樹莓派型號不能適合我們所有的目的? 004
1.2.2 樹莓派Zero型和樹莓派Zero W型 005
1.2.3 樹莓派2B型 006
1.2.4 樹莓派3B型——最好的選擇 006
1.2.5 樹莓派3B+型 007
1.2.6 樹莓派4代 007
1.3 操作系統(tǒng)的選擇 007
1.3.1 Raspbian 008
1.3.2 Ubuntu 008
1.4 操作系統(tǒng)的安裝和設(shè)置 009
1.4.1 在筆記本電腦或臺式電腦上安裝完整的Ubuntu桌面操作系統(tǒng) 010
1.4.2 在樹莓派上安裝Lubuntu系統(tǒng) 010
1.5 編程環(huán)境(IDE)的安裝和設(shè)置 013
1.5.1 在筆記本電腦或臺式電腦上安裝VS Code 013
1.5.2 在樹莓派上安裝Code::Blocks 014
1.6 總結(jié) 015
1.7 問題 015
第2章 GPIO硬件接口引腳的概述及使用 016
2.1 簡介 016
2.2 什么是GPIO引腳 016
2.3 GPIO到底是做什么的呢? 018
2.4 程序員的電子學(xué) 018
2.5 輸出數(shù)據(jù)的類型 021
2.6 輸入數(shù)據(jù)的類型 022
2.7 一些常見的電子硬件 024
2.7.1 面包板 024
2.7.2 作為輸出的GPIO引腳 027
2.7.3 兩種引腳編號系統(tǒng) 028
2.7.4 作為輸入的GPIO引腳 028
2.8 使用C++程序訪問樹莓派的GPIO 030
2.8.1 安裝PIGPIO 030
2.8.2 安裝和設(shè)置PIGPIO庫 031
2.8.3 確保Code::Blocks可以鏈接到PIGPIO 031
2.8.4 運行PIGPIO程序 032
2.9 我們的第一個GPIO項目——hello_blink 032
2.10 控制數(shù)字輸出的數(shù)字輸入——hello_button 034
2.11 GPIO事件的回調(diào)函數(shù) 036
2.12 結(jié)論 038
第3章 機器人平臺 039
3.1 簡介 039
3.2 目標(biāo) 039
3.3 考慮機器人的尺寸大小和運行環(huán)境 040
3.4 差速驅(qū)動與阿克曼(Ackerman)轉(zhuǎn)向的對比 041
3.4.1 差速驅(qū)動 042
3.4.2 阿克曼(Ackerman)轉(zhuǎn)向 042
3.5 現(xiàn)成的機器人平臺 042
3.5.1 大型的預(yù)搭建機器人 042
3.5.2 小型的預(yù)搭建機器人 043
3.6 自制機器人的技巧 044
3.6.1 搭建材料 045
3.6.2 電池 045
3.6.3 傳動系統(tǒng) 045
3.6.4 機器人零件來源 046
3.7 改裝掃地機器人或遙控車 047
3.7.1 帶有接口的掃地機器人 047
3.7.2 與Roomba機器人對接 048
3.7.3 喚醒你的Roomba機器人 051
3.7.4 不帶接口的掃地機器人 051
3.7.5 改裝遙控車和卡車 052
3.8 總結(jié) 053
3.9 問題 053
第4章 機器人電機類型和電機控制 054
4.1 簡介 054
4.2 目標(biāo) 054
4.3 電機的類型 055
4.3.1 交流(AC)電機與直流(DC)電機 055
4.3.2 有刷直流電機 056
4.3.3 伺服電機 056
4.3.4 步進(jìn)電機 057
4.3.5 無刷直流電機(又稱為BLDC) 058
4.4 晶體管和電機驅(qū)動器的介紹 058
4.4.1 最基本的控制:開/關(guān) 058
4.4.2 晶體管 059
4.5 脈沖寬度調(diào)制(PWM) 061
4.5.1 用PWM來創(chuàng)造模擬電壓 061
4.5.2 PWM作為控制信號 062
4.6 電機驅(qū)動器和電機控制器 063
4.6.1 電機驅(qū)動器 063
4.6.2 用L298N雙H橋電機驅(qū)動器控制電機 065
4.7 電機控制器 067
4.8 結(jié)論 068
4.9 問題 068
4.10 挑戰(zhàn) 068
第5章 與傳感器和其他設(shè)備通信 069
5.1 簡介 069
5.2 目標(biāo) 069
5.3 二進(jìn)制(邏輯)信號 069
5.3.1 開關(guān)去抖動 070
5.3.2 輪式編碼器 071
5.3.3 來自模擬傳感器的二進(jìn)制信號 071
5.3.4 二進(jìn)制通信簡介 072
5.4 串行通信入門 072
5.4.1 UART串行通信 072
5.4.2 設(shè)置樹莓派并測試UART串行通信 073
5.4.3 修復(fù)打開串行端口時的錯誤 076
5.5 I2C通信入門 076
5.5.1 在樹莓派上設(shè)置和使用I2C設(shè)備 077
5.5.2 示例和測試程序:hello_i2c_lsm303 078
5.6 結(jié)論 081
5.7 問題 081
第6章 其他有用的硬件 082
6.1 簡介 082
6.2 目標(biāo) 082
6.3 電源 083
6.3.1 5V電源 083
6.3.2 可調(diào)電源 083
6.4 繼電器模塊 084
6.5 邏輯電平轉(zhuǎn)換器 084
6.6 FTDI芯片 085
6.7 Arduino微控制器 086
6.8 Digispark微控制器 086
6.9 總結(jié) 087
6.10 問題 087
第7章 添加計算機來控制機器人 088
7.1 簡介 088
7.2 結(jié)構(gòu) 088
7.3 目標(biāo) 089
7.4 步驟 089
7.4.1 安裝計算機并為其供電 089
7.4.2 將計算機與機器人的其他組件相連 090
7.5 結(jié)論 091
7.6 問題 092
第8章 機器人的控制策略 093
8.1 簡介 093
8.2 結(jié)構(gòu) 093
8.3 目標(biāo) 093
8.4 機器人控制:全局與局部 094
8.5 基本控制回路 095
8.5.1 觀察和比較 095
8.5.2 響應(yīng) 095
8.5.3 影響 096
8.6 開環(huán)控制器和閉環(huán)控制器 097
8.6.1 設(shè)計一個大局觀控制器(也稱為主控制器) 098
8.6.2 設(shè)計一個局部控制器(也稱為進(jìn)程控制器) 100
8.7 結(jié)論 104
8.8 問題 104
第9章 協(xié)調(diào)各個部件 105
9.1 簡介 105
9.2 結(jié)構(gòu) 105
9.3 目標(biāo) 106
9.4 什么是機器人操作系統(tǒng)? 106
9.5 ROS與編寫機器人控制軟件 106
9.6 ROS和商業(yè)機器人產(chǎn)業(yè) 107
9.7 ROS的設(shè)置 107
9.7.1 在你筆記本電腦或臺式機上安裝ROS Melodic 108
9.7.2 在你的樹莓派3B上安裝ROS Kinetic 108
9.8 ROS概述和速成課程 110
9.9 一些有用的建議 115
9.10 創(chuàng)建和編寫ROS包和節(jié)點 116
9.10.1 ROS文件系統(tǒng) 116
9.10.2 創(chuàng)建ROS包 116
9.10.3 編寫ROS程序(節(jié)點) 117
9.10.4 下載、審閱和運行章節(jié)下載程序 123
9.11 使用roslaunch和.launch來簡化工作 124
9.12 結(jié)論 124
9.13 問題 125
第10章 用于機器人導(dǎo)航的地圖構(gòu)建 126
10.1 簡介 126
10.2 目標(biāo) 127
10.3 角度、航向和距離等常規(guī)參數(shù)的規(guī)則 127
10.4 接收傳感器數(shù)據(jù) 128
10.5 占用柵格地圖(OGM) 129
10.6 用傳感器數(shù)據(jù)構(gòu)建占用柵格地圖(OGM) 131
10.6.1 標(biāo)記被占用的單元格 134
10.6.2 標(biāo)記空閑單元格 136
10.6.3 完成建圖 136
10.6.4 將地圖作為ROS消息發(fā)布 136
10.7 ROS中的變換 138
10.7.1 理解變換 138
10.7.2 ROS中如何使用變換 139
10.7.3 使用靜態(tài)變換發(fā)布器發(fā)布變換 140
10.7.4 用變換廣播器從節(jié)點向外發(fā)布變換 141
10.7.5 在節(jié)點中獲得轉(zhuǎn)換數(shù)據(jù) 142
10.7.6 從命令行查看變換數(shù)據(jù) 143
10.8 用Gmapping繪制地圖 143
10.8.1 Gmapping 143
10.8.2 下載Gmapping 144
10.8.3 運行Gmapping和啟動文件中的參數(shù) 144
10.8.4 創(chuàng)建地圖的步驟 145
10.9 用Rviz實現(xiàn)地圖的可視化 146
10.10 保存地圖并在以后使用 147
10.10.1 保存地圖 147
10.10.2 加載先前保存的地圖 148
10.11 總結(jié) 148
10.12 問題 149
第11章 機器人跟蹤和定位 150
11.1 簡介 150
11.2 目標(biāo) 150
11.3 機器人位姿 151
11.3.1 將歐拉角轉(zhuǎn)換為四元數(shù) 152
11.3.2 將四元數(shù)轉(zhuǎn)換為歐拉角 153
11.4 里程計算和航跡推算 153
11.4.1 輪速計 154
11.4.2 計算每個輪子行駛的距離 156
11.4.3 計算機器人移動的總距離 157
11.4.4 計算航向角的變化 157
11.4.5 將機器人中的朝向變化添加到原來的朝向上 158
11.4.6 計算在x和y方向上移動的距離(也被叫作轉(zhuǎn)換) 158
11.4.7 將計算的距離添加到前一個姿態(tài)估計中 158
11.4.8 航位推測 159
11.5 在ROS中發(fā)布姿態(tài)數(shù)據(jù) 160
11.6 里程計數(shù)據(jù)變換發(fā)布 162
11.7 進(jìn)一步跟蹤和定位 164
11.8 基準(zhǔn)點 164
11.9 激光特征跟蹤和定位 165
11.10 GPS和GNSS 166
11.11 基于信標(biāo)的定位系統(tǒng) 166
11.12 總結(jié) 167
11.13 問題 167
第12章 自主運動 168
12.1 簡介 168
12.2 目標(biāo) 168
12.3 ROS機器人運動綜述 168
12.4 電機控制器——simple_diff_drive.cpp 169
12.4.1 simple_diff_drive電機控制器的代碼步驟 170
12.4.2 差動驅(qū)動電機控制器代碼概述 170
12.4.3 差動電機控制器代碼 171
12.5 驅(qū)動器控制器:simple_drive_controller.cpp 176
12.6 結(jié)論 180
12.7 問題 180
第13章 自主路徑規(guī)劃 181
13.1 簡介 181
13.2 目標(biāo) 181
13.3 路徑規(guī)劃方法與挑戰(zhàn) 181
13.3.1 挑戰(zhàn) 182
13.3.2 路徑規(guī)劃方法 182
13.4 障礙物膨脹 183
13.4.1 代價地圖 183
13.4.2 costmap_2d包 184
13.5 A*路徑規(guī)劃 186
13.5.1 A*是如何工作的 187
13.5.2 A*算法的步驟 189
13.5.3 完成A*程序 190
13.6 將A*程序?qū)懗蒖OS節(jié)點 194
13.6.1 標(biāo)準(zhǔn)內(nèi)容、輔助函數(shù)和main() 195
13.6.2 A*節(jié)點的核心:find_path() 203
13.7 結(jié)論 207
13.8 問題 208
第14章 里程計的輪式編碼器 209
14.1 簡介 209
14.2 目標(biāo) 209
14.3 輪式編碼器 209
14.4 光電編碼器 210
14.5 霍爾效應(yīng)編碼器 210
14.6 編碼器的接線 211
14.7 編碼器tick信號發(fā)布——tick_publisher.cpp 212
14.8 結(jié)論 216
14.9 問題 216
第15章 超聲波測距儀 217
15.1 簡介 217
15.2 目標(biāo) 217
15.3 HC-SR04超聲波測距傳感器基礎(chǔ)知識 218
15.4 HC-SR04的接線 218
15.5 超聲波范圍數(shù)據(jù)發(fā)布器——ultrasonic_publisher. cpp 219
15.5.1 超聲波范圍數(shù)據(jù)發(fā)布者步驟 219
15.5.2 超聲波范圍數(shù)據(jù)發(fā)布者代碼 220
15.6 用于物體探測的超聲波范圍數(shù)據(jù) 222
15.7 結(jié)論 223
15.8 問題 223
第16章 慣性測量單元——加速度計,陀螺儀和磁力計 224
16.1 簡介 224
16.2 目標(biāo) 225
16.3 加速度計 225
16.3.1 加速度計的缺點 226
16.3.2 在ROS中發(fā)布IMU數(shù)據(jù) 226
16.3.3 ROS中sensor_msgs::Imu數(shù)據(jù)類型 226
16.3.4 IMU消息發(fā)布者代碼 228
16.4 陀螺儀 230
16.4.1 陀螺儀的缺點 231
16.4.2 向IMU節(jié)點添加陀螺儀數(shù)據(jù) 231
16.5 磁力計 232
16.5.1 磁力計的缺點 232
16.5.2 向IMU節(jié)點添加磁力計數(shù)據(jù) 232
16.6 安裝IMU 234
16.7 總結(jié) 234
16.8 問題 234
第17章 GPS和外部信標(biāo)系統(tǒng) 235
17.1 簡介 235
17.2 目標(biāo) 235
17.3 信標(biāo)系統(tǒng)是如何工作的 236
17.4 GPS和GNSS基礎(chǔ)知識 237
17.5 2cm精度級的GPS/GNSS-RTK 238
17.6 GPS/GNSS的局限性 239
17.7 GPS/GNSS數(shù)據(jù)格式 240
17.7.1 NMEA 數(shù)據(jù)字符串 240
17.7.2 一些關(guān)鍵的緯度/經(jīng)度數(shù)據(jù)表示法 241
17.8 在ROS中發(fā)布GPS/GNSS數(shù)據(jù) 242
17.8.1 ROS軟件包:nmea_navsat_driver 242
17.8.2 安裝 nmea_navsat_driver包 243
17.8.3 閱讀ROS軟件包說明 243
17.8.4 運行帶參數(shù)的nmea_serial_driver節(jié)點 244
17.9 總結(jié) 245
17.10 問題 245
第18章 激光雷達(dá)設(shè)備和數(shù)據(jù) 246
18.1 簡介 246
18.2 目標(biāo) 246
18.3 激光雷達(dá)基礎(chǔ)知識 247
18.4 激光雷達(dá)的局限性 247
18.5 激光雷達(dá)的種類 248
18.5.1 單向(單點)激光雷達(dá) 248
18.5.2 2D激光雷達(dá) 248
18.5.3 3D激光雷達(dá) 249
18.5.4 從機器人吸塵器中獲得激光雷達(dá) 249
18.6 選擇激光雷達(dá)考慮的因素 250
18.7 激光雷達(dá)數(shù)據(jù)消息格式sensor_msgs:: LaserScan 251
18.8 激光雷達(dá)安裝注意事項 253
18.9 配置、運行和測試一個普通的激光雷達(dá)裝置 254
18.10 LaserScan信息的可視化 255
18.11 總結(jié) 258
18.12 問題 258
第19章 相機的實時視覺 259
19.1 簡介 259
19.2 目標(biāo) 259
19.3 圖像是什么 260
19.3.1 圖像屬性 260
19.3.2 像素坐標(biāo)系 261
19.3.3 檢查并安裝所需軟件 261
19.3.4 ROS Kinetic 262
19.3.5 ROS Melodic 262
19.3.6 在ROS中測試OpenCV 263
19.4 圖像處理軟件(OpenCV)和ROS 264
19.4.1 步驟1:在ROS上發(fā)布圖片 264
19.4.2 安裝usb_cam_node 265
19.4.3 運行usb_cam_node 265
19.4.4 測試相機輸出 266
19.4.5 步驟2:在其他節(jié)點訂閱圖片 267
19.4.6 創(chuàng)建你的ROS視覺包 267
19.4.7 編寫圖像消息訂閱者 268
19.4.8 步驟3:使用cv-bridge將ROS使用的RGB圖像轉(zhuǎn)化成OpenCV可處理的BGR圖像 269
19.4.9 步驟4:對圖像實施希望的操作 269
19.4.10 步驟5:發(fā)布任何非圖像數(shù)據(jù)作為自身的ROS信息 270
19.4.11 步驟6:將處理后的圖像轉(zhuǎn)化回RGB格式 270
19.4.12 步驟7:在所屬話題下發(fā)布結(jié)果圖像 270
19.4.13 更多圖片處理基礎(chǔ) 271
19.4.14 核算子、孔徑與塊 271
19.5 使用圖片副本而不是原圖像的重要性 272
19.5.1 關(guān)于光照的問題 272
19.5.2 重新審視步驟4——更多可能的OpenCV操作 272
19.5.3 圖片色彩格式轉(zhuǎn)換函數(shù):cvtColor() 273
19.5.4 圖片濾波函數(shù):blur(),medianBlur(),GaussianBlur() 273
19.5.5 圖片邊緣檢測函數(shù):Canny() 274
19.6 將圖像上的邊緣變?yōu)閿?shù)字線條:HoughLinesP() 275
19.7 圖片顏色空間轉(zhuǎn)換函數(shù):cvtColor()與inRange() 280
19.8 各式各樣有用的ROS工具 283
19.9 高級OpenCV與進(jìn)階 283
19.10 基于云的圖像識別 284
19.11 結(jié)論 284
19.12 問題 284
第20章 傳感器融合 285
20.1 簡介 285
20.2 目標(biāo) 285
20.3 如何讓傳感器融合變得簡單 286
20.4 博世BN0055絕對方向傳感器 286
20.5 改進(jìn)后的測距儀 287
20.6 集成BN0055——硬件和ROS發(fā)布者 288
20.7 整合BN0055——測距節(jié)點 289
20.7.1 第1步:訂閱IMU信息 289
20.7.2 第2步:確認(rèn)方向沒有被標(biāo)記為不使用 289
20.7.3 第3步:將四元數(shù)轉(zhuǎn)換成歐拉角 290
20.7.4 第4步:如果是第一個IMU 信息,則保存偏移信息 290
20.7.5 第5.1步:如果不是第一條IMU信息,則保存 IMU航向 291
20.7.6 第5.2步:將新的航向應(yīng)用于里程計中 291
20.8 第二代傳感器融合——一種更全面的方法 292
20.9 協(xié)方差矩陣 293
20.10 ROS信息中的協(xié)方差矩陣 295
20.11 robot_pose_ekf節(jié)點 296
20.11.1 安裝robot_pose_ekf 296
20.11.2 運行robot_pose_ekf 296
20.12 關(guān)于變換和roslaunch的最后說明 298
20.13 結(jié)論 298
20.14 問題 298
第21章 構(gòu)建并完成一個自主的機器人的編程 299
21.1 簡介 299
21.2 目標(biāo) 300
21.3 第1部分——構(gòu)建物理機器人平臺 300
21.3.1 機器人平臺——總體概覽和零件清單 301
21.3.2 車輪/電機模塊 302
21.3.3 電機驅(qū)動器 303
21.3.4 輪轂 303
21.3.5 電池和充電器 303
21.3.6 底盤/底座 304
21.3.7 計算機 305
21.3.8 激光雷達(dá)或其他測距傳感器 305
21.3.9 輪式編碼器 306
21.3.10 IMU 306
21.3.11 計算機的電壓轉(zhuǎn)換器 306
21.3.12 GPIO集線器分線板 307
21.3.13 相機 307
21.3.14 電壓表 307
21.3.15 其他材料 308
21.3.16 安裝機器人平臺 308
21.3.17 安裝輪轂?zāi)K和腳輪 310
21.3.18 安裝電機驅(qū)動器、端子排和計算機電源 311
21.3.19 準(zhǔn)備好GPIO分線板 311
21.3.20 安裝計算機、GPIO分線板和IMU 312
21.3.21 完成布線并安裝電池 312
21.3.22 安裝激光雷達(dá)和攝像頭 312
21.4 第1部分——結(jié)論 313
21.5 第2部分——為機器人編程 314
21.5.1 程序設(shè)計——總覽 314
21.5.2 為你的機器人編程——詳細(xì)步驟 315
21.5.3 運行你的自主機器人! 324
21.5.4 一些故障排除提示 324
21.6 下一步需要是什么? 325
21.6.1 動態(tài)避障 325
21.6.2 PID控制器 326
21.6.3 一個主控制器,管理各種程序或任務(wù) 326
21.6.4 實現(xiàn)從地圖到地圖的轉(zhuǎn)換(完全定位) 326
21.6.5 請關(guān)注facebook.com/practicalrobotics和 youtube.com/practicalrobotics 326
21.7 結(jié)論 327