To jest stara wersja strony!


Cel: śledzenie linii

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ą.

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.

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: FIXME

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

FIXME Tomek! Wrzuć plik tutaj i na YT.

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.

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 FIXME wywoływanych w sposób rekurencyjny.

pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-08d.1233061142.txt.gz · ostatnio zmienione: 2019/06/27 15:57 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0