Najważniejsze zmiany (Sep 8)

Sterowanie wieloma robotami

W pliku konfiguracyjnym plnxt.pl należy zdefiniować używane roboty, np.:

nxt_robot_definition(henio,'/dev/rfcomm8',bt,on,17.5,11,'C','B','A',false,'S1','S2','S3','S4').
nxt_robot_definition(bolek,'/dev/rfcomm2',bt,on,17.5,11,'C','B','A',false,'S1','S2','S3','S4').

Następnie w programie można zadać robotowi o ustalonym aliasie jakiś cel wykonywany w osobnym wątku, np.

nxt_goal(bolek,start_program).

Każdy wątek jest przypisany do konkretnego robota. nxt_goal/2 i nxt_goal/3 to jedyny sposób na utworzenie wątku, który może komunikować się z robotem. thread_create odpada.

Poniżej przykład programu sterującego dwoma robotami. Nie jest przetestowany z racji braku drugiego robota, ale jest wysokie prawdopodobieństwo, że powinien działać. W razie czego proszę o raport. Henio i Bolek zaczynają się poruszać. W momencie napotkania przeszkody przez Henia zatrzymują się oba roboty.

Przykład:

start :-
	nxt_robot(henio,go_to_a_wall),
	nxt_robot(bolek,go_bolek).
 
go_bolek :-
	nxt_open,
	nxt_go(300).
 
stop_bolek :-
	nxt_stop,
	nxt_close.
 
check_distance :-
	nxt_ultrasonic(Value,force),
	Value < 15.
 
wall :-
	nxt_stop,
	nxt_robot(bolek,stop_bolek),
	nxt_close.
 
go_to_a_wall :-
	nxt_open,
	trigger_create(_,check_distance,wall),
	nxt_go(300).

Muszę się zastanowić jeszcze, na ile potrzebna i wykonalna jest możliwość przerywania działania wątków. Załóżmy, że Bolek nie tylko by poruszał się do przodu, ale wykonywałby coś bardziej złożonego. Wtedy samo jego zatrzymanie nie wystarczyłoby, konieczna byłaby możliwość zatrzymania wszystkich jego wątków. Wydaje się to i wykonalne i potrzebne.

Listowanie wątków

Wątki z opisem można wyświetlić przy użyciu predykatu nxt_threads/0. Własne wątki dla robotów można oznaczać swoim opisem. Z opisu wynika co jest triggerem i jakie zdarzenie wyzwala trigger. Czy tutaj ewentualnie coś ułatwiającego pracę byłoby jeszcze potrzebne?

Sterowanie z konsoli

W przykładzie sterującym dwoma robotami widać, że dla każdego robota na samym początku są tworzone wątki. W przypadku sterowania jednym robotem, nie ma to sensu. Pozostaje możliwość sterowania z wątku głównego (konsoli) domyślnym robotem, który jako pierwszy zostanie zdefiniowany w pliku konfiguracyjnym plnxt.pl. Ponadto można zmienić domyślnego robota przy użyciu predykatu nxt_switch_robot(+Alias).

Sterowanie pojedynczym silnikiem

W warstwie sensomoto istniał taki predykat, ale bez kombinowania trudno było go użyć w programie sekwencyjnym. Jednak z uwagi na obecność innych predykatów (nxt_turn, nxt_pincer) nie jest to potrzebne. Predykat mimo to został umieszczony w warstwie movement. Można pisać programy jak w przykładzie.

Przykład (jazda zygzakiem):

start :-
	nxt_open,
	nxt_motor('C',300,150),
	nxt_motor('B',300,300),
	nxt_motor('C',300,300),
	nxt_motor('B',300,300),
	nxt_motor('C',300,300),
	nxt_motor('B',300,300),
	nxt_motor('C',300,300),
	nxt_motor('B',300,150),
	nxt_close.
mindstorms/plnxt/plnxtdev/plnxt20090908.txt · Last modified: 2017/07/17 08:08 (external edit)
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