В этом примере показано, как использовать Robust Control Toolbox™ для разработки устойчивого контроллера для активной системы подвески. Пример описывает модель четырехвагонной подвески. Затем он вычисляет контроллер для номинальной системы, использующий hinfsyn
команда. Наконец, в примере показано, как использовать ü- синтез для разработки устойчивого контроллера для полной неопределенной системы.
Обычные пассивные подвески используют пружину и демпфер между корпусом автомобиля и колесным узлом. Характеристики пружины-демпфера выбираются, чтобы подчеркнуть одну из нескольких противоречивых целей, таких как комфорт пассажиров, обработка дорог и отклонение подвески. Активные подвески позволяют проектировщику сбалансировать эти цели с помощью гидравлического привода с обратной связью между шасси и колесным узлом.
В этом примере используется модель системы активной подвески с четвертью автомобиля (см. фигуру 1). Масса (в килограммах) представляет собой автомобильное шасси (кузов) и массу (в килограммах) представляет колесный узел. Пружина и демпфер представляют пассивную пружину и амортизатор, размещенные между кузовом автомобиля и колесным узлом. Пружина моделирует сжимаемость пневматической шины. Переменные , , и (все в метрах) являются перемещением кузова, перемещением колеса и нарушением порядка, соответственно. Сила (в кНьютонах), приложенный между корпусом и колесным узлом, управляется с помощью обратной связи и представляет собой активный компонент системы подвески.
Фигура 1: Квартальная модель активной подвески.
С обозначением , линеаризованные уравнения пространства состояний для модели с четвертью машины:
Создайте модель пространства состояний qcar
представление этих уравнений.
% Physical parameters mb = 300; % kg mw = 60; % kg bs = 1000; % N/m/s ks = 16000 ; % N/m kt = 190000; % N/m % State matrices A = [ 0 1 0 0; [-ks -bs ks bs]/mb ; ... 0 0 0 1; [ks bs -ks-kt -bs]/mw]; B = [ 0 0; 0 1e3/mb ; 0 0 ; [kt -1e3]/mw]; C = [1 0 0 0; 1 0 -1 0; A(2,:)]; D = [0 0; 0 0; B(2,:)]; qcar = ss(A,B,C,D); qcar.StateName = {'body travel (m)';'body vel (m/s)';... 'wheel travel (m)';'wheel vel (m/s)'}; qcar.InputName = {'r';'fs'}; qcar.OutputName = {'xb';'sd';'ab'};
Передаточная функция от привода к движению и ускорению корпуса имеет мнимый осевой нуль с естественной частотой 56,27 рад/с. Это называется частотой шинного скачка.
tzero(qcar({'xb','ab'},'fs'))
ans = 2×1 complex
-0.0000 +56.2731i
-0.0000 -56.2731i
Точно так же передаточная функция от привода к отклонению подвеса имеет мнимую ось, нуль с собственной частотой 22,97 рад/с. Это называется частотой пространства трения.
zero(qcar('sd','fs'))
ans = 2×1 complex
0.0000 +22.9734i
0.0000 -22.9734i
Дорожные нарушения порядка влияют на движение автомобиля и подвеску. Комфорт пассажиров связан с небольшим ускорением тела. Допустимый ход подвески ограничивается пределами на перемещение привода. Постройте график усиления разомкнутого контура от нарушения порядка дороги и силы привода до ускорения корпуса и перемещения подвески.
bodemag(qcar({'ab','sd'},'r'),'b',qcar({'ab','sd'},'fs'),'r',{1 100}); legend('Road disturbance (r)','Actuator force (fs)','location','SouthWest') title({'Gain from road dist (r) and actuator force (fs) '; 'to body accel (ab) and suspension travel (sd)'})
Из-за мнимых нулей осей управление с обратной связью не может улучшить ответ от нарушения порядка дороги в ускорение тела на частоте tire-hop, и от к отклонению подвески на частоте пространства гремучих волн. Более того, из-за отношений и тот факт, что положение колеса примерно следуют при низкой частоте (менее 5 рад/с) происходит неотъемлемый компромисс между комфортом пассажиров и отклонением подвески: любое уменьшение хода кузова на низкой частоте приведет к увеличению отклонения подвески.
Гидравлический привод, используемый для активного управления подвеской, соединяется между массой корпуса и масса колесного узла . Номинальная динамика привода представлена передаточной функцией первого порядка с максимальным водоизмещением 0,05 м.
ActNom = tf(1,[1/60 1]);
Эта номинальная модель только аппроксимирует динамику физического привода. Мы можем использовать семейство моделей привода, чтобы учесть ошибки моделирования и изменчивость в моделях привода и квартала автомобиля. Это семейство состоит из номинальной модели с частотно-зависимым количеством неопределенности. На низкой частоте, ниже 3 рад/с, модель может варьироваться до 40% от своего номинального значения. Около 3 рад/с, процентное изменение начинает увеличиваться. Неопределенность пересекает 100% при 15 рад/с и достигает 2000% при приблизительно 1000 рад/с. Функция взвешивания используется для моделирования величины неопределенности с частотой.
Wunc = makeweight(0.40,15,3); unc = ultidyn('unc',[1 1],'SampleStateDim',5); Act = ActNom*(1 + Wunc*unc); Act.InputName = 'u'; Act.OutputName = 'fs';
Результат Act
- модель привода с неопределенным пространством состояний. Постройте график характеристики Бода 20 выборочных значений Act
и сравните с номинальным значением.
rng('default') bode(Act,'b',Act.NominalValue,'r+',logspace(-1,3,120))
Основные цели управления сформулированы с точки зрения комфорта пассажиров и обработки дорог, которые относятся к ускорению кузова и перемещение подвески . Другие факторы, которые влияют на систему управления, включают характеристики нарушения порядка дороги, качество измерений датчика для обратной связи и пределы доступной силы управления. Использовать алгоритмы синтеза, мы должны выразить эти цели как одну функцию затрат, которая должна быть минимизирована. Это может быть сделано, как показано фигура.
Фигура 2: Рецептура подавления помех.
Контроллер обратной связи использует измерения хода подвески и ускорение тела для вычисления управляющего сигнала привода гидропривода. Существует три внешних источника нарушения порядка:
Дорожное нарушение порядка , смоделированный как нормированный сигнал формируется функцией взвешивания . Чтобы смоделировать отклонения широкополосной дороги амплитудой семь сантиметров, мы используем постоянный вес
Шум датчика на обоих измерениях, смоделированный как нормализованные сигналы и формируется функциями взвешивания и . Мы используем и для моделирования шума широкополосного датчика интенсивностью 0,01 и 0,5 соответственно. В более реалистичном проекте эти веса были бы зависящими от частоты для моделирования шумового спектра датчиков смещения и ускорения.
Цели управления могут быть переосмыслены как цель подавления помех: Минимизируйте влияние нарушений порядка на взвешенной комбинации усилий по управлению , перемещение подвески , и ускорение тела . При использовании norm (пиковое усиление) для измерения « влияния», это эквивалентно разработке контроллера, который минимизирует норма от входов нарушения порядка к сигналам ошибки .
Создайте функции взвешивания на фигуре 2 и пометьте их каналы ввода-вывода, чтобы облегчить соединение. Используйте фильтр верхних частот для штрафовать высокочастотное содержимое управляющего сигнала и, таким образом, ограничивать пропускную способность управляющего сигнала.
Wroad = ss(0.07); Wroad.u = 'd1'; Wroad.y = 'r'; Wact = 0.8*tf([1 50],[1 500]); Wact.u = 'u'; Wact.y = 'e1'; Wd2 = ss(0.01); Wd2.u = 'd2'; Wd2.y = 'Wd2'; Wd3 = ss(0.5); Wd3.u = 'd3'; Wd3.y = 'Wd3';
Задайте цели с обратной связью для усиления от нарушения порядка дороги к отклонению подвески (обработка) и ускорение тела (комфорт). Из-за неопределенности привода и мнимых нулей осей, только стремиться ослабить нарушения порядка ниже 10 рад/с.
HandlingTarget = 0.04 * tf([1/8 1],[1/80 1]); ComfortTarget = 0.4 * tf([1/0.45 1],[1/150 1]); Targets = [HandlingTarget ; ComfortTarget]; bodemag(qcar({'sd','ab'},'r')*Wroad,'b',Targets,'r--',{1,1000}), grid title('Response to road disturbance') legend('Open-loop','Closed-loop target')
Соответствующие веса эффективность являются взаимностью этих целей комфорта и обработки. Чтобы исследовать компромисс между комфортом пассажиров и обработкой дорог, создайте три набора весов соответствующий трем различным компромиссам: комфорт (), сбалансированный (), и обработка ().
% Three design points beta = reshape([0.01 0.5 0.99],[1 1 3]); Wsd = beta / HandlingTarget; Wsd.u = 'sd'; Wsd.y = 'e3'; Wab = (1-beta) / ComfortTarget; Wab.u = 'ab'; Wab.y = 'e2';
Наконец, используйте connect
для создания модели qcaric
на блок схеме Фигуры 2. Обратите внимание, что qcaric
массив из трех моделей, по одной для каждого проекта . Кроме того, qcaric
является неопределенной моделью, поскольку она содержит неопределенную модель привода Act
.
sdmeas = sumblk('y1 = sd+Wd2'); abmeas = sumblk('y2 = ab+Wd3'); ICinputs = {'d1';'d2';'d3';'u'}; ICoutputs = {'e1';'e2';'e3';'y1';'y2'}; qcaric = connect(qcar(2:3,:),Act,Wroad,Wact,Wab,Wsd,Wd2,Wd3,... sdmeas,abmeas,ICinputs,ICoutputs)
qcaric = 3x1 array of uncertain continuous-time state-space models. Each model has 5 outputs, 4 inputs, 9 states, and the following uncertain blocks: unc: Uncertain 1x1 LTI, peak gain = 1, 1 occurrences Type "qcaric.NominalValue" to see the nominal value, "get(qcaric)" to see all properties, and "qcaric.Uncertainty" to interact with the uncertain elements.
Использование hinfsyn
для вычисления контроллер для каждого значения коэффициента смешения .
ncont = 1; % one control signal, u nmeas = 2; % two measurement signals, sd and ab K = ss(zeros(ncont,nmeas,3)); gamma = zeros(3,1); for i=1:3 [K(:,:,i),~,gamma(i)] = hinfsyn(qcaric(:,:,i),nmeas,ncont); end gamma
gamma = 3×1
0.9405
0.6727
0.8892
Три контроллера достигают системы с обратной связью нормы 0,94, 0,67 и 0,89 соответственно. Создайте соответствующие модели с обратной связью и сравните усиления от нарушения порядка дороги с для пассивных и активных суспензий. Обратите внимание, что все три контроллера уменьшают отклонение подвески и ускорение тела ниже частоты пространства трения (23 рад/с).
% Closed-loop models K.u = {'sd','ab'}; K.y = 'u'; CL = connect(qcar,Act.Nominal,K,'r',{'xb';'sd';'ab'}); bodemag(qcar(:,'r'),'b', CL(:,:,1),'r-.', ... CL(:,:,2),'m-.', CL(:,:,3),'k-.',{1,140}), grid legend('Open-loop','Comfort','Balanced','Handling','location','SouthEast') title('Body travel, suspension deflection, and body acceleration due to road')
Чтобы дополнительно оценить три проекта, выполните симуляции во временной области с использованием сигнала нарушения порядка дороги представляет собой дорожный отбойник высотой 5 см.
% Road disturbance t = 0:0.0025:1; roaddist = zeros(size(t)); roaddist(1:101) = 0.025*(1-cos(8*pi*t(1:101))); % Closed-loop model SIMK = connect(qcar,Act.Nominal,K,'r',{'xb';'sd';'ab';'fs'}); % Simulate p1 = lsim(qcar(:,1),roaddist,t); y1 = lsim(SIMK(1:4,1,1),roaddist,t); y2 = lsim(SIMK(1:4,1,2),roaddist,t); y3 = lsim(SIMK(1:4,1,3),roaddist,t); % Plot results subplot(211) plot(t,p1(:,1),'b',t,y1(:,1),'r.',t,y2(:,1),'m.',t,y3(:,1),'k.',t,roaddist,'g') title('Body travel'), ylabel('x_b (m)') subplot(212) plot(t,p1(:,3),'b',t,y1(:,3),'r.',t,y2(:,3),'m.',t,y3(:,3),'k.',t,roaddist,'g') title('Body acceleration'), ylabel('a_b (m/s^2)')
subplot(211) plot(t,p1(:,2),'b',t,y1(:,2),'r.',t,y2(:,2),'m.',t,y3(:,2),'k.',t,roaddist,'g') title('Suspension deflection'), xlabel('Time (s)'), ylabel('s_d (m)') subplot(212) plot(t,zeros(size(t)),'b',t,y1(:,4),'r.',t,y2(:,4),'m.',t,y3(:,4),'k.',t,roaddist,'g') title('Control force'), xlabel('Time (s)'), ylabel('f_s (kN)') legend('Open-loop','Comfort','Balanced','Handling','Road Disturbance','location','SouthEast')
Обратите внимание, что ускорение тела является наименьшим для контроллера, подчеркивая комфорт пассажира и самым большим для контроллера, подчеркивая отклонение подвески. «Сбалансированный » проект достигает хорошего компромисса между ускорением тела и отклонением подвески.
До сих пор вы проектировали контроллеры, которые отвечают целям эффективности для номинальной модели привода. Как обсуждалось ранее, эта модель является только приближением истинного привода, и необходимо убедиться, что эффективность контроллера поддерживается перед лицом ошибок модели и неопределенности. Это называется устойчивой эффективностью.
Следующее использование -синтез для разработки контроллера, который достигает устойчивой эффективности для всего семейства моделей привода. Устойчивый контроллер синтезируется с помощью функции musyn с помощью неопределенной модели qcaric(:,:,2)
соответствующий «сбалансированной» эффективности ().
[Krob,rpMU] = musyn(qcaric(:,:,2),nmeas,ncont);
D-K ITERATION SUMMARY: ----------------------------------------------------------------- Robust performance Fit order ----------------------------------------------------------------- Iter K Step Peak MU D Fit D 1 1.193 1.125 1.139 4 2 1.091 1.025 1.033 4 3 0.9991 0.946 0.9559 4 4 0.9358 0.932 0.9348 4 5 0.9096 0.9057 0.9114 8 6 0.9103 0.907 0.9096 8 7 0.9091 0.9066 0.9094 6 Best achieved robust performance: 0.906
Симулируйте номинальный ответ на дорожный отбойник с устойчивым контроллером Krob
. Ответы аналогичны тем, что получены с «сбалансированным» контроллер.
% Closed-loop model (nominal) Krob.u = {'sd','ab'}; Krob.y = 'u'; SIMKrob = connect(qcar,Act.Nominal,Krob,'r',{'xb';'sd';'ab';'fs'}); % Simulate p1 = lsim(qcar(:,1),roaddist,t); y1 = lsim(SIMKrob(1:4,1),roaddist,t); % Plot results clf, subplot(221) plot(t,p1(:,1),'b',t,y1(:,1),'r',t,roaddist,'g') title('Body travel'), ylabel('x_b (m)') subplot(222) plot(t,p1(:,3),'b',t,y1(:,3),'r') title('Body acceleration'), ylabel('a_b (m/s^2)') subplot(223) plot(t,p1(:,2),'b',t,y1(:,2),'r') title('Suspension deflection'), xlabel('Time (s)'), ylabel('s_d (m)') subplot(224) plot(t,zeros(size(t)),'b',t,y1(:,4),'r') title('Control force'), xlabel('Time (s)'), ylabel('f_s (kN)') legend('Open-loop','Robust design','location','SouthEast')
Затем моделируйте реакцию на дорожный отбойник для 100 моделей привода, случайным образом выбранных из набора неопределенных моделей Act
.
rng('default'), nsamp = 100; clf % Uncertain closed-loop model with balanced H-infinity controller CLU = connect(qcar,Act,K(:,:,2),'r',{'xb','sd','ab'}); lsim(usample(CLU,nsamp),'b',CLU.Nominal,'r',roaddist,t) title('Nominal "balanced" design') legend('Perturbed','Nominal','location','SouthEast')
% Uncertain closed-loop model with balanced robust controller CLU = connect(qcar,Act,Krob,'r',{'xb','sd','ab'}); lsim(usample(CLU,nsamp),'b',CLU.Nominal,'r',roaddist,t) title('Robust "balanced" design') legend('Perturbed','Nominal','location','SouthEast')
Надежный контроллер Krob
уменьшает изменчивость из-за неопределенности модели и обеспечивает более последовательную эффективность.
Надежный контроллер Krob
имеет относительно высокий порядок по сравнению с объектом. Можно использовать функции снижения сложности модели, чтобы найти контроллер более низкого порядка, который достигает того же уровня устойчивой эффективности. Использование reduce
для генерации приближений различных порядков.
% Create array of reduced-order controllers
NS = order(Krob);
StateOrders = 1:NS;
Kred = reduce(Krob,StateOrders);
Следующее использование robgain
вычисление надежного запаса эффективности для каждого приближения пониженного порядка. Цели эффективности достигаются, когда коэффициент усиления в системе с обратной связью меньше, чем . Устойчивый запас эффективности измеряет, насколько неопределенность может быть сохранена без ухудшения эффективности (превышения ). Запас в 1 или более указывает, что мы можем поддерживать 100% указанной неопределенности.
% Compute robust performance margin for each reduced controller gamma = 1; CLP = lft(qcaric(:,:,2),Kred); for k=1:NS PM(k) = robgain(CLP(:,:,k),gamma); end % Compare robust performance of reduced- and full-order controllers PMfull = PM(end).LowerBound; plot(StateOrders,[PM.LowerBound],'b-o',... StateOrders,repmat(PMfull,[1 NS]),'r'); grid title('Robust performance margin as a function of controller order') legend('Reduced order','Full order','location','SouthEast')
Можно использовать наименьший порядок контроллера, для которого устойчивая эффективность выше 1.
Также можно использовать musyn
для непосредственной настройки контроллеров низкого порядка. Это часто более эффективно, чем a-апостериорное сокращение контроллера полного порядка Krob
. Например, настройте контроллер третьего порядка, чтобы оптимизировать его устойчивую эффективность.
% Create tunable 3rd-order controller K = tunableSS('K',3,ncont,nmeas); % Tune robust performance of closed-loop system CL CL0 = lft(qcaric(:,:,2),K); [CL,RP] = musyn(CL0);
D-K ITERATION SUMMARY: ----------------------------------------------------------------- Robust performance Fit order ----------------------------------------------------------------- Iter K Step Peak MU D Fit D 1 1.189 1.104 1.12 10 2 1.076 1.062 1.073 10 3 0.9899 0.9762 0.9913 10 4 0.9229 0.9228 0.9341 10 5 0.9197 0.9156 0.925 10 6 0.92 0.9157 0.9226 10 Best achieved robust performance: 0.916
Настроенный контроллер имеет эффективность RP=0.92
, очень близко к тому, что у Krob
. Его ответ Bode можно увидеть используя
K3 = getBlockValue(CL,'K');
bode(K3)