Difference between revisions of "Sokoban"
(44 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | ==Zadanie nášho projektu== | |
− | + | Cieľom nášho projektu Sokoban bolo naprogramovať robota Tatrabot tak, aby zvládol nájsť správne riešenie jednej zo štyroch zadaných hracích plôch (viď obr. 1) hry Sokoban a následne týmto nájdeným riešením odohrať hru do úspešného konca, pričom hracia plocha pozostávala z navzájom kolmých čiar vytvárajúcich mriežku rôznych tvarov obsahujúcu priesečníky reprezentujúce kocky potrebné k odohratiu hry, teda ich dopraveniu na vopred určené miesta zadanej hracej plochy mriežky. | |
− | [ | + | |
+ | [[Image:sokoban.jpg|500px]] | ||
+ | obr. 1 | ||
+ | |||
+ | Náš projekt pozostáva z dvoch fáz, z ktorých prvou fázou je naprogramovať robota tak, aby sa zvládol pohybovať po hracej ploche nami zadanou postupnosťou smerov a druhou fázou je naprogramovať schopnosť robota vygenerovať si postupnosť smerov, ktorej aplikovanie umožňí úspešné ukončenie hry, pričom doposiaľ sa nám podarilo uskutočniť prvú zo spomínaných fáz projektu. | ||
+ | |||
+ | ==Hardware== | ||
+ | Pre náš projekt sme použili robota TATRABOT. | ||
+ | |||
+ | [[Image:Sokoban2.jpg|500px]][[Image:sokoban3.jpg|500px]][[Image:sokoban1.jpg|500px]] | ||
+ | |||
+ | ==Software== | ||
+ | Nasledujúci program zabezpečuje riadenie pohybu robota, teda je obsahom prvej fázy projektu. | ||
+ | |||
+ | <code> | ||
+ | main() | ||
+ | { | ||
+ | #include "tatrabot.h" | ||
+ | #include "demo.h" | ||
+ | |||
+ | //char smer[256] = "DPDPDVPPPDDVDDPDPDPDVDLDLDDLPLDLPLDLDVPDVLDDVPPPDDVDLDLDVDPLDPDLDVLLLDDDVPPPD"; | ||
+ | char smer[255] = "DPDPDVPPP"; //predom zadaná trasa ktorú má robot prejsť v dokončenej verzii bude trasu generovať tiež program | ||
+ | |||
+ | void rt(void) { //zabočiť do prava | ||
+ | //rightTurn | ||
+ | setMotor(2, -4000); | ||
+ | setMotor(1, 4000); | ||
+ | } | ||
+ | |||
+ | void lt(void) { //zabočiť do ľava | ||
+ | //leftTurn | ||
+ | setMotor(1, -4000); | ||
+ | setMotor(2, 4000); | ||
+ | } | ||
+ | void bd(void) { //cúvanie | ||
+ | //backward | ||
+ | setMotor(3, -4000); | ||
+ | } | ||
+ | |||
+ | void fd(int distance) { | ||
+ | //dopredu so sledovaním čiari | ||
+ | unsigned int endA = countA + distance; | ||
+ | unsigned int endB = countB + distance; | ||
+ | while (countA <= endA && countB <= endB) { | ||
+ | uint8_t ln = senseLine(); | ||
+ | uint8_t led1 = (ln >> 3) & 1; | ||
+ | uint8_t led2 = (ln >> 2) & 1; | ||
+ | uint8_t ledx = ln & 1; | ||
+ | |||
+ | if (led2 == 1 || ledx == 1) { | ||
+ | led2 = 1; | ||
+ | } | ||
+ | else { | ||
+ | led2 = 0; | ||
+ | } | ||
+ | uint8_t led3 = (ln >> 1) & 1; | ||
+ | if (led1 == 1 && led2 == 1 && led3 == 0) { | ||
+ | lt(); | ||
+ | } | ||
+ | if (led1 == 0 && led2 == 1 && led3 == 1) { | ||
+ | rt(); | ||
+ | } | ||
+ | setMotor(3, 4000); | ||
+ | } | ||
+ | motorsOff(); | ||
+ | } | ||
+ | void back(int distance) { | ||
+ | //dozadu so sledovaním čiari | ||
+ | unsigned int endA = countA + distance; | ||
+ | unsigned int endB = countB + distance; | ||
+ | while (countA <= endA && countB <= endB) { | ||
+ | uint8_t ln = senseLine(); | ||
+ | uint8_t led1 = (ln >> 3) & 1; | ||
+ | uint8_t led2 = (ln >> 2) & 1; | ||
+ | uint8_t ledx = ln & 1; | ||
+ | |||
+ | if (led2 == 1 || ledx == 1) { | ||
+ | led2 = 1; | ||
+ | } | ||
+ | else { | ||
+ | led2 = 0; | ||
+ | } | ||
+ | uint8_t led3 = (ln >> 1) & 1; | ||
+ | if (led1 == 1 && led2 == 1 && led3 == 0) { | ||
+ | //lt | ||
+ | rt(); | ||
+ | } | ||
+ | if (led1 == 0 && led2 == 1 && led3 == 1) { | ||
+ | //rt | ||
+ | lt(); | ||
+ | } | ||
+ | bd(); | ||
+ | } | ||
+ | motorsOff(); | ||
+ | } | ||
+ | void turn(const char s) { | ||
+ | //otáčka na druhú čiaru smerom s | ||
+ | int d = 11, dis = 3; | ||
+ | if (s == 'v') { | ||
+ | dis = dis + 5; | ||
+ | } | ||
+ | if (s == 'v') { | ||
+ | back(d); | ||
+ | } | ||
+ | else { | ||
+ | fd(d); | ||
+ | } | ||
+ | unsigned int endA = countA + dis; | ||
+ | unsigned int endB = countB + dis; | ||
+ | while (countA <= endA && countB <= endB) { | ||
+ | if (s == 'l' || s == 'v') { | ||
+ | lt(); | ||
+ | } | ||
+ | if (s == 'r') { | ||
+ | rt(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void chod(void) { | ||
+ | int i = 0; | ||
+ | while (smer[i] != '\0') { | ||
+ | if (smer[i] == 'D') { | ||
+ | fd(22); | ||
+ | } | ||
+ | if (smer[i] == 'P') { | ||
+ | turn('r'); | ||
+ | } | ||
+ | if (smer[i] == 'L') { | ||
+ | turn('l'); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main(void) { | ||
+ | tatrabotInit(); | ||
+ | //demo(); | ||
+ | chod(); | ||
+ | chprintf(BT, "end"); | ||
+ | motorsOff(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==Video== | ||
+ | <youtube>fOhg62UGtd0</youtube> | ||
+ | |||
+ | ==Záver== | ||
+ | Funkčnosť samotného robota bola primeraná k podmienkam, kedže pri rôznom osvetlení prostredia dráhy robot pri svojom pohybe reagoval na sledovanú čiaru v rôznej intenzite, avšak po opätovnej kalibrácii senzorov sa tento problém minimalizuje. |
Latest revision as of 21:14, 15 February 2016
Zadanie nášho projektu
Cieľom nášho projektu Sokoban bolo naprogramovať robota Tatrabot tak, aby zvládol nájsť správne riešenie jednej zo štyroch zadaných hracích plôch (viď obr. 1) hry Sokoban a následne týmto nájdeným riešením odohrať hru do úspešného konca, pričom hracia plocha pozostávala z navzájom kolmých čiar vytvárajúcich mriežku rôznych tvarov obsahujúcu priesečníky reprezentujúce kocky potrebné k odohratiu hry, teda ich dopraveniu na vopred určené miesta zadanej hracej plochy mriežky.
Náš projekt pozostáva z dvoch fáz, z ktorých prvou fázou je naprogramovať robota tak, aby sa zvládol pohybovať po hracej ploche nami zadanou postupnosťou smerov a druhou fázou je naprogramovať schopnosť robota vygenerovať si postupnosť smerov, ktorej aplikovanie umožňí úspešné ukončenie hry, pričom doposiaľ sa nám podarilo uskutočniť prvú zo spomínaných fáz projektu.
Hardware
Pre náš projekt sme použili robota TATRABOT.
Software
Nasledujúci program zabezpečuje riadenie pohybu robota, teda je obsahom prvej fázy projektu.
main() { #include "tatrabot.h" #include "demo.h" //char smer[256] = "DPDPDVPPPDDVDDPDPDPDVDLDLDDLPLDLPLDLDVPDVLDDVPPPDDVDLDLDVDPLDPDLDVLLLDDDVPPPD"; char smer[255] = "DPDPDVPPP"; //predom zadaná trasa ktorú má robot prejsť v dokončenej verzii bude trasu generovať tiež program void rt(void) { //zabočiť do prava //rightTurn setMotor(2, -4000); setMotor(1, 4000); } void lt(void) { //zabočiť do ľava //leftTurn setMotor(1, -4000); setMotor(2, 4000); } void bd(void) { //cúvanie //backward setMotor(3, -4000); } void fd(int distance) { //dopredu so sledovaním čiari unsigned int endA = countA + distance; unsigned int endB = countB + distance; while (countA <= endA && countB <= endB) { uint8_t ln = senseLine(); uint8_t led1 = (ln >> 3) & 1; uint8_t led2 = (ln >> 2) & 1; uint8_t ledx = ln & 1; if (led2 == 1 || ledx == 1) { led2 = 1; } else { led2 = 0; } uint8_t led3 = (ln >> 1) & 1; if (led1 == 1 && led2 == 1 && led3 == 0) { lt(); } if (led1 == 0 && led2 == 1 && led3 == 1) { rt(); } setMotor(3, 4000); } motorsOff(); } void back(int distance) { //dozadu so sledovaním čiari unsigned int endA = countA + distance; unsigned int endB = countB + distance; while (countA <= endA && countB <= endB) { uint8_t ln = senseLine(); uint8_t led1 = (ln >> 3) & 1; uint8_t led2 = (ln >> 2) & 1; uint8_t ledx = ln & 1; if (led2 == 1 || ledx == 1) { led2 = 1; } else { led2 = 0; } uint8_t led3 = (ln >> 1) & 1; if (led1 == 1 && led2 == 1 && led3 == 0) { //lt rt(); } if (led1 == 0 && led2 == 1 && led3 == 1) { //rt lt(); } bd(); } motorsOff(); } void turn(const char s) { //otáčka na druhú čiaru smerom s int d = 11, dis = 3; if (s == 'v') { dis = dis + 5; } if (s == 'v') { back(d); } else { fd(d); } unsigned int endA = countA + dis; unsigned int endB = countB + dis; while (countA <= endA && countB <= endB) { if (s == 'l' || s == 'v') { lt(); } if (s == 'r') { rt(); } } void chod(void) { int i = 0; while (smer[i] != '\0') { if (smer[i] == 'D') { fd(22); } if (smer[i] == 'P') { turn('r'); } if (smer[i] == 'L') { turn('l'); } } } int main(void) { tatrabotInit(); //demo(); chod(); chprintf(BT, "end"); motorsOff(); } }
Video
Záver
Funkčnosť samotného robota bola primeraná k podmienkam, kedže pri rôznom osvetlení prostredia dráhy robot pri svojom pohybe reagoval na sledovanú čiaru v rôznej intenzite, avšak po opätovnej kalibrácii senzorov sa tento problém minimalizuje.