Implementacja algorytmu PID z wykorzystaniem wizji komputerowej


10

Buduję automatyczny solver labiryntowy i używam kamery internetowej do kontrolowania mojego labiryntu.

W oparciu o sugestie z innych forów staram się obecnie kontrolować ruch kuli labiryntu przynajmniej w jednym kierunku. Próbuję więc kontrolować mój ruch piłki między dwiema współrzędnymi 466,288 i 466,152. Dane wejściowe na płytce sterownika silnika krokowego to czas, liczba kroków do obrotu dla każdej osi, tj. Xiy.

Płytka kontrolera silnika krokowego, której używam, to płyta kontrolna silnika krokowego egg bot: http://www.sparkfun.com/products/10025

Więc aby poruszać się między dwoma punktami, czy powinienem utworzyć kilka punktów pośrednich między dwoma punktami, mianowicie 288 i 152 (powiedzmy 260 240 230 ... 150) i poprawić mój ruch piłki?

Mój algorytm przetwarzania obrazu nie jest wystarczająco szybki, aby wyśledzić piłkę, którą po prostu zakręci się i wpadnie do dziury.

Niektórzy sugerowali, że używam standardowego szablonu, jak pokazano w poniższym filmie i koryguję ruchy piłki pod kątem odchyleń na ścieżce:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Natknąłem się również na narzędzie do przetwarzania obrazu, w którym rozwiązali ten sam problem, wykorzystując punkty orientacyjne do ruchu piłki. Widząc zbyt wiele rozwiązań tego samego problemu, jestem całkowicie zagubiony w rozwiązaniu problemu. Wiem, że powinienem wdrożyć sterownik PID. Ale jak powinienem rozwiązywać problemy etapami? Utknąłem i po prostu sfrustrowałem się, gdy znalazłem przewagę w rozwiązaniu problemu.

Moja konfiguracja wygląda następująco:

obraz instalacji

... a oto zrzut ekranu mojego oprogramowania:

zrzut ekranu

Wersja 2: Mam teraz do czynienia z nowym problemem: wcześniej kontrolowałem silniki krokowe za pośrednictwem apletu Java portu szeregowego Arduino. Jestem w stanie prowadzić steppery za pomocą apletu.

Muszę zresetować płytę za każdym razem, gdy próbuję komunikować się przez port szeregowy. Ponadto silnik krokowy zasila się w krótkich odstępach czasu, gdy nie jest do niego wysyłane żadne polecenie. Kiedy silnik krokowy wchodzi w ten tryb, nie mogę sterować moją płytą bez resetu płyty. Każda pomoc będzie mile widziana.

Wersja 3:

Poczyniłem pewne postępy, gdy wdrożyłem algorytm PID. Poniżej znajduje się wideo: http://www.youtube.com/watch?v=MEfp7RqPmqY

Teraz mam problem z prędkością, z jaką implementowany jest algorytm PID. Właściwie moje przetwarzanie obrazu kończy cykl w 200 ms, identyfikuje piłkę i wysyła polecenia na płytkę kontrolera silnika krokowego. Mimo że do mojego portu szeregowego wysyłane są polecenia zmiany kierunku, mój silnik krokowy obraca się w tym samym kierunku. Dziwne zachowanie można znaleźć na powyższym filmie.

Myślę, że powinienem ograniczyć wartości PID do pułapu, w przypadku gdy obliczona wartość PID jest większa niż 100, powinienem po prostu wysłać 100. Nie mogę się doczekać, aby usłyszeć wasze przemyślenia na ten temat.

Sposób, w jaki zaimplementowałem kontroler PID, polega na tym, że zidentyfikowałem punkt początkowy szablonu za pomocą algorytmu dopasowania szablonu i zidentyfikowałem piłkę za pomocą innego algorytmu dopasowania szablonu. Teraz przesunąłem piłkę do środka ciężkości szablonu punktu początkowego. Jak zmusić go do podążania po linii prostej za pomocą algorytmu PID?

Wersja 4:

Pojedyncza trajektoria kropelka

Wyizolowałem trajektorię, ale nie jestem w stanie znaleźć właściwej funkcji do wydrukowania prawidłowych współrzędnych pikseli od punktu początkowego. jakieś pomysły?


1
Re PS: Więc po prostu opublikuj link do obrazu i jestem pewien, że ktoś przyjdzie i zastąpi go samym obrazem ...
Majenko

@Matt - Naprawiono! Wolałbym jednak, aby użytkownik dostarczył tekst do zdjęć, a nie tylko linki do zdjęć. Nie jestem pewien, gdzie @Sai ich chciał, po prostu umieściłem je na dole.
Kevin Vermeer

Wow ... Czy te steppery mają wystarczająco duży moment obrotowy, aby poruszać deską z dowolną prędkością? Mam nadzieję, że gdzieś tam jest jakaś redukcja biegów.
Connor Wolf,

@Fake - steppery nie powinny mieć z tym problemu. Deska nie waży dużo, a jej waga jest zrównoważona. Mam zegar ścienny z rękami o długości 40 cm i jest kontrolowany przez ten sam mały mechanizm, co każdy inny, to także stepper. (Mechanizm 5 cm x 5 cm wygląda absurdalnie mały w porównaniu do średnicy zegara 80 cm)
stevenvh

@Fake: Steve ma rację. Nie mam problemu ze steperem. Chodzi przede wszystkim o algorytm PID
Sai

Odpowiedzi:


2

Po pierwsze, ponieważ steppery są świetne w pozycjonowaniu (nie ma potrzeby uzyskiwania informacji zwrotnej o pozycji), z pewnością powinieneś ograniczyć ich ruch, jak sam powiedziałeś. Nie jestem pewien, jak w tej chwili zaprojektowano wał silnika, ale gdyby był on przymocowany do silnika, kontynuowanie wirowania groziłoby uszkodzeniem sprzętu.

Następnie opóźnienie transportu czujnika o 200 ms będzie prawdopodobnie zbyt wolne, w przeciwnym razie trzeba będzie znacznie spowolnić, aby spowolnić samą piłkę. Podobnie jak powiedział Rocket Surgeon , należy uprościć algorytm przetwarzania obrazu, aby obliczyć ścieżkę tylko raz , a następnie szybko obliczyć tylko położenie piłki w każdej klatce. Jeśli chcesz szybko pominąć ten krok, znajdź czerwoną kulkę zamiast tej, a następnie zaznacz tylko czerwony składnik na obrazie RGB, dopóki nie znajdziesz lepszego algorytmu.

W przypadku sterowania PID zacznij od tego, że tak naprawdę potrzebujesz dwóch oddzielnych sterowników PID, jednego dla silnika wschód-zachód, drugiego dla silnika północ-południe. Jeśli masz dwa dokładne silniki, ich parametry muszą być równe.

Aby regulator PID zadziałał, musi znać błąd : różnicę między pożądaną pozycją a rzeczywistą pozycją piłki. Składniki X i Y tego przesunięcia będą wejściami dla dwóch sterowników PID (po jednym dla każdego silnika). Aby uzyskać błąd, musisz najpierw mieć żądaną pozycję na swojej ścieżce: trajektorię .

Aby uzyskać trajektorię, musisz przetworzyć obraz i uzyskać ścieżkę , a także punkt początkowy i końcowy. Nie jestem pewien, czy twój algorytm jest teraz w stanie odróżnić ścieżkę od reszty planszy, ale jeśli nie, pamiętaj, że jest to własny algorytm do obsługi przed kontynuowaniem. Ponownie możesz pominąć tę część, ręcznie wprowadzając punkty połączenia, jeśli chcesz szybko zobaczyć niektóre wyniki. W każdym razie powinieneś być w stanie zdefiniować prędkość zadaną i pozwolić oprogramowaniu przesunąć pożądane położenie współrzędnych na ścieżce, od początku do końca. Oczywiście zaczniesz od niskiej pożądanej prędkości.

Dlatego przed rozpoczęciem kontroli należy najpierw przejrzeć następującą listę kontrolną:

  • Uprość algorytm przetwarzania obrazu, aby uzyskać szybszą reakcję
  • Stwórz algorytm, który tworzy trajektorię na twojej ścieżce przy użyciu predefiniowanej prędkości
  • W każdej ramce:
    • Oblicz różnicę między trajektorią a pozycją piłki
    • Przekaż składnik delta-X do PID wschód-zachód, przekaż delta Y do PID północ-południe

Może się okazać, że lepiej jest utworzyć trajektorię po jednym segmencie na raz i przejść do następnego segmentu, gdy ta piłka zakończy poprzedni. W przeciwnym razie musisz uważać, aby piłka nie przekroczyła pożądanej trajektorii (co może być trudne do osiągnięcia)


1

Jeśli masz ustaloną pozycję dla odczytu kamery i mometarnego dla obu osi, nie musisz rozpoznawać pomalowanej ścieżki, otworów i ścian w ramkach. Można to zrobić jednym strzałem w czasie konfiguracji. W czasie wykonywania może być konieczne jedynie dokładne zlokalizowanie pojedynczej błyszczącej metalowej kuli.

Aby zlokalizować piłkę, możesz użyć 1 stałej podczerwieni LED i wąskopasmowego filtra w kamerze. Algorytm musi obliczyć najjaśniejszy piksel i przekształcić X, Y na rzeczywisty X, Y, biorąc pod uwagę następujące kroki:

  • znajdź najjaśniejszy piksel
  • użyj kąta dla obu osi (odczyt z serwomechanizmu), aby odzyskać odległość od kamery
  • użyj znacznika czasu do odczytu położenia osi
  • w razie potrzeby zastosować interpolację w celu odczytu pozycji
  • użyj znanego zniekształcenia soczewki
  • przetłumacz świat X, Y piksela na kąt odbicia od idealnej kuli, aby znaleźć prawdziwe centrum piłki w świecie X, Y
  • czas delta do odzyskania rzeczywistego czasu ramki
  • interpolacja w czasie pozycji na płaszczyźnie X, Y w razie potrzeby
  • wyślij wynik X, Y (t) do algorytmu PID
  • wyślij drugi cel karmienia X, Y (t) z generatora / sekwencji trajektorii
  • pozwól PID zdecydować o wydajności
  • wykonać dane wyjściowe (ostatnie kroki można wykonać równolegle)

Nie powinno to być intensywne obliczeniowo i zależy głównie od kilku wartości bezwzględnych.

Zwykle mały procesor powinien robić to z prędkością klatek na sekundę.


Nie jestem pewien, czy rozumiem twoje rozwiązanie. Uważam twoje rozwiązanie za interesujące. Jak mogę się upewnić, że moja piłka podąża właściwą ścieżką? Czy powinienem upewnić się, że mam zestaw punktów do naśladowania?
Sai

Tak. Oprogramowanie do sterowania ruchem musi zawsze mieć „generator trajektorii”, który jest rutyną tworzącą idealną skończoną sekwencję X, Y (t) dla każdego kroku w czasie. Ta sekwencja jest podawana do pierwszego wejścia pętli sterowania, drugie wejście pętli sterowania jest sekwencją rzeczywistych pozycji. Procedura kontrolna musi obliczyć błędy położenia / prędkości / przyspieszenia i wzmocnić / zsumować wszystkie błędy zgodnie z PID i wytworzyć wynikowe sygnały korekcyjne.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.