Подход к использованию ПИД-регулятора для прямого движения дифференциального робота


13

Рассмотрим робота с дифференциальным приводом, который имеет два моторизованных колеса с энкодером, прикрепленным к каждому для обратной связи. Предполагается, что есть функция для каждого двигателя постоянного тока, которая принимает значение с плавающей запятой от -1 до 1 и устанавливает сигналы ШИМ для обеспечения пропорционального количества мощности для этого двигателя. К сожалению, не все двигатели созданы равными, поэтому, посылая каждому двигателю один и тот же сигнал ШИМ, робот поворачивается влево или вправо. Я пытаюсь подумать о том, как правильно управлять роботом, используя энкодеры, подключенные к каждому двигателю, в качестве входа в контур ПИД.

Вот как я бы это сделал: я бы взял разницу между левым и правым энкодерами, ограничил ошибку в некотором диапазоне, нормализовал бы ее до [-1, 1], а затем сопоставил бы ее с мощностью двигателя от 0 до 1. Таким образом, если бы I и D были равны нулю, и мы получили ошибку 1 (таким образом, левый двигатель повернул намного больше, чем правый двигатель), то левый двигатель был бы установлен в 0, а правый двигатель был установлен в 1 (вызывая жесткую осталось).

Есть ли проблемы с этим? Какой подход лучше?

Ответы:


5

Есть ли проблемы с этим?

Основная проблема заключается в том, что, хотя предлагаемое вами решение будет мгновенно исправлять несоответствие между характеристиками двигателей, оно не будет исправлять накопленную ошибку, не говоря уже о более сложных ошибках в положении, таких как ошибка Аббе (см. Далее).

Какой подход лучше?

Есть несколько вещей, которые вы можете сделать, в зависимости от того, какова ваша терпимость к ошибкам и сколько усилий вы хотите приложить для их исправления.

Первым шагом было бы установить пару петель ПИД, по одному на каждое колесо, предоставляя им одинаковую позицию спроса. Как я предположил в своем ответе на аналогичный вопрос , если вы держите оба колеса в пределах очень жесткой границы ошибки, в которой вы их просите, тогда потребуется некоторое время, чтобы накопить достаточно ошибки, чтобы вызвать заметное отклонение.

Также будет гораздо проще настроить две номинально независимые петли ПИД-регулятора уровня двигателя, чем настроить одну сложную, взаимозависимую комбинированную систему. Чтобы выдержать любое изменение в работе регулятора более высокого уровня, вам действительно нужно, чтобы каждый двигатель работал как можно более сходно с другим двигателем в течение максимально возможного времени, а для этого действительно требуются отдельные сервоциклы.

Однако существует ряд дополнительных сложностей, и это зависит от того, какая точность вам нужна и сколько усилий вы готовы предпринять, чтобы исправить их, в отношении того, какое решение вы выберете. Может случиться так, что мертвого счета достаточно, или вам может понадобиться добавить определение относительного или абсолютного положения вашему роботу.

Одна проблема заключается в том, что даже если ваше левое и правое колеса движутся на 1000 отсчетов энкодера, вы все равно можете оказаться в другом положении на двух разных трассах.

Например, допустим, у вас есть максимальная следующая ошибка, равная 10 счетчикам энкодеров, и ваши двигатели работают со скоростью, скажем, 10 счетчиков энкодеров на одну итерацию цикла ПИД. Ваш левый мотор может двигаться 5,10,10,10 ... 10,5, в то время как ваш правый мотор может иметь профиль 4,11,10,10 ... 10,5 и даже эту небольшую разницу в ускорении на старте движения может привести к тому, что робот отправится в неправильном направлении. И не только это, но чем дальше вы движетесь в этом направлении, тем больше будет ошибка в абсолютном выражении. Это то, о чем мы говорим, когда говорим об ошибке Аббе , и без сложной кинематической модели или какой-либо внешней ссылки вы никогда не сможете исправить это.

Для получения дополнительной информации см. Мой ответ на похожий, но не совсем повторяющийся вопрос: как я могу использовать библиотеку Arduino PID для управления роботом по прямой линии? и мой ответ на также связанную оптимизацию Line Follower


2

У меня есть бот с двумя независимо управляемыми колесами.

Я решил использовать гироскоп, чтобы он двигался в нужном направлении, удары проскальзывания и даже его подъем и разворот не имеют большого значения для него, поскольку он просто исправит его направление.

Я использую один PID, который добавляет / вычитает поправку к желаемой текущей скорости для каждого из 2 двигателей в соответствии с ошибкой в ​​текущем курсе (направлении), определенной гироскопом.

Например, я установил скорость на 50% и курс на 20 градусов. это обычно приводило бы в движение оба двигателя на 50% мощности. но по мере того, как заголовок отклоняется, ПИД будет выполнять регулировки, добавляя некоторую мощность к одному двигателю и удаляя некоторую мощность из другого, так что вы можете получить 45% / 55% -ое разделение мощности между двигателями, поскольку пид корректирует курс.

У гироскопов есть свои проблемы, хотя, даже потратив некоторое время на калибровку, я все же обнаружил, что у моего грио дрейф около 1 градуса в минуту. Это может быть потому, что земля вращается на 15 градусов в час, это также следует учитывать в долгосрочной перспективе.

Как указывалось выше, энкодеры на колесах - отличная идея, чтобы точно знать, как далеко вы продвинулись.


Я хотел бы увидеть ваш код для этого. Я начинаю по тому же пути с гироскопа / акселерометра / магнитометра, но я все еще на самой ранней стадии - просто пытаюсь разобраться в показаниях этих датчиков.
Рон Смит

Вот ссылка на мой код, боюсь, его нелегко понять. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Роберт Саттон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.