JetRacer 是 Waveshare 基於 Jetson Nano Developer Kit 設計的智能小車套件,使用 NVIDIA JetRacer AI 技術。透過一顆前置鏡頭,支援深度學習,建立遙控駕駛與自動視覺巡航等功能。
官方教學
Waveshare 的 JetRacer 官方教學網站非常詳細:
https://www.waveshare.net/wiki/JetRacer_AI_Kit
車體組裝與映像檔燒錄的部份請自行參考官方網站教學。 環境請事先安裝 Jupyter Notebook。
連線方式
開啟 Jetracer 的電源,下圖中車體紅色箭頭處的 OLED 螢幕會顯示一組 IP。
打開瀏覽器依據該 IP 輸入網址:
http://<jetbot_ip_address>:8888
此時會連線到小車,並啟動 Jupyter Notebook , 切換到 /jetracer/notebooks/ 路徑底下,即可看到相關操作的程式碼。
Basic Motion
基礎操作請開啟 basic_motion.ipynb 文件,關鍵參數介紹:
car.steering # 控制前輪左右方向,值域為 [-1, 1]
car.steering_gain # 控制前輪轉向的最大改變角度
car.steering_offset # 若 car.steering = 0,前進方向卻有偏,可透過此值調整
其依據輸入值計算最終方向控制轉向馬達的公式如下:
油門控制亦類似:
car.throttle # 油門大小,值域 [-1, 1]
car.throttle_gain # 控制油門最大值,throttle = +/-1, throttle_gain = 1 時達最高速
值得一提的是,原始設計 steering 為正值時表示左轉,為負值時表示右轉,throttle 為正值時表示前進,為負值時表示後退。如因安裝失誤導致行為顛倒,可自行對該數值乘上 -1 ,不影響使用,且不需要重新組裝小車。
Teleoperation
Jetracer可以透過遊戲手把操控,開啟 teleoperation.ipynb 文件,同時將手把搭配的無線 USB 插到電腦,開啟手把電源後,點擊以下連結:
會看到以下畫面,將畫面中 index 顯示的值填入程式碼。
controller = widgets.Controller(index=0)
此時操作手把,就會在下列 Jupyter Notebook 顯示的畫面看到對應變化:
以 Waveshare 原配的手把為例,需按下手把上 home 鍵,切換到手把亮起兩個紅燈的狀態,此時左搖桿的”左右”對應上圖的 “0”,右搖桿的”前後”對應上圖的”5″,故將對應程式碼設定如下圖紅圈處,run 以後即可透過手把操控小車:
補充說明,如遇到前述的左右或前後方向相反的問題,亦可在藍圈處加上負號,直接控制相反方向。此處也須設置 steering 與 throttle 的參數,就不多重複贅述。
interactive-regression
為了執行前鏡頭輔助的自動巡航功能,需要先蒐集影像訓練 AI 模型,開啟 interactive-regression.ipynb 文件,執行後,會看到下圖畫面:
dataset 與 category 是用於分類資料集的標籤,可預設亦可自訂。接著在預先設計好的跑道上開始蒐集影像,步驟簡述如下:
- 將車輛置於跑道正中,於上圖左的畫面中,沿道路中線選擇一點,該點與車輛的連線是我們希望車輛行進的方向,故此時該虛擬連線應為直線。點擊選擇的位置後,上圖中央的畫面會於該位置顯示一綠圈標記,同時 count + 1
- 將車輛置於跑道偏左,同上原理點擊一點(此時該點與車輛連線應為右斜線,因為我們希望小車往右開回跑道)
- 將車輛置於跑道偏右,同上原理點擊一點(此時該點與車輛連線應為左斜線,因為我們希望小車往左開回跑道)
- 將車輛微幅往前,重複上述步驟,直到完成一圈,或蒐集足夠多的訓練影像,影像總數量會顯示在 count 欄位,並存放在 Jetracer\road_following_A\apex 路徑
- 設定 AI 訓練的疊代次數 epochs
- 按下 train,等待 progress 進度條跑完,依據 loss 大小判斷結果好壞
- 訓練好的模型可按 save model 存放在預設檔名 road_following_model.pth
- 按下 evaluate 並將右側 state 切到 live,可在上圖右的畫面看到一藍圈,如模型正確,藍圈應會顯示在道路中心線上,不論車輛放置於跑道左、中、右側。
以上蒐集影像的步驟也可以參考下面影片,大約 4:30 處:
如有重跑程式而需要重啟鏡頭的操作時,需在 terminal 輸入指令:
sudo systemctl restart nvargus-daemon
Road-following
訓練好模型以後,就可以執行自動巡航功能,讓小車自己在跑道自動駕駛。開啟 road_following.ipynb 文件,設定下列參數:
car.throttle 要依據地面磨擦狀況,太低小車會卡住,太高則容易衝過頭,配合有限的轉彎弧度,無法及時返回跑道。
STEERING_GAIN 則是控制轉向幅度,當你 print 出模型給的 output x 發現偏小時,可透過 STEERING_GAIN 放大,才能有足夠的轉彎幅度來控制方向,但仍會受車體限制。
STEERING_BIAS 則同 car.steering_offset ,用來調整小車直線時偏差的角度。
但 Waveshare 官網的教程程式碼與小車內建程式碼不同,已改為使用 PID 的 PD 控制算法,如下圖,可自行參酌修改:
Reference
Nvidia 官方 github: