Both sides previous revision
Poprzednia wersja
|
|
pl:miw:miw08_mindstormsdesign:grid [2008/05/19 13:36] miw |
pl:miw:miw08_mindstormsdesign:grid [2008/05/26 00:58] miw |
====== 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 180<sup>0</sup> | |
- jeżeli robot jest w odległości mniejszej niż 1/2 odległości granicznej od przeszkody to obróć w prawo o 90<sup>0</sup> | |
- jeżeli robot jest w odległości mniejszej niż odległości granicznej od przeszkody to obróć w lewo o 90<sup>0</sup> | |
- 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. | |
<code ada> | |
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 | |
</code> | |
| |
| |
| |
==== Implementacja w Prologu ==== | |
<code prolog> | |
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 :- | |
ultrasonic_sensor(Value), | |
Value =< N/4, | |
nxt_turn(Speed,+180). | |
start :- | |
ultrasonic_sensor(Value), | |
Value =< N/2, | |
nxt_turn(Speed,+90). | |
start :- | |
ultrasonic_sensor(Value), | |
Value =< N, | |
nxt_turn(Speed,-90). | |
start :- | |
nxt_go(1). | |
</code> | |
| |
| |
| |
| |
| |
| |
| |
| |
==== 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ć. | |
| |