User Tools

Site Tools


projektid:voistlusrobotid:robotex:2008:voistkonnad:1

Robotex 2008 võistkond 1 - "V.O.L.T"

Võistkond

Visioon robotist

Robot kasutab videotöötlust objektide tuvastamiseks ja eristamiseks. Purgid ja sokid korjatakse robotile sõitmist aeglustamata( st nii kiiresti kui võimalik) ning korjamisel ei ole vajadust tuvastada objekti, vaid korjatakse automaatselt. Kui objektid on kokku korjatud, viiakse kõik korraga kogumisaladele.

Dokumentatsioon

Lahenduse kirjeldus

Robot kasutab videotöötlust objektide tuvastamiseks ja eristamiseks. Purgid ja sokid korjatakse aeglustamata ning korjamisel ei ole vajadust tuvastada objekti, vaid korjatakse automaatselt. Purkide korjamiseks on traatidest kaldtee, mida mööda purk nelja mootori abil kogumiskasti libistatakse. Sokkide korjamiseks on roboti tagaosa all metallist konksukesed, mille taha sokk sõites kinni jääb. Kui kõik objektid on kokku korjatud, siis viiakse kõige pealt purgid vastavasse kogumisalasse ja seejärel sõidetakse sokkidega sokkide kogumisalasse.

Komponentide nimekiri

Komponent Kasutuskoht Kogus
Alumiinium profiil Kere 1 m
Artigo PC Mõistus 1 tk
Sõiduplatvorm RD01 Sõitmine 1 tk
Kõvaketas 80GB PC 1 tk
Mälu 1GB PC 1 tk
XBee plaat Sõidumootorid, andurid, nupud 1 tk
DC mootor Purkide “sissetõmbamine” 4 tk
Aku - LiPo PC ja sõiduplatvormi toide 2 tk
VF0150 veebikaamera Masinnägemine 1 tk
Alumiinium plaat 3mm Kere vaheseinad 500*250mm
Alumiinium nelinurklatt 10*10 Keredetailid 0,5 m

Mehaanika

Alumiiniumi painutamine

Selleks, et painutada paksemat duralumiiniumi lehte (>2mm) mõistliku painutusraadiusega nii, et see ei murduks tuleb alumiiniumit pehmemaks saada. Selleks, et on vaja seda karastada. Erinevalt terasest muutub alumiinium karastades pehmemaks, kuid tagastub aja möödudes samale kõvadusele, mis varem(vananeb). Toa temperatuuril toimub see protsess u 1 päevaga.

Kuigi alumiiniumi karastamise temperatuur ja aeg oleneb alumiiniumi tüübist ja paksusest võib välja tuua järgnevad üldised sammud karastamiseks:

  1. Seadistada ahi ~300 kraadi peale.
  2. Asetada detail(id) alusega ahju.
  3. Kuna detailid jahutavad ahju, siis oodata kuni ahi saavutab esialgse temperatuuri ning vaadata aeg.
  4. Lasta detailil olla ahjus ~30 minutit.
  5. Võtta detail ahjust nii välja ja visata vette nii kiirest kui võimalik.

Pärast seda on paar tundi aega, enne kui kõvemaks jälle hakkab muutuma, selle painutamiseks. Nagu eelnevalt mainitud, saavutab detail oma varasema kõvaduse u 1 päeva jooksul.

Mudel

Elektroonika

Sõiduplatvormina kasutatakse RD01 süsteemi, mis koosneb kahest mootorist ja I2C siini kaudu juhitavast kontrollerist. Kontrolleriga suhtleb Pisi XBee plaat, mis on USB kaudu ühenduslüliks arvutiga.

Pisi Xbee plaadiga on ühendatud peale mootorite kontrolleri veel: üks servo, mille ülesandeks oli purkide kogumiskasti kaldteelt tõkkepuu eest ära tõsta; 2 infrapuna kaugusmõõdikut; start nupp; purkide loendur.

Kogu robotile annab toidet 2 LiPo akut. Üks aku(14,7 V) toidab ainult PC'd - arvutuste kohaselt jätkub akut 1h. Teine aku(11 V) on ülejäänud süsteemi toitmiseks(Xbee, DC mootorid)

Programm

Videotöötluseks kasutatakse Linuxiga PC-tüüpi arvutit ja OpenCV vabavaralist masinnägemisteeki. Pilditöötlusega leitakse kõik tumedad alad (sokid ja purgid) ning arvutatakse nende asukoht väljakul. Roboti eesosas asuvate infrapuna-kaugusmõõdikute abil leitakse kataloogid ning eristatakse purke sokkidest.

Ideaaljuhul ei tohiks robot kordagi peatuda ega isegi aeglustuda, v.a juhul kui ta parajasti purke nurka kallab või ülesande lõpetamiseks koos sokkidega sokialale on jõudnud. Selleks on vaja võimalust poole sõidu pealt trajektooris korrektuure teha ning pidevalt IR-andureid jälgida.

Roboti liikumist juhib PC. PC saadab Pisi Xbee plaadile vastavad käsud, mis omakorda saadetakse edasi mootori kontrollerile. PC ja Pisi Xbee omavaheline suhtlus on tehtud sedasi, et kõigepealt ootab Xbee kokkuleppelist start baiti, ning seejärel alles erinevatele sõidumanöövritele, päringutele vastavat infot. Selline omavaheline suhtlemine oli vajalik selleks, et tagada korrektne sõidumanöövri sooritamine.

PC koodi tööpõhimõte

1. Töö algus

Selles programmi osas avatakse USB-Serial ühendus arvuti (PC) ja mikrokontrolleri (MCU) vahel. Samuti algatatakse video saatmine veebikaamerast PC-sse ja seatakse kaamera säriaeg. Programmi töö jälgimiseks tekitatakse mitu uut akent – ühes näidatakse töötlemata videot otse kaamerast, teises töödeldud videot koos olulisemate reaalajas jälgitavate muutujatega ning kolmandas aknas paistab väljaku kaart sokkide, purkide ja kataloogide arvatavate asukohtadega. Seejärel suletakse purkidekasti väljalaskeava värav.

2. Videotöötlus ja roboti juhtimine

See programmi osa on lõputu tsükkel, mille käigus loetakse kaamerast uus kaader, töödeldakse seda, küsitakse MCU-lt andurite lugemeid, arvutatakse liikumisteekond, saadetakse mootorite juhtimise käsud MCU-le, väljastatakse videopilt ekraanile ja loetakse sisse klahvivajutused klaviatuurilt, kui neid on toimunud. Järgnevalt kõigest täpsemalt.

2.1 Tsükli algus

Kaameralt küsitakse uus kaader, mis muudetakse kohe halltoonidesse, et oleks lihtsam töödelda (videotöötlus peab toimuma reaalajas, vastasel juhul saadakse kaameralt vigaseid, poolikuid kaadreid). MCU-le saadetakse käsk IR-andurite lugemiseks (vastust ootama ei jääda, see loetakse sisse hiljem). Purkide ja kataloogide nimekirjad tühjendatakse, kaart puhastatakse. Ekraanile väljastatakse pildi keskpunkti väärtus BGR formaadis. Pildile rakendatakse Threshold funktsiooni, mis värvib halltoonides pildi heledamad osad täiesti valgeks ja tumedamad osad täiesti mustaks. Eesmärgiks on leida tumedaid objekte valge väljaku taustal.

2.2 Objektide tuvastamine

Pikslikaupa hakatakse uurima mustvalgeks tehtud kaadrit. Kui leitakse must piksel, siis leitakse kõik tema mustad naaberpikslid, nende mustad naaberpikslid jne, kuni saadakse kätte kõik ühte musta laiku kuuluvad pikslid (FloodFill algoritm).

Kui leitud must laik piirneb kaadri servaga, siis heidetakse too kõrvale ja hakatakse otsima uut laiku. Põhjuseks on see, et pooleldi nähtavat objekti on väga raske identifitseerida. Kõrvale heidetakse ka laigud, mis on väga lähedal majakale, st kogumisala sees. Lisaks jäetakse arvestamata ka laigud, mis on liiga väikesed, et olla sokk, purk, kataloog või kogumisala piire.

Musta laigu ümber on moodustatud mõtteline ristkülik. Selle ristküliku sisse jäävate punktide heleduste keskmine annab infot selle kohta, kui hästi kujund on lähendatav ristkülikule. Näiteks kataloogi kaas paistab musta-valgekirju, mistõttu on ta keskmiselt heledam kui purk. Sokk võib olla asendis, mille tõttu on tema ümber konstrueeritud ristkülikus suuri valgeid alasid. Ainult purk on oma püstise asendi ja võrdlemisi ühtlase musta värvi tõttu väga püsiva keskmise heledusega.

Soki eripäraks on see, et tema keskpunktist suvalises suunas ääre poole liikudes ei kohata ühtki valget ala enne soki äärt. Purgid ja kataloogid ei ole nii ühtlased, neil on sees ka heledamaid triipe. Nii saabki eristada sokke muudest objektidest.

Kogumisala piire paistab musta joonena Selle tuvastamiseks leitakse joone üks ots ja liigutakse siksakiliselt teise otsa. Sakkide suurus näitab joone paksust ja otspunktide omavaheline kaugus joone pikkust. Nende suhte abil on võimalik otsustada, kas tegu on enam-vähem sirgjoonega (kaamera moonutuste tõttu paistab joon kaadris pisut kõverana).

Kõigi leitud objektide puhul arvutatakse välja ka nende kaugus kaamerast ja kontrollitakse, kas arvutatud kaugus ja näiv suurus langevad kokku. Kui see kontroll õnnestub, siis lisatakse objektide koordinaadid vastavatesse nimekirjadesse, mida hiljem kasutatakse teekonna arvutamiseks.

Objektide kauguse määramist tehakse kaadris paistva musta laigu alumise ääre keskpunkti järgi. Esiteks parandatakse punkti asukohta lainurkläätse moonutuste kompenseerimiseks. Seejärel projekteeritakse punkt ekraani tasandilt kolmemõõtmelisse ruumi väljaku põranda tasandile. Lõpuks arvutatakse 3D-koordinaatide põhjal kaugus kaamerast ja kohavektori nurk kaamera optilise peatelje suhtes (st nurk, mille võrra kaamera objektist “mööda vaatab”). Samamoodi projekteeritakse tuvastamata objektid väljaku kaardile takistustena.

2.3 Info kuvamine

Väljastatavale ekraanipildile joonistatakse sihik kirjutatakse huvipakkuvate muutujate väärtused. Kuna pilt muutub reaalajas, siis on kiiresti muutuvaid muutujaid mugav uurida ekraanipildi jäädvustamise teel. Ekraanipildi tegemisel jääb kenasti näha videokaader mitmes töödeldud vormis, kaart ja muutujate vastavad hetkeväärtused.

2.4 Tegevusplaani moodustamine

Olles pilditöötluse osas arvutanud purkide asukohad, on nüüd vaja leida parim trajektoor nende kõigi korjamiseks. Kõigepealt vaadatakse üle objektide nimekiri. Kui mõned purgid või sokid asuvad üksteisele reeglitevastaselt liiga lähedal, siis eeldatakse, et tegemist on hoopis kataloogiga, mis mingil põhjusel paistab mitme objektina. Need objektid joonistatakse takistusena kaardile ja kustutatakse objektide nimekirjast.

Allesjäänud objektidest teekonna moodustamiseks leitakse lähim purk või sokk. Seejärel leitakse lühim tee selleni. Kasutatakse kiirte järgmise meetodit. Selleks joonistatakse roboti ja objekti vahele neid ühendava sirgega paralleelseid sirgeid roboti laiuse ribana. Kui mõni neist kiirtest kohtab takistust kaardil, siis pööratakse robotit (virtuaalselt) paari kraadi võrra ja üritatakse uuesti kiiri joonistada. Roboti pööramise suund sõltub sellest, millised kiired jõudsid esimesena takistuseni. Robotit pööratakse seni, kuni enam pole ees ühtki takistust, kusjuures kontrollitavate kiirte pikkuseks on roboti ja objekti vaheline kaugus.

Nüüd liigutatakse robot virtuaalselt otse edasi, nii et ta möödub takistusest. Roboti uues asukohas korratakse sama protseduuri uuesti, kuni robot on lõpuks kohas, kus tema ja sihtmärgi vahelisel sirgel pole ühtki takistust.

Kirjeldatud algoritm on sarnane taktikale “takistuse kohtamisel pööra vasakule, muidu sõida otse sihtmärgi poole”. Lihtsalt kogu trajektoor tehakse alguses läbi virtuaalselt ja alles siis saadetakse käsud MCU-le, mis mootoreid juhib.

2.5 Roboti sõidu juhtimine

See osa on ähmane segu lõplikust automaadist (Finite State Machine), PD-kontrollerist ja lihtsast järjestikusest juhtimisest.

Robot püüab end hoida teekonna järgmise punkti poole suunatuna ja edasi liikuda. Suuna hoidmiseks vajalik pööramine teostatakse mootorite erinevate kiiruste etteandmisega. Kiiruste erinevus on proportsionaalne nurgaga, mille võrra robot teepunktist kõrvale on suunatud. Lisaks võetakse arvesse eelmise tsükli käigus ette antud pööramiskäsu ja reaalselt toimunud pööramise ulatuse suhet, et saaks üle probleemist roboti inertsiga. Parema trajektoori saavutamiseks liidetakse parandusnurk kaamera paigutuse ebatäpsuse kompenseerimiseks ja korrutatakse “ülereageerimisteguriga”, et roboti keskmine suund ei kalduks ühele küljele.

IR-distantsiandurite abil tuvastatakse täiendavalt takistusi, mida kaamera ei märganud (nt seina). Kui takistus tuleb ette, siis liigub programm olekusse PASS_FROM_LEFT või PASS_FROM_RIGHT ja liigub IR-andurite info abil takistusest mööda. Seejärel läheb robot taas tavaolekusse.

Kui otse ees olnud purk kaob vaateväljast, siis minnakse olekusse GO_STRAIGHT ja sõidetakse natuke aega otse edasi. Põhjuseks on asjaolu, et purk kaob kaamera vaateväljast juba pisut enne korjamist ning on tähtis, et robot ei hakkaks uut purki otsima enne vana purgi kätte saamist.

Kui kõik purgid on käes (purke loendab MCU laserkiire katkemise meetodil), läheb robot olekusse RED_BEACON, mis tähendab, et nüüd ei otsita enam purke, vaid punast värvi pudelit purkide kogumisalas, mida kasutatakse majakana. Kogu navigeerimine toimub muidu samamoodi nagu purkide ja sokkide otsimiselgi.

Majakale lähenemise suund arvutatakse kogumisala piirde asend põhjal. Kogumisalale piisavalt lähedale jõudes valitakse lähenemissuunast sõltuvalt lõppmanööver. Vasakul poolt tulles hakatakse teatud kaugusele jõudes pöörama, et saavutada asend, kus purkide väljalaskeava on kogumisala piiril. Paremalt tulles tehakse kõigepealt vasakulepööre, et paremalepöördeks ruumi tekitada. Siis tehakse parempööre ja jäädakse õigesse asendisse kogumisala piiril. Õiges asendis olles avatakse purkide kasti avaus ja purgid veerevad välja. Veeremise soodustamiseks jõnksutab robot ennast küljelt küljele.

Pärast purkide väljastamist läheb programm olekusse GREEN_BEACON. Selles olekus sihib robot lihtsalt sokkide majakat. Ta sõidab sokkide kogumisalasse sisse ja jääb seintest takistatuna otse majaka ees seisma, sokid kõhu all. Sõit on lõppenud.

3. Lõpetamine

Mootorid peatatakse, aknad suletakse, katkestatakse ühendused kaamera ja MCU-ga. Programmi töö lõpp

Xbee koodi tööpõhimõte

1. Peamine ülesanne

Programm koosneb ühest while tsüklist. Kõige esimesena oodatakse robotil oleva “start nupu” vajutamist. Seejärel oodatakse PC poolt tulevat õiget “Start baiti”(SB), mis tähistab PC soovi midagi Xbee'le edastada. Kui Xbee'le edastatud SB on õige, alles seejärel loetakse sisse vastava manöövri tegemiseks vajalikud andmed. Näiteks: Tahtes sõita edasi, saadab PC korrektse SB'i, seejärel tähe 'g', mis käivitab funktsiooni CameraLive(), mis omakorda ootab mõlema ratta kiiruse väärtuseid ja PC poolt saadetud kontrollsummat. Seejärel kontrollitakse kontrollsummade kokkulangevust. Positiivse tulemuse korral kutsutakse välja SetSpeeds() funktsioon, mis saadab mootorite kontrollerile edasisõidu andmed.

2. Purkide lugemine

Iga while tsükli alguses kontrollitakse ühtlasi ka kas mõni purk on kogumiskasti tõmmatud. Juhul kui purk avastatakse, siis järgnevad 2 sekundit ei kontrollita kas purk on kogumiskastis või mitte. Seda seepärast, et muidu loetakse iga tsükli alguses üks purk leituks kuigi purk alles liigub kogumiskasti. 2 sekundi pärast kontrollitakse kas purk on ikka alles. Kui purk on alles, siis teavitatakse PC-d, et purk on kogumistees kinni ja kogumiskasti raputamine purgi väljasaamiseks on vajalik. Kui aga peale 2 sekundit purki enam ei ole, siis loetakse purk leituks ja võib järgmist purki lugema hakata.

3. Lisavõimalused

Lisaks edasi sõitmisele võimaldab kood analoogselt punktis 1 nimetatud viisil etteantud kraadide järgi pööramist PID_Turn(), infrapuna kaugusmõõdikute info edastamist ReadIR(), etteantud cm'te kaugusele sõitmist DriveDirectly(). Täpsem funktsioonide kasutamine on kirjeldatud lähtekoodis.

Mootorite kontrolleril on kokku 17 erinevat registrit ja funktsiooni. Neist paljusid antud roboti juures ei kasutatud ja seepärast ei ole nende kasutamiseks ka koodi. Lähemalt saab tutvuda erinevate võimalustega SIIN.

Kood

Skeemid

Toiteskeem Toiteplaat

Eagle failid: toide.zip

Pildid

:projektid:robotex:2008:voistkonnad:1 galerii:robotex_2008:team1

Hinnang

Roboti pontentsiaal oli suur. Võistlustel ebaõnnestusime suures osas selle pärast, et jäime robotile mõistuse tegemisega ajahätta. Ülesanne oli keerukas ja alustada oleks tulnud oluliselt varem. Kulutatud ~2 kuud roboti ehitamiseks oli vähe.

projektid/voistlusrobotid/robotex/2008/voistkonnad/1.txt · Last modified: 2022/04/28 20:24 by 127.0.0.1