Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:piw:2010:sprawozdania:piw20100602-17e [2010/06/08 20:05]
piw10
pl:dydaktyka:piw:2010:sprawozdania:piw20100602-17e [2019/06/27 15:50] (aktualna)
Linia 14: Linia 14:
  
 === Opis === === 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 === === Kod ===
  
 <code prolog> <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>​ </​code>​
  
 === Problemy techniczne === === 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? ==== ==== Co przybylo? ====
  
 === Opis === === 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 === === Kod ===
  
 <code prolog> <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>​ </​code>​
  
 === Problemy techniczne === === Problemy techniczne ===
 +W testowaniu algorytmu znowu przeszkodził nam bug z blokującym się kółkiem - niestety nie wiem z czego on wynika.
  
 ====== Podsumowanie ====== ====== Podsumowanie ======
  
-W tym laboratorium zapoznaliśmy się z mechanizmem wyzwalaczy (trigger)co umożliwiło nam wykonanie bardziej złożonych programów. Dzięki temu mogliśmy zaprojektować bardziej skomplikowane zachowanie robota+===== Uwagi ===== 
 + 
 +Stwierdziliśmy, że wykonywanie ćwiczeń byłoby duż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.1276020351.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