Mobot#
Cikk szerzői: Cosku Acay, Edwin Cho, Kenneth Li és Nishant Pol. PDF.
Projektleírás#
A Carnegie Mellon Mobot versenyén a robotoknak egy 14 kapuból álló sorozaton kell áthaladniuk, amelyek egy 255 láb hosszú, ívelt fehér vonal fölött helyezkednek el egy kültéri járdán. A pálya két meredek rámpát és egy döntési pont területet tartalmaz, ahol a robotnak ki kell választania a helyes útvonalat, hogy sorrendben áthaladjon a 14 kapun. Mivel a vonal kültéren és Pittsburgh időjárásának kitéve van, a robotnak sokféle körülmény között kell működnie. Idén esős és szeles volt a verseny napja. További információ a http://www.cs.cmu.edu/mobot/mobot.html oldalon található


Megoldás a CMUcam4-gyel#
Úgy döntöttünk, hogy a vonalkövetési feladatot a CMUcam4 használatával közelítjük meg, mert minimális hardvert igényelt, és a vonal követésére jól alkalmas interfésszel rendelkezett.

A CMUcam4 másodpercenként 30 képkockával rögzíti a vonal képét, és a színkövetési képet a három soros vonal egyikén keresztül továbbítja az Arduino Megának. Az Arduino Mega ezután feldolgozza ezt a képet (lásd az alábbi szoftverleírást), és a motorsebesség- és fordulási parancsokat egy másik soros vonalon keresztül továbbítja a PID-vezérlőnek. A PID-vezérlő cserébe ellátja az Arduino Megát mind a jobb, mind a bal kerék enkóderszámlálásaival, ami lehetővé teszi, hogy nyomon kövessük a 0. kapuhoz viszonyított pozíciónkat és irányunkat.
A PID-vezérlőt (MD-25) a Robot-Electronics gyártja az Egyesült Királyságban. Két hajtóműves DC keféltmotort hajt motortengely-mágneses enkóderekkel. Az LCD-képernyő hibakeresési célokat szolgál. Két táphálózatunk volt, 12V a motoroknak és 5V a logikának, közös földeléssel, mindkettő egyetlen 12V-os újratölthető akkumulátorról táplálva.
Kezdetben azt terveztük, hogy egy fa alapból készítünk prototípust, hogy gyorsan bejussunk a programozási fázisba, majd egy gyorsabb, megbízhatóbb alapon, például egy RC autón dolgozzunk. Azt találtuk azonban, hogy a prototípus nagyon megbízható és könnyen kezelhető volt, ezért megtartottuk a végleges tervhez. A test vízhatlanítása egy cellofánréteg alatti csomagolószalag-rétegből állt. Az eső azonban átszivárgott a csomagolószalagon, de szerencsére nem a cellofánrétegen. A kamerát egy Ziploc zacskóból származó négyzet alakú műanyag fedte, mivel azt találtuk, hogy a „szűrő” javította a kamera azon képességét, hogy figyelmen kívül hagyja a vonal kis foltjait, amelyek a kamera számára a háttérbetonnak tűntek.
Az algoritmus leírása#
Háttér#
A CMUcam4-et YUV móddal engedélyezett színkövetési módban használjuk, amely a vonal bináris képi ábrázolását adja. A kameraszoftver kiszűr mindent, ami nem fehér (azaz a hátteret), és egy „bekapcsolt” pixelt tesz oda, ahol vonal van (ahol fehér). YUV módot használunk, hogy a színkövetés érzéketlen legyen a fény intenzitására, hogy a robotunk sokféle körülmény között tudjon működni, beleértve a beltéri és kültéri körülményeket is.
Vonalkövetés#
A CMUcam4 egy 80x60-as bináris képpel látja el az Arduino chipünket. A képből 10 egyenlő távolságra lévő pixelsort mintavételezünk, és kiszámítjuk a „bekapcsolt” pixelek súlypontját (lásd itt: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Ezután feltételezzük, hogy a vonal a súlyponton fekszik. Ezt a kép 10 különböző során elvégezve jó közelítést kapunk a vonalra a pontok összekötésével. Ezeket az adatokat ezután úgy használhatjuk fel, hogy megtaláljuk, milyen messze van a vonal minden pontja a kép közepén fekvő függőleges vonaltól, hogy egy olyan értéket kapjunk, amely azt jelzi, mennyire görbült a vonal. Ez valami olyasminek tekinthető, mint az érintővonal és egy görbe közötti terület megtalálása, és annak a területnek a felhasználása annak meghatározására, hogy mennyit kell fordulnunk. Az előjel határozza meg, hogy a fordulás balra vagy jobbra van, míg a nagyság határozza meg, hogy mennyit kell fordulnunk a vonal követéséhez. Ahogy várható, ha nulla területet mértünk, akkor a vonal közvetlenül a robot előtt van, és egyenes vonal. Ha a terület nagysága nagy, akkor a robotnak fordulnia kell, hogy megpróbálja minimalizálni ennek a területnek a nagyságát.
Döntési pontok#
Annak megállapításához, hogy a robot döntési ponton van-e, fogjuk a kamera által a vonalkövetésből gyűjtött adatokat, és ellenőrizzük, hogy hány átlagos középpont jelenik meg a fekete térben. Ez azon a feltételezésen alapul, hogy két vonal közötti átlagos pontnak egyik vonalon sem szabad lennie, hacsak a vonalak nem ugyanaz a vonal. Ha a robot több átlagos pontot észlel a fekete térben, akkor arra következtethet, hogy itt két vonalnak kell lennie. Ezután kiválasztja a megfelelő fordulást, és a fordulását abba az irányba tolja, amíg csak egy vonalat nem lát.
Kérjük, látogasson el a https://github.com/cacay/Mobot oldalra a kódunk egyszerűsített verziójának megtekintéséhez, vagy ide egy helyi másolatért.

