Skocz do zawartości

Budowa quadrocopteru - problem z strojeniem regulatorów PID


IceMAN92q

Pomocna odpowiedź

Witam 🙂 W ostatnich miesiącach pracowałem nad budową quadrocopteru. Jako sterownik używam Raspberry pi2 z dołączona płytka do obsługi silników (PWM) oraz Sense Hat z zamontowanym akcelerometrem i żyroskopem. Urządzenie jest sterowane poprzez Gamepada z xboxa i działa to świetnie. Łączę się z nim po Wi-Fi, na razie wystarcza 🙂

Dołączam również zdjęcie urządzenia 🙂

Na dany moment jestem na etapie dostrajania regulatorów PID. Algorytm posiada 3 regulatory dla każdej osi. Zbudowałem stojak umożliwiający ruch tylko po jednej osi. Dane z akcelerometru i gyro są filtrowane filtrem Kalmana co daje zadowalający wynik, dryfy w okolicach 0.05[°]. Gdy Rpi odbiera dane dodatkowo filtruje je filtrem alfa-beta co totalnie eliminuje wszystkie dryfy. Mam jednak pewien problem gdyż obojętnie jak ustawie regulatory zawsze wpada w silne oscylacje i nie ustabilizuje go do zadanego kąta (na dany moment zawsze jest to 0). Zmieniam kp, ki, kd oraz czas odpowiedzi układu (mam go w okolicach 10-50ms).

Zamieszczam również schemat (znalazłem w internecie) jak działają regulatory w układzie, pobierają kąt oraz przetwarzają go na wypełnienie sygnału PWM.

Dodaje również kod regulatora PID, może tu mam jakiś błąd :/

[/from time import time

class pid(object):

def set(self, p_gain, i_gain, d_gain, max_cor):

self.last_error = 0.0

self.p_gain = p_gain

self.i_gain = i_gain

self.d_gain = d_gain

self.i_error = 0.0

self.max_cor = max_cor

def calc(self, target, feedback, dti, dtd):

error = target - feedback

p_error = error

self.i_error += (error + self.last_error) * dti

i_error = self.i_error

d_error = (error - self.last_error) / dtd

#d_error = (error) / dtd

p_output = self.p_gain * p_error

i_output = self.i_gain * i_error

d_output = self.d_gain * d_error

self.last_error = error

cor = p_output + i_output + d_output

if cor > self.max_cor:

cor = self.max_cor

if cor < -self.max_cor:

cor = - self.max_cor

return cor, p_output, i_output, d_output]

Może ktoś z was zajmował się już podobnymi urządzeniami i podpowie jak poprawie dobrać nastawy i na co szczególnie zwracać uwagę.

Pozdrawiam i liczę na wasze odpowiedzi i dyskusje 😉

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Używasz real-time Linuksa? Python niestety nie jest dobrym pomysłem jeśli chodzi o algorytmy działające w czasie rzeczywistym, takie jak sterowanie silnikami.

Do takiego zadania raczej nie nadaje się też system Linux. Zwykle do sterowania samymi silnikami wykorzystuje się mikrokontrolery oraz oprogramowanie pisane w języku C, rzadziej C++. Jeśli chcesz wszystko zrobić na Linuksie w takim razie radzę zainteresować się patchami real-time (https://rt.wiki.kernel.org/index.php/Main_Page) lub Linux Xenomai (https://xenomai.org/). Same algorytmy radzę jednak pisać w języku C/C++.

Link do komentarza
Share on other sites

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.