====== Sprawozdanie 3 ====== * Robot: **Franek** * Data wykonania: **19.05.2010 godz. 17:00** * Autorzy: **Agata Krysian, Łukasz Mendakiewicz, Tomasz Skrzypczak** ---- ===== Ciąg dalszy ===== Tego dnia do współpracy przyznany został nam robot Franek. Był przygotowany do działania, miał zamontowane potrzebne sensory, co pozwoliło przystąpić do ćwiczeń. Prace rozpoczęliśmy od wykonywania algorytmów z poprzedniego tygodnia... ===== Rozgrzewka ===== Powodami nie wykonania zadań z poprzednich zajęć były problemy z połączeniem się z robotem. Tym razem robot był dla nas bardziej łaskawy, więc bez problemów zaimplementowaliśmy algorytm 1: :- consult('plnxt.pl'). start :- write('-- start 0.3 --'), nxt_light_LED(activate), gogo. gogo :- nxt_go(250), trigger_create(_, check_light, escape). check_light :- nxt_light(V, force), V < 45. escape :- Angle is 150 + random(60), nxt_rotate(100, Angle, force), gogo. % :- start. Próg wartości oświetlenia dobraliśmy empirycznie. Efekt był taki jakiego oczekiwaliśmy, co przetestowaliśmy kilkakrotnie, na załączonej macie. {{:pl:dydaktyka:piw:2010:sprawozdania:20100519_003b.jpg|}} Algorytm 2 był nieco bardziej rozbudowany, jednak nie oznaczało to dla nas, że był trudniejszy: :- consult('plnxt.pl'). start :- write('-- start 0.6 --'), nxt_light_LED(activate), gogo. gogo :- nxt_go(100), trigger_create(_, check_light, align), trigger_create(_, nxt_touch(1, force), wait_free_path). check_light :- nxt_light(V, force), V > 46. align :- trigger_killall, nxt_rotate(100, 3, force), gogo. wait_free_path :- trigger_killall, nxt_stop, nxt_play_tone(500,500), trigger_create(_, nxt_touch(0, force), gogo). stop :- trigger_killall, nxt_stop. % :- start. Franek poruszał się po czarnej linii, a gdy napotkał przeszkodę, wydał dźwięk zatrzymując się. Po zwolnieniu blokady robot grzecznie ruszył do przodu tak jak poprzednio. ===== Klask klask ===== Spośród algorytmów jako pierwszy wybraliśmy "Panikarza". Potrzebne sensory Franek już posiadał, więc przystąpiliśmy do napisania algorytmu. Prace robiliśmy etapami, dodając każdorazowo kolejną akcje robota. :- consult('plnxt.pl'). start :- write('-- start 0.0 --'), nxt_goal(franek, my_actions). my_actions :- nxt_go(100), trigger_create(_, clap, panic). clap :- nxt_sound(Value,force), Value > 30, write('clap!'). panic :- Angle is 160 + random(40), nxt_rotate(900, Angle, force), nxt_go(400). %dokonczyc... stop :- trigger_killall, nxt_stop. Franek poruszał się powoli i po każdym klaśnięciu odwracał się, następnie zwiększyliśmy jego prędkość "uciekania". Wyniki uznaliśmy za zadowalające, jednak czas nie pozwolił nam dokończyć całkowicie danego algorytmu. ===== Spostrzeżenia i wnioski ===== * Pomimo poprawnego łączenia się z robotem poprzez bluetooth teoretycznie nie nawiązaliśmy połączenia (kolejne komunikaty konsoli o zajętości zasobu)jednak praktyka okazała się inna - komunikacja działała poprawnie, czym byliśmy miło zaskoczeni :) * Zdarzało się, że środowisko się zawieszało przy użyciu prostych komend. Na szczęście wystarczało wówczas "zabić" proces konsoli Prologa i uruchomić ją ponownie. Wydaje nam się, że wywołanie tylko raz predykatu nxt_open, a nie za każdym uruchomieniem pary nxt_open / nxt_close rozwiązuje problem. * Predykat write wywołany w wątku działania robota niestety nie wypisuje od razu na ekran (zapewne buforuje gdzieś wewnętrznie), a szkoda, gdyż na pewno byłoby łatwiej z tym śledzić przebieg programu.