- PVSM.RU - https://www.pvsm.ru -
Статья служит шпаргалкой для тех, кто хочет сделать свой обратный маятник. Здесь описаны проблемы, из-за которых я все переделывал несколько раз, приведен краткий обзор теории, необходимый для понимания, как стабилизировать систему.
Коротко: хотел расширить свой ЧПУ станок, но что-то пошло не так…
Проект занял почти два года проб и ошибок, перепроектирования, ожидания деталей и неполно прожитых выходных, чтобы желающие повторить сэкономили себе время и нервы, считаю нужным рассказать о неудачных решениях.
Для полноты картины, смоделируем маятник на свободной каретке без трения.
Уравнения движения можно получить дифференцированием лагранжиана [2] по обобщенным координатам. Получим следующие уравнения:
из которых можно найти, как меняется вектор состояния:
и смоделировать систему. Код здесь [3].
Здравый смысл и визуализация нам подсказывают, что маятник сам по себе стоять не будет. Но как в этом убедиться математически?
В общем виде линеаризованная система и решение выглядят следующим образом:
Экспонента в степени матрицы выглядит понятней, если перейти в систему координат из собственных векторов, тогда матрица будет диагональной(), и экспонента будет иметь вид:
Теперь видно, при наличии собственных значений () с положительной действительной частью, соответствующая компонента вектора состояния будет стремиться в бесконечность, и система развалится. Вышесказанное касается непрерывных систем, более подробно про устойчивость рассказывается в этой [4] видео-лекции.
Проверим так ли это, для обратного маятника. Линеаризуем нашу систему около положения равновесия при :
Ненулевые собственные значения имеют вид , таким образом мы убедились в неустойчивости.
Теперь на каретку будет действовать сила , одно из уравнений перепишется в виде: , и линеаризованная система примет вид:
Теперь система () стала управляемой [5], в этом можно убедиться, проверив, что ранг матрицы равен размерности вектора состояния, т.е. 4. Для удержания маятника в вертикальном положении я использовал линейно-квадратичный регулятор состояния, т.е. управление (u или f) есть произведение вектора состояния на вектор параметров, которые находятся один раз минимизацией квадратичного функционала [6]. Код симуляции здесь [7].
Теперь нужно управлять мотором постоянного тока, он содержит много параметров, которых я не знаю, поэтому я принял его за «черный ящик», описываемый следующими уравнениями с учетом трения:
Про вывод уравнений и оценку параметров можно прочитать здесь [8]. Ниже приведу мои графики разгона мотора с кареткой в зависимости от напряжения (в реальности на выходе контроллера ШИМ-сигнал) и подогнанные кривые.
Коэффициенты модели я также нашел перебором, код [9].
Таким образом, регулятор дает нам требуемое ускорение, а из 2-го уравнения, зная все константы, найдем напряжение.
Теперь у нас есть все знания, чтобы собрать и стабилизировать маятник. Я использовал следующее железо:
Таким образом мы явно измеряем угол маятника, положение каретки, вычисляем угловую скорость маятника и скорость каретки — получаем полное состояние, параметры регулятора я нашел этим [11] скриптом. К удивлению все достаточно быстро заработало как есть. Результатом я доволен, стоит и даже стакан держит!
Код для Arduino находится здесь [12]
Что удалось усовершенствовать по сравнению с многими вариантами, которые можно найти на youtube — этот маятник тихий, потому что ШИМ настроен вне слухового диапазона, и используются пластиковые колеса.
Теперь эта задача выглядит, как лабораторная работа: измерить параметры мотора и найти коэффициенты регулятора, попутно разбираясь в происходящем.
Планирую продуктизовать маятник: сделать раскачивание, избавиться от мотка проводов, сделать shield у удобными разъемами, чтобы не стыдно было подарить в какую-нибудь школу или музей. Если кто-то желает присоединиться, буду рад, есть еще много амбициозных идей.
Спасибо за внимание!
Автор: zjor
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/334790
Ссылки в тексте:
[1] DIY наборчик: https://ru.aliexpress.com/item/32716376406.html
[2] лагранжиана: https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B5%D0%B2%D0%B0_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%B0
[3] здесь: https://github.com/zjor/inverted-pendulum/blob/master/python/free-cart.py
[4] этой: https://www.youtube.com/watch?v=h7nJ6ZL4Lf0&list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m&index=4
[5] управляемой: https://ru.wikipedia.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_(%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F)
[6] минимизацией квадратичного функционала: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE-%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80
[7] здесь: https://github.com/zjor/inverted-pendulum/blob/master/python/controlled-cart-pendulum.py
[8] здесь: https://habr.com/ru/post/280486/
[9] код: https://github.com/zjor/inverted-pendulum/blob/master/dc-motor/estimate_params.py
[10] 10Amp 5V-30V: https://www.cytron.io/p-10amp-5v-30v-dc-motor-driver
[11] этим: https://github.com/zjor/inverted-pendulum/blob/master/dc-motor/pendulum_lqr_control.py
[12] здесь: https://github.com/zjor/inverted-pendulum/blob/master/sources/pendulum-state-control/src/main.cpp
[13] Подробное описание задачи об обратном маятнике: https://model.exponenta.ru/bt/bt_152_Inv_Pend_control_1.htm
[14] Разжёвываем линейно-квадратичный регулятор для управления перевёрнутым маятником: https://habr.com/ru/post/301276/
[15] Отличные видео-лекции по ТАУ: https://www.youtube.com/watch?v=Pi7l8mMjYVE&list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m
[16] Источник: https://habr.com/ru/post/472588/?utm_campaign=472588&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.