Jarkko Iso-Heiko

Robotteilua: Polun seuraaminen vol. 2

Tämä on jatkoa kirjoitukselle Robotteilua: Polun seuraaminen.

Tänä viikonloppuna saimme viimein viimeistelyä uuden radan, jolla voimme testata ja kehittää Vex IQ polunseuraamisprojektiamme, ja kehitettyä koodiakin paljon eteenpäin.

Lyhyenä kertauksena tämä on Vex IQ-robotille Juhan ja Tuomaksen kanssa tekemä toteutus, joka seuraa allaan olevaa (mustaa) polkua. Taktiikkana sillä on mennä viistosti vasemmalle, kunnes se näkee polun. Polun nähdessään se kääntyy reippaasti oikealle päin, ja alkaa taas menemään etuvasempaan kunnes se näkee uudestaan polun. Täten botti seuraa enemmän tai vähemmän tarkasti polun oikeaa reunaa.

Vex IQ polunseurausrata

Alustana oli siis entisen työantajani muovipinnoitteinen(?) mainostaulu, joka oli jäänyt tarpeettomaksi ja menossa roskiin. Ihanteellinen alustaksi, sillä se oli sopivan jämerä, ja taustapuolella se oli tasaisen valkoinen (toisin kuin surkeasta hämärässä otetusta valokuvasta päättelisi).

Hahmottelin mutkia, tiukkoja käännöksiä ja suoria sisältävän radan ensin paperille, sitten hahmottelin sen lyijykynällä alustalle, ja lopulta teippasin radan mustalla sähköteipillä alustaan. Aloitus/lopetuspisteen tein punaisesta mainospaperin palasesta. Rata on tarkoitettu kierrettäväksi kuvan mukaisesti vastapäivään. Kaikenkaikkiaan olen hyvin tyytyväinen rataan, se tarjoaa hyvän mahdollisuuden parantaa nykyistä koodia, ja testata erilaisia toteutuksia miten radan parhaiten voisi suorittaa.

Ensimmäisellä radanseurausversiolla oli ongelmia toiseksi viimeisessä mutkassa, se meni pitkäksi. Tämä korjaantui melkoisen helposti tekemällä kääntymistä hitaammaksi/rauhallisemmaksi.

Muitakin ongelmia oli, isoimman ollessa ettei robotti ymmärtänyt aloitus/lopetuspisteestä mitään. Vanhalla koodilla polku erotettiin alustasta vain vertaamalla harmaan sävyjen arvoja, mutta koska nyt aloitus/lopetuspiste oli punainen, ei harmaasävyjen vertaaminen enää riittänyt. Muutimme värisensorin harmaatilasta väritilaan, ja luimme sensorin RGB-väriarvot erillisiin muuttujiin. Lopulta onnistuimme tunnistamaan aloituspisteen seuraavalla koodilla:

if (35 < redValue && redValue < 45 && 35 < blueValue && blueValue < 45) {
currentState = STATE_ON_BASE;
currentStateString = "On base";
}

Erottelu itse polun (eli mustan teipin) ja valkoisen alustan välillä oli tämän jälkeen hyvinkin helppoa. Lisäsimme myös yllä olevan koodin mukaisesti eri tiloja, tämä mahdollisti mm. aloitustilan lisäämisen, joka aloitti ajon vasta kun robotti tunnistaa olevansa alkupisteessä. Tällöin myös robotti käynnisti ajastimen, jonka avulla pystyimme kirjaamaan radan suorittamisen nopeuden.

Hieroimme myös nopeus- ja kääntymisarvoja hieman, ja la-iltana saimme robotin suorittamaan radan luotettavasti n. 122sec ajalla.

Nopeusoptimointia

Sunnuntaina vielä kerkesimme hieman koittaa optimoida radan kulkemista. Halusimme että robotti kiihdyttäisi nopeutta kun se etenee radalla helpoissa kohdissa, eli esim. suorissa. Vaativissa mutkissa ja neulansilmissä taas liian suuri nopeus aiheuttaa helposti polulta harhautumisen, joten niissä taas vauhtia pitää hidastaa. Koska 4min videota kertoo enemmän kuin miljardi sanaa, katso tästä selite ja näyte toiminnasta:

Päädyimme käyttämään tässä versiossa toteutusta, joka mittaa kuinka monta tickiä on siitä kun polku on edellisen kerran nähty. Täten kun robotti polun nähdessää kääntyy oikealle, jos rata tulee nopeasti taas vastaan, ollaan kurvissa joka kääntyy oikealle päin. Tällöin vaaditaan tarkkuutta, ja vauhtia hidastetaan reilulla tahdilla. Jos taas polkua ei ole nähty pidempään aikaan, ollaan joko suoralla, tai kääntymässä vasemmalle päin. Tällöin vauhtia voidaan kiihdyttää. Tosin vasemmalle kääntymisessä tämä aiheuttaa rajuja käännöksiä, ja sen että mutka menee hieman “ulkokurvista”. Tämä kaipaa vielä parantamista.

Lisäsimme myös debuggaustarkoituksessa kaksi kosketusledi-sensoria robottiin, joilla pystyimme näkemään koska botti kiihdyttää, koska se menee miniminopeutta ja koska maksiminopeutta. Toisella ledi-sensorilla taas kerrotaan kuinka nopeasti botti tekee käännöksiä vasemmalle päin etsiessään polkua. Sininen väri tarkoittaa että robotti hidastaa, vihreä tarkoittaa että se kiihdyttää, ja punainen tarkoittaa että liikkuminen/kääntyminen tehdään nyt maksiminopeudella. Tämä oli hyvin hyödyllinen tutkimaan robotin logiikkaa itse radalla, ja huomaamaan ongelmia toiminnassa, sillä robotti liikkuu sen verran ketterästi että robotin omasta näytöstä ei lukuja pysty käytännössä katselemaan.

Jatkokehitys

Koska meillä loppui su valitettavasti aika kesken, lukujen hierominen jäi kesken. Lisäksi haluaisimme siirtyä tick-pohjaisesta logiikasta aikapohjaiseen, että koska teippi on viimeksi nähty. Tai korvata kyseinen logiikka ihan gyrosensorin luvuilla, ja mitata asteita paljonko on yhteensä käännytty ja päätellä siitä kuinka nopeasti tulisi kääntyä. Tick-pohjainen ei ole kovinkaan luotettava, sillä sen arvot vaihtelevat sen mukaan kuinka nopeasti koodi suoritetaan, ja täten arvoja tarvitsee muuttaa kun koodia lisätään ja koodin suoritusnopeus laskee.

Lisäksi minimi-, perus-, ja maksiminopeuksia muuttamalla voisi varmasti saavuttaa paljonkin lisänopeutta radan suorittamiseen. Nyt päästiin luotetttavan oloisesti johonkin 96-98 sekunnin lukuihin (ensimmäisellä versiolla ennen kiihdyttely/hidastusoptimointeja johonkin 122 sekuntiin).

Ja ajatuksen tasolla on vielä aloittaa toteutus joka perustuisi täysin toiseen logiikkaan radan suorittamisen suhteen, eli että se rehellisesti yrittäisi pysyä itse teipin päällä, eikä vain törmäillä siihen oikealta päin, mutta siitä tulee sitten ihan oma projektinsa.

Koodit tähän nykyiseen toteutukseen löytyvät siis Githubista. Lisää tilannekatsausta projektista tulee toivottavasti lähiviikkoina 🙂