Обрезка корпуса и линеаризует с Simulink® Control Design™

В этом примере показано, как обрезать и линеаризовать корпус с помощью программного обеспечения Simulink® Control Design™

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

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

Первая проблема состоит в том, чтобы найти отклонение лифта и получившийся обрезанный уровень тела (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]

Установите рабочую точку и технические требования состояния

Первыми техническими требованиями состояния являются состояния Положения. Второй спецификацией состояния является Theta. Оба известны, но не в устойчивом состоянии. Третьими техническими требованиями состояния является связанная ось угловые уровни, из которых переменная w в устойчивом состоянии.

opspec = operspec('aeroblk_guidance_airframe');
opspec.States(1).Known = [1;1];
opspec.States(1).SteadyState = [0;0];
opspec.States(2).Known = 1;
opspec.States(2).SteadyState = 0;
opspec.States(3).Known = [1 1];
opspec.States(3).SteadyState = [0 1];

Ищите Рабочую точку, ввод-вывод Набора, Затем Линеаризуйте

op = findop('aeroblk_guidance_airframe',opspec);

io(1) = linio('aeroblk_guidance_airframe/Fin Deflection',1,'input');
io(2) = linio('aeroblk_guidance_airframe/Selector',1,'output');
io(3) = linio(sprintf(['aeroblk_guidance_airframe/Aerodynamics &\n', ...
                    'Equations of Motion']),3,'output');

sys = linearize('aeroblk_guidance_airframe',op,io);
 Operating point search report:
---------------------------------

opreport = 


 Operating point search report for the Model aeroblk_guidance_airframe.
 (Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States: 
----------
      <strong>Min</strong>         <strong>x</strong>          <strong>Max</strong>      <strong>dxMin</strong>        <strong>dx</strong>        <strong>dxMax</strong>
    <strong>_______</strong>    <strong>________</strong>    <strong>_______</strong>    <strong>_____</strong>    <strong>__________</strong>    <strong>_____</strong>

(1.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/Position
          0           0          0    -Inf         967.66     Inf 
      -3048       -3048      -3048    -Inf        -170.63     Inf 
(2.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/Theta
          0           0          0    -Inf       -0.21604     Inf 
(3.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/U,w
     967.66      967.66     967.66    -Inf        -14.098     Inf 
    -170.63     -170.63    -170.63       0     -7.439e-08       0 
(4.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/q
       -Inf    -0.21604        Inf       0     3.3582e-08       0 

Inputs: 
----------
    <strong>Min</strong>        <strong>u</strong>       <strong>Max</strong>
    <strong>____</strong>    <strong>_______</strong>    <strong>___</strong>

(1.) aeroblk_guidance_airframe/Fin Deflection
    -Inf    0.13615    Inf

Outputs: 
----------
    <strong>Min</strong>         <strong>y</strong>         <strong>Max</strong>
    <strong>____</strong>    <strong>__________</strong>    <strong>___</strong>

(1.) aeroblk_guidance_airframe/q
    -Inf      -0.21604    Inf
(2.) aeroblk_guidance_airframe/az
    -Inf    -7.439e-08    Inf

Выберите Trimmed States, Create LTI Object и Plot Bode Response

% find index of desired states in the state vector
names = sys.StateName;
q_idx = find(strcmp('q',names));
az_idx = find(strcmp('U,w(2)',names));

airframe = ss(sys.A([az_idx q_idx],[az_idx q_idx]),sys.B([az_idx q_idx],:),sys.C(:,[az_idx q_idx]),sys.D);

set(airframe,'inputname',{'Elevator'}, ...
             'outputname',[{'az'} {'q'}]);

ltiview('bode',airframe);