Kontynuując pytanie, które tu zadałem : niestabilność quadkoptera z prostym startem w trybie autonomicznym ... Chciałbym zadać kilka pytań na temat implementacji podstawowego PID dla quadrotora kontrolowanego przez moduł APM 2.6. (Używam ramki z 3DRobotics)
Rozebrałem cały system sterowania do zaledwie dwóch bloków PID, jednego do kontrolowania przechyłu, a drugiego do kontrolowania skoku (odchylenie i wszystko inne ... Pomyślę o nich później).
Testuję ten zestaw na platformie, która składa się z swobodnie obracającej się belki, w której związałem dwa ramiona quadrotora. Pozostałe dwie mogą się poruszać. Tak naprawdę testuję jeden stopień swobody (przechylenie lub skok) na raz.
Sprawdź obraz poniżej: tutaj A, B oznacza swobodnie obracającą się belkę, na której zamontowany jest zestaw.
Dzięki starannemu dostrojeniu parametrów P i D udało mi się osiągnąć ciągły lot około 30 sekund.
Ale przez „przedłużony” rozumiem po prostu test, w którym dron nie przewraca się na bok. Ciągły lot na skale wciąż nie jest w zasięgu wzroku, a ponad 30 sekund lotu również wygląda dość trudnie. Kołysze się od samego początku. Gdy osiągnie 20-25 sekund, zaczyna przechylać się na bok. W ciągu 30 sekund przechylił się na bok o niedopuszczalny margines. Wkrótce widzę, że spoczywa do góry nogami
Jeśli chodzi o sam kod PID, obliczam błąd proporcjonalności na podstawie „filtra uzupełniającego” danych żyroskopu + akcelerometru. Całka jest ustawiona na zero. Wartość P wynosi około 0,39, a wartość D wynosi 0,0012. (Nie używam specjalnie biblioteki PID Arduino, chcę tylko zaimplementować tutaj jeden z moich PID).
Sprawdź ten film, jeśli chcesz zobaczyć, jak to działa.
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Ta konfiguracja jest dość stara! Zgadzam się. :)]
Daj mi znać, co mogę zrobić, aby poprawić stabilność na tym etapie.
@Ian: Z wielu testów, które wykonałem z moją konfiguracją, sporządziłem wykresy dla niektórych testów, używając odczytu z monitora szeregowego. Oto przykładowy odczyt Roll vs „Motor1 i Motor2 - wejście PWM” (dwa silniki kontrolujące przechylenie):
Jeśli chodzi o wejście / wyjście:
Dane wejściowe: wartości przechyłu i nachylenia (w stopniach) uzyskane za pomocą kombinacji akcelerometru + żyroskopu
Dane wyjściowe: wartości PWM dla silników dostarczone za pomocą funkcji motor.write () z biblioteki Servo
Rozkład
Rozwiązałem problem. Oto jak:
Sedno problemu leżało w sposobie, w jaki wdrożyłem program Arduino. Używałem funkcji write () do aktualizacji kątów serwomechanizmu, który akceptuje tylko argumenty liczb całkowitych w argumencie (lub w jakiś sposób reaguje tylko na dane liczbowe całkowite, 100 i 100,2 daje ten sam wynik). Zmieniłem to na writeMicroseconds () i dzięki temu copter był znacznie stabilniejszy.
Zsumowałem RPM na jednym silniku, utrzymując drugi na stałym poziomie. Zmieniłem to, aby zwiększyć RPM w jednym silniku, jednocześnie zmniejszając silnik przeciwny. Ten rodzaj utrzymuje niezmienny całkowity ciąg poziomy, co może mi pomóc, gdy próbuję utrzymać tę wysokość w pionie.
Podnosiłem obroty do maksymalnego limitu, dlatego quadcopter wciąż tracił kontrolę przy pełnym otwarciu przepustnicy. Nie było miejsca na zwiększenie RPM, gdy wyczuł on przechylenie.
Zauważyłem, że jeden z silników był z natury słabszy od drugiego, nie wiem dlaczego. Na stałe wpisałem przesunięcie w tym silniku na wejściu PWM.
Dziękuję za całe wsparcie.
Kod źródłowy:
Jeśli jesteś zainteresowany, oto kod źródłowy mojej prostej implementacji PID : Kod źródłowy PID
Przetestuj go na swoim sprzęcie. Wszelkie wkłady w projekt byłyby mile widziane.