PlNXT

Projekt zakończony

Piotr Hołownia, holownia@student.agh.edu.pl

PlNXT to API w Prologu do obsługi LEGO Mindstorms NXT

Celem projektu było zaimplementowanie funkcji niskiego poziomu (np. obracanie silnikiem, odczyt sensorów) oraz wyższego (np. jazda do przodu przez zadany czas, wykonanie skrętu w lewo o zadany kąt z zadanym promieniem).

Udało się założone cele zrealizować w zadowalającym stopniu. Są rzeczy, które warto poprawić. Zachęcam do zapoznania się z opisem.

Dokumentacja: plnxtdocs.zip

Opis warstw

Projekt jest podzielony na następujące wartswy:

  • najniższa warstwa (nxt_actions),
  • średnia warstwa (nxt_sensomoto),
  • najwyższa warstwa (nxt_movement).

Warstwa nxt_actions

Warstwa odpowiada za komunikację z NXT. Mamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itp. W tej warstwie można zastosować różne systemy komunikacji. Do tej pory zaimplementowane zostały dwa:

Dowolną inna implementację komunikacji można stworzyć bazując na pliku nxt_actions_dummy.pl.

Ograniczeniem jest to, że nazwy predykatów eksportowanych muszą pozostać takie same. Nie ma także możliwości wprowadzenia niczego nowego bez uwzględnienia tego w warstwie wyższej. Dlaczego? Jest to jedna z warstw projektu, ale wydzielona tylko, aby umożliwić wstawienie w jej miejsce różnych alternatywnych wersji. Warstwa nxt_actions nie stanowi części API. Nie powinna być używana w projektach bazujących na PlNXT. Nie ma takiej potrzeby.

Warstwa nxt_sensomoto

Warstwa bazuje na nxt_actions. To, co zostało zaimplementowane w niższej warstwie, w tej jest obudowane w logikę. Zatem mamy tutaj: poruszanie silnikami, odczyt sensorów, odczyt napięcia baterii, odtworzenie pliku dźwiękowego zapisanego w pamięci NXT, odtworzenie dźwięku o podanej częstotliwości.

Dokumentacja: nxt_sensomoto

Warstwa nxt_movement

Warstwa dostarcza predykaty realizujące złożoną pracę silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie, ruch do napotkania przeszkody.

Dokumentacja: nxt_movement

Dodatkowe komponenty

Threads

Do implementacji złożonych algorytmów sterowania NXT niezbędne jest wprowadzenie mechanizmów opóźniania akcji w czasie oraz uwarunkowanie akcji od pewnych zdarzeń. Np. chcemy, żeby po 10 sekundach od wciśnięcia sensora dotyku urządzenie odtworzyło plik dźwiękowy.

W pliku threads.pl znajdują się predykaty umożliwiające tworzenie triggerów i timerów z wykorzystaniem wątków w SWIProlog. Trigger uruchamia akcję pod warunkiem zajścia zdarzenia. Timer uruchamia akcję po wyznaczonym czasie.

Dokumentacja: threads

Przygotowanie środowiska

Z użyciem iCommand

Krótka instrukcja konfiguracji połączenia BT z wykorzystaniem iCommand dla użytkowników systemu Windows:

  1. Ściągnij i rozpakuj (np. do katalogu C:\nxt\) następujące pliki zip:
  2. Dopisz do zmiennej środowiskowej Classpath ścieżki do następujących plików jar: icommand.jar, bluesock.jar, RXTXcomm.jar. Np.:
     C:\nxt\icommand-0.7\dist\icommand.jar;C:\nxt\bluesockbeta1.0\bluesock.jar;C:\nxt\rxtx-2.1-7-bins-r2\RXTXcomm.jar 
  3. Dopisz do zmiennej środowiskowej Path ścieżki do katalogów z bibliotekami dll pochodzącymi z RXTX i bluesock. Np.:
     C:\nxt\rxtx-2.1-7-bins-r2\Windows\i368-mingw32\;C:\nxt\bluesockbeta1.0\ 
  4. Sparuj komputer z NXT. Dla tego urządzenia musi być dostępna usługa portu szeregowego „Dev B”. Sprawdź jaki port COM został przypisany do tej usługi dla NXT.
  5. Umieść w katalogu domowym plik icommand.properities (przy próbie skorzystania z iCommand zostanie utworzony automatycznie). Edytuj go, wpisując dwie następujące linie:
nxtcomm=COM6
nxtcomm.type=bluesock 

Zamiast COM6 wpisz port, który jest przypisany do Twojego NXT.

Chcąc używać API, należy do katalogu projektu skopiować następujące pliki:

W programie należy załadować moduły, których chcemy używać. Np.

:- use_module(nxt_movement).
:- use_module(nxt_sensomoto).
:- use_module(nxt_thread).

Aby sprawdzić poprawność przygotowania środowiska, zachęcam do uruchomienia pliku testowego test.pl. Jest on przygotowany dla robota TriBot. Można dzięki niemu szybko sprawdzić poprawność odczytów czujników oraz działanie silnika. Dla TriBot także ruch złożony (jazda do przodu, do tyłu, skręcanie, obracanie).

Laboratorium przygotowane w ramach projektu

Laboratorium przewidziane na 1,5 godziny składa się z obserwowania testowego programu oraz implementacji wybranego algorytmu.

Co należy poprawić?

Moduł komunikacyjny nxt_actions_icommand nie daje możliwości odczytu kierunku obrotu silnika. Nie jest to zaimplementowane w samym iCommand.


Odczytu sensorów dokonuje się podając numer portu. Powinna być też możliwość łatwiejszego odczytu bez podawania portu. Port byłby wtedy pobierany z konfiguracji robota.


Musi istnieć możliwość usuwania wcześniej utworzonych timerów i triggerów.


W iCommand metoda Motor.A.rotate(long count,boolean returnNow) obraca silnik o zadany kąt i zwraca sterowanie, jeśli returnNow==true. Nie zwraca go jednak wystarczająco szybko (wywoływana przez jpl), aby uruchomienie dwóch silników bezpośrednio po sobie odbyło się bez opóźnienia.

Stąd błędy w poruszaniu się robota przy użyciu tej metody. Np. predykat nxt_go(200,1000) sprawia, że robot nieznacznie skręca przed wykonaniem ruchu prostoliniowego i na koniec także.

Praca silników jest lekko przesunięta w czasie. Przy większych prędkościach obrotowych (np. 700 stopni na sekundę) ta różnica staje się niedopuszczalnie duża. Przy mniejszych (np. 150 stopni na sekundę) wydaje się nie przeszkadzać. Może dla wyeliminowania tego błędu należałoby zastosować wielowątkowość w Javie.


Historia prac nad projektem

Historia - spotkania, kolejne wersje projektu, sprawozdania cząstkowe.

pl/miw/miw08_mindstormsapi.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