原文[Getting started with Jetson Nano and Donkey car aka Autonomous Car],感謝 Fei Cheung 兄賜文~ 以下原文翻譯開始,也請參考機器人王國非強制購買連結。
Jetson Nano是一款針對AI邊緣運算 (注意這個詞最近有點氾濫) 的效能強大又經濟實惠的單板電腦。它只要USD 99,就能讓 maker 社群得以運用機器學習的強大威力。
我用 Raspberry Pi 來玩 Donkey car 有一段時間了。我真的很喜歡 Pi 也感謝社群所做的貢獻。我試過用它來訓練簡易CNN,但要加上更多感測器(例如IMU、Lidar) 之後,Pi的運算能力就明顯不足了。如果是需要大量運算的神經網路模型,在 Pi 上的 FPS就不會太好,甚至根本無法執行。我需要更強大但不能太貴的東西 😛 看看能否在 USD 100以下囉。
Jetson Nano來的正是時候。與Raspberry Pi不同,Jetson Nano 大概在一個月前發布,相關的教學與專案也很少。我花了很大一番功夫才把Jetson nano和Donkey car設定完成,所以決定要寫(也是我第一篇啦😆) 一篇教學,和大家分享如何設定。開始吧。
Jetson Nano方面只需要Jetson Nano主板、micro SD卡與Wi-Fi USB dongle
板子上沒有Wi-Fi 與藍牙讓我有點訝異。我根據 Nvidia的教學 來燒錄映像檔到 SD卡,並購買了建議的 Wi-Fi USB dongle:Edimax EW-7811Un
您只要跟著 NIVIDA原廠教學操作就可以開機了。看到歡迎畫面了嗎?恭喜!
不過… 在測試時,Wi-Fi 每幾分鐘就會斷線,這樣根本沒辦法下載必要的套件。我花了整整兩天 😕 來找答案,下列指令就是解答:
echo “blacklist rtl8192cu” | sudo tee -a /etc/modprobe.d/blacklist.conf
上述指令會關掉一些討厭的驅動程式,Wi-Fi 之後就正常了。另一個比較好的做法是重新編譯驅動程式,請參考本說明。
安裝套件
NVIDIA Jetson nano是一款為了機器學習而生的嵌入式系統,因此當然要安裝機器學習的框架!以下內容也可在 NVIDIA論壇中找到。
先從Tensorflow開始吧!
請在terminal中輸入以下指令:
sudo apt-get install python3-pip libhdf5-serial-dev hdf5-tools
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3 --user
這需要一段時間,機器看起來像是卡住一樣,我的nano花了大概45分鐘。裝完之後別忘了測試一下,確認沒有任何錯誤訊息。
donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>>
Pytorch也一起裝好吧
請在terminal中輸入以下指令:
wget https://nvidia.box.com/shared/static/veo87trfaawj5pfwuqvhl6mzc5b55fbj.whl -O torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl
pip3 install numpy torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl
再次檢查看看有沒有裝好
donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.__version__)
1.1.0a0+b457266
>>> print('CUDA available: ' + str(torch.cuda.is_available()))
CUDA available: True
>>>
最後安裝Keras,Donkey car會用到
我用apt-get 而非 pip,請在終端機輸入以下指令:
sudo apt-get install python3-scipy
sudo apt-get install python3-keras
測試:
donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>>
軟體差不多完成了,來看看硬體吧。
硬體設定
在此不會介紹Donkey car的逐步安裝過程,請參考Donkey Car網站教學,這邊只會介紹幾個關鍵步驟:
- PCA9685 PWM driver
- Camera
更新GPIO函式庫
NVIDIA 已提供了GPIO函式庫,並且與RPi.GPIO的API是一樣的,超棒!所以要從RPi函式庫轉移到Jetson Nano幾乎不用改什麼東西。請根據NVIDIA GitHub說明安裝好函式庫之後就可以開始測試GPIO腳位了。
安裝 PCA9685伺服機模組函式庫,用於控制方向盤與油門
pip3 install Adafruit_PCA9685
請將 PCA9685 接上 Jetson nano。請參考板子上的腳位編號即可:
PCA9685 | Raspberry Pi GPIO |
VCC | 3.3V |
SDL | SDL(3) |
SCL | SCL(5) |
GND | GND |
一如往常,測試接線是否正常。請在終端機中輸入以下指令:
donkey@donkey-desktop:/opt/nvidia$ sudo i2cdetect -y -r 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
請看到位址0x40,這就是PCA9685。更多關於I2C通訊協定請參考本說明。
您的使用者帳號需要加入I2C群組才能存取I2C頻道。設定好之後,請將Pi重新開機才可以使用。請在終端機中輸入以下指令:
sudo usermod -a -G i2c username
sudo reboot
檢查使用者的群組設定:
donkey@donkey-desktop:~$ groups
i2c adm cdrom sudo audio dip video plugdev lpadmin gdm sambashare gpio
搞定。還ok嗎?下一步是設定攝影機。壞消息是 Pi camera 1 無法用於 Jetson Nano。我常用的廣角相機也不行。
重點在於不要選晶片型號為 OV5647 的攝影機,要選用晶片型號為 IMX219 的款式。IMX219驅動程式已經包含在映像檔中。
拉開卡楯 ,把相機排線整齊插入之後再把卡楯插回。請注意排線的方向,兩邊金屬接頭要在同一側。接好之後接上電源應該就沒問題了,攝影機請參考本文。
最後一步:安裝Donkeycar模組
我 fork 了 original donkey car repo 再做了一些修改。您可從我的 repo 下載 Donkey car 函式庫並開始安裝。請在終端機輸入以下指令:
git clone https://github.com/feicccccccc/donkeycar.git
cd donkeycar
pip3 install -e .
有興趣深入了解的話,我做的修改如下:
- Add a new camera class
- Add a default bus to Actuator parts
- Add Int typecasting in Keras.py for a variable to make training works
設定所需的套件大約要45分鐘,請用以下指令建立您的小車資料夾:
donkey@donkey-desktop:~/sandbox$ donkey createcar d2
修改 manag.py 來使用新的攝影機。
#from donkeycar.parts.camera import PiCamera
from donkeycar.parts.camera import CSICamera
設定新的攝影機
#cam = PiCamera(resolution=cfg.CAMERA_RESOLUTION)
#V.add(cam, outputs=['cam/image_array'], threaded=True)
cam = CSICamera(resolution=cfg.CAMERA_RESOLUTION)
V.add(cam, outputs=['cam/image_array'], threaded=False)
差不多都完成了,您可以根據自己的資料集來玩車子了!
donkey@donkey-desktop:~/sandbox/d2$ python3 manage.py drive
請用遠端連線登入 Jetson nano 來控制車子。最酷的地方是可以直接在 Jetson Nano上訓練模型喔!
開心玩吧!
心得
- 在寫本篇文章時,我在垃圾箱找到一個USB Bluetooth dongle。插上 Jetson Nano 居然可以直接用!不需要額外設定就可以連到我的 PS4手把,讚!請根據本文來設定手把。合適的手把在取得資料集時非常方便。
- 方向盤與油門好像會彼此干擾,原因應該是Jetson Nano與馬達都很耗電的緣故。瞬間電流過大所導致的壓降會影響ESC訊號。解法有二:對PCA9685伺服機驅動板使用獨立的電源或加上一個較大的電容來避免壓降。我個人喜歡第二種作法,但當時手邊也沒有電容。所以由下圖可看到我剪了一條USB傳輸線並焊了兩條跳線上去,最後再接到 PCA9685伺服機驅動板。
3. 如果需要完整SD卡映像檔的話,請和我說!(或留言在CAVEDU本文)。很多人要的話我就會放上來 XD