====== Laboratorium - proste algorytmy w PLNXT ====== 22.04.2009, godz. 9.30\\ grupa w składzie: Joanna Koza, Tomasz Michalski, Kamil Mucha\\ Informatyka Stosowana IV 2008/2009\\ KA, WEAIiE, AGH\\ \\ robot GIENEK\\ ===== Robot ===== załączone sensory światła (koloru), dźwięku (mikrofon), dotyku i odległości\\ {{:pl:dydaktyka:piw2009:sprawozdania:akt2-gienek1.jpg|}} ===== Konfiguracja stanowiska do pracy z NXT ===== ==== Połączenie robota oraz pobranie PLNXT ==== Bez problemów. ==== Ustawienie parametrów portu i sparowanie ==== //./bin/plnxt_stty gienek// - brak konieczności parowania ==== Konfiguracja PLNXT ==== **plnxt.pl**\\ % Specify the device files. nxt_serial_device(write,'/dev/rfcomm7'). nxt_serial_device(read,'/dev/rfcomm7'). ==== Sprawdzenie konfiguracji ==== Konfiguracja działa poprawnie. ===== Implementacja algorytmu ===== Uwaga! Wątki PLNXT nie działały u nas prawidłowo - dotyczy to najprawdopodobniej poleceniatrigger_killall Po pierwszym jego wywołaniu (np. używając predykat "stop"), kolejne stworzenie wątku poleceniem thread_create (np. używając predykat "start") sprawia, że wątku nie można już "zabić". Chcąc więc przerwać działanie programu, należy opuścić powłokę PL i uruchomić ją ponownie - jest to niewygodne i czasochłonne. Opisana sytuacja została uchwycona na poniższym zrzucie ekranu:\\ {{:pl:dydaktyka:piw2009:sprawozdania:akt2-error.jpg|}} ==== Piłka ==== Zadanie to chcieliśmy wykonać na końcu, ale robot nie był wyposażony w szczypce i nie wystarczyło czasu na ich podłączenie. ==== Omijanie przeszkód ==== Algorytm nie został przetestowany. start :- nxt_open, thread_create(go_slowly,_,[detached(true)]). :- consult('plnxt.pl'), start. go_slowly :- nxt_stop, nxt_go(150), trigger_create(10, clap, stop), trigger_create(_, obstacle, make_turn). make_turn :- nxt_stop, trigger_kill(10), nxt_go(-200), sleep(1), nxt_stop, nxt_rotate(350, 90 + random(90)), sleep(2), go_slowly. clap :- nxt_sound(Value,force), Value > 50. obstacle :- nxt_ultrasonic(D,force), D < 20. stop :- trigger_killall, nxt_stop, nxt_close. ==== Panikarz ==== start :- nxt_open, thread_create(go_slowly,_,[detached(true)]), trigger_create(_,touch,stop). :- consult('plnxt.pl'), start. go_slowly :- nxt_stop, nxt_go(110), trigger_create(_,clap,panic). panic :- nxt_stop, nxt_rotate(350,-180 + random(360)), nxt_go(500), sleep(2), go_slowly. % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość clap :- nxt_sound(Value,force), Value > 50. touch :- nxt_touch(V, force), V = 1. stop :- trigger_killall, nxt_stop, nxt_close. filmik do pobrania:\\ [[http://student.agh.edu.pl/~kmucha/piw/akt2-TPP.3GP]] ===== Uwagi i wnioski ===== * ruchy robota w odpowiedzi na polecenia NXT_MOVEMENT nie są w 100% dokładne. Przykładowo polecenie nxt_rotate(350,90) obraca robota o ok. 85 stopni, dlatego nie da się zrealizować idealnego ruchu po kwadracie (jeden z przykładów). Wynikać to może zarówno ze specyfiki samego PLNXT (niedokładne parametry obrotu silników w reakcji na polecenia), jak i z ograniczeń konstrukcyjnych (poślizg opon i/lub zły rozstaw kół). * API PLNXT jest nieintuicyjne - np. funkcja //nxt_go_sec/2// zdaje się być funkcją blokującą wykonanie programu na zadaną ilość sekund, ale tak nie jest. ===== Załączniki ===== {{:pl:dydaktyka:piw2009:sprawozdania:lab2_koza_michalski_mucha.zip|Kody źródłowe}}