Я работаю над созданием робота линейного последователя и хочу оптимизировать его производительность. Было предложено использовать алгоритм PID. Я много читал о PID, но немного смущен относительно следующего:
Я вычислил error_value, используя Но что касается изменения скорости двигателя, я запутался в том, что использовать во время сравнения разницу (т. Е. Текущее положение - уставка) или значение ошибки. То есть я должен использовать
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 }
Также есть ли какой-либо определенный диапазон для значений констант , а также ? Я использую робота с дифференциальным колесом для моего линейного последователя.
Также я был бы рад, если бы кто-нибудь предложил мне какой-либо другой продвинутый алгоритм оптимизации для улучшения робота линейного последователя.
источник
Ответы:
При использовании контура ПИД-регулятора для управления по линии следования ваша уставка всегда будет одинаковой. Вы всегда хотите, чтобы линия находилась в одном и том же положении относительно робота, например, в центре вашего датчика.
Поэтому, если ваш линейный датчик выводит значение от -1 до 1, где 0 является центром датчика, тогда вы захотите, чтобы ваша уставка была равна нулю (и показания датчика и разница будут одинаковыми). Если ваш линейный датчик выводит значение от 0 до 10, тогда вы захотите, чтобы ваша уставка была 5 (и ваш датчик считывал и разница будет отличаться).
Поскольку вы управляете, настраивая колеса на разные скорости, а затем плавно следовать по линии с постоянной скоростью, вы, вероятно, захотите отрегулировать скорости для обоих колес на основе ошибки. Например, если вам нужно повернуть налево, чтобы остаться на линии, вы замедляете левое колесо и ускоряете правое колесо. Чем больше вам нужно повернуть, тем больше вам нужно будет замедлить внутреннее колесо, и тем больше вам нужно будет ускорить внешнее колесо.
Рассмотрим ситуацию, когда нужно обратитьсяθ радианы влево, чтобы исправить ошибку е и ваша текущая скорость S0 :
Таким образом, ваше левое колесо должно двигаться вSL= r θ и ваше правое колесо должно путешествовать в Sр= ( r + b ) θ ,
Для поддержания одинаковой общей скоростиS0 , тебе нужно S0=(r+b/2)θ так что левое колесо нужно будет проехать по SL=S0−(b/2)θ
в то время как правое колесо нужно будет путешествовать в SR=S0+(b/2)θ ,
Поскольку ваша ошибка стремится к нулю, скорости каждого двигателя также будут стремиться друг к другу. По мере роста погрешности также будут расти различия в скорости.
Вам может даже понадобиться, чтобы внутреннее колесо вращалось назад, если ваш датчик говорит вам, что линия изгибается сильнее, чем расстояние между вашими колесами. Это сложности, которые вы можете пройти шаг за шагом, хотя ваш контроль становится все более изощренным.
Кроме того, поскольку ваша ошибка будет иметь как положительные, так и отрицательные значения (чтобы представить континуум от шкалы слева ... слишком далеко влево ... на линии ... слишком далеко вправо ... от шкалы вправо, то вы должны никогда не нужно спрашивать,
if
является ли ошибка положительной или отрицательной, вы должны просто рассчитать новые значения на основе значения ошибки, поскольку положительное значение и отрицательное значение должны оказывать противоположное и симметричное влияние на двигатели.Обратите внимание, что для следования по линии вы можете избежать только пропорционального коэффициента усиления (т. Е. Оставить остальные термины равными нулю). Реализация производного термина вполне может позволить вам увеличить член пропорционального усиления, чтобы получить более отзывчивую систему, но интегральный термин вряд ли поможет. Тот факт, что если ваш робот движется в неправильном направлении, ошибка станет больше, это означает, что физические движения ваших роботов в любом случае будут действовать как интегральный термин.
Конкретные значения P, D и I будут определяться отзывчивостью вашей системы. Общие советы по настройке параметров PID см. В моем ответе и др. О том, каковы хорошие стратегии для настройки петель PID?
источник
Вы можете проверить этот вопрос о том, как настроить PID .
Похоже, вы путаете роль
error
в этом расчете. Уравнение PID измеряет погрешность (фактическое положение - желаемое положение) и определяет, какой «отклик» должен быть задан в контроллере (например, какое усилие).Поэтому вместо того, чтобы говорить
if (error_value > 0) { }
, вы должны говорить что-то вродеresponse = get_PID_calculation(error_value)
. В зависимости от конструкции вашего конкретного транспортного средства, этот ответ будет отправлен на приводной двигатель в виде величины дроссельной заслонки, рулевого управления в качестве желаемого угла или какого-либо другого управляющего входа.источник