C++樹莓派機器人開發實戰指南 Practical Robotics in C++: Build and Program Real Autonomous Robots Using Raspberry Pi (Paperback)

Lloyd Brombach 譯 馬培立//朱貴傑//陳紹平

買這商品的人也買了...

商品描述

本書深入淺出地介紹了建構移動機器人平台所需的綜合知識,涵蓋了硬體和軟體許多面向。
本書以清晰的學習路徑和全面的底層邏輯為基石,幫助讀者輕鬆地建造和編程機器人,避免了深入每個科目複雜部分的困難。
書中聚焦於樹莓派與硬體互動的編程,全面涵蓋了從選用機器人控制器的微型電腦(即樹莓派)到為車輪驅動馬達供電等系統性知識。
讀者可了解並掌握如何利用感測器檢測障礙物、訓練機器人建立地圖並規劃避障路徑,
以及實現程式碼的模組化和與其他機器人專案進行程式碼互換。
此外,本書也詳細說明如何運用樹莓派的GPIO硬體介面端子和現有庫,把樹莓派轉變成一個經濟實用且性能的機器人。
本書適合從事自動化、智慧機器人、智慧硬體、IOT領域的工程師以及樹莓派愛好者閱讀參考,
無論是零基礎的初學者,還是具備電腦科學、電機工程或機械工程背景的工程師或者高校師生,都能從本書中獲益。
你不僅能學習到驅動馬達控制器的編程,還能了解從雷射雷達資料建立地圖、編寫和實施自主路徑規劃演算法、
獨立編寫程式碼向馬達驅動控制器發送路徑點,以及深入學習機器人建圖和導航的相關知識。

目錄大綱

緒論 001
第1章 選擇並建造一個機器人計算機 002
1.1 什麼是樹莓派? 002
1.1.1 樹莓派和微控制器有什麼差別呢? 003
1.1.2 樹莓派是機器人控制器的 選擇嗎? 003
1.1.3 難道樹莓派只是為學校、愛好者和玩具而設計的嗎? 003
1.2 樹莓派型號的概念和應用以及為什麼不是所有型號都能適合我們的需求 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 作業系統的選擇 007
1.3.1 Raspbian 008
1.3.2 Ubuntu 008
1.4 作業系統的安裝與設定 009
1.4.1 在筆記型電腦或桌上型電腦上安裝完整的Ubuntu桌面作業系統 010
1.4.2 在樹莓派上安裝Lubuntu系統 010
1.5 程式設計環境(IDE)的安裝與設定 013
1.5.1 在筆記型電腦或桌上型電腦上安裝VS Code 013
1.5.2 在樹莓派上安裝Code::Blocks 014
1.6 總結 015
1.7 問題 015

第2章 GPIO硬體介面接腳的概述及使用 016
2.1 簡介 016
2.2 什麼是GPIO腳位 016
2.3 GPIO到底是做什麼的呢?018
2.4 程式設計師的電子學 018
2.5 輸出資料的類型 021
2.6 輸入資料的類型 022
2.7 一些常見的電子硬體 024
2.7.1 麵包板 024
2.7.2 作為輸出的GPIO腳位 027
2.7.3 兩種腳位編號系統 028
2.7.4 作為輸入的GPIO腳位 028
2.8 使用C++程式存取樹莓派的GPIO 030
2.8.1 安裝PIGPIO 030
2.8.2 安裝與設定PIGPIO庫 031
2.8.3 確保Code::Blocks可以連結到PIGPIO 031
2.8.4 運行PIGPIO程式 032
2.9 我們的 個GPIO專案-hello_blink 032
2.10 控制數位輸出的數位輸入-hello_button 034
2.11 GPIO事件的回呼函數 036
2.12 結論 038

第3章 機器人平台 039
3.1 簡介 039
3.2 目標 039
3.3 考慮機器人的尺寸大小與運作環境 040
3.4 差速驅動與阿克曼(Ackerman)轉向的比較 041
3.4.1 差速驅動 042
3.4.2 阿克曼(Ackerman)轉向 042
3.5 現成的機器人平台 042
3.5.1 大型的預搭建機器人 042
3.5.2 小型的預搭建機器人 043
3.6 自製機器人的技巧 044
3.6.1 搭建材料 045
3.6.2 電池 045
3.6.3 傳動系統 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 總結 053
3.9 問題 053

第4章 機器人馬達類型和馬達控制 054
4.1 簡介 054
4.2 目標 054
4.3 馬達的類型 055
4.3.1 交流(AC)馬達與直流(DC)馬達 055
4.3.2 有刷直流馬達 056
4.3.3 伺服馬達 056
4.3.4 步進馬達 057
4.3.5 無刷直流馬達(又稱為BLDC) 058
4.4 電晶體和馬達驅動器的介紹 058
4.4.1  基本的控制:開關 058
4.4.2 電晶體 059
4.5 脈衝寬度調變(PWM) 061
4.5.1 用PWM來創造類比電壓 061
4.5.2 PWM作為控制訊號 062
4.6 馬達驅動器和馬達控制器 063
4.6.1 馬達驅動器 063
4.6.2 用L298N雙H橋馬達驅動器控制馬達 065
4.7 馬達控制器 067
4.8 結論 068
4.9 問題 068
4.10 挑戰 068

第5章 與感測器和其他設備通訊 069
5.1 簡介 069
5.2 目標 069
5.3 二進位(邏輯)訊號 069
5.3.1 開關去抖動 070
5.3.2 輪式編碼器 071
5.3.3 來自類比感測器的二進位訊號 071
5.3.4 二進位通訊簡介 072
5.4 串行通訊入門 072
5.4.1 UART串行通訊 072
5.4.2 設定樹莓派並測試UART串列通訊 073
5.4.3 修正開啟序列埠時的錯誤 076
5.5 I2C通信入門 076
5.5.1 在樹莓派上設定並使用I2C設備 077
5.5.2 範例與測試程式:hello_i2c_lsm303 078
5.6 結論 081
5.7 問題 081

第6章 其他有用的硬體 082
6.1 簡介 082
6.2 目標 082
6.3 電源 083
6.3.1 5V電源 083
6.3.2 可調電源 083
6.4 繼電器模組 084
6.5 邏輯電平轉換器 084
6.6 FTDI晶片 085
6.7 Arduino微控制器 086
6.8 Digispark微控制器 086
6.9 總結 087
6.10 問題 087

第7章 新增計算機來控制機器人 088
7.1 簡介 088
7.2 結構 088
7.3 目標 089
7.4 步驟 089
7.4.1 安裝計算機並為其供電 089
7.4.2 將電腦與機器人的其他組件連接 090
7.5 結論 091
7.6 問題 092

第8章 機器人的控制策略 093
8.1 簡介 093
8.2 結構 093
8.3 目標 093
8.4 機器人控制:全域與局部 094
8.5 基本控制迴路 095
8.5.1 觀察與比較 095
8.5.2 響應 095
8.5.3 影響 096
8.6 開環控制器和閉環控制器 097
8.6.1 設計一個大局觀控制器(也稱為主控制器) 098
8.6.2 設計一個局部控制器(也稱為進程控制器) 100
8.7 結論 104
8.8 問題 104

第9章 協調各部件 105
9.1 簡介 105
9.2 結構 105
9.3 目標 106
9.4 什麼是機器人作業系統? 106
9.5 ROS與編寫機器人控制軟體 106
9.6 ROS和商業機器人產業 107
9.7 ROS的設定 107
9.7.1 在你筆記型電腦或桌上型電腦上安裝ROS Melodic 108
9.7.2 在你的樹莓派3B上安裝ROS Kinetic 108
9.8 ROS概述和速成課程 110
9.9 一些有用的建議 115
9.10 創建和編寫ROS包和節點 116
9.10.1 ROS檔案系統 116
9.10.2 創建ROS包 116
9.10.3 編寫ROS程式(節點) 117
9.10.4 下載、審閱及執行章節下載程式 123
9.11 使用roslaunch和.launch來簡化工作 124
9.12 結論 124
9.13 問題 125

第10章 用於機器人導航的地圖建構 126
10.1 簡介 126
10.2 目標 127
10.3 角度、航向和距離等常規參數的規則 127
10.4 接收感測器資料 128
10.5 佔用柵格地圖(OGM) 129
10.6 用感測器資料建構佔用柵格地圖(OGM) 131
10.6.1 標記被佔用的儲存格 134
10.6.2 標記空閒單元格 136
10.6.3 完成建圖 136
10.6.4 將地圖作為ROS訊息發布 136
10.7 ROS中的變換 138
10.7.1 理解變換 138
10.7.2 ROS中如何使用變換 139
10.7.3 使用靜態變換發佈器發布變換 140
10.7.4 用變換廣播器從節點向外發布變換 141
10.7.5 在節點中獲得轉換資料 142
10.7.6 從命令列查看變換資料 143
10.8 用Gmapping繪製地圖 143
10.8.1 Gmapping 143
10.8.2 下載Gmapping 144
10.8.3 運行Gmapping和啟動檔案中的參數 144
10.8.4 創建地圖的步驟 145
10.9 用Rviz實現地圖的視覺化 146
10.10 儲存地圖並在以後使用 147
10.10.1 保存地圖 147
10.10.2 載入先前儲存的地圖 148
10.11 總結 148
10.12 問題 149

第11章 機器人追蹤與定位 150
11.1 簡介 150
11.2 目標 150
11.3 機器人位姿 151
11.3.1 將歐拉角轉換為四元數 152
11.3.2 將四元數轉換為歐拉角 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方向上移動的距離(也被叫作轉換) 158
11.4.7 將計算的距離加到前一個姿態估計中 158
11.4.8 航位推測 159
11.5 在ROS中發布姿態資料 160
11.6 里程計資料變換發布 162
11.7 進一步追蹤與定位 164
11.8 基準點 164
11.9 雷射特徵追蹤與定位 165
11.10 GPS和GNSS 166
11.11 基於信標的定位系統 166
11.12 總結 167
11.13 問題 167

第12章 自主運動 168
12.1 簡介 168
12.2 目標 168
12.3 ROS機器人運動綜述 168
12.4 馬達控制器——simple_diff_drive.cpp 169
12.4.1 simple_diff_drive馬達控制器的程式碼步驟 170
12.4.2 差動驅動馬達控制器程式碼概述 170
12.4.3 差動馬達控制器代碼 171
12.5 驅動器控制器:simple_drive_controller.cpp 176
12.6 結論 180
12.7 問題 180

第13章 自主路徑規劃 181
13.1 簡介 181
13.2 目標 181
13.3 路徑規劃方法與挑戰 181
13.3.1 挑戰 182
13.3.2 路徑規劃方法 182
13.4 障礙物膨脹 183
13.4.1 代價地圖 183
13.4.2 costmap_2d套件 184
13.5 A*路徑規劃 186
13.5.1 A*是如何運作的 187
13.5.2 A*演算法的步驟 189
13.5.3 完成A*程序 190
13.6 將A*程式寫成ROS節點 194
13.6.1 標準內容、輔助函數與main() 195
13.6.2 A*節點的核心:find_path() 203
13.7 結論 207
13.8 問題 208

第14章 里程計的輪式編碼器 209
14.1 簡介 209
14.2 目標 209
14.3 輪式編碼器 209
14.4 光電編碼器 210
14.5 霍爾效應編碼器 210
14.6 編碼器的接線 211
14.7 編碼器tick訊號發布-tick_publisher.cpp 212
14.8 結論 216
14.9 問題 216

第15章 超音波測距儀 217
15.1 簡介 217
15.2 目標 217
15.3 HC-SR04超音波測距感測器基礎知識 218
15.4 HC-SR04的接線 218
15.5 超音波範圍資料發佈器-ultrasonic_publisher. cpp 219
15.5.1 超音波範圍資料發布者步驟 219
15.5.2 超音波範圍資料發布者代碼 220
15.6 用於物體偵測的超音波範圍資料 222
15.7 結論 223
15.8 問題 223

第16章 慣性測量單元-加速度計,陀螺儀和磁力計 224
16.1 簡介 224
16.2 目標 225
16.3 加速度計 225
16.3.1 加速度計的缺點 226
16.3.2 在ROS中發布IMU數據 226
16.3.3 ROS中sensor_msgs::Imu資料類型 226
16.3.4 IMU訊息發布者代碼 228
16.4 陀螺儀 230
16.4.1 陀螺儀的缺點 231
16.4.2 將陀螺儀資料新增至IMU節點 231
16.5 磁力計 232
16.5.1 磁力計的缺點 232
16.5.2 在IMU節點上新增磁力計資料 232
16.6 安裝IMU 234
16.7 總結 234
16.8 問題 234

第17章 GPS和外部信標系統 235
17.1 簡介 235
17.2 目標 235
17.3 信標系統是如何運作的 236
17.4 GPS和GNSS基礎知識 237
17.5 2cm精度級的GPSGNSS-RTK 238
17.6 GPSGNSS的限制 239
17.7 GPSGNSS資料格式 240
17.7.1 NMEA 資料字串 240
17.7.2 一些關鍵的緯度經度資料表示法 241
17.8 在ROS中發布GPSGNSS資料 242
17.8.1 ROS軟體包:nmea_navsat_driver 242
17.8.2 安裝 nmea_navsat_driver包 243
17.8.3 閱讀ROS軟體包說明 243
17.8.4 運行帶參數的nmea_serial_driver節點 244
17.9 總結 245
17.10 問題 245

第18章 雷射雷達設備與資料 246
18.1 簡介 246
18.2 目標 246
18.3 光達基礎知識 247
18.4 雷射雷達的限制 247
18.5 雷射雷達的種類 248
18.5.1 單向(單點)雷射雷達 248
18.5.2 2D雷射雷達 248
18.5.3 3D光達 249
18.5.4 從機器人吸塵器中獲得雷射雷達 249
18.6 選擇光達考慮的因素 250
18.7 雷射雷達資料訊息格式sensor_msgs:: LaserScan 251
18.8 雷射雷達安裝注意事項 253
18.9 配置、運轉和測試一個普通的光達裝置 254
18.10 LaserScan資訊的可視化 255
18.11 總結 258
18.12 問題 258

第19章 相機的即時視覺 259
19.1 簡介 259
19.2 目標 259
19.3 影像是什麼 260
19.3.1 影像屬性 260
19.3.2 像素座標系 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上發布圖片 264
19.4.2 安裝usb_cam_node 265
19.4.3 運行usb_cam_node 265
19.4.4 測試相機輸出 266
19.4.5 步驟2:在其他節點訂閱圖片 267
19.4.6 創建你的ROS視覺包 267
19.4.7 編寫圖像訊息訂閱者 268
19.4.8 步驟3:使用cv-bridge將ROS所使用的RGB影像轉換成OpenCV可處理的BGR影像 269
19.4.9 步驟4:對影像實施希望的操作 269
19.4.10 步驟5:發布任何非影像資料作為自身的ROS資訊 270
19.4.11 步驟6:將處理後的影像轉換回RGB格式 270
19.4.12 步驟7:在所屬主題下發布結果圖像 270
19.4.13  多圖片處理基礎 271
19.4.14 核算子、孔徑與塊 271
19.5 使用圖片副本而非原始影像的重要性 272
19.5.1 關於光照的問題 272
19.5.2 重新檢視步驟4— 多可能的OpenCV操作 272
19.5.3 圖片色彩格式轉換函數:cvtColor() 273
19.5.4 圖片濾波函數:blur(),medianBlur(),GaussianBlur() 273
19.5.5 圖片邊緣偵測函數:Canny() 274
19.6 將影像上的邊緣變成數位線條:HoughLinesP() 275
19.7 圖片顏色空間轉換函數:cvtColor()與inRange() 280
19.8 各式各樣有用的ROS工具 283
19.9 OpenCV與進階 283
19.10 基於雲端的影像辨識 284
19.11 結論 284
19.12 問題 284

第20章 感測器融合 285
20.1 簡介 285
20.2 目標 285
20.3 如何讓感測器融合變得簡單 286
20.4 博世BN0055 方向感測器 286
20.5 改良後的測距儀 287
20.6 整合BN0055-硬體和ROS發布者 288
20.7 整合BN0055—測距節點 289
20.7.1  步:訂閱IMU資訊 289
20.7.2 第2步:確認方向沒有被標記為不使用 289
20.7.3 第3步:將四元數轉換成歐拉角 290
20.7.4 第4步:如果是 個IMU 信息,則保存偏移信息 290
20.7.5 第5.1步:如果不是 條IMU訊息,則保存 IMU航向 291
20.7.6 第5.2步:將新的航向應用於里程計 291
20.8 第二代感測器融合-一種 全面的方法 292
20.9 協方差矩陣 293
20.10 ROS資訊中的協方差矩陣 295
20.11 robot_pose_ekf節點 296
20.11.1 安裝robot_pose_ekf 296
20.11.2 運行robot_pose_ekf 296
20.12 關於變換和roslaunch的 說明 298
20.13 結論 298
20.14 問題 298

第21章 建造並完成一個自主的機器人的程式設計 299
21.1 簡介 299
21.2 目標 300
21.3 部分-建構實體機器人平台 300
21.3.1 機器人平台-總體概覽與零件清單 301
21.3.2 車輪馬達模組 302
21.3.3 馬達驅動器 303
21.3.4 輪圈 303
21.3.5 電池和充電器 303
21.3.6 底盤底座 304
21.3.7 計算機 305
21.3.8 雷射雷達或其他測距感測器 305
21.3.9 輪式編碼器 306
21.3.10 IMU 306
21.3.11 計算機的電壓轉換器 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 安裝輪轂模組和腳輪 310
21.3.18 安裝馬達驅動器、端子排及電腦電源 311
21.3.19 準備GPIO分線板 311
21.3.20 安裝計算機、GPIO分線板及IMU 312
21.3.21 完成佈線並安裝電池 312
21.3.22 安裝光達與攝影機 312
21.4 部分-結論 313
21.5 第2部分-為機器人編程 314
21.5.1 程式設計-總覽 314
21.5.2 為你的機器人編程-詳細步驟 315
21.5.3 運作你的自主機器人! 324
21.5.4 一些故障排除提示 324
21.6 下一步需要是什麼? 325
21.6.1 動態避障 325
21.6.2 PID控制器 326
21.6.3 一個主控制器,管理各種程式或任務 326
21.6.4 實現從地圖到地圖的轉換( 定位) 326
21.6.5 請看facebook.compracticalrobotics和 youtube.compracticalrobotics 326
21.7 結論 327