A robot felépítése
A robot a hosszanti tengelyén elhelyezkedõ két hajtott kerék segítségével mozog, illetve két kis oldalsó kerék biztosítja az egyensúlyát. | |
A központi egység a robot tetején helyezkedik el, így a kerekeket ne zavarja az elfordulásban. | |
A cél egy kormányozható (de nem lánctalpas) robot megépítése
volt, amely jól fordul, ezért
az elsõ és a hátsó kerék is kormányozható.
A két kerék együtt fordul, mindig ellentétes
irányba, így a robot képes kis íven megfordulni.
Nézd meg a felvételt is! | |
A kerekeket hajtó motorok a kerekek mellett, szintén a robot hosszanti tengelyén helyezkednek el (így a robot alacsonyabb, ezáltal pedig stabilabb), és a kerekekkel együtt fordulnak. | |
A kerekek elfordításáról egy harmadik motor gondoskodik, amely a robot közepén helyezkedik el. | |
A motor ékszíjjal meghajt egy tengelyt, amelyen egy csigakerék található, ez pedig fogaskerék áttételen keresztül forgatja a kerekeket. |
A program:
A Hernyow programja a legOS 0.2.5 könyvtárait használva C-ben íródott. Windows
95 alatt -- a Cygwin segítségével -- fordítottuk le a legOS kernelét, C
könyvtárát és segédprogramjait.
A program forrása az alábbi négy fájlban található:
main3.c | A main() függvény definíciója. |
robot.h | A program konstansai, makródefiníciók, a standard header fájlok include-olása és a robot.c-beli függvények deklarációja. |
robot.c | A többi C függvény definíciója, amiből a programunk összeáll. |
5_music.c | A dallamokat tartalmazó tömbök definíciója. A robot.c include-olja ezt a fájlt, nem fordítjuk külön. |
Inicializálás: az init() függvény meghívásával a fényérzékelők aktív módba kapcsolása és a tolatólámpát villogtató szál elindítása. Ezt a szálat a blinker_thread() nevű függvény írja le.
Fényérzékelés kalibrálása: a calibrate_light() függvény meghívásával mindhárom fényérzékelőre beállítjuk a küszöbértéket -- először az útra kell helyezni a robotot, majd a földre, az LCD kijelzőn megjelenő utra ill. fold utasításnak megfelelően. Mindhárom érzékelőn a mért két érték számtani közepe lesz a küszöbérték.
Kormányzás kalibrálása: a calibrate_steer() függvény meghívásával a nyomásérzékelőket figyelve mindkét irányban megmérjük, hogy mennyi ideig tart az egyik végállásból a másikba `forgatni a kormányt'. Ezeket az időtartamokat a bal_ido és jobb_ido nevű globális változókban tároljuk.
A program fő ciklusa: a main_loop() függvényben leírt végtelen ciklus (amíg ki nem tépi a tápkábelt és le nem meríti az elemeket, addig a robotunk meg nem áll!), ami állapotváltozásra vár, és az állapotváltozásnak megfelelő függvényt meghívja. A state_change_wakeup() függvény figyeli az állapotváltozást, és a state globális változóban meg is jegyzi a jelenlegi állapotot. A delta() függvény visszatérési értéke az állapotváltozásnak megfelelő parancs -- mit kell most csinálni. Ezzel a függvénnyel egy állapotátmenet gráfot valósítottunk meg.
A lehetséges parancsok, illetve a szükséges függvényhívás:
CMD_ELORE | Menj tovább! | |
CMD_KIS_JOBB | Kicsit korrigálj jobbra! | korrigal(JOBBRA) |
CMD_KIS_BAL | Kicsit korrigálj balra! | korrigal(BALRA) |
CMD_EXT_JOBB | Extrém jobbra fordulás, amíg meg nem találod az utat! | extrem(JOBBRA) |
CMD_EXT_BAL | Extrém balra fordulás, amíg meg nem találod az utat! | extrem(BALRA) |
Kis korrekció: a robot megáll, elfordítja a kormányt egy kicsit, elindul és így megy egy darabig, majd visszaszedi a kormányt, és megpróbálja megállapítani, hogy merre van az út (a poll_road() hívással).
Extrém fordulás: elkezdi játszani a `Mission Impossible' dallamot, majd megáll, elfordítja a kormányt majdnem teljesen az adott irányban (minden ötödiknél újrakalibrálja a kormányzást is, ha már egyszer úgyis ott van a nyomásérzékelők közelében), ezután elindul előrefelé, és addig megy, amíg a hátsó fényérzékelővel ismét meg nem találja az utat. Ekkor addig megy még tovább előre, amíg a kormányt egyenesbe szedi. Ha eközben lemegy az útról, akkor visszatolat (a tolatólámpát villogtatva), amíg meg nem találja.
Röviden összefoglalva tehát:
A robot az indítás után bekalibrálja magát, azaz beállítja a kerekeket középállásba. Ezután megindul egyenesen előre,
amíg valamelyik érzékelő ez útra nem ér, innentől megpróbálja az utat követni. Ha a két első érzékelő valamelyike lefut
az útról, akkor az adott irányba fordul egy kicsit és így halad tovább, de ha eközben a hátsó érzékelő is lefut, akkor
megáll, és élesen fordul, és csak ezután halad tovább előre. A kerekeket akkor állítja ismét egyenesbe, mikor a hátsó érzékelő is felér az útra.
Eközben még halad előre, álló helyzetben ugyanis nehezebben fordul, és nem egyenes állásba érne vissza. Még így is
előfordul, hogy nem talál vissza középállásba, ezért minden ötödik éleskanyar után kalibrációt végez. Éleskanyar után előfordulhat,
hogy mire a kerekek egyenesbe állnak, az érzékelők már lefutottak az útról, ezért ilyenkor a robot visszatolat, míg ismét
nem érzékeli az utat, és ebből az állapotból halad tovább. A robot haladás közben az Indiana Jones zenéjét játsza, tolatáskor azonban
átvált a Mission Impossible-re.
Előfordul, hogy kanyarodáskor a robot túlfordul, és visszafelé indúl el az úton. Ez azért van, mert a robot az úton szabadon mozoghat, és egyszer az
út jobboldalát, egyszer pedig a baloldalát figyeli. Ezt a hibát úgy lehetne kiküszöbölni, ha a kanyarodás
mértékét az út szélességének megfelelően mindíg beállítanánk (vagy csak az út egyik szélét követné).
Az állapotátmenet gráf mutatja, hogy a robot milyen állapotban milyen manővert végez.
Készült néhány mozgó felvétel is: 1. felvétel 2. felvétel
Készítették: