====== Wstęp ====== Celem laboratorium była praca z programami działającymi na kilku równoległych wątkach. Mieliśmy do wykonania zadania które wymagały użycia nowo nabytej wiedzy. ====== Przygotowanie stanowiska, analiza przykładów ====== Stanowisko zastałem przygotowane do pracy, w robocie zmieniłem układ sensorów i wymieniłem kable tak żeby nie plątały się z kołami robota. Po przeczytaniu "Program + komendy z konsoli" dowiedziałem się jak uruchomić program niejako "w tle" uwalniając konsolę. Dzięki temu mogłem już zatrzymywać robota z konsoli (czego brakowało mi na poprzednim laboratorium). Przeanalizowałem "Przykład algorytmu", problem sprawiło dobranie dobrego progu głośności - tak aby robot reagował na klaśnięcie. Wartość ta była zupełnie inna niż ta podana w przykładzie (35 zamiast 15). ====== Wykonanie zadań ====== W związku z tym, że mój robot nie był wyposażony w szczypce, nie podjąłem się zadania z piłką. Wybrałem zadanie 'panikarz'. Poniżej kod mojego rozwiązania: :- consult('plnxt.pl'). start :- nxt_open, thread_create(go_on_buddy,_,[detached(true)]). go_on_buddy :- nxt_go(150), sleep(1), trigger_create(_,clap,run_buddy_run). run_buddy_run :- nxt_stop, random(0,180,Rand), Angle is 60+Rand, nxt_rotate(350,Angle), nxt_go_cm(400,20), go_on_buddy. % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość. clap :- nxt_sound(Value,force), Value > 35. stop :- trigger_killall, nxt_stop, nxt_close. To zupełnie podstawowe rozwiązanie, działa ono poprawnie. Po skończeniu tego zadania chciałem dopisać do tego kodu modyfikację tak aby robot po zderzeniu z przeszkodą (czujnik nacisku) obracał się o 180 stopni i przechodził do podstawowego trybu (jazda). Chodziło o to żeby w trybie 'panika' nie próbował przejechać przez ścianę, tylko odwracał się i w normalnym już trybie jazdy kontynuował. Niestety pogubiłem się najwyraźniej w wątkach i kod nie działał poprawnie - po kilku poprawnych reakcjach zaczynał wariować. Kody wyglądał następująco: :- consult('plnxt.pl'). start :- nxt_open, thread_create(first_run,_,[detached(true)]). first_run :- trigger_create(_,clap,run_buddy_run), trigger_create(_,press,relax_buddy), go_on_buddy. go_on_buddy :- nxt_go(150), sleep(1). run_buddy_run :- nxt_stop, random(0,180,Rand), Angle is 60+Rand, nxt_rotate(350,Angle), nxt_go_cm(400,20), trigger_create(_,clap,run_buddy_run), go_on_buddy. relax_buddy :- nxt_stop, nxt_play_tone(1000,1000),nxt_play_tone(1500,1000),nxt_play_tone(2000,1000), nxt_rotate(200,180), trigger_create(_,press,relax_buddy), go_on_buddy. % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość. clap :- nxt_sound(Value,force), Value > 35. press :- nxt_touch(Value,force), Value > 0. stop :- trigger_killall, nxt_stop, nxt_close. ====== Wnioski, uwagi ====== * fakt, że mogłem zatrzymać program działający na robocie z konsoli niestety nie oznaczał, że konsola i robot zachowywały się poprawnie po takiej operacji, tak jak ostatnio musiałem restartować zarówno środowisko prologa jak i samego robota po każdym niemal wgraniu programu * nie wiem czy jest to możliwe, ale fajnie by było gdyby robot mógł wrócić jakieś informacje na konsolę - bez tego debug jest fatalny, pozostaje grać sobie dźwięki żeby wiedzieć w którym miejscu programu jest robot * dane zwrotne na konsolę pomogły by też dobrać próg głośności szybciej, aczkolwiek właśnie sobie przypomniałem, że poziom głośności można sprawdzić bezpośrednio na wyświetlaczu robota w trybie testowania sensorów