====== 1. Wstęp ======
Celem tego ćwiczenia jest sprawdzenie możliwości interfejsu programistycznego PLNXT przy prostych algorytmach. Do dyspozycji mieliśmy komputer, moduł komunikacji Bluetooth oraz już złożonego robota "Agatkę". Niestety, muszę w tym miejscu nadmienić, iż ćwiczenie nie zostało wykonane w normalny, podany w instrukcji sposób, z uwagi na patologiczne zachowanie robota, które zostanie omówione w szczegółach w dalszej części tego sprawozdania.
====== 2. Opis problemów z połączeniem ======
Pierwszym problemem napotkanym podczas wykonywania ćwiczenia było nawiązanie poprawnej łączności z robotem. Co ciekawe, na początku nie mieliśmy do dyspozycji modułu BT na USB, zwanego potocznie "dzyndzlem", co rodzi wątpliwości, czy ktoś na wcześniejszych zajęciach w ogóle bawił się tym robotem. Po otrzymaniu modułu i podłączeniu go do komputera, robot jest teoretycznie wykrywany, jednak nie reaguje na polecenia z konsoli Prologa, tak samo nie pojawiają się odpowiedzi typu "Yes"/"No". Wielokrotne próby parowania robota oraz wykonanie plnxt_stty daje taki sam rezultat, ewentualnie próba wydania jakiegokolwiek polecenia daje komunikat o braku połączenia. Nie pomagało też usuwanie kontaktów z bricka ani jego restartowanie. Dopiero reset całego systemu operacyjnego na komputerze przyniósł oczekiwany efekt. Na tym jednak problemy się nie skończyły.
====== 3. Problemy po uzyskaniu połączenia ======
Tak naprawdę ciekawe rzeczy zaczęły się dziać po nawiązaniu połączenia. Przekonaliśmy się o tym, gdy chcieliśmy przetestować jeden z podanych na wiki przykładów:
:- consult('plnxt.pl').
start :-
nxt_open,
rectangle_loop.
rectangle_loop :-
nxt_go_cm(350,40),
nxt_rotate(350,90),
rectangle_loop.
Przykład ten, jak widać, realizuje ruch po kwadracie o boku 40cm, z szybkościami ruchu i obrotu równymi 350 cm/s i stopni/s, czyli dość szybki. Po skompilowaniu i wywołaniu polecenia start robot zareagował. Reakcja jednak należała do niespodziewanych, albowiem robot zaczął poruszać się do przodu i nie zatrzymywał, dopóki silniki nie zostaną zatrzymane przez jeden z poniższych warunków/stanów:
* Wydanie polecenia nxt_stop,
* Wyłączenie bricka,
* Rozładowanie akumulatorów robota.
Zadziwieni rezultatem postanowiliśmy przetestować przykład z wykorzystaniem wątków:
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(rectangle_loop,_,[detached(true)]).
rectangle_loop :-
nxt_go_cm(350,40),
nxt_rotate(350,90),
rectangle_loop.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Działanie tego algorytmu okazało się jeszcze bardziej zastanawiające. Mianowicie po wpisaniu start, robot, podobnie, jak wcześniej, poruszał się na nieokreślony dystans do przodu. Co jednak ciekawe, wpisanie teraz nxt_stop nie zatrzymało robota, ale spowodowało przejście do następnej akcji w rectangle_loop! Czyli robot, jeżeli przed wpisaniem poruszał się do przodu, po wpisaniu zaczął się obracać wkoło bez końca i vice versa. Zabicie wątków poleceniem stop natomiast działało normalnie.
Zdziwieni takim stanem rzeczy i nakłonieni przez prowadzącego, postanowiliśmy przeanalizować odpowiedzi robota na podstawowe polecenia. Zauważyliśmy, iż część z nich wykonuje się z dość dużym opóźnieniem, od 5 do 10 sekund. Ogółem jednak polecenia związane z odczytem wartości czujników działały poprawnie, tak, jak np. włączenie podświetlenia sensoru światła. Do problematycznych należały nxt_go_cm oraz nxt_rotate. Jak napisano wcześniej, ich wykonanie kończyło się niekończącym się ruchem bądź obrotem robota. Zachowanie nie zależało od parametru określającego odległość czy kąt - przetestowano zarówno bardzo małe, jak i większe wartości i za każdym razem ruch robota musiał być sztucznie przerywany. Reakcja na parametr określający szybkość ruchu była poprawna - przy mniejszych wartościach robot istotnie jechał i obracał się wyraźnie wolniej, jednak tak czy inaczej w sposób nieprzerwany.
W ten sposób wykonanie zadań stało się efektywnie znacznie utrudnione - było w zasadzie konieczne ręczne sterowanie. Postanowiliśmy też sprawdzić wyposażenie robota. Wykorzystaliśmy więc programy Try Me zawarte w Bricku. Tu w zasadzie nie napotkaliśmy się na większe problemy z jednym wyjątkiem. Czujnik dźwięku zdawał się być źle wykalibrowany i reagował wyraźnym ruchem już na ciche rozmowy kolegów siedzących ok. 3 metry obok. Przy skierowaniu polecenia wprost do robota następował gwałtowny zryw kończący się na przebyciu przez robota ok. 0,5 metra. Dość zastanawiające zachowanie zostało uwiecznione na filmiku nagranym przez jednego z członków grupy.
====== 4. Wnioski ======
Jak wspomniano wcześniej, laboratorium nie mogło zostać ukończone w normalny sposób. Jest to tym bardziej zastanawiające, że inne grupy pracujące z tym robotem wykonały zadania w sposób normalny. Ciężko wskazać potencjalne przyczyny takiego zachowania robota, jakie zauważyliśmy. Wygląda na to jednak, że później wszystko wróciło do normy.
====== 5. Materiały ======
[[http://example.com|Film przedstawiający reakcję robota na dźwięki z sali [Do przesłania przez M. Besta] ]]
[[http://example.com|Zdjęcia z lab [Do przesłania przez M. Besta] ]]
Brak materiałów. --- //[[wojnicki@agh.edu.pl|Igor Wojnicki]] 2009/05/20 12:42//