|
|
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-08d [2009/01/27 17:24] jsi08 |
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-08d [2019/06/27 15:50] |
====== 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ść. | |
<code> | |
?- [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 | |
</code> | |
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 ==== | |
<code prolog> | |
:- 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. | |
</code> | |
Plik z programem: {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008: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. | |
| |
{{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:wideo056.rar|}} | |
| |
W roli głównej Irek jeżdżący po cole. | |
| |
W pozostałych rolach: Plansza, Rafał Gibas, Tomasz Gryzio, Weronika Furmańska, Paweł Grzesiak. | |
| |
Zdjęcia: Tomasz Gryzio. | |
| |
Dialogi: Natura. | |
| |
Plik z rozszerzeniem .3gp - converter do avi dostępny na stronie http://www.boilsoft.com/download.html | |
| |
===== 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 [[http://showmedo.com/|ShowMeDo]], na której możemy obejrzeć przeróżne samouczki z dziedziny programowania. | |
| |