Egymást követõ robotok
A feladat leírása
Készítsen két robotot. Az egyik, az elveszett, "el
van
veszve valahol és várja a segítséget".
A másik, a keresõ,
"megkeresi az elveszettet, és hazasegíti".
Megoldás
A feladatot túl bonyolultnak találtuk, ezért csak
egy részének megoldást céloztuk meg. A megoldásunkban
az egyik robot (a fõnök, a fenti képen a bal oldali)
véletlen pályán mozog, míg a másik (a
szolga, a fenti képen a jobb oldali) megpróbálja követni.
A fõnök nem szalad elõre, mindig megvárja, hogy
utolérjék õt.
A robotokról
A fõnök egy nagyon egyszerû robot, elõl két
nagy kereke van, hátul pedig egy kitámasztó kicsi.
Ezekkel nem tud mást, mint állni, haladni (a két kereket
egyszerre forgatja), vagy fordulni (az egyik kerék forog, a másik
áll, vagy ellenkezõ irányba forog).
A szolga sem sokkal bonyolultabb, bár õ lánctalpakkal
üzemel, ugyanolyan manõverekre képes, mint a fõnök.
Van viszont egy ütközõje elöl, amivel érzékelni
tudja, ha nekimegy valaminek.
A követés folyamata
Kezdetben a két robot egymással szemben áll. A fõnök
dönt afelõl, hogy hátra, hátr-balra, vagy hátra
jobbra menjenek. Közli ezt a szolgával. Aztán elindul,
és megy egy keveset arra, amerre mondta. A szolga vár egy
kicsit, majd utánamegy, értelemszerûen követve
az irányt. Ha ezután nem látja a fõnököt,
megpróbálja megkeresni.
Mindez filmen
Kommunikáció
A robotoknak az egymással való kommunikációra
kevés eszközük van. Üzenetet küldhetnek, vagy
megnézhetik, hogy utoljára milyen üzenetet kaptak. Mindezt
rövid és hosszútávon. Mivel a hosszútávú
kommunikáció az egész szobában mûködik,
ezt semmire sem tudtuk használni. A rövid távú
kommunikáció viszont (nekünk) kb. 20-30 cm-ig mûködött,
ezért kiválóan alkalmas volt annak tesztelésére,
hogy "látják"-e egymást a robotok.
Hallasz engem?
A robotok gyakran kerültek olyan helyzetbe, hogy pl. csak az egyik
vette a másik jeleit, vagy egy határhelyzetben vagy fogta
a jeleket, vagy nem. Ez komoly gondot okozhat a két robotban levõ
programok szinkronban tartásánál. Ezt úgy oldottuk
meg, hogy mindkét robot (különbözõ ütemben)
bele- beleszól a világba, és közli, hogy õ
most épp hol jár a programjában. A másik ennek
ismeretében megteheti a szükséges lépéseket.
Ez elég egyszerû, a main task végigolvasásával
könnyen megérthetõ. Az alprogramok értelemszerûen
mûködnek, kis érdekesség talán csak a pulzal
task. Ez a task szól bele folyton az éterbe, és közli,
hogy melyik fázisban van a program (state). Jól látszik
a kódból, hogy nem nagyon reagál arra, hogy mit hall
a másiktól, mindig megvárja, hogy az legyen, amit
õ akar, aztán csinálja tovább, amit eltervezett.
A fõnök állapotai
A fõnöknek négy állapota van:
-
IR_VAR: arra vár, hogy a szolga megtalálja õt.
-
IR_HATRA: eldöntötte, hogy hátra fog menni, és
ha a szolga is megtudta ezt, akkor hátra is megy.
-
IR_HATRABALRA,
IR_HATRAJOBBRA: ugyanaz, mint az IR_HATRA, csak fordul is haladás
elõtt.
A szolga programja bonyolultabb, õ igazodik a fõnökhöz.
Tudja, hogy õ hol tart, és figyeli, hogy a fõnök
hol tart. Ebbõl a kettõbõl derül ki mindig, hogy
mit fog csinálni. Lássuk az egyszerûbb részeket:
-
pulzal task: mint a fõnöknél, világgá
kürtöli, hogy õ épp hol tart. Állandóan
fut.
-
figyel task: bizonyos idõközönként beállítja
a masterstate változó értékét
arra, amit az adott idõtartam alatt hallott. Azért van rá
szükség, hogy hamar észrevegyük, ha elveszítjük
a kapcsolatot. A program többi része nem is veszi figyelembe
a kapott üzeneteket, csak a masterstate változóra
hagyatkozik. Állandóan fut.
-
utkozes task: ha a robot elején levõ ütközõ
benyomódik, akkor tolat egy kicsit. Hasznos például,
ha túl közel kerül a fõnökhöz. Állandóan
fut.
-
elore, hatra, elorejobbra, elorebalra alprogramok: egyszerû
részek, a motorokat mozgatják értelemszerûen.
-
main task: beindítja az állandóan futó
taskokat, inicializálja a state és masterstate
változókat, majd megkezdi a valódi mûködést.
A szolga állapotai
-
IR_VAR (var task): várunk, hogy a fõnök
mondja meg mit akar. Ennek megfelelõen állunk át egy
másik állapotra/taszkra, és zárjuk le a mostanit.
-
IR_HATRA (elore task),
IR_HATRABALRA (elorebalra task),
IR_HATRAJOBBRA (elorejobbra task): várunk, megyünk.
Aztán ha látjuk a fõnököt, akkor várunk
(var), ha nem, megkeresük. (nemlat).
-
IR_NEMLAT (nemlat task): rosszalló hangot adunk, elindítjuk
a fulel taskot, hogy visszatérítsen minket, amint
meghalljuk a fõnököt, majd agyafúrt manõverekbe
kezdünk: elõre, majd visszamegyünk, jobbra fordulunk,
vissza. Balra, vissza. Tolatunk, majd elõre. Végül csinálunk
egy hosszú piruettet, háthat csak rossz irányba nézünk.
Aztán megint elõlrõl.
Egyebek
-
meghajt makró: csak hogy kevesebbet kelljen írni.
Ha pozitív paramétert kap, a kapott paraméternek megfelelõ
motor(oka)t elõre hajtja egy ideig, ellenkezõ esetben hátrafelé.
-
fulel task: amint hall valamit a fõnöktõl, vidáman
csippant, megállítja a motorokat és a keresgélõ
taszkot, majd elindítja a var taskot.
Gondok, fejlesztési lehetõségek
-
A szolga elég bután keresi a fõnököt, nem
használ fel semmilyen információt, például
azt, hogy milyen irányba ment, mielõtt elvesztette. Emiatt
gyakran csak sokára találja meg, sõt elõfordul,
hogy teljesen elveszti. Ezen lehetne javítani.
-
A motorok nem ugyanolyan erõsek, ezért sem a szolga, sem
a fõnök nem tud egyenesen menni. Ha a fõnök nem
véletlenszerûen mozogna, hanem egy útvonalat követne,
ez komoly gondot jelentene. Sõt, ez az egyik oka annak is, hogy
egyálltalán elvesztik egymást.
-
a szolga felépítésébõl adódóan
nem ugyanolyan gyorsan megy hátra, mint elõre. Ezért
a keresgélési résznél gyakran eltávolodik
a kiindulópontjától, néha elég rossz
irányba.
-
az elemek nem elég erõsek, ezért a robotok csak kábellel
mûködnek. Emiatt nem távolodhatnak nagyon el a konnektorról,
néha maga a kábel forgatja-húzza õket.
-
van, hogy a szolga hallja a fõnököt, de a fõnök
nem hallja a szolgát. Ilyenkor áll az egész rendszer.
Ezen talán segytene, ha az adók egyenlõ magasságban
volnának.