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

Samankaltaiset tiedostot
Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Lego Mindstorms NXT robottien etenemissuunnitelma

JOHDATUS TEKOÄLYYN TEEMU ROOS

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

Lego NXT Mindstorms -ristinollarobotti

Toteutusdokumentti. FuBot

BL40A1810 Mikroprosessorit, harjoitus 1

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

58131 Tietorakenteet ja algoritmit (syksy 2015)

Määrittelydokumentti

SUMO-ROBOTTI. Tehtävä

8/20: Luokat, oliot ja APIt

Puzzle SM Pistelasku

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

JOHDATUS TEKOÄLYYN TEEMU ROOS

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

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

JOHDATUS TEKOÄLYYN TEEMU ROOS

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

KOKO PERHEEN HAUSKA STRATEGIAPELI OHJEET

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

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

Tietokoneshakki. Kari Timonen

JOHDATUS TEKOÄLYYN TEEMU ROOS

TIEA343 - Robottiohjelmointi 2011

Ohjelmointi II. Erkki Pesonen Luennot ja harjoitukset. Itä-Suomen yliopisto Tietojenkäsittelytieteen laitos 2015

Lego Mindstorms NXT robottien etenemissuunnitelma

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Hakemistojen sisällöt säilötään linkitetyille listalle.

OHJ-1160 Laaja Ohjelmointi 2

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

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

Impedanssitomografia-peli

Voiman momentti M. Liikemäärä, momentti, painopiste. Momentin määritelmä. Laajennettu tasapainon käsite. Osa 4

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

13/20: Kierrätys kannattaa koodaamisessakin

* Trigonometriset funktiot suorakulmaisessa kolmiossa * Trigonometristen funktioiden kuvaajat

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Ohjelmoinnin jatkokurssi, kurssikoe

Shakkiopas vähemmän pelanneille

Pinta-ala- ja tilavuuskäsitteiden oppimispeli

Ohjelmistoarkkitehtuurit harjoitustyö RobotWarGame RobotFW SimulationFW SimulationGUIFW SWT/Java Kuva 1: Esimerkki arkkitehtuurin kerroskuvasta

Mobiilijärjestelmien ohjelmointi

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Uskontojen maailmassa

LUMATE-tiedekerhokerta, suunnitelma AIHE: PELIT JA TAKTIIKAT

Neljän alkion kunta, solitaire-peli ja

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

Ohjelmoinnin perusteet, syksy 2006

Suunnitteluvaihe prosessissa

Tietorakenteet (syksy 2013)

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Opettajatuutorointi-kurssin syksyn 2006 kyselyjen tulokset

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

Johdatus tekoälyyn (T. Roos) Kurssikoe

AC Hannes Statistics Tool. Ilkka Hakkarainen

Ohjelmointileirin järjestäminen

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Kenguru 2015 Benjamin (6. ja 7. luokka)

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Jypelin käyttöohjeet» Ruutukentän luominen

19/20: Ikkuna olio-ohjelmoinnin maailmaan

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

Algoritmit 2. Luento 14 Ke Timo Männikkö

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

5. HelloWorld-ohjelma 5.1

75059 Suuri lajittelusarja

5. HelloWorld-ohjelma 5.1

Trigonometriaa ja solve-komento GeoGebralla

VIRUSKAAPPARI-PELI - KURKISTUS OHJELMOINNILLISEEN AJATTELUUN

Ohjelmoinnin perusteet Y Python

Sisällysluettelo. 1. Johdanto

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Toinen harjoitustyö. ASCII-grafiikkaa

XPages käyttö ja edut Jarkko Pietikäinen toimitusjohtaja, Netwell Oy

Tarjolla tänää: Ohjelmiston toteutuksesta. Kuinka tulla hyväksi ohjelmoijaksi? CRC-kortit. Testilähtöinen kehittäminen JOT2007. Uudelleenrakentaminen

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

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

Johdatus go-peliin. 25. joulukuuta 2011

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

a b c d

Suorat ja tasot, L6. Suuntajana. Suora xy-tasossa. Suora xyzkoordinaatistossa. Taso xyzkoordinaatistossa. Tason koordinaattimuotoinen yhtälö.

Nosturirobotti. robotin tarkoitus. mikä on robotin tehtävä. Kurssin robottiohjelmointi, kesä 2011 harjoitustyö

Johdatus verkkoteoriaan luento Netspace

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Transkriptio:

Antitammirobotti Antti Meriläinen <antti.merilainen@helsinki.> Martin Pärtel <martin.partel@cs.helsinki.> 29. toukokuuta 2009 Helsingin yliopisto Tietojenkäsittelytieteen laitos Robottiohjelmoinnin harjoitustyö (Java) Ohjaaja Mikko Apiola Helsingissä 20.05.2009

Sisältö 1 Robotin rakenne ja toimintaperiaate 1 2 Toteutus ja sen ongelmat 2 3 Ohjelman osat 2 3.1 Pääohjelma............................ 2 3.2 Käytösluokat........................... 3 3.3 Robotin liikuttelukoodi...................... 3 3.4 Valoanturidatan tulkitseminen.................. 3 3.5 Peliabstraktio........................... 3 3.6 Tekoäly.............................. 3 3.7 Apuluokkia ja tietorakenteita.................. 4 4 Sivuttaisliike 5 5 Tarvittuja ohjelmointikurssien taitoja 6 6 Lähdekoodi 6

1 Robotin rakenne ja toimintaperiaate Tämän epäonnistuneen projektin tavoite oli toteuttaa tammea pelaava Lego Mindstorms NXT -robotti. Robotti liikkuu pelilaudan yli pyörillä ja liu'uttaa käsivarttaan laudan rivien yli. Käsivarressa on kiinteä valoanturi laudan tilan lukemista varten sekä moottorilla laskettava nappulanliikuttaja. Robotin kanssa pelataan vuorotellen siten, että ihmispelaaja painaa vuoronsa jälkeen robotin nappulaa, jonka jälkeen robotti lukee laudan tilan ja tekee oman siirtonsa. Tavallisen tammen sääntöjen mukaan nappula muuttuu laudan loppuun päätyessään tammeksi. Tammea merkitään yleensä kahdella päällekkäisellä nappulalla. Pelin sääntöjä muutettiin, koska robotti ei kykene helposti merkitsemään eikä tunnistamaan tamminappulaa. Uusissa säännöissä nappulat 1

eivät voi edetä päästyään laudan loppuun asti. Myös pelin tavoite käännettiin päinvastaiseksi: ensimmäinen pelaaja, joka ei voi enää tehdä siirtoja, on voittaja. 2 Toteutus ja sen ongelmat Robotin rakenteen kenties suurin ongelma oli käsivarren liu'uttajan liikerata. Liike oli melko epätarkka ja hitailla nopeuksilla nykivä. Moottorin asento ja käsivarren etäisyys moottorista olivat epälineaarisessa riippuvuussuhteessa. Lisäksi moottorin käynnistäminen ja pysäyttäminen vaikutti käsivarren liikkeeseen pienellä viiveellä. Kaikkien näiden tekijöiden huomioiminen ohjelmassa luotettavalla tavalla osoittautui liian vaikeaksi. Legon valosensori erottaa valitettavasti vain harmaasävyjä. Robotin täytyi kyetä erottamaan toisistaan mustat ja valkoiset nappulat sekä laudan musta reuna. Laudan pienen koon, sivuttaisliikeen epätasaisuuden ja muiden epätarkkuustekijöiden takia laudan lukeminen riittävän luotettavasti ei onnistunut. Robotin tekoäly toteutettiin alfa-beeta -karsinnalla tehostetulla minimax -algoritmilla. Pelipuun tutkintaa rajoitettiin vakiosyvyyteen, jossa laudan tila pisteytettiin yksinkertaisella heuristiikalla. Tekoäly toimi kohtalaisen hyvin. 3 Ohjelman osat Kaikki koodi sijaitsee pakkauksessa lego. 3.1 Pääohjelma Pääohjelman lego.main tehtävä on alustaa lejosin käytös rajapinta (behaviour API). lego-pakkauksen juuressa on myös muita pikaisiin kokeiluihin käytettyjä pääohjelmia. 2

3.2 Käytösluokat Koska projekti jäi kesken, käytösluokkia toteutettiin vain yksi: lego.behaviors.initialboardscan, jonka tehtävä on lukea laudan tila uudestaan. 3.3 Robotin liikuttelukoodi Robotin liikutteluun tarvittava apukoodi sijaitsee lego.control -pakkauksessa. MotorControl -rajapinta määrittää yhteisiä metodeja, jotka toteutettiin jokaiselle liikesuunnalle (HandControl, SidewaysControl, WheelControl). Sivuttaisliikkeen epälineaarisuuden kompensointi piilotettiin SidewaysControl -luokkaan. RobotControl sisältää em. MotorControl:n toteutukset sekä koodin rivien tai sarakkeiden skannaukseen. 3.4 Valoanturidatan tulkitseminen RobotControl:n skannausmetodit tuottavat taulukon valoanturin arvoja. Näiden arvojen tulkitsemiseen tarvittavat algoritmit sijaitsevat BoardScan- Data -luokassa. Koodi tulkitsee valoanturidataa käyränä ja etsii sieltä riittävän pitkiä tasaisia osia (BoardScanData.Segment). Näistä osista kaksi tumminta tulkitaan laudan reunoiksi ja loput tulkitaan joko laudaksi tai nappuloiksi. 3.5 Peliabstraktio Tammipeliä mallintavat luokat ovat lego.checkers -pakkauksen Board, Simple- Move ja JumpSequence. Laudan koordinaatistossa numeroidaan kaikki kahdeksan riviä (0-7), mutta sarakkeissa numeroidaan vain mustat ruudut (0-4). 3.6 Tekoäly Tekoäly sijaitsee luokassa lego.checkers.ai.minimaxai. Tekoälylle sopivat heuristiikat sijaitsevat lego.checkers.ai.heuristic -pakkauksessa ja to- 3

teuttavat PositionEvaluator -rajapinnan. 3.7 Apuluokkia ja tietorakenteita lego.misc -pakkauksessa on sekalaisia apuluokkia sekä joidenkin Lejosista puuttuvien tietorakenteiden toteutuksia. 4

4 Sivuttaisliike Sivuttaisliikkeessä täytyi ratkaista moottorin kulmaa ja käsivarren sijaintia yhdistävä kaava. Halutaan siis ratkaista pituus X kulman α funktiona. Voidaan kirjoittaa: X = X 1 + X 2 ja X 1 = H 1 cos(π α) = H 1 cos(α). Pituus X 2 voidaan ratkaista, kun tiedetään: X 2 2 + Y 2 4 = H 2 2 X 2 2 = H 2 2 Y 2 4 X 2 = Lisäksi tiedetään, että: H 2 2 Y 2 4 Y 1 + Y 3 = Y 2 + Y 4 Y 4 = Y 1 + Y 3 Y 2 = Y 1 Y 2 + H 1 sin(π α) = Y 1 Y 2 + H 1 sin(α) Saadaan lopuksi: X = X 1 + X 2 = H 1 cos(α) + H2 2 Y4 2 = H 1 cos(α) + H2 2 (Y 1 Y 2 + H 1 sin(α)) 2 missä Y 1, Y 2, H 1 ja H 2 ovat vakioita. 5

5 Tarvittuja ohjelmointikurssien taitoja Välttämättömiä taitoja Algoritmien laatimisen perusteet Algoritmien aika- ja tilavaativuuden arviointi Rekursion käyttö algoritmeissa Olio-ohjelmoinnin perusteet: kapselointi ja perintä Hyödyllisiä taitoja Polymorsmin hyödyntäminen Roskienkerääjän olemassaolon tiedostaminen Säikeet (Rinnakkaisohjelmointi, Ohjelmointitekniikka (Java)) 6 Lähdekoodi Robotin ohjelman lähdekoodi ulkoisine kirjastoineen sijaitsee hakemistossa lego/ ja sen alihakemistoissa. lego-extra/ sisältää joitakin yksikkötestejä sekä käyttöliittymän tekoälylle. Ohjelmaa kehitettiin Eclipse 3.4.1 -kehitysympäristössä käyttäen lejos-kirjaston Eclipse-liitännäistä. 6