Mobot#

Articol de Cosku Acay, Edwin Cho, Kenneth Li și Nishant Pol. PDF.

Descrierea proiectului#

În competiția Mobot a Carnegie Mellon, roboții trebuie să treacă printr-o serie de 14 porți poziționate peste o linie albă curbată de 255 de picioare pe un trotuar în aer liber. Traseul include două rampe abrupte și o zonă de punct de decizie unde robotul trebuie să selecteze ruta corectă pentru a trece prin cele 14 porți în ordine serială. Deoarece linia este în aer liber și supusă vremii din Pittsburgh, robotul trebuie să funcționeze într-o varietate de condiții. Anul acesta a fost ploios și cu vânt în ziua competiției. Mai multe informații pot fi găsite la http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Soluție cu CMUcam4#

Am ales să abordăm sarcina de urmărire a liniei folosind CMUcam4 deoarece necesita hardware minim și avea o interfață bine potrivită pentru urmărirea unei linii.

Mobot hardware Mobot hardware (full size)

CMUcam4 capturează o imagine a liniei la 30 de cadre pe secundă și transmite imaginea de urmărire a culorii către Arduino Mega prin una dintre cele trei linii seriale. Arduino Mega procesează apoi această imagine (consultați Descrierea software-ului de mai jos) și transmite comenzi de viteză a motorului și de virare către controlerul PID prin altă linie serială. Controlerul PID furnizează la rândul său Arduino Mega numărătoarele encoderelor pentru ambele roți, dreapta și stânga, ceea ce ne permite să urmărim poziția și direcția noastră relativ la poarta 0.

Controlerul PID (MD-25) este fabricat de Robot-Electronics în Marea Britanie. Acesta acționează două motoare de curent continuu cu perii și cu reductor, cu encodere magnetice pe arborele motorului. Ecranul LCD este pentru depanare. Aveam două șine de alimentare, 12V pentru motoare și 5V pentru logică, împărțind aceeași masă și ambele provenind dintr-o singură baterie reîncărcabilă de 12V.

Am plănuit inițial să facem un prototip dintr-o bază de lemn pentru a intra rapid în faza de programare, apoi să lucrăm la o bază mai rapidă și mai fiabilă, cum ar fi o mașină RC. Cu toate acestea, am descoperit că prototipul era foarte fiabil și ușor de utilizat, așa că l-am păstrat pentru designul final. Impermeabilizarea corpului a constat într-un strat de celofan sub un strat de bandă de ambalare. Ploaia s-a scurs însă prin banda de ambalare, dar din fericire nu prin stratul de celofan. Camera a fost acoperită cu un pătrat de plastic dintr-o pungă Ziploc, deoarece am descoperit că „filtrul” a îmbunătățit capacitatea camerei de a ignora micile porțiuni ale liniei care, pentru cameră, arătau ca betonul de fundal.

Descrierea algoritmului#

Context#

Folosim CMUcam4 în modul de urmărire a culorilor cu modul YUV activat, ceea ce ne oferă o reprezentare binară a imaginii liniei. Software-ul camerei filtrează tot ce nu este alb (adică fundalul) și pune un pixel „activ” acolo unde există o linie (unde este alb). Folosim modul YUV astfel încât urmărirea culorilor să fie insensibilă la intensitatea luminii, astfel încât robotul nostru să poată funcționa într-o mare varietate de condiții, inclusiv în interior și în exterior.

Urmărirea liniei#

CMUcam4 furnizează cipului nostru Arduino o imagine binară de 80 pe 60. Eșantionăm 10 rânduri de pixeli distribuite uniform din imagine și calculăm centroidul pixelilor „aprinși” (vezi aici: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Apoi presupunem că linia se află pe centroid. Făcând acest lucru pe 10 rânduri diferite din imagine, obținem o bună aproximare a liniei prin conectarea punctelor. Putem apoi utiliza aceste date găsind cât de departe este fiecare punct de pe linie de linia verticală care se află în centrul imaginii pentru a obține o valoare care reprezintă cât de curbată este linia. Acest lucru poate fi văzut ca ceva asemănător cu găsirea suprafeței dintre linia tangentă și o curbă și utilizarea acelei suprafețe pentru a determina cât de mult trebuie să virăm. Semnul determină dacă virajul este la stânga sau la dreapta, în timp ce magnitudinea determină cât de mult trebuie să virăm pentru a urmări linia. Așa cum v-ați aștepta, dacă am măsura suprafață zero, atunci linia este direct în fața robotului și este o linie dreaptă. Dacă magnitudinea suprafeței este mare, atunci robotul trebuie să vireze pentru a menține încercarea de a minimiza magnitudinea acestei suprafețe.

Puncte de decizie#

Pentru a determina dacă robotul se află la un punct de decizie, luăm datele pe care camera le adună din urmărirea liniei și verificăm câte puncte centrale medii apar în spațiul negru. Acest lucru funcționează pe baza presupunerii că punctul mediu dintre două linii nu ar trebui să fie pe niciuna dintre linii, cu excepția cazului în care liniile sunt aceeași linie. Dacă robotul detectează mai multe puncte medii în spațiul negru, poate concluziona că trebuie să existe două linii aici. Apoi selectează virajul corespunzător și își înclină virarea spre acea direcție până când vede doar o singură linie.

Vă rugăm să mergeți la https://github.com/cacay/Mobot pentru a vedea o versiune simplificată a codului nostru sau aici pentru o copie locală.