====== Algorytmy omijania przeszkód ====== Poniżej zestawiono kilka algorytmów omijania przeszkód. Algorytmy te w większości wykorzystują echosondę. ===== Algorytm 1 ===== {{ :pl:miw:miw08_mindstormsdesign:plansza.jpg?150|plansza}} Przed przystąpieniem do pracy należy przgotować planszę (plansza w postaci kwadratu złożona z 6x6 kwadratów o powierzchni mieszczącej robot mobilny). Zadaniem robota powinno być znalezienie czarnego kwadratu na planszy. Utrudnienie będzie polegać na tym, że w różnych miejscach na planszy pojawią się stojące przeszkody (rys. czerwone pola). Plansza powinna mieć białe obramowanie. Na tak przygotowanej planszy, można postawić robota mobilnego w dowolnym punkcie. Robot powinien znaleźć czarne pole omijając po drodze przeszkody. ==== Zapis słowny reguł ==== - jeżeli czarne pole to STOP - jeżeli białe pole to obróć się w prawo - jeżeli robot jest w odległości mniejszej niż 1/4 odległości granicznej od przeszkody to obróć o 1800 - jeżeli robot jest w odległości mniejszej niż 1/2 odległości granicznej od przeszkody to obróć w prawo o 900 - jeżeli robot jest w odległości mniejszej niż odległości granicznej od przeszkody to obróć w lewo o 900 - jedź do przodu ==== Zapis regułowy ==== W poniższych regułach przyjęto, że reguły wykonują się w kolejności od 1 do 6. Jeżeli, któraś z reguł "zadziała", to wówczas następuje powrót do ponownego sprawdzenia reguł od 1 do 6. Rule: 1 if light_value == 'black' then STOP Rule: 2 if light_value == 'white' then turn = + 90 Rule: 3 if ultrasonic_value < N/4 then turn = 180 Rule: 4 if ultrasonic_value < N/2 then turn = 90 Rule: 5 if ultrasonic_value < N then turn = - 90 Rule: 6 go = max ==== Implementacja w Prologu ==== start :- nxt_light_sensor(Port,Value), Value == RGB_black, nxt_go(0). start :- nxt_light_sensor(Port,Value), Value == RGB_white, nxt_turn(Speed,+90). start :- nxt_ultrasonic_sensor(port,Value), Value =< N/4, nxt_turn(Speed,+180). start :- nxt_ultrasonic_sensor(port,Value), Value =< N/2, nxt_turn(Speed,+90). start :- nxt_ultrasonic_sensor(port,Value), Value =< N, nxt_turn(Speed,-90). start :- nxt_go(1). ==== XTT ==== {{:pl:miw:miw08_mindstormsdesign:alg8.png|XTT}} UWAGI!!!FIXME - Na powyższym diagramie XTT wykorzystano zapętlenie reguł. - Czy akcję początku i końca programu (START i STOP) powinny być jakoś dodatkowo zaznaczone na XTT? - W diagramie na potrzeby algorytmu stworzono pusty przebieg (zaznaczony na czerwono). W programie wykrywane jest to jako błąd. Jednak uważam, że warto przemyśleć opcję wprowadzenia 'pustej reguły' w calu przekierowania strumienia np. do innej tablicy. Oczywiście zamiast tego pola można było wprowadzić regułę dopełniającą pozostałe reguły w tablicy. - Ponadto w tablicy związanej z action_robot wprowadziłem akcję od pustego warunku (czyli taki 'else'). Program wyświetla to jako błąd. Uważam, że wprowadzenie formuły/pola 'else' mogłoby by być przydatne. Oczywiścię nie jest to problem, gdyż tak jak w wcześniejszej uwadze, można sztucznie wprowadzić regułę/pole, które mogłoby to uzupełnić.