Filtrowanie prędkości
-
Autor tematu - Lider FORUM (min. 2000)
- Posty w temacie: 7
- Posty: 2083
- Rejestracja: 11 cze 2011, 18:29
- Lokalizacja: Warszawa / Lublin
Filtrowanie prędkości
Witam,
Podczas prac nad sterownikiem serwo napotkałem następujący problem: enkoder pozwala odczytać pozycję (w miarę dokładnie), jednak jego użyteczność w zakresie odczytu prędkości jest ograniczona - przy dużej prędkości częstotliwość zmian wskazania pozycji jest porównywalna z krokiem całkowania, ale przy małych prędkościach wygląda to już cieniutko. Kilka rozwiązań chodzi mi po głowie:
1. Filtr Kalmana - ale tutaj jest problem, bo charakterystyka układu jest zależna od prędkości (tzn. przy większej prędkości mamy większą pewność, więc filtrowanie powinno być mniej agresywne).
2. Taki filtr dyskretny:
v - aktualnie estymowana prędkość
t - czas, który upłynął pomiędzy zmianami wskazania enkodera
d - zmiana wskazania enkodera (-1, 0,+1)
η - stała zaniku prędkości (np. 0.99 czy coś w tym guście)
f(t) - funkcja pewności aktualnego odczytu - funkcja malejąca, wartości z przedziału <0, 1>
W każdym kroku pracy układu wykonujemy następującą operację:
v=ηv
jeżeli d!=0, to
v=v*(1-f(t)) + f(t)*d/t
Jak widać, kiedy nie ma zmiany pozycji enkodera, prędkość sobie powoli zanika, zgodnie z η. Jeżeli natomiast mamy zmianę, to poprzednie wskazanie zanika szybciej na rzecz nowego odczytu d/t. Funkcja f(t) przyjmuje małe wartości dla dużych t, aby nie wprowadzać nagłych "skoków" prędkości przy pojedynczych zliczeniach enkodera.
Co sądzicie o takim podejściu? Czy może ktoś implementował filtrowanie prędkości do PIDa? Jeżeli tak, to co zastosował i czy zadziałało?
Podczas prac nad sterownikiem serwo napotkałem następujący problem: enkoder pozwala odczytać pozycję (w miarę dokładnie), jednak jego użyteczność w zakresie odczytu prędkości jest ograniczona - przy dużej prędkości częstotliwość zmian wskazania pozycji jest porównywalna z krokiem całkowania, ale przy małych prędkościach wygląda to już cieniutko. Kilka rozwiązań chodzi mi po głowie:
1. Filtr Kalmana - ale tutaj jest problem, bo charakterystyka układu jest zależna od prędkości (tzn. przy większej prędkości mamy większą pewność, więc filtrowanie powinno być mniej agresywne).
2. Taki filtr dyskretny:
v - aktualnie estymowana prędkość
t - czas, który upłynął pomiędzy zmianami wskazania enkodera
d - zmiana wskazania enkodera (-1, 0,+1)
η - stała zaniku prędkości (np. 0.99 czy coś w tym guście)
f(t) - funkcja pewności aktualnego odczytu - funkcja malejąca, wartości z przedziału <0, 1>
W każdym kroku pracy układu wykonujemy następującą operację:
v=ηv
jeżeli d!=0, to
v=v*(1-f(t)) + f(t)*d/t
Jak widać, kiedy nie ma zmiany pozycji enkodera, prędkość sobie powoli zanika, zgodnie z η. Jeżeli natomiast mamy zmianę, to poprzednie wskazanie zanika szybciej na rzecz nowego odczytu d/t. Funkcja f(t) przyjmuje małe wartości dla dużych t, aby nie wprowadzać nagłych "skoków" prędkości przy pojedynczych zliczeniach enkodera.
Co sądzicie o takim podejściu? Czy może ktoś implementował filtrowanie prędkości do PIDa? Jeżeli tak, to co zastosował i czy zadziałało?
Tagi:
-
- Lider FORUM (min. 2000)
- Posty w temacie: 1
- Posty: 3962
- Rejestracja: 18 wrz 2004, 12:51
- Lokalizacja: k/w-wy
- Kontakt:
nie implementowałem czegoś takiego...
ale servo to trochę jak kontroler ruchu, więc można (i pewnie trzeba) w wolniejszym wątku przygotowywać wartości statystyczne wszelakiego rodzaju
prędkość chwilową można aproksymować biorąc pod uwagę większą ilość punktów niż dwa ostatnie
aproksymacja może być jakąś funkcją wyższego rzędu (jest obszerny dział matematyki na ten temat)... problem to sprowadzenie abstrakcyjnej matematyki na poziom realizacji z automatu i szybko
krzywa prędkości powinna być w miarę "gładka"... wyeliminowania "nagłych" skoków jako błędów można pewnie zrealizować z pomocą zmiennej, której wartość ustalamy w konfiguracji...
[ Dodano: 2012-11-21, 13:47 ]
hehe... kawałek z opisu Kalmana
ale chyba bardziej wpasowuje się w zagadnienie przewidywania prędkości chwilowej "Obserwator stanu"
[ Dodano: 2012-11-21, 13:51 ]
na mój gust --- im prościej tym lepiej
ale servo to trochę jak kontroler ruchu, więc można (i pewnie trzeba) w wolniejszym wątku przygotowywać wartości statystyczne wszelakiego rodzaju
prędkość chwilową można aproksymować biorąc pod uwagę większą ilość punktów niż dwa ostatnie
aproksymacja może być jakąś funkcją wyższego rzędu (jest obszerny dział matematyki na ten temat)... problem to sprowadzenie abstrakcyjnej matematyki na poziom realizacji z automatu i szybko
krzywa prędkości powinna być w miarę "gładka"... wyeliminowania "nagłych" skoków jako błędów można pewnie zrealizować z pomocą zmiennej, której wartość ustalamy w konfiguracji...
[ Dodano: 2012-11-21, 13:47 ]
hehe... kawałek z opisu Kalmana
Teoretycznie filtr Kalmana jest estymatorem tego co nazywa się problemem liniowo-kwadratowym czyli problemem estymacji natychmiastowego stanu liniowego układu dynamicznego, który narażony jest na perturbacje białego szumu (zob. regulator liniowo-kwadratowy-Gaussa) – przez użycie pomiarów liniowo związanych ze stanem ale zakłóconych przez biały szum. Wynikowy estymator jest statystycznie optymalny w odniesieniu do dowolnej funkcji estymowanego błędu.
ale chyba bardziej wpasowuje się w zagadnienie przewidywania prędkości chwilowej "Obserwator stanu"
http://pl.wikipedia.org/wiki/Obserwator_stanuZnajomość stanu układu jest niezbędna przy rozwiązaniu wielu problemów teorii sterowania; na przykład, problemu stabilizacji układu z użyciem lokowania biegunów układu zamkniętego. W większości praktycznych przypadków, nie można poprzez bezpośrednią obserwację ustalić jaki jest stan fizyczny układu. Zamiast tego na wyjściu systemu obserwuje się pośrednie skutki jakie wywołuje stan wewnętrzny układu. Można to zilustrować przykładem z pojazdami w tunelu: częstość i prędkości z jakimi pojazdy wjeżdżają do tunelu i opuszczają go podlegają bezpośredniej obserwacji ale dokładny stan wnętrza tunelu może być tylko estymowany. Jeśli system jest obserwowalny, można, z użyciem obserwatora stanu, na podstawie pomiarów, w pełni zrekonstruować stan układu.
[ Dodano: 2012-11-21, 13:51 ]
na mój gust --- im prościej tym lepiej
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 7
- Posty: 478
- Rejestracja: 04 mar 2012, 13:51
- Lokalizacja: Warszawa
przy dużej prędkości częstotliwość zmian wskazania pozycji jest porównywalna z krokiem całkowaniaursus_arctos pisze:przy dużej prędkości częstotliwość zmian wskazania pozycji jest porównywalna z krokiem całkowania
Dać zmienny krok całkowania, tak naprawdę używać stempli czasu. Dlatego lepsze rozwiązanie to sprawnie działający system przerwań od sygnałów A, B,"0". Każde zdarzenie stemplować czasem i wyjdzie dokradnie. Inna sprawa to silnikiem komutatorowym to dla małych prędkości rzuca niemiłosiernie, dlatego MK125 miał duże koło zamachowe.
-
Autor tematu - Lider FORUM (min. 2000)
- Posty w temacie: 7
- Posty: 2083
- Rejestracja: 11 cze 2011, 18:29
- Lokalizacja: Warszawa / Lublin
Eeeeee.... PID ma całkować nawet, jak uchyb się nie zmienia - wystarczy, że jest niezerowy.Dlatego lepsze rozwiązanie to sprawnie działający system przerwań od sygnałów A, B,"0"
A czy rzuca niemiłosiernie? No, dynamikę to on ma, nie powiem. Ale na małych prędkościach chodzi naprawdę gładziutko - mogę mu zadać prędkość 0.1obr/s i chodzi bezgłośnie.
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 7
- Posty: 478
- Rejestracja: 04 mar 2012, 13:51
- Lokalizacja: Warszawa
-
Autor tematu - Lider FORUM (min. 2000)
- Posty w temacie: 7
- Posty: 2083
- Rejestracja: 11 cze 2011, 18:29
- Lokalizacja: Warszawa / Lublin
Komutator ma raczej sporo pól - ale chyba ważniejsze, że tak na wyczucie, to wirnik ma skośne szczeliny - bo silnik nie przeskakuje w żaden zauważalny sposób jak się nim kręci.
* komunikację robię tak: jak w FIFO od USARTa znajdę znak końca pakietu, to wywołuję softwareowo przerwanie EXTI4 o niskim priorytecie, na którym pakiet jest przetwarzany. Priorytet jest niski dlatego, że przetwarzanie takiego pakietu może trwać długo.
Chyba się słabo rozumiemy. Samo stemplowanie czasu wydarzeń nie wystarczy. Również pomiędzy nimi regulator musi zmieniać swoje wyjście, więc musi pracować na jakimś timerze - praca w pętli głównej programu nie jest najlepszym pomysłem, bo jak przyjdą przerwania komunikacyjne*, to procek może dość długo do pętli głównej nie powrócić.teraz "eeee"e a przdtem było "cieniutko".
tylko ze jak złe stemplowanie czasu to i kiepska matematyka
* komunikację robię tak: jak w FIFO od USARTa znajdę znak końca pakietu, to wywołuję softwareowo przerwanie EXTI4 o niskim priorytecie, na którym pakiet jest przetwarzany. Priorytet jest niski dlatego, że przetwarzanie takiego pakietu może trwać długo.
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 7
- Posty: 478
- Rejestracja: 04 mar 2012, 13:51
- Lokalizacja: Warszawa
Przepraszam najmocniej, ja tego nie powiedziałem, ani nie napisałem.ursus_arctos pisze:praca w pętli głównej programu nie jest najlepszym pomysłem
Jak już, to napisałem że wyliczanie kolejnego kroku zaczyna się od zdarzenia typu zmiana sygnału A lub B. Czy cała operacja przeliczania filtru jest w przerwaniu, wątku czy pętli głównej nie ma to znaczenia jak jest zrobiona poprawnie, ale to już szczegóły algorytmu.
Jeżeli pomiędzy zderzeniami ( sygnałami A,B) przeliczamy filtr, to na jego wejściu musimy dać dane z palca czyli np. zakładamy że prędkość obrotowa jest stała, albo jednostajnie zmienna,albo..., czyli zachowuję się tak jak poprzednio. Przy małych prędkościach, zmiennym obciążeniu będzie to prawda? chyba nie. Ale to już dyskusja jaki algorytm jest lepszy. Teraz kolegi jest lepszy bo działa, a ja jeszcze nie zrobiłem serwa więc mój jest gorszy.
Ostatnio zmieniony 21 lis 2012, 18:29 przez piotr_olbrysz, łącznie zmieniany 1 raz.
-
Autor tematu - Lider FORUM (min. 2000)
- Posty w temacie: 7
- Posty: 2083
- Rejestracja: 11 cze 2011, 18:29
- Lokalizacja: Warszawa / Lublin
Właściwie, to z palca jest tylko prędkość - i tego "palca" dotyczy ten wątek - uchyb (z dokładnością do rozdzielczości enkodera) przecież znamy. Swoją drogą, to uchyb nie musi wcale być stały - przecież zadana pozycja też może ulegać zmianom w czasie - maszyna ma się poruszać po jakiejś krzywej, to punkt zadany jest zmienny. Ja zamierzam utrzymać krok całkowania krzywej poniżej okresu PWM - u mnie jest to coś rzędu 30µs.Jeżeli pomiędzy zderzeniami ( sygnałami A,B) przeliczamy filtr, to na jego wejściu musimy dać dane z palca
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 7
- Posty: 478
- Rejestracja: 04 mar 2012, 13:51
- Lokalizacja: Warszawa
Przy małych prędkościach, tzn. gdy odległość czasowa pomiedzy znacznikami enkodera jest znacznie wieksza niż czestość próbkowania to błąd wyznaczania predkosci jest pomijalnie mały, natomiast przy dużych prędkościach to okres 30us chyba już jest porównywalny z okresem sygnału A lub B.ursus_arctos pisze:Właściwie, to z palca jest tylko prędkość
-
Autor tematu - Lider FORUM (min. 2000)
- Posty w temacie: 7
- Posty: 2083
- Rejestracja: 11 cze 2011, 18:29
- Lokalizacja: Warszawa / Lublin
Właśnie wtedy błąd jest olbrzymiczasowa pomiedzy znacznikami enkodera jest znacznie wieksza niż czestość próbkowania to błąd wyznaczania predkosci jest pomijalnie mały

No nic, zaczynami implementację...