Cel: śledzenie linii
Robot umieszczony na planszy testowej dojeżdża do grubej czarnej linii i od tego momentu stara się poruszać wzdłuż tej linii. Po wciśnięciu sensora dotyku kończy pracę.
Dodatkowo robot reaguje na dźwięk - zatrzymuje się przy klaśnięciu.
Wykonanie
Robot
Po raz pierwszy mieliśmy do dyspozycji zbudowanego wcześniej robota. Nasz Irek był zbudowany w sposób prosty, na podstawie instrukcji Quick Start.
Irka wyposażyliśmy w czujnik światła, dotyku, dźwięku i ultradźwięku, jednak zrezygnowaliśmy z ostatniego, bo bardziej przeszkadzał, niż pomagał - jazda po linii (po cole ) tymczasowo nie wymagała zabezpieczania się przed ścianą. Czujnik wykorzystywaliśmy sprawdzając, czy robot działa (programem demo2.pl
).
Problemy
Czasami Irek zachowywał się dziwnie. Zatrzymywał się i wydawał z siebie „pykający” odgłos z czujnika ultradźwięku. Przesyłanie poleceń z Prologu nie dawało rezultatów. Pewne błędy widać na demonstracyjnym programie demo2.pl
. Po uruchomieniu programu zobaczyliśmy ostrzeżenie o przepełnieniu stosu przez wątek sprawdzający odległość.
?- [demos/demo2].
% threads compiled into threads 0.00 sec, 8,216 bytes
% nxt_sensomoto compiled into nxt_sensomoto 0.00 sec, 21,744 bytes
% lib/nxt_movement compiled into nxt_movement 0.00 sec, 36,820 bytes
% lib/nxt_actions_serial compiled into nxt_actions_serial 0.01 sec,
33,460 bytes
% ../plnxt compiled 0.01 sec, 72,388 bytes
% demos/demo2 compiled 0.01 sec, 74,576 bytes
Yes
?- start.
Yes
?- Warning: [Thread 4] Thread running "trigger_start(check_distance,
wall, 1)" died on exception: Out of global stack
Action (h for help) ? abort
ERROR: Execution Aborted
% Execution Aborted
?- nxt_close.
No
?- halt.
1 threads wouldn't die
Ostatnia linia powyższego kodu może świadczyć o błędzie w PLNXT. Jeden wątek nie chciał się zamknąć nawet przy zamknięciu interpretera Prologu, działał po ponownym uruchomieniu robota i powodował błędy. Dało się słyszeć charakterystyczne „pykanie” z czujnika odległości, robot nie reagował na żadne bodźce.
Zrestartowanie Irka i praca po ponownym sparowaniu BT przebiegała już bez problemów, o ile nie używaliśmy sensora ultradźwięku. W razie problemów restartowaliśmy NXT i można było działać od nowa.
Nasz program
Mimo ciężkiej walki z błędami, udało nam się zaprogramować algorytm poruszania się po linii.
Kod
:- consult('../plnxt.pl').
jedz_po_cole :-
nxt_go(200),
trigger_create(_,not(check_light),[nxt_stop,nxt_rotate(200,20),jedz_po_cole]).
trigger_create(_,check_touch,[nxt_stop,nxt_close]),
nxt_close.
check_sound :-
nxt_sound(Value,force),
Value > 50.
check_touch :-
nxt_touch(Value,force),
Value < 50.
check_light :-
nxt_light(Value,force),
Value < 28.
start :-
nxt_open,
nxt_go(400),
trigger_create(_,check_sound,[nxt_stop,nxt_close]),
trigger_create(_,check_light,[nxt_stop,jedz_po_cole]).
% nxt_close.
:- start.
Plik z programem: gg_jazda_po_linii.pl
Start
Irek ruszał do przodu wraz z wywołaniem programu z powłoki Prologu.
Działanie
Nasz Irek dojeżdżał do czarnej linii na planszy, po czym poruszał się po linii do przodu do momentu „wyjechania” z linii. Następnie skręcał o pewien kąt w prawo w poszukiwaniu linii i w razie jej napotkania ruszał dalej.
Stop
Ta sekwencja powtarzała się do naciśnięcia czujnika dotyku, który zatrzymywał robota.
W każdej chwili Irek mógł się zatrzymać słysząc jakiś hałas.
Film
Uwagi
Dobranie odpowiednich wartości progowych jest bardzo ważne dla prawidłowego odczytu z sensorów. Robot dla różnych warunków (zmienne oświetlenie, cień, hałas) potrzebuje indywidualnego doboru wspomnianych wartości. Przed spojrzeniem krytycznie na algorytm warto spojrzeń nań z punktu widzenia czujnika - „Nie widzę, bo mi zasłaniasz, a nie dlatego, że źle patrzę”.
Możliwe błędy
Prawdopodobnie popełniliśmy nieco błędów w naszym programie. nxt_close
wywołane może być zbyt często (może to nie szkodzi, ale program brzydko wygląda), na przykład dla instrukcji (klauzula jedz_po_cole
) wywoływanych w sposób rekurencyjny.
Robot, co widać na filmie, „tańczył” czasami podczas zjeżdżania z linii, wykonując piruety i zawroty. Najprawdopodobniej jednak poruszał się za szybko i skręcał bez sprzężenia zwrotnego. W takim wypadku zmniejszenie prędkości i dołożenie nowego wątku powinno naprawić problem.
Uwagi do laboratorium
Niezbędnym będzie poświęcenie którychś laboratoriów (najlepiej tych z oprogramowaniem Lego) na pokazanie nam, jak korzysta się z interfejsów dostępnych dla NXT. Na takie coś dziś jest oczywiście za późno, jednak da się to zrealizować w przyszłych latach. Pomoże to studentom programować zestawy Lego znacznie efektywniej i lepiej wykorzystywać bardziej zaawansowane techniki programowania.
Nie widzę przeszkód, żeby takie spotkanie odbyło się w ramach wykładu z JSI. Pan Profesor chętnie zaprasza na wykład osoby chcące pokazać coś nowego.
Innym na to sposobem będzie przygotowanie „przewodnika po NXT w prologu” dostępnego na aiWiki, zawierającego zrealizowane przykłady, krok po kroku, wraz z filmami opisującymi rezultaty. Za wzór może posłużyć strona ShowMeDo, na której możemy obejrzeć przeróżne samouczki z dziedziny programowania.