четверг, 2 декабря 2010 г.

Задание на лабу 3 и пример решения.

1. Взять систему из предыдущих работ и построить ее модель в SimMechanics.
2. Получить по модели из SimMechanics средствами MATLAB ее аналитическое представление в пространстве состояний.
3. Положив, что не все состояния модели наблюдаемы, синтезировать наблюдатель.
4. Выполнить синтез системы управления с помощью Simulink Design Optimization

Пример решения.



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





1. Построение модели.
Построение модели начинаем с размещения в модели блоков Ground и Machine Environment из библиотеки Simscape/SimMechanics/Bodies. В параметрах Ground устанавливаем Show Machine Environment port и подключаем к появившемуся порту модуль Machine Environment.


Компонент Ground моделирует неподвижную систему отсчета. Введем в рассмотрение платформу, к которой прикладывается сила и на которой находится подвижный груз. Для этого разместим в модели компонент Body из библиотеки Simscape/SimMechanics/Bodies. Установим массу (Mass) платформы в 100.

Между неподвижной системой отсчета и платформой возможно поступательное движение с одной степенью свободы. Для моделирования этого движения разместим на модели компонент Prismatic из библиотеки Simscape/SimMechanics/Joints. Блок Prismatic обеспечивает связь между двумя телами, также он позволяет выводить состояние соединения -- скорость и перемещение одного тела относительно другого. Для этого необходимо в свойства блока установить Number of sensor / actuator ports, задав необходимое количество портов измерения. После подключения компонентов получаем модель:


Чтобы обеспечить движение по оси x (по горизонтали) необходимо в параметрах Axis of Action [x y z] компонента Prismatic задать вектор [1 0 0], что разрешает движение по x (по умолчанию там [0 0 1] -- это не подходит в данном случае).

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

Для приведения в поступательное движение платформы с помощью блока Prismatic поместим в модель компонент Joint Actuator из библиотеки Simscape/SimMechanics/Sensors & Actuators. Этот компонент преобразует информационные сигналы Simulink в механический сигнал SimMechanics. Возможно два варианта управления актуатором: с помощью обобщенной силы и тройки сигналов перемещения, скорости и ускорения. Выберем второй вариант управления, задав при этом в свойствах объекта Joint Actuator параметр Actuate with: Motion. Теперь для приведения в движение тел через компонент Joint Actuator необходимо на его вход подать вектор из ускорения, скорости и перемещния, создав его с помощью блока Mux и последовательного интегрирования сигнала ускорения:


Источником сигнала ускорения является компонент Signal Builder. Для того, чтобы переместить платформу на некоторое расстояние, нам необходимо приложить к ней положительное ускорение (разгон), а потом отрицательное (торможение):


Теперь рассмотрим моделирование подвижного груза на пружине. Поместим в модель компоненты Prismatic и Body -- для представления подвижного груза и прижины, которая создает еще одну поступательную степень свободы. В соответствии с законом Гука, сила противодействия пружины пропорциональна расстоянию между ее концами. Для моделирования пружины может быть использован компонент Prismatic вместе с компонентом Joint Spring & Damper из библиотеки Simscape/SimMechanics/Force Elements. Поскольку каждый информационный выход Prismatic также является и входом, то с помощью одного соединения между Prismatic и Joint Spring & Damper можно промоделировать пружину: на вход Joint Spring & Damper поступает перемещение, с выхода -- сила противодействия на Prismatic. Для задания жесткости пружины установим Spring Constant k в 1 в параметрах блока Joint Spring & Damper.


Особо следует заметить важное правило при построении модели: нельзя подключать одно тело к другому телу (осуществлять прямую связку между двумя компонентами Body) -- связь между двумя телами может быть выполнена только через компоненты соединений из библиотеки Simscape/SimMechanics/Joints. Аналогично, нельзя подключать между собой два соединения (связывать два компонента типа Joint) -- это делается через компонент типа Body.

Положение конца пружины и скорость его перемещния может быть получено из компонента подвижного соединения типа Prismatic с помощью подключения его дополнительного выхода к компоненту Joint Sensor из библиотеки Simscape/SimMechanics/Sensors & Actuators. Поместив блок Joint Sensor в модель выберем в свойствах Position и Velocity. В результате на его выходе будет вектор из двух компонентов с текущими положением и скоростью груза на конце пружины. Это сигнал Simulink и он может быть подключен к осциллографу Scope и т.д.

В результате получаем окончательную модель системы.


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


Интересно было бы получить анимацию этой модели. Рассмотрим как сделать это самыми тривиальным способом. Для этого необходимо в меню Simulink вызывать окно настройки параметров модели: пункт Simulation/Configuration Parameters... далее в левой части окна в дереве выбрать Simscape\SimMechanics и установить Visualization\Show animation during simulation. После проделанных действий при запуске моделирования автоматически откроется окно Machine for model: с анимацией положения всех тел модели. Чтобы представить подвижные тела модели в виде сфер (эллипсоидов -- в зависимости от их тензора инерции) необходимо выбрать в меню окна анимации пункт Model/Body Geometries/Ellipsoids. Для замедления анимации можно вызвать окно параметров через меню Simulation/Control Animation Speed и установить там задержку Delay per frame (ms).

Обратите внимание, что картинку анимации можно приближать или отдалять мышкой при выборе пункта меню View/Zoom или можно воспользоваться View/Fit to view.

Результат анимации:


UPD: Вот тут как получить модель из сборки в SolidWorks

2. Получение аналитической модели.

В MATLAB существуют средства автоматического извлечения линеаризованных уравнений в пространстве состояний из моделей Simulink. Поскольку наша цель -- управление, то нам надо вывести на выход все переменные состояния моделируемой системы. Для того, чтобы определить какие состояния модели Simulink существуют можно воспользоваться встроенным средством анализа, вызвав его через меню Tools/Control design/Linear analysis в Simulink. В левой части появившегося окна Control and Estimation Tools Manager в дереве необходимо выбрать Workspace/Project - /Operation Points/Default Operating Point. После справа будут перечислены состояния в таблице State:Value.


Для получения аналитической модели, представим собранную в Simulink систему в виде подмодели. Для этого подключим вместо источника сигнала Signal Builder блок входа In1 из библиотеки Simulink/Sources. Также подключим на выход интеграторов и вместо осциллографа Scope блоки выходов Out1 из Simulink/Sinks. Номера выходов Port number (задаются в свойствах блока Out) зададим в полном соответствии с таблицей из Control and Estimation Tools Manager: выход Integrator -- выход 1, выход Integrator1 -- выход 2, выход Joint Sensor -- выход 3. Такая нумерация удобна потому что нам надо получить диагональную матрицу $C$ модели в пространстве состояний.

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


Для получения аналитической модели -- матриц $A,B,C,D$ модели пространства состояний
$$\dot x = A x + B u$$
$$y = C x + D u$$
необходимо использовать функцию linmod. Вызов функции

[A,B,C,D] = linmod('ModelSub')



где ModelSub -- это имя модели (имя файла .mdl в текущем рабочем каталоге)

После вызова мы получаем матрицы:
A =

0 1.0000 0 0
0 0 0 0
0 0 0 1.0000
0 0 -1.0000 0


B =

0
1
0
-1


C =

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1


D =

0
0
0
0



3. Синтез наблюдателя для оценки состояний по выходам.

В реальности все состояния объекта управления сложно измерить. Измерять все и не требуется -- некоторые состояния можно восстановить по значениями других. По матрицам $A,C$ можно узнать возможно ли это сделать в принципе. Для этого служит функция obsv, вычисляющая матрицу наблюдаемости -- если ее ранг равен числу состояний $n$, то все состояния возможно восстановить. Соответствующий вызов obsv дает

rank(obsv(A,C))

ans =

4


значит, все состояния наблюдаемы -- что очевидно, потому что $C$ -- диагональная.

Попробуем измерять только два состояния $x_1$ и $x_3$, изменив матрицу:

C = [1 0 0 0; 0 0 1 0];
D = [0; 0];


Тест на наблюдаемость дает следующий результат:

 rank(obsv(A,C))

ans =

4


т.е. по измеряемым двум можно восстановить все 4.

Для этого необходимо синтезировать т.н. наблюдатель -- это модель объекта управления, которая работает параллельно с ним и подключена к тому же входу $u$. Состояние наблюдателя $\hat x$, его выход -- $\hat y$. Уравнение динамики наблюдателя при $D = 0$ записываются в виде:

$$\dot \hat x = A \hat x + B u + L (y - \hat y)$$
$$\hat y = C \hat x$$

Если обозначить $\hat e = y - \hat y$, то динамика наблюдателя может быть записана через $\hat e$

$$\dot \hat e = (A - L C) e$$

Поскольу при $y \to \hat y$ надо, чтобы $\hat e \to 0$, то задача вычисления $L$ -- это обеспечение устойчивости наблюдателя, которая может быть решена методом размещения полюсов независимо от синтеза регулятора (вычисления матрицы $K$).

Для синтеза наблюдателя, сначала выберем минимальное абсолютное собственное значение $\hat \lambda$, такое чтобы оно было больше абсолютной величины собственных чисел регулятора $\hat \lambda \gg \lambda$ -- это условие, что наблюдатель работает быстрее регулятора. Например, если вектор собственных чисел для регулятора

P = [-1 -2 -3 -4];


то для наблюдателя мы можем выбрать

P_ = [-10 -12 -13 -14];


Все остальное -- аналогично методу синтеза размещением полюсов для вычисления матрицы регулятора $K$:

n = 4; % число состояний
m = 2; % число наблюдаемых выходов
k = 1; % число входов
P_ = [-10 -12 -13 -14]; % выбор собственных чисел (полюсов)
L = place(A',C', P_)'; % синтез размещением полюсов
% создание модели пространства состояний для наблюдателя
B_ = [B L];
D_ = zeros(n,m+k);
C_ = eye(n);
A_ = A - L*C;


В результате выполнения этих команд получаем матрицу L

L =

24.9805 -1.4329
155.0787 -18.1644
-1.4092 24.0195
-17.8407 141.9214


Наблюдатель описывается уравнениями

$$\dot \hat x = \hat A \hat x + \hat B (u, y)^T$$
$$\hat y = \hat C \hat x + \hat D (u, y)^T = \hat x$$

где матрицы $\hat A$, $\hat B$, $\hat C$, $\hat D$ -- соответственно переменные A_, B_, C_, D_ в коде команд MATLAB.

На следующей системе в Simulink представлено сравнение модели SimMechanics вставленной через блок Model из библиотеки Simulink/Ports & Subsystems (вверху) и модели в пространстве состояний (внизу):



Управление моделью SimMechanics реализовано по полному вектору состояния, управление моделью в пространстве состояний (блок типа State space с именем Model_ss) -- через наблюдатель (блок типа State space с именем Estimator).

Параметры всех блоков (вектора и матрицы) заданы именами переменных -- перед запуском модели необходимо выполнить скрипт расчета ModelCtrlScript.m

Диаграммы реакций выходов систем на единичный импульс:


Поведение системы с наблюдателем и без не отличаются. Как и не отличаются реакции аналитической модели и компонентой модели SimMechanics.


4. Оптимизационный синтез регулятора в Simulink.

Синтез управления может быть осуществлен с помощью Simulink Design Optimization -- это мощное средство параметрического синтеза систем управления и идентификации моделей, встроенное в Simulink.

Для использования этот средства необходимо:
- разместить в модели блок Signal Contraint из библиотеки Simulink Desing Optimization в Simulink,
- подключить этот блок к сигналу, значение которого необходимо регулировать,
- настроить допустимые границы переходного процесса и установившегося значения регулируемого сигнала,
- определить оптимизируемые переменные и их начальные значения
- запустить процесс оптимизации

Подробнее в картинках.

Собираем модель и помещаем там Signal Contraint


Открываем параметры Signal Contraint (дважды кликаем), выбираем границы изменения сигнала. Можно оставить как есть.


Добавляем переменные для оптимизации, открываем через меню в свойствах Signal Contraint пункт Optimization/Tuned Parameters, нажимаем Add, выбираем k, k1, k2, k3, k4 -- это компоненты вектора обратной связи K и входного усилителя K_. Перед этим был запущен ModelCtrlScript.m с командами:

% синтез регулятора
P = [-1 -2 -3 -4];
K = place(A,B, P)
% переменные для синтеза на основе оптимизации
k1 = K(1);
k2 = K(2);
k3 = K(3);
k4 = K(4);
k = 1;
C_f = C; D_f = D; % сохраняем предыдущее представление


После этого нажимаем в свойствах Signal Contraint на кнопку "Воспроизведение" или через меню Optimization/Start. И наблюдаем за процессом оптимизации. На каком-то шаге может появится сообщение, что сигнал в модели достиг значения бесконечности. В этом случае рекомендуется остановить оптимизацию и запустить снова (будет предложено). Возможно такое произойдет несколько раз. Возможно также, что оптимизация не сойдется -- но это бывает редко.


В результате, мы получаем результат оптимизации -- регулятор выдает на выходе объекта управления желаемую реакцию на единичный импульс



Архив с файлами решений по работе:
Ctrl_Lab3.rar

12 комментариев:

  1. как смоделировать в SimMechanics ситуацию, если к 1 телу приложено больше, чем 1 сила??? Нужно ведь как-то соединить 2 блока prismatic без введения между ними еще одного body)

    ОтветитьУдалить
  2. @disia777 для этого у body есть несколько выходов координатных систем (CS). вы подключаете одну "силу" (компонент prismatic) к одному входу, а другой prismatic -- с другой стороны. в примере к блоку с именем Body1 приложено актуально две силы

    ОтветитьУдалить
  3. в примере пружина связывает 2 тела ...у меня 1 тело и два граунда тогда чтоли? Перепробовал уже все, что можно! Я ведь по сути должен к одному боди подключить два выхода "F" от обоих призматиков! непонятно все равно...у второго призматик остается тогда 1 неподключенный фиолетовый вход "B"...программа жутко и непонятно ругается ...система неправильно строится

    Еще вопросик - Осцилографирование подключать к любому из призматиков?

    ОтветитьУдалить
  4. @disia777 да, вам надо два граунда)

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

    вот для примера вариант 10, посмотрите плс:
    http://sites.google.com/site/akpc806a/Re_Katy_Lab3.mdl

    ОтветитьУдалить
  5. Спасибо! Единственное что - в этой модели signal Builder не подключен к интеграторам. Если подключить и задать такой сигнал, как описано вами выше, осцилограф показывает процесс таким, что мы как будто элементарно переместили груз, но пружина не работает. Скорость растет с нуля и падает до нуля, Перемещение с 1 перегибом тоже стало константой))

    ОтветитьУдалить
  6. @disia777 по поводу Re_Katy_Lab3.mdl -- обратите внимание, что в свойствах компонента Joint Actuator указано Actuate with : Generalized forces. Т.е. в signal Builder нарисована сила. Мы приложили силу, толкнули груз и он пошел колбаситься на пружине))

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

    ОтветитьУдалить
  7. А можно ли задать нелинейную жесткость??? ну хотя бы сделать каким-то образом ступенчатую, скажем чтоб после прогиба на 2см пружина становилась в 2 раза жеще и так далее...

    ОтветитьУдалить
  8. @Анонимный
    Спасибо за вопрос! Для моделирования нелинейного трения или пружины нужно сделать дополнительный вход и выход у Prismatic или Revolute (в зависимости что у вас -- поступательное или вращательное движение), и соединить их через Joint Sensor и Joint Actuator с вашей нелинейной характеристикой трения.
    Например, так сделано с блоками Twist axis и Twist spring-damper в примере Motorcycle: Linear Stability Analysis из демок к СимМеханикс (mech_motorcycle_stability.mdl). И еще в нескольких местах там и не только там)

    ОтветитьУдалить
  9. Вот объясните мне, как в пружинном маятнике убрать отрицательное перемещение пружины за стенкой - нулевым уровнем?

    ОтветитьУдалить
  10. А вроде нашел http://www.kxcad.net/cae_MATLAB/toolbox/physmod/mech/bqvsiew-1.html

    ОтветитьУдалить
  11. Здравствуйте!
    Быстрый ответ: посмотрите как сделано в mech_bouncing_ball.mdl -- нужно взять в качестве ограничителя тело, "приваренное" к земле.

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

    ОтветитьУдалить