В этом примере показано, как обрезать и линеаризировать планер с помощью программного обеспечения 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]
% 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);