|
|
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2009/01/26 10:01] jsi08 |
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09c [2019/06/27 15:50] |
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. | |
| |
**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 === | |
* | |
| |
=== Plik z laboratorium === | |
Plik zawierający opisane wyżej algorytmy: | |
{{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:nasze-21.zip|}} | |
| |
| |