Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2009/01/25 17:50]
jsi08
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2019/06/27 15:50] (aktualna)
Linia 2: Linia 2:
 ====== Laboratorium ====== ====== Laboratorium ======
 === Konstrukcja robota === === Konstrukcja robota ===
-Na laboratorium korzystaliśmy robota, który został zbudowany ​przez poprzednią grupę. ​Pozostawiony robot zawierał wszystko co potrzebowaliśmy, ​więc jakakolwiek modyfikacja nie była potrzebna.+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 === === Zdjęcie robota ===
-{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​20080114irek.jpg?200|}}+{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​foto020.jpg|}}
 === Algorytmy === === Algorytmy ===
-  * Zadaniem robota była jazda po kwadracieRobot jechał przez sekundę prosto, ​następnie skręcał o 90 stopniCzynność tę wykonywał dopóki nie wrócił na miejsce z którego ruszył:+  * Realizowaliśmy algorytm sprzątacza. Pierwsza wersja miała opierać się na triggerachAlgorytm wyglądał następujaco. Robot obracał się dookoła i cały czas badał czy istnieje w odległości 20cm jakaś przeszkodaJeś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.
  
-  kwadrat :- nxt_open, 
-             ​nxt_go_sec(400,​1),​ nxt_turn(400,​120),​ 
-             ​nxt_go_sec(400,​1),​ nxt_turn(400,​120),​ 
-             ​nxt_go_sec(400,​1),​ nxt_turn(400,​120),​ 
-             ​nxt_go_sec(400,​1),​ nxt_turn(400,​120). ​ 
  
-  * Zadaniem robota było dojechanie do przeszkody, cofnięcie się, wykonanie obrotu o 180 stopni. Początkowo robot po wykonaniu obrotu kontynuował jazdę i zatrzymywał się na klaśnięcie,​ jednak gdy wszystkie grupy testowały swoje roboty, inne dźwięki zatrzymywały naszego robota. Z tego powodu fragment kodu, który był za to odpowiedzialny został wykomentowany. 
  
-  ​check_ultrasonic ​:- nxt_ultrasonic(Value,​force),​ +  ​sprzataj ​:-  
-                      Value < 30. +      nxt_ultrasonic(Value,​force),​ 
-  ​check_sound :- nxt_sound(Value,force), +      Value < 30, 
-                 Value > 50. +      write(Value), 
-  ultrasonic :- nxt_stop+      ​nxt_pincer(open)
-                nxt_go_cm(-400,15), +      nxt_go_cm(400,​20), 
-                ​nxt_rotate(400,60), +      ​nxt_go_cm(-400,20), 
-                ​%nxt_go(400), +      ​nxt_pincer(close). 
-                ​%trigger_create(_,​check_sound,​[nxt_stop,​nxt_close]). +           sprzataj. 
-  ​jazda :- nxt_open, +           obrot(0). 
-           nxt_go(400), +  ​obrot(X) ​:- 
-           trigger_create(_,check_ultrasonic,ultrasonic).''​ +      ​nxt_rotate(400,10), 
- +      X > 0, 
-  ​* Zadaniem robota była jazda do przeszkodycofnięcie się, wykonanie obrotu o 90 stopni. Zadanie miało być wykonywanie cyklicznie przez określoną ilość razy. Wystąpił jednak problem, który uniemożliwił implementacje tego algorytmu. Jest on opisany poniżej.+      Y is X - 10, 
 +      ​sprzataj,​ 
 +      ​obrot(Y). 
 +  ​start :-  
 +      ​nxt_open, 
 +      ​obrot(360).
  
 === Problemy === === Problemy ===
-  * Robot pozostawiony przez poprzednią grupę miał odwrotnie podpięte silniki. Zamiast skręcać w prawo, skręcał w lewo. +  ​* Podczas realizacji algorytmu opartego na triggerach występowały błędy. 
-  * Silniki robota, nie wyłączały się jednocześnie. 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:+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 ?​**  ​
  
-  ERRORArithmetic: `force/​0'​ is not a function +**Wnioski:** 
-  ​ Exception: ​(19_L3673 is force//256 ? +  ​* - 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 === === 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)
  
-  * Wprowadzona zmiana, dotycząca korzystania z robotów zbudowanych przez grupy z poprzednich zajęć okazała się trafna. To dzięki niej od razu przystąpiliśmy do programowania robota. 
-  * Można wprowadzić większą ilość przykładowych algorytmów o zróżnicowanym poziomie trudności. 
  
 === Plik z laboratorium === === Plik z laboratorium ===
 Plik zawierający opisane wyżej algorytmy: Plik zawierający opisane wyżej algorytmy:
-{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​20080114irek.pl|}}+{{:​pl:​mindstorms:​studenci:​przedmioty:​jsi:​jsi2008:​nasze-21.zip|}}
  
  
pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-09c.1232902206.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