樹莓派3B+movidius NCS構建自動駕駛小車

       代碼鏈接在文中

       本人一直以來對無人機以及機器人、自動駕駛感興趣。作爲一個創客愛好者趁着寒假閒來無事,利用手頭積攢的一些開源硬件想製作一個無人駕駛小車。經歷了兩個禮拜的工作後,初步實現了車輛控制、避障、目標檢測與識別、跟蹤等功能。本文將從總體方案、小車控制、目標檢測與識別、避障方法五個方面來介紹我的工作。

1.總體方案

1.1硬件選擇

      一個完整的自動駕駛智能小車至少應當包括傳感器、動力機構、車載處理器以及車身結構。

      車載處理器:一般涉及到圖像處理方面智能機器人都會採樣高性能的處理器來做高層算法計算,如深度學習、路徑規劃等,稱之爲上位機。經典的上位機有英偉達的TX2、Intel NUC等。此外,還需要一個單片機去處理運動控制的計算問題,驅動電機、舵機,稱之爲下位機。爲了節約成本(窮 ==),我們選用了另外一套方案:樹莓派3B+movidius NCS。樹莓派3B不需要多介紹,我們稍微介紹一下movidius NCS。movidius NCS是movidius公司(現屬英特爾)生產的一種神經計算棒(Neural Compute Stick,NCS),專門用來加速計算神經網絡。movidius NCS只有一個打火機大小,使用USB接口。具體SDK以及使用方法可參考其官方網站。我們使用樹莓派進行路徑規劃、傳感器數據讀取以及控制指令輸出。使用movidius NCS計算神經網絡,進行圖像處理。

                                                 

                                                                           圖1:樹莓派3B與movidius NCS

      傳感器:我們使用的傳感器包括一個USB攝像頭,一個磁羅盤以及一個IMU模塊,一個超聲模塊。

      動力結構:我們使用簡單的TT馬達帶動車輪,由於我們設計的是四輪車,爲了保證動力,我們採用四驅模式。使用樹莓派控制TT馬達需要配直流電機驅動模塊。在這裏我們選用的是L298N。一個L298N模塊可以驅動兩個電機。在電力供應上,採用動力系統和計算處理器分開供電的方式。動力系統使用3節18650鋰電池串聯供電,樹莓派、NCS以及各種傳感器使用充電寶供電。

                                                   

                                                                                  圖2:L298N、TT馬達加輪胎

       車身結構:我們選用的是鋁合金加工底盤。底盤一共有兩層,下層用於固定電機、輪胎以及L298N模塊。此外,下層還輸出了固定了一個麪包板。控制機構與動力機構通過麪包板插線進行連接,可以有效防止接線的錯誤。通過銅柱撐起上層底板,上層底板用於固定電池盒、樹莓派和movidius NCS以及充電寶。傳感器也被安裝在上層底盤上。

          

                                                                                  圖3:小車下層底盤

1.2軟件架構

        爲了方便以後對系統進行拓展,我們選用機器人操作系統(ROS)作爲我們的系統框架。ROS的特點是各模塊(進程)之間可以很方便地進行廣播通信,共享數據。目前我們的小車自主駕駛系統有五個進程:電機控制、目標檢測、障礙物探測、路徑規劃以及運動狀態解算。如果讀者不瞭解ROS,那也沒關係,可以將這五個功能整合成一個大程序,唯一的缺點就是不方便添加新的功能模塊。

                                                

                                                                                  圖4:系統框架

 

2.小車控制

2.1電機控制

           在介紹本章之前,先需要介紹一下樹莓派的GPIO。GPIO(GeneralPurposeI/OPorts)意思爲通用輸入/輸出端口,通俗地說,就是一些引腳,可以通過它們輸出高低電平或者通過它們讀入引腳的狀態-是高電平或是低電平。用戶可以通過GPIO口和硬件進行通信。國內常見的樹莓派大多爲40pin,其針腳定義如下:

           

                                                                          圖4:樹莓派針腳定義(引自樹莓派實驗室)

       使用樹莓派GPIO以及L298N模塊驅動電機的原理可參考https://www.jianshu.com/p/775b4fb2c98d,此外,作者自己編寫的控制代碼也會共享給大家,代碼地址爲博主的GitHub(改地址目前只有部分源碼,全部源碼將會在2019-2-24上傳)。

2.2小車控制

        在實現了對電機的控制後,我們可以利用車輪轉速差實現轉向控制;利用轉速實現速度控制。爲了保證控制效果,我們需要利用IMU+磁羅盤模塊實現閉環控制。在這裏我們使用GY85模塊作爲傳感器,該模塊包含了加速度計、陀螺儀和磁羅盤的功能。樹莓派讀取該模塊的方法可參考:https://www.cnblogs.com/hangxin1940/archive/2013/04/05/3000395.html。利用卡爾曼濾波處理數據可得到更加精確的狀態信息。在獲取狀態信息後,我們便可以使用PID控制器實現更加精確的控制。卡爾曼濾波姿態解算以及PID控制器設計都是求助我的同學完成的,技術細節等他發佈在新博客裏。

3.目標檢測

3.1當前檢測算法的實時性問題

       隨着深度學習的發展,基於深度學習的目標檢測算法日漸成熟。基於深度學習的目標檢測算法可以實現多目標檢測,並且在性能上遠超傳統目標檢測算法。基於深度學習的目標檢測算法按照框架結構可以分爲非端到端檢測算法以及端到端的目標檢測算法。非端到端的目標檢測算法大多使用卷積神經網絡提取圖像的特徵,然後通過處理特徵圖來得到檢測框以及物體類別。典型非端到端的算法有Fast-RCNN、Faster-RCNN、SSD等。端到端的目標檢測算法大多使用卷積神經網絡直接回歸檢測框的大小、位置以及物體類別等參數。典型的端到端的檢測算法有YOLO、YOLOv2等。端到端的目標檢測算法由於框架簡單,一般速度比非端到端的算法更快。

       由於受到預算以及載重的限制,博主選取的樹莓派+movidius NCS硬件平臺的算力是有限的。端到端的目標檢測算法目前在GPU平臺上可以實現實時檢測。但是在博主的的硬件平臺上,由於深度神經網絡計算量太大,實時性較差。爲了解決基於深度學習的目標檢測算法在無人機平臺上運行速度較慢的問題,博主提出了兩種解決方法。

3.2 shufflenetV2-YOLOV2方法

        shufflenetV2是曠視提出的一種輕量級神經網絡(ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design ),其具體原理可以通過搜索論文來學習,本文不再闡述。shufflenetV2從計算量和內存兩個角度優化神經網絡的計算過程,經過作者測試,shufflenetV2 0.5x在Intel  i5-4250CPU上幀率可達140FPS。YOLOV2是一種目標檢測框架,其實時性好,檢測準確率高。更重要的是,利用YOLOV2框架可以實現同一模型檢測不同尺寸的輸入照片,在應用時更加的靈活。

       博主基於shufflenetV2的計算優化思想,使用YOLOV2框架訓練了自己的目標檢測模型。具體細節以及代碼見博主的GitHub:https://github.com/ZHURENTAI/faster-yolo。該算法檢測效果如下圖所示,其運算平臺爲一臺處理器爲i5-8250U的筆記本電腦,輸入圖片大小爲544x544,幀率約爲31(CSDN不支持5M以上的GIF,請讀者們原諒渣畫質)。

                                                    

       雖然該算法性能很優越,但是博主最後卻沒能將其應用在小車上,原因是因爲博主的第一代movidius NCS不支持該神經網絡中的一個特殊層。movidius NCS2以及其他平臺應該支持博主的網絡,因此博主將其寫上了給大家作爲參考。

3.2 mobilenet-SSD方法

      爲了適應硬件,我們選取了另外一種方法:mobilenet網絡結合SSD檢測框架的方法。mobilenet源自Google的論文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications。在該論文中提出了一種特殊的卷積形式:深度可分離卷積,利用深度可分離卷積可以大大減少計算量,具體技術細節本文不做闡述,感興趣的讀者可以去搜索資源自學。SSD是一種檢測速度僅次於YOLO的目標檢測算法框架,性能也很優越。博主參考chuanqi305的工作,訓練了自己的模型。博主將兩種方法計算速度進行了對比,測試平臺均爲CPU爲Intel i5-8250U的筆記本電腦:

方法               輸入圖片分辨率 幀率            
shufflenetV2-YOLOV2 544x544         31 
mobilenet-SSD 300x300 12

       檢測效果上來看,作者直觀上觀察mobilenet-SSD算法略優於shufflenetV2-YOLOV2(沒有用標準數據集進行對比,因爲在實際應用時效果往往和標準集有偏差)。

3.3 在movidius NCS上實現目標檢測算法

           mobilenet-SSD算法其實是一個神經網絡,該神經網絡輸入是圖片,輸出是檢測結果,包括檢測框形狀、尺寸、位置以及目標的類別、置信度等。之前已經提到,movidius NCS是一種專門用於計算神經網絡的硬件,在本文中movidius NCS是以樹莓派爲載體的。因此我們只需要將mobilenet-SSD網絡轉化爲movidius NCS可以計算的形式,通過樹莓派讀取攝像頭獲取圖片,然後傳遞給movidius NCS,在movidius NCS中運行mobilenet-SSD並返回結果給樹莓派即可。

        movidius NCS不能直接利用現有的幾種深度學習框架(caffe、tensorfloiw等)的訓練結果,但是利用movidius NCS的SDK可以將caffe和tensorfloiw文件轉化爲特有的graph文件,graph文件就是movidius NCS可以識別的神經網絡文件。SDK的安裝以及使用方法在官方網站中有很詳細的說明。爲方便廣大讀者,博主的GitHub中已經上傳好了graph文件以及調用graph文件實現檢測的python源碼。

4.超聲避障

          待續          由於樹莓派目前不在身邊,目前博主的GitHub中只有目標檢測部分的源碼,其他代碼將會在2019-2-24上傳。博客預計在2019-2-27之前完成更新。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章