Algorytmy omijania przeszkód

Poniżej zestawiono kilka algorytmów omijania przeszkód. Algorytmy te w większości wykorzystują echosondę.

Algorytm 1

plansza Przed przystąpieniem do pracy należy przgotować planszę (plansza w postaci kwadratu złożona z 6×6 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ł

  1. jeżeli czarne pole to STOP
  2. jeżeli białe pole to obróć się w prawo
  3. jeżeli robot jest w odległości mniejszej niż 1/4 odległości granicznej od przeszkody to obróć o 1800
  4. jeżeli robot jest w odległości mniejszej niż 1/2 odległości granicznej od przeszkody to obróć w prawo o 900
  5. jeżeli robot jest w odległości mniejszej niż odległości granicznej od przeszkody to obróć w lewo o 900
  6. 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

XTT

UWAGI!!!FIXME

  1. Na powyższym diagramie XTT wykorzystano zapętlenie reguł.
  2. Czy akcję początku i końca programu (START i STOP) powinny być jakoś dodatkowo zaznaczone na XTT?
  3. 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.
  4. 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ć.
pl/miw/miw08_mindstormsdesign/grid.txt · ostatnio zmienione: 2017/07/17 08:08 (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