Kasutaja tarvikud

Lehe tööriistad


projektid:voistlusrobotid:robotex:2009:voistkonnad:2

Robotex 2009 võistkond "1.3.5"

Liikmed

Dokumentatsioon

Lahenduse kirjeldus

Roboti üldine kirjeldus.

Roboti alumine osa on silindrilise kujuga, ülemist osa kaunistas must mingi otstarbetu asi. Kere on kahe kihiline. Kihte eraldas alumiiniumist ringikujuline plaat.

1) Alumisel kihil paiknevad veomootorid, peamootorikontroller, kaitsmeblokk, aku ja kaamera.

2) Teisel kihil on löögimehhanism, rull, ARM'i plaat, arvuti ja ülejäänud elektroonika.

Palli otsimiseks kasutasime logitechi veebikaamerat.

Mehhaanika

Roboti veoajam

Robotit veavad edasi 3 mootorit, mille külge on kinnitatud Härra Viilupi tehtud puksid omniwheelide tarvis. Mootoritena kasutasime kolme EMG30 enkoodriga ja reduktoriga varustatud mootorit.

Löögimehhanism

Esialgne plaan oli kasutada löömiseks solenoidi, kuid sellega ei saavutanud me soovitud löögi kiirust ja kondensaatorite mahutamine oleks keeruliseks läinud. Kasutusel läks Härra Viilupi toodud auto tagaluugi lukustusmootor. Jõudu sellel oli. Kiirust sai suurendatud jõu õlaga. Suur eelis solenoidi ees oli see, et ei pidanud ootama kondensaatorite laadumist ja võis paugutada kuidas vajadus oli.

Rullimehhanism

Pöörlev rull oli vajalik pallide kinnihoidmiseks, et robotil oleks võimalik vajaminevaid manöövreid teha värava leidmiseks. Idee saime professionaalsetelt jalgpallirobotitelt. Teostus küll nii hea ei saanud.

Sai katsetatud igasugu variante. Jäigalt kere külge kinnitatud rull hakkas robotit liialt väristama ja vahepeal lõi palli hoopis eemale. Esialgsed rullid olid kõik jäigalt mõeldud, mistõttu sai proovitud erinevate suuruste ja materjalidega. Kõige parema tulemuse andis plastiktorule tõmmatud õhukumm. Rull tuli päris jäme ja ajas kuidagi asja ära. Pärast esimest peaproovi spordihoones nägime ära, et liikuva rulliga on palli kaotamise võimalus palju väiksem ja tegime endale ka.

Elektroonika

Roboti elektroonika koosneb akust, SHARP analoogväljundiga IR anduritest(GPD12 jt) ja järgnevalt toodud moodulitest, mis moodustavad koos veomootorite, rulli- ja löögimehhanismi täitur seadistega tervikliku süsteemi, mida oli tarvis 2009 robotexi ülesande lahendamiseks.

ARM

Luminary Micro LM3S1968 Evaluation Board. Moodulis realiseeriti kogu roboti juhtimine. See võttis vastu anduritelt info ja küsis PC’lt visiooni palli asukohtade kohta. Mootoreid juhtis läbi UART liidese alumise mootorikontrolleri plaadiga. Osutus natukene ebakindlaks plaadiks elektrooniliselt (otsustas staatika pärast läbi põleda). Samuti tuleb ära mainida see, et kuna kogu voolutarve kiibil pidi jääma väga väikeseks, siis väljundpinnidest tuli välja vaid 3-5mA. Rohkem infot ARM mooduli kohta leiab:http://focus.ti.com/lit/ug/spmu037/spmu037.pdf

PC

ASRock ION 330 PC. Lisa infot leiab: http://www.asrock.com/nettop/overview.asp?Model=ION%20330

DC/DC muundur

Moodul, mis teeb 11,1 V LIPO aku pingest 19V pinge PC toiteks. Tegemist on valmis mooduliga. Väljundpinge valik on seadistatav 15…24 V ja väljund vool max 3,5 A.

Akutester

Moodul, mis annab märku LED-ga ja heliga kui LIPO aku on saanud liiga tühjaks. Tegemist on Robotiklubis valmistatud mooduliga. Hakkab vanaks jääma (suur ja kohmakas). Soovitan kasutada seda, mida kasutas meeskond 1 „Mäger“.

Kaamera

Kaameraks kasutasime logitechi Pro 9000. Kuigi fps oli madalam kui Sony kaameratel oli pilt, mis kaamerast tuli paremini töödeldav. Samuti oli kaamera võimalik paigutada madalamale kuna selle lahti võtmine ja monteerimine oli lihtne.

IR kontroller

Isevalmistatud moodul, mille abil robot tuvastab väravaid. Võtab vastu RC5 koodi ja tuvastab TV kanaleid 1…4. Baseerub ATiny45 kontrolleritel. Moodulis on 2 vastuvõtjat ja nende vahel eraldav sein, et saaks tuvastada värava saatja asukohta ja positsioneerida robot palli lööma värava keskele. Mõlema vastuvõtja jaoks on oma kontroller. Kanal valitakse dil lüliti abil. Kuna kontrolleril on vähe IO-d, siis kanali valikuks kasutatakse takistimaatriksit ja ADC-d. Moodul annab väljundiks 4 binaarsignaali: 1) kas vastuvõtjasse jõuab lülitiga valitud kanali signaal(vastase värav). 2) kas vastuvõtjasse jõuab signaal teisest kanalist(oma värav). 3,4 samad signaalid teisest vastuvõtjast. Lisaks on ka 4 LED-i, mis näitavad signaalide olekut. Töötab 5 V toitepingel, väljundis on pingejagur 5 ⇒ 3,2 V.

Löögimehhanismi draiver

Löögimehhanismi draiveriks oli tavaline H-silla moodul vanalt robotilt. Kuna lööjaks oli lineaarmootor (auto luku mootor), mis ei tarbinud just väga palju (paar amprit) siis sellest täiesti piisas

Toite regulaatorite/jaotus moodul

Isevalmistatud moodul, kus on kaitsmed ja tehakse erinevate moodulite jaoks 11,1 V akupingest madalamad toitepinged. Seal on 2 lineaar 5 V pingeregulaatorit, millelt saavad toidet servod ja mootori draiveri mikroskeemi L298 loogikaosa, samuti SHARP IR andurid, palli andur ja IR kontrolleri moodul. Monteeritud rohelisele montaažplaadile.

Bufferloogika moodul

Isevalmistatud moodul, mis on vajalik ARM kontrolleri väljundite ja teiste moodulite liidestamiseks, kuna ARM-i väljundid annavad vähe voolu. Baseerub 74AC541N mikroskeemil. Töötab 3,3 V toitepingel. Monteeritud montaažplaadile.

Palli andur

Isevalmistatud andur, mis on vajalik selleks, et tuvastada kas pall on löögiulatuses roboti ees. Baseerub Hamamatsu anduri S4282-51 mikroskeemil. Andur paigutatud löögimehhanismi külge. Teisele poole paigutatud roosa LED. Rohkem infot ja skeem Hamamatsu anduri kohta: http://www.digchip.com/datasheets/parts/datasheet/190/S4282-51-pdf.php

Mootoridraiver

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 UART-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.

Skeemid

(tühi)

Programm

Roboti programmiloogika on jaotatud enam vähem viieks: Luminary ARMi plaadi kood, PC pilditöötluse programm, palliotsimise algoritm, mootorikontrollerite kood ja IR andurite kontrolleri kood. ARMi kood ja PC programm on kirjutatud niimoodi, et need suhtlevad omavahel sünkroonselt. Siiski roboti loogika on kirjutatud ARMi koodi. Kõik robotile antavad käsklused otsustab ARMi plaat, mitte PC. ARMi plaat kogub kokku erinevatelt anduritelt kõik vajaliku informatsiooni ja siis vastavalt sellele liigub ühest olekust teise. Sisuliselt on tegemist roboti „state machine“-ga. PC tegeleb veebikaamerast pildi võtmisega, pallide tuvastamisega ning info saatmisega ARMile.

Luminary Micro ARMi kood

ARMi kood on realiseeritud C keeles, kasutades Keil arenduskeskkonda. ARMI koodis on lõike, mis on realiseeritud kahele erinevale ARMi plaadile, kuna roboti ehitamise jooksul põles maha antud plaat korda korda.

Robotil on peamiselt kaks olekut, milleks üks olek on see, kui hetkel arvatavalt on meil pole käes palli ja oleks, kus pall on olemas. Mõlemal olekul on niiöelda alamolekud, milleks on oleks kus üritatakse palli leida PC-lt saadud andmetest. Juhul kui PC ei suutnud pildilt palli tuvastatakse, siis kukutakse olekusse, kus tehakse umbes 60* pööre vasakule. Peale mida kukutakse tagasi pallituvastamise olekusse. Kui PC suutis tuvastada palli, siis kukutakse olekusse, mis tegeleb palli poole liikumisega.

Palli poole liikumisel on kaks olekut. Kui pall on otse ees, siis liigutakse suhteliselt suurel kiirusel otse palli suunas kuni see käes on või arvatav pall liigub roboti liikumissuuna suhtes veebikaamera pildilt liialt välja. Kui on juhtunud eelkirjeldatud olukord, siis pööratakse seni palli suunas, kuni pall on liikunud üle veebikaamera vertikaalse joone, mis jagab pildi kaheks võrdseks osaks. See loogika peaks vältima seda, et ei hakataks liialt hüppama nende kahe oleku vahel. Kui pall kaob vaateväljast, siis kukutakse tagasi palliotsimise olekusse. Kui pall on kätte saadud, siis kukutakse teise teise peaolekusse. Selle oleku esimeseks alamolekuks on värava suuna tuvastamine. Kui värava suuna ei tuvastata, siis kukutakse olekusse, mis liigutab robotit, mille järel kukutakse eelnenud olekusse. Kui nüüd on värav leitud, siis pööratakse selle suunas seni, kuni 1. IR andur lakkub nägemast väravat ja teine hakkab nägema. Kui pööramisel värava nägemise vahele tekib pime koht, siis pööratakse seni, kuni teine andur hakkab nägema väravat ning pööratakse tagasi andurite pime aeg jagatud kahega. See peaks roboti löögisuunaks seadma täpselt värava keskme. Kui selle peaoleku jooksul kaob pall rulli alt kauemaks kui 1 sekund, siis kukutakse 1. peaolekusse, kus me oletame, et meil ei ole palli. Kõige eelnevaga on seotud mitmed katkestused: 3 Sharpi seina, värava ja vastase roboti tuvastamiseks, 3 USARTi PC-ga suhtlemiseks, mootorite kontrollerile käskude andmiseks ja IR kontrollerilt väravateinfo saamiseks ning Hamamatsu palli olemasolu kontrollimiseks.

ARMi kood on suhteliselt rahuldavalt kommenteeritud. Peaks olema igale ühele arusaadav peale mõningast uurimist.

Mootorikontroller

(tühi)

PC programm

PC kood on realiseeritud C# keelt, .NET raamistikku ja EmguCV-d kasutades.

Algselt sai kogu palliotsimine tehtud kasutades EmguCV-d, ehk OpenCV wrapper C#-le. Sai proovitud mitmeid variante, kuidas palli tuvastada pildilt, kuid need olid liialt aeglaselt. Siiski kõige tõhusamaks meetodiks oli HSV kolme kanali kahekordne filterdamine. Nendeks filtriteks olid rohelise värvi ehk platsi eemaldamine pildilt, ning seejärel RGB rohelise kanali threshold-ga mängimine. Järgnevalt lasti mõlemast tulemusest üle HoughCircles ringiotsimisalgoritm. Lisaks oli programmi sisse ehitatud konfiguratsiooniaken, kust oli võimalik panna sama pilti analüüsima erinevate parameetritega. Selleks oli tehtud niiöelda prioriteedinimekiri, mille alusel hakati otsima väiksemaid ehk kaugemaid palle pildilt, kui lähemaid ei leidunud. See suurendas programmi kiirust. Siiski selle meetodiga sai liialt palju läbu pildilt ja oli peaagu 10x aeglasem, kui kasutades C++'is loodud palliotsimisalgoritmi teeki.

Lõpptulemusena valminud programm on suuteline töötlema maksimum 40 kaadrit sekundis, kasutades selleks C++'i teeki. Siiski sai ehitatud ka sinna sisse konfigureeritav nimekiri, mille järgi palle tuvastati. Kõige prioriteetsemaks loetakse seda palli, mis on pildil kõige suurem, ehk kõige lähemal.

Kui alguses sai kasutatud EmguCV-d, et otsida palle, siis lõppversioonis on ta vaid selleks, et saada kaamerast kätte pilt, mida analüüsida. Kaamerast saadud pilt

Lisavõimalusena sai sisseehitatud ka funktsionaalsus „M-O Takeover.“ Ehk siis saab roboti elementaarsemaid toiminguid teostada andes USART-i kaudu ARM-ile teada, mida ta programmi miski nupuvajutuse peale tegema peab: sõida, pööra, löö. Kahjus millegi pärast ei töötanud see lisaväärtusfunktsionaalsus piisavalt hästi. Aja nappimise tõttu sai tegeletud targemate asjadega, mille tõttu ka sellisesse seisu jäi.

Palliotsimise algoritmi kood

Kuna kaamera on seatud täpselt roboti keskele ja veebukaamera pildi keskpunkti horisontaaljoon peab olema täpselt palli keskpunkti kõrgusel. Selle põhjuseks on see, et saaks leitud palli suuruse järgi oletada, kui kaugel ta asuda võib.

Palliotsimiseks on 2 algoritmi. Esimene otsib lihtsalt kindla pikkusega joont. Seda kasutatakse enamasti ainult kaugemate pallide leidmiseks. Selle algoritmi tulemust ei peeta nii prioriteetseks, kui teise algoritmi tulemust.

Teise algoritmi põhimõte seisneb selles, et otsitakse pildil kindla joone pealt värvi muutumist niiöelda palli värviks. Palli värviks muutumise punktist hakatakse diagonaalis alla liikuma ja otsima varju, ehk siis kindla tumedusega värvipikslit. Järgnevalt liigutakse enam vähem diagolaali pikkuse võrra üles ja vaadatakse, kas see punkt on piisavalt hele. Kui kõik eelnevad tingimused täideti, siis leiti pildilt pall. Samamoodi tehakse ka teistpidi. Ehk siis kui palli värv muutub mitte-pallivärviks. Siis liigutakse teistpidi diagonaalis ja otsitakse varju.

IR kontroller

(tühi)

Pildid

Hinnang

Kaarel

Tiimi töö sujus üsna hästi. Siiski langetas motivatsiooni pidev ARMi kontrolleriplaadi vahetus. Seoses sellega läks ka umbes nädal arendusaega tuksi.

Kui eeldatavalt enne võistlust sai kõik puudused ära lihvitud, siis jäis siiski üks suur viga sisse. Robotil olid sharp andurid liiga kõrgele seatud ja me ei näinud enam madalamaid roboteid. Me ei olnud arvestanudki, et robotid võivad nii madalad olla. Enamasti olime varem väljakul olnud vaid oma klubi robotitega, mis olid peaaegu maksimumkõrgusega. Sharpid olid seatud täpselt nii kõrgele, et pallid ei tekitaks valehäireid. See andiski tunda reaalsel võistlusel.

Lisaks oleks võinud palliotsimisalgoritmi väheke paremaks programmeerida. Kui hetkel otsitakse lihtsalt kindlat värvitugevust või tumedust, siis oleks võinud realiseerida ka kindla värvivahemikust arusaamise funktsionaalsuse. See oleks lõppvõistlusel vähendanud kõvasti pildilt nähtavat läbu. Lõppvõistlusel oli valgus nii palju tugevam, mis tekitas ainult jooneotsimise algoritmil mõningaseid vigu, mille tõttu näiteks ründas meie robot teist robotit arvates, et seal asub pall.

ARMi kood, mida me Rainiga kahekesi manageerisime on üpris hästi kommenteeritud võrreldes teiste koodirealisatsioonidega. Lisaks on kood struktureeritult jaotatud mitmesse erinevasse faili.

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