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:
źródło
Odpowiedzi:
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=kpE−kdE˙ q E˙
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˙ π2 E˙ 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.
źródło