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

来源:https://www.cnblogs.com/MingruiYu/archive/2020/01/12/12184953.html
-Advertisement-
Play Games

樹莓派智能小車,實現功能:基於超聲波和紅外的自動避障、樹莓派端向PC端的實時圖像傳輸、基於視覺的車道線循跡、基於Tensorflow Object Detection的目標檢測、基於視覺的網球追蹤。 ...


簡介

本項目的GitHub鏈接

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

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

目前我們實現的功能有:

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

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

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

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

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

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

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

配置要求

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

項目架構

我們的源代碼全部放在PythonCode文件夾內。

我們對每個感測器定義了一個類,放在相應的py文件里,由此可以很清晰方便地對每個感測器進行單獨的調試。

名稱以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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、reponse解析 urlopen的返回對象 (1)geturl:返回網頁地址 (2)info:請求反饋對象的meta信息 (3)getcode:返回的http code from urllib import request import chardet """ 解析reponse """ if ...
  • 一、二分法查找 1.二分法查找是建立在已經排序的基礎之上的 2.程式分析是從下到大​排序。 3.這個數組中沒有重覆的元素​。 package com.bjpowernode.java_learning; ​ public class D71_1_ { public static void main( ...
  • 在初學Java的時候,經常能看到教材上的寫法,使用了介面Map來引用一個map,而不是它的具體實現,那麼這樣做的好處是什麼呢? <Effective Java>第52條:通過介面引用對象 作者認為,如果有合適的介面類型存在,那麼對於參數、返回值、變數和域來說,就都應該使用就介面類型進行聲明。 只有當 ...
  • 背景 有處理過生產問題的同學基本都能遇到系統忽然緩慢,CPU突然飆升,甚至整個應用請求不可用。當出現這種情況下,在不影響數據準確性的前提下,我們應該儘快導出jstack和記憶體信息,然後重啟系統,儘快回覆系統的可用性,避免用戶體驗過差。本文針對CPU飆升問題,提供該問題的排查思路,從而能夠快速定位到某 ...
  • 1、性能 對值類型使用非泛型集合類,在把值類型轉換為引用類型,和把引用類型轉換為值類型時,需要進行裝箱和拆箱操作。裝箱和拆箱的操作很容易實現,但是性能損失較大。假如使用泛型,就可以避免裝箱和拆箱操作。 1 ArrayList list=new ArrayList(); 2 list.Add(20); ...
  • 兩段閑話,費曼學習方法是【重點】 當你邁出第一步,就不要收回來,邁步了感到涼,不行我要回到起點重新選擇那還是會退回來的,所以一定要走下去,一步一步都下去,終會走到頂點,就如人類的知識之海是一個園,出生那一刻我們站在了圓點,不後退不轉彎不轉圈的走下去是一條直線,終會走到圓的邊上,成為一個方向的頂尖,甚 ...
  • 開源代碼更新至1.3版本,1.3版本後thunder模塊已經不能下載了(種子和磁力鏈不能下載,http鏈接可以正常下載),所以1.3版本之後就沒再維護代碼了,現在把1.3版本源碼也開源出來。 我也不知道為什麼不能下載了,因為thunder也是別人的開源項目。我並有去深入研究這個模塊。 ...
  • IYUU自動輔種工具,目前能對國內大部分的PT站點自動輔種PT種子、BT種子;同時,附帶的下載模塊可訂閱各站免費種。支持下載器集群,支持多盤位,支持多下載目錄,支持遠程連接等。 1.群暉、威聯通不裝軟體,添加免費種子到transmission、qBittorrent,支持微信通知、郵件通知,支持自定... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...