Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:piw:2010:sprawozdania:piw20100602-17e [2010/06/08 19:58] piw10 utworzono |
pl:dydaktyka:piw:2010:sprawozdania:piw20100602-17e [2019/06/27 15:50] (aktualna) |
* Robot: Dyzio | * Robot: Dyzio |
* Skład: Michał Gamrat, Przemysław Brzeziński, Łukasz Różycki | * 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 === |
| |
| <code prolog> |
| |
| 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. |
| |
| |
| </code> |
| |
| === 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 === |
| |
| <code prolog> |
| |
| 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. |
| |
| </code> |
| |
| === 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. |
| |
| |
| |
| |