Wstęp
Celem laboratorium było poznanie możliwości interfejsu programistycznego PLNXT poprzez stworzenie prostych algorytmów sterujących zachowaniem robota.
Stanowisko
Na stanowisku czekał na nas złożony robot Henio:
Problemy:
Podczas laboratorium ponownie napotkaliśmy problemy związane z komunikacją Czesława z komputerem.
Aby z powrotem odzyskać połączenia po jednokrotnym uruchomieniu algorytmu niezbędny był restart powłoki SWIPL.
Przebieg laboratorium
W pierwszym etapie przetestowaliśmy z powodzeniem programy umieszczone w instrukcji do laboratorium:
Następnie na podstawie podanego szablonu programu opracowaliśmy wykonaliśmy następujące zadania:
Panikarz
Lekko zmodyfikowany względem instrukcji o dodatkowe paniczne ruchy.
%
% Robot porusza z małą prędkością do przodu. Po zarejestrowaniu klaśnięcia
% (lub innego odpowiednio głośnego dźwięku) robot w 2 cyklach odtwarza dźwięk,
% obraca się o losowy kąt i jedzie do przodu z większą losową prędkością.
% Po tych dwóch cyklach panicznego zachowania powraca ponownie do powolnego
% poruszania się do przodu.
%
% PLNXT - API w języku Prolog dla LEGO Mindstorms NXT
:- 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 :-
Rotate is 270 + random(180),
Rotate2 is 270 + random(180),
Speed is 500 + random(200),
Speed2 is 400 + random(200),
nxt_stop,
nxt_play_tone(Speed,5*Speed),
nxt_rotate(Speed, Rotate),
nxt_go_cm(Speed,20),
nxt_play_tone(Speed,5*Speed2),
nxt_rotate(Speed, Rotate2),
nxt_go_cm(Speed2,30),
stroll.
clap :-
nxt_sound(Value,force),
Value > 40.
pat :-
nxt_touch(Value, force),
Value=:=1.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Omijanie przeszkód
%
% Zadanie 2:
% Robot porusza z małą prędkością do przodu. Po wykryciu przeszkody w podanej
% odległości omija ją wykonując sekwencję ruchów gwarantującą poruszanie się po
% trasie zgodnej z przedstawionym poniżej schematem (R-robot, PP-przeszkoda).
% ______
% | |
% R-| PP |->
%
% PLNXT - API w języku Prolog dla LEGO Mindstorms NXT
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(stroll,_,[detached(true)]).
stroll :-
nxt_go(200),
sleep(1),
trigger_create(_,obstacle,roadblock).
roadblock :-
nxt_stop,
passround,
stroll.
passround :-
Length is 20,
Length2 is Length * 2,
nxt_rotate(300, -90),
nxt_go_cm(250,25),
nxt_rotate(300, 90),
nxt_go_cm(250,50),
nxt_rotate(300, 90),
nxt_go_cm(250,25),
nxt_rotate(300, -90),
stroll.
obstacle :-
nxt_ultrasonic(Distance,force),
Distance < 20.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Spostrzeżenia, napotkane problemy, wnioski
Często przy sekwencji większej ilości ruchów (np.: przód, obrót, tył, obrót) robot zachowywał się nieprzewidywalne i wykonywał jedynie niektóre ruchy lub z zupełnie innymi parametrami niż podano.
Odnośnie poprzedniego punktu przy sekwencyjnym wykonywaniu wielu ruchów parametry (prędkości, kąty obrotu, długość zadanej drogi w cm) podane w kodzie źródłowym nie odpowiadały temu co wykonywał robot.
Załączniki
Zdjęcia
Podczas testowania zaimplementowanych zadań wykonaliśmy następujące zdjęcia Henia.
Programy
Sprawozdanie opracowane przez:
Jacka Dymczaka
Piotra Kanię
Mateusza Urbanika