Skocz do zawartości
mog123

[Programowanie] Praktyczne zastosowanie regulatora PID w robotyce.

Pomocna odpowiedź

1. Wstęp

W artykule dowiemy się jak wykorzystać regulator PID do sterowania naszym linefollowerem czy minisumo. Artykuł stawia na jego praktyczne wykorzystanie, bardziej jak teorię, której w internecie jest pełno. Założeniem artykułu jest by był prosty, zwięzły i zrozumiały dla wszystkich.

2. Teoria

Niestety bez odrobiny teorii się nie obejdzie.

Rys 1. Wzór regulacji PID

Regulator PID opiera się o trzy człony - wzmocnienie, całkowanie i różniczkowanie uchybu. Czemu uchybu? Regulator zamiast używać sygnału zadanego jako wartość wykorzystuje pętle sprzężenia zwrotnego aby uchyb stopniowo zmniejszać i doprowadzić go do zera, tak by sygnał zadany pokrył się z sygnałem na wyjściu. Każdy z poszczególnych członów regulatora ma swoje wyspecjalizowane zadanie.

Rys 2 i 3. Struktura PID

Wzmocnienie (Proportional) P - Postawowy człon regulatora, sprowadza sygnały do właściwych poziomów.

Całkowanie (Integral) I - Całkuje uchyb, sprowadzając go do zera.

Różniczkowanie (Derivative) D - Reaguje na zmiany uchybu w czasie, chcąc "przewidzieć" jego zachowanie.

W praktyce przyjęły się cztery "struktury" regulatora PID:

Regulator P, PD, PI, PID.

3. Zastosowanie

Skupimy się na wykorzystaniu regulatora PID do sterowania napędami poprzez PWM, za pomocą odczytu z analogowych czujników linii(dla linefollowera), bądź analogowych czujników odległości(dla minisumo).

❗ Zastanówmy się:

❓ Co jest naszym sygnałem zadanym?

- W przypadku minisumo - Zlokalizowanie przeciwnika na wprost przed nami

- W przypadku linefollowera - Utrzymanie środka linii którą śledzimy

❓ Co jest naszym uchybem?

- W przypadku minisumo - Przeciwnik na lewo/prawo od środka naszego "wzroku"

- W przypadku linefollowera - Przesunięcie linii na lewo/prawo od naszych środkowych czujników.

❓ Co jest naszym sprzężeniem zwrotnym?

- W przypadku minisumo - Czujniki odległości

- W przypadku linefollowera - Czujniki linii.

❓ Co jest naszym sygnałem wyjściowym?

- W przypadku minisumo - Dopasowanie naszej pozycji względem przeciwnika za pomocą napędów

- W przypadku linefollowera - Dopasowanie naszej pozycji względem linii za pomocą napędów

Jak to przełożyc na sterowanie? Oto prosty algorytm PID dla linefollowera/minisumo napisany w C:

Nalezy najpierw dokonać definicji wzmocnień(za X wstawamy wartości):

#define wzmocnienieP	X	//Wzmocnienie
#define stalaI		  X	//Stała czasowa całkowania
#define stalaD		  X	//Stała czasowa różniczkowania
#define czas			X	//Czas zmian wielkości
#define predkosc		X	//Prędkość silników

Następnie deklarujemy zmienne:

unsigned char left = 0, right = 0;		// Odczyty z czujników
int sterowanie = 0,uchyb,uchyb_pop;	//sygnał sterujący, uchyb, uchyb poprzedni

Po odczytaniu wartości naszych czujników(odczyt jest przykładowy! Obsługa ADC nie jest treścią tego artykułu):

left = ReadADC(LeftSensor);
right = ReadADC(RightSensor);

Możemy obliczyć uchyb:

uchyb=-(left - right);

Aby obliczyć wartość, którą będziemy sterować naszymi napędami:

sterowanie =wzmocnienieP*uchyb + stalaD*((uchyb-uchyb_pop)/czas) + stalaI*calka(uchyb);

❗ (użyto wyżej funkcji całkującej która jest tylko reprezentatywna, aby dowiedzieć się więcej o algorytmie całkowania, należy doczytać o całkowaniu metodą prostokątów lub trapezów) ❗

Po wyznaczeniu sygnału sterującego możemy przejść do ustawienia prędkości na napędach(jak wyżej, ustawienie PWM należy obsłużyć samemu):

SetLeftPWM(predkosc - sterowanie);
SetRightPWM(predkosc + sterowanie);

Jeżeli stosujemy człon D, to musimy obliczyć uchyb poprzedni, w tym przypadku już wykorzystaliśmy nasz uchyb aktualny więc zamienia się go na poprzedni.

uchyb_pop=uchyb;

4. Dobór nastaw, porady

Dobór nastaw to sprawa najtrudniejsza przy budowie takiego regulatora(ze względu na małe możliwości pomiarowe w robocie), ale ich optymalny dobór pozwala na wykorzystanie jego pełnych możliwości.

Przy doborze należy kierować się kilkoma podstawowymi zasadami:

wzmocnienieP - dobieramy na podstawie wychyleń naszego robota, jeżeli robot "automatycznie" nie przechodzi do okolic wartości zadanej, to znaczy że jego wzmocnienie jest za małe, jeżeli robot oscyluje, to wzmocnienie jest za duże.

stalaD - dobieramy na podstawie szybkości zmian wielkości wejściowej (szybkość zmian pomiaru czujnika), jeżeli czujnik mierzy wartość wejściową co 50ms to stalaD wynosi 0.05

stalaI - dobieramy na podstawie okresu zmian.

Pomiędzy stalaI a stalaD jest pewna zależność która pomaga je zadeklarować:

stalaI>=4*stalaD

jest ona jednak tylko pomocnicza. Stosuje się ją jako metodę naprowadzenia do doboru odpowiednich nastaw a nie sztywnej zasady której trzeba się trzymać.

czas - czas zmian wielkości - czas trwania jednej pętli programowej - łatwa do pomiaru

predkosc - tutaj definiujemy prędkość z jaką chcemy by nasz robot podążał gdy uchyb jest zerowy. Należy uważać na wyższe prędkości gdyż będą ucinać większość naszego sterowania, np. przy prędkości równej 255 i sterowaniu równym 50 będziemy próbowali ustawić lewy PWM na 205 a prawy na 305, co raczej się nie powiedzie(305 zamieni na 49). Można tutaj zastosować filtr przeciwnasyceniowy tj. zwykły if(), który wszelkie wielkości większe od 255 zamieni na 255. Dobrą prędkością do testów jest prędkość z zakresu 101-127 (40-50% pełnego PWM).

Osobiście polecam zastosowanie samego regulatora PD który nie sprawia kłopotów przy projektowaniu, zajmuje mniej czasu obliczeniowego procesora i całkowicie wystarcza do linefollowera czy minisumo.

5. Załączniki

W załączniku plik C z przedstawionym wyżej algorytmem.

PID.c

Udostępnij ten post


Link to post
Share on other sites

Szczerze to poziom tego artykułu jest niesamowicie niski. Dodatkowo to co napisałeś o członie D, to jakieś masło maślane:

stalaD - dobieramy na podstawie szybkości zmian wielkości wejściowej (szybkość zmian pomiaru czujnika), jeżeli czujnik mierzy wartość wejściową co 50ms to stalaD wynosi 0.05
czas - czas zmian wielkości - czas trwania jednej pętli programowej - łatwa do pomiaru

Z tych zapisów ja wywnioskowałem, że obydwie liczby są sobie równe, ponieważ czujnik mierzy raz na pętlę programu. Fakt, że to szczególny przypadek, ale w moich lfr'ach tak właśnie jest 🙂.

Co do członu I to poszedłeś bardzo na skróty.

Ja znam zupełnie inne równania członów D oraz I, i z tego co widziałem to w większości są właśnie te używane przeze mnie. Podsumowując, nie przekazałeś zbyt dużej wiedzy tym artykułem. Jestem w stanie znaleźć więcej w wikipedii czy necie, niż w tym artykule.

Udostępnij ten post


Link to post
Share on other sites

Sabre ma rację, więcej zrozumiałem z artykułu o PID'zie po Angielsku niż z Twojego.

Udostępnij ten post


Link to post
Share on other sites
Szczerze to poziom tego artykułu jest niesamowicie niski. Dodatkowo to co napisałeś o członie D, to jakieś masło maślane:
stalaD - dobieramy na podstawie szybkości zmian wielkości wejściowej (szybkość zmian pomiaru czujnika), jeżeli czujnik mierzy wartość wejściową co 50ms to stalaD wynosi 0.05
czas - czas zmian wielkości - czas trwania jednej pętli programowej - łatwa do pomiaru

Z tych zapisów ja wywnioskowałem, że obydwie liczby są sobie równe, ponieważ czujnik mierzy raz na pętlę programu. Fakt, że to szczególny przypadek, ale w moich lfr'ach tak właśnie jest 🙂.

Co do członu I to poszedłeś bardzo na skróty.

Ja znam zupełnie inne równania członów D oraz I, i z tego co widziałem to w większości są właśnie te używane przeze mnie. Podsumowując, nie przekazałeś zbyt dużej wiedzy tym artykułem. Jestem w stanie znaleźć więcej w wikipedii czy necie, niż w tym artykule.

Źle wywnioskowałeś, czytanie ze zrozumieniem się kłania. Czas a stalaD to są różne wielkości. przykładowo, pętla programowa może wykonywać się 1ms a czujniki moga mierzyć wielkości co 50ms (jak to jest w przypadku np sharpów).

Używałem tego algorytmu jako regulator PD i nie sprawiał problemów.

Co do poziomu artykułu, powiedz co Ci się nie podoba. to że z członem I poszedłem na skróty? Ok, przygotuję funkcje obliczającą całkę.

Chcę jeszcze nadmienić iż artykuł będzie modyfikowany, mam zamiar dodać informacje o kaskadzie sterującej jak i innej metodzie doboru nastaw.

Nie można wiele powiedzieć o regulacji PID nie zagłębiając się w wiedzę o transmitancji operatorowej i widmowej, transformacie Laplace'a. Dobór nastaw regulatora przy praktycznie nieznanym obiekcie również jest niezbyt łatwy.

[ Dodano: 17 Cze 10 04:05 ]

Sabre ma rację, więcej zrozumiałem z artykułu o PID'zie po Angielsku niż z Twojego.

Aż chce się krzyczeć do niebios. Nie miałeś się tutaj dowiedzieć o regulatorze PID a o tym jak go wykorzystać z minimum wiedzy, słyszałeś kiedyś o terminie "na skróty"?

Nie posiłkowałem się żadnymi publikacjami, bo po co? Wszystko to co tu napisałem jest _minimalistyczne_ i służy do implementacji PID bez zagłębiania się w niezbyt przyjemną dla początkujących wiedzę naukową.

Udostępnij ten post


Link to post
Share on other sites
Źle wywnioskowałeś, czytanie ze zrozumieniem się kłania.
Aż chce się krzyczeć do niebios.

mog123, po co krzyczeć? Nie rozumiesz pewnych podstawowych zasad. Ty piszesz artykuł, inni go czytają i oceniają. Mnie nie przypadł zbytnio do gustu, Sabre raczej też. Trochę odporności na krytykę, bo nikt ci nie robi na złość.

Udostępnij ten post


Link to post
Share on other sites
Źle wywnioskowałeś, czytanie ze zrozumieniem się kłania.
Aż chce się krzyczeć do niebios.

mog123, po co krzyczeć? Nie rozumiesz pewnych podstawowych zasad. Ty piszesz artykuł, inni go czytają i oceniają. Mnie nie przypadł zbytnio do gustu, Sabre raczej też. Trochę odporności na krytykę, bo nikt ci nie robi na złość.

Chce się krzyczeć bo krytykujecie nie na temat, zarzucacie że artykuł za słabo zapoznał was z regulatorem PID, on taki miał być - miał wprowadzić do jego wykorzystania, pokazać przykładowy kod, bo z tym ludzie najczęściej mają problemy. Na diodzie był już artykuł o PID, tam człowiek rzucał transmitancjami, pokazywał zalety PID, przebiegi po odpowiednim dobraniu nastaw co na praktykę miało przełożenie bardzo niskie. Tutaj jest odwrotnie, narzekacie na brak wartości merytorycznych mimo iż w założeniach artykułu wyraźnie pisze że ma on być zwięzły i jedynie pokazać jak go zaimplementować.

Udostępnij ten post


Link to post
Share on other sites

Witam.

Temat spłyciłeś jakbyś zastosował zwykłą kostkę rosołową a nie bulion winiary 😋

(..) Nie miałeś się tutaj dowiedzieć o regulatorze PID a o tym jak go wykorzystać z minimum wiedzy, słyszałeś kiedyś o terminie "na skróty"?

Nie posiłkowałem się żadnymi publikacjami, bo po co? Wszystko to co tu napisałem jest _minimalistyczne_ i służy do implementacji PID bez zagłębiania się w niezbyt przyjemną dla początkujących wiedzę naukową.

Skoro nic nie wiesz o czymś to jak chcesz tego używać?

Dlaczego nie posiłkowałeś się żadnymi publikacjami? W końcu przecież one są i mozna je wykorzystać.

Przesadny minimalizm też nie jest dobrym rozwiązaniem.

Temat Twojego artykułu to "Praktyczne zastosowanie regulatora PID w robotyce"

A pierwszą podstawową trudnością jaką napotyka osoba chcąca praktycznie wykorzystać regulator PID (zakładając, że już co nieco o nim wie i wie jak wygląda algorytm) to wstępne nastawy regulatora, które potem oczywiście można optymalizować.

Wstępne nastawy dla dowolnej konfiguracji (P, PI, PD, PID) można znaleźć w dowolnej książce z podstaw automatyki.

Kolejną ważną informacją jest omówienie przeregulowania, co to jest i jak je zaobserwować.

Twój artykuł byłby dużo bardziej wartościowy jakbyś to zrobił na konkretnym przykładzie. Można pominąć element akwizycji danych pomiarowych, ale sama implementacja algorytmu z wyjaśnieniami (język dowolny ale z praktycznego punktu widzenia proponowałbym BASCOMA).

Szczerze mówiąc w chwili obecnej ten artykuł nie kwalifikuje się do konkursu bo po prostu nic nie wnosi. Takie jest moje zdanie.

Udostępnij ten post


Link to post
Share on other sites
Skoro nic nie wiesz o czymś to jak chcesz tego używać?

Nie wiesz jak działa telewizor a go używasz, to samo da się zrobić z regulatorem.

Wstępne nastawy dla dowolnej konfiguracji (P, PI, PD, PID) można znaleźć w dowolnej książce z podstaw automatyki.

Oświeć mnie i podaj te magiczne wartości. No chyba że chodzi Ci o Zieglera-Nicholsa czy wzmocnienie krytyczne które wymagają wiedzy o transmitancji lub przeprowadzenia rzędów pomiarów i wykreślenia ich na wykresie(a jak się założę nawet Ci najbardziej zapaleni tutaj tego nie robili). Tyle razy czytałem tutaj wypowiedzi osób, które miały zero pojęcia o elektronice, a budowały swoje linefollowery i chciałyby się dowiedzieć jak dodać im regulator PID i do nich właśnie jest ten artykuł. Waszym problemem jest że patrzycie na ten artykuł z pewną dozą wiedzy, którą uważacie za całkowicie niezbędną, nawet dla zupełnego laika, który w głowie ma tylko "ciekawe jak mój robot będzie jeździł z regulatorem PID".

Kolejną ważną informacją jest omówienie przeregulowania, co to jest i jak je zaobserwować.

Twój artykuł byłby dużo bardziej wartościowy jakbyś to zrobił na konkretnym przykładzie. Można pominąć element akwizycji danych pomiarowych, ale sama implementacja algorytmu z wyjaśnieniami (język dowolny ale z praktycznego punktu widzenia proponowałbym BASCOMA).

Konkretny przykład? Masz robota, włóż swój kod inicjalizujący, wywal swoje if'y którymi sterujesz i wrzuć ten kod a będziesz miał swój konkretny przykład. Naprawdę, moim celem było tutaj tylko aby użytkownik mógł przeczytać artykuł, zobaczyć kod, wkleić go do siebie i doczytał te kilka informacji, które napisałem.

Podsumowując - najwyraźniej wiecie zbyt wiele by taki artykuł się wam przydał. Rozumiem takie podejście - też nie czytam artykułów na tematy w których jestem obeznany i jedynie wytykam w nich błędy. Dlatego zaczekajmy na opinie kogoś kto ma już swojego linefollowera i bedzie próbował zaimplementować mu PID.

Udostępnij ten post


Link to post
Share on other sites

Mógłbym w kilku zdaniach opisać zastosowanie i użycie pełnego algorytmu PID w Bascomie, ale tego nie zrobię, przynajmniej nie w twoim temacie. Używam PIDa w swoich linefollowerach od ponad roku. Gdy pisałem swój algorytm, opierałem go na informacjach z netu. Już z doświadczenia mógłbym napisać w kilku zdaniach jak dobrać wartości nastaw na podstawie obserwacji robota podczas jazdy.

Prawda jest taka, że wiedza, którą tu przytoczyłeś jest nie do zastosowania dla większości osób z forum. I wcale nie trzeba wiedzieć co to transmitancja, całka i różniczka aby zastosować i używać algorytm PID. Twój artykuł w niczym nikomu nie pomoże niestety.

Udostępnij ten post


Link to post
Share on other sites
Nie wiesz jak działa telewizor a go używasz, to samo da się zrobić z regulatorem.

Bardziej odpowiednia analogia to "nie wiesz jak działa telewizor, a chcesz go zbudować". Tematyka artykułu bardzo przydatna, ale o wiele obszerniejsza niż to przedstawiłeś. Moim zdaniem nie chodzi tylko o to, żeby "sklonować" gotowe rozwiązanie, ale przede wszystkim zrozumieć na jakiej zasadzie funkcjonuje. Mógłbyś rozwinąć nieco artykuł, wzbogacić go o więcej przykładów i teorii... Publikacje po to są, żeby nie wyważać szeroko otwartych drzwi - warto z nich skorzystać przy opracowywaniu tematu..

PS Krytyka w tym temacie jest konstruktywna, nie ma sensu obrażać się i fukać na wszystkich. Tak ciężko dopisać/poprawić kilka rzeczy? Twój artykuł zyska na wartości i wszyscy będą zadowoleni.

Udostępnij ten post


Link to post
Share on other sites
Mógłbym w kilku zdaniach opisać zastosowanie i użycie pełnego algorytmu PID w Bascomie, ale tego nie zrobię, przynajmniej nie w twoim temacie. Używam PIDa w swoich linefollowerach od ponad roku. Gdy pisałem swój algorytm, opierałem go na informacjach z netu. Już z doświadczenia mógłbym napisać w kilku zdaniach jak dobrać wartości nastaw na podstawie obserwacji robota podczas jazdy.

Prawda jest taka, że wiedza, którą tu przytoczyłeś jest nie do zastosowania dla większości osób z forum. I wcale nie trzeba wiedzieć co to transmitancja, całka i różniczka aby zastosować i używać algorytm PID. Twój artykuł w niczym nikomu nie pomoże niestety.

Super, cieszy mnie twoja wiedza i umiejętność jej zastosowania. Szkoda że ja nigdy nie używałem regulatora PID. Widzę iż żadnemu uzytkownikowi nie przyda się ten artykuł, więc w sumie można go usunąć.

PS Krytyka w tym temacie jest konstruktywna, nie ma sensu obrażać się i fukać na wszystkich. Tak ciężko dopisać/poprawić kilka rzeczy? Twój artykuł zyska na wartości i wszyscy będą zadowoleni.

Najpierw zakładają że to źle że tak mało teorii, potem gdy im udowadniam że o to chodziło, zaczynają mi mówić że za artykuł jest po prostu słaby, gdzie tutaj konstruktywna krytyka? Nie chce mi się nawet dla takich ludzi nic poprawiać. Miałem opisać kaskadę sterującą, przełączanie regulatorów czy eliminacja nieliniowości ale najzwyczajniej nie widzę już sensu, bo dla wielu sposób w jaki to wszystko piszę jest po prostu niewystarczający i zbyt spłycony.

Udostępnij ten post


Link to post
Share on other sites

Miałem opisać kaskadę sterującą, przełączanie regulatorów czy eliminacja nieliniowości ale najzwyczajniej nie widzę już sensu, bo dla wielu sposób w jaki to wszystko piszę jest po prostu niewystarczający i zbyt spłycony.

Wrzuć to do jednego artykułu i zupełnie inaczej będzie to wyglądać :]

PS Jak coś oscyluje, to jest właśnie idealny moment, żeby się przyglądnąć stałej k i na jej podstawie policzyć resztę :]

Udostępnij ten post


Link to post
Share on other sites
Oświeć mnie i podaj te magiczne wartości. No chyba że chodzi Ci o Zieglera-Nicholsa[\quote]

Te wartości są w książce a nie chce mi się ani nie mam czasu ich szukać zwłaszcza, że nie mam pod ręką żadnej książki z PA. Możliwe, że się tak nazywają.

A mając jakieś konkretne wartości początkowe, nawet dla układu innego rzędu, łatwiej jest je zmodyfikować, niż wymyślać kilka wartości z kosmosu.

Naprawdę, moim celem było tutaj tylko aby użytkownik mógł przeczytać artykuł, zobaczyć kod, wkleić go do siebie

Jaki kod? nie umieściłeś żadnego kodu.

A dla początkującego większy pożytek będzie z jakiegoś gotowca, w którym dobierze sobie odpowiednio wartości współczynników. Wystarczyłoby zaznaczyć, że w przypadku korzystania z Twojego kodu w komentarzu umieścić, że kod napisany na podstawie ...

W przypadku prezentowania robota wraz z kodem.

Jak na razie każdy chce Ci pomóc, aby ten artykuł reprezentował jakiś poziom.

Ale Ty się zapierasz rękami i nogami.

Z niecierpliwością czekam na pierwszego forumowicza, który stwierdzi, że zrobił LFa z PIDem na podstawie Twojego artykułu.

Udostępnij ten post


Link to post
Share on other sites

Jak dla mnie to ten artykuł prowadzi jednak do zrozumienia jak dołożyć pid'a do swojego robota, ale jest mało uniwersalny dla laików. Dodaj bardziej rozbudowane komentarze do linijek kodu z wyczerpującymi wyjaśnieniami(co, jak, dlaczego) i już będzie o wiele lepiej.

Udostępnij ten post


Link to post
Share on other sites

mog123, nie przejmuj się tymi komentarzami, jak dla mnie to ten artykuł jest świetny. Mógłbyś jednak napisać więcej o dobieraniu wartości stałych bo z tym mam problem.

Dobra robota oby tak dalej.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...