В этом примере показано, как использовать Toolbox™ надежного управления для проектирования надежного контроллера для активной системы подвески. В примере описана модель подвески на четверть вагона. Затем он вычисляет контроллер H∞ для номинальной системы, используя hinfsyn команда. И, наконец, в примере показано, как использовать λ-синтез для создания надежного контроллера для полной неопределенной системы.
Обычные пассивные подвески используют пружину и демпфер между кузовом автомобиля и колесным узлом. Характеристики амортизатора пружины выбраны таким образом, чтобы подчеркнуть одну из нескольких противоречивых целей, таких как комфорт пассажира, управление дорогой и отклонение подвески. Активные подвески позволяют конструктору сбалансировать эти цели с помощью гидравлического привода контроллера обратной связи между шасси и колесным узлом.
В этом примере используется четвертьвагонная модель активной системы подвески (см. рис. 1). Масса (в килограммах) представляет шасси (кузов) автомобиля, а масса (в килограммах) представляет колесную сборку. Пружина и демпфер представляют собой пассивную пружину и амортизатор, размещенные между кузовом автомобиля и колесным узлом. Пружина моделирует сжимаемость пневматической шины. Переменными , и (все в метрах) являются соответственно движение кузова, движение колеса и нарушение дорожного движения. Усилие (в килоНьютонах), приложенное между кузовом и колесным узлом, регулируется обратной связью и представляет собой активный компонент системы подвески.

Рисунок 1: Четвертьвагонная модель активной подвески.
При обозначении xb,xb˙,xw,x˙w) линеаризованные уравнения состояния-пространства для четвертьвагонной модели:
kt (x3-r) -103fs].
Построение модели пространства состояний 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)'})
Из-за нулей мнимой оси управление с обратной связью не может улучшить реакцию от дорожного возмущения на ускорение тела на частоте перескока шины и от на отклонение подвески на частоте перегрева. Более того, из-за соотношения xb-sd и того факта, что колеса
Гидропривод, используемый для управления активной подвеской, соединен между массой mb корпуса и массой колесного узла. Номинальная динамика исполнительного механизма представлена передаточной функцией первого порядка s/60) с максимальным смещением 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))

Основные задачи управления сформулированы с точки зрения комфорта пассажиров и управления дорогой, которые относятся к ускорению кузова и движению подвески . К другим факторам, влияющим на конструкцию системы управления, относятся характеристики дорожных помех, качество измерений датчиков для обратной связи и предельные значения имеющейся силы управления. Чтобы использовать алгоритмы синтеза H∞, мы должны выразить эти цели как единую функцию затрат, которая должна быть минимизирована. Это можно сделать, как показано на фиг.2.

Рис. 2: Состав для отбраковки нарушений.
Контроллер обратной связи использует измерения y2 хода подвески sd и ускорения тела ab для вычисления управляющего сигнала u, приводящего в действие гидравлический привод. Существует три внешних источника возмущения:
Дорожное возмущение , смоделированное как нормализованный сигнал , сформированный весовой функцией . Для моделирования широкополосных прогибов дорог магнитудой семь сантиметров мы используем постоянный вес 0,07
Шум датчика в обоих измерениях, моделируемый как нормализованные сигналы и , формируемые весовыми функциями и . Мы используем 0,01 и 0,5 для моделирования шума широкополосного датчика интенсивности 0,01 и 0,5 соответственно. В более реалистичной конструкции эти веса будут зависеть от частоты при моделировании шумового спектра датчиков смещения и ускорения.
Цели контроля могут быть переосмыслены как цель отказа от нарушения: Минимизируйте влияние возмущений d3 на взвешенную комбинацию управляющих u, подвески
Создайте функции взвешивания, показанные на рис. 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')
Соответствующие рабочие веса Wab являются взаимностью этих целей комфорта и управляемости. Для изучения компромисса между комфортом пассажиров и погрузочно-разгрузочными работами построить три комплекта грузов Wab), соответствующих трем различным компромиссам: 0,01), β = 0,5) и работы (β = 0,99).
% 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 для вычисления контроллера H∞ для каждого значения коэффициента смешения .
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
Три контроллера достигают норм H∞ по замкнутому контуру 0,94, 0,67 и 0,89 соответственно. Создайте соответствующие модели с замкнутым контуром и сравните выигрыш от дорожных возмущений с ab для пассивных и активных подвесок. Обратите внимание, что все три контроллера уменьшают отклонение подвески и ускорение корпуса ниже частоты вращения (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')

Обратите внимание, что ускорение кузова является наименьшим для контроллера, подчеркивающего комфорт пассажира, и наибольшим для контроллера, подчеркивающего отклонение подвески. «Сбалансированная» конструкция обеспечивает хороший компромисс между ускорением кузова и отклонением подвески.
На данный момент разработаны контроллеры , которые соответствуют требованиям к производительности модели номинального привода. Как обсуждалось ранее, эта модель является только аппроксимацией истинного привода, и необходимо убедиться, что производительность контроллера поддерживается в условиях ошибок модели и неопределенности. Это называется надежной производительностью.
Далее используйте start-synthesis для разработки контроллера, который обеспечивает надежную производительность для всего семейства моделей приводов. Надежный контроллер синтезируется с помощью функции musyn с использованием неопределенной модели qcaric(:,:,2) соответствует «сбалансированным» характеристикам (0,5).
[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. Ответы аналогичны полученным с «сбалансированным» контроллером H∞.
% 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. Надежный запас производительности измеряет, насколько неопределенность может быть сохранена без ухудшения производительности (= 1). Разница в 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-posteriori контроллера полного порядка 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. Вы можете увидеть его ответ Боде с помощью
K3 = getBlockValue(CL,'K');
bode(K3)