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/11 11:27]
piw09
pl:miw:2009:piw09_nxtcases_1 [2019/06/27 15:50] (aktualna)
Linia 5: Linia 5:
   * Krzysztof Rączka (kraczka@student.agh.edu.pl)   * Krzysztof Rączka (kraczka@student.agh.edu.pl)
  
-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 19: Linia 18:
  
 Szkielet robota został zbudowany w oparciu instrukcję dostarczoną razem z Lego Mindstorms. Dodatkowo wyposażyliśmy go w sensor sondy z przodu, sensor światła z tyłu (oba sensory służą do kierowania robotem i są żródłem informacji o przeszkodach z przodu i tyłu robota ), sensor dźwięku - wykorzystywany tylko przy hamowaniu awaryjnym. Budowę robota można zobaczyć na załączonych powyżej fotografiach. ​ Szkielet robota został zbudowany w oparciu instrukcję dostarczoną razem z Lego Mindstorms. Dodatkowo wyposażyliśmy go w sensor sondy z przodu, sensor światła z tyłu (oba sensory służą do kierowania robotem i są żródłem informacji o przeszkodach z przodu i tyłu robota ), sensor dźwięku - wykorzystywany tylko przy hamowaniu awaryjnym. Budowę robota można zobaczyć na załączonych powyżej fotografiach. ​
 +
 +==== Konfiguracja środowiska pod os X ====
 +
 +Projekt został wykonany w środowisku Mac OS X versja 10.5 (Leopard). ​
 +Konfiguracja połączenia pomiędzy robotem a komputerem dostępna jest [[pl:​miw:​2009:​piw09_nxtcases_1:​konfiguracja|tutaj]].  ​
  
 ==== Plac manewrowy ==== ==== Plac manewrowy ====
 +
 +Robot aby "​zaliczyć"​ egzamin musi wykonać następujące manewry na placu manewrowym:
   - Jazda po łuku   - Jazda po łuku
   - Parkowanie skośne przodem   - Parkowanie skośne przodem
-  - Parkowanie prostopadłe tyłem 
   - Koperta   - Koperta
   - Hamowanie awaryjne   - Hamowanie awaryjne
  
 +==== 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: ​
 +
 +
 +{{:​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 ==
 +  - 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 odległość od krawędzi większa niż PROG i kierunek PRZOD - jedz do przodu
 +  - Jeżeli odległość od krawędzi większa niż PROG i kierunek TYL - jedz do tyłu
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT < 90<​sup>​o</​sup>​ i kierunek PRZOD obróc się o +10<​sup>​o</​sup>​
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT < 90<​sup>​o</​sup>​ i kierunek TYL obróc się o -10<​sup>​o</​sup>​
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT >= 90<​sup>​o</​sup>​ i kierunek PRZOD - zmień kierunek na TYL
 +
 +Reguły wykonuje się kolejno od pierwszej do ostatniej, jeżeli któraś reguła zostanie spełniona to wykonujemy reguły od początku. ​
 +
 +
 +== Zapis regułowy ==
 +
 +<code pascal>
 +  Rule 1:
 +  if light_Value = BLACK and direction = BACK and angle >= 90
 +  then STOP  ​
 +  ​
 +  Rule 2:
 +  if ultrasonic_Value > 20 and direction = FORWARD
 +  then go = 1
 +   
 +  Rule 3: 
 +  if light_Value != BLACK and direction = BACK 
 +  then go = -1 
 +  ​
 +  Rule 4: 
 +  if ultrasonic_Value <= 20 and angle < 90 and direction = FORWARD
 +  then angle += 10 and rotate(10)
 +  ​
 +  Rule 5:
 +  if light_Value = BLACK and angle < 90 and direction = BACK  ​
 +  then angle += 10 and rotate(-10)
 +  ​
 +  Rule 6:
 +  if ultrasonic_Value <=20 and angle >=90 and direction = FORWARD
 +  then direction = BACK and angle = 0
 +</​code>​
 +
 +== Implementacja w prologu==
 +
 +<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ą (kolor zielony na schemacie). ​
 +
 +{{:​pl:​miw:​2009:​schemat_parkowanie_skosne.png?​250|}}
 +
 +== Zapis słowny ==
 +
 +  - Jeżeli powróciłeś((odległość od krawędzi mniejsza niż PROG i KAT >= 45<​sup>​o</​sup>​ i kierunek TYL)) na miejsce rozpoczęcia manewru to STOP
 +  - Jeżeli odległość od krawędzi większa niż PROG i kierunek PRZOD - jedz do przodu
 +  - Jeżeli odległość od krawędzi większa niż PROG i kierunek TYL - jedz do tyłu
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT < 45<​sup>​o</​sup>​ i kierunek PRZOD obróc się o +5<​sup>​o</​sup>​
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT < 45<​sup>​o</​sup>​ i kierunek TYL obróc się o -5<​sup>​o</​sup>​
 +  - Jeżeli odległość od krawędzi mniejsza niż PROG i KAT >= 45<​sup>​o</​sup>​ i kierunek PRZOD - zmień kierunek na TYL
 +
 +== Zapis regułowy ==
 +<code pascal>
 +  Rule 1:
 +  if light_Value = BLACK and direction = BACK and angle >= 45
 +  then STOP  ​
 +  ​
 +  Rule 2:
 +  if ultrasonic_Value > 20 and direction = FORWARD
 +  then go = 1
 +   
 +  Rule 3: 
 +  if light_Value != BLACK and direction = BACK 
 +  then go = -1 
 +  ​
 +  Rule 4: 
 +  if ultrasonic_Value <= 20 and angle < 45 and direction = FORWARD
 +  then angle += 5 and rotate(5)
 +  ​
 +  Rule 5:
 +  if light_Value = BLACK and angle < 45 and direction = BACK  ​
 +  then angle += 5 and rotate(-5)
 +  ​
 +  Rule 6:
 +  if ultrasonic_Value <=20 and angle >=45 and direction = FORWARD
 +  then direction = BACK and angle = 0
 +</​code>​
 +
 +== Implementacja w prologu==
 +
 +<code prolog>
 +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.  ​
 +
 + ​{{:​pl:​miw:​2009:​picture_7.png?​250|}}
 +
 + == zapis słowny ==
 +
 +  - Jeżeli odległość od krawędzi z przodu mniejsza niż PROG to STOP
 +  - Jeżeli brak czarnej linii i kierunek TYL lub SKOS - jedz do tylu
 +  - Jeżeli brak przeszkody i kierunek PRZOD - jedz do przodu
 +  - Jeżeli czarna linia i manewr NOT STARTED to skręć o 45<​sup>​o</​sup>​ i kierunek = SKOS 
 +  - Jeżeli czarna linia i manewr STARTED i kierunek SKOS - skręć o -45<​sup>​o</​sup>​ i kierunek = TYL
 +  - Jeżeli czarna linia i manewr STARTED i kierunek TYL - kierunek = PRZOD 
 +
 + == zapis regułowy ==
 +
 +<code pascal>
 +  Rule 1:
 +  if ultrasonic_Value < 10 
 +  then STOP
 +
 +  Rule 2:
 +  if light_Value != BLACK and direction in (BACK, SLANT)
 +  then go = -1
 +
 +  Rule 3:
 +  if ultrasonic_Value > 10 and direction = FORWARD ​
 +  then go = 1 
 +
 +  Rule 4:
 +  if light_Value = BLACK and manoeuvre NOT STARTED ​
 +  then manoeuvre = STARTED and rotate(45) and direction = SLANT
 +
 +  Rule 5: 
 +  if light_Value = BLACK and manoeuvre = STARTED and direction = SLANT
 +  then direction = BACK and rotate(-45)
 +
 +  Rule 6:
 +  if light_Value = BLACK and manoeuvre = STARTED and direction = BACK 
 +  then direction = FORWARD
 +</​code>​
 +
 +== 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 ==== 
 +
 +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ń. ​
 +
 +== zapis słowny == 
 +
 +  - Jeżeli napotkasz przeszkodę z przodu to STOP
 +  - Jeżeli usłyszysz sygnał hamowania awaryjnego to zatrzymaj się i chwilę poczekaj
 +  - Jedź
 +
 + ​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>
 +
 + Rule 1:
 + if ultrasonic_Value < 10 
 + then STOP
 +
 + Rule 2:
 + if sound_Value > 40 
 + then BRAKE and WAIT(3)
 +
 + Rule 3: 
 + go = 1 
 +</​code>​
 +
 +== 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.1244712452.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