Обрезка корпуса и линеаризует с Control System Toolbox™

Этот пример показывает, как обрезать и линеаризовать корпус в среде Simulink® с помощью программного обеспечения Control System Toolbox™

Разработка автопилота с классическими методами проектирования требует линейных моделей динамики подачи корпуса для нескольких обрезанных условий рейса. MATLAB® техническая вычислительная среда может определить условия для обрезки и вывести линейные модели в пространстве состояний непосредственно из нелинейной модели Simulink и Aerospace Blockset™. Этот шаг экономит время и помогает подтвердить модель. Функции Control System Toolbox позволяют вам визуализировать движение корпуса с точки зрения частоты разомкнутого цикла или ответов времени.

Инициализируйте модель руководства

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

open_system('aeroblk_guidance_airframe');

Задайте значения состояния

h_ini     = 10000/m2ft;      % Trim Height [m]
M_ini     = 3;               % Trim Mach Number
alpha_ini = -10*d2r;         % Trim Incidence [rad]
theta_ini = 0*d2r;           % Trim Flightpath Angle [rad]
v_ini = M_ini*(340+(295-340)*h_ini/11000); 	% Total Velocity [m/s]

q_ini = 0;               % Initial pitch Body Rate [rad/sec]

Найдите имена и упорядоченное расположение состояний из модели Simulink®

[sizes,x0,names]=aeroblk_guidance_airframe([],[],[],'sizes');

state_names = cell(1,numel(names));
for i = 1:numel(names)
  n = max(strfind(names{i},'/'));
  state_names{i}=names{i}(n+1:end);
end

Задайте, какие состояния обрезать и какие состояния остаются фиксированными

fixed_states            = [{'U,w'} {'Theta'} {'Position'}];
fixed_derivatives       = [{'U,w'} {'q'}];        % w and q
fixed_outputs           = [];                     % Velocity
fixed_inputs            = [];

n_states=[];n_deriv=[];
for i = 1:length(fixed_states)
  n_states=[n_states find(strcmp(fixed_states{i},state_names))]; %#ok<AGROW>
end
for i = 1:length(fixed_derivatives)
  n_deriv=[n_deriv find(strcmp(fixed_derivatives{i},state_names))]; %#ok<AGROW>
end
n_deriv=n_deriv(2:end);                          % Ignore U

Модель для обрезки

[X_trim,U_trim,Y_trim,DX]=trim('aeroblk_guidance_airframe',x0,0,[0 0 v_ini]', ...
                               n_states,fixed_inputs,fixed_outputs, ...
                               [],n_deriv)  %#ok<NOPTS>
X_trim =

   1.0e+03 *

   -0.0002
         0
    0.9677
   -0.1706
         0
   -3.0480


U_trim =

    0.1362


Y_trim =

   -0.2160
         0


DX =

         0
   -0.2160
  -14.0977
         0
  967.6649
 -170.6254

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

[A,B,C,D]=linmod('aeroblk_guidance_airframe',X_trim,U_trim);
if exist('control','dir')
  airframe = ss(A(n_deriv,n_deriv),B(n_deriv,:),C([2 1],n_deriv),D([2 1],:));
  set(airframe,'StateName',state_names(n_deriv), ...
               'InputName',{'Elevator'}, ...
               'OutputName',[{'az'} {'q'}]);

  zpk(airframe)
  ltiview('bode',airframe)
end
ans =
 
  From input "Elevator" to output...
          -170.45 s (s+1133)
   az:  ----------------------
        (s^2 + 30.04s + 288.9)
 
         -194.66 (s+1.475)
   q:  ----------------------
       (s^2 + 30.04s + 288.9)
 
Continuous-time zero/pole/gain model.