Różnice

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

Odnośnik do tego porównania

pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2009/01/26 10:08]
jsi08
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2019/06/27 15:50]
Linia 1: Linia 1:
-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.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