Практика
При работе с реальными объектами управления, как правило, сначала производится построение уравнений динамики объекта управления, синтез регулятора и последующий анализ в среде математического моделирования. Только после этого полученный закон управления и коэффициенты обратной связи, удовлетворяющие желаемым требованиям качества системы, переносят на аппаратную платформу. Такой порядок особенно важен для устройств, которые при неверной настройке могут выйти из строя или причинить вред человеку. К таким устройствам можно отнести летательные аппараты, автомобили или шагающие роботы. Именно поэтому сначала производится моделирование и уже потом тестирование на реальном объекте. Ход практической работы будет строиться по этому же принципу.
Математическое моделирование
Откройте файл Python/model.ipynb. В нём, в качестве примера, реализована модель коллекторного двигателя. Его динамика описывается системой уравнений:
где — угол поворота выходного вала двигателя, — ток в обмотках статора, — напряжение, — коэффициент трения, — момент инерции ротора, — постоянная противо-ЭДС, — индуктивность обмоток, — сопротивление обмоток. В матричной форме эти уравнения выглядят как:
Параметры маятника
В блоке Pendulum Physical Parameters приведены все необходимые физические параметры исследуемого объекта управления. Обычно эти параметры берутся из документации к составным устройствам или получаются экспериментальным путём. В данном случае в блоке приведены параметры коллекторного двигателя. Отредактируйте этот блок и впишите все необходимые параметры маятника, используя табл. 3. Используйте те же названия переменных, что и в графе Обозначение.
Таблица 3. Физические параметры маятника
| Параметр | Обозначение | Ед. изм. | Значение | Описание |
|---|---|---|---|---|
L1 | м | 0.044 | Расстояние от точки до центра масс стержня | |
L2 | м | 0.088 | Расстояние от точки до маховика | |
R | м | 0.0655 | Радиус маховика | |
m1 | кг | 0.1975 | Масса стержня | |
m2 | кг | 0.2545 | Масса маховика | |
I1 | кг·м² | m1*L1**2/12 | Момент инерции стержня | |
I2 | кг·м² | m2*R**2/2 | Момент инерции маховика | |
g | м/с² | 9.81 | Ускорение свободного падения | |
b_p | Н·м·с/рад | 0.007 | Коэффициент вязкого трения в шарнире | |
b_m | Н·м·с/рад | 0.0 | Коэффициент вязкого трения между статором и ротором двигателя | |
Lm | Гн | 0.01 | Индуктивность обмотки двигателя | |
Rm | Ом | 22 | Сопротивление обмотки двигателя | |
Ke | рад/с/В | 0.29 | Скоростная постоянная | |
Kt | Н·м/А | 0.27 | Моментная постоянная | |
Vmax | В | 12 | Максимальное напряжение двигателя |
Нелинейная модель
Блок Nonlinear model описывает систему уравнений . Преобразуйте этот блок так, чтобы он описывал нелинейную модель обратного маятника . Используйте следующий шаблон кода:
# constants
a = ...
b = ...
# function that describes nonlinear dynamics
def nonlinear_dynamics(theta, d_theta, d_phi, voltage):
# Input:
# theta - pendulum angle [rad]
# d_theta - pendulum angular velocity [rad/s]
# d_phi - wheel angular velocity [rad/s]
# voltage - motor input voltage [volt]
_dd_theta = ...
_dd_phi = ...
_theta = theta + d_theta * dt
_d_theta = d_theta + _dd_theta * dt
_d_phi = d_phi + _dd_phi * dt
return np.array([_theta, _d_theta, _d_phi])
Чтобы удостовериться в корректности работы вашего кода, используйте блок Nonlinear Model Simulation, который производит симуляцию и вывод графика переходных процессов. При правильно составленной модели вы должны увидеть такой график, как на рис. 11.

Рисунок 11. Результаты моделирования нелинейной модели.
Объясните, почему объект ведёт себя именно так. Попробуйте изменить параметры x0 и u, чтобы лучше понять его поведение.
Линейная модель в пространстве состояний
В блоке State Space Model описывается линеаризованная модель двигателя в пространстве состояний . Преобразуйте этот блок так, чтобы он описывал модель маятника . Используйте приведённый ниже шаблон:
# constants
a = ...
b = ...
# elements of matrix A and vector B
a21 = ...
a22 = ...
a23 = ...
a31 = ...
a32 = ...
a33 = ...
b2 = ...
b3 = ...
# State transition matrix A and control vector B
A = np.array([
[0, 1, 0],
[a21, a22, a23],
[a31, a32, a33],
])
B = np.array([
[0],
[b2],
[b3],
])
# Output matrices and vectors
C = np.array([
[1, 0, 0], # pend angle
[0, 1, 0], # pend angular vel
[0, 0, 1], # wheel speed
])
D = np.array([[0], [0], [0]])
Чтобы удостовериться в корректности работы вашего кода, используйте блок State Space Model Simulation, который производит симуляцию и вывод графика переходных процессов. При правильно составленной модели вы получите график, как на рис. 12.

Рисунок 12. Результаты моделирования линейной модели.
Объясните, почему объект ведёт себя именно так. Попробуйте изменить параметры
x0иu, чтобы лучше понять его поведение.
Дискретизация, управляемость и стабилизация
- Блок
Convert to Discrete Time Domainпроизводит преобразование непрерывной модели в дискретную, используя средства библиотекиControl Systems Library. Пользуясь уравнениями (14) и (15), напишите собственную реализацию такого преобразования. - В блоке
Controllability Analysisпроизведите анализ управляемости системы. Переходите к следующим пунктам только если система управляема. Если окажется, что система не управляема, то скорее всего вы допустили ошибку во время выполнения предыдущих пунктов. - Блок
Stabilization in upright position via LQR Controlпроизводит решение линейно-квадратичной задачи управления. Получение матрицы коэффициентов обратной связи производится с помощью функцииdlqr()библиотекиControl Systems Library. В библиотекеscipyсуществует функцияsolve_discrete_are(Ad, Bd, Q, R), решающая дискретное уравнение Риккати. На вход она принимает значения матрицAd,Bd,QиRв указанном порядке, а на выходе даёт решение . Она уже импортирована в проект в блоке 1. Напишите собственную реализацию получения матрицы , пользуясь предложенной функцией и уравнением .
Матричное умножение в Python делается при помощи оператора @.
- В блоке
Stability Analysisпроанализируйте устойчивость замкнутой системы, пользуясь критерием устойчивости дискретных систем из теоретической части. Чтобы получить собственные числа матрицы, используйте функцию библиотекиnumpy:
eigvals = np.linalg.eigvals(M)
- На вход, вместо
M, подайте матрицу , на выходе вы получите все собственные числа. - В блоках
Closed-Loop System Simulationпроизводится симуляция замкнутой системы, используя линейные и нелинейные уравнения. Сравните полученные результаты. Поэкспериментируйте с весовыми коэффициентами матрицQиR, посмотрите, как меняются переходные процессы. Выберите наилучшие, по вашему мнению, коэффициенты. - В блоке
Swing-Up Controlпроизводится управление раскачиванием маятника с последующим переходом в режим стабилизации. Коэффициент обратной связи и порог переключения режимов управления заданы случайным образом. Вам необходимо подобрать такие значения этих переменных, чтобы маятник, раскачавшись, смог перейти в режим стабилизации. Значение подбирайте, опираясь на формируемый в блоке графикEnergy. Старайтесь подобрать его таким, чтобы ошибка между и была минимальной. Значение выбирайте таким, чтобы избежать преждевременного переключения в режим стабилизации, когда маятник ещё не успел достичь области притяжения. В нашем случае максимально возможная ошибка между и составляет приблизительно0.7Дж. Соответственно, если вы поставите, например, , то контроллер перейдёт в режим стабилизации, не успев раскачаться.
Эксперимент
В процессе выполнения вышеописанных пунктов вы должны были получить коэффициенты матрицы для режима стабилизации, коэффициент обратной связи для управления раскачиванием и порог переключения режимов управления . Эти значения понадобятся для управления аппаратной платформой маятника. Чтобы применить их, проделайте следующие действия:
- Откройте файл
Firmware/wheel_pendulum_practicum/wheel_pendulum_practicum.inoс помощью Arduino IDE. В этом файле реализовано взаимодействие с датчиками, управление двигателем и работа в режимах раскачивания, торможения и стабилизации. - Объявление коэффициентов обратной связи и вместе с порогом переключения реализовано в строках 17-21. Функция
control()вызывается каждые10мс. В ней реализованы контуры стабилизации, раскачивания и торможения. Изучите эту функцию и разберитесь, при каких условиях включается тот или иной режим управления. - Введите полученные вами в ходе работы значения коэффициентов вместо указанных в строках 17-21.
- Подключите программатор к плате управления маятником, а затем к компьютеру через порт USB.
- Скомпилируйте и загрузите прошивку кнопкой
Uploadв Arduino IDE.

Рисунок 13. Микроконтроллерный модуль VB32G4.
- После выполнения загрузки прошивки отсоедините программатор от платы управления и нажмите кнопку
RST(рис. 13). Двигатель начнёт вращаться. В этот момент система инициализирует все необходимые параметры управления двигателем. Дождитесь окончания вращения двигателя. - Нажмите кнопку
USR. Должно включиться управление маятником.
Если через секунду после нажатия на кнопку USR двигатель не пришёл в движение, сделайте следующее:
- качните маятник рукой;
- отключите программатор, выключите и снова включите плату управления.
Если вы включили управление маятником, он раскачался и встал в режим стабилизации, значит вы правильно настроили коэффициенты обратной связи. Часто при разработке алгоритмов управления получается так, что коэффициенты, отлично подходящие для модели, не всегда стабилизируют реальный объект. Это связано с расхождением между моделью и реальностью. Чаще всего это происходит из-за погрешности вычислений физических параметров объекта управления и неучтённых параметров в уравнениях движения, например силы трения, упругости или ограничения по скорости двигателя. Линеаризация также влияет на расхождение, так как происходит пренебрежение некоторыми параметрами и переменными. В таком случае сначала стоит попробовать подобрать другие коэффициенты. Если это не поможет, необходимо произвести уточнение модели. Соответственно, в случае проблем со стабилизацией попробуйте подобрать другие коэффициенты, меняя весовые коэффициенты матриц Q и R. Также в случае проблем с раскачиванием или порогом переключения попробуйте изменить коэффициенты и . Если ничего не помогло, ещё раз убедитесь, что вы правильно составили математическую модель в файле model.ipynb.