Bolek: Lesiak, Stachura, Pracuch
Do naszego ćwiczenia wykorzystaliśmy robota zbudowanego przez poprzednią grupę. Był on zbudowany na bazie Tribota i zaopatrzony w czujniki dźwięku, odległości, nacisku oraz światła.
sprzataj :- nxt_ultrasonic(Value,force), Value < 30, write(Value), nxt_pincer(open), nxt_go_cm(400,20), nxt_go_cm(-400,20), nxt_pincer(close). sprzataj. obrot(0). obrot(X) :- nxt_rotate(400,10), X > 0, Y is X - 10, sprzataj, obrot(Y). start :- nxt_open, obrot(360).
Kod programu z triggerami:
W tej wersji robot po napotkaniu przeszkody otwiera ramiona i jedzie do przodu, natomiast nie jedzie do tyłu - mimo, że komenda jazdy do tyłu jest między komendą „nxt_pincer(open)” a „nxt_go_cm(400,10)”. Przyczyna błędu jest w komendzie: nxt_stop - naszym celem, było to, by zatrzymała komendę obrotu o 360 stopni (nxt_rotate(400,360)) i faktycznie - zatrzymywała, ale oprócz tego miała wpływ również na komendę jazdy do tyłu, tzn. rozkaz nxt_go_cm(-400,10) był anulowany.
check_ultrasonic :- nxt_ultrasonic(Value,force), Value < 25, write(Value).
ruch :- nxt_pincer(open), %%% nxt_go_cm(-400,10), %%% nxt_go_cm(400,10). %%%
ultrasonic :- nxt_stop, %%% ruch.
sprzataj :- nxt_open, trigger_create(_,check_ultrasonic,ultrasonic), nxt_rotate(400,360).
Podsumowując powyższy kod: nxt_stop zatrzymywała komendę, która następowała po niej. Zaczęliśmy przypuszczać, że funkcja „ultrasonic” (zawierająca nxt_stop) zostaje po raz drugi uruchomiona przez trigger, podczas gdy pierwsze działanie „ultrasonic” jeszcze się nie skończyło (przypuszczenia nie udało się sprawdzić, wyjaśnienie poniżej). Podjęliśmy więc próbę jednorazowego uruchomienia trigger'a i ubicia go:
[reszta kodu be zmian]
ultrasonic :- nxt_stop, trigger_killall, %%% ruch.
sprzataj :- nxt_open, trigger_create_noreturn(_,check_ultrasonic,ultrasonic), %%% nxt_rotate(400,360).
Próba ubicia triggera skończyła się błędem:
Warning: [Thread 2] Thread running „trigger_start_noreturn(main, check_ultrasonic, ultrasonic)” died on exception: Arithmetic: `angle/1' is not a function
Próbowaliśmy tez tworzyć triggera jak poprzednio przez trigger_create/3, ale kończyło się to identycznym błędem.
Inne problemy:
ERROR: Arithmetic: `force/0' is not a function ^ Exception: (19) _L3673 is force256 ? Wnioski:** * - trigger_create i trigger_create_noreturn nie działają tak jak powinny * - trigger_killall nie działa * - nxt_stop w funkcji wywoływanej przez triggera nie działa (prawdopodobnie przez to, że sam trigger_create źle działa) * - program bez triggerów działa dobrze === Zmiany === * Można wprowadzić większą ilość przykładowych, sprawdzonych algorytmów o zróżnicowanym poziomie trudności (najlepiej skorzystać z algorytmów napisanych przez studentów, które działają - czyli pewnie te bez triggerów) === Plik z laboratorium === Plik zawierający opisane wyżej algorytmy: nasze-21.zip