Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

4. 9 klass 2-3 õppetundi Sumorobotid

Tiigrihype_logoSee materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.

Tutvume sumoroboti ehitamise ja programmeerimise strateegiatega. Projekti lõpuks saame teada, kuidas ehitada head sumorobotit.

Sumoroboti strateegiad võib jaotada kaheks, ehitus ja programmeerimine

1. Tund. Ehitus-strateegiate tutvustamine, robotite ehitamine

a.        Ehitamise strateegiad

b.       Erinevate sumorobotite ehitamine

2-3 Tund. Programmeerimise strateegiate tutvustamine.

c.        Programmeerimine, testimine

d.       Sumovõistluse läbiviimine

LEGO sumo reeglid

LEGO sumorobotite võistlusel on kindlad reeglid ja standardid. Kui on plaanis võistlustel osaleda, tasub robot ning võistluslaud ehitada kooskõlas alljärgnevate reeglitega.

Sumo laud

Sumo laua läbimõõt on 77 cm, kõrgus maapinnast 2,5 cm. Laua servas oleva valge joone laius on 2,5 cm. Ehituseks sobib 10 mm sile vineer, millele on vajaliku kõrguse saavutamiseks jalad alla pandud.

Sumo robot

Roboti maksimaalsed mõõdud on 15x15 cm, kõrgus ei ole piiratud. Kaalupiirang on 1 kg. Robot võib pärast starti oma mõõtmetelt laieneda.

Start

Pärast programmi käivitamist peavad robotid ootama 5 sekundit enne reaalset liikuma hakkamist.

Shikiri rist

Enne iga sumo matši algust viskab kohtuniklauale shikiri risti, mis jagab sumo laua neljaks veerandiks. Robotid stardivad sumoväljaku vastasveeranditest, stardisuund teineteise suhtes väljapoole suunatud. Täpsemalt vaata selle kohta joonist projekti viimase alalõigu, stardistrateegia juurest. clip_image002

Sumoroboti ehitamise strateegiad

Sumorobotite ehituses on hulk tegureid, mis mõjutavad roboti käitumist. Näiteks veosüsteem ja kaal mõjutavad seda, kui hästi saavutab robot kontakti maapinnaga, andurid mõjutavad vastase leidmist ning platsil püsimist, tõukemehhanism on seotud vastase ründamisega ja kaitsesüsteem sellega, kuidas robot peab vastu erinevatele rünnakutele.

Veosüsteemi valik

Sumoroboti elutähtis komponent on veosüsteem. See määrab füüsiliselt roboti püsimise platsil ja tõukejõu tugevuse. Alljärgnevalt on antud vastused erinevatele veosüsteeme puudutavatele küsimustele, mis tekivad igal sumoroboti ehitajal. Pildid aitavad mõista ühe või teise veosüsteemi omadusi.


 

Rattad või roomikud?

Veosüsteem võib olla nii rataste kui ka roomikutega.

 

Rattad

Roomikud

Manööverdamine

Robot reageerib kiiresti pööramisele.

Robot pöörab suhteliselt aeglaselt.

Liikumiskiirus

Võrreldes roomikutega on võimalik ehitada üsna kiire robot.

Roboti liikumiskiirus on tagasihoidlik, kuna roomikud on praktiliselt vastu velge, väikese diameetriga.

Roomikutele võib ehitada hammasratta ülekande kiiremaks liikumiseks, kuid sellisel juhul tuleb selle töökindlus hoolega läbi mõelda, kuna sellele rakenduvad suured jõud vastase ründamisel.

Püsimine platsil

Sõltub rattakummi mustrist, võib olla väga halvast kuni väga heani.

Kui roomikud on 100% tasapinnaga kontaktis, on platsil püsimine väga hea. Kui roomikud servapidi õhku kerkivad, muutub roboti vastupanuvõime hetkega nõrgaks ning hakkab libisema.

Tõukejõud

Sarnaselt püsimisele platsil, sõltuvad roboti tõukejõu omadused rattakummist ja ehitusest.

Roomikute tõukejõud on väga hea, kui robot saab neile püsivalt toetuda ja ei tõuse õhku.

Näide

Võrdle näiteks tanki mõne samaväärse maastikuautoga. Tank liigub ja manööverdab võrreldes autoga palju aeglasemalt ja kulutab sealjuures märkimisväärselt rohkem energiat kui auto.

Kummid mustriga või siledad?

 

Siledad kummid

Mustriga kummid

Roboti platsil püsimine ja tõukejõud

Sile kumm omab maksimaalselt kontakti sileda maapinnaga, tagades sellega parema haardumise. See tagab nii roboti parema platsil püsimise kui ka suurema tõukejõu võrreldes mustriga kummiga.

Mustriga kummid omavad maapinnaga kontakti vaid mustri väljaulatuvate punktide juurest. Seega mustrilise kummi haardumine siledal pinnal on alati halvem kui siledal kummil.

 

Näide

Mõtle vormelitele, mis sõidavad täiesti siledate kummidega.

Seejärel mõtle offroad maastikuautodele, mis sõidavad võimalikult mustrilise kummiga.

Rataste läbimõõt suur või väike?

 

Suur läbimõõt

Väike läbimõõt

Roboti kiirus

Suurte ratastega robot liigub kiiremini.

Väikeste ratastega robot liigub aeglasemalt, kuid siiski kiiremini kui roomikutega robot.

Roboti tõukejõud

Roboti tõukejõud on mõjutatud vähesel määral, olles suurtel ratastel suurem kui väikestel.

Roboti tõukejõud on väikestel ratastel pisut nõrgem võrreldes suurtega.

Näide

Võrdle autosid, väikeautode rataste läbimõõt on väike ja suuremate ning kiiremate autode rattad suurema läbimõõduga.

 

 

 

clip_image004

 

 

 

 

clip_image006

Vedavad rattad ees või taga?

 

Vedavad rattad ees

Vedavad rattad taga

Tõukejõud

Roboti tõukejõud on hea. Sõltuvalt roboti enda raskuskeskmest on oht, et roboti tagumine osa tõuseb tõukamisel õhku ning sellega võib kaasneda tasakaalukaotus.

Roboti tõukejõud on hea. Sõltumata roboti raskuskeskmest ei saa roboti tagumine osa õhku tõusta. Õhku võib kerkida roboti keskosa, kui näiteks liigendiga sahk on teise roboti all kinni.

Püsimine platsil

Platsil püsimise seisukohast omab tähtsust see, kas vastase roboti sahk suudab vedavate rataste vastaspoolelt (mis võib olla avatud) roboti alla minna. Sellega on kerge robotit tasakaalust välja viia.

Näide

Raskeveokite vedav sild on alati taga. Sumorobot on nagu raskeveok, et alati oleks tagatud hea kontakt maaga.

 

 

 

clip_image008

 

 

 

clip_image010

Andurite valik ja paigutus

Andurid määravad roboti nutikuse vastase leidmisel (Ultrasonic ehk kauguseandur) ja platsil püsimise töökindluse (valguseandur).

Kas üks või kaks valguseandurit serva tuvastamiseks?

 

Üks valguseandur

Kaks valguseandurit

Kirjeldus

Ühe valguseanduriga roboti korral on kõige mõistlikum paigaldada valguseandur roboti ette keskele.

Kahe valguseanduri korral tuleb paigaldada need roboti ette paremasse ja vasakusse nurka.

Platsil püsimise töökindlus

Kui roboti valguseandur tuvastab valge joone, puudub robotil võimekus aru saada, millise suunaga läheneti platsi servale. Robot ei tea, kas läheneti otse või ollakse platsi serva suhtes tugevalt viltu.

Kahe valguseanduri korral tuvastab üks andur alati platsi serva varem kui teine ning selle info alusel on robotil võimekus ette võtta järgmine samm. Platsi poole tagasi liikudes keeratakse ümber parema või vasaku külje sõltuvalt sellest, kumb andur valge joone tuvastas.

 

 

 

clip_image012

 

 

 

 

clip_image014

Valguseandurid otse all või nurgaga ettepoole?

 

Valguseandur otse alla suunatud

Valguseandur on nurga all ettepoole suunatud

Platsil püsimise täpsus

Robot tuvastab valge joone alles siis, kui andur on täpselt joone peal.

See on igati töökindel ja järeleproovitud lahendus, kuid meeles peab pidama, et valge joone tuvastamise andurid peavad asuma võimalikult roboti eesotsas.

Robot tuvastab valge joone 1-2 cm enne seda, kui jõutakse platsi servale liiga lähedale.

Selle lahenduse korral võib tekkida oht, et ettepoole suunatud valguseandur tuvastab vastase robotit valge joonena. See omakorda võib viia roboti ettearvamatu käitumiseni.

Kas kauguseandur on vajalik?

 

Kauguseanduriga

Ilma kauguseandurita

Vastase tuvastamine

Kauguseandur võimaldab tuvastada vastase robotit.

Sellest on kasu ainult siis, kui seda infot osatakse roboti programmi juures õigesti kasutada.

Sõltuvalt roboti liikumise strateegiast on võimalik teha väga edukas sumorobot ilma kauguseandurita.

Rakendamise lihtsus

Kui puudub oskus kauguseandurist saabuvat infot programmis korrektselt kasutada, on tulemuseks kohapeal keerlev robot, milles puudub igasugune mõttekus.

Kui luua hea platsisõidu algoritm, võib kauguseandurita robot võita nii mõnegi kauguseanduriga roboti. Seni kuni kauguseanduriga robot keerutab ja vastast otsib, läheneb talle teine lihtsam robot ja puksib ringist välja.

 

Kas üks või kaks kauguseandurit?

 

Üks kauguseandur

Kaks kauguseandurit

Vastase tuvastamine

Andur tuleb paigaldada roboti esiosasse ja keskele.

Vastase tuvastamise algoritm seisneb tavaliselt selles, et robot keerutab seni, kuni näeb vastast. See töötab üldjuhul edukalt.

Paigaldada roboti esiotsa, kuid väikese nurgaga väljapoole.

Vastase tuvastamine toimub roboti pööramisel, kuid vastase asukoha määramine on tunduvalt täpsem kui ühe anduri korral.

Rakendamise lihtsus

Rakendamine on suhteliselt lihtne, kuid vastase tuvastamine seevastu ebatäpne. Ühe anduriga pole võimalik näiteks üheselt määrata vastase suunda.

Vastase roboti tuvastamine on täpne, kuid kahe anduri rakendamine ja vastase asukoha välja arvutamine vastavalt anduritest saadud infole keeruline.

 

 

 

clip_image016

 

 

 

 

clip_image018


 

Ründemehhanismid

Sumoroboti oluline komponent on tema ründemehhanism. See võib olla nii sahk, tagurpidi pöörlevad rattad või mõni muu täiesti erilaadne tõukur.

Sahk on kõige levinum ründemehhanism roboti juures. Seda on lihtne ehitada, kuid ikkagi tekivad küsimused. Kas sahk peaks olema suur või väike? Millise kaldenurgaga seda teha? Kas sahk peaks liikuma mootoriga üles-alla? Ja küsimus, millele enamik isegi ei mõtle, on saha värvus.

Vastates saha värviga seotud küsimusele, tuleb kõigepealt läbi mõelda, milline sahk ehitatakse - kas selline, mis püüab teise roboti alla minna, või mitte. Kui sahk ehitatakse selline, mis ei püüa teise roboti alla minna, pole selle värv oluline. Kui aga sahk on sellist tüüpi, mis läheb teise roboti alla, tasub see teha valget värvi LEGOst, kuna sellisel juhul tekib võimalus, et vastase roboti valguseandur peab seda platsi valgeks servaks ning hakkab teda ründava roboti eest ise ära tagurdama. Ja kuna tavaliselt ei paigaldata sumoroboti tagumisse otsa valgusandurit, tagurdabki robot ise ringist välja.

Kuna roboti mõõtmed on 15x15 cm, siis on üsna tavaline, et ründamiseks allalastud sahk etteantud mõõtude sisse ei mahu. Seega on saha ehitamisel esimene küsimus, kas sahk peaks ise pärast starti alla kukkuma või võiks mootor selle alla lükata.

Saha ehitamisel tuleb kindlasti mõelda mehaaniline takistuse peale, mis ei võimaldaks sahal maad puudutada väljaspool sumolauda, kui robot on platsi serval. Selliseid juhuseid on võistlustel palju olnud, kus robot on muidu tubli, aga tekitab ise endale kaotuse kuna platsi serva juures ulatub sahk üle serva maad puutuma.

Sahatüübid

Püstine sahk

Madal sahk

Püstise saha eeliseks on tavaliselt suur ja tugev pind. See võib lihtsustada teise roboti väljapressimist.

Madal sahk on tavaliselt lühike, kuna roboti piiratud mõõtude tõttu pole seda lihtsalt võimalik väga pikka teha.

Madal sahk peab olema otsast terav, kuna selle tööpõhimõte seisneb teise roboti serva alla minekus, et teine robot tasakaalust välja viia.

 

 

clip_image020

 

 

 

clip_image022

 

 

 

Mootoriga sahk

Ise allakukkuv sahk

Mootoriga sahk annab parema võimaluse rünnaku juhtimiseks.

Näiteks mootoriga sahal võib olla kogu aeg peal mootori surve, st. et see ei kerki niisama õhku.

Teiseks võib luua programmi, mis tõstab sahka üles, kui vastase robot on väga lähedal ehk siis arvatavalt saha peal. See võimaldab vastase roboti tasakaalust välja viia.

Sellist vastase kontrolli saab teha puuteanduriga.

Sellist sahka on lihtne ehitada ja see võib töötada peaaegu sama hästi kui mootoriga sahk.

Robotiehituse juures tuleb planeerida, et allakukkuva saha taga oleksid toed. Siis puudub sahal võimalus robotit kergitama hakata.

Samuti võib ehitada mehaanilise lukustuse, mis rakendub pärast saha allakukkumist ja takistab sahal üles tõusmast.

 

Saha asemel tagurpidi pöörlevad rattad?

Võistlustel on olnud sumoroboteid, mille etteotsa kinnitatakse tagurpidi pöörlevad rattad. Roboti ründeidee seisneb selles, et vastasega kokku puutudes tõstavad tagurpidi ringikäivad rattad vastase maast lahti. Selle tulemusena kaotab vastane tasakaalu ning teda saab ringist välja tõugata.

Sellise ründemehhanismi juures peab jälgima, et roboti esimene toetuspunkt oleks võimalikult rullikute all. Vastasel korral on oht, et kui rullikud on hästi vastasega haakunud, tõusevad ründaval robotil tagumised rattad õhku.

Teised ründemehhanismi võimalused?

Võib oma vaba fantaasiaga mõelda liikuvate kraananokkade peale, mis roboti käimaminekul üritavad ülalt vastase robotit tasakaalust välja viia.

Võib mõelda tõukemehhanismide peale, mis liiguvad edasi-tagasi nagu poksija käsi, tõugates selle abil vastast tasakaalust ja ringist välja.

Võib mõelda pöörleva elemendi peale, mille eesmärk on samuti vastase tasakaalust välja viimine ning seejärel ringist välja tõukamine.

Kindlasti tasub fantaasial lennata lasta ning tulemuseks võib olla mõni sootuks erinev sumorobot, mis üllatuslikult rabab vastase nõrka kohta ning võidab seeläbi võistluse.

Üks omapärane võimalus nii ründe- kui ka kaitse seisukohast seisneb roboti mõõtmetes. Kuna kõrguse suhtes pole mõõtmed piiratud, on igal LEGO sumo võistlusel olnud roboteid, mis stardihetkel on püsti. Peale starti aga kukutavad need robotid ennast platsile, olles seejärel oluliselt suuremate mõõtmetega kui reeglites ettenähtud. Kui roboteid enne võistlust mõõdetakse, siis tähtis on see, et stardihetkel ja –asendis vastavad roboti mõõtmed ettenähtud 15x15 cm sisse.

Kui aga praktikas vaadata, siis need on küll väga vaatemängulised robotid, kuid pole kunagi võitjateks osutunud. Tõenäoliselt on see seotud sellise suure roboti korral tema suurusest tuleneva aegluse ja kohmakusega.

 

Kaitsemehhanismid

Lisaks ründamisele peab iga robot olema valmis selleks, et teda ennast rünnatakse. See on loomulik, kuna sumovõistlus seisnebki teineteise ründamises ja ringist välja tõukamises.

Valguseandurite kaitsmine ründaja eest?

Sahkade juures käsitlesime teemat, et kui saha eesmärk on teise roboti alla minna, tasub sahk teha valge. Ründeidee seisneb selles, et vastasroboti andur näeb valget plaati ja arvates, et tegemist on ringi servaga, hakkab tagurdama.

Seega on kaitsmise osas vaja lahendust, kuidas vältida vastase roboti ja eriti just valget värvi saha sattumist valguseanduri alla. See on takistatav mehaanilisel moel, ehk siis tuleb ehitada piisavalt madala servaga robot, kuhu vastase sahk nii lihtsalt alla minna ei saa.

Rataste kaitsmine ründaja eest?

Nii nagu on tarvis kaitsta valguseandureid vastase saha eest, ootavad kaitsmist ka roboti rattad.

Kui rattad on ründajale avatud, võib suhteliselt kergesti tekkida olukord, kus vastase sahk sõidab poolviltu roboti ratta alla ning tulemuseks on tasakaalukaotus.

Lahendus on sama mis valguseanduri juures: ehitada võimalikult madala servaga seinad ratta ette, kaitsmaks neid vastase saha ja teiste ründemehhanismide eest.

Roboti kaal

Kaalukamat robotit on raskem ringist välja lükata kui kerget.

Teooria ütleb, et massikese peaks asuma võimalikult madalal, kuid praktikas on olnud roboteid, mis vaatamata kõrgele massikeskmele on saavutanud häid tulemusi. Massikeskme kõrgusest olulisem on jälgida, et massikese asuks vedavate rataste peal.

Kui kõik vajalik on robotile külge pandud, tuleb robot kaalule panna ja vaadata tulemust. Kui see on 100g või rohkem alla lubatud kaalu, tasub lisada robotile kaalutõstvaid komponente, et viia kaal maksimaalseks.

Praktikas on olnud mitmeid juhtumeid, kus kaalutõstmiseks lisatakse robotile külge teine NXT, millel pole küljes ei andureid ega mootoreid ja võib-olla isegi mitte akut, kuid selle abil on viidud roboti kaal maksimumi lähedale.

Kaal tasub jätta 5-10 grammi alla normi, et oleks arvestatud enne võistlust kasutatava kaalu juhusliku veaga.


 

Programmeerimine

Programmeerimine on määrava tähtsusega, sest ehituslikult hea roboti saab kergesti ringist välja tõugata, kui sellel puudub korralik programm.

Sumomängu võidu aluseks on kiirus. Kiire ja ootamatu rünnak on kõige kindlam tee võiduni. Kuni teine robot ennast ründe- või võitlusasendisse sätib, on ootamatu ja jõuline ründaja juba mängu võitnud. Sellisel juhul on võidu eelduseks kiirus ja õige programm.

Järgnevalt erinevatest programmeerimise strateegiatest.

Platsil püsimise strateegia

Sumorobot ühe valguseanduriga

clip_image024See on kõige lihtsam robot eesmärgiga vaid platsil püsida. Sellisel robotil tekib ründevõime alles siis, kui suudetakse vastane tuvastada.

Platsil liikumise esimene algoritm on väga lihtne. Robot sõidab seni, kuni valguseandur näeb valget joont, siis tagurdab, keerab ringi ja sõidab jälle, kuni näeb valget joont. Ja nii lõpmatuseni.

See pole just kuigi võidukas strateegia, kuid esmane platsil püsimine on tagatud.

Kui on soov, et robot ei jääks kogu aeg ühesugusel moel ringi keerama, võib programmi sisse viia juhusliku numbri arvutamise, mille tulemusena robot keerab iga kord ringi suvalises suunas.

Siinkohal on esitatud lihtsa sumoroboti programmikood. Arvestama peab, et sõltuvalt mootorite suunast ja rataste suurustest võivad toodud numbrid erineda nii suuruse kui märgi poolest.

 

Näide. Lihtne sumorobot ühe valguseanduriga

task main()

{

  SetSensorLight(S1);

  while(TRUE)

  {

    //robot kontrollib valguseanduri näitu

    //kui see asub valgel, siis robot tagurdab ja keerab

    if(Sensor(S1) > 50)

    {

      RotateMotor(OUT_BC, -100, 300);

      RotateMotorEx(OUT_BC, 100, 100, 100, TRUE, TRUE);

    }

    //kui valguseandur asub mustal pinnal,

    //sõidab robot lõpmatuseni otse

    else

    {

      OnFwd(OUT_BC, 100);

    }

  }

}

Sumorobot kahe valguseanduriga

clip_image026Kui on võimalus ehitada kahe valguseanduriga robot, muutub programm juba keerukamaks, kuid samas muutub ka robot targemaks.

Kui robot jõuab platsi servale, rakendub igal juhul üks valguseandur juba enne, kui teine andur valge joone tuvastab. Sõltuvalt sellest, kumb andur varem rakendus, on robotil olemas ligikaudne teadmine oma asendi kohta platsi serva suhtes. Väga harva on see servaga täpselt risti, enamasti on robot ikka ühele või teisele poole viltu.

Saadud asendi info põhjal peab programm olema loodud viisil, et robot keerab platsile tagasi alati lühimat teed mööda. See välistab olukorra, kus robot võib juhuslikult keerata näiteks hoopis platsilt välja.

Alljärgnev on näide kahe valguseanduriga sumoroboti programmist Arvestama peab, et sõltuvalt mootorite suunast ja rataste suurustest võivad toodud numbrid erineda nii suuruse kui märgi poolest.

clip_image028

 

Näide. Kahe valguseanduriga sumorobot

task main()

{

  SetSensorLight(S1);

  SetSensorLight(S2);

 

  while(TRUE)

  {

    //robot kontrollib ühe valguseanduri näitu

    //kui see asub valgel, siis robot tagurdab

    //ja keerab mööda lühemat ted platisle tagasi

    if(Sensor(S1) > 50)

    {

      RotateMotor(OUT_BC, 100, 300);

      RotateMotorEx(OUT_BC, 100, 100, 100, TRUE, TRUE);

    }

    //robot kontrollib teise valguseanduri näitu

    //kui see asub valgel, siis robot tagurdab

    //ja keerab teistpidi platsile tagasi

    else if(Sensor(S2) > 50)

    {

      RotateMotor(OUT_BC, 100, 300);

      RotateMotorEx(OUT_BC, 100, 100, -100, TRUE, TRUE);

    }

    //kui valguseandur asub mustal pinnal

    //sõidab robot lõpmatuseni otse

    else

    {

      OnFwd(OUT_BC, 100);

    }

  }

}

Vastase ründamise strateegia

Ründestrateegia seisneb selles, et olles tuvastanud vastase roboti, tuleb seda rünnata seni, kuni see on platsilt välja tõugatud.

Kui sumorobotil on ainult valguseandur, on tema kohtumine vastasega juhuslik. Ründavast robotist saame rääkida alles siis, kui see on võimeline tuvastama platsil teist robotit ning seda ründama.

Kõige levinum võimalus LEGO-robootikas vastase tuvastamiseks on kauguseandur. Kuid võib proovida kasutada ka puuteandurit või valguseandurit.

Vastase tuvastamine kauguseanduriga

clip_image030Kauguseandur on võimeline tuvastama objekte kuni 250 cm kaugusel. Andur tuleb häälestada kindlale kaugusele, millest lähemal asuvaid objekte peetaks vastase robotiks.

Sumolaua läbimõõt on 77 cm (koos valge joonega), roboti suurus 15 cm. Kui eeldada, et mõlemad robotid asuvad platsi servades, siis on robotite omavaheline kaugus 42 cm. Praktikas tasub eeldada, et robotid on teineteisele lähemal ning arvestada kauguseks 40 cm.

 

Lähema kauguse valiku põhjuseid on kaks.

1)       Anduri täpsus vastase tuvastamisel on kauguseanduril parim 30-80 cm.

2)       Kui robot tuvastab vastase liiga kaugelt ja hakkab selle poole sõitma, on vastane tema kohale jõudmise hetkeks suure tõenäosusega juba teises kohas.

Järgnevalt on plokkskeem selle kohta, kuidas käitub kahe valguseanduri ja kauguseanduriga tüüpiline sumorobot.

clip_image032

Allpool on kahe valguseanduri ja ühe kauguseanduriga sumoroboti programmikood. Arvestama peab, et sõltuvalt mootorite suunast ja rataste suurustest võivad toodud numbrid erineda nii suuruse kui märgi poolest.

Näide. Sumorobot kahe valguse- ja ühe kauguseanduriga

task main()

{

  SetSensorLight(S1);

  SetSensorLight(S2);

 

  while(TRUE)

  {

    //robot kontrollib ühe valguseanduri näitu

    //kui see asub valgel, siis robot tagurdab ja keerab

    if(Sensor(S1) > 50)

    {

      RotateMotor(OUT_BC, 100, 300);

      RotateMotorEx(OUT_BC, 100, 100, 100, TRUE, TRUE);

    }

    //robot kontrollib teise valguseanduri näitu

    //kui see asub valgel, siis robot tagurdab ja keerab

    else if(Sensor(S2) > 50)

    {

      RotateMotor(OUT_BC, 100, 300);

      RotateMotorEx(OUT_BC, 100, 100, -100, TRUE, TRUE);

    }

    //robot kontrollib kauguseanduriga vastase kaugust

    //kui vastane on lähemal kui 40cm, siis rünnatakse

    else if(SensorUS(S3) < 40)

    {

      OnFwd(OUT_BC, 100);

    }

    //kui robot pole ei platsi servas ega näe ka vastast,

    //siis lihtsalt keerutab kohapeal, vastast otsides

    else

    {

      OnFwdSync(OUT_BC, 60, 100);

    }

  }

}

Stardistrateegia

Sumoroboti võistluse start on määrava tähtsusega. Hea sumoroboti raund kestab vaid 5-10 sekundit. See tähendab, et vastase robot tuleb välja tõugata enne, kui see on suutnud oma ründega alustada.

Kuidas seda saavutada?

Võistlus algab sellega, et kohtunik viskab platsile shikiri risti, mis jagab platsi mõttes neljaks veerandiks. Robotid peavad asuma vastasveerandites ja liikumissuunaga vastasest eemale, shikiri risti näidatud noole suunas. Seega sõltuvalt sellest, kuhu veerandisse robot satub, on lühem tee vastaseni keerata kas ümber parema või ümber vasaku külje.

 

clip_image034

Roboti programmeerimisel tasub kaaluda varianti, kus vastavalt sellele, millisest kvadrandist robot alustab, on võimalik valida erineva algusega programm.

Kiire võit tuleneks sellest, et robot ei keera alguses mitte kauguseanduri järgi, vaid täiskiirusel täpselt 135 kraadi, sattudes seega vastakuti vastase robotiga. Seejärel täiskäik edasi ning kiire võit võibki olla selle strateegiaga käes.

Kui alguses keerata kauguseanduri järgi, siis tõenäoliselt robot ei keera täiskiirusega, vaid aeglasemalt, et tagada vastase leidmise täpsus. Samuti pole otseliikumise korral tavaolukorras mõistlik edasi liikuda täiskiirusel, kuna sellisel juhul ei suuda robot platsi servas kinni pidada.

Stardis andureid kasutamata on aga võimalik robot programmeerida nii, et see keerab täpselt 135 kraadi ja sõidab täiskiirusel edasi eelnevalt määratud vahemaa. Sellise käitumisega võib suure tõenäosusega eeldada, et vastase robot on veel ennast stardipaigas ringi keeramas ning saab üllatuslikult tabatud.

Alljärgnev on näide sumoroboti programmist, mille käigus valitakse alguses stardisuund ja robot teeb esimese keeramise ning otseliikumise.

See programm eeldab motoriseeritud sahaga robotit ning lisatud on saha allalaskmine pärast starti. Kui on tegemist ilma sahata robotiga, tuleb eemaldada saha mootori allalaskmise alamprogramm MotorDown() ja välja võtta käsk StartTask(MotorADown), mis paneb eelnimetatud alamprogrammi tööle. Pärast seda käivitub roboti tüüpiline platsil sõitmise strateegia.

Alljärgnevas programmis kasutatakse üht olulist muutujat OpponentScanDir, mille toimimine ja vajadus vajab selgitamist. Tegemist on tõeväärtusmuutujaga mille alusel määratakse, kummas suunas pöörates hakkab robot vastast otsima. Selle muutuja väärtus seatakse vastavalt sellele, kumma valguseanduriga tuvastas robot platsi serva.

Miks aga muudetakse selle väärtus vastupidiseks OpponentScanDir=!OpponentScanDir selles tingimuslauses, kus on tuvastatud kauguseanduri abil vastane?

Põhjus seisneb selles, et kui robot kiiresti keerab, võib vabalt juhtuda, et ta keerab nö. vastasest „üle“ ja seega on vastane roboti jaoks uuesti kadunud. Kui robot ei näe vastast, siis toimub kohapeal pöörates vastase otsimine. Kui robot aga korraks nägi vastast, kuid keeras üle, pole mõtet vastast otsides samas suunas edasi pöörata, vaid kõige lühem tee vastaseni on tagasi keerates. Seetõttu on sisse toodud OpponentScanDir muutmine vastupidiseks.

Näide. Sumoroboti programm koos stardivalikuga

//saha mootori allalaskmise alamprogramm

task MotorADown()

{

  while(TRUE)

    OnFwdReg(OUT_A, 100, OUT_REGMODE_SPEED);

}

 

task main()

{

  SetSensorLowspeed(S4);

  SetSensorLight(S3);

  SetSensorLight(S2);

  const int MAXLIGHT = 50;

  const int vasak = 1;

  const int parem = 2;

  const int otse = -1;

  int suund = 0;

 

  //oodatakse, kuni kasutaja on vajutanud nooleklahvi

  //ja sellega valinud, kummale poole robot stardib

  while(!suund)

  {

    if(ButtonPressed(BTNRIGHT, TRUE))

      suund = parem;

    if(ButtonPressed(BTNLEFT, TRUE))

      suund = vasak;

    if(ButtonPressed(BTNCENTER, TRUE))

      suund = otse;

  }

 

  //robot ootab 5 s ja teeb iga sekundi järel heli

  repeat(5)

  {

    Wait(1000);

    PlaySound(SOUND_CLICK);

  }

 

  //robot stardib vastavalt valitud suunas

  switch(suund)

  {

    case vasak:

      RotateMotorEx(OUT_BC, 100, 560, -100, TRUE, FALSE);

      break;

    case parem:

      RotateMotorEx(OUT_BC, 100, 560, 100, TRUE, FALSE);

      break;

  }

  //robot laseb saha alla ja hoiab seda seal mootori jõuga

  StartTask(MotorADown);

  //robot sõidab täiskiirusel otse ja

  //ründab oletatavat vastast

  RotateMotorEx(OUT_BC, -100, 700, 0, FALSE, FALSE);

 

  bool OpponentScanDir = TRUE;

  while(TRUE)

  {

    if(Sensor(S2) > MAXLIGHT)

    {

      //kui 1. valguseandur näeb valget joont,

      //peatatakse mootorid ja tagurdatakse

      Off(OUT_BC);

      RotateMotorEx(OUT_BC, 80, 540, 0, FALSE, TRUE);

      //OpponentScanDir määrab, kummas suunas

      //hakatakse vastast otsides keerutama

      OpponentScanDir = TRUE;

    }

    else if(Sensor(S3) > MAXLIGHT)

    {

      //kui 2. valguseandur näeb valget joont,

      //peatatakse mootorid ja tagurdatakse

      Off(OUT_BC);

      RotateMotorEx(OUT_BC, 80, 540, 0, FALSE, TRUE);

      //OpponentScanDir määrab, kummas suunas

      //hakatakse vastast otsides keerutama

      OpponentScanDir = FALSE;

    }

    else if(SensorUS(S4) < 37)

    {

      //robot on tuvastanud vastase, täiskäik edasi

      OnRevReg(OUT_BC, 89, OUT_REGMODE_SPEED);

      //roboti keeramise suund muudetakse vastupidiseks

      OpponentScanDir = !OpponentScanDir;

    }

    else

    {

      //vastase otsimise suund, sõltuvalt OpponentScanDir

      //väärtusest. Robot keerutab kuni näeb vastast

      if(!OpponentScanDir)

      {

        OnFwdReg(OUT_B, 100, OUT_REGMODE_SPEED);

        OnFwdReg(OUT_C, -100, OUT_REGMODE_SPEED);

      }

      else

      {

        OnFwdReg(OUT_B, -100, OUT_REGMODE_SPEED);

        OnFwdReg(OUT_C, 100, OUT_REGMODE_SPEED);

      }

    }

  }

}

 

Add comment

Loading