2012-05-22 14 views
5

Pracuję nad sterowaniem pojazdu i użyciem czujnika 9DOF (akcelerometr, magnetometr i żyroskop). Dla kąta odchylenia, mam problem z nieciągłością w pi rad. (180 stopni). Kontroluję pojazd za pomocą kontrolera PID i kiedy pojazd obraca się o więcej niż 180 stopni, znak nagle zmienia się (z 180 na -180), co powoduje, że kontroler działa dziwnie. Ten sam problem wystąpi, gdy zmieni się on o więcej niż -180 deg.Jak radzić sobie z nieciągłością kąta odchylenia o 180 stopni

Jako metodę używam macierzy kierunkowej cosinus do obliczenia kątów Eulera. (zalecana metoda czujnika iskiernika.)

Moje pytanie brzmi, z jakiego rodzaju podejścia powinienem skorzystać? Jak radzić sobie z tą nieciągłością w przypadku użycia kontrolera PID do kontroli kąta odchylenia.

+1

Czy to naprawdę pytanie o tym, jak dodać 360? – Eiko

Odpowiedz

0

miałem ten sam problem i robię, co następuje:

#define MOD(a) ((a > 180.0) ? (a - 360.0) : ((a < -180.0) ? (a + 360.0) : a)) 

Różnica z 2 kątami można po prostu umieścić z powrotem do -180d/+ 180D z takim wzorem.

+0

Dla zakresu -180/+ 180 st, kiedy ten warunek będzie ważny? (a> 180,0). Kąt nigdy nie przekracza 180. Czy się mylę? – tarik

0

Czy to Twój problem?

After desired angle changes it's sign(ie. 180->-180) 
then suddenly control input(ie. P * error) becomes bigger. 

Na przykład.

-------------------------------- 
| desired | real | error | 
|-----------|--------|---------| 
| 170 | 160 | 10 | 
| -170 | 160 | -330 | 
-------------------------------- 

Jeśli twój problem jest taki sam, jak rozumiem, co z tego? Zanim przejdziemy, zauważmy, że Zakłada się, że wszystkie wartości kątów są w zakresie [-pi, pi].

error = desired - real; 
if(error > 180) 
    error = error - 360; 
else if(error < -180) 
    error = error + 360; 
else 
    error = error;//do nothing 

Ta metoda zawsze wybiera kierunek tak, że wejście sterujące staje się mniejszy. (Wiesz, że istnieją dwie możliwości dla kierunku)

Powiązane problemy