====== PLNXT - Paweł Grzesiak, Rafał Dyrda - 14.01.09. ====== ===== 1. Cel ćwiczenia ===== Celem ćwiczenia było skonstruowanie robota oraz uruchomienie prostych algorytmów stworzonych przy pomocy interfejsu PLNXT działającego w powłoce SWIPL. ===== 2. Realizacja ćwiczenia ===== ==== 2.1. Budowa robota ==== Zbudowany przez nas robot oparty jest o model zawarty w instrukcji Quickstart dołączonej do zestawu, ponadto został rozbudowany do TriBot'a przy pomocy instrukcji zawartej w User Guide, wyposażony został w czujnik dotyku, działający jako czujnik krańcowy [Rysunek2]. \\ Wygląd robota został przedstawiony na rysunkach poniżej. \\ \\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:henio_tribot.jpg|}}\\ Rysunek 1: Henio-TriBot\\ \\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:dotyk.jpg|}}\\ Rysunek 2: Konstrukcja czujnika krańcowego z wykorzystaniem czujnika dotyku.\\ \\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:podest.jpg|}}\\ Rysunek 3: Rampa nowej generacji.\\ \\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:henio2387456.jpg|}}\\ Rysunek 4: Henio Magazynier skradający się po piłkę.\\ \\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:henio983528.jpg|}}\\ Rysunek 5: Henio Magazynier po załadowaniu towaru. ==== 2.2. Pisanie algorytmu ==== Przy pomocy funkcji z interfejsu NXTPL opisanych w {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}} można w prosty sposób pisać algorytmy na zasadzie predykatów języka Prolog. Ze względu na ograniczoną ilość czasu stworzyliśmy jeden algorytm. === 2.2.1. Magazynier === Zadaniem robota bylo: * podjazd do rampy, na której znajdowała się kulka, * po wyczuciu oporu powinien się zatrzymać, * chwycić kulkę przy pomocy szczypiec, * wycofać, * obrócić się o 180 stopni, * pojechać 10cm do przodu, * zatrzymać się i wypuścić piłkę. Kod algorytmu (również jako załącznik poniżej): :- consult('plnxt.pl'). start:- nxt_open, go_on_buddy, trigger_create(_,pushed,grab_ball). go_on_buddy :- nxt_go(300). grab_ball :- nxt_stop, sleep(1), nxt_pincer(close), sleep(1), nxt_go_cm(-300,10), nxt_rotate(300,180), nxt_go_cm(300,30), nxt_pincer(open), nxt_go_cm(-300,10), nxt_stop, nxt_close. pushed :- nxt_touch(Value,force), Value=1. **Uwagi:** Predykat nxt_go_cm/2 nie działał, gdy jako //+Speed// wpisywało się wartość ujemną, co zgodnie z instrukcją powinno spowodować jazdę do tyłu. ** Uwaga! Wtrącenie prowadzącego!** Dla dobra szeroko rozumianej nauki muszę się wtrącić w sprawozdanie. ;)\\ Panowie próbowali wpisywać //Distance// ujemny i wtedy nie działało, bo //Distance// powinien być dodatni (wg instrukcji). Zwrot wyznacza znak //Speed// (można się zastanowić, czy to jest słuszne i intuicyjne) i tak powinno działać (tak macie Panowie w Waszym algorytmie). Czy tutaj faktycznie był problem? --- //[[holownia@student.agh.edu.pl|Piotr Hołownia]] 2009/01/14 21:32// ** Uwaga! Odpowiedź studentów;) **\\ Faktem jest, że początkowo wpisywaliśmy wartość ujemną w //Distance//, lecz po zwróceniu uwagi spróbowaliśmy również z wartością ujemną w polu //Speed// (jak w kodzie powyżej) i sytuacja była taka sama. Oczywiście za tydzień przetestujemy jeszcze raz tą funkcję i dopiszemy kolejną **Uwagę**;)\\ ===== 3. Wnioski ===== * Łączność z Heniem była dość problematyczną kwestią - często po wykonaniu jakiejś komendy silniki pozostawały w trybie pracy, były naprężone i nie było możliwości zakończenia aktualnego zadania przez //nxt_stop//, lub //nxt_close//, pomagało jedynie wyłączenie bricka i zrestartowanie powłoki SWIPL, * Tworzenie algorytmów z wykorzystaniem NXTPL jest bardzo proste dzięki dokładnym opisom funkcji w {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}}, niestety nie mieliśmy zbyt wiele czasu, aby sprawdzić wszystkie możliwości tego interfejsu i porównać jego funkcjonalność z dołączoną aplikacją LEGO. \\ **Załączniki:**\\ {{:pl:mindstorms:studenci:przedmioty:jsi:jsi2008:nxt_magazynier.pl|}}