Этот пример показывает, как использовать Robust Control Toolbox™, чтобы разработать устойчивый контроллер для активной системы подвески.
Обычные пассивные приостановки используют пружину и демпфер между блоком кузова автомобиля и колеса. Характеристики пружинного демпфера выбраны, чтобы подчеркнуть одну из нескольких конфликтных целей, таких как пассажирский комфорт, дорожная обработка и отклонение приостановки. Активные приостановки позволяют разработчику балансировать эти цели с помощью контроллера обратной связи гидравлический привод между блоком шасси и колеса.
Этот пример использует модель четверти автомобиля активной системы подвески (см. рисунок 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 рад/с. Это называется rattlespace частотой.
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)'])
Из-за нулей мнимой оси управление с обратной связью не может улучшить ответ от дорожного воздействия к ускорению тела на частоте транзитного участка шины, и от к отклонению приостановки на rattlespace частоте. Кроме того, из-за отношения и то, что положение колеса примерно следует в низкой частоте (меньше чем 5 рад/с) существует свойственный компромисс между пассажирским комфортом и отклонением приостановки: любое сокращение перемещения тела в низкой частоте приведет к увеличению отклонения приостановки.
Гидравлический привод, используемый для активного управления приостановкой, соединяется между массой тела и масса блока колеса . Номинальные движущие силы привода представлены передаточной функцией первого порядка смещение имеющее 0,05 м.
ActNom = tf(1,[1/60 1]);
Эта номинальная модель только аппроксимирует физическую динамику привода. Мы можем использовать семейство моделей привода, чтобы составлять моделирование ошибок и изменчивости в моделях четвертей автомобиля и приводе. Это семейство состоит из номинальной модели с зависимой частотой суммой неуверенности. В низкой частоте, ниже 3 рад/с, модель может отличаться до 40% от своей номинальной стоимости. Приблизительно 3 рад/с, изменение процента начинает увеличиваться. Неуверенность пересекает 100% на уровне 15 рад/с и достигает 2 000% на уровне приблизительно 1 000 рад/с. Функция взвешивания используется, чтобы модулировать сумму неуверенности с частотой.
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.
Рисунок 2: формулировка Подавления помех.
Диспетчер обратной связи использует измерения из перемещения приостановки и ускорение тела вычислить управляющий сигнал управление гидравлическим приводом. Существует три внешних источника воздействия:
Дорожное воздействие , смоделированный как нормированный сигнал сформированный функцией взвешивания . К образцовым широкополосным дорожным отклонениям значения семь сантиметров мы используем постоянный вес
Шум датчика на обоих измерениях, смоделированных как нормированные сигналы и сформированный функциями взвешивания и . Мы используем и к образцовому широкополосному шуму датчика интенсивности 0.01 и 0.5, соответственно. В более реалистическом проекте эти веса были бы зависимым частоты, чтобы смоделировать шумовой спектр ускоряющих датчиков и смещения.
Целям управления можно дать иное толкование как цель подавления помех: Минимизируйте влияние воздействий на взвешенной комбинации усилия по управлению , перемещение приостановки , и ускорение тела . При использовании норма (пиковое усиление), чтобы измерить "влияние", это составляет разработку контроллера, который минимизирует норма от входных параметров воздействия к сигналам ошибки .
Создайте функции взвешивания рисунка 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, соответственно. Создайте соответствующие модели с обратной связью и сравните усиления от дорожного воздействия до для пассивных и активных приостановок. Заметьте, что все три контроллера уменьшают отклонение приостановки и ускорение тела ниже rattlespace частоты (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')
Заметьте, что ускорение тела является самым маленьким для контроллера, подчеркивающего пассажирский комфорт и самое большое для контроллера, подчеркивающего отклонение приостановки. "Сбалансированный" проект достигает хорошего компромисса между ускорением тела и отклонением приостановки.
До сих пор вы разработали контроллеры, которые достигают целей производительности для номинальной модели привода. Как обсуждено ранее, эта модель является только приближением истинного привода, и необходимо убедиться, что производительность контроллера сохраняется перед лицом образцовых ошибок и неуверенности. Это называется устойчивой производительностью.
Затем используйте - синтез, чтобы разработать контроллер, который достигает устойчивой производительности для целого семейства моделей привода. Устойчивый контроллер синтезируется с функцией dksyn
использование неопределенной модели qcaric(:,:,2)
, соответствующей "сбалансированной" производительности ().
[Krob,~,rpMU] = dksyn(qcaric(:,:,2),nmeas,ncont); rpMU
rpMU = 0.9081
Моделируйте номинальный ответ на дорожный удар с устойчивым контроллером 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
есть одиннадцать состояний. Часто имеет место, что у контроллеров, синтезируемых с dksyn
, есть старший разряд. Можно использовать функции снижения сложности модели, чтобы найти контроллер более низкоуровневый, который достигает того же уровня устойчивой производительности. Используйте 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'); title('Robust performance margin as a function of controller order') legend('Reduced order','Full order','location','SouthEast')
Устойчивое поле производительности значительно ниже 1 для контроллеров порядка 7 и ниже. Однако нет никакой значительной разницы в поле производительности между 8-ми контроллерами и контроллерами 11-го порядка, таким образом, можно безопасно заменить Krob
его приближением 8-го порядка.
Krob8 = Kred(:,:,8);