====== Info ======
* Robot: Dyzio
* Skład: Michał Gamrat, Przemysław Brzeziński, Łukasz Różycki
====== Laboratorium ======
Na początku laboratorium przedyskutowaliśmy wspólnie z prowadzącym i pozostałymi grupami problem rozpoznawania koloru czerwonego przy pomocy czujnika światła wyposażonego w czerwoną diodę. Była to główna trudność w realizacji algorytmu "Więzień". Doszliśmy do wniosku, że najlepszym rozwiązaniem byłoby pobieranie wartości z czytnika zarówno przy włączonej, jak i przy wyłączonej diodzie. Niestety, jak wspominaliśmy w poprzednim sprawozdaniu, światło padające przez okno nie było jednorodne, co uniemożliwiało (a na pewno znacząco utrudniało) realizację zadania.
Następnie przystąpiliśmy do realizacji kolejnych zadań: algorytmów "Sprzątacz" oraz "Co przybyło?"
==== Sprzątacz ====
=== Opis ===
Przy pomocy sensora odległości robot sprawdza, czy przeszkoda znajduje się bliżej niż 20cm. Jeśli tak, jedzie 20cm do przodu, po czym wraca 20cm do tyłu. Jeśli przeszkody nie ma / już wypchnął przeszkodę poza obszar, obraca się o 10 stopni. Po wykonaniu pełnego obrotu kończy pracę.
=== Kod ===
start :-
%nxt_open,
main.
main :-
check_distance(370).
%koniec.
check_distance(0) :-
koniec.
check_distance(X) :-
nxt_ultrasonic(Value,force),
Value > 7,
D1 is X - 10,
obracaj(D1).
obracaj(X) :-
nxt_rotate(100,10),
check_distance(X).
check_distance(X) :-
nxt_ultrasonic(Value,force),
Value < 8,
D1 is X - 10,
sprzataj(D1).
sprzataj(X) :-
nxt_go_cm(300, 10),
nxt_go_cm(-300, 10),
check_distance(X).
koniec :-
nxt_play_tone(5000, 500),
finish.
finish :-
nxt_stop.
%nxt_close.
=== Problemy techniczne ===
Zauważyliśmy, że sensor odległości jest niedokładny poniżej 10cm - nie podaje właściwej odległości. Miał także problem ze zmierzeniem odległości do "murku", który był do niego ustawiony pod kątem.
Najpoważniejszy problem z jakim się spotkaliśmy podczas tego laboratorium dotyczył triggerów - jeśli przerywaliśmy obrót przy pomocy triggera, robot nie wykonywał po prawnie komendy 'go' - jedno z kółek się nie obracało, przez co robot zamiast jechać do przodu obracał się wokół nieruchomego kółka. Dlatego też zrealizowaliśmy algorytm iteracyjny, a nie równoległy. Ten sam problem pojawiał się czasem po wykonaniu zadanego obrotu, bez przerywania go przed zakończeniem - jest to widocznie jakiś bug.
==== Co przybylo? ====
=== Opis ===
Rozszerzając kod poprzedniego algorytmu zrealizowaliśmy to zadanie w następujący sposób:
1. robot dokonuje pomiaru odległości
2. zapisuje odległość jako głowę listy do listy
3. wykonuje obrót o 10 stopni
4. wraca do pkt 1, jeśli nie wykonał jeszcze 360 stopni
5. czeka na klaśnięcie
6. sprawdza, czy pomiar czujnika odległości zgadza się z zapamiętanym w liście
7. jeśli nie, podjeżdża do dołożonego obiektu i kończy pracę
8. jeśli tak, wykonuje obrót o 10 stopni
9. jeśli nie wykonał drugiego obrotu o 360 stopni, wraca do pkt 6
10. kończy pracę
=== Kod ===
start :-
%nxt_open,
main.
main :-
check_distance(0,[]).
%koniec.
check_distance(360,L) :-
trigger_create(_,klask,sprawdz(L)).
check_distance(X,L) :-
nxt_ultrasonic(Value,force),
X1 is X + 10,
obracaj(X1,[Value|L]).
klask :-
nxt_sound(Value),
Value > 50.
obracaj(X,L) :-
nxt_rotate(100,10),
check_distance(X,L).
sprawdz(L) :-
nxt_play_tone(5000, 1000),
trigger_killall,
check_distance_2(0,L).
check_distance_2(X,[Head|L]) :-
nxt_ultrasonic(Value,force),
Value = Head,
X1 is X + 10,
obracaj2(X1,L).
obracaj2(X,L) :-
nxt_rotate(-100,10),
check_distance_2(X,L).
check_distance_2(X,[Head|L]) :-
nxt_ultrasonic(Value,force),
Value \= Head,
nxt_go_cm(100,Value),
koniec.
check_distance_2(360,_) :-
koniec.
koniec :-
nxt_play_tone(5000, 500),
finish.
finish :-
nxt_stop.
%nxt_close.
=== Problemy techniczne ===
W testowaniu algorytmu znowu przeszkodził nam bug z blokującym się kółkiem - niestety nie wiem z czego on wynika.
====== Podsumowanie ======
===== Uwagi =====
Stwierdziliśmy, że wykonywanie ćwiczeń byłoby dużo przyjemniejsze, gdyby była dostępna większa powierzchnia - na fragmencie stołu, na którym pracujemy, nie mieści się nawet plansza testowa LEGO MindStorms - brakuje kilku centymetrów.