Sprawozdanie nr 2

Skład zespołu:

  • Sebastian Bełczyk
  • Michał Czaicki
  • Michał Szylar

Budowa robota

Na zajęciach posługiwaliśmy się robotami wcześniej skonstruowanymi. Najprawdopodobniej nasze uwagi zawarte w poprzednim sprawozdaniu przyniosły pozytywny skutek.

Przy realizacji następującego kodu:

:- consult('../plnxt.pl').
 
start :-
	nxt_open,
	thread_create(go_on_buddy,_,[detached(true)]).
 
go_on_buddy :-
	nxt_go(200),
 sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
	trigger_create(_,clap,wait_a_second_buddy).
 
wait_a_second_buddy :-
	nxt_stop,
 sleep(1),
	trigger_create(_,clap,go_on_buddy).
 
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
	nxt_sound(Value,force),
	Value > 15.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

po wpisaniu stop otrzymywaliśmy błąd:

?- stop.
Warning: [Thread 3] Thread running "trigger_start(nxt_is_stopped, thread_send_message(2, resume), 1)" died due to failure
 
 
Yes
?- Warning: [Thread 3] Thread running "trigger_start(nxt_is_stopped, thread_send_message(2, resume), 1)" died due to failure
 
Action (h for help) ? 

który sprawiał że nie było możliwe ponowne uruchomienie programu. Jedynym rozwiązaniem było ponowne uruchomienie swipl.

Następnie zajęliśmy się przygotowaniem rozwiązań zadań.

Rozwiązanie Zadań laboratoryjnych

Piłka

Z użyciem planszy testowej. Wymagane sensory: dotyku, światła. Robot umieszczony na planszy testowej w obszarze start łapie piłkę znajdującą się w czerwonym obszarze przed nim i przemieszcza ją poza obszar zamknięty wewnątrz czarnej linii.

Rozwiązanie:

robot dotyka piłki i się zatrzymuje - tym samym piłka zostaje wypchnięta za koło

:- consult('plnxt.pl').
 
start :-
    nxt_open,
    thread_create(go_on_buddy,_,[
detached(true)]).
 
go_on_buddy :-
    nxt_go(200),
    sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
    trigger_create(_,clap,wait_for_touch).
 
wait_for_touch :-
    nxt_stop,
    sleep(1).
    %trigger_create(_,clap,go_on_buddy).
 
    % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
    nxt_touch(Value,force),
    Value > 0.
 
stop :-
    trigger_killall,
    nxt_stop,
    nxt_close.

Uwagi:

Nasz algorytm powoduje że robot przy zetknięciu z kulką zatrzymuje się, a jego energia kinetyczne zostaje przekazana piłce i tym samym zostaje ona wypchnięta poza czarną linię.

Rozwiązanie 2:

:- consult('plnxt.pl').
 
start :-
    nxt_open,
    thread_create(go_on_buddy,_,[
detached(true)]).
 
go_on_buddy :-
    nxt_go(200),
    sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
    trigger_create(_,clap,wait_for_touch).
 
wait_for_touch :-
    nxt_stop,
    sleep(1).
    %trigger_create(_,clap,go_on_buddy).
 
    % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
    nxt_light(Value,force),
    Value < 35.
 
stop :-
    trigger_killall,
    nxt_stop,
    nxt_close.

W tym przypadku robot wypycha piłkę za czarną linię (tutaj nastąpiła modyfikacjia konstrukcji robota). I zatrzymuje się za linią.

Dopiero pod koniec laboratoriów dowiedzieliśmy się że zamysłem autora zadania było uchwycenie piłki „szczypcami”. Robot którym dysponowaliśmy na początku laboratoriów wymagałby rekonstrukcji, co znacząco wydłużyłoby czas realizacji zadania. Dodatkowo nie każdy z nas w dzieciństwie dysponował klockami Lego Technic - więc realizacja robota z dźwignią dla czujnika dotyku i szczypiec mogłaby niektórym zająć nawet całe zajęcia, nie pozostawiając czasu na realizację algorytmu.

Oto film prezentujący robota w „Akcji”: Robot w Akcji

Omijanie przeszkód

Wymagane sensory: odległości, dźwięku. Robot przemieszcza się do przodu. Po napotkaniu przeszkody zatrzymuje się i próbuje ją ominąć. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu.

Rozwiązanie:

:- consult('plnxt.pl').
 
start :-
    nxt_open,
    thread_create(go_on_buddy,_,[detached(true)]).
 
go_on_buddy :-
 
    nxt_go(200),
    sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
    trigger_create(_,clap,wait_for_touch).
 
wait_for_touch :-
    nxt_stop,
    sleep(1).
    %trigger_create(_,clap,go_on_buddy).
 
    % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
 
    nxt_ultrasonic(Value,force),
    Value < 10.
 
stop :-
    trigger_killall,
    nxt_stop,
    nxt_close.

niezależnie od wartości Value nie udało nam się ustawić takiej wartości by poprawnie wykryć przeszkodę. W konsultacji z prowadzącą doszliśmy do wniosku że czujnik ultrasoniczny mógł być uszkodzony.

Uważamy że na laboratoriach było zbyt mało czasu by zrealizować wszystkie 3 zadania.

Uwagi do zajęć

  1. Błąd otrzymywany po wpisaniu komendy stop w programie demonstracyjnym znacznie wydłuża i utrudnia przeprowadzenie zadań przygotowanych na laboratorium
  2. W zadaniu 1 nie jest powiedziane, że należy przebudować robota - konstukcja wymagana do poprawnej realizacji zadania jest dość złożona
  3. Najprawdopodobniej w naszym zestawie LEGO czujnik ultrasoniczny jest uszkodzony/rozregulowany
  4. Czas laboratorium jest zbyt krótki na realizację wszystkich zadań.
  5. Bardzo podoba nam się to, że przed laboratoriami roboty były już gotowe - skróciło to czas realizacji zadań.

Pliki Źródłowe

Sprawozdanie nr 3

Skład zespołu:

  • Sebastian Bełczyk
  • Michał Czaicki
  • Michał Szylar

Budowa robota

Na zajęciach posługiwaliśmy się robotami wcześniej skonstruowanymi.

Rozwiązanie Zadań laboratoryjnych

Więźień

Z użyciem planszy testowej. Wymagane sensory: światło. Robot zaczyna działanie wewnątrz obszaru zaznaczonego grubą czarną linią na planszy testowej. Chce się z tego obszaru wydostać, ale nie może zrobić tego (nie wolno mu przekroczyć czarnej linii), dopóki nie znajdzie „klucza” - czerwonego obszaru symbolizującego piłkę. Po najechaniu na „klucz” sygnalizuje to dźwiękiem i ucieka z obszaru wewnątrz czarnej linii. Po wydostaniu się sygnalizuje ten fakt dźwiękiem i kończy pracę.

Rozwiązanie:

Pierwszym problemem było znalezienie odpowiednich progów natężenia światła, które nie zatrzymywałyby robota na cieniu rzucanym przez niego, zatrzymywały na czerwonym polu i rozróżniały je od pola czarnego. Udało nam się jednak dość szybko znaleźć odpowiednią wartość maksymalną (45) i minimalną (35 potrzebna do odróżnienia czerni od czerwieni).

Od razu jednak napotkaliśmy inny problem. Trigger mający odnaleźć czerwoną linię, sprawdzający czy wartość światła znajduje się w przedziale <35,45>, był również wyzwalany przez czarną linię. Działo się to z bardzo prostego powodu, gdy robot najeżdżał na czarną linię, wartość światła zmniejszała się stopniowo, przechodząc oczywiście przez nasz próg. Testowaliśmy rozwiązanie wykorzystujące sleep, po to aby po pierwszym teście, wykonać następny upewniający, że linia jest czerwona.

Tu wstawcie kod

Uwagi do zajęć

  1. Często musieliśmy restartować plnxt, ze względu na mało nam mówiący błąd:
?- stop.
Warning: [Thread 5] Thread running "trigger_start(nxt_is_stopped, thread_send_message(4, resume), 1)" died due to failure

Pliki Źródłowe

{{:pl:dydaktyka:piw2009:sprawozdania:pl:dydaktyka:piw2009:sprawozdania:20090422.zip|}

pl/dydaktyka/piw/2009/sprawozdania/piw20090422-08a.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