Algorytmy omijania przeszkód
Poniżej zestawiono kilka algorytmów omijania przeszkód. Algorytmy te w większości wykorzystują echosondę.
Algorytm 1
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ł
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
UWAGI!!!
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ć.