Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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)
Linia 7: Linia 7:
 ===== 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 robocienaszym 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ż zbudowanyjedyną 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 zasadamiWg. 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 czerwonegoPo 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 danymioraz obracać robota o 1 stopień, a nie o 90. Pojawił się problem z obrotem ​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 polecenianawet 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. 
pl/dydaktyka/piw/2010/sprawozdania/piw20100526-15d.1275923644.txt.gz · ostatnio zmienione: 2019/06/27 15:54 (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