Mobot#
Članak autora Cosku Acay, Edwin Cho, Kenneth Li i Nishant Pol. PDF.
Opis projekta#
Na natjecanju Mobot Sveučilišta Carnegie Mellon, roboti moraju proći kroz niz od 14 vrata postavljenih preko 255 stopa duge zakrivljene bijele linije na vanjskom pločniku. Staza uključuje dvije strme rampe i područje s točkom odluke gdje robot mora odabrati ispravan put kako bi prošao kroz 14 vrata redom. Budući da je linija vani i pod utjecajem vremena u Pittsburghu, robot mora funkcionirati u raznim uvjetima. Ove godine je na dan natjecanja bilo kišovito i vjetrovito. Više informacija možete pronaći na http://www.cs.cmu.edu/mobot/mobot.html


Rješenje s CMUcam4#
Odabrali smo pristupiti zadatku praćenja linije koristeći CMUcam4 jer je zahtijevao minimalan hardver i imao sučelje dobro prilagođeno za praćenje linije.

CMUcam4 snima sliku linije pri 30 sličica u sekundi i dovodi sliku praćenja boje na Arduino Mega putem jedne od tri serijske linije. Arduino Mega zatim obrađuje ovu sliku (molimo pogledajte Opis softvera u nastavku) i isporučuje naredbe brzine motora i skretanja PID kontroleru putem druge serijske linije. PID kontroler zauzvrat pruža Arduino Mega broj impulsa enkodera za oba, desni i lijevi kotač, što nam omogućuje praćenje našeg položaja i smjera u odnosu na vrata 0.
PID kontroler (MD-25) proizvodi Robot-Electronics u Ujedinjenom Kraljevstvu. On pokreće dva DC četkasta motora s prijenosom s magnetskim enkoderima na osovini motora. LCD zaslon služi za ispravljanje pogrešaka. Imali smo dvije naponske sabirnice, 12V za motore i 5V za logiku, koje dijele isto uzemljenje i obje se napajaju iz jedne punjive baterije od 12V.
U početku smo planirali napraviti prototip od drvene baze kako bismo brzo ušli u fazu programiranja, a zatim raditi na bržoj, pouzdanijoj bazi poput RC automobila. Međutim, otkrili smo da je prototip vrlo pouzdan i lak za rad, pa smo ga zadržali za konačni dizajn. Vodootpornost tijela sastojala se od sloja celofanske folije ispod sloja ljepljive trake za pakiranje. Kiša je ipak curila kroz traku za pakiranje, ali srećom ne kroz celofansku foliju. Kamera je bila prekrivena kvadratom plastike iz Ziploc vrećice jer smo otkrili da je taj „filtar” poboljšao sposobnost kamere da ignorira male dijelove linije koji su, za kameru, izgledali poput pozadinskog betona.
Opis algoritma#
Pozadina#
Koristimo CMUcam4 u načinu praćenja boje s uključenim YUV načinom, što nam daje binarnu predodžbu slike linije. Softver kamere filtrira sve što nije bijelo (tj. pozadinu) i stavlja „uključeni” piksel tamo gdje je linija (gdje je bijelo). Koristimo YUV način tako da praćenje boje bude neosjetljivo na intenzitet svjetla, kako bi naš robot mogao funkcionirati u širokom rasponu uvjeta, uključujući u zatvorenom prostoru i na otvorenom.
Praćenje linije#
CMUcam4 pruža našem Arduino čipu binarnu sliku 80 sa 60. Uzorkujemo 10 jednako razmaknutih redova piksela sa slike i izračunavamo centroid „uključenih” piksela (pogledajte ovdje: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Zatim pretpostavljamo da linija leži na centroidu. Radeći ovo na 10 različitih redova u slici, dobivamo dobru aproksimaciju linije spajanjem točaka. Ove podatke zatim možemo koristiti pronalaženjem koliko je svaka točka na liniji udaljena od vertikalne linije koja leži u središtu slike kako bismo dobili vrijednost koja predstavlja koliko je linija zakrivljena. Ovo se može shvatiti kao nešto poput pronalaženja površine između tangente i krivulje te korištenja te površine za određivanje koliko se moramo okrenuti. Predznak određuje je li skretanje lijevo ili desno, dok magnituda određuje koliko se moramo okrenuti da bismo slijedili liniju. Kao što biste očekivali, ako izmjerimo nultu površinu, tada je linija izravno ispred robota i predstavlja ravnu liniju. Ako je magnituda površine velika, tada se robot mora okrenuti kako bi pokušao minimizirati magnitudu ove površine.
Točke odluke#
Da bismo utvrdili je li robot na točki odluke, uzimamo podatke koje kamera prikuplja iz praćenja linije i provjeravamo koliko se prosječnih središnjih točaka pojavljuje u crnom prostoru. Ovo radi na temelju pretpostavke da prosječna točka između dvije linije ne bi trebala biti ni na jednoj liniji, osim ako su linije ista linija. Ako robot otkrije više prosječnih točaka u crnom prostoru, može zaključiti da ovdje moraju biti dvije linije. Zatim odabire odgovarajuće skretanje i pristrano skreće prema tom smjeru sve dok ne vidi samo jednu liniju.
Molimo posjetite https://github.com/cacay/Mobot da biste vidjeli pojednostavljenu verziju našeg koda ili ovdje za lokalnu kopiju.

