Bolek: Lesiak, Stachura, Pracuch

Laboratorium

Konstrukcja robota

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.

Zdjęcie robota

Algorytmy

  • Realizowaliśmy algorytm sprzątacza. Pierwsza wersja miała opierać się na triggerach. Algorytm wyglądał następujaco. Robot obracał się dookoła i cały czas badał czy istnieje w odległości 20cm jakaś przeszkoda. Jeśli tak, zatrzymywał obrót i przystępował do wypchnięcia przeszkody poza obszar sprzątania po czym wracał na swoją pozycje i kontynuował obrót do 360 stopni.
  • Podobnie jak wyżej, z tym że algorytm bez triggerów.
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).

Problemy

  • Podczas realizacji algorytmu opartego na triggerach występowały błędy.

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:

  • Robot pozostawiony przez poprzednią grupę miał odwrotnie podpięte silniki. Zamiast skręcać w prawo, skręcał w lewo.
  • Silniki robota, nie wyłączały się jednocześnie przez komendę nxt_stop. Robot zamiast zatrzymywać równocześnie koła, najpierw zatrzymywał jedno, a dopiero po chwili drugie.
  • Użycie funkcji trigger_create więcej niż jeden raz powodowało zwrócenie błędu. Po jego otrzymaniu dalsza komunikacja z robotem była niemożliwa. Konieczne było zrestartowanie robota oraz ponowne uruchomienie prologa. Wyświetlany był błąd:

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

pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-09c.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