Kasutaja tarvikud

Lehe tööriistad


projektid:voistlusrobotid:robotex:2009:voistkonnad:3

Robotex 2009 võistkond "Printer Bob"

Tegijad

Dokumentatsioon

Roboti üldine kirjeldus

Roboti väliskuju on silinder, mille põhja diameeter on 30 cm ja kõrgus 25 cm. Kogu robot on tehtud kihilise ülesehitusega. Kihtide vahel on keermestatud pulgad. Kõige alumine kiht on tehtud alumiiniumist ja ülemised pleksiklaasist. Kõiki kihte saab üksteise küljest lahti võtta. Kogu robotit pidi ümbritsema ka kest.

  1. Esimesel kihil paiknevad roboti veomootorid, kaamera (Sony PS3Eye), akude indikaatorid ja peamootorikontroller. Esimene kiht on tehtud auguline, et sinna parem asju oleks kinnitada.
  2. Teisel kihil paikneb roboti pneumosüsteem, akude sahtel, toiteplaat ja üldkontroller. Selle kihi külge oli kinnitatud ka roboti rullimehhanism, ehkki ta ise füüsiliselt asus esimese kihi kohal.
  3. Kolmandal kihil asus Artigo PC koos lülitipaneeliga. Sellel kihil asus ka üks Sharpi andur värava kindlakstegemiseks. Kihi kohale roboti peale oli paigaldatud ka IR vastuvõtja.

Mehaanika

Roboti veoajam

Roboti algne ideekavand nägi ette nelja omniratta kasutamist. Hilisema projekteerimise ja katsetamise käigus sai siiski jäädud kolme ratta juurde. See lahendus oli odavam ja lihtsam oli tagada seda, et kõik rattad ikka maha toetuksid.

Mootoritena kasutasime kolme EMG30 enkoodriga ja reduktoriga varustatud mootorit. Neile lasime vastavad puksid treida, et mootoreid oleks võimalik rattaga ühendada.

Pallide mehhanism

Pallide mehhanism koosneb löögi ja rullimehhanismist. Löögimehhanism muutus aja jooksul kõige rohkem. Algselt sai katseid alustada elektromagnetil põhinevate löögimehhanismidega. Nendega õnnestus saavutada 7 meetrise kaugusega lööke. Puuduseks oli suhteliselt kõrge tööpinge ja aeglus. Sellepärast oli algne plaan panna solenoidid roboti ülemisele kihile ja jõu õla abil kiirust suurendada. Konkreetset süsteemi plaanisime käitada kuskil 100 voldiga.

Uute liikmete tulekuga tekkis idee ehitada pneumaatiline löögimehhanism. Igatahes katsed silindriga DSN-25-25-P olid suhteliselt edukad. Hiljem, et kiirust juurde saada, kasutasime 8 mm kolviga silindrit. Löögijõud paranes kordades. Suruõhu hoiustamiseks kasutasime vastavat mahutit. Sellest jätkus suurima silindriga kuskil 22 löögiks ja väiksemaga sai isegi 30 lööki kätte. Seda oli piisavalt. Süsteemi töörõhk oli 8 bar-i. Õigemini meie kompressor ei võimaldanud rohkemat. Alguses kasutasime silindri käigu ühtlustamiseks jaoteid, aga hiljem loobusime neist. Palle lööv sahk oli kinnitatud kohe silindri külge. Kuna kolb pöörles, lisasime sahale ka paari juhtsiine.

Töö käigus uurisime professionaalsete jalgpallirobotite ehitust ja avastasime, et neil on kasutusel pöörlev rull pallide kinnihoidmiseks. Rulli tööpõhimõte seisnes selles, et pall panna nii pöörlema, et see kogu aeg roboti poole veereks. Süsteem võimaldas robotiga isegi 360 kraadiseid pöördeid teha ilma palli kaotamata.

Ideed otsustasime kopeerida. Alguses paigaldasime katseks lihtsalt veidi koonilise horisontaalse rulli (koonilisuse mõte oli, et pall rulli keskel püsiks), kuid see ei töötanud väga hästi. Kuna rull oli roboti kere külge jäigalt kinnitatud, siis pall kippus robotit üles tõstma. Selle tagajärjel langes kogu roboti raskus rullile ja selle rihmülekanne hakkas libisema. Peale katsetusi erinevate rulli kõrgustega otsustasime varemalt ainult pallide löömiseks mõeldud saha palli ka toetama panna. Selleks tuli sahk ettepoole tuua nii, et pall pööreldes see toetuks saha vastu. Pall ei saanud enam liiga kaugele roboti alla liikuda ja jäi vastu rulli pöörlema.

Vahepeal uurisime ka silindrilist rulli. Selle hea omadus oli see, et rulli ja maa vaheline kaugus jääb kogu aeg konstantseks. Selgus ka tõsiasi, et pehme sisepinnaga rull haarab palli paremini. Uue rulli tegime laserprinteri pehmest vaherullist, millele liimisime peale kummist katte. Siiski roboti sõitma hakkamisel kaotasime endiselt palli, kuna roboti madalamale vajudes kadus kontakt sahaga ja pall veeres minema. Igatahes probleemi lahendamiseks kaotasime rulli jäiga sideme robotiga, mispeale asi ka tööle hakkas.

Elektroonika

Kaamera

Robot otsib palle kaamera abil. Alguses kasutasime selleks Creativi Live veebikaamerat. Oma algsel kujul oli see suhteliselt suure korpusega ja varustatud mootoritega. Nendega sai kaamerat igas suunas pöörata (väga ebatäpne lahendus). Igatahes kõik see õnnestus eemaldada ja sääjärel panime kaamera uude kompaktsesse kesta. Nüüd mahtus see roboti esimesele kihile nii, et objektiiv jäi enamvähem palli kõrgusele.

Antud kaamera puuduseks oli aeglus antud Artigo arvutiga. Viidet me alla 5 sekundi ei saanud. Lahendusena katsetasime uut Sony PS3Eye kaamerat. See oli mõeldud spetsiaalselt Playstation 3 jaoks, et seal videotöötlust teha. Sellega saime FPS-i kuni 40 kaadrit sekundis, mis oli igati piisav. Asi oli otsustatud. Järgmine päev ostsime kah selle kaamera ära.

Uue kaamera paigutamine oli alguses natuke problemaatiline. Tahtsime seda võimalikult madalale saada, mis natukene ka õnnestus. See oli vajalik tüütute peegelduste kõrvaldamiseks. Teine probleem, mis vajas kõrvaldamist, oli kaamera liigendiga originaalkinnitus. Alguses tundus, et pall ei lähe kunagi vastu objektiivi. Reaalselt ta siiski läks vastu objektiivi palli haaramisel seina äärest. Igatahes tegime kaamerale jäiga kinnituse ja probleem oligi lahendatud. Hiljem tuli välja ka teine imelik probleem, kus kaamera jooksis järsku kokku. See nähtus ilmnes ainult akutoite pealt. Tõenäoliselt oleks tulnud kaamera juhe teha võimalikult lühikeseks ja ka kaamera korpus veel täiendavalt ära varjestada.

Peamootorikontroller

Roboti peamootorikontrolleri ehitasime seekord ise, kuna kaubanduses sobivate omadustega toodet ei leidunud. Meil oli nimelt vaja ka tagasisidet mootoritelt ja kolme mootori juhtimise võimalust. Igatahes roboti peamootorikontrolleri üritasime teha võimalikult lihtsa ja töökindla.

Peamootorikontrolleri plaadi tegi Rain. H-silla mikroskeemid MCZ33887 tellisime freescalelt sämplitena. Neid läks vaja kolm tükki. Parema jahutuse saamiseks sai need ka läbi plaadi puuritud augu suuremate vask alade külge joota. Igatahes lisajahutust enam hiljem juurde lisada vaja ei olnud.

Kolme H-silla mikroskeemi juhtis Atmega 88. Atmega külge ühendasime ka kõigi mootorite enkoodrite signaalid. Kogu suhtlus arvutiga käis läbi USART-i, mis oli ka optiliselt eraldatud. Alguses kasutasime suvalisi optrone. Siis saime kiireimaks baudrate-iks 1200. Sealt edasi tekkisid tohutud andmekaod. Igatahes peale vastuvõtva poole optroni asendamist kiiremaga saime baudrate-iks 38400.

Tarkvara poole pealt sisaldas mootorikontroller ka algelist PID regulaatorit, mis üritas kõigi rataste kiirused hoida sellised nagu vaja. Iga mootori kiiruse saatsime eraldi. Nii oli lihtne vajadusel asja korrigeerida.

Üldkontroller

Robotil oli palju teisi seadmeid, mis oli vaja arvuti taha ühendada. Alguses mõtlesime selle jaoks Arduino kontrollerit kasutada, kuid leidsime parema lahenduse. Mikk organiseeris meile väikese Luminary Micro ARM-i plaati. Sellele ehitasin ise alusplaadi. Sinna ühendasime siis kogu roboti sensoorika ja nupumajanduse. Sammuti rulli ja löögimehhanismi juhtsignaalid. Toodud kontrolleri hea omadus on selle käitumine USB seadmena.

Alusplaat kujutas endast laiendusplaati, kuhu kõik vajaliku sai ühendada servopistikute abil. Alusplaadil armi kontrolleri poolne ots oli alati signaal. Plaadil on ka kolm releed, mida juhitakse eraldi transistoritega (BC337). Lisaks on veel üks eraldi juhitav LEDi pistik. Toide tuleb plaati ülemisest vasakust nurgast (välimine pistik). Ülemisse pistikusse ühendub 24V toiteplokk. 24V on vajalik pneumo juhtimiseks ja rullimootori käitamiseks. Plaat ise ja ka 24V toide on kaitstud eraldi kaitsmega.

Väravate IR vastuvõtja

Alguses oli plaan teha IR vastuvõtja ümmargune. Plaadi ääres oli 6 vastuvõtjat nii, et kõik suunad oleksid kaetud. See hakkas üsna hästi tööle, kuni selgus, et vastuvõetav protokoll on vale ja antud skeemis kasutatav PICAXE ei võimalda õige protokolli peale üle minna.

Kuna kahest andurist piisas väravate suundade kindlakstegemiseks siis panime kaks andurit otse vaatama ja tegime nende vahele vaheseina. Nüüd sai päris täpselt värava asukohta mõõta. Hetk, kui kaks andurit korraga nägid, tähendas et värav on otse ees. Selle lahenduse tegime makettplaadile. Skeem oli üldjoontes sama nagu eelmisel.

Roboti peaarvuti

Robotit juhtis pisike Artigo PC, mis oli juba eelnevalt olemas. Arvuti protsessori kiirus oli 1 GHz, mälu 1GB ja kõvakettas 80GB suur. Arvuti oli varustatud ka 4 USB, VGA ja võrgupistikuga. Kuna USB pesi jäi väheseks, kasutasime veel ühte täiendavat 4 pordist USB hubi. See oli nii paigaldatud, et selle kaks pesa jääksid roboti kestast välja. Neid kasutasime hiire ja klaviatuuri ühendamiseks. Arvuti operatsioonisüsteemiks valisime Windows XP Professionali.

Arvuti vajas 12V toidet. Alguses kasutasime selleks 14,7V LiPo akut ja 12V pingeregulaatorit. See lahendus ei osutunud eriti töökindlaks, kuna arvuti tarbitav vool oli pidevalt 5A kandis ja regulaator kippus kuumenema. Lisaks sellele ütles see ka pikema töö ajal üles. Järgmisena katsetasime arvuti toitmist 11,1V LiPo aku pealt. Kõik töötas ja otsustasime üldse loobude pingeregulaatorist.

Skeemid

Üldskeem Mootorikontroller Jaotusplaat ARM
Üldskeem Mootorikontroller Jaotusplaat ARM

Tarkvara

Tarkvara platvormi arhitektuur

Roboti baastarkvara töötab PC arvutis. PC on ühendatud erinevat funktsiooni täitvate seadmetega milles kõigis töötab omakorda tarkvara. PC tarkvara koosneb omakorda kolmest projektist: C# rakendusest mis sisaldab olekumasinal põhinevat roboti algoritmi ja graafilist kasutajaliidest, C++ DLL moodulist milles teostatakse kaamera pildilt pallide otsimist ja LibUSB baasil kirjutatud andurite mooduli API-st.

PC rakendus

C# klassidiagramm

PC rakendus on üles ehitatud C# keeles polümorfsetel klassidel. Iga roboti seadme kohta on omaette klass milles on funktsioonid seadme kasutamiseks. Lisaks on eraldi klass algoritmi jaoks. Kuna tarkvara loomise käigus polnud selge milline algoritm või masinnägemise meetod lõpuks käiku läheb, sai koostatud eraldi baasklassid algoritmi ja mäsinnägemise jaoks, et oleks lihtne erinevaid meetodeid proovida. Algoritmi baasklass BaseAlgorithm sisaldab muutujaid masinnägemise, andurite, IR vastuvõtja ja veermiku mooduli objektide hoidmiseks. Neid objekte saavad kasutada algoritmi baasklassi laiendavad klassid, näiteks võistlusalgoritmi sisaldav SimpleAlgorithm klass.

Seadmete klassid sisaldavad seadmete juhtimiseks erinevaid funktsioone ja parameetreid. Näiteks DrivePlatform klass sisaldab funktsiooni roboti liikumisuuna määramiseks. Kuna robot liigub omniratastel on võimalik robotiga sõita edasi/tagasi, vasakule/paremale ning pöörata mõlemale poole. Neid suundasid ja kiirusi antakse edasi Drive funktsiooni x, y ja w parameetritega. Mootorite juhtimine toimub jadaliidese kaudu spetsiaalseid pakette saates. Jadaliidese kaudu töötab ka IR vastuvõtja mis edastab vastuvõetud kanalite numbreid kahelt vastuvõtjalt. IR vastuvõtja klass IRReceiver analüüsib saabunud infot ja leiab peale saatjate olemasolu kanalinumbrite saabumise sageduse järgi lineaarse interpolatsiooni meetodil ka saatjate suuna. Suuna abil sai robot teada palju on vaja pöörata värava suunas, kuid paraku tekkis analüüsiga ka viide ja meetod ei töötanud just kõige paremini.

SensorBoard klass suhtleb andurite ja juhtmooduli API-ga. Klassis käivitatakse eraldi lõim mis pidevalt küsib moodulilt andurite olekut. Olekuinfo on algoritmile kättesaadav läbi avalike klassi parameetrite (property). Lisaks on klassis funktsioonid löögimehhanismi, rulli ja indikaator LED-i juhtimiseks. API-st räägib eraldi peatükk.

Masinnägemisega pildilt pallide otsimine toimub reaalselt küll eraldi projektis kuid C# masinnägemise klassis LineImageAnalyzer tehakse pildi infost kaart. Kaart kujutab endast sektordiagrammi mille keskpunkt on robot. Iga pall või objekt mille masinnägemine pildilt leiab, teisendatakse pildi-koordinaatidest asimuudiks ja kauguseks. Kaart on sisuliselt PhysicalObject tüüpi massiiv. PhysicalObject on klass mis sisaldab peale objekti asukoha veel objekti unikaalset numbrit ja seda nähtud või enam mitte nähtud kordadade loendurit. Klassi laiendavad konkreetsemad Ball, Goal ja Opponent klassid mis sisaldavad lisainfot objekti kohta.

Olekumasina olekudiagramm

Objektide kaardilt otsib algoritm ka lähimat palli mille poole liikuda ja see väravasse lüüa. Algoritm on üles ehitatud olekumasina põhimõttel. Esimeses etapis kontrollitakse erinevate andurite ja/või eelmiste olekute väärtusi ja määratakse uus olek. Teises etapis teostatakse vastavalt olekule mingi liigutus. Olekumasina „otsustav“ ja „tegutsev“ osa on jagatud kaheks kuna mõnikord võib üks tegutsemisotsus tulla mitmest tingimusest. Lisaks on programmikood selgem kui need asjad on eraldatud. Kood on küll pikk if ja else if jada kuid see on üsna ühetasandiline. Kokku on programmis 13 erinevat olekut. Kuna algoritmi sai programmeeritud viimasel ööl siis tagantjärgi on seal mõni asi natuke kahtlane kah, aga põhiline idee peaks arusaadav olema.

Pildituvastus

Nagu öeldud, siis pildituvastus toimub C# projektist väljaspool - selleks on eraldi C++ projekt mis suhtleb PS3 Eye ajuritega ja saab sealt pildi. Pildilt pallide otsimine toimub põhimõtteliselt line scan tehnoloogial kus vasakult paremale otsitakse mitme rea pealt roheliselt taustalt eristuvaid valgeid osasid. Kui mitme rea peal on sarnase X koordinaadi juures valged lõigud siis suure tõenäosusega see on pall. Peale oletatava palli leidmist kontrollitakse piki selle vertikaalset kesktelge kas selle ülemine osa on piisavalt hele ja alumine osa piisavalt tume. Seda võib eeldada kuna pallide allapoole jääv osa on varjus ja pealmine osa valguse käes. Valge värvi alumine nivoo pannakse pallide otsimisel paika adaptiivsel meetodil, kus enne otsimist leitakse otsitavatelt joontelt heledaim osa millest võetakse 75%.

Andurite moodul

Andurite- ja juhtmoodul (eespool ka kui üldkontroller) on ARM tüüpi mikrokontrolleri LM3S5632 plaat sisendite ja väljunditega. Mikrokontroller mõõdab ADC-ga kaugusandurite näitusid, lülitite asendeid ja pallidetektori olekut. Juhib see löögimehhanismi ja rullikut. Mikrokontrolleril on USB liides ja see on programmeritud USB bulk device-ks mis võimaldab sellega suhelda pakettide saatmise teel, mitte voona, nagu USB-serial muundurid teevad. Seega pole vaja otsida paketi alguseid ja arvutada pikkuseid ning kontrollsummasid. Mikrokontrolleri poolel on kasutusel USB teek, arvuti poolel LibUSB Win32 draiver ning isekirjutatud C++ API.

Infomaterjalid

Pildid

Oops, aga mitte muhvigi ei leitud.

Hinnang

Kuigi robot töötas ja täitis võistlusülesande ära, jäid mõningad nõrgad kohad, millega ei olnud ajalises mõttes enam võimalik tegeleda.

  1. Roboti veosüsteem oli veidi problemaatline. Mehhaanilise poole pealt oleks tulnud rattad ka teiselt poolt toestada. Kuna meil oli see tegemata, langes mootori võllile suur koormus. Tulemuseks oli ratta kinnituskruvi lahtitulek ja muidu kaheksas rattad.
  2. Pneumaatika kasutamine sellisel robotil tundub suhteliselt hea idee olevat. Praeguse süsteemi puuduseks oli liiga raske õhumahuti. Mahuti oleks ise tehes saanud kergema.

Arvestades seda, et finaalist jäime välja RK teise robotiga võisteldes, läks antud robotil väga hästi. Robot suutis igatahes kõik võistlused vapralt vastu pidada. Erilisi tehnilisi probleeme võistluse ajal ei esinenud.

projektid/voistlusrobotid/robotex/2009/voistkonnad/3.txt · Viimati muutnud: 2016/09/03 15:43 persoon raivo.riiel