====== 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.