Po przetestowaniu działania przykładów zamieszczonych na stronie laboratorium, udało nam się zaimplementować na zajęciach trzy algorytmy:
Z użyciem planszy testowej. Robot umieszczony na planszy testowej w obszarze start łapie piłkę znajdującą się w czerwonym obszarze przed nim i przemieszcza ją poza obszar zamknięty wewnątrz czarnej linii.
Kod pilka.pl
:
:- consult('plnxt.pl'). start :- nxt_open, thread_create(stroll,_,[detached(true)]). stroll :- nxt_go(200), % trigger_create(_,find_ball,go_with_ball). trigger_create(_,border,stop). go_with_ball :- Value is 90 + random(180), nxt_stop, nxt_rotate(300, Value), nxt_go(300), trigger_create(_,border,stop). border :- nxt_light(Value,force), Value < 15. find_ball :- nxt_light(Value,force), Value < 23. stop :- trigger_killall, nxt_stop, nxt_close.
Robot przemieszcza się do przodu. Po napotkaniu przeszkody zatrzymuje się i próbuje ją ominąć. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu.
Kod omijanie.pl
:
:- consult('plnxt.pl'). start :- nxt_open, thread_create(stroll,_,[detached(true)]). stroll :- nxt_go(200), sleep(1), trigger_create(_,obstacle,go_round). trigger_create(_,clap,stop). go_round :- Length is 20, Length2 is Length * 2, nxt_stop, nxt_rotate(300, -90), nxt_go_cm(250,Length), nxt_rotate(300, 90), nxt_go_cm(250,Length2), nxt_rotate(300, 90), nxt_go_cm(250,Length), nxt_rotate(300, -90), stroll. obstacle :- nxt_ultrasonic(Distance,force), Distance < 20. clap :- nxt_sound(Value,force), Value > 40. stop :- trigger_killall, nxt_stop, nxt_close.
Robot przemieszcza się powoli. Po klaśnięciu zmienia kierunek i szybko ucieka przez jakiś czas (wtedy nie jest podatny na klaśnięcie), po czym uspokaja się i znowu jedzie powoli. Zatrzymuje się i zamyka połączenie po wciśnięciu sensora dotyku.
Kod panikarz.pl
:
:- consult(plnxt.pl). start :- nxt_open, thread_create(stroll,_,[detached(true)]), trigger_create(_,pat,stop). stroll :- nxt_go(200), sleep(1), trigger_create(_,clap,run_away). run_away :- Value is 90 + random(180), nxt_stop, nxt_rotate(400, Value), nxt_go_cm(500,20), stroll. clap :- nxt_sound(Value,force), Value > 40. pat :- nxt_touch(Value, force), Value=:=1. stop :- trigger_killall, nxt_stop, nxt_close.
Henio w stanie początkowym, wykonujący algorytm panikarz:
Henio po „tuningu” - dodany przedni zderzak i „zęby” - przygotowujący się do ominięcia przeszkody:
Henio z dodanymi szczypcami, przechwytujący piłkę podczas wykonywania algorytmu piłka.
Filmiki w formacie .mp4 ukazujące Henia wykonującego kolejne algorytmy:
nxt_go
, nxt_rotate
etc.). Problem ten zniknął po restarcie robota. nxt_light(Value).
udało nam się ustalić, że na białym polu wartość natężenia światła wynosiła 24, na czerwonym 22, a na czarnym 10. Niestety, robot nie zawsze „zauważał”, że znalazł się już na polu czerwonym (czyli w praktyce przechwycił już piłkę).xpce
po każdym wykonaniu programu. Pomimo pewnych problemów, programowanie w środowisku plnxt jest łatwe i dość przyjemne. Pozwala na komunikację użytkownika z robotem jak i również projektowanie nieco bardziej skomplikowanych zachowań robota przy użyciu prostych poleceń.
Algorytm omijanie przeszkód mógłby być bardzo efektywny, gdyby robot posiadał dwa sensory odległości: jeden z przodu i jeden z boku. Wtedy przy zastosowaniu pewnej synchronizacji danych wejściowych możnaby zmusić robota, aby omijał przeszkody, poruszając się wzdłuż ich krawędzi. Efekt ten można osiągnąć również przy użyciu jednego sensora odległości, zmuszałoby to jednak robota do ciągłego obracania się i sprawdzania, czy przeszkoda nadal znajduje się przed nim.