====== 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. czerwone :- nxt_light(Value,force), Value >35, Value < 45, sleep(1), %zeby wykryło poprawnie czerw nxt_light(Value2,force), Value2 >35, Value2 < 45. %przy 35 wykrywa czarną linie %przy 45 wykrywa czerwone Nie widząc innego sposobu na rozwiązanie problemu, postanowiliśmy spróbować zrobić odbijanie się od lini. Niestety z tym również mieliśmy kłopoty. Na początku nie działały nam inne komendy niż 'stop' w funkcji wyzwalanej przez trigger, by po kilku próbach poradzenia sobie z tym przestał działać zupełnie trigger wyzwalający się po najechaniu na czarną linię. wait_for_touch :- %nxt_rotate(500,500), nxt_stop, %nxt_go(-20,30), %go_on_buddy. Cały kod: :- consult('plnxt.pl'). start :- nxt_open, thread_create(go_on_buddy,_,[detached(true)]). go_on_buddy :- nxt_light_LED(activate), nxt_go(200), sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa. trigger_create(_,czarne,wait_for_touch). wait_for_touch :- %nxt_rotate(500,500), nxt_stop, %nxt_go(-20,30), %go_on_buddy. %trigger_create(_,czarne,go_on_buddy). czarne :- nxt_light(Value,force), Value < 35. stop :- trigger_killall, nxt_stop, nxt_close. ====== Uwagi do zajęć ====== - Często musieliśmy restartowaćplnxt, ze względu na mało nam mówiący błąd: 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|}}