Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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)
Linia 4: Linia 4:
   * 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.
 +
 +
 +
 +
pl/dydaktyka/piw/2010/sprawozdania/piw20100602-17e.1276019903.txt.gz · ostatnio zmienione: 2019/06/27 15:54 (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