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 PID
i ostatecznie zapisujesz obie wartości PWM.
Na razie SetpointLeft
i SetpointRight
moż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.
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.