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: