Разжёвываем линейно-квадратичный регулятор для управления перевёрнутым маятником

  • Tutorial

Преамбула


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

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

Итак, это уже четвёртая статья, для лучшего понимания происходящего неплохо бы прочитать предыдущие три:


Вот фотография системы (кликабельно):



Используемые датчики


У меня только два источника информации о происходящем в системе, это два инкрементальных энкодера, один (1000 импульсов на оборот) показывает положение каретки, второй (2000 импульсов на оборот) даёт положение самого маятника. В предыдущей статье я считал импульсы при помощи самой же ардуины, но это довольно неточно и слабо устойчиво к зашумлённым показаниям энкодеров. Кроме того, это тратит и без того слабые вычислительные ресурсы атмеги. Сейчас я поставил одну микросхему HCTL-2032 (примерно пять евро штука на алиэкспрессе), она умеет считать импульсы двух энкодеров, предоставляя для этого 32-битные счётчики. Чтобы сэкономить ноги ардуины, между счётчиком и самой ардуиной стоит 74hc165, читающая один байт в параллель и отдающая этот байт последовательно.

Измеряем параметры двигателя ещё раз


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

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



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

Итак, для каждого измерения считаю установившуюся скорость (высота плато) и рисую график, на котором по горизонтали поданное напряжение, а по вертикали установившаяся скорость.



Если бы у меня в системе не было бы трения, то этот график был бы линейным, и моя модель строилась бы как v_{k+1} = a*v_k + b*u_k. И ведь он практически линеен на своей положительной и отрицательной частях одновременно, но эти две прямые не проходят через ноль. Это (в том числе) из-за трения. Мы видим, что если при положительном напряжении мы добавим, а при отрицательном отнимем буквально долю вольта, то график пройдёт через ноль и станет линейным.

Если мы хотим учитывать трение в системе, то модель строится следующим образом (не забудьте прочитать предыдущую статью, если неясно, откуда берётся эта формула):



Итак, имея данные, нам нужно найти значения a, b и c. Фиттинг можно делать как угодно, учитывая, что он делается только один раз на десктопе, можно просто сделать три вложенных цикла. Вот код фиттинга, который мне говорит, что для дискретизации в 20мс между измерениями a=.4, b = .06, c=-.01. То есть, напряжение, необходимое для компенсации трения у меня в системе, равно одной десятой вольта. Кривые, полученные таким приближением, наложены на реальное измерение на картинке выше.

Контролируем прикладываемую силу, а не напряжение


Итого, на данный момент наша система может быть записана следующим образом:



К сожалению, это не является линейным дифференциальным уравнением вида x_{k+1} = A x_k + B u_k, которое нужно для линейно-квадратичного регулятора. Кроме того, даже если бы не это, то мне нужно добавить ещё и маятник на каретку, а я не знаю как вывести зависимость положения и угловой скорости маятника от напряжения. Я бы предпочёл, чтобы у меня в качестве управления было бы не напряжение, а непосредственно ускорение каретки:



Строго говоря, x_{k+1} = x_k + dt v_k + (dt)^2 / 2 a_k, но для dt = .02 секунды (dt)^2/2 равняется .0002, что уже пренебрежимо мало, поэтому выкидывается из записи.

Окей, предположим, что мой регулятор использует ускорение в качестве управления. Но ведь в реальности-то я должен подать напряжение на мотор. Как его получить? Очень просто:



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

Несложная, но длинная математика или добавляем маятник


Уравнения движения маятника


Итак, задача добавить маятник в нашу систему и записать соответствующие линейные уравнения для регулятора. Давайте приведём полный список необходимых для этого физических величин:

  • m: масса маятника
  • M: масса каретки
  • f: сила, приложенная мотором к каретке через ремень
  • 2l: длина маятника (l — это расстояние от петли до центра масс маятника)
  • I: момент инерции маятника (к слову, а ваши шрифты позволяют видеть разницу между I и l?)
  • θ(t): угол отклонения маятника от вертикали, в положении неустойчивого равновесия нулевой, увеличивается по часовой стрелке
  • x(t): положение каретки



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



Если мы сумеем её записать в непрерывном виде, то потом просто дискретизуем и мы выиграли бой. Обратите внимание, что тут я использую в качестве управления приложенную силу, а не ускорение, но второй закон Ньютона нам покажет, как это сделать. Итак, нам нужно найти неизвестные матрицы A и B.

Запишем второй закон Ньютона для каретки: ускорение каретки, помноженное на массу, равняется сумме двух горизонтальных сил: первая сила — это наше управление, сила, приложенная через ремень электромотором. Вторая сила — это сила, с которой маятник, стараясь упасть или подняться, толкает каретку вбок. Чтобы её найти, можно записать координаты центра массс маятника как двумерный вектор (x(t) + l sin(θ(t)), l cos(θ(t))). Если мы продифференцируем дважды координату, то получим ускорение, а сила — это ускорение на массу. Поскольку нас интересует только горизонтальная составляющая, то имеет смысл брать только вторую производную от x(t) + l sin(θ(t). Итого:



Это нелинейное уравнение, но оно может быть хорошо приближено линейным вокруг точки равновесия. Если угол близок к нулевому, то первый замечательный предел (ну или ряд Тейлора) говорят, что синус угла примерно равен углу. То же самое для косинуса: для углов, близких к нулевым, косинус почти равен единице. Ну и точно так же пренебрежём степенями, начиная с квадрата (если у нас скорость равна .1 радиана в секунду, то квадрат скорости даст совсем маленький вклад (.01), поэтому пренебрегаем им смело):



Тогда предыдущее уравнение может быть приближено линейным:



Теперь запишем второй закон Ньютона (версия для вращения) для маятника. Для начала, что такое второй закон Ньютона для вращения? Это сумма моментов равна угловому ускорению, помноженному на момент инерции. Момент инерции — это такой аналог массы для поступательного движения. Нас интересует проекция всех сил на прямую, перпендикулярную маятнику (ведь вращает только перпендикулярная составляющая, правда?) Ну и разумеется, эти силы надо помножить на плечо, чтобы получить момент. Сил, действующих на маятник, три: гравитация и горизонтальная и вертикальная составляющие силы реакции опоры, которые мы можем получить как и в прошлый раз, дважды взяв производную по времени от координат центра масс маятника:



Приблизим его линейным уравнением:



Запишем уравнения (1) и (2) в систему:



Для удобства назовём определитель матрицы буквой D:



Обратим матрицу:



Теперь запишем наши дифференциальные уравнения, по факту, мы нашли матрицы A и B:



Дискретизируем линейную систему



Итак, мы записали неперывное дифференциальное уравнение:



Для постоянного шага Δt получаем следующее:



Если мы обозначим через E единичную матрицу 4x4, то можно записать:



Момент инерции для стержня, который вращается вокруг конца, можно посмотреть здесь, поэтому упрощаем всё что можно:



Это и есть самое главное уравнение движения маятника.

Линейно-квадратичный регулятор


Код вычисления коэффициентов регулятора можно взять здесь. Раньше я использовал наименьшие квадраты для подсчёта, но это всё же довольно громоздко, поэтому в новом коде матрица усиления считается напрямую. Матлаб для этого необязателен, вполне хватит обычного питона.

Итак, ЛКР нам говорит, что если взять управляющую силу f_k = 24.95 x_k + 18.54 v_k + 70.44 θ_k + 14.96 ω_k, то отклонив маятник на 12° от вертикали, и уведя каретку на 20 сантиметров от положения рановесия, то мы должны получить следующее поведение системы:



x_k — положение каретки, v_k — её скорость, θ_k — угол маятника, ω_k — его угловая скорость. Напряжение на графике дано в десятках вольт, чтобы примерно сравнять масштабы трёх графиков.

Забиваем коэффициенты в ардуину


Вот таким у меня получился маятник, управляющий код можно посмотреть здесь:



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

Как оценить скорость движения, если в наличии лишь инкрементальный энкодер? Самый простой способ — это взять два последних значения энкодера и поделить их разницу на прошедшее время.Это известно как конечные разности и довольно широко применяется на практике.

Давайте посмотрим на следующий график:



Я записал угол маятника в течение нескольких секунд, он показан красным. График слегка зашумлён из-за разрешения энкодера, но в общем и целом довольно гладкий. Скорость нам приходится находить синтетически из истории положения маятника. Если мы возьмём напрямую разность двух соседних положений и поделим на 20 миллисекунд, то это нам даст синий график. Польза конечных разностей в том, что они очень просто программируются. Их недостаток в том, что они драматическим образом усиливают любой шум измерений.

Если взять такую оценку скорости, то регулятор сходит с ума:



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

По-хорошему, нужно бы приблизить красную кривую каким-нибудь многочленом, и считать его производную, это основная идея фильтра Савицкого-Голея. Чтобы не ломать голову, я просто сгладил оценку скорости, взяв не соседние сэмплы, а разницу текущего сэмпла и восемь сэмплов тому назад, поделив на (20мс*8). Такой подход сильно сглаживает оценку скорости, но его недостаток в том, что он вносит лаг в систему. Посмотрите на зелёную кривую: она явно отстаёт от реального положения вещей. Такая задержка в оценке и заставляет мой маятник слегка покачиваться.

К слову сказать, если взять фильтр Савицкого-Голея в лоб, то он тоже создаст похожую задержку. Таким образом, я нашёл разумный для меня компромисс между достижением цели и простотой артиллерии. Бороться с зашумлёнными измерениями я планирую совсем другими методами, это тема для последущих разговоров. Также в последующие разговоры будет входить автоматическая раскачка маятника, чтобы он сам поднимался из нижнего состояния в верхнее.

Stay tuned!
Поделиться публикацией

Комментарии 59

    0
    О, мы такую штуку делали в МИФИ в 1994 или 95 году на АВК-6. Надо сказать, никаких энкодеров не было и в помине. Был потенциометр (положение каретки), и два концевика (максимальное отклонение маятника).
      +1
      Ну, люди это делают на таймере 555 с фотодиодом, который тянется к свету :)
        0
        На аналоговой рассыпухе?
          0
          Там не рассыпуха, там именно блоки — интеграторы, сумматоры, но да, всё аналоговое, тёплое, местами (осциллоскоп) — ламповое.
          Вот тут хорошо написано АВК-6
            +1
            Не, мы на чем-то другом работали — на 12й кафедре была лаба с аналоговыми компами (запамятовал как звались, но выглядели не так)
      +2
      Красиво. Если продолжать погружаться в LQR, то для оценки скорости надо построить линейный стационарный наблюдатель (фильтр Калмана), так как это близкие родственники.
        0
        Спасибо. Именно этим я и планирую заняться, тем более, что мне интересно работать не по энкодерам, а по гироскопу/акселерометру, а текущая машинка так, для разогрева. Насколько я понимаю, Калман + LQR = LQG и используется крайне часто.
          0
          Можно и Льюбергом, там без шумов и для оценки детерминированного вектора он покошернее.
            0
            Если Вы имеете ввиду наблюдатель Люенбергера, то это тоже самое и будет.
          0
          Крутецкая штука! Интересно, насколько сложно сделать самообучающуюся систему, которая сможет работать с маятником произвольной длины и массы?
            0
            Да, можно. Более того, прямо как есть оно довольно устойчиво к изменениям параметров маятника.
              0
              да, на видео заметно, что очень хорошо держит
              0
              Не очень. Можно (со стороны теории управления) сделать адаптивную систему, а можно (со стороны computer science, сам не делал, но слышал) реализовать машинное обучение.
              0
              а с коленом маятник на два плеча? он тоже стабилизируется. У нас на кафедре Теории управления и динамики машин такое тоже делали.
                0
                На самом деле, добавить колено или даже два не так сложно математически, как дорого механически. У меня таких денег и доступа к такого уровня станкам нет.
                +2
                Так и подмывает достроить эту модель до полной State Space Representation, т.е. к матрицам A и B добавить почти тривиальную матрицу C. (Cм: en.wikipedia.org/wiki/State-space_representation, вариант Continuous time-invariant). Затем перевести State Space в представление нули-полюса. Для минимально фазовой части сделать контроллер, т.е. инвертировать все нули/полюса кроме полюсов в правой полуплоскости + интегратор, конечно. Если кому интересен такой подход, то могу попробовать проделать это на выходные.
                  –5
                  Я такое «чудо» наблюдал в году 91-ом в Мюнхенском «Немецком музее» (Deutsches Museum). (тогда еще в ФРГ).
                  Ваш пример очень наглядно демонстрирует «принцып» модели, но реализация — слабовата с учетом 25ти летнего «роста» технологий.
                  В то время у меня небыло возможности снять «сэлфи» да и фотки на «смена8м» не очень получались в тусклых помещениях музея. Но поведение их аналогового «чудо-девайса» я запомнил.
                  Основное отличие от Вашей реализации — маятник не имеет механического «указателя» положения. Использовалась оптическая система. Другими словами, «палка» просто висела на каретке на зубчатом ремне. А вот что было у них киллерр-фичей так это то, что эта самая палка подымалась вверх без помощи devhand-разработчика.
                  Ах да, к чему это я. Да к тому, что кидать свиньями по пирамидкам мы могли и на БК 0010. Теперь «гуру» реализуют все это с помощью 4-х ядерных процессоров с частотами в гигагерцы. Похвально, что люди начинают освоение столь высоких технологий с задач «как развалить сарай». Может я и перегибаю, но если так и дальше будет продолжаться еще лет 20 — провал, между понимающими и умеющими будет уже катастрофическим. И тогда ничего не останется, как покупать готовые «узлы» для решения простых задач при полном непонимании происходящего процесса.
                    0
                    Проходите мимо, не задерживайте движение.
                      –3
                      Ок, тогда вопрос к тем «кто умеет»:
                      Почему ваша «система» в состоянии равновесия вечно «плывет то в одну то в другую сторону.
                      ЗЫ: Так вы свой „Союз“ никогда не посадите ;)
                        +1
                        Вы статью пробовали читать? Там есть ответ на ваш вопрос.
                          –3
                          Читал, а вы не пробовали разобраться как работает фокусировка лазера в CD-проигрывателе?? Может, на первый взгляд сложные вещи давно имеют простое решение? ;).
                          Ни в коем случае не хотел «критиковать» ваш материал а тем более проделанную работу. Но наблюдая тенденции последних десятилетий прихожу к выводу, что люди тратят силы совсем не на продуктивные вещи, скорее на реализацию давно реализованного но с помощью «расспределенных вычислений на GPU» и это при том, что аналоги работали на 8 транзисторах еще 40 лет назад.
                          ЗЫ: очень хороший тому пример: «задачка комивояжера» на 10-20 точек и ее решение на «водяном» компьютере.
                            +3
                            Вы не поверите, а кто-то вообще футбол под пиво смотрит, а ведь силы и время уходят!

                            А вообще как мне кажется, вы не очень уловили суть происходящего. Текущая машинка — не самоцель, а лишь иллюстрация. И в частности поэтому тратить много денег на доведение её до ума у меня нет ни малейшего желания.
                              –2
                              сокращу свои хаотичные мысли до одного тезиса:
                              Вы выбрали не совсем удачный инструмент для реализации хорошо разжеванной и продуманной систтемы ;).
                              А как бы было круто посмотреть в наше время на пример реализации такого чуда на «аналоге», сумматорах, компараторах, усилителях ПТ :).
                              Зы: кстати, тогда в музее меня поразило быстродествие реакции системы. При достаточно резких ударах по «палке» рукой — она отскакивала всего на 10-15 см и не падала. Длина «хода» от края до края была порядка см 80-90. Да и там не шаговики были а обычные двигатели ПТ.
                                +1
                                Поясните пожалуйста, вы про какой инструмент и про какую систему именно?

                                К слову сказать, про резкий удар и отскок каретки на 10 см не верю. Или маятник весил пуд, а не 80 граммов, как у меня.
                                  0
                                  не пуд, но там был железный пруток порядка 10-12 мм в диаметре и длиной см 50-60. Явно не 80 гр :)
                    +2
                    Как ни крути, но чтобы создать, что-то прорывное надо повторить пройденный путь.
                    Какой смысл критиковать увлечение? Так же можно сказать и детям, зачем вы рисуете, уже давно все нарисовано.
                    Другой вопрос где и как данный механизм можно применить в жизни?
                      +2
                      Конкретно данный механизм нигде в жизни применять не надо, это чистая иллюстрация и проверка того, насколько я усвоил пройденный материал. Но в планах у меня сделать другие, которые в жизни вполне могут быть полезны. Например, мне интересно автоматическое управление мотоциклом.
                        +3
                        «Перевёрнутый маятник» не так давно на баржу сел.
                          +4
                          Справедливости ради, взлетел тоже перевернутый маятник.
                        0
                        Один только вопрос.
                        Просмотрев Ваши многочисленные статьи по тегом tutorial (!!!) я хотел бы получит ответ.
                        У Вас маятник работает (фактически) на основе изложенных в статье рассуждений и формул?

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

                        Вот если бы статьи были оформлены так:
                        1. Вот работающий маятник. с такими то и такими то параметрами и результатами. с графиками прихода в уравновешенное состояние при внешнем воздействии.
                        2. А вот теперь математика и моя теория, которую я использовал… (не по классике «теория правления»)
                        Во было бы все корректно и правильно.

                        Недавно проскакивал очень полезный цикл статей про двигатели и управление позицией, написанный профессионалом в этой области. Всем заинтересованным, рекомендую прочитать эти статьи. И литературу по теории управления.
                          +1
                          Просмотрев Ваши многочисленные статьи по тегом tutorial (!!!) я хотел бы получит ответ.


                          А что с тегом не так-то?

                          У Вас маятник работает (фактически) на основе изложенных в статье рассуждений и формул?


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

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


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

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




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


                          Такие заявления неплохо бы подкреплять ссылками.
                            0
                            прошу прощения. Промахнулся и в основную ветку ответ написал.
                          0
                          А что с тегом не так-то?

                          Наверное я предвзят, но использовать тег «учебник» для своих личных альтернативных рассуждений и подходов к решению классической задачи считаю несколько некорректно.
                          Почему альтернативным, потому что управление обратным маятником — это задача решаемая в рамках теории управления.
                          А ее курс стандартно изучают в тех. вузах.
                          Вот если бы я увидел результат похожий на то что видел у других (youtube)…

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

                          Извините. Но Вы действительно считаете, что эта система на вашем видео с незатухающими колебаниями такого размаха — это реализация задачи маятника?! (pendulum inverted)
                          Я подумал, что это просто демонстрация какого то промежуточного этапа работы, не более.
                          С Вашим оборудованием (высокого класса) маятник должен приходить в равновесие за сек и стоять мертво!

                          к примеру:
                          https://www.youtube.com/watch?v=a4c7AwHFkT8
                          https://www.youtube.com/watch?v=MWJHcI7UcuE
                          https://www.youtube.com/watch?v=XWhGjxdug0o

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

                          https://geektimes.ru/company/npf_vektor/blog/274096/
                          Никакой магии. Классическая теория управления (3 курс).

                            0
                            своих личных альтернативных рассуждений и подходов к решению классической задачи


                            Простите, я никаких альтернативных подходов я не предлагал. Всё, что у меня описано, можно найти в википедии.

                            Извините. Но Вы действительно считаете, что эта система на вашем видео с незатухающими колебаниями такого размаха — это реализация задачи маятника?! (pendulum inverted)
                            Я подумал, что это просто демонстрация какого то промежуточного этапа работы, не более.
                            С Вашим оборудованием (высокого класса) маятник должен приходить в равновесие за сек и стоять мертво!

                            к примеру:
                            https://www.youtube.com/watch?v=a4c7AwHFkT8
                            https://www.youtube.com/watch?v=MWJHcI7UcuE
                            https://www.youtube.com/watch?v=XWhGjxdug0o


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

                            https://geektimes.ru/company/npf_vektor/blog/274096/
                            Никакой магии. Классическая теория управления (3 курс).


                            Я не знаю, насколько вы волшебник на досуге, но при чём тут магия-то вообще?

                              +1
                              Мда…

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

                              Цитата из приведенной мной ссылке. https://geektimes.ru/company/npf_vektor/blog/274096/
                              Профессионала в этой области. Это он конечно ехидно сказал. Но имеет право.
                              Кстати, из чего делаю вывод что по приведенной ссылке вы даже не ходили. Иначе поняли бы о чем я.

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

                              К слову сказать, на всех ваших ссылках оборудование стоит минимум на порядок, а то и на два больше моего. И мёртвого хода, например, в их приводах нет.

                              Похоже приведенные ссылки Вы просто не смотрели… Я специально подобрал варианты, наиболее близки по оборудованию. Но есть и примеры где народ делает и на энкодерах от мышки. И ничего… подергиваясь но выходит в 0 быстро.
                              То есть, имея текущую скорость (состояние системы), мы легко можем посчитать напряжение, которое нужно приложить, чтобы получить необходимое ускорение.

                              Концептуальная ошибка вот в этом постулате. И с этой концептуальной ошибкой Вы лучше результата, чем показанный на вашем ролике елозящую туда сюда каретку, не получите. Как раз Ваш ролик и демонстрируют эту ошибку.
                              И не надо пенять на люфты в редукторе и пр.
                              Давайте приведём полный список необходимых для этого физических величин:
                              •m: масса маятника
                              •2l: длина маятника (l — это расстояние от петли до центра масс маятника)

                              Вас не настораживает момент на всех видео (pendulum inverted), когда сверху накладывают дополнительный вес, меняя и центр масс и массу маятника, специально демонстрируя, что управление продолжает поддерживать маятник?
                              Нет? А зря…
                              Это вторая ошибка в выбранном Вами способе.
                              Ясно-понятно, ещё один персонаж, текст не читавший.

                              Читавший… все читавший.
                              Итак, как я и говорил в своей прошлой статье, у меня есть студенты, которые панически боятся математики,

                              Пришли ко мне за советом. А я ни бум-бум вообще в теории управления, никогда и близко не подходил.

                              Это цитаты из ваших же статей.

                              Общаться дальше просто не интересно. Советовать преподавателю почитать учебник, как то не комильфо.

                              Какое счастье, что у меня преподаватели были другие.

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


                                Позвольте не согласиться, несколько разные задачи. В задаче удержания сервопривода сила чаще всего (локально) постоянная и не меняет знака.

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

                                Вас не настораживает момент на всех видео (pendulum inverted), когда сверху накладывают дополнительный вес, меняя и центр масс и массу маятника, специально демонстрируя, что управление продолжает поддерживать маятник?
                                Нет? А зря…


                                Устойчивость к изменениями параметров системы не означает отсутствия параметров при расчёте управления. Опять же, умозрительно меняем параметры для того, чтобы понять моё утверждение: любой из предложенных вами маятников не сможет удержать центнер веса маятника.

                                Концептуальная ошибка вот в этом постулате


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

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

                                  Поскольку в выбранной вами конструкции требуется не удержать маятник строго вертикально (гироскопа/акслерометра же нет), а удержать позицию энкодера — то это ну один в один типичная задача позиционирования вала двигателя по экодеру. И все равно, для классического алгоритма (со звеньями PID, которые вам так не нравятся), сколько промежуточных механических передач присутствует между двигателем и датчиком (энкодером).
                                  Никто не строит мат. модели ЧПУ станка. Все гораздо проще… Не нужно усложнять.

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

                                  Не надо утрировать и передергивать. Люфт редуктора. О другом люфте я и не говорил. Люфт обычного редуктора с эвольвентным профилем. Сомневаюсь что люфт у Вас больше 1-2 градусов на выходном валу (ну для самых убогих и дешевых мотор/редукторов). Это вызовет в худшем случае мелкую вибрацию около 0 удержания. Не более.

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

                                  Вы построили мат. модель и рассчитали коэф. для ускорения/скорости и напряжения в конкретных условиях наблюдения. И почему то считаете что «посчитать именно модель для гладких кривых, приближающих реальность».
                                  Т.е. мат модель ближе к реальности чем реальная система?!

                                  Да изменятся в параметры (да хоть смазка загустеет, другое положение маятника даже..) и…

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

                                  В результате на Вашем видео я и вижу раскачку туда сюда маятника в режиме «почти упал — подхватили».
                                  Или у Вас еще одно видео? где «ловя отклонения маятника очень маленькими движениями»

                              0
                              Никакой магии. Классическая теория управления (3 курс).

                              Справедливости ради, та теория, что использует автор с своих постах про маятник, тоже изучается на 3-4 курсе по направлению ТАУ.
                                0
                                Подход автора:
                                1. Создаем математическую модель системы и считаем что она совпадает с реальной в некотором приближении.
                                2. Все константы вычисляем и частично подбираем вручную (что бы наблюдаемый процесс приближался к реальному). Константы фиксированные.
                                3. То что выходит за рамки модели в реальном наблюдении называем «шумом» и отбрасываем.

                                В принципе стандартный вариант создание математической модели процесса. А что что его (этот подход) изучают не только в ТАУ — вполне нормально.

                                Но только в ТАУ еще и про другие вещи говорятся…

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

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

                                У меня нет слов… я привожу примеры (видео!) что это возможно, а мне говорят «не сможет»…
                                Да. В концепции автора (математическая модель с фиксированными коэф. по конкретным массам и длинам) это не может работать.

                                Почему она не стоит как вкопанная на нулевой позиции, ловя отклонения маятника очень маленькими движениями?

                                Мелкими движениями!? Ну я же вижу это видео в статье!
                                Это мелкие движения? Да это скорее ближе к автоколебаниям.
                                Интересно, сколько у автора заняло времени подобрать параметры мат. модели (и что будет если на маятник навестить грамм 10 груза, не меняя коэффициенты?

                                  +2
                                  В рамках предложенной мат. модели автором, без обратной связи, оно так и будет болтаться как на видео.

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

                                    Ладно что сигнал только один (по хорошему бы еще и ток двигателя мерить, потому что правильней управлять током мотора).

                                    Но параметры мат. модели то фиксированные. Под фактический реальный мир она не подстраивается.
                                    Т.е. один раз создали модель с каким то приближением. Проверили что в определенных (довольно узких условия эксперимента) она более менее близка к «железке» с конкретными параметрами (масса/длина и пр.).
                                    И сказали: «Это реальность». Все. модель (программа) полностью детерминирована (конкретному параметру на входе соответствует значение на выходе).

                                    Но обычно делают так, что бы мат модель подстраивалась динамически под реальный мир. Самый простой и классический способ — PID (из самых простых, но можно и посложней придумать исходя из модели)

                                    Автор почему то не любит PID…
                                      +2
                                      Поясните, пожалуйста, как связано PID регулирование и «подстройка» математической модели под реальный мир? Какая именно модель подо что подстраивается? Забудем пока про маятник, посмотрим на задачу управления положением ДПТ.
                                        0
                                        Ну к примеру ДПТ с энкодером (двигатель постоянного тока же имели в виду?) и мат. модель реализованная программно с неизменными коэффициентами.

                                        Допустим, мы нашли экспериментальным или теоретическим путем график зависимости скорости от напряжения и коф. уровнения задали в константами. (Как автор)

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

                                        Если коэф. мат модели будут корректироваться динамически, то модель будет в процессе работы адаптироваться под физ. объект.

                                        PID они будут корректироваться или вообще другим алгоритмом… это уже на выбор.

                                          +1
                                          Подождите, PID регулятор не корректирует параметры модели. То, что Вы описываете, это звучит как адаптивное управление, которое online либо определяет текущие параметры модели для пересчета регулятора, либо сразу же подстраивает параметры регулятора для достижения цели управления.
                                          PID регулятор не адаптивен (разве что по отношению к постоянному возмущающему воздействию, где интегральная составляющая принимает смысл оценки возмущения), он робастен. То есть он обеспечивает работоспособность замкнутой системы независимо от (достаточно малых) изменений параметров, а не подстраивается к этим изменениям.
                                            0
                                            Возможно я не совсем правильно донес то что хотел сказать.

                                            Рассмотрим, в качестве примера, именно эту статью.
                                            По факту реализации (в программном коде):
                                            1. На входе модели два параметра: позиция каретки и угол маятника.
                                            3. Все параметры модели полностью заданы заранее как результат расчета по конкретным физ. параметрам (масса, длинна и пр.)
                                            3. На выходе скорость (хотя на самом деле — это напряжение/скважность ШИМ).

                                            Т.е. подразумевается, что скорость физическая однозначна будет соответствовать «напряжению» на двигателе (вычисленной скорости).

                                            Но:
                                            1. Столь упрощенная модель двигателя в реальной жизни будет работать с большой погрешностью.
                                            2. Любое существенное изменение параметров (чашка кофе на маятнике, как на одном из видео в примера реализации обратного маятника) и в данной концепции мат. модель перестанет соответствовать.

                                            п1. можно компенсировать двумя способами:
                                            1. Адаптивно менять коэффициенты расчета ШИМ для заданной скорости.
                                            2. Поддерживать скорость с PID (с существенно более высокой частотой).

                                            п2. в данном способе решения (мат модель процесса) не решается в лоб вообще.

                                            — Как решаются такие задачи на практике (промышленные решения) — я давал ссылку на очень полезную статью. https://geektimes.ru/company/npf_vektor/blog/274096/

                                            Если бы я все это не пробовал сам на практике, то и не говорил был.
                                            Мне нужно было (для системы типа polargraph) держать на определенных участках постоянную скорость и позиционироваться в определенную точку с обычным коллекторным мотором с редуктором (да еще червячным)

                                            Я неделю (вечера) потратил на эксперименты с идеей: «Не хочу подбирать коэф. PID, у меня же есть гениальная идея. Щаз сделаю модель, по которой буду выставлять ШИМ исходя из скорости». Ровно так как автору. И даже такие же графики рисовал.
                                            Все замечательно работает на участках начиная от 3-5 мм/сек.
                                            Но вот для меньших скоростей нет. Да еще вешаешь на каретку другой груз — вообще все меняется.
                                            Позиционирование с заданной точностью вообще не получилось (как раз по этой причине).

                                            Плюнул на все и вернулся к классике (PID двух звенный). Все заработало.
                                            А после того как по совету автора статьи (https://geektimes.ru/company/npf_vektor/blog/274096/) дискретизацию увеличил, так вообще все плавно и точно стало.

                                            Самое главное, что и по первому варианту худо бедно работало. Но вот именно, что «худо бедно».
                                            Впрочем, свои грабли, тщательно выструганные и отполированные всегда любимые же?

                                              0
                                              Вы плохо читали мой текст. Вход: позиция, угол, скорость, угловая скорость. Выход: сила, которую необходимо приложить к каретке. Исходя из необходимой силы И уже имеющейся скорости, рассчитывается напряжение.
                                                0
                                                Да видел я, конечно, графики и формулы и программу в первую очередь.
                                                set_speed(u*255./24.);

                                                А какая в сущности разница? Cила и скорость в общем то однозначно взаимосвязаны.

                                                Я то говорил о том, что у Вас предполагается, что реальная конструкция в реальных условиях работает по детерминированной мат. модели.

                                                В частности, мотор всегда при подаче на него определенного напряжения (ШИМ), и в определенных параметрах (текущая скорость) он будет везти себя одинаково (развивать один и тот же момент) и полностью по рассчитанным коэф.

                                                Разве не это Ваша программа предполагает?

                                                Я не критикую расчеты и мат. модель маятника. Я критикую вот этот подход который я вижу в статье и программе. «реальный мир должен соответствовать рассчитанным коэф. мат модели.»
                                                  0
                                                  Сила однозначно связана с ускорением, а не скоростью, это фундаментальная разница.

                                                  Текущая система довольно устойчива к изменениям параметров, и от чашки кофе точно не сложится. Доделаю нормальную оценку скорости по энкодеру, покажу.
                                                    –2
                                                    Сила однозначно связана с ускорением, а не скоростью, это фундаментальная разница.

                                                    Вот обязательно нужно за собой последнее слово оставить :)
                                                    Для заданного dt сила и скорость однозначно связаны.
                                                    Но Вы все равно же поняли что я хотел сказать. Я же про неоднозначную связь напряжения и всех остальных значений (включая производные).

                                                    Текущая система довольно устойчива к изменениям параметров, и от чашки кофе точно не сложится. Доделаю нормальную оценку скорости по энкодеру, покажу.

                                                    Ну да. практика — критерий истины. На youtube полно роликов с обратным маятником на подобном оборудовании. Есть с чем сравнивать.
                                                    Будет что продемонстрировать с исходниками программы — будет видно.
                                                      0
                                                      для заданного dt сила и скорость однозначно связаны.


                                                      Не согласен.

                                                      А про последнее слово: вы поймите, как выглядите со стороны: вы путаете ускорение и скорость, вы утверждаете, что ПИД подстраивает параметры, вы путаетесь в термине обратная связь и тп. Но при этом пишете крайне категорично и апломбом…
                                                        –2
                                                        Мда…
                                                        Обвинение «путаете ускорение и скорость»… это уже за гранью добра и зла.
                                                        Оставляю на Вашей совести.

                                                          +1
                                                          для заданного dt сила и скорость однозначно связаны


                                                          Сила — это ускорение. Какой бы ни был dt, скорость и ускорение — это не одно и то же. Скорость на вход, желаемое ускорение на выход. Связь между ними и называется управлением.
                                                0
                                                «Не хочу подбирать коэф. PID, у меня же есть гениальная идея. Щаз сделаю модель, по которой буду выставлять ШИМ исходя из скорости»

                                                Судя по описанию, Вы пытались сделать open-loop управление, то есть по значению желаемой скорости взять из какой-то калибровочной таблицы или формулы значение управляющего сигнала, при котором эта скорость достигается. И при этом не глядя на реальную текущую скорость. Я Вас правильно понял? Если да, то, конечно, разомкнутый контур будет чувствителен к дрейфу параметров.
                                                Разработку автора же, фактически, можно рассматривать как два контура, скорости и положения, где в каждом контуре стоит П регулятор. То есть его система замкнута по измерениям.
                                                  0
                                                  Судя по описанию, Вы пытались сделать open-loop управление, то есть по значению желаемой скорости взять из какой-то калибровочной таблицы или формулы значение управляющего сигнала, при котором эта скорость достигается. И при этом не глядя на реальную текущую скорость. Я Вас правильно понял? Если да, то, конечно, разомкнутый контур будет чувствителен к дрейфу параметров.

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

                                                  Конечна таблица с шагом 1 mm/c — (предел определения скорости для моей конструкции) это дискретно, но не думаю, что именно это мешало.

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

                                                  Да именно так. Только я, на основе своего опыта, считаю что только пропорциональной составляющей не хватит.
                                                    0
                                                    Нашел обрывки записей (1.5 года назад).
                                                    ШИМ = f(текущей скорости, нужной скорости, dt), где dt — константа в 100ms
                                                    Фактически это ШИМ для нужного ускорения. функция по калибровочной таблице (с линейной апроксимацией)
                                                    калибровочная таблица с шагом ШИМ 5 (из диапазона 500-950 для полного диапазона 1000). При скважности 500/1000 = 50% двигатель вообще не стартует. 9500/1000 = 95% — предел из за выбранной схемы управления мостом на полевиках.

                                                    типичный размер таблицы не помню… размер динамически строился.
                                                      0
                                                      В конечном итоге, перебрав разные формулировки, мы пришли к заключительному
                                                      Только я, на основе своего опыта, считаю что только пропорциональной составляющей не хватит.

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

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

                                                        Т.е. максимально лучший практический результат.
                                                        И исходя из этого пытался сказать что выбранная структура (статическая) для этого не самая лучшая.

                                                        Если бы я увидел именно такую формулировку:
                                                        На сколько я помню, он тогда пояснил, что его цель — разобраться с построением классического, то есть статического, без собственной динамики, LQR, а не выжать максимум из имеющегося оборудования.

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

                                                        Но вот сейчас, пробежавшись по тексту статей, я такого пояснения не вижу.
                                                        Возможно пропустил…

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

                                Самое читаемое