Użycie PID do sterowania obrotem

1

Pracowałem nad symulacją lotu drona w Gazebo (symulator robotyki typu open source).

Obecnie próbuję kontrolować skok / obrót drona za pomocą PID. Ważne jest, aby pamiętać, że dron porusza się liniowo tylko przez obrót kątowy (do przodu / do tyłu wymaga obrotu pochylenia, w lewo / w prawo wymaga obrotu).

W tej chwili testuję kontrolę skoku PID. Celem jest, aby dron obrócił się pod określonym kątem i utrzymał tę pozycję - idealna praca dla PID.

Ale wdrożenie fizyki to komplikuje. Zasadniczo PID przyjmuje wartość zadaną - żądany kąt obrotu skoku (w radianach) i aktualny kąt obrotu skoku (który otrzymuję bezpośrednio ze stanu symulacji).

Wyjście PID jest następnie wykorzystywane do obliczenia wynikowego momentu obrotowego. Równanie momentu obrotowego wynosi t = I * a (moment obrotowy = Intertia * przyspieszenie kątowe). Zasadniczo używam PID do kontrolowania przyspieszenia kątowego drona, biorąc pod uwagę aktualny i pożądany kąt obrotu.

Problem polega oczywiście na tym, że sygnał wyjściowy PID skaluje się liniowo z czasem, więc chociaż maleje do zera, gdy dron zbliża się do wartości zadanej, przez cały czas przykładał dodatnie przyspieszenia. Rezultat jest taki, że dron ma duży moment pędu, a zatem naturalnie przeregulowuje. Wtedy oczywiście PID reaguje odwracając obrót, ale z tym samym problemem.

W końcu dzieje się tak, że dron zaczyna od pozycji poziomej, obraca się do wartości zadanej, a następnie obraca się z powrotem do poziomu, a następnie z powrotem do wartości zadanej. Dodanie jakiegokolwiek wzmocnienia I lub D staje się niestabilne.

Problem jest naprawdę prosty. To jak kontrolowanie pojazdu w kosmosie. Ciąg jest przykładany impulsowo, aby zapewnić dokładną kontrolę nad pozycją / obrotem. PID zapewnia jednak ciągłą moc wyjściową. Co oznacza, że ​​potrzebuję jakiegoś systemu fizycznego, który zachowuje się tak, jak pokazano tutaj:

http: //vignette4.wikia.nocookie.net...imation.gif/revision/latest? cb = 20141124024926

lub muszę przepisać fizykę, aby sygnał wyjściowy PID był odpowiednio skalowany, aby prędkość kątowa wyzerowała się do momentu osiągnięcia pożądanego kąta obrotu.

Rozwiązanie tego problemu jest trudniejsze niż myślałem - prawdopodobnie dlatego, że nie jestem silnym fizykiem ani nie kontroluję faceta.

Problem ten opublikowałem już na innym forum. Możesz przeczytać ten wątek tutaj:

Kontrola PID dla obrotów drona

gdzie jestem naprawdę konkretny. Obawiam się, że nie byłem w stanie wystarczająco dobrze opisać problemu, częściowo dlatego, że facet, który próbował pomóc, nie był tak naprawdę zaznajomiony z PID (lub C ++).

Tak czy inaczej, wszelkie przemyślenia kogoś, kto zajmował się tego rodzaju sprawami (lub myśli, że wiedzą o tym więcej niż ja ...) byłyby bardzo mile widziane. :)

Edycja: Możesz zobaczyć zachowanie w następującym animowanym gifie:

http://gph.is/2lKf9aT

Joel Graff
źródło
1
Wygląda na to, że może to być problem ze strojeniem. Jak określiłeś swoje stałe?
ericksonla,
1
Najwyraźniej musisz dostroić kontrolę. Zaczynam od p, potem d, a na końcu zyskuję. Na stronie wymiany stosów robotyki znajdują się wspaniałe odpowiedzi, które obejmują również linki zewnętrzne do stron internetowych w celach teoretycznych.
Gürkan Çetin
Korzystanie z algorytmu genetycznego. Jestem prawie pewien, że to nie jest problem ze strojeniem. Sama natura PID działa przeciwko mnie. Oznacza to, że dopóki PID nie osiągnie swojej wartości zadanej, nadal stosuje przyspieszenie kątowe (w tym przypadku). Tak więc, zanim to osiągnęło, zastosowało wiele sposobów, aby szybko belować bele. Innymi słowy, musi odwracać i rozpocząć zmniejszając przyspieszenie kątowe sposób zanim osiągnie zadaną. Podobnie jak próba pilotowania statku kosmicznego w próżni.
Joel Graff
1
Czy Twój zysk ma odpowiedni znak?
nibot
1
Kontroler PD zachowuje się jak amortyzator sprężynowy, który można dostroić, aby nie został przekroczony. W takim przypadku musi to być co najmniej kontroler PD, inaczej będzie oscylował. Jednak ze względu na charakter tego problemu nie sądzę, aby PID był w ogóle odpowiedni, niektóre sterowniki oparte na modelach byłyby znacznie lepsze.
joojaa

Odpowiedzi:

1

Opieram więc swoją odpowiedź na symulacji, którą właśnie ukończyłem na zajęciach z dynamiki lotu. Książka nazywa się Teoria i praktyka małych bezzałogowych statków powietrznych autorstwa Bearda i McLaina. Slajdy są dostępne na stronie http://uavbook.byu.edu/doku.php?id=lecture (sprawdź rozdział 6). Podczas gdy symulujemy bezzałogowe statki powietrzne, myślę, że koncepcje powinny być podobne. Do naszych pętli pitch i roll (które są czymś takim samym w kwadrotorze), używamy podstawowej pętli PD (brak integralnego terminu, ponieważ każda jest pętlą wewnętrzną). Równanie dla sterowanego wejścia sterującego to . Dla wygody użyliśmy (tempo pitch) zamiast ponieważ mamy jego pomiary.y=kpEkdE˙qE˙

W swojej pętli PID dodajesz zamiast odejmować. Odejmując, zmniejsza wejście, gdy zwiększasz prędkość kątową. Na przykład, jeśli jestem wyłączony i nie obracam się, moje dane wejściowe będą duże. Wraz ze wzrostem prędkości kątowej moje dane wejściowe zmniejszają się zarówno od zmniejszenia błędu, jak i od wzrostu prędkości kątowej. W końcu musi być zero danych wejściowych i nastąpi to w pewnym momencie, zanim dojdę do mojej pozycji. UAV ciągle się obraca, a błąd maleje. JednakkdE˙π2E˙pozostaje na poprzednim poziomie, a sygnał wejściowy staje się ujemny, zmniejszając moją prędkość kątową. Jeśli w jakiś sposób prędkość kątowa osiągnie wartość 0 przed osiągnięciem wartości zadanej, cały ten proces powróci na początek. Oznacza to, że powinieneś tylko dostroić swoje zyski.

pshlady
źródło
1
nibot wskazał na tę odpowiedź w komentarzach powyżej. Ograniczyłem przestrzeń poszukiwań tylko do wartości dodatnich. Otwarcie go na wartości ujemne szybko ustabilizowało drona, gdy obracał się do kąta 45 stopni. Implementacja może nie być całkowicie poprawna (zgodnie z powyższym komentarzem SF), ale działa wystarczająco dobrze, żebym mógł przejść w tej chwili.
Joel Graff