Table of Contents
Robotex 2010 võistkond "TTÜ Robotiklubi Medved"
Liikmed
- Sergei Ovsjanski - elektroonika/mehaanika -kapten
- Konstantin Shibin - programmeerimine/elektroonika
- Vadim Ljagatśov - abiline
- Andres Kangur - abiline
Roboti üldine kirjeldus
Robot “Medved” on tehtud kihilise ülesehitusega. Alumine ja ülemine kihid on tehtud alumiiniumist, mis oli tellitud firmast AQ Lasertool (nad teevad alumiiniumdetailide laserlõikust). Keskmine kiht on lõigatud pleksiklaasist.
Esimesel kihil paiknevad roboti veomootorid, mootorikontroller ja üks LiPo aku.
Teisel kihil paiknevad infrapuna andurid, löögimehhanism koos võimsa ja massiivse solenoidiga, rullimehhanism, jaotus moodul, Xbee laiendus plaat, solenoidi draiveri skeem ja muu elektroonika komponendid.
Kolmandal kihil paikneb PC arvuti, DC-DC konverter ning teine LiPo aku. Roboti peal on PS Eye kaamera ning roboti nupud ja staatus indikaatorid, nii nimetatud “juht paneel”.
Mehhaanika
Roboti veoajam
Kolme omniratta platvorm.
Pallihoidja
Kasutusel on 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.
Löögimehhanism
Me kasutame võimsa ja massiivse solenoidi autost. See on nii nimetatud solenoid, mis on kasutusel kõikides autodes starteri süsteemist. Eelis on selline, et pole vaja kõrgepinge. Sisendil on ainult 12V. Teoreetiliselt on võimalik panna 24V ja solenoidi töökiirus suureneb, aga me ei proovinud. Mõned puudused ka olemas, solenoid tarbib palju voolu (umbes 5A), see tõttu meil on kasutusel ainult tema jaoks eraldi LiPo aku. Teine aspekt, mis vaja arvestada töötades selle tüüpi solenoidiga: solenoidi tööaeg on umbes 1 sek. Struktuurselt solenoid koosneb kahest induktoritest. Kui tööaeg on rohkem kui 2 sek ning vool on 5A, siis ta põleb ära. Solenoidi kontrollimiseks mikrokontrolleri abil oli realiseeritud solenoidi draiver. Rohkem info skeemi kohta elektroonika osas.
Mootorid
Mootori andmed on kirjas alljärgnevas tabelis.
Perfomance | Physical | ||
---|---|---|---|
Model | M5-RS550-12 | Weight | 7.7 oz (218g) |
Operating v | 6v - 14.4v | Length - for motor | 2.24 in (57mm) |
Nominal v | 12v | Diameter (with flux ring) | 1.52 in (38.5mm) |
No Load RPM | 19300 | Diameter (no flux ring) | 1.41 in (35.8mm) |
No Load A | 1.4A | ShaftDiameter | 0.12 in (3.2mm) |
Stall Torque | 486.2 mN-m | ||
Shaft Length | 7.6mm | ||
Stall Current | 85A | ||
Kt | 5.7 mN-m/A | ||
Kv | 1608 rpm/V | ||
Efficiency | 70% | ||
RPM - Peak Eff | 1700 | ||
Torque - Peak Eff | 62.4 mN-m | ||
Current - Peak Eff | 10.9A |
Reduktorid
Reduktoritena kasutame, Banebots-i P60 planetaarreduktoreid ülekandearvuga 16:1. Täpsemad reduktori andmed on kirjas alljärgnevas tabelis.
Physical Specifications | |
---|---|
Type | Planetary |
Reduction | 16:1 |
Stages | 2 - 4:1, 4:1 |
Gear Material | Steel |
Weight | 8.0oz (227g) |
Length | 1.9in (48.3mm) |
Width (Square) | 1.5 in (38.1mm) |
Shaft Diameter | 0.50 in (12.7mm) |
Shaft Length | 1.5 in (38.1mm) |
Shaft Key | 0.125 in (3.2mm) |
Shaft End Tap | #10-32 |
Mounting Holes (8) | #10-32 |
Failid
Elektroonika
Mootorikontroller
See on Robotiklubi poolt välja töötatud moodul. Toite vahel on lisatud kolm 200uF kondensaatorid, et vähendada häireid. Häirete vähendamiseks on veel mootorite juhtmed kokku keerutatud ja keeratud ümber ferriit rõngaste, samuti on ka 150nF kondensaatorid mootori harjadel.
Rohkem info mootorikontrolleri kohta leiab http://www.robotiklubi.ee/projektid/pisi_xbee2
Kaamera
Kaamera on sony playstation-i lisamoodul: „PlayStation Eye“. Ühendatakse USB liidese abil. PC jaoks on ka netist leitav draiver. Rohkem infot kaamera kohta leiab: http://en.wikipedia.org/wiki/PlayStation_Eye
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 Rohkem infot: http://www.oomipood.ee/?t=k_ki&i=MW2172CE
Löögimehhanismi/Solenoidi juhtskeem
See on meie tiimi isevalmistatud moodul. Skeem on tehtud taimeri 555 baasil, mis on lülitatud “astable” režiimis. Tööpõhimõte on selline. Skeem genereerib väike impulss 200ms laiusega, mis on piisab, et kiiresti lülitada solenoid ja kohe välja lülitada. Sest solenoid on võimas mänguasi ning tarbib palju voolu (umbes 5A) skeemile oli lisatud PC817 optocoupler. Seda vaja kaitsmisele, et isoleerida madalpingeline mikrokontrolleri ahel. Veel skeemil on muutuv takisti, mis on vaja impulssi laiuse muutumisele. Samuti skeemil on paigutatud kaitsme (Fuse=6A)
Toite regulaatorite/jaotusplaat
See on meie tiimi isevalmistatud skeem, kus on paigutatud kaitsmed ning konverter 12V akupingest madalama toidepingele. Skeemil on lineaar 5V pingeregulaator LM7805 ning ka LEDid, mis näitavad kaitsmete olekut.
Toide
Toideks on kolm LiPo akud. Üks LiPo aku 4000mAh on PC arvutile. Teine LiPo 3200mAh on kogu elektroonikale, mootoritele, anduritele. Ja viimane LiPo on solenoidile. Samuti kasutati LiPo alarmid. See on moodul, mis annab märku LED-ga ja heliga kui LIPO aku on saanud liiga tühjaks. Sobib kasutamiseks 2 ja 3 elemendiliste LIPO akudega, mille pinge on 7,4 .. 11,1 V. Ühendatakse LIPO aku balancer-i pistikusse. Meie robotil on neid kasutusel 2 tk.
Rulli juhtskeem
See on väga lihtne skeem: üks transistor ja kaks takisti. Transistor töötab võtme reziimis. Kui mikrokontrolleri väljundil on loogiline 1 siis transistor on lahti ning mootor töötab, kui mikrokontrolleri väljundil on loogiline 0 siis kõik vastupidi ehk motor ei liigu.
Palliandur
Palli tuvastamiseks rulliku all kasutatakse infrapuna peegeldusandurit. Saatajalt peegeldunud kiirgus jõuab vastuvõtjasse ja selle kiirguse intensiivsuse järgi saab määrata objekti kauguse. Intensiivsus sõltub lisaks kaugusele ka objekti pinna värvist ja siledusest.
Kuna võistlusel on alati palju välklampe, kaameraid, valgusteid jms infrapunakiirguse allikaid, siis kasutatakse moduleeritud signaali, st saatja kiirgab teatud sagedusel ja vastuvõtja reageerib ainult sellel sagedusel olevale signaalile. Kõik selle teeb ära üks integraallülitus - Hamamatsu S4282-51. Ainsaks väliseks komponendiks on infrapunakiirgur (diood) ning tundlikkust reguleeriv takisti jadamisi dioodiga.
Andurid
Meie tiim kasutab neli IR sharp - gp2y0a41sk0f andurid. Kaks andurid vaatavad ette ja kaks mõlemalt poolt. Tagasi andurit ei ole. Kauguse limiit on 30cm. Tööpinge on 4.5-5.5V. Rohkem info võite leida siin
Skeemid
Skeemid ja PCB failid Eagle formaadis
Tarkvara
Roboti “tarkus” peamiselt sisaldus PC-tüüpi arvutis, mille peal töötas C#-is kirjutatud programm. Lisaks sellele, robotil oli veel kaks arvutusühikut: Atmel AVR tuumaga mikrokontrollerid, neist üks töötas mootorikontrollerina, teine laiendusplaadi kontrollerina. Aga mikrokontrollerite tarkvara arendus on väljaspool selle roboti kirjeldamise skoopi. Järgnevalt kirjeldatakse ainult tarkvara PC osa.
Kuna mootorite ja sensorite/täiturite juhtimine oli teostatud mikrokontrolleritel (siin on vaja kiiret reaktsiooni, nt. PID-regulaatori jaoks, arvutist juhtimine oleks liiga aeglane), arvutile jäi tegeleda roboti käitumisega ja pilditöötlusega.
Pilditöötlus
Pilditöötluse jaoks oli kasutatud olemasolev teek, mis on osa AForge.NET framework-ist: AForge.Imaging. See on kirjutatud C# keeles ja seda on mugav kasutada C# programmist.
Pilditöötlusel on kaks põhiülesannet: otsida kaamera pildist pallid ja väravad. Kuna pilditöötlus on arvutuslikult raske ülesanne ja roboti arvutil oli suhteliselt nõrk CPU (Intel Atom), siis seda tuli teha maksimaalselt efektiivselt. Näiteks, oli proovitud erinevad teegi poolt pakuvatad filtrid ja teisendused, mõned neist ei saanud kasutada just “raskuse” tõttu. Õnneks, pilditöötluse kaks ülesanned ei pea kunagi töötama samaaegselt, nii et kogu CPU võimsus oli ühe algoritmi käes korraga.
Meie arvutiga oli veel üks alternatiiv: kuna see baseerub Nvidia ION platvormil, on võimalik käivitada arvutusi videokiibil (kasutades CUDA tehnoloogiat), see peaks olema kiirem, kui CPU-l tehtav pilditöötlus ja lisaks vabastaks CPU ressurse. Aga aja ja kogemuse puudumise tõttu (tuleks ise kirjutada kõik pilditöötluse algoritmid) sellega otsustati mitte tegeleda.
Palli otsimiseks oli proovitud erinevad meetodid:
Palli tuvastus värvi järgi
See on esimesena pähe tulev meetod: pall on valge ja peaks olema väga hästi eristatav väljaku foonil. Selle meetodil on mõned probleemid: ainult pool palli on pildil valget värvi. Ülejäänud on hall ja must (sõltub valgustusest). Selle meetodi rakendamiseks tuleb kasutada värvifiltrit, mis jätab pildile ainult vastava värviga piksle.
Palli tuvastus kontuuri järgi
See meetodi idee seisneb selles, et palli ja väljaku vahel pildil on järsk värvi muutus. Värvi filtreerimisega on raske leida palli alumine osa, kuid see on võimalik servaotsiva filtriga. Tuli välja, et kõige optimaalsem on SobelEdgeDetector filter. Selle meetodi probleem on tema tundlikkus: see aitab leida kogu palli kontuur, kuid reageerib isegi väikesele värvi muutusele väljaku servades, kus väljaku kate seintel on natuke teise valguse all, kui kate väljaku põhjal. Kui pall on väljaku servale liiga lähedal ja robotist liiga kaugel, on juba väga raske eristada palli vormi filtreeritud pildil.
Lõpuks oli valitud tuvastus värvi järgi RGB värviruumis. HSL värviruum sobib vähem, kuna valgel värvil ei ole kindlat tooni (hue). Pärast pildi filtreerimist pildil jäävad ainult pikslid, mis vastavad filtri kitsendustele. Üks-teise juures olevad pikslid moodustavad regioone, mida kutsutakse blob-ideks. Järgmine pilditöötluse etapp on valida jäänud blob-idest vajalikud, mis vastavad otsitava objekti (pall, värav) omadustele.
Esiteks, blob-ide filtreerimiseks on seadistatud kitsendused: minimaalne ja maksimaalne laius/kõrgus pikslites. Seejärel valitakse vaid need blob-id, mille kujud on sarnased otsitava kujuga. Palli korral pildilt tuleb otsida ringikujulisi blob-e, mis on suure tõenäosusega pallid. Selleks kasutati AForge.NET teegist klassi SimpleShapeChecker. Aga tuli veidi seda aidata. Probleem on selles, et see kontrollib kõiki blob-i servat moodustavaid punkte kuuluvuse antud kujule (palli korral ringile). Kuna üldjuhul pildil sai tuvastada ainult palli ülemine pool, saadud blob ei olnud ringikujuline. Teades seda, on võimalik lisada üks palli põhjale vastav punkt, millega see algoritm leiab korrektse palli raadiuse ja keskpunkti pildil.
Pärast ringikujulisi blob-ide leidmist kontrollitakse veel üht omadust: kas selle asukoht pildil (Y koordinaat) vastab ringi raadiusele. On võimalik leida matemaatiline seadus kuidas palli raadius pildil sõltub tema asukohast pildil (mis sõltub palli kaugusest robotilt). Kui leitud blob-i raadius ja asukoht ekraanil ei vasta sellele seadusele, siis järelikult see ei ole pall. Teades täpse seaduse, on võimalik eristada pallid, mis on värava sees nendest, mis on veel väljakus. See on vajalik tegevus, sest vastasel juhul robot hakkab proovima võtma palle, mis on juba väravas (seda probleemi võib üldse elimineerida kui panna kaamera alla – siis väravas olevad pallid on valel tasemel ja neid ei tuvastata).
Peaaegu sama algoritm kehtib väravate otsimise puhul, kuid seal kasutakse HSL värviruumis töötavat filtrit (väraval on kindel värv) ja otsitakse ristküliku kujuga blob-e.
Juhtimisalgoritm
Juhtimisalgoritm põhiülesanne on otsustada, mida peab robot käesoleval hetkel teha. Selleks juhtimisalgoritm võtab vastu info pilditöötlusest, anduritest, nuppudest. Väljunditeks on käsud mootorikontrolleritele ja teistele täituritele (rulliku mootor, solenoidi draiver).
Juhtimisalgoritm töötab oma lõimes (thread), sest ta peab alati olema võimeline teha otsuseid. Teised tegevused (eriti pilditöötlus) ei tohi juhtimisalgoritmi tööd segada.
Et lihtsustada silumist, robotit on võimalik viia käsijuhtimise režiimi – siis on võimalik robotit käsitsi liigutada, rakendada täitureid, samm-sammult vaadata juhtimisalgoritmi tööd.
Juhtimisalgoritm on realiseeritud olekumasina põhimõttel: on mitu olekut, milles algoritm võib olla ja võimalikud siirded ühest olekust teis(tess)e. Võimalikud olekus on järgmised:
- Idle – robot on peatatud.
- InitialState – roboti stardiolek. Automaatrežiimis sellele kohe järgneb SearchForBall. See olek on kasulik käsirežiimis.
- SearchForBall – otsitakse palle. Robot pöörleb ümber oma telje ja püüab kaameraga leida palle.
- ApproachBall – pall on leitud ja robot suundub selle juurde.
- AlignWithGoal – robot hoiab palli ja nüüd pöörleb ümber oma telje ja otsib kaameraga väravat.
- KickBall – värav on leitud, kõik on valmis et lasta pall väravasse. Rakendatakse solenoid.
- WanderingAround – kui robot pöörles olekus SearchForBall liiga kaua ja ei näinud palle, siis see võib tähendada et palle enam ei ole või pall on liiga kaugel ja pilditöötlus ei saa seda tuvastada. Siis robot valib suvalise suunda ja liigub mõni aeg sinna ja proovib uuesti leida palle.
Üks roboti konstruktsiooni eripära on see, et kaamera ei näe mis toimub vahetult roboti ees: 10cm roboti ees ei ole kaameraga nähtavad. Selle tagajärg on see, et kui robot sõidab palli juurde (olekus ApproachBall), siis viimased 10cm teest peab ta sõitma pimesi. Kui pall kaob vaateväljast ära ja viimasel hetkel ta oli pildi alumise serva keskel (siis robot saab seda sõites edasi), siis käivitatakse taimer, mille lõppemiseni robot peaks palli saama (seda saab teada andurist). Kui taimer lõpeb varem, siis edasi pimesi enam ei sõida ja hakatakse otsima palli uuesti.
Pildid
:projektid:robotex:2010:voistkonnad:medved:pildid