Sprawozdanie z laboratorium nr 4
Robot: Agatka
Data wykonania: 02.06.2010 godz. 15:30 (Oficjalnie jesteśmy w grupie o 9:30, ale nie mogliśmy się wtedy zjawić, prowadzący z 15:30 wyraził zgodę, abyśmy zostali na zajęciach.)
Autorzy: Renata Niedziela, Michał Urbańczyk, Artur Glier
Początek
Bez problemów sparowaliśmy robota z komputerem, przetestowaliśmy połączenie kilkoma prostymi poleceniami np. nxt_play_tone(500,2000).
Budowa robota
Zdecydowaliśmy się stworzyć program „Co przybyło”. Mikrofon był już zamontowany na robocie, naszym zadaniem było zamocowanie z przodu czujnika odległości.
Zdziwieni byliśmy dokładnością tego czujnika. Możliwe było całkiem dokładne podawanie odległości od przedmiotu a czujnik wykrywał nawet nieduże obiekty.
Nasz robot:
Program
Chcieliśmy napisać program co przybyło lecz z nieco uproszczonymi zasadami. Wg. opisu program powinien w triggerze sprawdzać odległość obiektu od sensora cały czas podczas płynnego obracania się. Nasze rozwiązanie polegało na sprawdzaniu tylko 4 kierunków - obracaniu się o 90 stopni.
start :-
skret,
nxt_ultrasonic(A1),
skret,
nxt_ultrasonic(A2),
skret,
nxt_ultrasonic(A3),
skret,
nxt_ultrasonic(A4),
trigger_create(Trigger1,klask,[nxt_stop,skret2]).
klask :-
nxt_sound(Sound,force),
Sound > 50.
skret :-
nxt_rotate(100,95).
skret2 :-
nxt_play_tone(500,2000),
skret,
nxt_ultrasonic(B1),
trigger_create(TriggerA,A1 - B1 > 10,[nxt_go_cm(300,B1+10),end]),
skret,
nxt_ultrasonic(B2),
trigger_create(TriggerB,A2 - B2 > 10,[nxt_go_cm(300,B1+10),end]),
skret,
nxt_ultrasonic(B3),
trigger_create(TriggerC,A3 - B3 > 10,[nxt_go_cm(300,B1+10),end]),
skret,
nxt_ultrasonic(B4),
trigger_create(TriggerD,A4 - B4 > 10,[nxt_go_cm(300,B1+10),end]),
end.
end :-
nxt_play_tone(500,2000),
trigger_kilall.
Zdajemy sobie sprawę, że to rozwiązanie jest trywialne. Nie mieliśmy pomysłu jak sprawdzać w triggerze zmianę odległości i jak zapisać dane z pierwszego obrotu. Padły pomysły o zapisywaniu odległości próbkując co 1 stopień. Wystarczyłoby do naszego aktualnego programu dopisać tablicę z danymi, oraz obracać robota o 1 stopień, a nie o 90. Pojawił się problem z obrotem o 1 stopień. Okazało się, że obrót 360 razy o 1 stopień to nie obrót o 360 stopni - silniki krokowe w lego nie są tak dokładne jak sądziliśmy. Często robot nawet nie ruszał się. Drugim rozwiązaniem był ciągły obrót i sprawdzanie z pewnym próbkowaniem odległości, ale tego nie umieliśmy zaprogramować. Tutaj trzeba by się zagłębić w programowanie wielowątkowe na co nie było czasu.
Wnioski i spostrzeżenia
Często zdarzało się, że po wykonaniu błędnego programu środowisko xpce zawieszało się. Robot przestawał reagować na polecenia, nawet po zabiciu xpce i odpaleniu ponownie. Rozwiązaniem na ten problem okazało się wyłączenie i włączenie robota, ponowne połączenie przez bluetooth oraz wywołanie plnxt_stty.
Uwagi do laboratorium
Przydały by się jakieś przykłady nieco bardziej zaawansowanych programów napisanych w prologu pod LEGO MindStorms.