- Būtina aparatinė įranga:
- Programavimo reikalavimas:
- Apdorojimo nustatymas naudojant „Raspberry Pi“:
- Grandinės schema:
- „Raspberry Pi“ kamuolio sekimo programa:
- „Raspberry Pi“ kamuolio sekimo roboto darbas:
Robotikos, dirbtinio intelekto ir mašininio mokymosi sritis sparčiai vystosi, todėl artimiausioje ateityje ji tikrai pakeis žmonijos gyvenimo būdą. Manoma, kad robotai supranta ir sąveikauja su realiuoju pasauliu per jutiklius ir mašininio mokymosi procesus. Vaizdo atpažinimas yra vienas iš populiariausių būdų, kaip manoma, kad robotai supranta objektus, žiūrėdami į realų pasaulį per fotoaparatą, kaip ir mes. Šiame projekte leiskite naudoti „ Raspberry Pi“ galią, kad sukurtumėte robotą, kuris galėtų sekti kamuolį ir sekti jį taip, kaip ir futbolą žaidžiantys robotai.
„OpenCV“ yra labai garsus ir atviro kodo įrankis, naudojamas vaizdų apdorojimui, tačiau šioje pamokoje, kad viskas būtų paprasta, naudojame „Processing IDE“. Kadangi apdorojimas ARM taip pat išleido GPIO biblioteką apdoroti, mums nebereikės pereiti tarp python ir apdorojimo, kad galėtume dirbti su „Raspberry Pi“. Skamba šauniai, tiesa? Taigi pradėkime.
Būtina aparatinė įranga:
- Avietė Pi
- Kameros modulis su juostiniu kabeliu
- Roboto važiuoklė
- Pavarų varikliai su ratu
- L293D variklio vairuotojas
- Elektros bankas ar bet kuris kitas nešiojamas maitinimo šaltinis
Programavimo reikalavimas:
- Monitorius ar kitas „Raspberry pi“ ekranas
- Klavišų lenta arba pelė Pi
- Apdorojama ARM programinė įranga
Pastaba: programuojant privaloma turėti ekraną, prijungtą prie Pi per laidus, nes tik tada galima peržiūrėti fotoaparato vaizdo įrašą
Apdorojimo nustatymas naudojant „Raspberry Pi“:
Kaip sakyta anksčiau, „Raspberry Pi“ programavimui naudosime apdorojimo aplinką, o ne numatytąjį pitono naudojimo būdą. Taigi, atlikite šiuos veiksmus:
1 žingsnis: - Prijunkite „Raspberry Pi“ prie monitoriaus, klaviatūros ir pelės ir įjunkite.
2 žingsnis: - Įsitikinkite, kad Pi yra prijungtas prie aktyvaus interneto ryšio, nes ketiname atsisiųsti keletą dalykų.
3 žingsnis: - Spustelėkite „Processing ARM“, kad atsisiųstumėte „Raspberry Pi“ apdorojimo IDE. Atsisiuntimas bus ZIP failo forma.
4 žingsnis: - Kai atsisiųsite, išskleiskite failus į savo ZIP aplanką pageidaujamame kataloge. Aš ką tik ištraukiau jį savo darbalaukyje.
5 žingsnis: - Dabar atidarykite ištrauktą aplanką ir spustelėkite failą, pavadintą apdorojimas. Jis turėtų atidaryti langą, kaip parodyta žemiau.
6 žingsnis: - Tai aplinka, kurioje mes rašysime savo kodus. Žmonėms, kurie yra susipažinę su „Arduino“, nesistenkite TAIP, IDE atrodo panašiai kaip „Arduino“, taip pat ir programa.
7 žingsnis: - Norint, kad mūsų rutulio sekimo programa veiktų, mums reikia dviejų bibliotekų, kad įdiegtumėte, tada tiesiog spustelėkite „ Eskizas -> Importuoti biblioteką -> Pridėti biblioteką“ . Bus atidarytas toks dialogo langas.
8 žingsnis: - Norėdami rasti „Raspberry Pi“ ir paspauskite „Enter“, naudokite viršutinį kairįjį teksto laukelį, o jūsų paieškos rezultatas turėtų atrodyti panašiai.
9 žingsnis: - Ieškokite bibliotekų pavadinimu „GL Video“ ir „Hardware I / O“ ir spustelėkite „Install“, kad jas įdiegtumėte. Įsitikinkite, kad įdiegėte abi bibliotekas.
10 žingsnis: - atsižvelgiant į jūsų internetą, diegimas užtruks kelias minutes. Kai tai atliksime, būsime pasirengę apdoroti programinę įrangą.
Grandinės schema:
Šio „ Raspberry Pi“ kamuolio sekimo projekto schema parodyta žemiau.
Kaip matote, grandinėje yra PI kamera, variklio tvarkyklės modulis ir pora variklių, prijungtų prie „Raspberry pi“. Visą grandinę maitina „Mobile Power“ bankas (kurį AAA baterija rodo aukščiau esančioje grandinėje).
Kadangi „Raspberry Pi“ smeigtukų detalės neminimos, smeigtukus turime patikrinti naudodami žemiau pateiktą paveikslėlį
Norėdami vairuoti „Motor“, mums reikia keturių kaiščių (A, B, A, B). Šie keturi kaiščiai yra sujungti atitinkamai iš GPIO14,4,17 ir 18. Oranžinė ir balta viela kartu sudaro vieno variklio jungtį. Taigi mes turime dvi tokias poras dviem varikliams.
Varikliai yra prijungti prie „ L293D“ variklio tvarkyklės modulio, kaip parodyta paveikslėlyje, o vairuotojo modulį maitina maitinimo bankas. Įsitikinkite, kad maitinimo banko įžeminimas yra prijungtas prie „Raspberry Pi“ žemės, tik tada jūsų ryšys veiks.
Tai reiškia, kad mes baigėme savo aparatinės įrangos ryšį, grįžkime į savo apdorojimo aplinką ir pradėkime programuoti, kad išmokytume robotą sekti kamuolį.
„Raspberry Pi“ kamuolio sekimo programa:
Visa šio projekto apdorojimo programa pateikiama šio puslapio pabaigoje, kurią jūs tiesiogiai naudojate. Toliau paaiškinau kodo veikimą, kad galėtumėte jį naudoti kitiems panašiems projektams.
Programa koncepcija yra labai paprasta. Nors projekto tikslas yra susekti kamuolį, mes iš tikrųjų to nedarysime. Mes tiesiog nustatysime rutulį pagal jo spalvą. Kaip visi žinome, vaizdo įrašai yra ne kas kita, o nepertraukiami nuotraukų rėmai. Taigi kiekvieną nuotrauką darome ir padalijame į taškus. Tada mes palyginame kiekvieną pikselių spalvą su rutulio spalva; jei randa atitikmenį, galime sakyti, kad radome kamuolį. Turėdami šią informaciją, mes taip pat galime nustatyti kamuolio padėtį (pikselių spalvą) ekrane. Jei padėtis yra toli kairėje, mes perkeliame robotą į dešinę, jei padėtis yra dešinėje, perkeliame robotą į kairę, kad pikselių padėtis visada liktų ekrano centre. Norėdami pamatyti aiškų vaizdą, galite žiūrėti „Daniel Vifman“ vaizdo įrašą iš „Computer Vision“.
Kaip visada, mes pradedame importuoti dvi atsisiųstas bibliotekas. Tai galima padaryti šiomis dviem eilutėmis. Aparatūros įvesties / išvesties biblioteka naudojama norint pasiekti PI GPIO kaiščius tiesiai iš apdorojimo aplinkos, „glvideo“ biblioteka naudojama norint pasiekti „Raspberry Pi“ kameros modulį.
importo perdirbimas.io. *; importuoti gohai.glvideo. *;
Sąrankos funkcijos viduje mes inicijuojame išvesties kaiščius, kad valdytumėte variklį, taip pat gauname vaizdo įrašą iš „pi“ kameros ir dydį nustatome 320 * 240 dydžio lange.
negaliojanti sąranka () {dydis (320, 240, P2D); vaizdo įrašas = naujas „GLCapture“ (šis); video.start (); trackColor = spalva (255, 0, 0); GPIO.pinMode (4, GPIO.OUTPUT); GPIO.pinMode (14, GPIO.OUTPUT); GPIO.pinMode (17, GPIO.OUTPUT); GPIO.pinMode (18, GPIO.OUTPUT); }
Negaliojančiu lygiosiomis yra tarsi begalinis ciklas kodas viduje šio ciklo bus vykdyti tol, kol programa yra nutrauktas. Jei yra fotoaparato šaltinis, mes skaitome iš jo išeinantį vaizdo įrašą
void draw () {background (0); jei (video.available ()) {video.read (); }}
Tada mes pradedame skaidyti vaizdo kadrą į taškus. Kiekvieno taško vertė yra raudona, žalia ir mėlyna. Šios vertės saugomos kintamuosiuose r1, g1 ir b1
for (int x = 0; x <video.width; x ++) {for (int y = 0; y <video.high; y ++) {int loc = x + y * video.width; // Kas yra dabartinė spalvų spalva currentColor = video.pixels; plūdė r1 = raudona (currentColor); plūdė g1 = žalia (currentColor); plūdė b1 = mėlyna (currentColor);
Norėdami iš pradžių nustatyti kamuolio spalvą, turime spustelėti spalvą. Spustelėjus kamuoliuko spalva bus išsaugota kintamajame, vadinamame „ trackColour“ .
void mousePressed () {// Išsaugoti spalvą ten, kur spustelėjama pele trackColor kintamasis int loc = mouseX + mouseY * video.width; trackColor = video.pixels; }
Turėdami takelio spalvą ir esamą spalvą, turime jas palyginti. Šiame palyginime naudojama dist funkcija. Jis patikrina, ar dabartinė spalva yra artima takelio spalvai.
plūdė d = dist (r1, g1, b1, r2, g2, b2);
Nuo dist vertė bus lygi nuliui ir tikslią rungtynių. Taigi, jei dist reikšmė yra mažesnė už nurodytą vertę (pasaulio rekordas), manome, kad radome takelio spalvą. Tada mes gauname to taško vietą ir saugome jį kintamajame arčiausiai X ir arčiausiai Y, kad rastume kamuolio vietą
jei (d <worldRecord) {worldRecord = d; artimiausiasX = x; arčiausiaiY = y; }
Taip pat aplink rastą spalvą nupiešiame elipsę, nurodydami, kad spalva rasta. Pozicijos vertė taip pat atspausdinta ant konsolės, tai labai padės derinant.
if (worldRecord <10) {// Nubrėžkite apskritimą prie stebimo taško užpildo (trackColor); insultasSvoris (4,0); insultas (0); elipsė (artimiausiaX, artimiausiaY, 16, 16); println (artimiausiasX, artimiausiasY);
Galiausiai galime palyginti artimiausių X ir artimiausių Y padėtį ir sureguliuoti variklius taip, kad spalva patektų į ekrano vidurį. Žemiau pateiktas kodas naudojamas robotui pasukti į dešinę, nes nustatyta, kad spalvos X padėtis yra kairėje ekrano pusėje (<140)
if (artimiausiasX <140) {GPIO.digitalWrite (4, GPIO.HIGH); GPIO.digitalWrite (14, GPIO.HIGH); GPIO.digitalWrite (17, GPIO.HIGH); GPIO.digitalWrite (18, GPIO.LOW); vėlavimas (10); GPIO.digitalWrite (4, GPIO.HIGH); GPIO.digitalWrite (14, GPIO.HIGH); GPIO.digitalWrite (17, GPIO.HIGH); GPIO.digitalWrite (18, GPIO.HIGH); println („Pasukite į dešinę“); }
Panašiai galime patikrinti X ir Y padėtį, kad valdytume variklius reikiama kryptimi. Kaip visada, visą programą galite rasti puslapio apačioje.
„Raspberry Pi“ kamuolio sekimo roboto darbas:
Kai būsite pasirengę aparatinei įrangai ir programai, pats laikas smagiai praleisti laiką. Prieš bandydami savo robotą ant žemės, turėtume įsitikinti, kad viskas veikia gerai. Prijunkite savo Pi, kad galėtumėte stebėti ir paleisti apdorojimo kodą. Vaizdo kanalą turėtumėte pamatyti mažame lange. Dabar įneškite rutulį į rėmo vidų ir spustelėkite jį, kad išmokytumėte robotą, kad jis turėtų sekti būtent šią spalvą. Dabar perkelkite kamuolį aplink ekraną ir turėtumėte pastebėti, kad ratai sukasi.
Jei viskas veikia taip, kaip tikėtasi, paleiskite botą ant žemės ir pradėkite su juo žaisti. Norėdami pasiekti geriausių rezultatų, įsitikinkite, kad kambarys yra vienodai apšviestas. Visas projekto darbas parodytas žemiau esančiame vaizdo įraše. Tikiuosi, kad supratote projektą ir patiko kurti kažką panašaus. Jei turite kokių nors problemų, nedvejodami paskelbkite jas žemiau esančiame komentarų skyriuje arba padėkite.