Оптимизация линейного читателя

9

Я работаю над созданием робота линейного последователя и хочу оптимизировать его производительность. Было предложено использовать алгоритм PID. Я много читал о PID, но немного смущен относительно следующего:

Я вычислил error_value, используя kpproportional+... Но что касается изменения скорости двигателя, я запутался в том, что использовать во время сравнения разницу (т. Е. Текущее положение - уставка) или значение ошибки. То есть я должен использовать

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }

или

if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }

Также есть ли какой-либо определенный диапазон для значений констант kp, ki а также kd? Я использую робота с дифференциальным колесом для моего линейного последователя.

Также я был бы рад, если бы кто-нибудь предложил мне какой-либо другой продвинутый алгоритм оптимизации для улучшения робота линейного последователя.

метеоры
источник
Я не уверен, какую терминологию вы используете, но в терминологии систем управления обычно ваша «разница» - это значение ошибки, а (насколько я могу судить) ваша «error_value» - это команда управления.
Тим Уэскотт
Привет, переменная KpНапример, ваша пропорциональная выгода. Вы знакомы с теорией управления?
leCrazyEngineer
@leCrazyEngineer Я не помню большую часть этого вопроса, как это было 3 года назад. Я тоже понятия не имею о теории управления. Возможно, парни, которые ответили, имели бы некоторую подсказку.
Метеоры

Ответы:

8

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

Поэтому, если ваш линейный датчик выводит значение от -1 до 1, где 0 является центром датчика, тогда вы захотите, чтобы ваша уставка была равна нулю (и показания датчика и разница будут одинаковыми). Если ваш линейный датчик выводит значение от 0 до 10, тогда вы захотите, чтобы ваша уставка была 5 (и ваш датчик считывал и разница будет отличаться).

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

Рассмотрим ситуацию, когда нужно обратиться θ радианы влево, чтобы исправить ошибку e и ваша текущая скорость S0:

Дифференциальное управление

Таким образом, ваше левое колесо должно двигаться в SL=rθ и ваше правое колесо должно путешествовать в SR=(r+b)θ,

Для поддержания одинаковой общей скорости S0, тебе нужно S0=(r+b/2)θтак что левое колесо нужно будет проехать по SL=S0(b/2)θ в то время как правое колесо нужно будет путешествовать в SR=S0+(b/2)θ,

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

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

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

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

Конкретные значения P, D и I будут определяться отзывчивостью вашей системы. Общие советы по настройке параметров PID см. В моем ответе и др. О том, каковы хорошие стратегии для настройки петель PID?

Марк Бут
источник
according to you "you should just calculate new values based on the error value, since a positive value and a negative value should have opposite and symmetric effects on the motors." but how do I determine which motor should get effect of the error?
meteors
@AnkitShah Они оба делают. Надеюсь, мое обновление объяснит это немного лучше.
Марк Бут
Спасибо @Mark Бут, который действительно объяснил вещи. У меня недостаточно репутации. на сайте, чтобы высказать свой ответ, но на самом деле это было хорошо объяснено.
метеоры
Рад, что смог помочь @AnkitShah - если вы отредактируете свой вопрос, чтобы устранить некоторую двусмысленность (например, используете ли вы дифференциал или автоматическое рулевое управление), то вы получите возражение по крайней мере от меня и, возможно, от других. Это не займет много времени, чтобы получить 15 представителей, если вы слушаете предложения людей.
Марк Бут
Благодаря @Mark, есть ли другие алгоритмы, которые помогают уменьшить ошибку и заставляют бота двигаться более плавно и следовать линии?
метеоры
3

Вы можете проверить этот вопрос о том, как настроить PID .

Похоже, вы путаете роль errorв этом расчете. Уравнение PID измеряет погрешность (фактическое положение - желаемое положение) и определяет, какой «отклик» должен быть задан в контроллере (например, какое усилие).

Поэтому вместо того, чтобы говорить if (error_value > 0) { }, вы должны говорить что-то вроде response = get_PID_calculation(error_value). В зависимости от конструкции вашего конкретного транспортного средства, этот ответ будет отправлен на приводной двигатель в виде величины дроссельной заслонки, рулевого управления в качестве желаемого угла или какого-либо другого управляющего входа.

Ян
источник
Это ссылка на мой код Arduino, что вы предлагаете. www1.datafilehost.com/d/5dcbdd4e
метеоры
Это зависит от того, что робот делает не так?
Ян