Mobot#

Artikkelin tekijät: Cosku Acay, Edwin Cho, Kenneth Li ja Nishant Pol. PDF.

Projektin kuvaus#

Carnegie Mellonin Mobot-kilpailussa robottien on kuljettava 14 portin sarjan läpi, jotka on sijoitettu 255 jalan mittaisen kaarevan valkoisen viivan päälle ulkona jalkakäytävällä. Rata sisältää kaksi jyrkkää ramppia ja päätöskohta-alueen, jossa robotin on valittava oikea reitti kulkeakseen 14 portin läpi järjestyksessä. Koska viiva on ulkona ja Pittsburghin sään armoilla, robotin on toimittava monenlaisissa olosuhteissa. Tänä vuonna kilpailupäivänä oli sateista ja tuulista. Lisätietoja löytyy osoitteesta http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Ratkaisu CMUcam4:llä#

Valitsimme lähestyä viivanseurantatehtävää CMUcam4:llä, koska se vaati vähän laitteistoa ja siinä oli viivan seurantaan hyvin soveltuva käyttöliittymä.

Mobot hardware Mobot hardware (full size)

CMUcam4 kaappaa kuvan viivasta 30 kuvaa sekunnissa ja syöttää värinseurantakuvan Arduino Megalle yhden kolmesta sarjalinjasta kautta. Arduino Mega käsittelee sitten tämän kuvan (katso alla oleva ohjelmistokuvaus) ja välittää moottorin nopeus- ja kääntökomennot PID-ohjaimelle toisen sarjalinjan kautta. PID-ohjain puolestaan antaa Arduino Megalle enkooderilukemat sekä oikealle että vasemmalle pyörälle, mikä mahdollistaa sijaintimme ja suuntamme seuraamisen suhteessa porttiin 0.

PID-ohjaimen (MD-25) valmistaa Robot-Electronics Isossa-Britanniassa. Se ohjaa kahta vaihteellista DC-harjamoottoria, joissa on moottorin akselin magneettiset enkooderit. LCD-näyttö on virheenkorjaustarkoituksiin. Meillä oli kaksi virtakiskoa, 12V moottoreille ja 5V logiikalle, jotka jakoivat saman maadoituksen ja molemmat saivat virran yhdestä 12V:n ladattavasta akusta.

Suunnittelimme aluksi tehdä prototyypin puualustasta päästäksemme nopeasti ohjelmointivaiheeseen, ja työstää sitten nopeampaa, luotettavampaa alustaa kuten RC-autoa. Huomasimme kuitenkin, että prototyyppi oli erittäin luotettava ja helppo työstää, joten pidimme sen lopullista suunnittelua varten. Rungon vedenpitävyys koostui sellofaanikääreen kerroksesta pakkausteipin kerroksen alla. Sade kuitenkin vuoti pakkausteipin läpi, mutta onneksi ei sellofaanikääreen läpi. Kamera oli peitetty Ziploc-pussista leikatulla muovineliöllä, koska huomasimme, että ”suodatin” paransi kameran kykyä jättää huomiotta pieniä viivan laikkuja, jotka kameralle näyttivät taustabetonilta.

Algoritmin kuvaus#

Tausta#

Käytämme CMUcam4:ää väriseurantatilassa YUV-tila käytössä, mikä antaa meille binäärisen kuvaesityksen viivasta. Kameran ohjelmisto suodattaa pois kaiken, mikä ei ole valkoista (ts. taustan), ja asettaa ”on”-pikselin sinne, missä on viiva (missä se on valkoista). Käytämme YUV-tilaa, jotta väriseuranta on välinpitämätön valon intensiteetille, jotta robottimme voi toimia monenlaisissa olosuhteissa mukaan lukien sisä- ja ulkotilat.

Viivanseuranta#

CMUcam4 antaa Arduino-sirullemme 80 kertaa 60 -binäärikuvan. Otamme näytteeksi 10 tasavälein sijaitsevaa pikseliriviä kuvasta ja laskemme ”päällä” olevien pikselien keskipisteen (katso täältä: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Oletamme sitten, että viiva sijaitsee keskipisteessä. Tekemällä tämän 10 eri riville kuvassa saamme hyvän approksimaation viivasta yhdistämällä pisteet. Voimme sitten käyttää tätä dataa selvittämällä, kuinka kaukana kukin viivan piste on pystysuorasta viivasta, joka sijaitsee kuvan keskellä, saadaksemme arvon, joka kuvaa sitä, kuinka kaareva viiva on. Tämä voidaan nähdä eräänlaisena tangenttiviivan ja käyrän välisen pinta-alan etsimisenä ja tuon pinta-alan käyttämisenä sen määrittämiseen, kuinka paljon meidän täytyy kääntyä. Etumerkki määrittää, onko käännös vasemmalle vai oikealle, kun taas suuruus määrittää, kuinka paljon meidän täytyy kääntyä viivan seuraamiseksi. Kuten voisi odottaa, jos mittasimme nolla pinta-alaa, niin viiva on suoraan robotin edessä ja on suora viiva. Jos pinta-alan suuruus on suuri, niin robotin täytyy kääntyä yrittääkseen minimoida tämän pinta-alan suuruuden.

Päätöskohdat#

Määrittääksemme, onko robotti päätöspisteessä, otamme datan, jonka kamera kerää viivanseurannasta, ja tarkistamme, kuinka monta keskimääräistä keskipistettä esiintyy mustassa tilassa. Tämä toimii sen oletuksen perusteella, että kahden viivan välisen keskimääräisen pisteen ei tulisi olla kummallakaan viivalla, ellei viivoja ole sama viiva. Jos robotti havaitsee useita keskimääräisiä pisteitä mustassa tilassa, se voi päätellä, että täällä täytyy olla kaksi viivaa. Sitten se valitsee sopivan käännöksen ja painottaa kääntymistään kohti tuota suuntaa, kunnes se näkee vain yhden viivan.

Siirry osoitteeseen https://github.com/cacay/Mobot nähdäksesi yksinkertaistetun version koodistamme tai tänne saadaksesi paikallisen kopion.