Podejdź do korzystania z PID, aby ustawić robota różnicowego jadącego prosto

13

Rozważmy robota z napędem różnicowym, który ma dwa zmotoryzowane koła z enkoderem przymocowanym do każdego sprzężenia zwrotnego. Zakłada się, że dla każdego silnika prądu stałego istnieje funkcja, która przyjmuje wartość zmiennoprzecinkową od -1 do 1 i ustawia sygnały PWM w celu zapewnienia proporcjonalnej mocy dla tego silnika. Niestety, nie wszystkie silniki są sobie równe, więc wysłanie do każdego silnika tego samego sygnału PWM powoduje, że robot skręca w lewo lub w prawo. Staram się myśleć o tym, jak prowadzić robot prosto za pomocą koderów dołączonych do każdego silnika jako wejścia do pętli PID.

Oto jak bym to zrobił: wziąłbym różnicę między lewym i prawym enkoderem, ograniczył błąd między pewnym zakresem, znormalizował go do [-1, 1], a następnie zmapował go do mocy silnika od 0 do 1. Więc jeśli I i D byłyby zerowe, a otrzymamy błąd 1 (więc lewy silnik obrócił się znacznie bardziej niż prawy silnik), wtedy lewy silnik byłby ustawiony na 0, a prawy silnik na 1 (powodując trudny lewo).

Czy są z tym jakieś problemy? Jakie jest lepsze podejście?

Robz
źródło

Odpowiedzi:

5

Czy są z tym jakieś problemy?

Główny problem polega na tym, że chociaż proponowane rozwiązanie natychmiast poprawi niedopasowanie wydajności silników, nie poprawi skumulowanego błędu, nie mówiąc już o bardziej złożonych błędach w położeniu, takich jak błąd Abbe (patrz później).

Jakie jest lepsze podejście?

Istnieje kilka rzeczy, które możesz zrobić, w zależności od tolerancji błędów i wysiłku, jaki chcesz włożyć w ich naprawę.

Pierwszym krokiem byłoby skonfigurowanie pary pętli PID, po jednej dla każdego koła, dając im obie te same pozycje zapotrzebowania. Jak zasugerowałem w mojej odpowiedzi na podobne pytanie , jeśli utrzymasz oba koła w bardzo ścisłym błędzie w granicach miejsca, w którym je poprosisz, to zajmie trochę czasu, aby zebrać wystarczająco dużo błędu, aby spowodować zauważalną zmianę kierunku.

O wiele łatwiej będzie dostroić dwie nominalnie niezależne pętle PID na poziomie silnika niż dostroić pojedynczy złożony, współzależny połączony system. Aby znieść każdą zmianę pracy sterowania wyższego poziomu, naprawdę potrzebujesz, aby każdy silnik zachowywał się tak bardzo, jak to możliwe, z drugim silnikiem przez możliwie jak najdłuższy czas, a to naprawdę wymaga oddzielnych pętli serwo.

Istnieje jednak wiele dalszych komplikacji i zależy to od dokładności, jakiej potrzebujesz i od tego, ile wysiłku jesteś gotów podjąć, aby je poprawić, aby wybrać odpowiednie rozwiązanie. Może się zdarzyć, że Dead Reckoning jest wystarczający lub konieczne może być dodanie do robota określenia pozycji względnej lub absolutnej.

Jednym z problemów jest to, że nawet jeśli lewe i prawe koła poruszają się enkoderem 1000, to nadal możesz znaleźć się w innej pozycji podczas dwóch różnych biegów.

Na przykład, powiedzmy, że wystąpił maksymalny błąd następujący po 10 zliczeniach enkoderów, a wasze silniki pracują z prędkością powiedzmy 10 zliczeń enkoderów na iterację pętli PID. Twój lewy silnik może się poruszać 5,10,10,10 ... 10,5, podczas gdy twój prawy silnik może mieć profil 4,11,10,10 ... 10,5, a nawet niewielką różnicę przyspieszenia na początku ruchu może spowodować, że robot ruszy w nieco złym kierunku. Nie tylko to, ale im dalej posuwasz się w tym kierunku, tym większy będzie błąd w wartościach bezwzględnych. O tym mówimy, gdy mówimy o błędzie Abbe , i bez złożonego modelu kinematycznego lub jakiegoś zewnętrznego odniesienia nigdy nie będziesz w stanie go naprawić.

Aby uzyskać więcej informacji, zobacz moją odpowiedź na podobne, ale nie do końca zduplikowane pytanie: jak mogę użyć biblioteki Arduino PID do prowadzenia robota w linii prostej? i moja odpowiedź na powiązaną optymalizację Line Follower

Mark Booth
źródło
2

Mam bota z 2 niezależnie napędzanymi kołami.

Zdecydowałem się użyć żyroskopu, aby utrzymać go w pożądanym kierunku, nierówności poślizgnięcia, a nawet podniesienie go i odwrócenie nie ma dla niego większego znaczenia, ponieważ po prostu poprawi jego kurs.

Używam pojedynczego PID, który dodaje / odejmuje korektę pożądanej prędkości prądu dla każdego z 2 silników zgodnie z błędem w bieżącym kursie (kierunku) określonym przez żyroskop.

Na przykład ustawiłem prędkość na 50%, a nagłówek na 20 stopni. normalnie napędzałoby to oba silniki przy 50% mocy. ale gdy nagłówek odchodzi, PID dokona korekty dodając pewną moc do jednego silnika i usuwając pewną moc z drugiego, więc możesz skończyć z 45% / 55% mocą dzieloną między silnikami, gdy pid koryguje kurs.

Gyros mają jednak swoje problemy, nawet pomimo tego, że spędziłem trochę czasu na kalibracji, wciąż uważam, że moje gryo ma dryf około 1 stopnia na minutę. Być może dlatego, że Ziemia obraca się o 15 stopni na godzinę, należy to również wziąć pod uwagę w dłuższej perspektywie.

Jak już wspomniano, enkodery na kołach to świetny pomysł, aby naprawdę wiedzieć, jak daleko przeszedłeś.

Robert Sutton
źródło
Chciałbym zobaczyć twój kod do tego. Zaczynam tą samą ścieżkę od żyroskopu / akcelerometru / magnetometru, ale wciąż jestem na bardzo wczesnym etapie, próbując po prostu odczytać odczyt z tych czujników.
Ron Smith,
Oto link do mojego kodu, obawiam się, że może nie być to łatwe do zrozumienia. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton