Popularny post Treker (Damian Szymański) Napisano Sierpień 7, 2011 Popularny post Udostępnij Napisano Sierpień 7, 2011 Witam wszystkich czytelników. Artykuł ten powstał z powodu wielu próśb jakie otrzymywałem na PW, aby objaśnić poszczególnym osobom jak można zacząć swoją przygodę z PID’em w robotach podążających za linią. Już na wstępie chciałbym Wszystkich uprzedzić, że nie czuje się ekspertem w tej tematyce – wręcz przeciwnie, sam mam bardzo małe doświadczenie z PID, dlatego moje podejście do tematu będzie trochę odmienne od tego prezentowanego w podobnych artykułach (ja opiszę to okiem praktyka). Po pierwsze nie spotkacie tutaj żadnych definicji lub skomplikowanych obliczeń matematycznych, a to z wręcz banalnego powodu. Sam ich nie znam i niebyły mi prawie wcale potrzebne do opanowanie tego zagadnienia na tyle, abym potrafił napisać program do robota, który jako tako płynnie będzie pokonywał wyznaczoną trasę. Artykuł ten kieruję do początkujących, którzy nie mają kompletnie żadnego lub posiadają bardzo małe pojęcia o PID. Doświadczonych użytkowników również proszę o pozostawienie komentarza, może dzięki temu sam nareszcie poznam dokładniej ten mechanizm 😉 Zapraszam do lektury. Jest to pierwsza część, w której omówię wyłącznie człon P. Jak można sterować linefollowerem? Najczęściej wszystko zaczyna się tak jak opisał to Sabre w swoim artykule, pierwszy jest prosty line follower sterowany analogowo - dwa czujniki i nerwowe skręty w prawo i lewo, tylko aby utrzymać się na trasie. Później powstaje prosta konstrukcja sterowana przez mikrokontroler, która ma więcej niż 3 czujniki i zachowuje się już trochę mniej nerwowo. Pierwszym krokiem jest napisanie programu na if'ach, o ile przy 3 czujnikach może mieć to jeszcze jakiś sens, to przy czterej czujnikach mamy 2*2*2*2=16 możliwych stanów linijki czujników, a opisanie ich wszystkich w rozsądny sposób nie będzie łatwe. Później wpadamy na genialny pomysł i nagle 16 if'ów przerabiamy na program oparty o instrukcje selekt...case. No dobrze, tutaj rozpisanie całości będzie już sporo łatwiejsze, ale co dalej? Wiadomo, że każdy warunek oznacza, że linia jest aktualnie w jakimś konkretnym miejscu pod robotem, a my musimy na to zareagować zmieniając siłę lub/i kierunek obrotów poszczególnych silników. Oczywiście można dobrać doświadczalnie wartości do każdego przypadku, ale raz że jest to bardzo mozolne i w sumie skuteczność tego rozwiązania zależy od poziomu skomplikowania trasy, po której jedziemy. Po drugie - co gorsze, zmiana prędkości docelowej z jaką chcemy, aby poruszał się robot niszczy praktycznie wszystkie nasze poprzednie próby i wyliczenia. Jeśli utknęliście w tym miejscu to chyba najwyższa pora przejść na coś lepszego - PID. Co nam daje PID? Nazwałbym to swego rodzajem zdecydowanym uproszczeniem programu oraz znaczną elastycznością gotowego "efektu", ponieważ tak zaprogramowany robot poradzi sobie z różnymi trasami, niezależnie od tego czy przewidzieliśmy w programie każdy jej element (oczywiście zachowując zdrowy rozsądek przy tworzeniu trasy). Zmiana prędkości docelowej czy sposobu reakcji robota na linię jest łatwiejsza i nie niszczy naszej wcześniejszej pracy. Jedyne co może nam zaszkodzić to zmiana napięcia jakim zasilimy silniki. Zaczynamy Koniec tego marudzenia i przydługiego wstępu. Najpierw musimy zmienić swoje podejście, od tej pory czujników nie traktujemy jako swego rodzaju "tablicy" odczytów, bezpośrednio i na stałe połączonych ze zmianami wprowadzanymi do napędu - od teraz czujniki pozwalają nam na odczyt gdzie robot znajduje się względem linii. Dalej tak zdobyte informacje przeliczymy dopiero zależnie od aktualnej sytuacji na zamianę, którą wprowadzimy do napędu. Po drugie do silników nie podajemy na stałe dobranych wartości względem odczytów czujników, niezależnie od tego co faktycznie dzieje się z robotem. Dla uproszczenia opisów stwórzmy sobie „wirtualny model robota na, którym będę opierał się dalej. W moim przypadku będzie to konstrukcja jakich wiele ostatnio u nas, z tyłu dwa silniki z Pololu, z przodu ballcaster, a jeszcze dalej z przodu 7 czujników ustawionych w linii prostej, w równych odległościach od siebie. Zapytacie dlaczego 7? Odp.: Bo tak sobie założyłem 😉 Używając PID'a nie ma różnicy ile mamy czujników 1 (tak, też wystarczy) czy 20 albo i więcej, zawsze zasada będzie taka sama. Od ilości czujników oczywiście zależy to z jaką dokładnością będziemy mogli podążać za linią. Przeważnie im mam ich więcej tym szybciej będziemy mogli jeździć. Pierwszy człon - P Człon P (ang. proportional). Człon ten odpowiedzialny jest za obliczenie aktualnego błędu położenia. Jak to robimy? Tak jak wspomniałem wyżej zakładamy, że mamy 7 czujników, dlatego środkowym u nas ma numer 3, ale na potrzeby PID'a numerujemy je od -3 do 3, tak jak na rysunku poniżej: Jak widać, czujnik środkowy ma wartość 0, a im dalej od środka znajduje się linia tym numer, a raczej waga czujnika jest wyższa. Inaczej mówiąc, gdy będziemy pod 1 to skręcimy zdecydowanie łagodniej niż będąc pod 3. Jak liczymy błąd? Wybieramy sobie zmienną, która będzie przetrzymywała pozycję docelową jaką ma osiągnąć naszego robota u nas jej wartość to 0. Następnie błąd liczymy tak: Error = 0 - Aktualna_pozycja Ale jak policzyć aktualną pozycję? Oczywiście można ograniczyć się do ręcznego ustawienia na sztywno wartości dla czujników, ale nie można przewidzieć przecież wszystkich kombinacji. Dlatego najlepiej robić to w następujący sposób. Odczytujemy pod, którymi czujnikami jest linia i sumujemy wagi tych czujników. Załóżmy, że robot wyjechał bardzo krzywo z zakrętu, przykład: Dla takiej sytuacji suma wynosi 2 +3 = 5, następnie otrzymaną sumę dzielimy przez ilość czujników pod którymi była linia, czyli w naszym przypadku 2. Otrzymujemy wynik 2,5 i to jest nasza uśredniona aktualna pozycja, którą używamy dalej do obliczeń. Wyliczamy z tego błąd: Error = 0 -2,5 = -2,5 Można też przyjąć, że błąd jest równy: Error = 0 +2,5 = 2,5 Kwestia znaku i przyjęcia jednej z zasad - ja będę trzymał się tej drugiej. Błąd 2,5 oznacza, że jesteśmy oddaleni od linii na prawo o 2,5 naszej jednostki, czyli powinniśmy przyspieszyć lewymi kołami. No dobrze, ale jak taką wartość przeliczyć na zmianę wartości PWM? Posłużę się tutaj pseudokodem: Kp = 10 //Współczynnik Kp Docelowa = 0 //Pozycja docelowa Tp = 50 //Docelowa prędkość robota Do //Pętla nieskończona Odczytaj pod, którymi czujnikami jest linia Policz aktualną pozycję Błąd = Docelowa + Aktualna pozycja Zmiana = Kp * błąd //Liczymy wartość zmiany PWM Silnik_L = Tp + Zmiana // Przekazujemy do silnika lewego nową prędkość Silnik_p = Tp - Zmiana // Przekazujemy do silnika prawego nową prędkość Loop //Koniec pętli W powyższym kodzie pojawiła się zmienna Kp, to właśnie dzięki niej możemy regulować czułość z jaką robot będzie reagował na linię. Jak dobrać tę wartość? Ogólnie zasada jest prosta Kp razy maksymalny błąd pod odjęciu lub po dodaniu naszej prędkości docelowej musi mieścić się w zakresie jaki obsługuje nasz PWM, czyli na przykład 0-255. Powyższy kod to tylko schemat działania w rzeczywistości można go trochę rozbudować i wręcz konieczne jest dodanie warunków sprawdzających ostatecznie czy wprowadzane zmiany do PWM nie przepełnią jego wartości. Dlatego w najprostszej postaci można zrobić to tak: Kp = (Max_PWM - Tp)/maksymalny błąd. Dzięki temu przy maksymalnym błędzie nasza zmiana będzie prędkości silnika będzie również największa z możliwych. O to nam przecież właśnie chodzi, aby w momencie, gdy robot jest blisko wypadnięcia całkowicie z linii, aby zareagował ostro i zdecydowanie powrócił na właściwe tory. Najpierw artykuł ten miał zawierać wszystko w jednej części jednak stwierdziłem, że jest to zagadnienie zbyt obszerne i przerastające moje zdolności pisarskie 😉 Dlatego zakończę teraz na samym członie P, później opublikuję kolejne części o członach D i I, dalej jeśli będzie takie zapotrzebowanie podsumuje jeszcze raz wszystko dodając jakieś informacje o prostych trikach, które warto wprowadzić do tych programów, no i ostatecznie postaram się zaprezentować jakiś konkretny kod najprawdopodobniej z Bascoma, w którym przedstawię cały PID. Zdaję sobie sprawę, że zagadnienie potraktowałem naprawdę bardzo skrótowo, ale wydaje mi się, że na razie tyle wystarczy, aby rozpocząć przygodę z PID. Naprawdę zachęcam w tej chwili do stworzenia jakieś prostej konstrukcji lub do użycia swojego starego robota i do TESTOWANIA W PRAKTYCE, bo tego nic nie zastąpi. Przygotujcie sobie jakiś prosty owalny tor z delikatnymi łukami i spróbujcie napisać poprawny kod do sterowania robota tylko za pomocą P, bo jest to możliwe i daje całkiem ciekawe efekty. Niestety nie mam jak teraz nagrać żądnego filmiku. Przykładowy, mój kod z Bascoma dla samego P: $regfile = "m32def.dat" $crystal = 16000000 'Konfiguracja portów Config Porta = &B00000000 Porta = &B11111111 Config Portb = &B11111011 Portb = &B00000000 Config Portc = &B01111111 Portc = &B00000000 Config Portd = &B11110011 Portd = &B00001100 'Konfifuracja timera1 'PWM dla silników Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64 'Konfiguracja ADC Config Adc = Single , Prescaler = 64 , Reference = Avcc Start Adc 'Przypisanie portów 'Mostek H_stb Alias Portc.2 H_in1 Alias Portd.6 H_in2 Alias Portd.7 H_in3 Alias Portc.1 H_in4 Alias Portc.0 'Deklaracja procedur silników Declare Sub P_silnik(byval Szybkosc As Integer) Declare Sub L_silnik(byval Szybkosc As Integer) Declare Sub P_stop(byval Sila As Integer) Declare Sub L_stop(byval Sila As Integer) 'Zmienne dla czujników i działania robota Dim Czujniki(8) As Integer , Flagalinii As Byte , Punkty(9) As Integer Dim Czujniki_licznik As Byte , Suma_punktow As Integer , Ile_wykrylo As Byte Dim Aktualna_pozycja As Single , Pozycja_poprzednia As Single , Granica As Integer Dim V_l As Integer , V_p As Integer , V_nowa As Integer Dim V_doc As Integer , V_min As Integer , V_max As Integer 'Zmienne PID'a Dim Roznica As Integer , Roznica_poprzednia As Integer , Zmiana As Single , Zmiana_int As Integer Dim P As Single , I As Single , D As Single , D_temp As Single Dim Kp As Integer , Ki As Byte , Kd As Integer 'Zmienne pomocnicze Dim Flaga_s As String * 8 'Pukty przypisane do czujników Punkty(1) = 14 Punkty(2) = 13 Punkty(3) = 12 Punkty(4) = 11 Punkty(5) = -11 Punkty(6) = -12 Punkty(7) = -13 Punkty(8) = -14 'Granica progu dla czujników linii Granica = 750 'Docelowa prędkość z zakresu 0-255 V_doc = 0 V_max = 0 V_min = 0 'Pozycja docelowa Const Pozycja_docelowa = 0 'Współczynniki PID Kp = 0 'Wartości startowe zmiennych Flagalinii = 0 Call P_silnik(v_doc) Call L_silnik(v_doc) Do Gosub Odczytaj_czujniki Gosub Licz_pozycje Gosub Licz_pid Call P_silnik(v_p) Call L_silnik(v_l) Loop End 'koniec programu głównego '##################################################################### 'Podprogram liczący PID'a Licz_pid: Zmiana = 0 'Różnica w pozycjach Roznica = Pozycja_docelowa - Aktualna_pozycja 'Liczymy P P = Roznica * Kp P = P / 10 'Aktualna różnica jako poprzednia Roznica_poprzednia = Roznica 'Liczymy zmiane prędkości silników Zmiana = P Zmiana_int = Zmiana 'Wyliczamy odpoewiednie prędkości If Zmiana_int > 0 Then V_nowa = V_doc + Zmiana_int If V_nowa <= V_max Then V_p = V_nowa Else V_p = V_max V_l = V_doc - Zmiana_int If V_l < V_min Then V_l = V_min End If End If If Zmiana_int < 0 Then V_nowa = V_doc - Zmiana_int If V_nowa <= V_max Then V_l = V_nowa Else V_l = V_max V_p = V_doc + Zmiana_int If V_p < V_min Then V_p = V_min End If End If If Zmiana_int = 0 Then V_l = V_doc V_p = V_doc End If Return '##################################################################### 'Podprogram odczytywania wartości z czujników Odczytaj_czujniki: 'Odczytujemy wszystkie czujniki po kolei For Czujniki_licznik = 0 To 7 Czujniki(czujniki_licznik + 1) = Getadc(czujniki_licznik) If Czujniki(czujniki_licznik + 1) > Granica Then Set Flagalinii.czujniki_licznik Else Reset Flagalinii.czujniki_licznik Next Return '##################################################################### 'Liczenie pozycji względem linii Licz_pozycje: 'Zerujemy zmienne Suma_punktow = 0 Ile_wykrylo = 0 'Sumujemy punkty z czujników, które wykryły linie For Czujniki_licznik = 0 To 7 If Flagalinii.czujniki_licznik = 1 Then Suma_punktow = Suma_punktow + Punkty(czujniki_licznik + 1) Ile_wykrylo = Ile_wykrylo + 1 End If Next Return '##################################################################### 'Sterowanie prawym silnikiem Sub P_silnik(byval Szybkosc As Integer) If Szybkosc > 0 Then H_in1 = 1 H_in2 = 0 else H_in1 = 0 H_in2 = 1 End If Pwm1b = Abs(szybkosc) End Sub '##################################################################### 'Sterowanie lewym silnikiem Sub L_silnik(byval Szybkosc As Integer) If Szybkosc > 0 Then H_in3 = 1 H_in4 = 0 else H_in3 = 0 H_in4 = 1 End If Pwm1a = Abs(szybkosc) End Sub Myślę, że część osób może nie być jeszcze do końca przekonana do tego całego PID'a, bo samo P prócz innego podejścia do odczytywania swojej pozycji nie wnosi nic specjalnego. Może ktoś stosował to samemu, licząc najpierw na papierze wartości, a później ustawiając je na stałe w programie. Jednak dopiero w następnych częściach pojawią się ciekawsze mechanizmy, które pozwolą na przewidywanie i korygowanie błędu, który będzie oraz tego, który już był. Zachęcam teraz do napisania programu dla Waszych FTL na samym P, wyregulujcie człon Kp w taki sposób, aby robot jeździł jak najbardziej płynnie po linii. Jeśli przestrzeliwuje zakręty, zwiększajcie Kp. Jeśli natomiast radzi sobie dobrze, zmniejszajcie Kp, tak długo aż będzie to możliwe i nie zaszkodzi w sprawnym pokonywaniu zakrętów. Właśnie tak najczęściej zaczyna się regulację całego PID'a - przy wyłączonym członie I oraz D. W razie pytań i problemów pytajcie w tym temacie, a nie na PW, lepiej wyjaśnić pewne nie jasne sprawy raz, porządnie dla wszystkich 😉 Prosiłbym też o nie robienie bałaganu i nie wklejaniu tutaj całych kodów, ograniczcie się do najpotrzebniejszego minimum i do najistotniejszych kwestii. Kilka spraw takich jak różne wykorzystywanie wyliczonej zmiany czy nie liniowe wartości wag czujników pozostawiłem specjalnie bez komentarza, bo chce się zająć tym na sam koniec - po opisaniu pozostałych członów. Czekam na komentarze czy warto pisać dalej, bo chyba większość z Was zamęczyłem samą "teorią", bez żadnych zdjęć i filmików 😉 7 Cytuj Link do komentarza Share on other sites More sharing options...
Popularny post MirekCz Sierpień 7, 2011 Popularny post Udostępnij Sierpień 7, 2011 Masakrycznie przekombinowany kod. Niepotrzebnie masz same if/else/itd. PID powinien zwracać jedną wartość i wg. niej ustalasz prędkości silników - u Ciebie są jakieś kombinacje. To samo np. z ustawianiem prędkości silników. Można napisać to w kilka linijek tzn. Sub L_silnik(byval Szybkosc As Integer) If Szybkosc > 0 Then H_in3 = 1 H_in4 = 0 else H_in3 = 0 H_in4 = 1 End If Pwm1a = Abs(szybkosc) End Sub Kod mniejszy, łatwiejszy do zrozumienia i przy okazji szybszy w działaniu. No i zamiast mnożyć/dzielić przez 10 użyj liczby 16 i zmień to na przesunięcia bitowe. Może ciut trudniejsze do zrozumienia, ale za to dużo szybsze w działaniu (a w komentarzach kodu możesz dopisać o co chodzi). 3 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Sierpień 7, 2011 Autor tematu Udostępnij Sierpień 7, 2011 MirekCz, dzięki za uwagę co do kodu. Nie ukrywam, że byłem trochę leniwy tzn. nie pisałem tego kodu pod artykuł tylko na szybko wyciąłem teraz z całego kodu samo P, więc tam jest więcej "przekombinowanych" rozwiązań, ale tak jak pisałem nie uznaję się za eksperta, ani w PID, ani w programowaniu 😉 Do samych silników w oryginale dodane jest jeszcze hamowanie etc. 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Naelektryzowany Sierpień 7, 2011 Udostępnij Sierpień 7, 2011 Bardzo ciekawy artykuł. Co prawda przeczytałem kilka podobnych po angielsku. Ale nierozumiałem w pewnych aspektach kodu. Teraz mam dobrze skomentowany kawałek kodu. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
nanab Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Error = 0 -2,5 = -2,5 Czy nie lepiej zamiast robić dodatkowe obliczenia i wprowadzać liczby zmiennoprzecinkowe spróbować jednak przewidzieć większość sytuacji? Dla 7 sensorów to 128 kombinacji z czego większość niemożliwych do uzyskania na normalnej i w miarę czystej trasie 🙂 Czekam na komentarze czy warto pisać dalej, Czekam już z niecierpliwością na podsumowanie, z tymi "trickami", nieliniową wagą czujników(jestem ciekawy opinii innych-u mnie spisuje się bardzo dobrze) i ogólnymi poradami nt. doboru nastaw w praktyce. Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Czy nie lepiej zamiast robić dodatkowe obliczenia i wprowadzać liczby zmiennoprzecinkowe spróbować jednak przewidzieć większość sytuacji? Dla 7 sensorów to 128 kombinacji z czego większość niemożliwych do uzyskania na normalnej i w miarę czystej trasie 🙂 Można, tylko wtedy nieco mija się z celem stosowanie mikroprocesora, bo możesz to zrealizować albo na pamięci EPROM, albo układzie PLD/CPLD. Choć ciekawy byłby LF zrealizowany całkowicie na CPLD np. XC9472, z jakim 6 bitowym PWM, dla silników. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Sierpień 8, 2011 Autor tematu Udostępnij Sierpień 8, 2011 Co prawda przeczytałem kilka podobnych po angielsku. Ja swoją "wiedzę" opieram głównie na tym: http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html Czy nie lepiej zamiast robić dodatkowe obliczenia i wprowadzać liczby zmiennoprzecinkowe spróbować jednak przewidzieć większość sytuacji? Dla 7 sensorów to 128 kombinacji z czego większość niemożliwych do uzyskania na normalnej i w miarę czystej trasie A przy 20 czujnikach? )Oczywiście robiłem na początku, tak że zależnie od stanu czujników w case'ach rozpisywałem wartość aktualnego błędu - jednak teraz mogę to uznać zdecydowanie za błąd. Nawet przy 8 czujnikach (w Feniksie2) zdarzały się często takie stany czujników, na które raczej bym nie wpadł. Szczególnie cuda dzieją się na kątach prostych oraz, gdy czujniki nie są ułożone w linie prostej. nieliniową wagą czujników(jestem ciekawy opinii innych-u mnie spisuje się bardzo dobrze) Ja również używam wartości nie liniowych i jestem z tego zadowolony. Cytuj Link do komentarza Share on other sites More sharing options...
Naelektryzowany Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Co prawda przeczytałem kilka podobnych po angielsku. Ja swoją "wiedzę" opieram głównie na tym: http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html polecam też: http://www.chibots.org/index.php?q=node/339 Choć w przykładzie odczyt zrobiony na zagmatwanym select...case Gdzieś też czytałem fajne objaśnienie, ale nie mogę znaleźć stronki. W każdym razie była opisana zasada działania: Człon proporcjonalny odpowiada za korektę błędu aktualnego. Całkujący za korektę tego co było, a Różniczkujący za niwelowanie błędu który pojawi się za chwilę. Cytuj Link do komentarza Share on other sites More sharing options...
piotreks-89 Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Nareszcie artykuł z przykładowym programem 😅 . Teraz tylko ukończyć robocika i wsadzić PD. Cytuj Link do komentarza Share on other sites More sharing options...
Sabre Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Wreszcie przeczytałem ten artykuł i powiem, że nie zawiera on tak naprawdę wytłumaczenia co jak działa i może a nawet na pewno wydaje się niezrozumiały dla większości osób, które jeszcze nigdy nie używały PIDa. Powiem na swoim przykładzie, pierwszego PIDa użyłem w Psotku2, ale wtedy tak naprawdę nie rozumiałem jak działa, była to dla mnie czysta teoria z odrobiną matematyki. Po jakimś czasie okazało się, że miałem przekręcone któreś równania i gdy je poprawiłem i wszystko zaczęło naprawdę działać tak jak powinno to zaczęło do mnie docierać co robi każdy z członów regulatora. Człon P jest odpowiedzialny za szybkie reakcje robota względem linii, to on ma największy wpływ na to jak jedzie robot, dobrze zestrojony powinien wystarczyć do jazdy po torze bez kątów prostych. Powoduje on, że robot cały czas porusza się po linii prostej jakby jechał po sinusoidzie, czyli przód robota drży. W zależności od szybkości obliczeń, a raczej od częstotliwości sprawdzania czujników, te drgania są wolniejsze lub szybsze. Dobrze wyregulowany powoduje, że drgania te są na tyle szybkie, że prawie niezauważalne, przeregulowany, powoduje, że robot jedzie jakby miał 2 czujniki skrajne tylko, robot wtedy porusza się po sinusoidzie. Człon D jest przeciwstawny członowi P, wygładza tą sinusoidę po której porusza się robot, zmniejsza jej amplitudę, a gdy jest dobrze zestrojony to eliminuje całkowicie drgania robota. Dodatkowo człon D poprawia reakcję na nagłe zmiany na torze, czyli umożliwia jazdę po torze z kątami prostymi. Przeregulowany człon D zmniejsza w dużym stopniu reakcję robota na nagłe zmiany w torze, wyregulowany dobrze zmniejsza drgania spowodowane przez człon P. Człon I jest czymś w stylu pamięci, przechowuje on informację o ostatnich zmianach położenia robota. Powoduje on całkowite zmniejszenie szybkich drgań robota z członu P i wolnych przeciwstawnych drgań z członu D. Człon I wypłaszcza całkowicie tą sinusoidę, ale spowalnia reakcje robota na nagłe zmiany na torze, dlatego większość osób korzysta z członów PD. 1 Cytuj Link do komentarza Share on other sites More sharing options...
nanab Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Można, tylko wtedy nieco mija się z celem stosowanie mikroprocesora, bo możesz to zrealizować albo na pamięci EPROM, albo układzie PLD/CPLD. Dla samego P tak, ale dla PI, PD, albo PID jednak procek(lub parę op-ampów) jest niezbędny. Dobrze wyregulowany powoduje, że drgania te są na tyle szybkie, że prawie niezauważalne, Napewno chodzi o częstotliwość a nie amplitudę? Kiedy miałem jeszcze sam regulator P zauważyłem, że w miarę zmniejszania wzmocnienia amplituda oscylacji się zmniejsza, ale częstotliwość pozostaje stała, albo zmienia się w niezauważalnym zakresie. Cytuj Link do komentarza Share on other sites More sharing options...
noVak Sierpień 8, 2011 Udostępnij Sierpień 8, 2011 Jeśli mam być szczery co do artykułu - hm - te kilkanaście linijek - które napisał Sabre pod Twoim artykułem - dały mi więcej do zrozumienia dla całego PID'a niż Twój artykuł samego członu P. Rzecz jasna, to co napisał Sabre - to tylko teoria - myślę, że więcej na temat samego artykułu będę mógł się wypowiedzieć, jak skończę składać mojego Line Follower'a. Na chwilę obecną - nie jest dla mnie zbyt bardzo zrozumiały. PS. Z chęcią ujrzę artykuł choć by dot. członu D. Cytuj Link do komentarza Share on other sites More sharing options...
Sabre Sierpień 9, 2011 Udostępnij Sierpień 9, 2011 Sabre napisał/a: Dobrze wyregulowany powoduje, że drgania te są na tyle szybkie, że prawie niezauważalne, Napewno chodzi o częstotliwość a nie amplitudę? Kiedy miałem jeszcze sam regulator P zauważyłem, że w miarę zmniejszania wzmocnienia amplituda oscylacji się zmniejsza, ale częstotliwość pozostaje stała, albo zmienia się w niezauważalnym zakresie. Napisałem, że wszystko zależy od częstotliwości sprawdzania czujników a co się z tym wiąże do częstości aktualizacji pozycji robota. I masz rację, że zmniejsza się amplituda, napisałem o tym w opisie członu D. Na samym P, robot przy dużej liczbie aktualizacji na sekundę, będzie zawsze oscylował (bo takie zmiany daje sam człon P - wprowadza oscylacje) z bardzo dużą częstotliwością, która będzie dawała złudzenie, że robot prawie nie drga, amplituda tych drgań będzie mała, ale częstotliwość duża. Cytuj Link do komentarza Share on other sites More sharing options...
lukpep Sierpień 9, 2011 Udostępnij Sierpień 9, 2011 pod wzgledem merytorycznym tak... srednio raczej. Z powodzeniem stosujesz regulatory w swoich projektach ale teoria, ktora do tego dorabiasz nie do konca jest poprawna. Pisales, ze art z perspektywy praktyka - mogles wiec podarowac sobie teorie (no offence rzecz jasna). Człon P (ang. proportional) pozwala nam na zmierzenie jak daleko znajdujemy się od naszego punktu docelowego tzn. takiego, w którym linia znajduje się dokładnie pod środkowym czujnikiem. nie bardzo... czlony regulatorow nic nie mierza. Regulatory wypracowuja sygnal sterujacy obiektem na podstawie informacji o jego aktualnym stanie (sprzezenie zwrotne). "odleglosc" mierzysz czujnikami linii - na podstawie ich odczytow masz info (zgrubne) o odleglosci od linii. Ta zgrubna odleglosc to jest uchyb (blad) na podstawie ktorego regulator wypracowywuje sygnal sterujacy do silnikow. Czlon proporcjonalny po prostu mnozy sygnal uchybu (bledu) i podaje do silnikow - innymi slowy im dalej jestes od linii tym mocniej zareaguja silniki. Zalozmy ze wzmocnienie czlonu P mamy 5. Zamierzona odleglosc od lini to 0, a ta zmierzona to powiedzmy 1.2. W zwiazku z tym mamy blad -1.2 - mnozony on jest przez 5 i podawany na sterowanie silnikami. Wady? Zalety? Czlon proporcjonalny zwieksza dynamike obiektu i jest najprostszy do uzycia. Wady: nigdy nie osiagniemy zerowego uchybu oraz latwo o przeregulowania wprowadzajace oscylacje - robot bedzie z jednej strony lini, poda za mocny sygnal korygujacy i znajdzie sie z drugiej, znowu skoryguje pozycje za mocno itp... bedzie oscylowal miedzy liniami. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Natanoj Sierpień 9, 2011 Udostępnij Sierpień 9, 2011 Mam czysto praktyczne pytanie, przy ustalaniu współczynników robot ma jeździć na małym PWM, by łatwiej zauważyć np. oscylację, czy raczej na prędkości docelowej, i czy ma to jakieś znacznie? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!