Регуляторы простым языком
Регуляторы простым языком
Введение
Кому рекомендовано: всем, кто изучает робототехнику от полугода и испытывает трудности с применением регуляторов, а также для тех, кто хочет разобраться глубже с данным вопросом.
Рекомендуемый возраст: от 11 до 99 лет.
Бывают случаи, когда учащиеся даже избегают их применения, применяя костыли в своих решения. Но робототехника без регуляторов приводит в тупик – это факт. Регуляторы - это слишком сложно – это заблуждение. Конечно, существуют регуляторы со сложным устройством, однако есть и простые.
Нашим подопытным будет робот, собранный из набора Lego Mindstorms EV3. Будем учить его ездить по линии, вдоль стен, а как же выполнять другие задачи, где применяются регуляторы. Нам помогут среды программирования TrikStudio и RobotC.
Градус сложности в данной статье от начала к концу возрастает в несколько раз, поэтому рекомендуется изучить всё постепенно, лучше даже с перерывами, а не съедать материал целиком.
Определение
Регулятор – это устройство, выполняющее задачу поддержания объекта управления в определённом состоянии. Регулятор получает информацию о состоянии объекта управления с помощью датчиков и вырабатывает управляющее воздействие для того, чтобы его корректировать.
Пример: паяльник с регулятором температуры. Давайте будем считать, что жало паяльника – это объект управления. Получая информацию от датчика температуры, программа определяет с какой интенсивностью необходимо задействовать нагревательный элемент. Таким образом с точностью до градуса можно задавать нужную температуру для комфортной работы, крайне удобная штука.
Регуляторы часто встречаются в повседневной жизни: кондиционер поддерживает температуру в помещении, стиральная машина умеет поддерживать скорость вращения барабана с помощью специальных датчиков – энкодеров, кулер в компьютере тоже имеет регулятор, так скорость его вращения зависит от температуры нагревания процессора.
Есть и более сложные устройства, например, в ракеты, которые регулируют направление движения с помощью множества датчиков. Гироскутеры удерживают равновесие тоже с помощью регуляторов, которые ориентируются на гироскоп и акселерометр.
Но есть и совсем простой бытовой пример – регулятор уровня воды в бачке унитаза. Принцип прост: если в бачке уровень воды ниже определённой планки - клапан открывается, если наоборот, выше – клапан закрывается. Это пример релейного двухпозиционного регулятора. С него и начнём...
Релейный регулятор
Релейный регулятор – это тип регуляторов, который может вырабатывать ограниченное количество вариантов (положений регулятора) движения, обычно от 2 до 4. Говоря проще – он не умеет работать плавно. Если, например, количество положений в регуляторе 2, то такой регулятор называют двухпозиционный, если 3, то трёхпозиционный и т.д.
Попробуем построить релейный регулятор для робота, который движется по линии. Начнём с самого простого – двигаться по границе черной линии на одном датчике освещенности.
Конструкция робота: тележка с танковым управлением, спереди которой есть датчик освещенности. Желательно, чтобы ведущие колёса и датчик, образовывали собой равносторонний треугольник, тогда движение будет наиболее стабильным.
Робот должен двигаться по границе линии, находясь датчиком между белым и чёрным. Построим двухпозиционный релейный регулятор, который заставит робота поворачивать вправо, когда датчик находится над белым, и поворачивать влево, когда датчик находится над чёрным.
Рассмотрим программу. Она зациклена, и в начале цикла каждый раз происходит проверка датчика света, над белым он или над чёрным.
Для этого мы использовали блок «если». Данный блок направляет программу по двум возможным путям. Куда пойдёт программа, вверх или вниз, зависит от того, является ли условие в блоке «если» истиной.
Sensor1 > 50. Почему 50? Разберёмся откуда взялось это число, и почему для разных роботов оно может быть разным. 50 – это желаемое состояние, то пороговое значение, которое видит датчик, когда находится ровно между белым и черным. Давайте называть его «серым». Переход от белого к черному и наоборот, для датчика освещенности происходит не мгновенно, а по мере того, насколько много в его области действия черного или белого. Для отладчика TrikStudio это значение всегда 50, а для реального робота оно зависит от показания датчика на белом и на чёрном, и будет являться их средним арифметическим. Например, робот видит на белом 46, а на чёрном 12. Тогда значение серого на реальном роботе будет (46+12)/2 = 29.
Таким образом, всё что меньше серого – это черное, а всё что больше – белое. Если робот на белом, то есть условие
«Sensor1 > 50» - истина, то следует повернуть направо, запустив левый мотор вперёд, а правый остановив. Если робот на чёрном, то есть условие ложно, то необходимо поворачивать в другом направлении.
Любой регулятор, это цикл, который повторяется с большой частотой. Чтобы не заставлять контроллер работать 100% времени, сделаем минимальную задержку по времени. Пока это время идёт, моторы работают, а процессор отдыхает. Таким образом программа делает 1000 итераций в секунду.
В итоге мы получаем робота, который умеет поворачивать направо и налево. Это как водитель, который выкручивает руль всегда до упора, и не может ехать прямо.
Усложним нашу программу, добавив третье действие – движение вперёд, и определим для него условие. Пусть робот едет вперёд, если отклонение от значения серого не превысило 5 пунктов. Предположим, что значение серого – 29. Это значит, что если значение датчика больше чем 29-5, и меньше, чем 29+5, то необходимо двигаться вперёд. Получился классический трёхпозиционный релейный регулятор. Движение вперёд позволяет быстрее преодолевать прямые участки, поскольку поворот – это остановка одно из моторов, а значит движение на повороте замедлено.
И, наконец, попробуем сделать четырёхпозиционный регулятор для робота с двумя датчиками освещенности. Для этого необходимо определить значения серого для обоих датчиков. Пусть оно будет 40 и 34.
На картинке представлены 4 возможных положения робота относительно линии и, соответственно, в программе есть 4 варианта поведения робота. Сперва программа проверяет первый датчик, и если он на белом, то проверяется второй датчик, и если он тоже на белом, то робот едет прямо, а если второй на чёрном – поворачивает направо. Если первый датчик показал черное, то так же проверяется второй, и если второй датчик показал белое – то необходимо повернуть влево, а если второй тоже на чёрном, то пусть робот поедет прямо, сбавив скорость.
Если заменить остановку моторов на движение с низкой скоростью, то можно добиться более плавного поворота. Но если сделать скорость более медленного мотора быстрее, то робот может не вписаться в резкий поворот. Найдите оптимальное решение при выборе скорости для вашей трассы.
А вот пример применения релейного регулятора для движения вдоль стены. Для этого определим, на каком расстоянии необходимо двигаться. Пусть оно будет равно 30 сантиметрам. Отдаляясь от стены более чем на 30 см, робот будет пытаться приблизиться к ней, выполняя поворот направо, и наоборот, двигаться влево, если оказался ближе. Эта программа удивительным образом похожа на движение по линии. Это демонстрация того, что одни и те же алгоритмы могут быть применены к разным задачам.
Попробуйте составить трёхпозиционный регулятор для движения вдоль стены. А если поставить робота в коридор и снабдить вторым датчиком расстояния, то можно двигаться на двух датчиках по знакомому алгоритму на четырёхпозиционном регуляторе.
Пропорциональный регулятор (П-регулятор)
Пропорциональный регулятор – это регулятор, в котором управляющее воздействие пропорционально отклонению. Говоря проще – чем сильнее робот (наш объект управления), отклонился от желаемого значения, тем сильнее он будет поворачивать, чтобы скорректировать своё отклонение.
Чтобы понять работу данного регулятора, раскроем некоторые термины.
Пропорциональность. Пропорциональными называются две взаимно зависимые величины, если отношение их значений остаётся неизменным. Например: x = y * 2. y всегда больше чем x в 2 раза, значит эти числа пропорциональны.
Отклонение – величина, характеризующая насколько сильно отличается текущее значение датчика(ов) от желаемого состояния.
Управляющее воздействие – сила с которой объект корректирует отклонение.
Попробуем применить пропорциональный регулятор для управления положением мотора. Мотор должен не просто повернуться на заданный угол, но и зафиксироваться в данном положении, сопротивляясь внешнему воздействию. Мотор, снабженный энкодером может справиться с этой задачей.
Зададим желаемый угол, пусть он будет 45 градусов.
Переменные
alpha – значение желаемого положения мотора.
k – усиливающий коэффициент
err – отклонение(ошибка)
u – управляющее воздействие
Переменная err находит угол, на который мотор отклоняется от желаемого значения. Предположим сейчас энкодер показывает 33 градуса. Тогда ошибка будет равна 45 – 33 = 12. Следовательно, управляющее воздействие будет 12 * 4 = 48. Это заставит мотор двигаться вперёд, что будет приближать его к отметке 45 градусов. Если энкодер превысил значение 45, то ошибка станет отрицательной, что приведёт к его вращению в противоположную сторону.
Таким образом мотор будет сопротивляться внешнему воздействию. Чем сильнее отклонился мотор и чем больше величина коэффициента k, тем сильнее сопротивление. Высокий коэффициент приведёт к дрожанию мотора, поскольку он будет вновь и вновь проскакивать желаемое значение. Это состояние называется перерегулирование.
Изменяя угол alpha можно заставить мотор совершать точные движения и фиксироваться заданном положении. Это позволяет искусно решать задачи с захватом объектов, манипуляторами, поворотными башнями и т.д.
Применим пропорциональный регулятор для движения по линии. Начнём с того, как робот будет управляться. В командах запуска моторов мы используем две переменные: v – базовая скорость моторов, u – управляющее воздействие. Чтобы понять, как влияют на движение эти переменные, поэкспериментируйте с их различными значениями.
Переменная v определяет, с какой скоростью робот поедет вперёд или назад в зависимости от знака. При положительной скорости – вперёд, назад при отрицательной. Переменная u задаёт резкость поворота, а от её знака зависит его направление. При положительном управляющем воздействии ускоряется мотор В и замедляется мотор С – поворот вправо, при отрицательном u соответственно наоборот робот поворачивает влево. Вот так выглядит релейный двухпозиционный регулятор, если управлять роботом с помощью переменных v и u:
Если с управлением разобрались, давайте построим уже пропорциональный регулятор для движения по линии на одном датчике освещенности. Вспомним расположение робота на линии.
Переменные:
grey – значение серого для датчика освещенности.
k – усиливающий коэффициент
v – базовая скорость
err – отклонение(ошибка)
u – управляющее воздействие
Что делают переменные v и u мы разобрали ранее, а в переменную grey запишем значение серого.
Переменная err – это отклонение(ошибка) от желаемого значения. Когда текущее значение датчика (sensor1) превышает значение grey, ошибка становится положительной, когда они равны, то ошибка равна нулю, а когда sensor1 меньше grey, ошибка - отрицательная.
Теперь надо заставить робота поворачивать в нужную сторону. Сделаем так, чтобы управляющее воздействие зависело от ошибки. Но если просто приравнять их, то может возникнуть проблема, когда роботу не хватит силы управляющего воздействия, чтобы преодолеть крутой поворот. Для этого воспользуемся усиливающим коэффициентом k. Чем сильнее значение этого коэффициента, тем сильнее робот реагирует на отклонение. При слишком большом коэффициенте может возникнуть эффект перерегулирования, характеризующийся раскачиванием робота.
Допустим, что значение серого (grey) – 35. Рассмотрим примеры расположения робота на линии и его реакцию на отклонение:
Датчик света слегка сместился влево, и его значение выросло до 42. Это значит, что ошибка (err) будет равна 42 – 35 = 7. При коэффициенте (k) равном 2, управляющее воздействие (u) будет равно 7 * 2 = 14. При базовой скорости (v) 50, на мотор В будет подана скорость 50 + 14 = 64, а на мотор С 50 – 14 = 36. То есть робот плавно поворачивает направо, поскольку не сильно отклонился влево.
Во втором примере робот сильно заехал датчиком на чёрное. Его значение стало равно 18. Теперь ошибка равна 18 – 35 = -17. При отрицательной ошибке управляющее воздействие тоже будет отрицательным и станет равным -17 * 2 = -34. При данном управляющем воздействии моторы получат значения В: 50 + (-34) = 16 и С: 50 – (-34) = 84, что заставит робота резко повернуть влево.
Вывод: чем сильнее отклонился робот, тем сильнее его реакция.
Поэкспериментируйте над значениями коэффициента и скорости робота. Найдите те оптимальные значения этих величин, при которых робот проходит линию наиболее быстро и плавно, при этом вписываясь во все повороты. Помните, что отладка – важнейшая часть работы, и большая часть времени при работе над созданием эффективных роботов посвящена именно ей.
Теперь попробуем с двумя датчиками освещенности. Установим их по обе стороны от линии так, чтобы края области охвата датчиков (красные круги) соприкасались с границей линии.
Ошибка вычисляется с помощью нахождения разности показания датчиков: err = Sensor1 – Sensor2. Желаемое значение разности между датчиками – ноль. Отличие в написании программы заключается лишь в том, как находится ошибка. Теперь нам не обязательно знать значение серого.
Однако далеко не всегда оба датчика будут показывать одинаковые значения на белом поле. Чаще всего значение имеют небольшие различия, а иногда и значительные. Робот с такими датчиками, например, не сможет ехать прямо, находясь на белом поле. А при движении по лини можно заметить, что один из датчиков (тот, который ярче) частично наезжает на черную линию.
Чтобы этого избежать, необходимо найти так называемую статическую ошибку. Она находится один раз при запуске робота на белом полигоне и вычитается из динамической ошибки (err).
П-регулятор можно применить для синхронизации скорости моторов. В таком случае нам потребуются показания энкодеров вместо датчиков света. Все остальные действия остаются прежними.
П-регулятор, как и релейный, может быть применён для множества задач. Попробуйте применить его, например, для движения вдоль стены.
Для закрепления, еще раз пройдём по порядку все действия программы в цикле:
- Вычислениеошибки (err = sensor1 – grey или err = sensor1 – sensor2).
- Вычисление управляющего воздействия (u = err * 2).
- Подача управляющего воздействия на моторы (B: v + u, C: v – u).
- Не забываем про маленькую задержку по времени (1 миллисекунда).
Вычисление ошибки, подача управления на моторы и задержка характерны почти для всех регуляторов. Задача конкретно П-регулятора здесь в том, чтобы управляющее воздействие было пропорционально ошибке.
Пропорционально-дифференциальный регулятор (ПД-регулятор)
Вовсе не обязательно обладать знаниями в области высшей математики, чтобы применять дифференциальный или интегральный регуляторы. Достаточно понимать его принцип работы и предназначение. Учащиеся 7-х классов (а некоторые гораздо раньше) осознанно и с успехом применяют их в своих роботах, особенно там, где необходима высокая скорость и стабильность работы.
Зачем нужна Д-составляющая в регуляторе? Ответ – препятствовать перерегулированию. Как мы узнали ранее, существует проблема раскачивания при применении
П-регулятора. Особенно сильно это проявляется на больших скоростях, ведь для быстрой скорости необходимо интенсивнее реагировать на повороты, повышая коэффициент усиления (k) П-регулятора, что неизбежно приводит к раскачиванию(перерегулированию).
Взглянем на маятник. Он тоже раскачивается. Ему, как и скоростному роботу, нужно время, чтобы стабилизироваться. Для маятника в качестве П-регулятора выступает земная гравитация. Действительно, чем сильнее он отклонился от вертикального (желаемого) положения, тем сильнее гравитация пытается его вернуть. Но ничего не получается, он вновь и вновь проскакивает середину… Что, если погрузить его в воду? Сопротивление воды даст нужный эффект, ведь оно замедляет его движение. Маятник опускается на середину и фиксируется в этом положении. Давайте попробуем применить это на роботе, который движется по линии.
Принцип работы дифференциального регулятора заключается в том, что он определяет скорость изменения ошибки и создаёт управляющее воздействие пропорционально этой скорости. Говоря проще – робота нужно заставить сопротивляться изменениям ошибки. Скорость, как известно, можно найти зная расстояние и время.
Посчитать скорость изменения ошибки можно, найдя разность текущей ошибки (err) и той ошибки, которая была в предыдущем цикле (errOld), а значит время известно – это задержка (1 миллисекунда). Чтобы запомнить предыдущую ошибку, присвоим её значение переменной errOld после всех вычислений. Таким образом, после обновления err, мы сможем знать и новую и старую ошибку. Так как скорость изменения отклонения (err – errOld) расчитывается в миллисекундах, то соответственно, значения получаются очень маленькие. Будьте внимательны выставляя задержку в цикле, так как её величина напрямую влияет на силу Д-регулятора. Действительно, значения датчиков вряд ли могли сильно измениться спустя всего 1 миллисекунду. А значит необходим усиливающий коэффициент (k2) достаточный, чтобы оказать влияние на управляющее воздействие. Полученное значение складывается вместе с управляющим воздействием пропорционального регулятора err * k1. Эти два регулятора работают бок о бок, но вовсе не обязательно, что их знаки будут совпадать.
Рассмотрим примеры действия ПД-регулятора при коэффициентах k1 = 2, k2 = 20.
Пример 1: Робот правым датчиком заехал на черную линию и продолжает двигаться влево, а это значит, что ошибка увеличивается. Значение текущей ошибки равно 15, а предыдущей равно 13. П-регулятор заставляет робота поворачивать вправо с силой 15 * 2 = 30, а Д-регулятор с силой (15 – 13) * 20 = 40. Их сила складывается, значит общее управляющее воздействие равно 70. Робот будет поворачивать вправо.
Пример 2: Робот всё еще слева от линии, значит ошибка положительная, однако направление его движения изменилось – он движется вправо. Ошибка уменьшается, а значит дифференциальный регулятор должен заставлять робота поворачивать влево. Пусть ошибка равна 12, а предыдущая равна 15. В этом случае сила П-регулятора равна 12 * 2 = 24, а Д-регулятора (12-15) * 20 = -60. Суммарное управляющее воздействие 24 + (-60) = -36. Робот будет поворачивать влево.
Чтобы глубже понять поведение ПД-регулятора, можно представить ошибку на графике. Везде, где график находится над нулевой отметкой – ошибка положительная, а значит действие П-регулятора будет иметь положительный знак. Знак Д-регулятора зависит от того, движется ли график вверх или идёт на спад. Его сила зависит от того, насколько резко происходит подъём или спад.
На отрезках ab и fg, в те моменты, когда график идёт «в гору» знак Д-регулятора положительный.
На отрезках bc и df при «скатывании» вниз знак Д-регулятора отрицательный.
На ровном отрезке cd, и в пиковых точках b и f значение Д-регулятора нулевое, поскольку в эти моменты не происходит изменений ошибки.
Интегральный регулятор. ПИД-регулятор
Интегральная составляющая ПИД-регулятора обеспечивает значительное управляющее воздействие в случаях, когда объект упрвления(робот) длительное время (например 0.5 секунды) находится в состояни ошибки. Управляющее воздействие И-регулятора тем сильнее, чем дольше робот не может вернуться в состояние нулевой ошибки.
Задача И-регулятора – вернуть объект в желаемое состояние в тех случаях, когда управляющего воздействия П-составляющей недостаточно.
Рассмотрим простой пример: робот движется по круговой линии. На П или ПД-регуляторе он не может поддерживать ошибку в состоянии близкой к 0, поскольку при нулевой ошибке он движется прямо. При движении правый датчик частично заезжает на черную линию и создаёт ошибку, необходимую для обеспечения поворота. Попробуем сделать так, чтобы робот стабилизировался на нулевом положении.
Принцип работы И-регулятора заключается в постоянном накапливании значений ошибки. Этот процесс так и называется – интегрирование. Создадим переменную I, в которую будем суммировать настоящую ошибку в каждом цикле: Ireg = Ireg + err. Коэффициент для И-составляющей будет очень мал, поскольку суммирование происходит каждую миллисекунду, и, скажем, если робот будет в течение секунды получать ощибку равную 10, то при коэффициенте 1 мы получим гигантское управляющее воздействие 10*1000 = 10000. Пусть коэффициент будет 0,02. Может возникнуть вопрос: а не будет ли переменная Ireg со временем разрастаться до огромных значений, ведь мы
постоянно прибавляем? Ответ: переменная Ireg увеличивается только при положительной ошибке, при отрицательной ошибке происходит её уменьшение. Значит она может разрастись в обе стороны, но только в случае, если робот застрял в состоянии ошибки надолго.
Для удобства восприятия, давайте разложим ПИД-регулятор на 3 отдельные его составляющие. Подпишем коэффициенты (kP, kD, kI).
Preg = err * kP
Ireg = I + err * kI
Dreg = (err – errOld) * kD
u = Preg + Ireg + Dreg
Следует помнить, что интегральный регулятор, как и дифференциальный, имеет прямую зависимость от времени задержки. Чем меньше задержка, тем чаще производится действие сложения, и тем быстрее она будет накапливаться.
Давайте отразим работу И-регулятора на графике ошибки. Первое, что необходимо знать – интеграл – это площадь под графиком. Каждый зелёный столбик – это величина ошибки, которая была накоплена регулятором за время
работы программы.
Рассмотрим график ошибки и значения И-составляющей для каждой выделенной точки на этом графике.
В точке a значение И-составляющей равно нулю.
В точке b оно положительное, поскольку при положительной ошибке оно накапливалось за промежуток времени от a до b.
В точке c оно так же положительное.
В точке d – всё еще положительное, поскольку площадь S1 больше чем кусок площади S2 до точки d.
Предположим, что площади S1 и S2 равны, хоть в реальной жизни, это маловероятно. Тогда в точке e значение вновь возвратится в ноль.
И далее в точках f и g снова положительное.
Попробуем более грамотно посчитать значение интегральной и дифференциальной составляющих, учитывая, что задержа по времени (будем называть её deltaT, или dT) влияет на расчет величин управляющего воздействия.
Известно, что в TrikStudio и RobotC время исчисляется в миллисекундах. В физике больше любят секунды, так что давайте переведём всё в них.
Тогда dT будет равна 0.001 сек. Тогда задержку по времени, будем выполнять так: sleep(dT * 1000), то есть получим значение 1 при dT равной 0.001.
Значение П-составляющей от времени не зависит, а значит ничего не изменится: err * kP
Значение Д-составляющей получится следующее: kD * (err-errOld) / dT. Всё как учили по физике: скорость равна частному от изменения на время. Помним, что теперь измерение ведётся в секундах, так что стоит изменить kD, уменьшив его в 1000 раз.
Значение И-составляющей: Ireg + err * dT * kI. Увеличиаем kI в 1000 раз.
Итог: изменяя задержку в цикле, теперь мы не создадим помех в работе ПИД-регулятора.
Кубический регулятор
Достаточно простой регулятор, в котором управляющее воздействие пропорционально ошибке, возведённой в куб.
Его применение актуально там, где, периодически, необходимо вырабатывать очень большое управляющее воздействие, при этом сохраняя плавность работы в условиях небольших значений ошибки. Пример: движение по линии, в которой есть участки с резкими поворотами и прямые участки, либо участки с очень плавными поворотами.
Важно правильно подобрать коэффициент для кубического регулятора, ведь число, возведённое в куб может выдать огромные значения. Давайте вычислим минимальную и максимальную ошибку. Рассмотрим классическое движение по линии на двух датчиках света.
Минимальная ошибка - это разность минимального значения правого датчика и максимального значения левого. Максимальная ошибка – соответственно будет равна разности белого для первого датчика и черного для второго.
Пусть диапазон ошибки будет от -40, до 40 единиц. Нам нужно, чтобы кубический регулятор выработал при максимальной ошибке значение 100.
Посчитаем, чему будет равно управляющее воздействие при коэффициенте 1 и ошибке 40. 40*40*40 = 64000. Многовато! Узнаем, во сколько раз это больше чем 100 и разделим на это число наш коэффициент.
64000 / 100 = 640, значит нам необходим коэффициент или около 0.00156.
Управляющее воздействие при ошибке менее 10 не превысит даже единицы! При ошибке, равной 20 – около 12, при 30 – около 42, при 40 – 100.
Кубический регулятор практически никак не будет реагировать на малые отклонения. Эффективнее всего использовать кубический регулятор в паре с П-регулятором или ПД-регулятором. Они отлично дополняют друг друга!