本項目的GitHub連接html
本項目是學校項目設計課程內的項目,要求是使用一個基於樹莓派的小車來實現一些簡單的功能。python
本項目適合初次接觸樹莓派,但願利用樹莓派及小車配件實現一些簡單功能的同窗們。git
目前咱們實現的功能有:github
學校提供的小車的商家是慧淨電子,商家提供了一些使用教程,適合初學,基於C語言,實現了一些簡單的紅外避障、紅外尋跡、超聲波避障和攝像頭調用。算法
本項目選用Python做爲編程語言,有幾點緣由:Python相比較C語言更簡明;咱們對Python的掌握狀況更好一些(C語言沒學好啊);方便以後使用tensorflow作一些深度學習的功能。但同時帶來的缺點就是運行速度會差一點。編程
下面咱們會對小車配置、功能實現和使用方法進行詳細的介紹。本文結構以下:api
若想成功實現本項目的功能,請:網絡
咱們的源代碼所有放在PythonCode文件夾內。架構
咱們對每一個傳感器定義了一個類,放在相應的py文件裏,由此能夠很清晰方便地對每一個傳感器進行單獨的調試。ssh
名稱以main開頭的文件是實現相應功能的主程序,在主程序裏定義了一個Car類,該類繼承了全部傳感器的類。
商家給樹莓派預裝了系統,應該是商家本身改過的,也是幾年前的了。強烈建議本身將樹莓派的系統進行重裝(重裝後opencv和tensorflow的安裝都會簡單不少),推薦安裝樹莓派的官方系統Raspbian。安裝方法百度一下,教程不少,也很簡單。
關於樹莓派教程,推薦樹莓派實驗室|開箱上手必讀,裏面的教程基本準確好用。
對樹莓派進行操做的方法有不少:
咱們基本上是使用SSH登陸到樹莓派進行操做的,也就是使用putty登陸。這須要樹莓派和PC在同一個局域網下,咱們選擇讓樹莓派建立一個WiFi熱點,而後讓PC鏈接這個WiFi熱點。方法:建立WiFi熱點並開機自啓動,其中使用了github上一個開源的庫create_ap。同時,還要設置熱點開機自動啓動。另外注意要設置開啓樹莓派的SSH服務,不然putty鏈接會顯示失敗。
使用官方的源由於衆所周知的緣由會很是慢且不穩定,因此要換成國內的源。
使用最新版樹莓派系統,能夠直接用pip3安裝OpenCV。
首先須要肯定樹莓派、驅動板、傳感器之間的連線是正確的。
電機相關代碼在move.py內。須要注意GPIO端口號的設置,python用的是BCM編碼。
在move.py中,定義了前進、後退、左轉、右轉、停車功能。轉彎是經過左右輪差速實現的。
超聲波相關代碼在ultrasound.py內,實現了超聲波測距和對測距進行移動平均來減少偏差。
紅外避障相關代碼在infrared.py內,InfraredMeasure函數是小車左右的兩個紅外避障傳感器,TrackingMeasure是小車底部兩個紅外尋線傳感器。
注意,紅外避障傳感器傳回0表示前方有障礙物,傳回1表示前方無障礙物。
調用攝像頭須要先在sudo raspi-config
中啓用Camera,而後重啓。
python調用攝像頭有兩種方式:
咱們使用的是picamera方式,由於咱們發現使用OpenCV的方式會有延時,它返回的第一幀圖像是在鏡頭初始化那一刻的圖像,而不是主程序請求時的圖像。
具體調用方法參考 樹莓派(Raspberry Pi)中PiCamera+OpenCV的使用。
攝像頭相關代碼在camera.py中,其中實現了:
另外注意,程序終止是必定要關閉攝像機(camera.close()),不然下次沒法正常打開。
基於超聲波和紅外,使小車在運行過程當中不會撞上障礙物。
主程序爲main_obstacle_avoidance.py,其思想很簡單,超聲波傳感器測出小車距離前方障礙物的距離,兩邊的紅外傳感器測出兩邊是否有障礙物,根據測量結果進行運動決策和電機控制。
將樹莓派攝像頭拍攝到的視頻流傳到PC端,並在PC端查看。目的是爲了便於攝像頭姿態的調整和圖像處理算法的調試。另外,若是須要的話可使用傳輸到PC的圖像在PC端進行處理(咱們沒有實現此功能)。
可選擇的傳輸協議有兩種:
咱們使用UDP傳輸協議進行圖像傳輸。具體實現主要分爲發送端和接收端兩部分:
基於視覺,使小車沿車道線行駛。環境要求爲白色的地板,黑色(深色)的車道線。
主程序爲main_lane_tracking.py,其流程大體以下:
在本實驗中,車道線檢測部分較容易實現,咱們發現,在這種簡單的環境下,固定閾值的二值化效果比大津法好。另外,由於咱們的車道線偏藍色,咱們選擇提取圖像的R通道進行二值化。檢測效果如圖:
運動控制部分相對較爲複雜,咱們只採用了一個簡單的邏輯,效果還能夠。
識別並定位攝像頭圖像中的各種常見物體。
主程序爲main_object_detection.py,其調用了TensorFlow Object Detection API,使用了訓練好的的SSDLite目標檢測模型,在樹莓派端進行目標檢測。
TensorFlow安裝方法及TensorFlow Object Detection API配置方法能夠徹底參考此文檔:EdjeElectronics/Tutorial to set up TensorFlow Object Detection API on the Raspberry Pi
或者TensorFlow Object Detection API能夠直接clone這位的 xyc2690/Raspberry_ObjectDetection_Camera,能夠不用配置TensorFlow Object Detection API,下載即用。
咱們使用的SSDLite模型主要優勢是運行速度快、佔用內存小,適合在樹莓派端進行運算。據咱們測試,幀率大概爲0.8幀/s。咱們使用的是樹莓派3,若是是更新的型號,速度會更快一點。
基於攝像頭,使小車追蹤一個移動的網球,並與網球保持必定距離。
主程序在main_tennis_tracking.py中,網球追蹤流程大概以下:
實驗顯示:
在不一樣光照條件下,網球的色調(H)基本上保持一致,範圍大體在25至50 (OpenCV範圍),在可靠明亮的光照條件下,範圍大體在30至40。
網球檢測的程序在detect_new.py中,具體流程以下:
經測試,幀率大概在15幀/s。
運動控制的程序在main_tennis_tracking.py中,具體流程以下:
目前存在的問題:
在樹莓派終端中輸入:
cd PythonCode python3 main_obstacle_avoidance.py
樹莓派發送圖像,在樹莓派終端輸入:
cd PythonCode python3 camera.py
同時,若是想在PC端接收圖像,在PC終端輸入:
cd PythonCode python3 pc_receiver.py
NOTICE:camera.py和pc_receiver.py均須要根據具體狀況配置HOST和POST:
在樹莓派終端輸入:
cd PythonCode python3 main_lane_tracking.py
若是想在PC端接收車道檢測圖像,則在PC終端輸入:
cd PythonCode python3 pc_receiver.py
在樹莓派終端中輸入:
cd PythonCode python3 main_object_detection.py
若是想在PC端接收圖像,則在PC終端輸入:
cd PythonCode python3 pc_receiver.py
NOTICE:Tensorflow Object Detection API 和 ssdlite模型並未上傳至此倉庫,須要自行安裝。兩者的安裝和配置方法請參考此文檔:EdjeElectronics/Tutorial to set up TensorFlow Object Detection API on the Raspberry Pi
; 或者TensorFlow Object Detection API能夠直接clone這位的 xyc2690/Raspberry_ObjectDetection_Camera,能夠不用配置TensorFlow Object Detection API,下載即用。
在樹莓派終端輸入:
cd PythonCode python3 main_tennis_tracking.py
若是想在PC端接收網球檢測圖像,則在PC終端輸入:
cd PythonCode python3 pc_receiver.py