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:miw:2009:piw09_nxtcases_1 [2009/06/13 00:20]
piw09
pl:miw:2009:piw09_nxtcases_1 [2019/06/27 15:50] (aktualna)
Linia 6: Linia 6:
  
  
- ​====== Temat: Egzamin na Prawo Jazdy ======+ ​====== Temat: Egzamin na Prawo Jazdy (sterowanie regułami) ​======
  
 Przygotowaliśmy plac manewrowy dla robota zdającego egzamin na prawo jazdy. Przygotowaliśmy plac manewrowy dla robota zdającego egzamin na prawo jazdy.
Linia 32: Linia 32:
   - Hamowanie awaryjne   - Hamowanie awaryjne
  
-=== 1. Jazda po łuku (sterowanie za pomocą echosondy i sensora światła) ===+==== 1. Jazda po łuku (sterowanie za pomocą echosondy i sensora światła) ​====
  
 Przed przystąpieniem do tego manewru należy przygotować plansze po której będzie poruszał się robot, plansza ze względu na specyfikę wykorzystanych sensorów musi być otoczona czarną linią (potrzebne dla sensora światła) oraz ścianą (ściana musi znajdować się za czarną linią - dla sensora echosondy). Poniżej schemat planszy dla tego manewru: ​ Przed przystąpieniem do tego manewru należy przygotować plansze po której będzie poruszał się robot, plansza ze względu na specyfikę wykorzystanych sensorów musi być otoczona czarną linią (potrzebne dla sensora światła) oraz ścianą (ściana musi znajdować się za czarną linią - dla sensora echosondy). Poniżej schemat planszy dla tego manewru: ​
  
  
-Plansza FIXME +{{:​pl:​miw:​2009:​schemat_jazda_po_luku.png?​400|}}
  
 +* na zielono zaznaczone są miejsca gdzie konieczna jest ściana umożliwiająca sterowanie przy pomocy echo sondy 
 == Zapis słowny == == Zapis słowny ==
   - Jeżeli powróciłeś((odległość od krawędzi mniejsza niż PROG i KAT >= 90<​sup>​o</​sup>​ i kierunek TYL)) na miejsce rozpoczęcia manewru to STOP   - Jeżeli powróciłeś((odległość od krawędzi mniejsza niż PROG i KAT >= 90<​sup>​o</​sup>​ i kierunek TYL)) na miejsce rozpoczęcia manewru to STOP
Linia 78: Linia 78:
   then direction = BACK and angle = 0   then direction = BACK and angle = 0
 </​code>​ </​code>​
 +
 == Implementacja w prologu== == Implementacja w prologu==
  
-=== 2. Parkowanie skośne przodem === +<code prolog>​ 
 + 
 +direction(forward). 
 +angle(0). 
 + 
 +start :-  
 + ​nxt_light(Value),​  
 + Value = RGB_Black,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 + ​angle(Angle),​ 
 + Angle >= 90,  
 +  
 + ​nxt_stop,​  
 + ​nxt_close. 
 + 
 +start :-  
 + ​nxt_ultrasonic(Value),​  
 + Value > 20,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 +  
 + ​nxt_go(1). 
 + 
 +start :-  
 + ​nxt_light(Value),​  
 + Value \= RGB_Black,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 + 
 + ​nxt_go(-1). 
 + 
 +start :-  
 + ​nxt_ultrasonic(Value),​  
 + Value <= 20,  
 + ​angle(Angle),​  
 + Angle < 90,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 +  
 + B is Angle + 10,  
 + ​retractall(angle(_)),​  
 + ​assert(angle(B)),​  
 + 
 + ​nxt_rotate(300,​10).  
 +   
 +start :- 
 + ​nxt_light(Value),​ 
 + Value = RGB_Black,  
 + ​angle(Angle),​  
 + Angle < 90,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 + 
 + B is Angle + 10,  
 + ​retractall(angle(_)),​  
 + ​assert(angle(B)),​  
 + 
 + ​nxt_rotate(300,​-10).  
 +  
 +start :- 
 + ​nxt_ultrasonic(Value),​  
 + Value <= 20,  
 + ​angle(Angle),​  
 + Angle >= 90,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 + 
 + ​retractall(angle(_)),​  
 + ​assert(angle(0)),​ 
 + 
 + ​retractall(direction(_)),​ 
 + ​assert(direction(back)). 
 + 
 +</​code>​ 
 + 
 +==== 2. Parkowanie skośne przodem ​==== 
  
-Podobnie jak w poprzednim przypadku do sterowania robotem zostaną użyte dwa sensory (echosonda z przodu, sensor światła z tyłu robota). Do przeprowadzenia manewru należy przygotować planszę wg załączonego schematu. Podobnie jak poprzednio, plansza musi być obmalowana czarną linią i otoczona ścianą ​z zaznaczonej strony+Podobnie jak w poprzednim przypadku do sterowania robotem zostaną użyte dwa sensory (echosonda z przodu, sensor światła z tyłu robota). Do przeprowadzenia manewru należy przygotować planszę wg załączonego schematu. Podobnie jak poprzednio, plansza musi być obmalowana czarną linią i otoczona ścianą ​(kolor zielony na schemacie)
  
-schemat FIXME+{{:​pl:​miw:​2009:​schemat_parkowanie_skosne.png?​250|}}
  
 == Zapis słowny == == Zapis słowny ==
Linia 121: Linia 198:
   then direction = BACK and angle = 0   then direction = BACK and angle = 0
 </​code>​ </​code>​
 +
 == Implementacja w prologu== == Implementacja w prologu==
  
-=== 3. Koperta=== +<code prolog>​ 
- Do tego manewru została użyta plansza wg schematu. Manewr rozpoczyna się w miejscu oznaczonym ​literą S (Start), a kończy się po prawidłowym zaparkowaniu w "​kopercie"​. Manewr praktycznie rozpoczyna się po najechaniu na czarną linię prostopadłą do miejsca do markowania.  ​+direction(forward). 
 +angle(0). 
 +  
 +start :-  
 + ​nxt_light(Value),​  
 + Value = RGB_Black,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 + ​angle(Angle),​ 
 + Angle >= 45,  
 +  
 + ​nxt_stop,​  
 + ​nxt_close. 
 +  
 +start :-  
 + ​nxt_ultrasonic(Value),​  
 + Value > 20,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 +  
 + ​nxt_go(1). 
 +     
 +start :-  
 + ​nxt_light(Value),​  
 + Value \= RGB_Black,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 +  
 + ​nxt_go(-1). 
 +  
 +start :-  
 + ​nxt_ultrasonic(Value),​  
 + Value <= 20,  
 + ​angle(Angle),​  
 + Angle < 45,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 +  
 + B is Angle + 5,  
 + ​retractall(angle(_)),​  
 + ​assert(angle(B)),​  
 +  
 + ​nxt_rotate(300,​5).  
 +  
 +start :- 
 + ​nxt_light(Value),​ 
 + Value = RGB_Black,  
 + ​angle(Angle),​  
 + Angle < 45,  
 + ​direction(Direction),​  
 + ​Direction = back,  
 +  
 + B is Angle + 5,  
 + ​retractall(angle(_)),​  
 + ​assert(angle(B)),​  
 +  
 + ​nxt_rotate(300,​-5).  
 +  
 +start :- 
 + ​nxt_ultrasonic(Value),​  
 + Value <= 20,  
 + ​angle(Angle),​  
 + Angle >= 45,  
 + ​direction(Direction),​  
 + ​Direction = forward,  
 +  
 + ​retractall(angle(_)),​  
 + ​assert(angle(0)),​ 
 +  
 + ​retractall(direction(_)),​ 
 + ​assert(direction(back)). 
 +</​code>​ 
 + 
 +==== 3. Koperta==== 
 + Do tego manewru została użyta plansza wg schematu. Manewr rozpoczyna się w miejscu oznaczonym ​"Start", a kończy się po prawidłowym zaparkowaniu w "​kopercie"​. Manewr praktycznie rozpoczyna się po najechaniu na czarną linię prostopadłą do miejsca do markowania. Kolorem zielonym na schemacie jest zaznaczone miejsce gdzie musi zostać umieszczona ściana aby prawidłowo zadziałała echosonda.  ​
  
- schemat FIXME+ {{:​pl:​miw:​2009:​picture_7.png?​250|}}
  
  == zapis słowny ==  == zapis słowny ==
Linia 160: Linia 312:
   then direction = BACK and rotate(-45)   then direction = BACK and rotate(-45)
  
 +  Rule 6:
   if light_Value = BLACK and manoeuvre = STARTED and direction = BACK    if light_Value = BLACK and manoeuvre = STARTED and direction = BACK 
   then direction = FORWARD   then direction = FORWARD
Linia 165: Linia 318:
  
 == Implementacja w prologu ==  == Implementacja w prologu == 
 +<code prolog>
 +direction(back).
 +manoeuvre(not_started).
 +
 +start :-
 +  nxt_ultrasonic(Value),​
 +  Value < 10, 
 +  nxt_stop,
 +  nxt_close.
 +
 +start :-
 +  nxt_light(Value),​
 +  Value \= RGB_Black,
 +  direction(Direction),​
 +  in(Direction,​ [back, slant]),
 +  nxt_go(-1).
 +
 +start :-
 +  nxt_ultrasonic(Value),​
 +  Value > 10, 
 +  direction(Direction), ​
 +  Direction = forward, ​
 +  nxt_go(1).
 +
 +start :-
 +  nxt_light(Value), ​
 +  Value = RGB_Black, ​
 +  manoeuvre(Manoeuvre), ​
 +  Manoeuvre = not_started, ​
 +  ​
 +  retractall(manoeuvre(_)),​
 +  assert(manoeuvre(started)), ​
 +  ​
 +  retractall(direction(_)),​
 +  assert(direction(slant)), ​
 +
 +  nxt_rotate(300,​45).
 +
 +start:-
 +  nxt_light(Value), ​
 +  Value = RGB_Black, ​
 +  manoeuvre(Manoeuvre), ​
 +  Manoeuvre = started, ​
 +  direction(Direction), ​
 +  Direction = slant, ​
 +
 +  retractall(direction(_)),​
 +  assert(direction(back)),​
 +
 +  nxt_rotate(300,​-45). ​
 +
 +start:-
 +  nxt_light(Value), ​
 +  Value = RGB_Black, ​
 +  manoeuvre(Manoeuvre), ​
 +  Manoeuvre = started, ​
 +  direction(Direction), ​
 +  Direction = back, 
 +
 +  retractall(direction(_)),​
 +  assert(direction(forward)).
 +  ​
 +in(X,​[X|_]).
 +in(X,​[_|Tail) :-
 +  in(X,Tail).
 +</​code>​
  
-=== 4. Hamowanie awaryjne === +==== 4. Hamowanie awaryjne ​==== 
  
 Robot w tym przypadku wykonuje manewr hamowania awaryjnego, który jest wykonywany w części egzaminu zdawanego na mieście. W tym zadaniu wykorzystujemy dwa sensory: sensor dźwięku do wykonania hamowania awaryjnego i echosondę do zakończenia manewru. Manewr ten nie wymaga żadnych dodatkowych plansz i przygotowań. ​ Robot w tym przypadku wykonuje manewr hamowania awaryjnego, który jest wykonywany w części egzaminu zdawanego na mieście. W tym zadaniu wykorzystujemy dwa sensory: sensor dźwięku do wykonania hamowania awaryjnego i echosondę do zakończenia manewru. Manewr ten nie wymaga żadnych dodatkowych plansz i przygotowań. ​
Linia 177: Linia 396:
  
  ​Reguły są wykonywane sekwencyjnie od pierwszej do trzeciej. Po wykonaniu którejś z reguł następuje sprawdzania spełnienia kolejnej od początku. ​  ​Reguły są wykonywane sekwencyjnie od pierwszej do trzeciej. Po wykonaniu którejś z reguł następuje sprawdzania spełnienia kolejnej od początku. ​
 +
 +== zapis regułowy ==
  
 <code pascal> <code pascal>
Linia 193: Linia 414:
  
 == Implementacja w prologu== == Implementacja w prologu==
 +
 +<code prolog>
 +start :-
 +      nxt_ultrasonic(Value), ​
 +      Value < 10, 
 +      nxt_stop,
 +      nxt_close.
 +
 +start :-
 +      nxt_sound(Value), ​
 +      Value > 40, 
 +      nxt_stop, ​
 +      wait(3).
 +
 +start :-
 +      nxt_go(1).
 +</​code>​
pl/miw/2009/piw09_nxtcases_1.1244845249.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (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