Skocz do zawartości

PID do trójkołowca?


Nemo

Pomocna odpowiedź

Witam 🙂

Właśnie zbudowałem swojego pierwszego linefollowera i mam problem z 'ujarzmieniem' tego tworu..

A mianowicie, czy ma sens zastosowanie sterowania PID lub PD przy trójkołowcu, gdzie kierunkiem steruje tylko przednie koło skrętne?

Jeśli tak, to prosiłbym o kawałek kodu lub pomoc w ustaleniu wartości współczynników regulatora.

Programuję w Bascomie i przejrzałem już naprawdę sporo artykułów na temat sterowania linefollowerów regulacją PID lecz robot ciągle jeździ zygzakiem, co baaaardzo ogranicza jego prędkość..

Schemat robota wygląda mniej więcej tak:

Pozdrawiam!

Link do komentarza
Share on other sites

Może napisz co już masz, czy masz algorytm PID zaimplementowany? Czy tylko chcesz pomocy przy ustawieniu wzmocnień? Ja ustawiając wzmocnienia w PID do mojego Psotka2 w dużej mierze korzystałem z tej stronki. Jak zadasz bardziej konkretne pytania to bardziej pomogę, gotowca ci nie dam bo w swoim kodzie mam bardzo dużo własnych rozwiązań, którymi narazie nie będę się dzielił.

  • Lubię! 1
Link do komentarza
Share on other sites

Doskonale Cię rozumiem, wiem ile trzeba się namęczyć przy napisaniu dobrego algorytmu..

Z samym PIDem walczę 2 tygodnie i jak na razie jest ciężko 😋

Algorytm wziąłem również z tej stronki którą podałeś, i wygląda to u mnie tak:

po sczytaniu wartości z czujników i ustaleniu zmiennej Pozycja (całkowite od -5 do 5):

  Error = 0 - Pozycja
  Prop = Kp * Error                                        'Oblicz Człon P

  Integral = Integral + Error                              'Oblicz Człon I
  Integral = Integral * Ki

  Rate = Error - Difflast                                  'Oblicz Człon D
  Deriv = Rate * Kd

  Difflast = Error

  Control = Prop + Deriv                                   'Nowa wartość zmiennej Control
  Control = Control + Integral


  If Control > 50 Then Control = 50                        'Ogranicz Control
  If Control < -50 Then Control = -50

  Temp = Kierunek_zero - Control
  Myint = Temp                                             'Konwertuj Single na Integer
  Kierunek = Myint                                         'Ustaw pozycje serwa

  Waitms Opoznienie                                        'Domyślnie 5 ms

Chodzi mi głównie o to, czy do takiego pojazdu z jednym kołem skrętnym wystarczy algorytm PID i będzie taki sam jak np. w Twoim Psotku2 ze sterowaniem 2 kołami co daje praktycznie zerowy promień skrętu? Bo nie wiem, czy ustawianie wzmocnień 'na czuja' ma w ogóle sens, skoro algorytm może być błędny i nic nie wnosić do poprawy sterowności.

Link do komentarza
Share on other sites

PID wnosi bardzo dużo do płynności sterowania, nie wiem jak będzie w przypadku twojego serwa, nie napisałeś czy to serwo przerobione czy nie. Obejrzyj filmiki w temacie o moim Psotku2 a przekonasz się ile daje dobrze wyregulowany PID, choć i tak uważam, że mogłoby być znacznie lepiej.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Serwo nie jest przerobione, przednie koło jest podłączone na sztywno i promień skrętu prawie 180 stopni jest wystarczający, więc nie potrzeba przerabiać, chyba, że w jakimś innym celu? jak na razie Kp=8 Ki=0.2 Kd=0.6 i jeździ zygzakiem na najmniejszej prędkości..

Link do komentarza
Share on other sites

Ogółem uważam, że serwo jest ciut za wolne do tego celu...choć to zależy w głównej mierze od prędkości rozwijanych przez Twojego robota. Popatrz na konstrukcje przegubowców, tam jest dość zbliżone rozwiązanie...a PIDa na pewno da się zaimplementować 🙂 Nie wiem tylko, czy jest to optymalne dla takiej konstrukcji...

Link do komentarza
Share on other sites

No właśnie zastanawiałem sie nad winą zbyt wolnego serwa.. Żeby je przyspieszyć podaje już napięcie 6,5V, ale i tak chyba niewiele to daje. Pozostaje mi rozwiązanie tego problemu kwestią dobrego algorytmu. A co do prędkości, to maksymalnie wynosi prawie 30 km/h, bo lf napędzany jest silnikiem z autka rc, także potencjał ma ogromny. Macie może jakieś własne metody wyznaczenia wzmocnień dla PIDu, albo może jakieś dodatkowe patenty, które można wykorzystać w algorytmie? No i czy w ogóle ten kawałek alg PID, który napisałem jest poprawny?🙂

Pozdrawiam!

Link do komentarza
Share on other sites

Algorytm jest ok, ale według mnie wina nie leży w złych nastawach wzmocnień tylko w niedoskonałości sposobu określenia pozycji lfr'a względem linii za pomocą zmiennej Pozycja, która przybiera względnie mało wartości co niejako wymusza skoki, gdyby Pozycja miała wartości z zakresu powiedzmy -2000 +2000 wtedy przejście byłoby płynniejsze. Nie wiem jak ty określasz zmienną Pozycja, tzn jak przypisujesz jej wartości z zakresu -5 +5 na podstawie wskazań czujników. Ja u siebie w Psotku2 wrzucam do PIDa wartości ADC na czujnikach ale jako sumę, powiedzmy prawa strona od linii idzie z plusem, lewa z minusem (nie pamiętam czy tak jest ale to jest mało ważne). Więc u mnie zakres, nawet nie wymuszony przy 10-cio bitowym ADC, jest od -1023 do +1023. Wymuszony przez soft jest od -2000 do +2000 (po 1000 na każdy czujnik). Środkowy czujnik w zasadzie nie jest uwzględniany do algorytmu PID. Można robić sztuczkę na zmiennej Pozycja, tzn. docelowo aby błąd był równy 0, Pozycja musi być równa 0, ale jak robot zjedzie pod zewnętrzny czujnik to można docelową Pozycję przypisać nie 0 tylko powiedzmy 2, wtedy robot nie ma skoku, gdy zjedzie już w stronę linii i załapię linię czujnik bliżej środka, wtedy można docelową pozycję przyjąć jako 0.

Mam nadzieję, że nie namotałem. Miałem pisać arta o PIDzie w Bascomie dla lfr'a, ale z powodu braku czasu i pewnych autorskich rozwiązań zastosowanych w moim kodzie chwilowo odszedłem od tego pomysłu. Jak przetestuję nowe rozwiązanie to z chęcią opiszę i podzielę się starym, czyli aktualnie używanym w Psotku2, Strider będzie zawierał już nowe rozwiązanie obsługi czujników w PID 🙂.

Link do komentarza
Share on other sites

Zmienną pozycja określam na podstawie bitowego obrazu stanu czujników, np.

10000 - Pozycja=-4

00100 - Pozycja= 0

00001 - Pozycja= 4

I to rzeczywiście powoduje niezłe skoki.

Dzięki za pomysł z bezpośrednim użyciem odczytów z ADC, zaraz coś pokombinuję, ale muszę jeszcze zrobić autokalibrację, bo czujniki niestety nie dają identycznych wartości dla tych samych kolorów.

A artykuł rzeczywiście by się przydał, bo początkujący konstruktorzy linefollowerów nie tyle mają problem z napisaniem samego programu, ale z wymyśleniem na czym to sterowanie ma polegać i ewentualnie jakie patenty można zastosować chociaż w teorii, oprócz zwykłego sterowania liniowego "zigzag" i PIDu:)

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.