Różnice

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

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2009/01/21 22:24]
jsi08 utworzono
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 Bolek: Lesiak, Stachura, Pracuch 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 ===
 +{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​foto020.jpg|}}
 +=== 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 force//256 ?​**  ​
 +
 +**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:
 +{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​nasze-21.zip|}}
 +
 +
pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-09c.1232573042.txt.gz · ostatnio zmienione: 2019/06/27 15:57 (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