Jak mogę użyć biblioteki Arduino PID do prowadzenia robota w linii prostej?

19

Chciałbym stworzyć robota opartego na Arduino z 2 kołami, enkoderami kwadraturowymi na każdym kole, chipem sterownika mostka H (lub sterownikiem silnika) i kółkiem. Chcę użyć biblioteki PID, aby upewnić się, że prędkość jest proporcjonalna do odległości do przebycia.

Na poziomie koncepcyjnym (zakładając, że silniki nie reagują identycznie na poziomy PWM), jak mogę wdrożyć sterowanie PID, aby poruszało się ono po linii prostej i przy prędkości proporcjonalnej do pozostałej odległości do przebycia?

Robert
źródło
To pytanie również ma swoje miejsce, ponieważ jest oparte w szczególności na bibliotece Arduino PID .
Anindo Ghosh

Odpowiedzi:

18

Specyfika

Patrząc na podstawowy przykład PID Myślę, że wystarczy utworzyć instancję dwóch kopii kontrolera PID, po jednej dla każdego koła, enkodera i PWM:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Następnie, w loop()ekwiwalencie, po prostu odczytujesz oba enkodery, przekazujesz każdą wartość enkodera do odpowiedniej PIDi ostatecznie zapisujesz obie wartości PWM.

Na razie SetpointLefti SetpointRightmoże wskazywać na tę samą wartość, ale zdefiniowanie ich osobno w ten sposób pozwala dodać możliwość skrętu później.

Pojęcia

Chociaż może to działać w przypadku podstawowym, to, czy to wystarczy, zależy od tego, jak dokładna jest twoja linia prosta.

Martwe liczenie

Biorąc pod uwagę, że masz koderów na każdym kole, jeśli uruchomić dwie pętle PID i porównać każdego koła następujący błąd , można potencjalnie obliczyć maksymalny błąd Abbe na dystansie, przyjmując twoje koła nie ślizgać. Jeśli ten błąd jest mniejszy niż twoje wymagania, martwe obliczenia są wszystkim, czego potrzebujesz.

Jeśli jednak twoje koła są podatne na poślizgnięcie, być może masz ukryty błąd wynikający z błędu, którego twój system sterowania nie może wykryć i będziesz potrzebować jakiegoś sposobu na wykrycie poślizgu lub obliczenie pozycji niezależnie od koderów kół, a następnie użyj oprogramowania wyższego poziomu, aby poprawić wymagane pozycje / prędkości kół w celu utrzymania linii prostej.

Określenie pozycji względnej

Jak sugeruje John , możesz być w stanie użyć akcelerometru, aby określić pozycję, ale biorąc pod uwagę ich dokładność i efekt skumulowanych błędów w czasie, lepiej jest użyć danych akcelerometru do wykrywania i korygowania poślizgu kół.

W robotyce mobilnej techniki filtrowania Kalmana są powszechnie stosowane do łączenia danych z wielu źródeł, takich jak akcelerometr i enkodery kołowe, aby lepiej określić bieżącą pozycję.

Cokolwiek zrobisz z określeniem względnej pozycji, z czasem pozycja, w której uważasz, że się znajdujesz, będzie odchodzić od twojej faktycznej pozycji fizycznej.

Bezwzględne określenie pozycji

Jedynym sposobem na obejście tego jest posiadanie punktu odniesienia poza ramą odniesienia pojazdu.

Na przykład robot Roomba generalnie używa martwego liczenia do poruszania się po pokoju, ale ilekroć musi zadokować, szuka wiązki podczerwieni wysyłanej przez dok ładujący. Gdy robot Roomba losowo przechodzi przez tę wiązkę, wykrywa ją, blokuje na wiązce i podąża za nią z powrotem do źródła. W połączeniu z czujnikami uderzeń może on dokładnie ustawić się na stykach ładowania.

W przypadku robota może on mieć pozycję początkową, do której może wrócić i wykryć, że znajduje się w znanym miejscu. W tym momencie wie dokładnie, gdzie się znajduje i może raportować, jak daleko jest obliczona pozycja od rzeczywistej pozycji.

Inną opcją, jeśli chcesz, aby robot poruszał się po linii prostej na setkach metrów, byłoby przejście na inną technikę, na przykład dodanie tarczy GPS Arduino .

Połączenie technik

Ostatecznie, w zależności od wymagań dotyczących dokładności, może być konieczne zastosowanie kombinacji tych technik.

Jeśli możliwa jest belka prowadząca, możesz być w stanie zrobić to, co chcesz, po prostu za pomocą niewidzialnej techniki podążania za linią . Jeśli chcesz poruszać się po dowolnej dowolnej linii prostej w ograniczonym obszarze, to podobnie jak robot Roomba możesz użyć pary belek prowadzących (pod kątem prostym do siebie), aby umożliwić skorygowanie zsyntetyzowanej pozycji w jednej osi kartezjańskiej za każdym razem, gdy robot mija jedną z wiązek.

Jest tu wiele opcji, a to, co wybierzesz, będzie zależeć od tego, czego potrzebujesz.

Mark Booth
źródło
1

Jeśli nie używasz jednej osi do napędzania obu kół, jedyne rozwiązania, jakie widzę, to dodanie akcelerometru 3-osiowego lub innego czujnika do wykrywania orientacji robota i odpowiednie dostosowanie sygnałów do każdego silnika.


źródło
0

Jak wspomniano powyżej, zaczynasz od nakazania każdemu z kół, aby poruszało się z tą samą prędkością, a następnie PID upewnia się, że biegną z tą prędkością. Ale to NIE będzie idealne. Musisz ciągle sprawdzać i korygować błędy (1) okresowo odczytywać i porównywać liczby enkoderów dwóch kół i sprawić, aby jedno koło jechało nieco szybciej, jeśli to konieczne, aby wyrównać liczby. i (2) enkodery NIGDY nie są idealne, ponieważ potrzebujesz akcelerometru i kompasu.

Patrzysz na filtr Kalmana. jeśli chcesz połączyć dane z enkodera, kompasu i akcelerometru, aby uzyskać kurs.

użytkownik3150208
źródło
0

Ten link stanowi dobry przykład bez dwóch obliczeń PID. Możesz także wdrożyć imu / kompas do pomiaru prostej ścieżki

acs
źródło