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.

pl/dydaktyka/piw/2010/sprawozdania/piw20100602-17e.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0