Robottiohjelmoinnin harjoitustyö : Käytösmallit
Käytösmallien ohjelmointi
LeJOS sisältää käytösmallien luomista varten ns. subsumption-arkkitehtuurin, jossa robotin eri toiminnot jaetaan priorisoiduiksi tilakoneiksi, joiden tilaa tarkastellaan erillisissä säikeissä ja tilanteen mukainen toiminto otetaan käyttöön muiden passivoituessa.
Tällaista ympäristössä toimivaa, autonomiseen toimintaan kykenevää ohjelmaa kutsutaan agentiksi. Agentilla voi olla useita käytösmoduuleita, esimerkiksi aja suoraan
ja väistä estettä
. Käytösmoduuli tässä yhteydessä tarkoittaa Behavior-rajapinnan toteuttavaa luokkaa.
Subsumption-arkkitehtuuri ja leJOS
LeJOSin subsumption-toiminnot kiteytyvät Behavior-rajapintaan ja Arbitrator-luokkaan.
Behavior-rajapinta
Rajapintaan kuuluu kolme metodia:
public boolean takeControl() { … } public void action() { … } public void suppress() { … } |
Kun toiminnon pitäisi aktivoitua, takeControl palauttaa true.
Esimerkiksi väistämisreaktio voisi käynnistyä kun ultraäänisensori näyttää tarpeeksi pientä lukemaa, jolloin takeControl voitaisiin määritellä näin:
public boolean takeControl() { return sonic.getDistance() < 50; } |
Action-metodi toteuttaa varsinaisen toiminnon, eli esimerkissä väistämisreaktion, vaikkapa kääntymällä 15 astetta jompaan kumpaan suuntaan.
Suppress-metodi toteuttaa keskeytystoimenpiteet, kun tämä käytösmoduuli on action-tilassa, mutta korkeamman prioriteetin moduuli siirtyy aktiiviseksi. Esteenväistämisen suppress-metodi voisi esimerkiksi pysäyttää moottorit.
Arbitrator-luokka
Arbitrator hallinnoi käytösmoduulien priorisointia, käynnistystä ja pysäytystä sekä suorittaa kunkin takeControl-metodin saadakseen selville mikä moduuleista siirtyy suoritukseen ja mikä keskeytetään.
Arbitrator voidaan luoda näin:
Behavior b1 = new DriveForward(); Behavior b2 = new AvoidObstacle(); Behavior[] bArray = {b1, b2}; Arbitrator arby = new Arbitrator(bArray); arby.start(); |
Arbitratorin konstruktorille annetun taulukon järjestys määrittää moduulien (Behaviorien) prioriteetit, suurempi taulukon indeksi vastaa korkeampaa prioriteettia. Yllä siis esteen väistäminen (b2) tapahtuu korkeimmalla prioriteetilla.
Ylläolevassa esimerkissä alemman tason toiminto on ajaa suoraan ja ylemmän tason toiminto väistää estettä, joten kun este havaitaan AvoidObstaclen takeControl-metodin palauttaessa true, DriveForwardin suppress-metodi suoritetaan, jonka jälkeen AvoidObstaclen action-metodi suoritetaan.
Näin robotti tullessaan liian lähellä estettä kääntyy toisaalle ja jatkaa matkaansa. Jos tässäkin suunnassa on este, väistötoiminto suoritetaan uudelleen.
Tutoriaalista kannattaa lukaista, miten käytösmalleista saadaan tehtyä luotettavia.