Я хотел бы создать робота на базе Arduino с 2 колесами, квадратурными энкодерами на каждом колесе, микросхемой драйвера H-моста (или контроллером двигателя) и кастером. Я хочу использовать библиотеку PID, чтобы убедиться, что скорость пропорциональна расстоянию, которое нужно пройти.
На концептуальном уровне (при условии, что двигатели не реагируют одинаково на уровни ШИМ), как я могу реализовать ПИД-регулятор, чтобы он двигался по прямой линии и со скоростью, пропорциональной оставшемуся расстоянию?
Ответы:
конкретика
Глядя на базовый пример PID, я думаю, что вам просто нужно создать две копии контроллера PID, по одной для каждого колеса, датчика и pwm:
Затем, в вашем
loop()
эквиваленте, вы просто читаете оба датчика, передаете каждое значение датчика соответствующемуPID
и, наконец, записываете оба значения ШИМ.На данный момент
SetpointLeft
иSetpointRight
может фактически указывать на одно и то же значение, но определяя их отдельно, как это позволяет добавить возможность поворота позже.Концепции
Хотя это может работать для основного случая, на самом ли деле этого достаточно, зависит от того, насколько точной должна быть ваша прямая линия.
Счисление
Учитывая, что у вас есть датчики на каждом колесе, если вы запустите две петли ПИД-регулятора и сравните следующую ошибку каждого колеса , вы можете рассчитать максимальную ошибку abbe на расстоянии, предполагая, что ваши колеса не проскальзывают. Если эта ошибка меньше ваших требований, то все, что вам нужно, - это полный расчет .
Однако, если ваши колеса склонны к проскальзыванию, то вы можете скрыть следующую ошибку, которую ваша система управления не может обнаружить, и вам потребуется какой-либо способ обнаружить проскальзывание или рассчитать положение независимо от ваших колесных датчиков, а затем использовать программное обеспечение более высокого уровня для исправления требуемые положения колес / скорости для поддержания прямой линии.
Определение относительной позиции
Как предполагает Джон , вы можете использовать акселерометр для определения положения, но, учитывая их точность и влияние накопленных ошибок с течением времени, вам лучше использовать данные акселерометра для обнаружения и корректировки проскальзывания колеса.
В мобильной робототехнике методы фильтрации Калмана обычно используются для объединения данных из нескольких источников, таких как акселерометр и колесные датчики, для лучшего определения текущего положения.
Однако, что бы вы ни делали с определением относительного положения, с течением времени положение, в котором вы считаете себя , смещается от вашего реального физического положения.
Абсолютное определение позиции
Единственный способ обойти это - иметь точку отсчета за пределами системы отсчета вашего транспортного средства.
Например, roomba, как правило, использует мертвые расчеты для перемещения по комнате, но всякий раз, когда ей нужно стыковаться, она ищет луч инфракрасного света, излучаемый зарядным доком. По мере того, как румба случайно перемещается через этот луч, она обнаруживает его, фиксирует на луче и следует за ним обратно к своему источнику. В сочетании с датчиками удара он может точно позиционироваться на зарядных контактах.
Для вашего робота у него может быть домашняя позиция, куда он может вернуться и обнаружить, что находится в этом известном месте. В этот момент он точно знает, где он находится, и может сообщить, насколько далеко находится его расчетная позиция от фактической позиции.
Другим вариантом, если вам нужно, чтобы ваш робот путешествовал по прямой линии на сотни метров, было бы переключение на другую технику, например, добавление щита Arduino GPS .
Сочетание техник
В конечном итоге, в зависимости от ваших требований к точности, вам может потребоваться использовать комбинацию этих методов.
Если возможен направляющий луч, вы можете очень просто делать то, что хотите, с помощью техники невидимой линии . Если вам нужно перемещаться по любой произвольной прямой линии в ограниченной области, то, как и в случае комнаты, вы можете использовать пару направляющих (под прямым углом друг к другу), чтобы вы могли скорректировать свое синтезированное положение по одной декартовой оси. каждый раз, когда робот проходит один из лучей.
Здесь есть много вариантов, и то, что вы выберете, будет зависеть от того, что вам нужно.
источник
Если вы не используете одну ось для управления обоими колесами, единственное решение, которое я вижу, - это добавить 3-осевой акселерометр или другой датчик для определения ориентации робота и соответствующим образом настроить сигналы для каждого двигателя.
источник
Как уже было сказано выше, вы начинаете с того, что говорите каждому колесу двигаться с одинаковой скоростью, а затем PID проверяет, что они работают на этой скорости. Но это не будет идеально. Вам необходимо постоянно проверять и исправлять ошибки (1), периодически считывать и сравнивать счетчики двух колесных датчиков и, если необходимо, заставить одно колесо двигаться немного быстрее, чтобы получить равные значения. и (2) датчики НИКОГДА не совершенны, вам нужен акселерометр и компас.
Вы смотрите на фильтр Калмана. если вы хотите объединить данные энкодера, компаса и акселерометра, чтобы получить направление.
источник
Эта ссылка дает хороший пример без расчета двух PID. Также вы можете реализовать imu / compass для измерения прямого пути
источник