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
pl/dydaktyka/piw/2009/sprawozdania/piw20090422-15e.txt · ostatnio zmienione: 2019/06/27 15:50 (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