|
|
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-11d [2009/01/25 12:09] jsi08 |
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-11d [2019/06/27 15:50] |
====== 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 - {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008: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. | |