Robot śledzący linię

Cel ćwiczenia

Zapoznanie się z działaniem regulatora PID. Nauka dostrajania parametrów regulatora.

Opis teoretyczny

Wstęp

Robot śledzący trasę (,,line following robot’’ albo ,,line follower’’) jest to samobieżny pojazd autonomiczny, który potrafi rozpoznać wyznaczoną trasę i poruszać się wzdłuż niej. Trasa może istnieć fizycznie (w najprostszym wariancie linia wymalowana na podłodze, bardziej skomplikowane - wiele przecinających się różnokolorowych linii) lub być wyznaczona wirtualnie, np. z pomocą markerów magnetycznych lub laserowych.

Niektóre roboty potrafią również reagować na przeszkody. W przypadku zablokowania trasy robot rozpoznaje przeszkodę, omija ją, znajduje dalszy ciąg trasy i kontynuuje jazdę.

Roboty śledzące trasę są powszechnie używane w przemyśle (dostarczanie materiałów do stanowiska montażowego w hali produkcyjnej), logistyce (zautomatyzowane magazyny), służbie zdrowia (np. transport chorych w szpitalu, dostarczanie leków do łóżka pacjenta) a nawet usługach (automatyczne wózki zakupowe czy wózki do przewozu dzieci w centrach handlowych).

Parametry modelu

W modelu regulatora stanem układu x jest położenie robota względem linii. Sygnałem wyjściowym y jest odczyt czujnika koloru (w trybie rozpoznawania intensywności światła odbitego). Sygnałem wymuszającym r jest położenie równowagi względem linii. Sygnałem wejściowym u jest moc silników (prędkości kół). Uchybem e \((e=r-y)\) będzie odchylenie od położenia równowagi.

Rozpoznawanie linii

Śledzenie linii oznacza w praktyce, że robot śledzi granicę między linią a tłem. Położenie równowagi będzie wtedy, gdy pole obserwacji czujnika będzie obejmowało w połowie linię a w połowie tło. Tak więc wartość sygnału wymuszającego r powinna być średnią arytmetyczną pomiędzy odczytem tła a odczytem linii.

../_images/Line1.png

Poniższy pseudokod przedstawia algorytm funkcji kalibrującej położenie równowagi:

function CALIBRATE
  print "WHITE?"
  Wait for user input
  white = Read Light_Sensor

  print "BLACK?"
  Wait for user input
  black = Read Light_Sensor
  r = (white + black)/2
done function

Regulatory dwustawny i proporcjonalny

Regulator dwustawny (dwustanowy) realizuje następujący algorytm:

\[\begin{split}u = \left\{ \begin{array}{rl} u_{max}& \text{dla } e \ge 0,\\ -u_{max}& \text{dla } e < 0.\\ \end{array} \right.\end{split}\]

Algorytm głównej pętli programu dla regulatora dwustawnego (on-off) wygląda następująco:

repeat
  y = read Light_Sensor
  e = r - y
  if e < 0 then
    motor_angle = alfa
  else
    motor_angle = -alfa
  done if
done repeat

W przypadku regulatora proporcjonalnego algorytm jest jeszcze prostszy:

\[u = k_p e\]
repeat
  y = read Light_Sensor
  e = r - y
  motor_angle = k * e
done repeat

Regulator PID

Regulator PID oprócz członu proporcjonalnego P (kompensującego bieżącą wartość uchybu) zawiera również człon całkujący I (kompensujący akumulację uchybów z przeszłości) oraz człon różniczkujący D (kompensujący z wyprzedzeniem przewidywane uchyby w przyszłości):

\[u = k_p e(t) + k_I \int_0^T e(\tau)d\tau + k_D\dot e\]

Procedura optymalizacji parametrów regulatora PID

Istnieje wiele metod optymalizacji (dostrajania) parametrów \(K_p\), \(K_i\) i \(K_d\) regulatora PID. Jedną z najprostszych jest metoda ręczna (heurystyczna):

  • Ustawiamy niską wartość \(K_p\) oraz \(K_i=K_d=0\)

  • Zwiększamy stopniowo wartość \(K_p\) aż do pojawienia się oscylacji.

  • Zmniejszamy (mniej-więcej dwukrotnie) wartość \(K_p\), zwiększamy stopniowo \(K_i\) aż do osiągnięcia ,,gładkiej’’ reakcji.

  • Na końcu zwiększamy \(K_d\) aby przyśpieszyć reakcję.

Wykonanie ćwiczenia

  1. Zbuduj robota educator z czujnikiem koloru zamocowanym w pionie (strony 69-72 w instrukcji). Dopuszczalne są modyfikacje konstrukcji według własnej inwencji.

  2. Zaprogramuj robota tak, aby jechał wzdłuż krawędzi czarnej linii i zatrzymał się po dojechaniu do czerwonego pola. Wykorzystaj regulator dwustawny zgodnie z algorytmem przedstawionym w części teoretycznej.

  3. Dobierz odpowiednie parametry (prędkości silników) tak, żeby robot w jak najkrótszym czasie pokonał zadaną trasę. Zapisz najlepszy czas przejazdu w tabelce. Uwaga! Robot powinien pokonać całą trasę i zatrzymać się na czerwonej linii.

  4. Zaprogramuj robota wykorzystując regulator proporcjonalny.

  5. Dobierz odpowiednie parametry (współczynnik \(K_p\) i prędkości silników) tak, żeby robot w jak najkrótszym czasie pokonał zadaną trasę. Najlepszy czas przejazdu zapisz w tabelce.

  6. Zaprogramuj robota wykorzystując regulator PID (zgodnie z opisem implementacji przedstawionym na wykładzie).

  7. Dobierz odpowiednie parametry (współczynniki \(K_p\), \(K_i\) i \(K_d\) oraz prędkości silników) tak, żeby robot w jak najkrótszym czasie pokonał zadaną trasę. Najlepszy czas przejazdu zapisz w tabelce.

  8. Zdecyduj, który z programów (typów regulatorów) najlepiej się sprawdza i przygotuj robota do wyścigu (konkurencji z pozostałymi robotami z grupy).

  9. Po zakończeniu wyścigu, jeśli modyfikowano konstrukcję robota – doprowadź go do oryginalnego stanu.

Opis sprawozdania

Sprawozdanie z ćwiczenia powinno zawierać:

  1. Opis modyfikacji konstrukcji robota (jeśli były).

  2. Listingi programów (pliki .py i/lub .ev3) z optymalnymi wartościami parametrów.

  3. Tabelka z wynikami.

  4. Rezultaty wyścigu.

  5. Wnioski – dyskusja wyników.

Next Section - Napęd różnicowy i odometria