====== Sprawozdanie 3 ======
* Robot: **Franek**
* Data wykonania: **19.05.2010 godz. 17:00**
* Autorzy: **Agata Krysian, Łukasz Mendakiewicz, Tomasz Skrzypczak**
----
===== Ciąg dalszy =====
Tego dnia do współpracy przyznany został nam robot Franek. Był przygotowany do działania, miał zamontowane potrzebne sensory, co pozwoliło przystąpić do ćwiczeń. Prace rozpoczęliśmy od wykonywania algorytmów z poprzedniego tygodnia...
===== Rozgrzewka =====
Powodami nie wykonania zadań z poprzednich zajęć były problemy z połączeniem się z robotem. Tym razem robot był dla nas bardziej łaskawy, więc bez problemów zaimplementowaliśmy algorytm 1:
:- consult('plnxt.pl').
start :-
write('-- start 0.3 --'),
nxt_light_LED(activate),
gogo.
gogo :-
nxt_go(250),
trigger_create(_, check_light, escape).
check_light :-
nxt_light(V, force),
V < 45.
escape :-
Angle is 150 + random(60),
nxt_rotate(100, Angle, force),
gogo.
% :- start.
Próg wartości oświetlenia dobraliśmy empirycznie.
Efekt był taki jakiego oczekiwaliśmy, co przetestowaliśmy kilkakrotnie, na załączonej macie.
{{:pl:dydaktyka:piw:2010:sprawozdania:20100519_003b.jpg|}}
Algorytm 2 był nieco bardziej rozbudowany, jednak nie oznaczało to dla nas, że był trudniejszy:
:- consult('plnxt.pl').
start :-
write('-- start 0.6 --'),
nxt_light_LED(activate),
gogo.
gogo :-
nxt_go(100),
trigger_create(_, check_light, align),
trigger_create(_, nxt_touch(1, force), wait_free_path).
check_light :-
nxt_light(V, force),
V > 46.
align :-
trigger_killall,
nxt_rotate(100, 3, force),
gogo.
wait_free_path :-
trigger_killall,
nxt_stop,
nxt_play_tone(500,500),
trigger_create(_, nxt_touch(0, force), gogo).
stop :-
trigger_killall,
nxt_stop.
% :- start.
Franek poruszał się po czarnej linii, a gdy napotkał przeszkodę, wydał dźwięk zatrzymując się. Po zwolnieniu blokady robot grzecznie ruszył do przodu tak jak poprzednio.
===== Klask klask =====
Spośród algorytmów jako pierwszy wybraliśmy "Panikarza". Potrzebne sensory Franek już posiadał, więc przystąpiliśmy do napisania algorytmu. Prace robiliśmy etapami, dodając każdorazowo kolejną akcje robota.
:- consult('plnxt.pl').
start :-
write('-- start 0.0 --'),
nxt_goal(franek, my_actions).
my_actions :-
nxt_go(100),
trigger_create(_, clap, panic).
clap :-
nxt_sound(Value,force),
Value > 30,
write('clap!').
panic :-
Angle is 160 + random(40),
nxt_rotate(900, Angle, force),
nxt_go(400).
%dokonczyc...
stop :-
trigger_killall,
nxt_stop.
Franek poruszał się powoli i po każdym klaśnięciu odwracał się, następnie zwiększyliśmy jego prędkość "uciekania". Wyniki uznaliśmy za zadowalające, jednak czas nie pozwolił nam dokończyć całkowicie danego algorytmu.
===== Spostrzeżenia i wnioski =====
* Pomimo poprawnego łączenia się z robotem poprzez bluetooth teoretycznie nie nawiązaliśmy połączenia (kolejne komunikaty konsoli o zajętości zasobu)jednak praktyka okazała się inna - komunikacja działała poprawnie, czym byliśmy miło zaskoczeni :)
* Zdarzało się, że środowisko się zawieszało przy użyciu prostych komend. Na szczęście wystarczało wówczas "zabić" proces konsoli Prologa i uruchomić ją ponownie. Wydaje nam się, że wywołanie tylko raz predykatu nxt_open, a nie za każdym uruchomieniem pary nxt_open / nxt_close rozwiązuje problem.
* Predykat write wywołany w wątku działania robota niestety nie wypisuje od razu na ekran (zapewne buforuje gdzieś wewnętrznie), a szkoda, gdyż na pewno byłoby łatwiej z tym śledzić przebieg programu.