基於樹莓派的智能小車:自動避障、實時圖像傳輸、視覺車道線循跡、目標檢測、網球追蹤

簡介

本項目的GitHub連接html

本項目是學校項目設計課程內的項目,要求是使用一個基於樹莓派的小車來實現一些簡單的功能。python

本項目適合初次接觸樹莓派,但願利用樹莓派及小車配件實現一些簡單功能的同窗們。git

目前咱們實現的功能有:github

  • 自動避障:基於超聲波和紅外,使小車在運行過程當中不會撞上障礙物;
  • 實時圖像傳輸:將樹莓派攝像頭拍攝到的視頻流傳到PC端,並在PC端查看;
  • 視覺車道循跡:基於視覺,使小車沿車道線行駛;
  • 目標檢測:識別並定位攝像頭圖像中的各種常見物體;
  • 網球追蹤:基於視覺,使小車追蹤一個移動的網球,並與網球保持必定距離。

學校提供的小車的商家是慧淨電子,商家提供了一些使用教程,適合初學,基於C語言,實現了一些簡單的紅外避障、紅外尋跡、超聲波避障和攝像頭調用。算法

本項目選用Python做爲編程語言,有幾點緣由:Python相比較C語言更簡明;咱們對Python的掌握狀況更好一些(C語言沒學好啊);方便以後使用tensorflow作一些深度學習的功能。但同時帶來的缺點就是運行速度會差一點。編程

下面咱們會對小車配置、功能實現和使用方法進行詳細的介紹。本文結構以下:api

  • 配置要求
  • 項目架構
  • 準備工做
  • 硬件調試
  • 功能實現(原理介紹)
  • 功能實現(使用教程)

若想成功實現本項目的功能,請:網絡

  • 首先確保完成準備工做
  • 以後進行硬件調試
  • 以後在閱讀過功能實現-原理介紹的基礎上
  • 根據功能實現-使用教程來運行相應程序、實現功能

配置要求

  • 樹莓派3
  • 驅動板(L298N)
  • CSI攝像頭
  • 超聲波測距傳感器
  • 紅外避障傳感器
  • 小車車體 + 4個電機
  • 電腦 (Ubuntu18.04)

項目架構

咱們的源代碼所有放在PythonCode文件夾內。架構

咱們對每一個傳感器定義了一個類,放在相應的py文件裏,由此能夠很清晰方便地對每一個傳感器進行單獨的調試。ssh

名稱以main開頭的文件是實現相應功能的主程序,在主程序裏定義了一個Car類,該類繼承了全部傳感器的類。

準備工做

重裝樹莓派的系統

商家給樹莓派預裝了系統,應該是商家本身改過的,也是幾年前的了。強烈建議本身將樹莓派的系統進行重裝(重裝後opencv和tensorflow的安裝都會簡單不少),推薦安裝樹莓派的官方系統Raspbian。安裝方法百度一下,教程不少,也很簡單。

關於樹莓派教程,推薦樹莓派實驗室|開箱上手必讀,裏面的教程基本準確好用。

使用SSH登陸,操做樹莓派

對樹莓派進行操做的方法有不少:

咱們基本上是使用SSH登陸到樹莓派進行操做的,也就是使用putty登陸。這須要樹莓派和PC在同一個局域網下,咱們選擇讓樹莓派建立一個WiFi熱點,而後讓PC鏈接這個WiFi熱點。方法:建立WiFi熱點並開機自啓動,其中使用了github上一個開源的庫create_ap。同時,還要設置熱點開機自動啓動。另外注意要設置開啓樹莓派的SSH服務,不然putty鏈接會顯示失敗。

更換下載源

使用官方的源由於衆所周知的緣由會很是慢且不穩定,因此要換成國內的源。

OpenCV安裝

使用最新版樹莓派系統,能夠直接用pip3安裝OpenCV。

教程:python3 + opencv

硬件調試

首先須要肯定樹莓派、驅動板、傳感器之間的連線是正確的。

電機

直流電機相關知識

  • 工做原理
  • H橋
  • PWM

電機相關代碼在move.py內。須要注意GPIO端口號的設置,python用的是BCM編碼。

樹莓派GPIO編號

在move.py中,定義了前進、後退、左轉、右轉、停車功能。轉彎是經過左右輪差速實現的。

超聲波測距傳感器

超聲波測距傳感器有關知識

  • 超聲波測距基本原理
  • 超聲波測距程序實現
  • 提高測距準確性的方法

超聲波相關代碼在ultrasound.py內,實現了超聲波測距和對測距進行移動平均來減少偏差。

紅外避障傳感器

紅外避障相關代碼在infrared.py內,InfraredMeasure函數是小車左右的兩個紅外避障傳感器,TrackingMeasure是小車底部兩個紅外尋線傳感器。

注意,紅外避障傳感器傳回0表示前方有障礙物,傳回1表示前方無障礙物。

攝像頭

調用攝像頭須要先在sudo raspi-config中啓用Camera,而後重啓。

python調用攝像頭有兩種方式:

  • 使用picamera
  • 使用opencv

咱們使用的是picamera方式,由於咱們發現使用OpenCV的方式會有延時,它返回的第一幀圖像是在鏡頭初始化那一刻的圖像,而不是主程序請求時的圖像。

具體調用方法參考 樹莓派(Raspberry Pi)中PiCamera+OpenCV的使用

攝像頭相關代碼在camera.py中,其中實現了:

  • 攝像頭初始化
  • 實時圖像傳輸(發送端),注意HOST爲PC在此WiFi網絡下的IP地址(經過ifconfig查看),PORT設置一個和接收端相同的端口號就能夠。

另外注意,程序終止是必定要關閉攝像機(camera.close()),不然下次沒法正常打開。

功能實現(原理介紹)

自動避障

基於超聲波和紅外,使小車在運行過程當中不會撞上障礙物。

主程序爲main_obstacle_avoidance.py,其思想很簡單,超聲波傳感器測出小車距離前方障礙物的距離,兩邊的紅外傳感器測出兩邊是否有障礙物,根據測量結果進行運動決策和電機控制。

實時圖像傳輸

將樹莓派攝像頭拍攝到的視頻流傳到PC端,並在PC端查看。目的是爲了便於攝像頭姿態的調整和圖像處理算法的調試。另外,若是須要的話可使用傳輸到PC的圖像在PC端進行處理(咱們沒有實現此功能)。

可選擇的傳輸協議有兩種:

  • TCP:面向鏈接,提供可靠地服務,無差錯,不丟失,不重複;實時性差,效率低;系統資源要求較多。
  • UDP:能夠無鏈接;盡最大努力交付,即不保證可靠交付;實時性強,效率高;系統資源要求較少。

咱們使用UDP傳輸協議進行圖像傳輸。具體實現主要分爲發送端和接收端兩部分:

  • 發送端:(camera.py VideoTransimssion)
    • 圖像編碼(cv2.imencode)
    • 校驗數據發送(數據長度做爲校驗)
    • 編碼數據發送(socket.sendall)
  • 接收端:(pc_receiver.py)
    • 接收校驗數據(4字節數據)
    • 接收圖像編碼(校驗數據後的第一個數據包)
    • 簡單校驗(校驗數據 == 編碼數據長度)
    • 圖像解碼(cv2.imdecode)
      其中,發送端在樹莓派端運行,接收端在PC端運行。兩者同時運行。

視覺車道循跡

基於視覺,使小車沿車道線行駛。環境要求爲白色的地板,黑色(深色)的車道線。

主程序爲main_lane_tracking.py,其流程大體以下:

  • 車道線檢測
    • 圖像二值化,提取車道線
    • 提取車道線的內側點:在圖像的特定行,從中間向兩側檢索,檢測到0像素點及爲車道線點。圖像左半邊檢測到的點即爲左車道線點,右半邊檢測到的點即爲右車道線點。(爲防止因各類緣由車道線部分缺失,咱們選擇圖像4個行提取4組車道線內側點)
  • 運動控制
    • 運動決策
      • 若是兩側車道線都能檢測到,則直行
      • 若是隻能檢測到一側車道線,則有三種狀況:
        • 該側車道線靠近圖像邊緣,則還能夠繼續直行
        • 該側車道線靠近圖像中央,則急需轉彎,原地旋轉
        • 該側車道線位置適中,則緩慢轉彎,在前進中轉彎
      • 若是兩側車道線都檢測不到,則維持以前的動做
    • 電機控制:根據決策結果,控制小車電機輸出

在本實驗中,車道線檢測部分較容易實現,咱們發現,在這種簡單的環境下,固定閾值的二值化效果比大津法好。另外,由於咱們的車道線偏藍色,咱們選擇提取圖像的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中,具體流程以下:

  • 關注區域裁切:裁掉不可能出現網球的區域
  • 高斯濾波:去除必定噪聲
  • 霍夫圓檢測:檢測出圖像中全部可能存在的圓(視頻中的綠色圓)
  • 針對每一個檢測出的圓的內切正方形:
    • RGB to HSV
    • 利用HSV域計算符合網球顏色的像素點數目
    • 統計上述像素點數目佔比
  • 選出佔比最大的圓,若其佔比大於設定閾值,則認爲是網球(視頻中的紅色圓)

經測試,幀率大概在15幀/s。

運動控制的程序在main_tennis_tracking.py中,具體流程以下:

  • 移動平均:對檢測得網球位置進行移動平均,減少偏差
  • 決策:根據當前網球相對於小車的位置,決策下一步的動做
    • 根據網球x座標決策轉向動做
    • 根據網球半徑r決策前進後退動做
  • 控制:根據決策結果,控制小車電機輸出

目前存在的問題:

  • 咱們使用的小車是4電機四驅差速轉向小車,但在沒有細緻調教的差速控制算法的狀況下,這樣的配置使得在小車在轉彎的時候存在較大的滑動摩擦(a skidding turn),因此轉向時小車存在一個「最低啓動速度」,當PWM的佔空比小於必定值時,小車因爲摩擦力的緣由沒法真的轉起來,在原地「蹩着」,因此要小車轉起來,只能給一個相對大的速度,這樣就很容易轉向過分。
  • 同時,因爲摩擦力,小車在轉向時也存在明顯的車身抖動,使得轉向時拍攝的圖像發飄發糊,致使此時網球檢測得效果也收到影響,進一步影響了轉向追網球的準確性。
  • 網球檢測的效果受光照的影響仍是挺大的,白天光照充足的環境下(白天室外)效果會好不少。

功能實現(使用教程)

自動避障

在樹莓派終端中輸入:

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:

  • 兩者中的HOST均爲PC在此WiFi網絡下的IP地址(經過ifconfig查看)
  • 兩者的PORT設置爲同一個端口號就能夠(eg:8000)。

視覺車道循跡

在樹莓派終端輸入:

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

Notes

All tutorials on Raspberry-Pi | GitHub

相關文章
相關標籤/搜索