Sprawozdanie 6

Robot: Ewka
Data wykonania: 9.06.2010 godz. 9:30
Autorzy: Martyka Łukasz, Stereńczak Agata, Szczurek Joanna

Budowa robota

Otrzymaliśmy w pełni zbudowanego robota Ewkę.

Algorytm Więzień

Pracę na laboratorium rozpoczęliśmy od poprawienia algorytmu Więzień, który implementowaliśmy na jednym z poprzednich laboratoriów. Ponieważ poprzednio stwierdziliśmy, iż ucieczka po zobaczeniu koloru czerwonego jest bardzo trudna do zrealizowania, postanowiliśmy zmodyfikować klucz ucieczki. Robot miał uciec z więzienia jeśli usłyszał klaśnięcie.

Sterowanie wieloma robotami

Drugim robotem z którym pracowaliśmy na zajęciach był Irek. Zmodyfikowaliśmy odpowiednio plik plnxt. Nawiązaliśmy połączenie Bluetooth z oboma robotami. Niestety próba sparowania robota z komputerem nie przebiegła pomyślnie. Nawiązaliśmy połączenie po raz kolejny i spróbowaliśmy od razu z konsoli wykonać polecenie

nxt_goal(irek, nxt_open) 

ale niestety ta próba też się nie powiodła. Tak samo było dla Ewki. Aby wykonać jakiekolwiek zadanie na laboratorium, postanowiliśmy przejść do kolejnego zadania.

Komunikacja między robotami

Pracę z tym zagadnieneim rozpoczęliśmy od przetestowania połączenia TCP/IP. Udało nam się nawiązać komunikację klient - serwer, zatem zajęliśmy się zagadnieniem Więźnia.
Kod programu:

:- consult('plnxt.pl').
:- use_module(library(socket)).
 
create_client :-
	tcp_socket(Socket),
	tcp_connect(Socket,'10.6.66.46':33809),
	tcp_open_socket(Socket,Read,Write),
	write(Write,'robot(ewka).'),nl(Write),
	close(Read),
	close(Write).

normal_go :- trigger_create(_,check_light,change_angle),
        trigger_create(_,check_sound,run),
        nxt_go(100).

start :-nxt_light_LED(activate, force),
        write('start'),
        normal_go.
stop :-
        trigger_killall,
        nxt_stop.

change_angle :-
        Angle is 40 + random(60), 
        nxt_rotate(360, Angle, force), normal_go,
        write('zmieniam kat').

check_light :-
        nxt_light(Light,force),
        Light < 50,
        write('znalazlem czarny').

check_sound :-
        nxt_sound(Sound,force),
        Sound>50,
        write('znalazlem czerwony').

run :-  create_client,
        nxt_go_cm(800,100),
        nxt_play_tone(500, 2000), stop.
        

Drugi robot z którym się komunikowaliśmy nasłuchiwał jako serwer wykorzystując poniższy kod:

create_server :-
	tcp_socket(Socket),
	tcp_bind(Socket,33808),
	tcp_listen(Socket,5),
	tcp_open_socket(Socket,_,_),
 
	tcp_accept(Socket, Slave, _), % Akceptacja połaczenia ze strony klienta.
	tcp_open_socket(Slave, In, Out),
	read(In,Msg), % Odczyt wiadomości.
	write(Msg),
        close(In),
        close(Out).

Działanie robotów obrazuje filmik: Ewka i Irek w więzieniu
Jak widać na filmie, oba roboty jeżdżą wewnątrz więzienia, po usłyszeniu klaśnięciu , Ewka (klient) powoli ucieka, a Irek (serwer) ucieka bardzo szybko.

Wnioski

Nie rozumiemy dlaczego nie udało nam się nawiązać komunikacji między robotami za pomocą połączenia Bluetooth. Komunikacja poprzez TCP/IP jest bardzo przyjazna w realizacji. Jedynym problemem było to, że swipl trzymał cały czas otwarty przez serwer port TCP co powodowało konieczność zmiany portu za każdym nowym uruchomieniem serwera (albo wyjście z konsoli swipl). Problem ten związany z TCP można było rozwiązać poprzez ustawienie flagi REUSE_ADDR(on) jednak nie zdążyliśmy znaleźć w dokumentacji Socketa jak to wykonać przy pomocy prologa.

Pliki

pl/dydaktyka/piw/2010/sprawozdania/piw20100609-09d.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