====== 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: [[http://www.youtube.com/watch?v=lcL8RHbiOQg|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:ewka_klient.pl|Klient-Ewka}}