Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:piw:2010:sprawozdania:piw20100526-15d [2010/06/07 17:14] piw10 usunięto |
pl:dydaktyka:piw:2010:sprawozdania:piw20100526-15d [2019/06/27 15:50] (aktualna) |
===== Początek ===== | ===== Początek ===== |
| |
Bez problemów sparowaliśmy robota z komputerem, przetestowaliśmy połączenie kilkoma prostymi poleceniami np. nxt_play_tone(500,2000). | Bez większych problemów sparowaliśmy robota z komputerem. Dla sprawdzenia poprawności połączenia sprawdziliśmy działanie robota kilkoma prostymi poleceniami |
| |
===== Budowa robota ===== | ===== Budowa robota ===== |
| |
Zdecydowaliśmy się stworzyć program "Co przybyło". Mikrofon był już zamontowany na robocie, naszym zadaniem było zamocowanie z przodu czujnika odległości. | Zdecydowaliśmy się zaimplementować program "Więzień" ponieważ wydawał się w miarę prosty i od razu wiedzieliśmy jakiego algorytmu użyć. Robot był już zbudowany, jedyną naszą modyfikacją było lepsze zamocowanie czujnika, aby był skierowany prostopadle do ziemi. |
Zdziwieni byliśmy dokładnością tego czujnika. Możliwe było całkiem dokładne podawanie odległości od przedmiotu a czujnik wykrywał nawet nieduże obiekty. | |
| |
Nasz robot: | Nasz robot na planszy testowej: |
| |
| {{:pl:dydaktyka:piw:2010:sprawozdania:26052010162a.jpg|}} |
| |
{{:pl:dydaktyka:piw:2010:sprawozdania:02062010167a.jpg|}} | |
| |
| |
=====Program===== | =====Program===== |
| |
Chcieliśmy napisać program co przybyło lecz z nieco uproszczonymi zasadami. Wg. opisu program powinien w triggerze sprawdzać odległość obiektu od sensora cały czas podczas płynnego obracania się. Nasze rozwiązanie polegało na sprawdzaniu tylko 4 kierunków - obracaniu się o 90 stopni. | Na początku musieliśmy określić zakresy odczytów czujnika dla koloru białego, czarnego i czerwonego. Po kilku próbach zdecydowaliśmy się na: |
| |
| * biały>67 |
| * 60<czerwony<67 |
| * czarny<45 |
| Po wyliczeniu tych progów zaczęliśmy pisać program, co poszło dosyć sprawnie. Jedynym problemem okazało się zabijanie wątków. Gdy ich nie zabijaliśmy to nie było sposobu aby zatrzymać robota - natworzyło się bardzo dużo wątków które działały w tle. |
<code prolog> | <code prolog> |
| |
| |
start :- | start :- |
skret, | trigger_create(Trigger1,check_color,[nxt_stop,skret]), |
nxt_ultrasonic(A1), | trigger_create(Trigger2,check_color2,[nxt_stop,uciekaj]), |
| nxt_go(200). |
| |
| check_color :- |
| nxt_light(Light2,force), |
| Light2 < 45. |
| check_color2 :- |
| nxt_light(Light,force), |
| |
skret, | Light > 60, |
nxt_ultrasonic(A2), | Light < 67. |
| |
skret, | |
nxt_ultrasonic(A3), | |
| |
skret, | |
nxt_ultrasonic(A4), | |
| |
trigger_create(Trigger1,klask,[nxt_stop,skret2]). | |
| |
| |
| |
klask :- | |
nxt_sound(Sound,force), | |
Sound > 50. | |
| |
skret :- | skret :- |
| trigger_killall, |
nxt_rotate(100,95). | nxt_go_cm(-100,5), |
| nxt_rotate(100,150), |
skret2 :- | start. |
nxt_play_tone(500,2000), | uciekaj :- |
| nxt_play_tone(500,2000), |
skret, | nxt_go_cm(300,70), |
nxt_ultrasonic(B1), | nxt_play_tone(500,2000), |
trigger_create(TriggerA,A1 - B1 > 10,[nxt_go_cm(300,B1+10),end]), | trigger_killall. |
| |
| |
skret, | |
nxt_ultrasonic(B2), | |
trigger_create(TriggerB,A2 - B2 > 10,[nxt_go_cm(300,B1+10),end]), | |
skret, | |
nxt_ultrasonic(B3), | |
trigger_create(TriggerC,A3 - B3 > 10,[nxt_go_cm(300,B1+10),end]), | |
skret, | |
nxt_ultrasonic(B4), | |
trigger_create(TriggerD,A4 - B4 > 10,[nxt_go_cm(300,B1+10),end]), | |
end. | |
end :- | |
| |
nxt_play_tone(500,2000), | |
trigger_kilall. | |
| |
| |
</code> | </code> |
| |
| |
Zdajemy sobie sprawę, że to rozwiązanie jest trywialne. Nie mieliśmy pomysłu jak sprawdzać w triggerze zmianę odległości i jak zapisać dane z pierwszego obrotu. Padły pomysły o zapisywaniu odległości próbkując co 1 stopień. Wystarczyłoby do naszego aktualnego programu dopisać tablicę z danymi, oraz obracać robota o 1 stopień, a nie o 90. Pojawił się problem z obrotem o 1 stopień. Okazało się, że obrót 360 razy o 1 stopień to nie obrót o 360 stopni - silniki krokowe w lego nie są tak dokładne jak sądziliśmy. Często robot nawet nie ruszał się. Drugim rozwiązaniem był ciągły obrót i sprawdzanie z pewnym próbkowaniem odległości, ale tego nie umieliśmy zaprogramować. Tutaj trzeba by się zagłębić w programowanie wielowątkowe na co nie było czasu. | Program działał całkiem nieźle, czasami tylko wychodził poza planszę, ale było to spowodowane bardziej niedokładnością czujnika niż wadą algorytmu. |
| |
=====Wnioski i spostrzeżenia===== | =====Wnioski i spostrzeżenia===== |
| |
Często zdarzało się, że po wykonaniu błędnego programu środowisko xpce zawieszało się. Robot przestawał reagować na polecenia, nawet po zabiciu xpce i odpaleniu ponownie. Rozwiązaniem na ten problem okazało się wyłączenie i włączenie robota, ponowne połączenie przez bluetooth oraz wywołanie plnxt_stty. | Czasami po błędnym programie xpce zawieszało się. Nie mieliśmy sposobu na obejście tego problemu - od nowa parowaliśmy urządzenia i zwykle robot zaczynał znowu z nami współpracować, ale nie było to regułą. |
| |
| |
=====Uwagi do laboratorium===== | |
| |
Przydały by się jakieś przykłady nieco bardziej zaawansowanych programów napisanych w prologu pod LEGO MindStorms. | |