Lego NXT Mindstorms -ristinollarobotti



Samankaltaiset tiedostot
Antitammirobotti. Antti Meriläinen Martin Pärtel 29. toukokuuta 2009

Ohjeet ovat työn alla ja kirjaan niitä päivittäen ja edes takaisin lukien pari viikkoa.

SUMO-ROBOTTI. Tehtävä

HiTechnic -kompassisensorin käyttäminen NXT-G -ympäristössä

Pelaajat siirtävät nappuloitaan vastakkaisiin suuntiin pelilaudalla. Peli alkaa näin. Tuplauskuutio asetetaan yhtä kauas kummastakin pelaajasta.

TIEA343 - Robottiohjelmointi 2011

Puzzle SM Pistelasku

JOHDATUS TEKOÄLYYN TEEMU ROOS

Ohjeissa pyydetään toisinaan katsomaan koodia esimerkkiprojekteista (esim. Liikkuva_Tausta1). Saat esimerkkiprojektit opettajalta.

Tasohyppelypeli. Piirrä grafiikat. Toteuta pelihahmon putoaminen ja alustalle jääminen:

Pyramidin yleiset säännöt

Scratch ohjeita. Perusteet

SÄÄNNÖT. Language: English / Suomi

Äänellä vauhtia robottiin

Johdatus go-peliin. 25. joulukuuta 2011

Lego Mindstorms NXT robottien etenemissuunnitelma

Avaruuden muoto. Kuvaus: Tehtävässä pohditaan avaruuden muotoa ja pelataan ristinollaa erilaisilla pinnoilla.

A* Reitinhaku Aloittelijoille

SAC RDS Futurline MAX Tupla-robotin ohjeet näytteenottoon ja päivämaidon lähetykseen

JOHDATUS TEKOÄLYYN TEEMU ROOS

KOKO PERHEEN HAUSKA STRATEGIAPELI OHJEET

Lego Mindstorms NXT. OPH oppimisympäristöjen kehittämishanke (C) 2012 Oppimiskeskus Innokas! All Rights Reserved 1

Impedanssitomografia-peli

PELIAIKASEURANTAOHJELMAN KÄYTTÖOHJE

Kenguru 2013 Cadet (8. ja 9. luokka)

LUMATE-tiedekerhokerta, suunnitelma AIHE: PELIT JA TAKTIIKAT

Puzzle-SM Loppukilpailu Oulu

1/6 TEKNIIKKA JA LIIKENNE FYSIIKAN LABORATORIO V

Avainsanat: peli, matematiikka, polynomi, yhteen- ja vähennyslasku, kertolasku

PELIAIKASEURANTAOHJELMAN KÄYTTÖOHJE

Tarvikkeet: A5-kokoisia papereita, valmiiksi piirrettyjä yksinkertaisia kuvioita, kyniä

NXT Infrapuna-sensori

Merkkijono on palindromi, jos se säilyy samana, vaikka sen kääntää väärinpäin.

Kärkipallo sijoitetaan alapisteelle, ja muut pallot sen taakse kiinni toisiinsa.

PROBYTE kallistusnäyttöautomatiikka

1 PÖYDÄT JA PALLOT 1. Kilpailuissa tulee käyttää Suomen Biljardiliiton hyväksymiä pöytiä ja palloja.

Pelivaihtoehtoja. Enemmän vaihtelua peliin saa käyttämällä erikoislaattoja. Jännittävimmillään Alfapet on, kun miinusruudut ovat mukana pelissä!

Matinteko (1 / 10) Matinteko (2 / 10) Helpointa matin tekeminen on kahdella raskaalla upseerilla (esim. kuningattarella ja tornilla).

Datatähti alkukilpailu

Muumion kirous. Pelisuunnitteludokumentti. Veikkauksen pelisuunnittelukilpailua (Peliskaba2015) varten

2.1 Yksinkertaisen geometrian luonti

Tämän monisteen tarkoitus on tutustua pikamaski -toimintoon GIMP:issä.

VIRUSKAAPPARI-PELI - KURKISTUS OHJELMOINNILLISEEN AJATTELUUN

Säännöt. Pelivalmistelut

Eye Pal Solo. Käyttöohje

Kenguru 2013 Cadet (8. ja 9. luokka)

P6SLite ohjaus- ja zoom komennot


KÄYTTÖOHJE ELTRIP-R6. puh fax PL Kajaani

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

dametric AGS-anturi HUOLTOKÄSIKIRJA AGS-XXX Service Manual FI.docx Lokakuu 12, 2010 / BL Sivu 1 (8)

- 4 aloituslaattaa pelaajien väreissä molemmille puolille on kuvattu vesialtaat, joista lähtee eri määrä akvedukteja.

Sukelluskeräily, Pelihahmon liikuttaminen. Tee uusi hahmo: Pelihahmo. Nimeä se. Testaa ikuisesti -silmukassa peräkkäisinä testeinä (jos) onko jokin

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Program matopeli; uses graph,grafiikka,crt; VAR. merkkiluettu,herkkutarkistettu : boolean;

Ajotaitomerkkisäännöt matkailuautolle voimaan

Ratkaiseva päätöskierros

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

Messilä Golfin paikallissäännöt

Kenguru 2011 Cadet RATKAISUT (8. ja 9. luokka)

Käyttöönotto-opas RT Controller

Garmin GPSmap 60CSx -laite

Alkeispelastuksen sa a nno t

Sisällysluettelo. 1. Johdanto

Asennusohje SureStep PUR, SafeStep, SafeStep Grip & SafeStep R12

VIISIPALLO PELI JOKA KEHITTÄÄ YHTENÄISYYTTÄ YHTEISTYÖTÄ YHTEISÖÄ

Pro 57 UM/S Setelilaskuri

N S. ta tai m ä. BLÄUER versio 1.0

KAUKOVALVONTAOHJELMA CARELAY CONTROL WPREMOTE

Sinulle on annettu bittijono, ja tehtäväsi on muuttaa jonoa niin, että jokainen bitti on 0.

Tutustu. Innostu. Luo! VilliHelmi Oy

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla


Lego Mindstorms NXT robottien etenemissuunnitelma

Kenguru 2011 Cadet (8. ja 9. luokka)

Sukelluskeräily. Pelihahmon liikuttaminen. Aarre ja pisteet

Kenguru 2012 Junior sivu 1 / 8 (lukion 1. vuosi)

Asuinalue (ruskea tausta) Kalatori Viljatori

1 Asentaminen. 2 Yleistä ja simuloinnin aloitus 12/

Kenguru 2019 Mini-Ecolier 2. ja 3. luokka

250 arkin vakiolokeron täyttäminen

FOCUS 650 KÄYTTÖOHJE

VSP webmail palvelun ka yttö öhje

Irrota tämä vastauslomake tehtävämonisteesta. Merkitse tehtävän numeron alle valitsemasi vastausvaihtoehto.

OMATOIMIKAUDEN HARJOITUSOHJELMA HARJOITUS 1. OHJEITA OMATOIMIKAUDELLE:

AKTIVOI KESKIVARTALO. Keskivartalolihasten hallinta ja vahvistaminen Opas yläkouluikäisten tyttöjen lentopallovalmentajille

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

ASENNUSOHJEET. Moduleo - lukkopontilliset vinyylilattiat. Ruukinkuja 2, ESPOO orientoccident.fi

Valmistelut: Aseta kartiot numerojärjestykseen pienimmästä suurimpaan (alkeisopiskelu) tai sekalaiseen järjestykseen (pidemmälle edenneet oppilaat).

Todettu kokeissa FCC:n standardien mukaiseksi. Yhdysvalloissa saatu patentti

Kenguru 2019 Mini-Ecolier 2. ja 3. luokka Ratkaisut Sivu 0 / 11

Lue ohjeet huolellisesti ennen laitteen käyttöä.

Jahtipaikat.fi Käyttöohje

Ympäristöpeli Kipinä. Ympäristöpeli Kipinä on saatavilla sähköisenä osoitteessa:

GOLFIN ETIKETTI 1. Mitä on golfpelin henki? a) Pelaan omaa peliäni välittämättä muista pelikavereista. b) Olen oman pelini tuomari

Z O K E R OHJEET REGLER PÅ SVENSKA XL 3 XL 3 M4 1 L4 1 XL 3 M 23 XL 1 XL 4 ML 4 M 41 L4 3 L 1 S4 1 XL 2 XL M 14 M 4 XL 3 LS 4 XL 3 L 3 S L3

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Muodonmuutostila hum

Transkriptio:

Lego NXT Mindstorms -ristinollarobotti Jouko Strömmer Melissa Kasari jouko.strommer@helsinki.fi melissa.kasari@helsinki.fi Helsinki 20.5.2009 Java Standard Edition 6 lejos NXJ 0.7 beta Helsingin yliopisto Tietojenkäsittelytieteen laitos Robottiohjelmoinnin harjoitustyö, kevät 2009 Ohjaaja Mikko Apiola

Sisältö 1 Kuvaus 1 2 Pelaaminen 1 2.1 Pelin aloittaminen.......................... 1 2.2 Pelin kulku.............................. 3 2.3 Pelin päättyminen.......................... 3 3 Robotin rakenne 3 3.1 Tarvittavat osat............................ 3 3.2 Toiminta lyhyesti........................... 4 3.3 Ongelmia ja ratkaisuja........................ 4 3.3.1 Kokoaminen......................... 4 3.3.2 Painikkeet........................... 4 3.3.3 Pyörät, kääntyminen..................... 4 3.3.4 Suuntaus........................... 4 3.3.5 lejosin CompassPilot-bugi................. 5 3.3.6 Ruudukolla liikkuminen................... 5 3.3.7 Siirron merkitseminen.................... 6 3.3.8 Ruudukon lukeminen..................... 6 3.3.9 Värisävyt........................... 6 3.4 Rakennusohje............................. 6 3.4.1 Runko............................. 7 3.4.2 Torni............................. 7 4 Ohjelman toiminta 9 4.1 Luokat................................. 9 4.1.1 Robotin ohjaus........................ 9 4.1.2 Tekoäly............................ 9 4.2 Pelin tekoälyn toimintaperiaate................... 9 4.3 Robotin toiminnot.......................... 10 5 Parannettavaa 10 6 Testit 11 Liitteet Liite A: Lähdekoodin API-kuvaus Liite B: Java-lähdekoodi

1 Kuvaus Robotin tarkoituksena on pelata ristinollapelia ihmisvastustajan kanssa ja voittaa. Peli tapahtuu fyysisella pelilaudalla, jonka koko ja ominaisuudet voidaan ma a ritta a ohjelman alussa. Robotti kykenee lukemaan pelilaudalta ihmisen siirrot ja merkitsema a n oman siirtonsa. 2 Pelaaminen Pelaamiseen vaaditaan oikein rakennettu robotti, jonka keskusyksikko o n pita a olla asennettuna lejos1 ja peliluokka. Rakennusohje on kappaleessa 3.4. Lisa ksi robotille pita a valmistaa pelialue esimerkiksi tulostamalla 10 kappaletta ruutuja, jotka kiinniteta a n sopivalle alustalle muodostamaan ruudukko. Sopiva yhden ruudun leveys on 16 cm ja ruudut on paras tehda mustarajaisena valkoiselle pohjalle. Ihmispelaaja tarvitsee myo s oman pelimerkkinsa, ta ha n on suositeltavaa ka ytta a harmaata paperinpalasta, jonka leveys on puolet peliruudusta. Kuva 1: Esimerkki pelialueesta 2.1 Pelin aloittaminen Jotta robotti voi toimia pelissa, sen antureiden pita a olla oikein kalibroituja. Valosensori sa a deta a n ohjelman alussa na ytta ma lla sille pelissa ka ytetta va t sa vyt. Asetuksia ei tallenneta keskusyksiko n muistiin, joten sensori pita a kalibroida uudestaan kussakin ka ynnistyksessa. Jos robotin rakenne muuttuu, pita a kompassisensori kalibroida uudelleen. Ta ha n annetaan mahdollisuus ohjelman alussa. Ohjelma esitta a ruudulla ohjeen kustakin vaiheesta ja ilmoittaa kun alustus on valmis ja robotin voi asettaa alkuruutuun. 1 http://lejos.sourceforge.net/ 1

Alustus 1. Käynnistä ohjelma ja vastaa seuraaviin kysymyksiin painikkeilla LEFT, RIGHT ja ENTER, oletusasetukset sulkeissa: ruudukon koko, 3x3-5x5 (3x3) yhden ruudun koko, 16-800 cm (16 cm) tekoälyn vaikeusaste, 1-3 (2) robotin nopeus, 100-900 (500) kalibroidaanko kompassisensori aloittaako ihmispelaaja 2. Paina robotin kynäteline ala-asentoon ja kiinnitä siihen kynä esimerkiksi kuminauhoilla tai nippusiteellä niin, että kynän kärki koskettaa riittävästi alustaa. Tee tämä pelialueen ja aloitusruudun ulkopuolella, ettei niihin tule robottia harhauttavia merkintöjä. 3. Paina kosketussensoria, jolloin kynäteline kääntyy ylös, valosensorin ledi syttyy ja merkkiääni soi. 4. Valosensorin kalibrointi alkaa. Näytä robotille pelin sävyt asettamalla robotti sävyn päälle ja painamalla kosketussensoria. Sävyt luetaan seuraavassa järjestyksessä: (a) kirkkain arvo ( valkoinen ) (b) tummin arvo ( musta ) (c) tyhjä ruutu (d) ruudun reuna (e) ihmisen pelimerkki Viimeisen sävyn jälkeen robotti soittaa lyhyen melodian. 5. Jos valitsit kompassin kalibroinnin: (a) Sijoita robotti niin että sillä on tilaa kääntyä ympäri ja takana oleva pallo on asetettu oikein. (b) Paina kosketussensoria, kompassin kalibrointi alkaa ja robotti pyörähtää noin kaksi kertaa ympäri ja soittaa melodian. 6. Sijoita robotti alkuruutuun, ruudukon suuntaisesti niin, että etuosa osoittaa ylöspäin ruudukolla. Tässä on hyvä olla tarkka, koska kompassin nollakulma pelialueen pystyakseli määräytyy robotin asennosta. 7. Kosketussensoria painamalla robotti aloittaa vuoronsa. Jos ihmispelaaja valittiin aloittamaan, siirto pitää tehdä ennen painamista. 2

2.2 Pelin kulku Kun on ihmispelaajan vuoro, kiinnitetään pelimerkki ruudukon haluttuun kohtaan esimerkiksi sinitarralla ja painetaan kosketussensoria vuoron päättymisen ilmaisemiseksi. Peli etenee vuorotellen siten, että robotti vuoronsa alussa käy ensin tutkimassa laudan tyhjiä kohtia kunnes löytää ihmisen siirron, minkä jälkeen tekee oman siirtonsa ja palaa takaisin alkuruutuun. Tämän jälkeen ihmispelaaja asettaa haluamaansa ruutuun pelimerkin ja painaa kosketussensoria merkiksi siirtonsa päättymisestä, jolloin robotti aloittaa taas vuoronsa. Robotin ensimmäisessä siirrossa kestää vähintään joitain sekunteja. Jos 4x4- lauta on valittu, vaikeusasteella 1 ensimmäisen siirron laskemiseen menee noin 50 sekuntia, 5x5-laudalla viisi minuuttia. Jos vaikeusastetta nostetaan 3:een, viettää robotti ensimmäisen siirron laskemiseen 3x3-laudalla noin puolitoista minuuttia. 2.3 Pelin päättyminen Peli päättyy, kun robotti joko tekee voittavan siirron, huomaa ihmisen voittaneen tai toteaa pelin päätyneen tasapeliin. Tuloksen joko ruudukon läpikäynnin tai oman siirtonsa seurauksena selvitettyään robotti palaa välittömästi alkuruutuun, soittaa äänen ja vilkuttaa valosensoriaan nopeasti. Robotti näyttää vielä näytöllään pelilaudan lopputilan ja voittajan. Robotin voi tässä vaiheessa asettaa takaisin alkuruutuun ja painaa kosketussensoria uuden pelin aloittamiseksi samoilla asetuksilla. Ohjelman voi sulkea painamalla yhtä aikaa ENTER ja ESCAPE -painikkeita. 3 Robotin rakenne 3.1 Tarvittavat osat Robotin rakentamiseen riittää yksi Lego Mindstorms NXT 8527 -rakennussarja 2 tai vastaavat osat, sekä HiTechnic NXT Compass Sensor (NMC1034) -kompassisensori 3. Tarvittavat NXT-komponentit: 3 servomoottoria 1 valosensori 1 kosketussensori 1 kompassisensori 6 johtoa Muita tarvikkeita: paperia ja kiinnitystarpeita ruudukkoa varten pehmeä tussi tai vastaava kynä robotin käyttöön, vaihtoehtoisesti siirrot voidaan merkitä ihmisen toimesta paperinpaloilla 2 http://mindstorms.lego.com/products/nxt/nxt-us.aspx 3 http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=nmc1034 3

3.2 Toiminta lyhyesti Liikkuminen tapahtuu kahdella itsenäisesti pyörivällä renkaalla. Sulavaa kääntymistä varten käytetään NXT-sarjaan kuuluvaa sinistä tai punaista palloa, johon rakennelman takaosa tukeutuu. Robotti käyttää kompassia suuntansa määrittämiseen ja valosensoria pelialueen muutosten havaitsemiseen. Siirto merkitään kynällä, jonka pidikettä ohjaa kolmas moottori. 3.3 Ongelmia ja ratkaisuja Ristinollapelin toteutukseen pohdittiin monenlaisia ratkaisuja, kukin hyvillä ja huonoilla puolillaan. Autonkaltaisessa robotissa on useita liikkeeseen virheitä aiheuttavia tekijöitä, kuten renkaiden malli ja koko, rakenteen symmetrisyys, alustan materiaali, liikkumis- ja kääntymisnopeus, rakenteen lujuus, paino sekä painopiste. Koska NXT-sarjan osilla on hyvin vaikeaa tehdä riittävän suuren lineaarisen liikkeen mahdollistavia rakennelmia, päädyttiin kuitenkin toteuttamaan peliä autonkaltaisella robotilla, koska paikallaan pysyväksi rakennettuna peli ei olisi ollut mielekkään kokoinen. 3.3.1 Kokoaminen Tarpeetonta rakennusvaivaa pyrittiin välttämään ja aloitettiin pohtimalla, miten robotin voisi rakentaa NXT-keskusyksikön ympärille. Tarvittavat tukirakenteet ja osat vaikuttivat olevan helpointa sijoittaa oikeille kohdilleen kun keskusyksikkö käännettiin painikkeet alaspäin, koska palikan takapuolella on useita kiinnitysreikiä joiden päälle voidaan rakentaa. Kiinnitykset ja tukirakenteet pyrittiin valikoimaan niin, että robotti olisi helppo koota mutta liikkuisi tasaisesti. Tämä onnistuikin melko hyvin. Robotin painopiste on matalalla ja se on yksinkertainen runsaat varusteet ja tukevuusvaatimukset huomioon ottaen. 3.3.2 Painikkeet Koska keskusyksikön painikkeet ovat robotin alla, sijoitettiin kosketussensori kätevään paikkaan korvaamaan ENTERiä. Pelin aikana painiketta tarvitaan vain vuoron vaihtuessa. 3.3.3 Pyörät, kääntyminen Yksi hankala ongelma oli, että robotin pitäisi kääntyä tarkasti ja tasaisesti paitsi yleisen tarkkuuden vuoksi, myös kompassisensorin oikean toiminnan varmistamiseksi. Ensimmäinen mieleen tuleva ratkaisu oli kääntyvät takapyörät, mutta nämä osoittautuivat liian huteriksi ja kääntyminen oli nykivää. Vankin ratkaisu tuntui olevan pallomainen pyörä, joten takapyörät korvattiin yhdellä pallolla. Pallo pyörii tukikehikon alla haluttuun suuntaan ilman suurempaa vastustusta, vaikka pallon karkaamista rajoittava rakenne voisi olla hiotumpikin. 3.3.4 Suuntaus Jotta robotilla olisi jokin luotettava reaalimaailmaan pohjautuva havainto käytössään eikä jouduttaisi luottamaan yksinomaan ajotarkkuuteen, käytetään kompassisensoria robotin osoittaman suunnan määrittämiseksi. Sensorilta voidaan 4

lukea kompassilukema joko absoluuttisena ilmansuuntana tai haluttuun suuntaan kiinnitettynä karteesisena kulmana. Sensorin vakaa ja suora asento on tärkeää tarkkuuden kannalta, joten tämä piti ottaa huomioon muun muassa kääntymisen nopeudessa. Robotti suuntaa kohti haluttua kulmaa laskemalla kumpaan suuntaan kääntymällä päästään kohdekulmaan nopeimmin ja kääntyessään säätää moottorin nopeutta pehmeästi hitaammaksi kun kohdekulmaa lähestytään, mikä lieventää merkittävästi pysähtymisen aiheuttamaa nykäystä. Kompassin kalibrointi osoittautui tärkeäksi. Kalibroinnista on ristiriitaista tietoa: lejosin API ohjeistaa pyörittämään HiTechnic-sensoria hyvin hitaasti 1,5-2 täyttä kierrosta 4, mutta kuitenkin luokka CompassNavigator suorittaa kalibroinnin yksinkertaisesti kääntymällä pyörillä yhden täyden kierroksen nopeammin kuin API:ssa suositellaan. Toisaalta taas kompassin omassa ohjeessa neuvotaan pyöräyttämään sitä ainakin yksi vähintään kaksi sekuntia kestävä kierros. Robotti käyttää omaa kalibrointitoimintoaan, joka suorittaa kaksi kierrosta melko hitaasti. Kompassin toimintaan vaikuttaa myös moottoreiden ja keskusyksikön aiheuttama häiriö ja ohjeissa suositellaankin sijoittamaan kompassi ainakin 15 cm etäisyydelle näistä. Tämän vuoksi kompassisensori on asetettu tornimaiseen rakennelmaan robotin päälle. Tornin pitää olla riittävän tukeva, ettei kompassi heilu kääntymisen aikana. 3.3.5 lejosin CompassPilot-bugi Suuntaamiseen ja koordinaatistossa liikkumiseen kompassin avulla on sinänsä olemassa toteutus lejosissa itsessään, mutta tässä tapauksessa törmättiin ikävään bugiin: luokan CompassPilot metodi rotateto 5 jota luokka CompassNavigator käyttää ei ikinä aloita varsinaista kääntymistä, mutta asettaa moottorin tilan kääntyväksi. Tämä johtaa siihen, että moottorin regulaattorisäie viskoo moottoria edestakaisin hulvattomasti. lejosin korjaaminen olisi ollut myös vaihtoehto, mutta turhan paneutumisen välttämiseksi toteutettiin tarvittava toiminnallisuus itse. 3.3.6 Ruudukolla liikkuminen Robotin menestyksekäs peli edellyttää toki, että se pysyy pelialueen sisällä ja sijainti vastaa ohjelman sisäistä tilaa. Tämä ratkaistiin tekemällä pahvipohjalle tulosteista 3x3-ruudukko, jonka yhden ruudun leveys on 16 cm. Ruudukon viivat havaitaan lattiaa kohti osoittavalla valosensorilla. Liikkuakseen yhden ruudullisen johonkin suuntaan, robotti kääntyy siihen kompassin avulla, sitten ajaa eteenpäin kunnes on ylittänyt viivan, minkä jälkeen korjataan suuntaa ja ajetaan vielä puoli ruudullista eteenpäin. Pelialueen ulkopuolelle vasemman alareunan viereen, koordinaatteihin (-1,0) on määritelty robotin alkupiste. Alkupiste on samanlainen ruutu kuin muutkin ja tehtyään siirron robotti palaa sinne odottamaan ihmispelaajan merkkiä suoritetusta siirrosta. Reitti valitaan laskemalla etäisyys kohteeseen pysty- ja vaakasuunnassa. Robotti siirtyy ensin tarvittavan etäisyyden ruuduissa pystysuunnassa, minkä 4 http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/lejos/nxt/ CompassSensor.html#startCalibration() 5 http://lejos.sourceforge.net/p_technologies/nxt/nxj/api/lejos/navigation/ CompassPilot.html#rotateTo(int) 5

jälkeen suorittaa vaakasuuntaisen siirtymisen. Käytännössä tällä tavalla toimien ja valosensoria viivojen tunnistamiseen hyödyntämällä robotti korjaa omaa liikettään siirtyessään ruudusta toiseen. Tarkkuus riittää 3x3-ruudukolla pelaamiseen hyvin tiheiden käännösten vuoksi, mutta suuremmalla pelialueella voi olla tarpeen keskittää robotti tietyin välimatkoin. Paljon suurempi ruudukko vaatii kuitenkin erilaisen pelialgoritmin, koska NXT:n laskentateho ei riitä jouhevaan peliin. Ruudun keskipisteeseen pääseminen tapahtuu kääntymällä ylöspäin, ajamalla kunnes ruudun reuna tulee vastaan, peruuttamalla puoli ruutua ja tekemällä saman vasempaan päin. Näin voidaan kimmottaa robotti ruudun reunoista keskipistettä kohti. Toimintoa käytetään kun robotti on palannut alkupisteeseen ja ennen kuin se aloittaa siirtonsa merkitsemisen ruutuun. 3.3.7 Siirron merkitseminen Robotin pitää pystyä jotenkin ilmaisemaan oma siirtonsa, joten kolmas moottori ohjaa robotin etuosaan kiinnitettyä kynäpidikettä. Kun sijainti on keskitetty haluttuun ruutuun, käännetään kynä koskettamaan paperia, minkä jälkeen robotti pyörähtää täyden kierroksen ja nostaa kynän. 3.3.8 Ruudukon lukeminen Omia siirtojaan robotin ei tarvitse lukea, koska ne tiedetään jo. Ongelmaksi jääkin ihmisen siirron selvittäminen, joka on toteutettu ajamalla robotin vuorolla niihin ruutuihin, joiden sisältö on robotin muistissa merkitty tyhjäksi. Ruudut käydään läpi alhaalta ylöspäin. Kun robotti saapuu ruutuun, valosensorin arvo luetaan ja verrataan tunnettuihin sävyihin. Jos sävy on riittävän lähellä jotain tunnettua lukemaa, asetetaan sitä vastaava tila ruutuun. Jos tila oli aiemmin tyhjä, mutta nyt ruudussa havaitaan ihmisen pelimerkki, ruudukon läpikäynti lopetetaan. Ihminen merkitsee siirtonsa harmaasävyisellä, riittävän suurella, esimerkiksi 8 cm leveällä neliönmuotoisella paperinpalalla, jonka sävyn robotin valosensori voi tulkita ihmisen siirroksi. Jos ruudun tila on jokin muu kuin tyhjä, sitä ei tutkita uudestaan vaikka sen läpi kuljettaisiinkin. Robotilla kestää oletusnopeudella korkeintaan 25 sekuntia lukea koko ruudukon tila. 3.3.9 Värisävyt Selvitäkseen pelilaudalla valosensori pitää kalibroida haluttuihin sävyihin. Yksinkertaisuuden ja tulostusteknisten rajoitteiden vuoksi käytettiin mustaa ja valkoista sekä harmaan sävyä, joka erottuu näistä riittävästi. Valkoinen tarkoittaa tyhjää ruutua, musta ruudun reunaa ja harmaa ihmisen siirtoa. 3.4 Rakennusohje Robotin rakenteessa merkittävintä on kyky tasaiseen kääntymiseen ja kompassisensorin pitäminen etäällä, noin 15 cm päässä toiminnallisista osista. Tämän vuoksi robotti on matala ja kompassille on rakennettu erillinen teline. Renkaita on pyritty tukevoittamaan liittämällä moottorin ja renkaan väliin sinisiä kiinnitystappeja. 6

3.4.1 Runko Runko muodostuu moottoreista ja keskusyksikko a ympa ro iva sta tukirakenteesta, joka robotin takaosassa kahlitsee pallon toimimaan pyo ra na. Runko voi olla rakennettu muunkinlaiseksi, mutta la hdekoodiin on ma a ritelty ta ssa esitellyn robotin mitat: renkaan halkaisija 5,6 cm, uran leveys 16,2 cm. Todellisuudessa leveys on kenties millimetrin lyhyempi, mutta na illa parametreilla robotti tuntui ajavan parhaiten. 3.4.2 Torni Torni pita a kompassin riitta va n eta isyyden pa a ssa muista osista ha irio iden va henta miseksi. Tornin rakenne voisi olla tukevampi ja kiinnitetty eri kohtaan runkoa, mutta ta ssa esitelty toimi riitta va n hyvin ja on helppo irrottaa. Olennaista on, etta torni ei heilu ka a ntyessa ja kompassi on suorassa. Torniin kuuluu myo s kyna a liikuttava moottori ja kosketussensori. 7

8

4 Ohjelman toiminta 4.1 Luokat Ohjelman käyttämät luokat on jaettu kahteen toiminnalliseen kokonaisuuteen. Yksi hallitsee robotin liikettä ja pääohjelmaa ja toinen toteuttaa pelin tekoälyn. 4.1.1 Robotin ohjaus Auxiliary Grid RobotControl Toe Aputoimintoja käyttöliittymän toteuttamiseksi. Ruudukkoabstraktio, jonka kautta robottia ohjataan. Robotinohjausluokka, sisältää navigaation, kalibrointi- ja valosensoritoimintoja. Pelin pääohjelma, kysyy pelin parametrit, aloittaa siirrot ja tarkistuttaa voittajan. 4.1.2 Tekoäly GameTree Rules SituationScorer Luo pelipuun tilanteesta ja hakee parhaan mahdollisen siirron. Tutkii, onko peli päättynyt. Pisteyttää siirron arvon pelaajalle. 4.2 Pelin tekoälyn toimintaperiaate Tekoäly laskee lailliset siirrot haluttuun syvyyteen asti ja valitsee näistä itselleen edullisimman. Ohjelman alussa voi valita vaikeusasteen, jolloin algoritmin hakusyvyydeksi asetetaan vaikeusaste + 1. Pelitekoälyn toiminta perustuu tavalliseen Minimax-algoritmiin, jonka ideana on luoda pelipuu ja käydä läpi jokainen mahdollinen pelitilanne. Pelitilanteista valitaan paras siten, että tekoäly ottaa huomioon molempien optimaaliset siirrot. Tekoäly on toteutettu käyttäen kolmea luokkaa. Luokka GameTree luo puun ja toteuttaa Minimax-algoritmin, Rules määrittää pelin säännöt, joihin kuuluu mm. pelin päättymisen, voittajan ja luvallisten siirtojen arviointi. Luokka SituationScorer on tekoälyn kannalta tärkeä, sillä se pisteyttää siirrot. Käytännössä jokainen puun lehdestä löytyvä pelitilanne syötetään SituationScorer luokalle, joka palauttaa kyseisen tilanteen pisteytyksen robotin kannalta. Ohjelmassa on käytetty seuraavaa pisteytystä: Jos pelitilanne on voittotilanne robotille, arvo = 1000 Jos pelitilanne on voittotilanne vastustajalle, arvo = -1000 Muuten arvioidaan laudalta löytyvät kaikki suorat seuraavasti: Jos suora on valmis, arvo = 0 Jos suoralla on molempien merkkejä, eikä suoraa voi näin ollen voittaa, arvo = 0 Jos suoralla ei ole yhtään vastustajaa, arvo = 10 Jokainen oma tuo arvoa lisää +20 Jos suoralla on vain vastustajan merkkejä, arvo = -10 9

Jokaista seuraavaa vastustajan merkkiä kohden arvoa vähennetään -40 Pisteytys saadaan laskemalla kaikkien suorien arvot yhteen. Tällaisella pisteytyksellä pyritään luomaan tekoäly, joka osaa ennakoida paremmin vastustajan siirrot ja joka korostaa vastustajan torjuntaa. Tästä on hyötyä varsinkin jos pelilauta on suurempi kuin 3x3. Jos pelilauta on 3x3 olisi ehkä enemmän hyötyä korostaa omia siirtoja enemmän, mutta näitä arvoja on helppo muuttaa. 4.3 Robotin toiminnot Liitteenä olevassa API-kuvauksessa selitetään toiminnot tarkemmin, tässä lista tärkeimmistä: Navigointi gohome moveto movedirectlyto center movenumsquares pointto Pelitoiminnot mark examine scan printboard Sensorit calibrateshades calibrate shade palaa alkuruutuun liiku haluttuun ruutuun liiku ruutuun suorinta reittiä keskitä robotti ruutuun liiku haluttu määrä ruutuja suuntaan käännä robotti osoittamaan suuntaan merkitse siirto haluttuun ruutuun tutki yhden ruudun tila tutki koko ruudukon tila tulosta ruudukon tila näytölle kalibroi valosensoriin käytettävät sävyt kalibroi kompassi tunnista robotin alla oleva sävy 5 Parannettavaa Robotti ei kulje optimaalista reittiä tutkiessaan ruudukkoa. Ruudukon läpikäynnissä noudatetaan yksinkertaista kaavaa, joka käy joka toisen rivin ruudut läpi eri suuntaan. Tämä johtaa siihen, että jos esimerkiksi keskirivin kaikki ruudut ovat täynnä, robotti on päässyt skannauksessa oikeaan alakulmaan ja seuraava skannattava ruutu sijaitsisi vasemmassa yläkulmassa, robotti suorittaa pystysuuntaisen siirtymän yläriville, mutta sitten siirtyy ylärivin vasemmanpuolimmaiseen ruutuun, josta lähtee käymään rivin läpi. Robotti olisi tässä voinut lukea rivin tehokkaammin aloittaen oikealta. Isommalla kuin 3x3-ruudukolla voi olla tarpeen joko muuttaa liikkumiskoodia tai keskittää robottia ruutuun aika ajoin, jotta robotti ei ajautuisi pitkän matkan aikana liikaa vinoon. 10

Kompassi voisi olla kiinnitetty tukevammin. Jäi myös hieman askarruttamaan, oliko tornin korkeus riittävä vai aiheutuiko moottoreista kompassiin oleellista häiriötä. Tornille voisi keksiä paremman korvaajan. Liike tapahtuu aina askelissa, mikä näyttää tökkivältä. Siirtymistä voisi tehdä pehmeämmäksi laskemalla nopeutta hieman ja korjaamalla suuntaa ajon aikana eikä pysähtymällä hetkeksi tekemään sitä ruudun reunalle. Nykyisellään ruutujen pitää olla neliön muotoisia. Tämän voisi muuttaa säädettäväksi niin että robotti voi pelata sopivilla lattialaatoilla tai muulla alustalla. Suurempiin pelialueisiin tarvittaisiin tehokkaampi pelialgoritmi. Pelissä on hieman nuivat ja epäinformatiiviset äänet, joita voisi parantaa. Äänisensoria voitaisiin käyttää kosketussensorin sijaan ilmaisemaan siirron päättymistä, jotta robotti tuntuisi luonnollisemmalta pelikaverilta. Kynäpidike voisi olla hienostuneempi tai koko merkintätapa korvattu paremmalla. Testaus jäi puutteelliseksi ja koodi mitä todennäköisimmin sisältää joitain virheitä. Tasapeliin johtavaa tilannetta ei tunnisteta ennen kuin ruudukko on täyttynyt, vaikka pattitilanteet voitaisiin päätellä. 6 Testit Robottia on testattu pienissä määrin 3x3-ruudukolla ja se on tunnistanut oikein omat ja ihmisen voitot sekä tasapelit. Järjestelmällistä koodin testausta ei ole suoritettu. 11