Пропорциональный интегральный дифференциальный ПИД-регулятор в робототехнике Lego Mindstorms. Пропорциональный регулятор

Пропорциональный регулятор

Описание

При автоматическом регулировании управляющее воздействие u(t) обычно является функцией динамической ошибки - отклонения e(t) регулируемой величины x(t) от ее заданного значения x0(t) :

e(t) = x0(t) – x(t).

Это принцип Ползунова-Уатта регулирования по отклонению, или принцип обратной связи. Математическое выражение функциональной зависимости желаемого управляющего воздействия u0(t) от измеряемых регулятором величин называется законом или алгоритмом регулирования, о котором говорилось выше.

Пропорциональный регулятор - это устройство, оказывающее управляющее воздействие на объект пропорционально его отклонению от заданного состояния:

Здесь k - это коэффициент усиления регулятора.

Заданное состояние x0 принято называть уставкой , а отклонение от него e - невязкой. Далее для определенности будем обозначать невязку сокращением err (от английского слова «error» - ошибка).

Управление мотором

Опытный воин не станет размахивать мечом, как это делает робот на релейном регуляторе. Надо придумать алгоритм, который задержит мотор, удерживающий меч, в строго фиксированном положении (рис. 7.1). В этом поможет П-регулятор.

Пусть e 1 - показания датчика оборотов1 на моторе A - является регулируемой величиной. Уставка x0 = 45, а невязка e = 45 – e 1. Тогда управляющее воздействие на мотор задается формулой

u = k ∙ (45 – e 1).

Здесь k - коэффициент усиления, например 5, который позволит усилить реакцию мотора даже при небольших отклонениях от уставки.

1 Не стоит путать математическое обозначение невязки e (от error) с показаниями энкодера e 1 (от encoder), предопределенной переменной среды Robolab.

При отклонении в положительную сторону на мотор будет подаваться отрицательное управляющее воздействие, и наоборот. Это управление можно применять к мотору в цикле с небольшой задержкой в 1-10 мс, чтобы разгрузить контроллер (рис. 7.8).

Рис. 7.8. Алгоритм управления мотором на пропорциональном регуляторе.

Если усиливающий коэффициент увеличить с 5 до 100, наш пропорциональный регулятор начнет работать как релейный, вызывая сильные колебания из-за возникновения эффекта перерегулирования.

В языке RobotC нет такого удобного обозначения показаний энкодера как в Robolab, поэтому программа выглядит немного длиннее:

int k=5, u; nMotorEncoder=0; while(true)

u=k*(45-nMotorEncoder); motor=u;

Далее, чтобы нанести «удар мечом», достаточно, имея вместо числа 45 переменную, изменить ее значение извне, например, из параллельной задачи. Об этом написано в разделе, посвященном роботамбарабанщикам в главе 8.

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

В контроллере NXT есть четыре встроенных таймера, каждый из которых может отмерять время в десятых, сотых и тысячных долях секунды. Освоим первый таймер, который за секунду совершает 10 «ти-

ков». В Robolab он обозначается T1 или Timer100ms1, а в RobotC - timer100.

Угол alpha отклонения мотора, заданный в предыдущем примере значением 45, поставим в зависимость от показаний таймера с ускоряющим коэффициентом k 2:

alpha = k2 ∙ T1.

Управляющее воздействие останется прежним с усиливающим коэффициентом k 1:

u = k 1 ∙ (alpha – e 1).

Кратко в программе на языке Robolab управляющее воздействие подадим сразу на мотор, предварительно инициализировав таймер

Рис. 7.9. Управление скоростью мотора - один оборот в секунду.

Коэффициент k 2 = 36 определяет, что за секунду значение alpha набегает до 360, что соответствует одному полному обороту двигателя:

int k1=2, k2=36, u, alpha; nMotorEncoder=0; ClearTimer(T1); while(true)

alpha=timer100*k2; u=k1*(alpha-nMotorEncoder); motor=u;

Используя целочисленное деление, принятое в языке C (и в Robolab) для переменных целого типа, можно достичь дискретного изменения угла, т.е. приращения его раз в секунду:

alpha = T 1 / 10 ∙ k 2.

При коэффициенте k 2 = 60 перемещения балки будут соответствовать движению секундной стрелки на циферблате часов. Но это мало

заметно. Для наглядности можно задать k2 = 30, тогда стрелка сделает полный оборот за 12 «тиков» по 30 градусов каждый. Будьте внимательны с последовательностью операций целочисленного деления и умножения, при изменении их порядка или «сокращении» непременно изменится результат (рис. 7.10).

Рис. 7.10. Ускоренная имитация движения стрелки часов.

И, наконец, пример математического барабанщика. Вместо постоянного движения вперед стрелка будет совершать колебания впередназад под управлением П-регулятора. В этом поможет операция деления с остатком, которая в языке C обозначается знаком %. Остаток от деления неотрицательного целого числа на 2 всегда будет 0 или 1:

alpha = T 1 % 2 ∙ k 2.

Усилив отклонение в k 2=15 раз, получим колеблющуюся уставку alpha , что вынудит регулятор 5 раз в секунду перемещать мотор то в 0º, то в 15 градусов. Изменения в программе невелики. Рассмотрим пример на RobotC:

int k1=3, k2=15, u, alpha; nMotorEncoder=0; ClearTimer(T1); while(true)

alpha=timer100%2*k2; u=k1*(alpha-nMotorEncoder); motor=u;

Этот прототип барабанщика наносит удары по столу через одинаковые промежутки времени. Главное, стартовать в нужной позиции. Используя целочисленную математику, можно задать и более сложный ритмический рисунок, например (табл. 7.1):

alpha = T 1 % 5 % 2 ∙ k 2.

center = S3.

Коэффициент определяется в цикле:

k 1 = c + (S 3 - center ) / k 2.

Рис. 7.36. Движение по линии на пропорциональном регуляторе с плавающим коэффициентом.

Полученный закон управления коэффициентами усиления можно применить не только к пропорциональной составляющей, но и к любой другой, а также к управляющему воздействию в целом (рис. 7.36).

ПИД-регулятор

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

Рис. 7.37. Схема ПИД-регулятора.

Это упрощенная схема. На вход регулятора подается значение динамической ошибки e (t ), а на выходе вырабатывается управляющее воздействие u (t ):

u (t ) = p + i + d = k p ∙ e (t ) + k i ∙ ò t

e (τ)d τ + k d ∙

de .

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

Интегральная составляющая накапливает отрицательный опыт (суммирует ошибки) и вырабатывает компенсирующее воздействие. При минимальных отклонениях пропорциональная составляющая «слабеет» и интегральная, за счет своего быстрого увеличения суммированием, помогает «дотянуть» регулируемую величину до уставки.

Дифференциальная составляющая (Д-составляющая) следит за скоростью изменения состояния системы и препятствует возможному перерегулированию. В некоторых случаях Д-составляющая противоположна пропорциональной по знаку, а в некоторых совпадает.

С пропорциональной составляющей мы уже знакомы, дифференциальная описана в предыдущей главе 6. Возьмемся за интегральную. Эта составляющая определяется динамически, суммируясь с предыдущим значением:

i = i + ki × e(t) × dt .

Физический смысл величины e (t ) × dt состоит в том, что она про-

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

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

Формат RAW

Данные с датчиков поступают в контроллер NXT в необработанном «сыром» виде. Все датчики передают операционной системе цифровое значение от 0 до 1023, которое затем обрабатывается соответствующим драйвером и приводится к более понятному виду (расстояние 0...255, освещенность 0...100, касание 0 или 1 и т. д.). Но данные можно получать и, минуя драйвер, напрямую. Такой необработанный формат принято называть RAW (от англ. «сырой»). В некоторых случаях с помощью него можно получить бóльшую точность. Так, например, диапазон значений датчика освещенности может увеличиться примерно в 10 раз. Именно эта возможность использована далее.

Получать данные в формате RAW можно и в Robolab, и в RobotC. Для этого датчик инициализируется соответствующим образом, а данные с него считываются с использованием специальной предопределенной переменной.

Балансирующий робот

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

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

При отклонении назад показания датчика понижаются и робот начнает движение назад. За все это отвечает пропорциональная составляющая. На роль интегральной и дифференциальной составляющих отводится страховка от перерегулирования.

Рис. 7.38. Балансирующий робот-сигвей.

На рис. 7.39 представлен алгоритм в Robolab. Бóльшую его часть занимает инициализация переменных. Для повышения точности не только данные c датчика считываются в формате RAW, но большинство переменных объявляется в вещественном формате float. Собственно ПИД-алгоритм находится в цикле.

Рис. 7.39. Алгоритм балансировщика основан на ПИД-регуляторе.

Следуя традиции движения по линии, в качестве уставки используем переменную grey - средние показания датчика освещенности в положении равновесия. Новый параметр scale задает масштабирование управляющего воздействия. По сути, это ослабляющий коэффициент, поскольку вырабатываемое регулятором значение слишком высоко для моторов NXT. Можно было бы внести его внутрь уже имеющихся коэффициентов, но для RobotC этот параметр будет другой, а коэффициенты те же.

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

Аналогичный пример на RobotC несколько отличается в силу ряда причин. Во-первых, быстродействие NXT с прошивкой этой среды выше примерно в 1.4 раза, чем у Robolab, поэтому коэффициент scale следует увеличить. Во-вторых, RAW-значения передаются в правильном порядке и потребуется установить реверс моторов или просто подавать отрицательное управляющее воздействие:

int grey=SensorRaw; int err, errold=0;

float kp=25, ki=350, kd=0.3; float scale=14;

float dt=0.001; float p, i=0, d, u; while (true)

err= grey-SensorRaw; //Отклонение с обратным знаком p=kp*err;

i=i+ki*err*dt; d=kd*(err-errold)/dt; errold=err; u=(p+i+d)/scale; motor=u; motor=u; wait1Msec(1);

Элементы теории автоматического управления в школе1

Важной и интересной методической задачей является «переброска мостика» между областями знаний специалиста и школьника, помогающая учащимся школы увидеть перспективу будущей специальности, т.е. осуществить профориентацию, а студентам увидеть практическую применимость своих профессиональных знаний. Для достижения подобного эффекта были разработаны приемы расчета регуляторов, использующие математический аппарат, не выходящий за рамки школьных программ по математике и физике. В частности, вместо дифференциальных уравнений использованы разностные, хорошо соответствующие дискретному характеру взаимодействия объекта и регулятора при компьютерном управлении.

Рассмотрим, например, задачу построения пропорциональных (П) и пропорционально-дифференциальных (ПД) регуляторов в задаче управления движением мобильного робота вдоль стены. Обозначим через x t расстояние между роботом и стеной, через θt - курсовой угол робота, а через u t - управляющее воздействие в момент с порядковым номером t , соответственно, где t = 0, 1, 2, … - номера моментов изме-

рений. Считается, что опрос датчиков и изменения величины управляющего воздействия производится через равные промежутки времени h . Для задач управления Lego NXT роботами естественно считать, что управляющим воздействием является разность угловых скоростей вращения колес, пропорциональная скорости изменения курсового угла:

Считая отклонения курса от номинального θt =0 малыми, а среднюю скорость робота постоянной: vt=v , динамику изменения переменных состояния робота в первом приближении можно описать линейными уравнениями состояния:

где g = h2vr / b.

Зададим желаемое расстояние до стены x*> 0 и определим цель управления (ЦУ) соотношением

xt → x* при t→∞.

Теперь естественным образом введем на содержательном уровне понятие асимптотической устойчивости, как свойства решений системы (4), обеспечивающего достижение ЦУ (5) при любых начальных условиях, достаточно мало отличающихся от целевых. Легко видеть, что при u t = 0 решением уравнения (4) является любое постоянное значение x t = x* . Но поскольку уравнение (4), соответствующее модели двойного интегратора (двойного сумматора), не обладает свойством асимптотической устойчивости, ЦУ (5) при постоянном управлении не достигается. Это легко демонстрируется как аналитически - суммированием ря-

Подробности Автор: Коновалов Игорь     Пропорциональный регулятор является усовершенствованием . Главный минус релейного в том, что ему все равно, насколько текущие значения отличаются от нормального значения датчика. У него только два состояния - либо попытаться повысить значения датчика на определенное постоянное число, если они меньше нормального значения, либо повысить. Из-за этого происходят колебания с постоянной амплитудой, что очень неэффективно.
    Намного более логично определять, насколько "далеко" находятся текущие показания от нормальных, и в зависимости от этого менять амплитуду. Чтобы стало более понятно, разберем на примере. Пример, как и в прошлой статье, тот же самый: робот из Lego Mindstorms EV3 едет по черной линии с помощью одного датчика цвета в режиме освещенности.

Робот пытается ехать вдоль границы между белым и черным, а там датчик показывает примерно 50 % освещенности. И чем дальше он от нормального положения, тем больше усилий прилагает робот, чтобы вернуться к 50 %.
    Для написания программы воспользуемся терминами "ошибка", "управляющее воздействие". Ошибка - разность текущего показания датчика и нормального. В нашем случае, если сейчас робот видит 20 % освещенности, то ошибка равна 20-50= -30 %. Знак ошибки указывает, в какую сторону роботу стоит повернуть, чтобы избавиться от ошибки. Теперь мы должны указать моторам, в какую сторону роботу поворачивать, с какой скоростью и насколько резко. Нужно оказать управляющее воздействие на моторы, под которым подразумевается, насколько резко ему стоит возвращаться к нормальному положению. Управляющее воздействие (UP) рассчитывается как ошибка (error) умноженная на коэффициент пропорциональности (k). Этот коэффициент используется для усиления или уменьшения влияния ошибки на управляющее воздействие. Управляющее воздействие подается в рулевое управление, где устанавливается средняя скорость робота.
    Как же настроить коэффициент пропорциональности? Опытным путем подбирать значения, для проезда траектории он может быть, например, от 0,2 до 1,5 в зависимости от скорости и конструкции робота. Если коэффициент слишком большой, то робот будет сильно вилять, если маленький - ехать плавно, но в какой-то момент на повороте съехать из-за недостаточной величины управляющего воздействия. Напишем две версии программы - с переменными (для тех, кто их уже изучал) и без.


   Но и этот регулятор можно усилить с помощью введения пропорциональной и интегральной составляющей, описание будет в следующих статьях. До скорых встреч!

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

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

В нашем примере будет разобрано три примера робота на основе основной учебной модели Robot Educator.

Для начала, собираем базовую модель учебного робота Robot Educator, для этого можно использовать инструкцию в программном обеспечении MINDSTORMS EV3.

Так же, для примеров нам понадобятся, датчики света-цвета EV3. Эти датчики света, как никакие другие, наилучшим образом подходят для нашей задачи, при работе с ними, нам не придётся забоится о интенсивности окружающего света. Для этого датчика, в программах мы будем использовать режим отражённого света, при котором оценивается количество отражённого света красной подсветки датчика. Границы показаний датчика 0 - 100 единиц, для «отсутствия отражения» и «полного отражения» соответственно.

Для примера мы разберём 3 примера программ для движения по чёрной траектории изображённой на ровном, светлом фоне:

· Один датчик, с П регулятором.

· Один датчик, с ПK регулятором.

· Два датчика.

Пример 1. Один датчик, с П регулятором.

Конструкция

Датчик света устанавливается на балку, удобно расположенную на модели.


Алгоритм

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


Так как на реальной траектории датчик формирует значения во всём своём рабочем диапазоне (0-100), то значением к которому стремиться робот, выбрано 50. В этом случае значения передаваемые функции поворота формируются в диапазоне -50 - 50, но этих значений недостаточно для крутого поворота траектории. По этому следует расширить диапазон в полтора раза до -75 - 75.

В итоге, в программе, функция калькулятора является простым пропорциональным регулятором. Функция которого ((a-50)*1.5 ) в рабочем диапазоне датчика света формирует значения поворота в соответствии с графиком:

Пример работы алгоритма

Пример 2. Один датчик, с ПK регулятором.

Этот пример составлен на той же конструкции.

Вы наверно заметили, что в прошлом примере робот излишне раскачивался, что не давало ему достаточно разогнаться. Сейчас мы постараемся немного улучшить эту ситуацию.

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

Одним из базовых движений в легоконструировании является следование по черной линии.

Общая теория и конкретные примеры создания программы описаны на сайте wroboto.ru

Опишу, каким образом мы это реализуем в среде EV3, поскольку есть отличия.

Первое, что необходимо знать роботу – значение “идеальной точки”, расположенной на границе черного и белого.

Расположение красной точки на рисунке как раз соответствует этой позиции.

Идеальный вариант расчета – измерить значение черного и белого и взять среднее арифметическое.

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

Значит, можно заставить это делать робота.

В ходе экспериментов мы выяснили, что измерять и черное, и белое необязательно. Можно измерить только белое. А значение идеальной точки рассчитывается как значение белого, деленное на 1,2 (1,15), в зависимости от ширины черной линии и скорости движения робота.

Рассчитанное значение нужно записать в переменную, чтобы потом обращаться к нему.

Расчет “идеальной точки”

Следующий параметр, участвующий в движении – коэффициент поворота. Чем он больше, тем резче робот реагирует на изменение освещенности. Но слишком большое значение приведет к “вилянию” робота. Значение подбирается экспериментально индивидуально для каждой конструкции робота.

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

Для удобства, эти параметры тоже можно записать в переменные.

Коэффициент поворота и базовая мощность

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

Для этого высчитываем два числа – значение мощности каждого из моторов В и С по отдельности.

В виде формул это выглядит так:

Где Isens – значение показаний датчика освещенности.

Наконец, реализация в EV3. Удобнее всего оформить в виде отдельного блока.

Реализация алгоритма

Именно такой алгоритм был реализован в роботе для средней категории WRO 2015

error: