Sadržaj:

Robo-tehničar: 8 koraka
Robo-tehničar: 8 koraka

Video: Robo-tehničar: 8 koraka

Video: Robo-tehničar: 8 koraka
Video: Территория №8 HD 2013 (Фантастика) / Territory №8 HD 2024, Srpanj
Anonim
Robo-tehničar
Robo-tehničar

Zamislite na trenutak da ste jedan od astronauta koji slijeću na Mars. Imate milijun stvari za obaviti, uzeti uzorke, eksperimente pokrenuti, prikupiti podatke, ali jednom ili dvaput dnevno morate trčati po stambenim i/ili istraživačkim modulima u kojima živite i radite kako biste ih pregledali. To je potrebno, netko mora osigurati da je stvar u dobrom stanju, da sve tisuće komada i dijelova rade i da su na svom mjestu. Ali što ako postoji automatizirani pomoćnik koji će vas osloboditi nekih od tih dužnosti. Što ako postoji mali robot koji bi se mogao kretati unutar modula kako bi bio siguran da je sve na svom mjestu, da radi i da je sigurno.

Robo-tehničar u pomoć.

U osnovi, ovaj kôd kontrolira Robo-tehničara jer slijedi svijetlu putanju na tlu. On će slijediti ovaj put sve dok ne pronađe spoj na putu ili skretanje, što će zatražiti snimanje fotografije za obradu slike kako bi Robotehničar donio odluku o tome kamo će dalje. Senzori lakog udarca i udarca štite Robo-tehničara od oštećenja, a senzori udara kontroliraju kada će se snimiti dijagnostička fotografija. Sve zajedno, Robo-tehničar osmišljen je tako da zumira module Mar-a, oslobađajući vrijeme astronauta dok obavljaju osnovni zadatak inspekcije, pozivajući samo ljudski doprinos kad utvrdi da nešto nije u redu.

Opet kao upozorenje, ovo je rad u tijeku. Kôd, kakav postoji, funkcionira, ali ima poteškoća, pogotovo jer je uključeno više programa koji se preklapaju. Također, da bi ovaj projekt funkcionirao u stvarnoj misiji na Marsu, potrebno je izgraditi robota za tu određenu svrhu, pa opet pretpostavljam da je ovo "dokaz koncepta".

Nekoliko je stvari koje će vam trebati da biste ovo pokrenuli. Trebat će vam skup program, paketi podrške za taj program i malo znanja o kodiranju. Budući da sam student, a neki od prizemnih kodova su dostavljeni (za malinu pi), neću posebno govoriti o postavljanju. U nastavku možete pronaći sve veze za taj osnovni kôd. Prijeđimo na popis materijala.

Hardver

  • Raspberry Pi (koristili smo verziju 3)
  • iRobot ®
  • neka vrsta uređaja za držanje kako bi Raspberry Pi bio pričvršćen za Robo-tehničara
  • Raspberry Pi kamera (nije važno kakve vrste, sve dok ima dobar autofokus i razlučivost slike)
  • neka vrsta postolja ili futrole za držanje kamere okrenute prema naprijed na Robo-tehničaru
  • materijal za upotrebu kao traka, bijela (ili vrlo svijetle boje), koja se čvrsto drži na podu. Mora biti samo malo širi od prostora između prednja dva senzora litice.
  • 4 znaka s vrlo velikim tekstom (s ispisanim riječima SLIKA, DESNO, NAZAD i LIJEVO)
  • Listovi obojenog papira (najmanje tri i po mogućnosti crvena, zelena i plava)

Softver

  • Matlab (i 2018a i 2017b su korišteni i čini se da ne čine veliku razliku)
  • Paket podrške za Raspberry Pi za Matlab
  • Raspberry Pi kôd za povezivanje s Matlabom (veza na donji izvorni kod)
  • Alatni okvir za obradu slika za Matlab (gotovo ne možete napraviti ovaj projekt bez alata)
  • NEOBVEZNO: Matlab Mobile je instaliran na vašem telefonu, što ću kasnije objasniti

Korak 1: Postavljanje hardvera

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Ovo je veza za osnovni kôd kako bi se osiguralo da iRobot® može komunicirati s Matlabom, zajedno s osnovnim vodičem. Kao što sam već rekao, neću pokrivati ovaj određeni dio jer je tutorial već jako dobro izložen. Spomenut ću da nakon što slijedite korake na vezi, možete upotrijebiti Matlabovu naredbu "doc" da pregledate uključene informacije. Posebno:

doc roomba

I još jedna vrlo važna točka.

Kada preuzimate datoteke s gornje veze, stavite ih u mapu koju sam gore opisao jer Matlab zahtijeva da datoteke koje generiraju korisnici budu u trenutnoj radnoj mapi.

Sklonimo se s toga, prijeđimo na kod.

Korak 2: Pronalaženje svih tih senzora

Pronalaženje svih tih senzora
Pronalaženje svih tih senzora
Pronalaženje svih tih senzora
Pronalaženje svih tih senzora

Odvojite trenutak i iRobot® pregledajte. Dobro je znati gdje se oni nalaze pa imate predodžbu o ulazima koje Robo-tehničar prima i moći ćete shvatiti zašto se stvar vrti u krugovima umjesto da slijedite put koji ste postavili (ovo bi moglo ili se možda nije dogodilo). Očigledno ćete vidjeti veliki fizički osjetnik udara na prednjoj strani. Senzore litice malo je teže vidjeti, morat ćete ga okrenuti i potražiti četiri prozirna plastična prozora blizu prednjeg ruba. Senzori svjetlosnog udara još su skriveniji, ali zasad će biti dovoljno reći uživo u sjajnoj crnoj traci koja se kreće oko prednje strane iRobot® -a, koja se nalazi na prednjoj strani fizičke trake senzora.

Postoje senzori za pad kotača, ali oni se u ovom projektu ne koriste, pa ćemo prijeći na testiranje senzora.

Korak 3: Testiranje za postavljanje parametara

Testiranje za postavljanje parametara
Testiranje za postavljanje parametara

Prije nego što možemo poslati Robo-tehničara da obavi svoj posao, moramo shvatiti njegove specifičnosti i raspone senzora. Budući da je svaki iRobot® malo drugačiji i mijenja se tijekom životnog vijeka robota, moramo shvatiti kako senzori očitavaju područja u kojima će djelovati. Najlakši način za to je da postavite putanju svijetle boje (Koristio sam trake bijelog papira za pisač, ali sve što je svijetle boje učinit će) na površini kojom će Robo-tehničar raditi.

Pokrenite Matlab i otvorite novu skriptu. Spremite skriptu U ISTU MAPU KOJU SAM OPISAO RANIJE I dajte joj ime kako god želite (ipak pokušajte biti kratki jer će naziv ove datoteke biti naziv funkcije). Uključite robota i upotrijebite postavku varijable roomba iz vodiča upisivanjem naredbi u naredbeni prozor.

Provjerite je li Raspberry Pi priključen na iRobot® i je li vaše računalo spojeno na istu internetsku vezu. Potrošit ćete manje vremena čupajući kosu pokušavajući shvatiti zašto se Matlab neće povezati

r = roomba (broj koji ste postavili)

Varijabla "r" u ovim okolnostima nije potrebna, možete je nazvati kako god želite, ali čini život lakšim korištenjem jednoslovne varijable.

Nakon što je staza postavljena, a roomba uspješno spojena, postavite budućeg Robo-tehničara na mjesto gdje su jedan ili dva senzora litice iznad vrha staze. Očito to znači da su druga dva ili tri iznad površine koju ste odabrali.

Sada pokrenite ispitne senzore naredbom:

r.testSensors

Imajte na umu da je "r." Varijabla koju ste definirali ranije, pa ako nije "r" promijenite "r". na sve što ste se odlučili. To će otvoriti ekran testnog senzora s hrpom informacija.

Za ovaj projekt usredotočite se na svjetlosne odbojnike, odbojnike i dijelove litica. Pomičite Robo-tehničara uokolo pazeći da promatrate kako se senzori mijenjaju na različitim površinama ili koliko neki objekt mora biti blizu da bi se promijenile vrijednosti ligthBumper itd. Imajte na umu ove brojeve (ili ih zapišite) jer ćete trebaju vam za postavljanje vaših parametara u sekundi.

Korak 4: Pokretanje koda

Prvo ćete konstruirati funkciju. Nazvao sam ga "put", ali opet, naziv nije potreban, ali od sada ću ga nazivati "put".

Gornji dio koda postavlja neke opcije unosa korisnika. On gradi neke popise koji će se koristiti u in listdlg, a zatim prikazuje dijaloški okvir s popisom. To omogućuje korisniku da odabere koju boju putanje želi slijediti, što dolazi u obzir kasnije.

list = {'Crvena', 'Plava', 'Zelena'}

problist = {'Casualty, Save Image', 'Component Out Place, Save Image', 'Expected, Continue'} pathcolor = listdlg ('PromptString', 'Odaberite boju puta', … 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Varijable "prob" i "driv" ovdje moraju biti deklarirane jer će se koristiti unutar glavne while petlje funkcije, ali opet, ako želite preimenovati bilo koju od ovih varijabli ili promijeniti odabir popisa, u redu je sve dok dosljedni ste u ostatku koda.

Korak 5: Vrh Dok petlje: Fizički osjetnici udara

Vrh while petlje sadrži logiku fizičkog senzora udarca. U osnovi, kada Robo-tehničar naleti na nešto što zaustavlja (ili se za prednji osjetnik udara podupire unatrag 0,1 metar), tada se postavlja za snimanje fotografije. Prvo pokrijmo dio za kontrolu brzine i položaja.

Ako ste u prethodnim koracima testirali sve senzore na Robo-Technicianu, znat ćete da senzori udarca imaju logičku vrijednost (0 ili 1) s nulom koja predstavlja normalni, ne pritisnuti položaj senzora. Imajte to na umu kod.

dok je true %main while loop %prima informacije o odbojniku S = r.getBumpers if S.left ~ = 0 r.stop elseif S. right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Ovo je osnovni dio "ako nešto pogodi, zaustavi". Ako senzori ipak otkriju sudar, prelazi na sljedeći dio koda koji ponovno prilagođava položaj robotehničara kako bi dobio fotografiju.

if S.left ~ = 0 %if loop uzima podatke o braniku i poravnava kameru za fotografiju r.turnAngle (5) pause (0.5) img = r.getImage %snima fotografiju i prikazuje sliku (img) %dijaloški okvir prob = listdlg (' PromptString ',' Pronađena je neočekivana prepreka, molimo identificirajte '…,' SelectionMode ',' single ',' ListString ', problist) elseif S. right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Pronađena je neočekivana prepreka, identificirajte'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pause (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Pronađena je neočekivana prepreka, identificirajte' …, 'SelectionMode', 'single', 'ListString', problist) end

U osnovi, nakon što je slika snimljena, pojavit će se drugi dijaloški okvir s tri mogućnosti. Prve dvije opcije spremaju fotografiju u određenu mapu, koju ću kasnije obraditi, dok treća opcija jednostavno zatvara okvir za dijalog i nastavlja kroz petlju. Ako se ne možete sjetiti opcija, pogledajte prethodni korak.

Sada sam umetnuo odjeljak koda između dijela osjetnika udara i dijela za spremanje fotografija. To uzima svjetlosne vrijednosti i postavlja brzinu vožnje na 0,025 metara/sekundi (vrlo sporo), što zapravo nije potrebno, ali smanjuje Robo-tehničara koji udara u stvari i na kraju istroši fizičke senzore udara.

L = r.getLightBumpers ako je L.lijevo> 100 || L.lijevo sprijeda> 100 || L.desnopred> 100 || L.desno> 100 driv = 0,025 r.setDriveVelocity (0,025) else driv = 0,1 kraj

Ovo bi bio dio u kojem vrijednosti koje ste ranije promatrali (i nadamo se zapisali) stupaju na scenu

"L. (strana i smjer senzora)> 100" temelji se na vrijednostima koje sam primijetio, pa ako su vaša opažanja različita, promijenite ove brojke. Ideja je da će, ako Robo-tehničar osjeti nešto nekoliko centimetara ispred sebe, to usporiti, više nego što je to nepotrebno.

Sljedeći dio je mjesto gdje se fotografije spremaju za kasnije.

%ako je prva ili druga opcija odabrana u dijalogu vjerojatnosti, sprema sliku ako je vjerojatnost == 1 %ako petlja gradi podatke o datoteci za fotografiju, piše s vremenskom oznakom t = sat; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Klase / pad 18 / ef230 / irobot / slike'; puno ime datoteke = puna datoteka (mapa, naziv baze); imwrite (img, fullFileName) zatvori Slika 1 pauza (2) elseif vjerovatno == 2 t = sat; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Klase / pad 18 / ef230 / irobot / slike'; puno ime datoteke = puna datoteka (mapa, naziv baze); imwrite (img, fullFileName) zatvori Slika 1 pauza (2) kraj

Svi nazivi datoteka i mjesta na kojima se fotografije spremaju nisu obvezni. Odabrao sam mapu koja je ugniježđena unutar mape roomba koju sam stvorio u uvodnom koraku, ali može biti bilo gdje želite. Također, fotografije se spremaju s vremenskom oznakom, ali to nije osobito potrebno (iako bi hipotetički bilo korisno za misiju na Mars).

S pokrivenim fizičkim senzorima udara, možemo prijeći na senzore litice i put koji slijedi.

Korak 6: Slijedeći put

Kôd za senzore litice postavljen je za usporedbu vrijednosti dva prednja i dva bočna osjetnika. Ove ćete vrijednosti (vjerojatno) morati promijeniti na temelju promatranih vrijednosti. Ove ćete vrijednosti vjerojatno morati i urediti nakon nekoliko probnih vožnji te ih promijeniti na temelju svjetla okoline, doba dana (ovisno o tome koliko je dobro osvijetljeno područje za testiranje) ili kada su prozori senzora prljavi.

Prije nego što dođemo do koda senzora litice, postoji kratki segment koda koji sam umetnuo kako bih isprao neke nepotrebne podatke iz Matlaba. Ovaj dio nije potreban, ali sam ga koristio za smanjenje prostora za pohranu potrebnog za pokretanje programa.

clear img clear t clear basename clear fullFileName clear folder

Sljedeći segment koda je meso projekta. Omogućuje robotu da prati svijetlu putanju postavljenu na pod. Ukratko, pokušava se upravljati tako da su prednja dva senzora litice iznad praga, na temelju vaših promatranih vrijednosti, i omogućuje programu da započne korake obrade slike nešto kasnije.

C = r.getCliffSensors %if petlja prati traku boja (bijela) ako C.leftFront> 2000 && C.rightFront> 2000 %vođenje ravnom putanjom r.setDriveVelocity (driv) elseif C.leftFront 2000 %skrene desno ako robot ode predaleko lijevo r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%skreće ulijevo ako robot ode previše desno r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.lijevo sprijeda> 100 || L.desnopred> 100 || L.desno> 100 img = r.getImage kraj %provjerava ima li zavoja na putu ako je C.lijevo> 2800 && C.desno <2800 okretajaKut okretanja (2.5) inače ako C.lijevo 2800 okretaja kuta (- 2.5) end %držač mjesta za prepoznavanje slike putanje disp ('GETTING IMAGE') kraj end end

Imajte na umu da su imena varijabli koje sam odabrala neobavezni, ali opet mislim da vam olakšava korištenje varijabli s jednim slovom kada je to moguće

Da bi se objasnio srednji dio koda, kada dva prednja senzora pobjegnu s ruba staze (kada dođe do raskrižja ili kad dođe do kraja staze), izgleda ima li nešto ispred njega. Morat ćete postaviti objekt na tlo na kraju staze ili na bilo kojem raskrižju da bi to funkcioniralo.

Nakon što je fotografija snimljena, koristi prepoznavanje slike kako bi shvatila što učiniti. I u ovom odjeljku koda postoji držač mjesta:

%držač mjesta za prepoznavanje slike putanje ('GETTING IMAGE')

Ovo sam trenutno koristio jer sam želio konkretno razgovarati o tekstu i obradi boja koji se javljaju, što je u sljedećem koraku.

Korak 7: Obrada slike

Obrada slike sastoji se od dva dijela. Prvo je prepoznavanje boje, koje izračunava intenzitet boje na slici kako bi odlučilo hoćete li nastaviti s prepoznavanjem teksta. Izračuni boja temelje se na izboru koji je napravljen u tom prvom dijaloškom okviru na početku (koristio sam crvenu, plavu, zelenu, ali možete odabrati koje god boje želite, sve dok se srednje vrijednosti intenziteta boje mogu prepoznati Kamera Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) crvena = srednja (srednja (imgb (:,:, 1))); g = srednja vrijednost (srednja vrijednost (imgb (:,:, 2))); b = srednja vrijednost (srednja vrijednost (imgb (:,:, 3)));

Ovo je provjera intenziteta. To će se koristiti u sljedećem segmentu za odlučivanje o tome što želi učiniti.

ako je crveno> g && crveno> b ako je putanja == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) ako je R. Riječi {1} == SLIKA || R. Riječi {2} == SLIKA || R. Riječi {3} == SLIKA t = sat; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Klase / pad 18 / ef230 / irobot / slike'; puno ime datoteke = puna datoteka (mapa, naziv baze); imwrite (img, fullFileName) pause (2) elseif R. Riječi {1} == DESNO || R. Riječi {2} == DESNO || R. Riječi {3} == DESNO r.turnAngle (-75) inače, ako R. Riječi {1} == LIJEVO || R. Riječi {2} == LIJEVO || R. Riječi {3} == LIJEVO r.turnAngle (75) inače, ako R. Riječi {1} == NAZAD || R. Riječi {2} == NAZAD || R. Riječi {3} == NAZAD r.turnAngle (110) end else r.turnAngle (110) end end

Ovaj segment odlučuje odgovara li boja koja je odabrana u prvom dijaloškom okviru boji koju vidi kamera. Ako to učini, pokreće prepoznavanje teksta. Gleda se kako bi se vidjela koja se riječ (SLIKA, NAZAD, DESNO ili LIJEVO) pojavi, a zatim ili okrenula (za desno i lijevo), okrenula se (za leđa) ili snimila sliku i spremila je na isti način kao i ranije.

Naveo sam samo jedan dio koda za različite boje

Da biste dopustili da kôd prepozna plavu i zelenu boju, jednostavno kopirajte kôd i promijenite logičku provjeru na vrhu segmenta i postavite "pathcolor == (broj)" tako da odgovara odabiru boja iz gornjeg dijaloškog okvira (za koda kako je prikazan, plava bi bila 2, a zelena bi bila 3).

Korak 8: Gotov proizvod

Gotov proizvod
Gotov proizvod

Sada bi Robo-tehničar trebao zumirati oko modula misije Mars i izvijestiti astronaute kad bilo što nije na svom mjestu.

Upamtite, sve vrijednosti senzora litice i svjetlosnog odbojnika potrebno je promijeniti na vaše promatrane vrijednosti. Također, iz iskustva sam zaključio da je bolje testirati ovaj projekt na podu tamne boje, a još je bolje ako taj pod ne reflektira. Time se povećava kontrast između staze i poda, što povećava vjerojatnost da će je Robo-tehničar ispravno slijediti.

Nadam se da ste uživali u postavljanju malog pomoćnika za misiju Mars i zabavite se u izgradnji.

Preporučeni: