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) |
====== Laboratorium ====== | ====== Laboratorium ====== |
=== Konstrukcja robota === | === Konstrukcja robota === |
Na laboratorium korzystaliśmy z 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 kwadracie. Robot jechał przez sekundę prosto, następnie skręcał o 90 stopni. Czynność 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 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. |
| |
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 przeszkody, cofnię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 ?** |
| |
ERROR: Arithmetic: `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|}} |
| |
| |