Innehållsförteckning:

Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking: 7 steg (med bilder)
Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking: 7 steg (med bilder)

Video: Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking: 7 steg (med bilder)

Video: Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking: 7 steg (med bilder)
Video: Adeept MARS ROVER Raspberry Pi Smart Car Robot Kit PiCar-B is Coming Soon... 2024, November
Anonim
Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking
Raspberry Pi - Autonom Mars Rover med OpenCV Object Tracking

Drivs av en Raspberry Pi 3, Open CV -objektigenkänning, ultraljudssensorer och växlade likströmsmotorer. Denna rover kan spåra alla föremål den är utbildad för och röra sig på vilken terräng som helst.

Steg 1: Introduktion

Image
Image
Material och programvara krävs
Material och programvara krävs

I denna instruktion kommer vi att bygga en autonom Mars Rover som kan känna igen föremål och spåra dem med programvaran Open CV som körs på en Raspberry Pi 3 med möjlighet att använda en webbkamera eller den ursprungliga hallon Pi -kameran. Den är också utrustad med en ultraljudssensor monterad på en servo för att spåra sin väg i mörka miljöer där kameran inte skulle fungera. Signaler som tas emot från Pi skickas till motorföraren IC (L293D) som driver 4 x 150 varv / min DC -motorer monterade på en kaross byggd med PVC -rör.

Steg 2: Material och programvara krävs

Material och programvara krävs
Material och programvara krävs
Material och programvara krävs
Material och programvara krävs

Material som krävs

  1. Raspberry Pi (Alla utom noll)
  2. Hallon PI -kamera eller en webbkamera
  3. L293D motordrivrutin IC
  4. Robothjul (7x4cm) X 4
  5. Växlade likströmsmotorer (150 varv / min) X 4
  6. PVC -rör för chassi

Programvara krävs

  1. Spackel för SSH i Pi
  2. Öppna CV för objektigenkänning

Steg 3: Bygga Rover -chassit

Bygga Rover -chassit
Bygga Rover -chassit
Bygga Rover -chassit
Bygga Rover -chassit
Bygga Rover -chassit
Bygga Rover -chassit

För att bygga detta PVC -chassi behöver du

  • 2 X 8"
  • 2 X 4"
  • 4 T-leder

Placera PVC-rören i en stege som struktur och sätt in dem i T-fogar. Du kan använda PVC -tätningsmedlet för att göra lederna ännu starkare.

De växlade likströmsmotorerna är anslutna till PVC -rörchassit med hjälp av klämmor och sedan är hjul anslutna till motorerna med hjälp av skruvar.

Steg 4: Bygga ultraljudsmätare

Bygga ultraljudsmätare
Bygga ultraljudsmätare

Ultraljudsavläsarenheten är byggd med en HC-SR04 ultraljudssensor ansluten till en mikro servomotor. Kablar är föranslutna med ultraljudssensorn innan de sätts i plasthuset som är anslutet till servomotorn via skruvar.

Steg 5: Schema och elektriska anslutningar

Schemat och elektriska anslutningar
Schemat och elektriska anslutningar
Schemat och elektriska anslutningar
Schemat och elektriska anslutningar

Gör de elektriska anslutningarna enligt kopplingsschemat.

Steg 6: SSH och Öppna CV -installation

SSH och Open CV Installation
SSH och Open CV Installation

Nu måste vi SSH i vår hallon pi för att installera den nödvändiga programvaran. Vi börjar med SSHing till vår Raspberry Pi. Se till att din Pi är ansluten till samma router som din dator och att du vet att den är IP -adress som tilldelats den av din router. Öppna nu en kommandotolk eller PUTTY om du använder Windows och kör följande kommando.

ssh [email protected]

Din Pi: s IP kan vara annorlunda, min är 192.168.1.6.

Ange nu ditt standardlösenord - "hallon"

Nu när du har SSH till din Pi, låt oss börja med att uppdatera med det här kommandot.

sudo apt-get update && sudo apt-get upgrade

Låt oss installera de utvecklingsverktyg som krävs nu, sudo apt-get install build-essential cmake pkg-config

Därefter måste vi installera några bild -I/O -paket som hjälper vår Pi att hämta olika bildformat från hårddisken.

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

Nu några paket för hämtning av video, livestreaming och optimering av OpenCV -prestanda

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

sudo apt-get install libxvidcore-dev libx264-dev

sudo apt-get install libgtk2.0-dev libgtk-3-dev

sudo apt-get install libatlas-base-dev gfortran

Vi måste också installera Python 2.7 och Python 3 header -filer så att vi kan kompilera OpenCV med pythonbindningar

sudo apt-get install python2.7-dev python3-dev

Hämtar OpenCV -källkod

cd ~

wget -O opencv.zip

packa upp opencv.zip

Hämtar opencv_contrib -förvaret

wget -O opencv_contrib.zip

packa upp opencv_contrib.zip

Det rekommenderas också att använda en virtuell miljö för att installera OpenCV.

sudo pip installera virtualenv virtualenvwrapper

sudo rm -rf ~/.cache/pip

Nu när virtualenv och virtualenvwrapper har installerats måste vi uppdatera vår ~/.profil för att inkludera följande rader längst ner

export WORKON_HOME = $ HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON =/usr/bin/python3 source /usr/local/bin/virtualenvwrapper.sh

Skapa din virtuella python -miljö

mkvirtualenv cv -p python2

växla till den skapade virtuella miljön

källa ~/.profile

workon cv

Installera NumPy

pip installera numpy

Kompilera och installera OpenCV

cd ~/opencv-3.3.0/

mkdir build

cd -byggnad

cmake -D CMAKE_BUILD_TYPE = RELEASE / -D CMAKE_INSTALL_PREFIX =/usr/local / -D INSTALL_PYTHON_EXAMPLES = ON / -D OPENCV_EXTRA_MODULES_PATH = ~/opencv_contrib -3.3.0/modules / -DPLES..

Slutligen kompilera OpenCV

gör -j4

När detta kommando har körts. Allt du behöver göra är att installera det.

sudo gör config

sudo ldconfig

Steg 7: Kör Python -koden för Rover

Image
Image

Skapa en Python -fil som heter tracker.py och lägg till följande kod i den.

sudo nano tracker.py

koda:-

#ASAR -program

#Detta program spårar en röd boll och instruerar en hallonpi att följa den. import sys sys.path.append ('/usr/local/lib/python2.7/site-packages') import cv2 import numpy som np import os import RPi. GPIO som IO IO.setmode (IO. BOARD) IO.setup (7, IO. OUT) IO.setup (15, IO. OUT) IO.setup (13, IO. OUT) IO.setup (21, IO. OUT) IO.setup (22, IO. OUT) def fwd (): IO.output (21, 1) #Left Motor Forward IO.output (22, 0) IO.output (13, 1) #Right Motor Forward IO.output (15, 0) def bac (): IO.output (21, 0)#Vänster motor bakåt IO.output (22, 1) IO.output (13, 0)#Höger motor bakåt IO.output (15, 1) def ryt (): IO.output (21, 0) #Vänster motor bakåt IO.output (22, 1) IO.output (13, 1)#Höger motor fram IO.output (15, 0) def lft (): IO.output (21, 1)#Left Motor forward IO.output (22, 0) IO.output (13, 0) #Right Motor backward IO.output (15, 1) def stp (): IO.output (21, 0)#Left Motor stop IO.output (22, 0) IO.output (13, 0) #Right Motor stop IO.output (15, 0) ############################## #################################################### ####################### def main (): capWebcam = cv2. VideoCapture (0)#deklarera en VideoCapture -objekt och associera till webbkamera, 0 => använd första webbkamera # visa originalupplösning print "default resolution =" + str (capWebcam.get (cv2. CAP_PROP_FRAME_WIDTH)) + "x" + str (capWebcam.get (cv2. CAP_PROP_FRAME_HEIGHT)) capWebcam.set (cv2. CAP_PROP_FRAME_WIDTH, 320.0) # ändra upplösning till 320x240 för snabbare bearbetning capWebcam.set (cv2. CAP_PROP_FRAME_HEIGHT, 240.0) # visa uppdaterad upplösning print "updated resolution =" + str (capWebcam.get (cv2. CAP_PRO_PRO_PRO_PRO_PRO_PRO_PRO_PRO)) + "x" + str (capWebcam.get (cv2. CAP_PROP_FRAME_HEIGHT)) om capWebcam.isOpened () == Falskt: # kontrollera om VideoCapture -objektet var associerat till webbkameran lyckades skriva ut "fel: capWebcam kunde inte nås framgångsrikt / n / n" # om inte, skriv ut felmeddelande för att stoppa os.system ("paus") # pausa tills användaren trycker på en knapp så att användaren kan se felmeddelandet returnera # och avsluta funktionen (som lämnar programmet) # avsluta om medan cv2.waitKey (1)! = 27 och capWebcam.isOpened (): # tills Esc -tangenten trycks ned eller webbkamerans anslutning förloras blnFrameReadSuccessf ully, imgOriginal = capWebcam.read () # läs nästa bildruta om inte blnFrameReadSuccessfully eller imgOriginal är Ingen: # om ramen inte lästes framgångsrikt skriv ut "fel": ramen lästes inte från webbkamera / n " # utskriftsfelmeddelande för att stoppa OS.system ("paus") # paus tills användaren trycker på en knapp så att användaren kan se felmeddelandet bryta # avsluta medan loop (som avslutar programmet) # slut om imgHSV = cv2.cvtColor (imgOriginal, cv2. COLOR_BGR2HSV) imgThreshLow = cv2.inRange (imgHSV, np.array ([0, 135, 135]), np.array ([18, 255, 255])) imgThreshHigh = cv2.inRange (imgHSV, np.array ([165, 135, 135]), np. array ([179, 255, 255])) imgThresh = cv2.add (imgThreshLow, imgThreshHigh) imgThresh = cv2. GaussianBlur (imgThresh, (3, 3), 2) imgThresh = cv2.dilate (imgThh (5, 5), np.uint8)) imgThresh = cv2.erode (imgThresh, np.ones ((5, 5), np.uint8)) intRows, intColumns = imgThresh.shape cirklar = cv2. HoughCircles (imgThresh, cv2. HOUGH_GRADIENT, 5, intRows / 4) # fyll variabla cirklar med alla cirklar i den bearbetade bilden om cirklar är inte Ingen: # denna rad är nödvändig för att programmet inte ska krascha på nästa rad om inga cirklar hittades IO.output (7, 1) för cirkel i cirklar [0]: # för varje cirkel x, y, radie = cirkel # bryta ut x, y och radieutskrift "kulposition x =" + str (x) + ", y =" + str (y) + ", radie =" + str (radie) # skriv ut kulposition och radie obRadius = int (radie) xAxis = int (x) if obRadius> 0 & obRadius100 & xAxis180: print ("Moving Right") ryt () elif xAxis <100: print ("Moving Left") lft () else: stp () else: stp () cv2.circle (imgOriginal, (x, y), 3, (0, 255, 0), -1) # rita en liten grön cirkel i mitten av det detekterade objektet cv2.circle (imgOriginal, (x, y), radie, (0, 0, 255), 3) # rita röd cirkel runt det detekterade objektet # ände för # ände om annars: IO.output (7, 0) cv2.namedWindow ("imgOriginal", cv2. WINDOW_AUTOSIZE) # skapa fönster, använd WINDOW_AUTOSIZE för en fast fönsterstorlek cv2.namedWindow ("imgThresh", cv2. WINDOW_AUTOSIZE) # eller använd WINDOW_NORMAL för att tillåta fönsterändring cv2.imshow ("imgOriginal", imgOri ginal)#show windows cv2.imshow ("imgThresh", imgThresh)#end while cv2.destroyAllWindows ()#remove windows from memory return ###################### #################################################### ############################# if _name_ == "_main_": main ()

Nu är det bara att köra programmet

python tracker.py

grattis! din självkörande rover är redo! Den ultraljuds sensorbaserade navigationsdelen kommer snart att vara klar och jag kommer att uppdatera denna instruerbara.

Tack för att du läser!

Rekommenderad: