Języki sztucznej inteligencji - Laboratorium (zaawansowane algorytmy z PLNXT)
Maksymilian Piasecki, Jan Pollak, Mariusz Sokołowski
Środa 21.01.09 godz. 11:00
Konstrukcja
Robot, którego używaliśmy na zajęciach był już przygotowany, był to jeden z przykładów z instrukcji LEGO.
Algorytmy
Na zajęciach zdążyliśmy zaimplementować jeden algorytm pt. „Sprzątacz”. Jego zachowanie wyglądało następująco:
robot obraca się miejscu szukając przeszkód wokół niego w odległości < 30
gdy „zauważy” coś zatrzymuje się i zaczyna jechać w tym kierunku przez 2 sek
następnie wykonuje obrót o 180 stopni
znów jedzie w przód przez 2 sek, wracając do pkt. wyjścia
ponownie zaczyna szukać obiektów w swoim pobliżu
gdy przez dwa obroty nie znajdzie nic, kończy pracę
Napisany przez nas program:
:- consult('plnxt.pl').
start:-
nxt_open,
go_on_buddy.
go_on_buddy :-
nxt_rotate(200,720),
trigger_create(_,obczajka,wypchnij).
wypchnij :-
nxt_stop,
nxt_go(500),
sleep(2),
nxt_stop,
nxt_rotate(200,180),
nxt_go(500),
sleep(2),
nxt_stop,
go_on_buddy.
obczajka :-
nxt_ultrasonic(Value,force),
Value < 30.
zamknij :-
trigger_killall,
nxt_close.
Plik z programem - irek_21_01_09_1100.zip
Problemy, propozycje zmian
Pierwszym napotkanym przez na problemem było użycie nxt_go_cm. Poprzedni fragment kodu odpowiadający za usuwanie wykrytego obiektu wyglądał następująco:
wypchnij :-
nxt_stop,
nxt_go_cm,(400,30),
nxt_rotate(200,180),
nxt_go_cm(400,30),
go_on_buddy.
Jednak jego działanie było dalekie od zaplanowanego. Robot najpierw przejeżdżał kilkanaście cm następnie obracał się zaledwie o kilkadziesiąt stopni i wracał o kilkadziesiąt cm. Nic nie dały zmiany w cm w nxt_go_cm dlatego zdecydowaliśmy się na inne rozwiązanie.
Drugim problemem, którego tym razem nie udało nam się rozwiązać było niewłaściwe zamykanie połączenia, mimo użycia triger_killall przy zamykaniu połączenia program wyrzucał wyjątek i konieczne było resetowanie powłoki prologa.