簡介
Michal Nand[1] 在網站 HACKADAY.IO 上通過博文 Motoku Uprising ?Deep Neural Network 介紹了他利用卷積神經網絡來幫助控制巡線智能車更加平穩(wěn)快速運行的技術方案。特別是對神經網絡的結構、訓練、部署等方面進行了詳細的介紹。
智能車的任務相對比較簡單,就是在平面賽道上,沿著彩色導引線(大部分是黑色)從出發(fā)點運行到終點并折返到出發(fā)點。其中賽道上一段有一塊磚頭作為障礙物。
▲ 利用神經網絡控制的巡線智能車
在作者的方案中,智能車運行大部分控制算法都采用了常規(guī)的 PID、邏輯判斷都算法。他使用了 CNN 根據車模運行過程中,通過傳感器搜集到的二維路面數據來對賽道的種類進行分類判斷,并通過調整車模速度來適應不同賽道的情況,達到又快又穩(wěn)的目的。
□ 機械結構
1. 硬件構成
這款智能車的硬件配置包括有:
嵌入式控制器:STM32F303,Cortex M4F 72MHz
電機驅動器:使用了 TI DRV8834 低電壓雙相步進電機驅動器
電機型號:Pololu HP 電機,減速齒輪箱 1:30,帶有磁編碼器
輪胎:Poloku 28mm 的輪胎,高黏著力
慣性導航器件:LSM6DS0
巡線傳感器:八個綠光(540nm)光電傳感器,三個紅外障礙日干起
電源:180mAh, LiPol 2S
編程結構:使用 USB 通過 Bootloader 完成程序下載。
▲ 智能車的硬件構成
2. 組成器件
□ 控制算法
1. 控制調試界面
“磨刀不誤砍柴工”。作者還是利用 OPENGL 開發(fā)了用于調試的應用軟件??梢酝ㄟ^界面:
顯示八個巡線光電傳感器的原始數值
顯示電機的狀態(tài):速度、編碼器值
顯示慣性傳感器的狀態(tài);
顯示神經網絡分類處理過程
顯示通過串口獲得的 原始數據
▲ 編程調試界面
2. 智能車控制軟件要點
智能車軟件的主要的功能和指標為:
通過二次插值算法,通過八個光電傳感器獲得更加精確的賽道到引線位置
主程序控制頻率為:200Hz
方向調節(jié)器:采用 PD 進行方向控制
電機速度控制:采用雙串級 PID 控制完成電機速度控制
對賽道到引線預測:在直線賽道加速前行;在曲線拐彎時剎車慢行;通過深度神經網絡進行賽道識別和控制
控制軟件使用 C++編程
神經網絡訓練:采用 GPU 加速網絡訓練
▲ 智能車的軟件控制框架
3. 神經網絡用于引導線的預測
利用深度卷積神經網絡完成對導引線的預測和分類:
根據導引線的種類控制運行速度:直線時快速通過,曲線時減速慢行
使用 DenseNet:稠密連接卷積神經網絡完成對賽道引導線類型的分類
輸入數據為 8×8 傳感器數據矩陣??偣灿邪藗€配列成直線的光電傳感器,使用運行前后相鄰八條數據組成 8×8 的數據矩陣
輸出物種曲線類型:兩種右拐,兩種左拐,一種直線
▲ 神經網絡結構圖
訓練樣本采用人工生成的仿真數據訓練神經網絡:
訓練樣本的個數:25000
測試樣本的個數:5000
數據增強:Luma 噪聲, White 噪聲
▲ 輸入訓練數據樣本
下圖給出了 DenseNet 的網絡結構。由于是部署在單片機 STM303 中允許,作者在網絡的魯棒性以及運行速度方面進行了權衡。網絡運行頻率為 200Hz,所以網絡執(zhí)行時間必須小于 5 毫秒。為了達到這個目的,作者選擇了 DenseNet 來提高計算效率,它比純卷積神經網絡使用更少的卷積核。
▲ 神經網絡的結構
最終網絡的識別準確率達到了 95% 的精度。
4. 網絡最終結構
CNN 神經網絡的結果參數如下:
?
▲ 神經網絡的各層結構參數
5. 將網絡部署到單片機中
為了能夠在 32 位單片機中執(zhí)行神經網絡,對網絡進行了如下的改動:
將所有的浮點數修改成 int8_t
將尺度權重轉換到 8bit 范圍
使用雙緩存技巧節(jié)省內容,公用兩個內存緩存來計算所有層的數據
▲ 雙內存緩存的模式
※ 結論
通過本文作者介紹的車??刂浦械?CNN 網絡的應用,了解了對于嵌入式單片機中使用神經網絡的一般方法。
本文中的神經網絡應用還屬于輔助控制方面。也許通過部署更加強大算力的單片機,使用更加復雜的算法可以完成智能車自主學習的目標。這方面也為今年全國大學生智能汽車競賽中的 AI 電磁組給出了一定的參考意義。
參考資料
[1]Michal Nand: https://hackaday.io/michalkenshin