====== Wstęp ======
Celem laboratorium była praca z programami działającymi na kilku równoległych wątkach. Mieliśmy do wykonania zadania które wymagały użycia nowo nabytej wiedzy.
====== Przygotowanie stanowiska, analiza przykładów ======
Stanowisko zastałem przygotowane do pracy, w robocie zmieniłem układ sensorów i wymieniłem kable tak żeby nie plątały się z kołami robota.
Po przeczytaniu "Program + komendy z konsoli" dowiedziałem się jak uruchomić program niejako "w tle" uwalniając konsolę. Dzięki temu mogłem już zatrzymywać robota z konsoli (czego brakowało mi na poprzednim laboratorium).
Przeanalizowałem "Przykład algorytmu", problem sprawiło dobranie dobrego progu głośności - tak aby robot reagował na klaśnięcie. Wartość ta była zupełnie inna niż ta podana w przykładzie (35 zamiast 15).
====== Wykonanie zadań ======
W związku z tym, że mój robot nie był wyposażony w szczypce, nie podjąłem się zadania z piłką. Wybrałem zadanie 'panikarz'. Poniżej kod mojego rozwiązania:
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(150),
sleep(1),
trigger_create(_,clap,run_buddy_run).
run_buddy_run :-
nxt_stop,
random(0,180,Rand),
Angle is 60+Rand,
nxt_rotate(350,Angle),
nxt_go_cm(400,20),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 35.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
To zupełnie podstawowe rozwiązanie, działa ono poprawnie. Po skończeniu tego zadania chciałem dopisać do tego kodu modyfikację tak aby robot po zderzeniu z przeszkodą (czujnik nacisku) obracał się o 180 stopni i przechodził do podstawowego trybu (jazda). Chodziło o to żeby w trybie 'panika' nie próbował przejechać przez ścianę, tylko odwracał się i w normalnym już trybie jazdy kontynuował. Niestety pogubiłem się najwyraźniej w wątkach i kod nie działał poprawnie - po kilku poprawnych reakcjach zaczynał wariować. Kody wyglądał następująco:
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(first_run,_,[detached(true)]).
first_run :-
trigger_create(_,clap,run_buddy_run),
trigger_create(_,press,relax_buddy),
go_on_buddy.
go_on_buddy :-
nxt_go(150),
sleep(1).
run_buddy_run :-
nxt_stop,
random(0,180,Rand),
Angle is 60+Rand,
nxt_rotate(350,Angle),
nxt_go_cm(400,20),
trigger_create(_,clap,run_buddy_run),
go_on_buddy.
relax_buddy :-
nxt_stop,
nxt_play_tone(1000,1000),nxt_play_tone(1500,1000),nxt_play_tone(2000,1000),
nxt_rotate(200,180),
trigger_create(_,press,relax_buddy),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 35.
press :-
nxt_touch(Value,force),
Value > 0.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
====== Wnioski, uwagi ======
* fakt, że mogłem zatrzymać program działający na robocie z konsoli niestety nie oznaczał, że konsola i robot zachowywały się poprawnie po takiej operacji, tak jak ostatnio musiałem restartować zarówno środowisko prologa jak i samego robota po każdym niemal wgraniu programu
* nie wiem czy jest to możliwe, ale fajnie by było gdyby robot mógł wrócić jakieś informacje na konsolę - bez tego debug jest fatalny, pozostaje grać sobie dźwięki żeby wiedzieć w którym miejscu programu jest robot
* dane zwrotne na konsolę pomogły by też dobrać próg głośności szybciej, aczkolwiek właśnie sobie przypomniałem, że poziom głośności można sprawdzić bezpośrednio na wyświetlaczu robota w trybie testowania sensorów