Обрезка и линеаризация планера с помощью 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]

Установите спецификации к рабочей точке и состоянию

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

opspec = operspec('aeroblk_guidance_airframe');
opspec.State(1).Known = [1;1];
opspec.State(1).SteadyState = [0;0];
opspec.State(2).Known = 1;
opspec.State(2).SteadyState = 0;
opspec.State(3).Known = [1 1];
opspec.State(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:
---------------------------------

 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: 
----------
(1.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/Position
      x:             0      dx:           968
      x:     -3.05e+03      dx:          -171
(2.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/Theta
      x:             0      dx:        -0.216
(3.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/U,w
      x:           968      dx:         -14.1
      x:          -171      dx:     -7.44e-08 (0)
(4.) aeroblk_guidance_airframe/Aerodynamics & Equations of Motion/3DOF (Body Axes)/q
      x:        -0.216      dx:      3.36e-08 (0)

Inputs: 
----------
(1.) aeroblk_guidance_airframe/Fin Deflection
      u:         0.136    [-Inf Inf]

Outputs: 
----------
(1.) aeroblk_guidance_airframe/q
      y:        -0.216    [-Inf Inf]
(2.) aeroblk_guidance_airframe/az
      y:     -7.44e-08    [-Inf Inf]

Выберите обрезанные состояния, создайте объект LTI и постройте 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);