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, Novembar
Anonim
Robo-tehničar
Robo-tehničar

Zamislite na trenutak da ste jedan od astronauta koji sleću na Mars. Imate milijun stvari koje morate obaviti, uzorke koje morate uzeti, eksperimente za izvođenje, podatke za prikupljanje, ali jednom ili dvaput dnevno morate trčati po staništima i/ili istraživačkim modulima u kojima živite i radite kako biste ih pregledali. Neophodno je, neko mora osigurati da je stvar u dobrom stanju, da sve hiljade 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 se uvjerio 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 prati svijetlu putanju na tlu. Pratit će ovaj put sve dok ne pronađe raskrsnicu na stazi ili skretanje, što će zatražiti snimanje fotografije za obradu slike kako bi Robotehničar donio odluku o tome kuda dalje. Senzori lakog udara i udara rade kako bi zaštitili Robotehničara od oštećenja, a senzori udara kontroliraju kada će se snimiti dijagnostička fotografija. Sve zajedno, Robo-tehničar je dizajniran za zumiranje modula Mar, oslobađajući vrijeme astronauta dok obavljaju osnovni zadatak inspekcije, pozivajući samo ljudski doprinos kada utvrdi da nešto nije u redu.

Još jednom kao upozorenje, ovo je rad u toku. 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 pretpostavljam da je ovo "dokaz koncepta".

Postoji nekoliko stvari koje će vam trebati da biste ovo pokrenuli. Trebat će vam skup program, paketi podrške za taj program i malo pozadine u kodiranju. Pošto sam student, a neki od prizemnih kodova su dati (za malinu pi), neću posebno govoriti o postavljanju. U nastavku možete pronaći sve veze za taj osnovni kod. Idemo na popis materijala.

Hardver

  • Raspberry Pi (koristili smo verziju 3)
  • iRobot ®
  • neka vrsta uređaja za držanje koji drži Raspberry Pi pričvršćenim za Robo-tehničara
  • Raspberry Pi kamera (nije važno kakve vrste, sve dok ima dobar autofokus i rezoluciju slike)
  • neka vrsta postolja ili futrole za držanje kamere okrenute prema naprijed na robotu-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 crveno, zeleno i plavo)

Softver

  • Matlab (i 2018a i 2017b su korišteni i čini se da ne prave veliku razliku)
  • Paket podrške za Raspberry Pi za Matlab
  • Raspberry Pi kôd za povezivanje s Matlabom (veza do izvornog koda navedenog u nastavku)
  • Alatni okvir za obradu slika za Matlab (skoro pa 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 vodič već jako dobro postavljen. Spomenut ću da nakon što slijedite korake na vezi, možete upotrijebiti Matlabovu naredbu "doc" da pregledate uključene informacije. Konkretno:

doc roomba

I još jedna veoma važna tač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 pregledajte iRobot®. Dobro je znati gdje se nalaze tako da imate predodžbu o ulazima koje Robo-tehničar prima i moći ćete shvatiti zašto se stvar vrti u krug umjesto da slijedite put koji ste postavili (ovo bi moglo ili se možda nije dogodilo). Očigledno ćete vidjeti veliki fizički senzor udara na prednjoj strani. Senzore litice je malo teže vidjeti, morat ćete ga okrenuti i potražiti četiri prozirna plastična prozora blizu prednje ivice. Senzori svjetlosnog udara su još skriveniji, ali za sada ć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 pada točkova, ali oni se u ovom projektu ne koriste, pa ćemo preć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 domete senzora. Budući da je svaki iRobot® malo drugačiji i da se mijenja tokom životnog vijeka robota, moramo shvatiti kako senzori očitavaju područja u kojima će raditi. Najlakši način za to je da postavite putanju svijetle boje (Koristio sam trake bijelog papira za štampač, ali sve što je svijetle boje će učiniti) na površini na kojoj će Robo-tehničar raditi.

Pokrenite Matlab i otvorite novu skriptu. Sačuvajte skriptu u ISTOJ FABLICI KOJU SAM OPISAO RANIJE I dajte joj ime kako god želite (pokušajte da bude kratak, jer će naziv ove datoteke biti naziv funkcije). Uključite robota i upotrijebite postavku roomba varijable iz vodiča upisivanjem naredbi u naredbeni prozor.

Provjerite je li Raspberry Pi priključen na iRobot® i je li vaše računalo povezano 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)

Promenljiva "r" u ovim okolnostima nije neophodna, možete je nazvati kako god želite, ali ona olakšava život upotrebom promenljive sa jednim slovom.

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

Sada pokrenite testne senzore naredbom:

r.testSensors

Imajte na umu da je "r." Varijabla koju ste ranije definirali, pa ako nije "r" promijenite "r". na šta god da se odlučite. Ovo će prikazati ekran testnog senzora s gomilom informacija.

Za ovaj projekt usredotočite se na svjetlosne odbojnike, odbojnike i dijelove litica. Pomaknite Robo-tehničara uokolo pazeći da promatrate kako se senzori mijenjaju na različitim površinama, ili koliko 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, ime nije potrebno, ali od sada ću ga nazivati "putanja".

Gornji dio koda postavlja neke opcije unosa korisnika. On pravi neke liste koje će se koristiti u in listdlg, a zatim prikazuje dijaloški okvir sa listom. Ovo omogućava korisniku da odabere koju boju putanje želi slijediti, što stupa na snagu kasnije.

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

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

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

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

Vrh while petlje sadrži logiku fizičkog senzora udarca. U osnovi, kada Robo-tehničar naleti na nešto što zaustavlja (ili za prednji senzor udarca pravi sigurnosnu kopiju od 0,1 metar), tada se postavlja da bi snimio sliku. Omotimo prvo 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, stani". Ako senzori ipak otkriju sudar, tada se prelazi na sljedeći dio koda, koji prilagođava položaj robo-tehničara da dobije 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, identificirajte '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pauza (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) pauza (0,5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Pronađena je neočekivana prepreka, molimo identificirajte'…, 'SelectionMode', 'single', 'ListString', problist) end

U osnovi, nakon što je slika snimljena, pojavit će se drugi dijaloški okvir s tri opcije. 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 sjećate opcija, pogledajte prethodni korak.

Sada sam umetnuo kodni dio između dijela senzora udara i dijela za spremanje fotografija. Ovo uzima lightBumper 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 zapazili (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 zapažanja različita, promijenite ove brojeve. 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 vjerovatnoće, sprema sliku ako je vjerovatno == 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'; fullFileName = fullfile (folder, ime 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'; fullFileName = fullfile (folder, ime baze); imwrite (img, fullFileName) zatvori Slika 1 pauza (2) kraj

Svi nazivi datoteka i lokacije na koje se fotografije spremaju nisu obavezni. 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 posebno potrebno (iako bi hipotetički bilo korisno za misiju na Mars).

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

Korak 6: Pratite stazu

Kod senzora litice postavljen je za usporedbu vrijednosti dva prednja i dva bočna senzora. Morat ćete promijeniti ove vrijednosti (vjerovatno) na osnovu posmatranih vrijednosti. Ove vrijednosti ćete vjerojatno morati i urediti nakon nekoliko probnih vožnji i promijeniti ih na osnovu ambijentalnog svjetla, 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ćava robotu da prati svijetlu putanju postavljenu na pod. Ukratko, pokušava se usmjeriti tako da se prednja dva senzora litice nalaze iznad praga, na osnovu vaših uočenih vrijednosti, i omogućava 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 lijevo ako robot ide 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 stazi ako je C.lijevo> 2800 && C. desno <2800 obrtaja.turnAngle (2.5) u suprotnom slučaju C.lijevo 2800 obrtaja.turnAngle (- 2.5) end %držač mesta za prikaz putanje prepoznavanja slike ('GETTING IMAGE') kraj end end

Imajte na umu da su imena varijabli koje sam odabrala neobavezni, ali opet mislim da vam olakšava život kada se koristi jednoslovna varijabla

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 da li ima 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, ona koristi prepoznavanje slike da shvati šta treba 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 koje se događaju, š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 sa prepoznavanjem teksta ili ne. Prorač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 izabrati boje koje ž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]) crveno = srednja (srednja (imgb (:,:, 1))); g = srednja vrednost (srednja vrednost (imgb (:,:, 2))); b = srednja vrijednost (srednja vrijednost (imgb (:,:, 3)));

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

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'; fullFileName = fullfile (folder, ime baze); imwrite (img, fullFileName) pauza (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 da li boja koja je odabrana u prvom dijaloškom okviru odgovara boji koju kamera vidi. Ako to učini, pokreće prepoznavanje teksta. Pokušava vidjeti koja se riječ (SLIKA, NAZAD, DESNO ili LIJEVO) pojavljuje, a zatim se ili okreće (za desno i lijevo), okreće se (za leđa) ili snima sliku i sprema je na isti način kao i ranije.

Naveo sam samo jedan dio koda za različite boje

Da biste omogućili 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 na Marsu i izvještavati astronaute kada sve ne bude na mjestu.

Upamtite, sve vrijednosti senzora litice i svjetlosnog odbojnika potrebno je promijeniti na vaše primijećene 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čuje se: