Выполните средства управления и статический анализ устойчивости с линеаризовавшим самолетом с неподвижным крылом

В этом примере показано, как преобразовать самолет с неподвижным крылом в модель в пространстве состояний линейного независимого от времени (LTI) для линейного анализа.

Этот пример описывает:

  • Импорт и заполнение данных из файла DATCOM.

  • Построение самолета с неподвижным крылом из данных DATCOM.

  • Вычисление статической устойчивости самолета с неподвижным крылом.

  • Линеаризация самолета с неподвижным крылом вокруг начального состояния.

  • Проверка статического анализа устойчивости с динамическим ответом.

  • Изоляция передаточной функции лифта к тангажу и разработка контроллера обратной связи для лифта.

Определение самолета с неподвижным крылом и состояния

Этот пример использует файл DATCOM, созданный для Неба самолет Хогга.

Во-первых, импортируйте выходной файл DATCOM с помощью datcomimport.

allData = datcomimport('astSkyHoggDatcom.out', false, 0);
skyHoggData = allData{1}
skyHoggData = struct with fields:
          case: 'SKYHOGG BODY-WING-HORIZONTAL TAIL-VERTICAL TAIL CONFIG'
          mach: [0.1000 0.2000 0.3000 0.3500]
           alt: [1000 3000 5000 7000 9000 11000 13000 15000]
         alpha: [-16 -12 -8 -4 -2 0 2 4 8 12]
         nmach: 4
          nalt: 8
        nalpha: 10
         rnnub: []
        hypers: 0
          loop: 2
          sref: 225.8000
          cbar: 5.7500
         blref: 41.1500
           dim: 'ft'
         deriv: 'deg'
        stmach: 0.6000
        tsmach: 1.4000
          save: 0
         stype: []
          trim: 0
          damp: 1
         build: 1
          part: 0
       highsym: 1
       highasy: 0
       highcon: 0
          tjet: 0
        hypeff: 0
            lb: 0
           pwr: 0
          grnd: 0
         wsspn: 18.7000
         hsspn: 5.7000
        ndelta: 5
         delta: [-20 -10 0 10 20]
        deltal: []
        deltar: []
           ngh: 0
        grndht: []
        config: [1x1 struct]
       version: 1976
            cd: [10x4x8 double]
            cl: [10x4x8 double]
            cm: [10x4x8 double]
            cn: [10x4x8 double]
            ca: [10x4x8 double]
           xcp: [10x4x8 double]
           cma: [10x4x8 double]
           cyb: [10x4x8 double]
           cnb: [10x4x8 double]
           clb: [10x4x8 double]
           cla: [10x4x8 double]
         qqinf: [10x4x8 double]
           eps: [10x4x8 double]
      depsdalp: [10x4x8 double]
           clq: [10x4x8 double]
           cmq: [10x4x8 double]
          clad: [10x4x8 double]
          cmad: [10x4x8 double]
           clp: [10x4x8 double]
           cyp: [10x4x8 double]
           cnp: [10x4x8 double]
           cnr: [10x4x8 double]
           clr: [10x4x8 double]
       dcl_sym: [5x4x8 double]
       dcm_sym: [5x4x8 double]
    dclmax_sym: [5x4x8 double]
    dcdmin_sym: [5x4x8 double]
      clad_sym: [5x4x8 double]
       cha_sym: [5x4x8 double]
       chd_sym: [5x4x8 double]
      dcdi_sym: [10x5x4x8 double]

Затем подготовьте интерполяционные таблицы DATCOM.

Интерполяционные таблицы DATCOM могут иметь отсутствующие значения из-за таблиц, только заполняющих одно значение для целого столбца.

Эти недостающие данные представлены в интерполяционных таблицах как значение 99999 и могут быть заполнены с помощью "предыдущего" метода fillmissing.

В этом примере, Cyβ, Cnβ, CLq, и Cmq имейте недостающие данные.

skyHoggData.cyb = fillmissing(skyHoggData.cyb, "previous", "MissingLocations", skyHoggData.cyb == 99999);
skyHoggData.cnb = fillmissing(skyHoggData.cnb, "previous", "MissingLocations", skyHoggData.cnb == 99999);
skyHoggData.clq = fillmissing(skyHoggData.clq, "previous", "MissingLocations", skyHoggData.clq == 99999);
skyHoggData.cmq = fillmissing(skyHoggData.cmq, "previous", "MissingLocations", skyHoggData.cmq == 99999);

С недостающими заполненными данными может быть создан самолет с неподвижным крылом.

Во-первых, самолет с неподвижным крылом подготовлен с желаемым именем самолета.

Опционально, имя самолета может быть извлечено из поля "случая" на struct DATCOM путем передачи пустого объекта фиксированного крыла.

skyHogg = Aero.FixedWing();
skyHogg.Properties.Name = "Sky_Hogg";
skyHogg.DegreesOfFreedom = "3DOF";
[skyHogg, cruiseState] = datcomToFixedWing(skyHogg, skyHoggData);

datcomToFixedWing преобразует все совместимые данные из datcom struct в объект фиксированного крыла и его состояние. Однако возвращенному состоянию все еще нужна обработка, чтобы получить желаемые начальные условия самолета.

В этом примере, среде, массе, инерции, скорости полета и центре корректировки потребности давления.

h = 2000;
cruiseState.AltitudeMSL = h;
cruiseState.Environment = aircraftEnvironment(skyHogg,"ISA",h);

cruiseState.U = 169.42;
cruiseState.Mass = 1299.214;
cruiseState.Inertia.Variables = [5787.969 0 117.64;0 6928.93 0;-117.64 0 11578.329];
cruiseState.CenterOfPressure = [0.183, 0, 0];

Вычисление статической устойчивости

Выполнение статического анализа устойчивости помогает определить динамическую устойчивость системы, не вычисляя ответ динамической системы.

stability = staticStability(skyHogg, cruiseState)
stability=6×8 table
             U            V           W         Alpha        Beta           P           Q            R    
          ________    _________    ________    ________    _________    _________    ________    _________

    FX    "Stable"    ""           ""          ""          ""           ""           ""          ""       
    FY    ""          "Neutral"    ""          ""          ""           ""           ""          ""       
    FZ    ""          ""           "Stable"    ""          ""           ""           ""          ""       
    L     ""          ""           ""          ""          "Neutral"    "Neutral"    ""          ""       
    M     "Stable"    ""           ""          "Stable"    ""           ""           "Stable"    ""       
    N     ""          ""           ""          ""          "Neutral"    ""           ""          "Neutral"

Со статически устойчивыми силами и моменты, с возмущениями, чтобы передать и вертикальные скорости и возмущения к углу нападения, динамическая устойчивость системы стремится к колебанию, установившемуся при беспокойстве прямых и вертикальных скоростей.

Чтобы проверить это поведение, используйте Control System Toolbox™.

Линеаризация самолета с неподвижным крылом

Чтобы использовать инструменты в Control System Toolbox™, линеаризуйте самолет вокруг состояния.

Это сделано при помощи линеаризовать метода с тем же состоянием круиза как прежде.

linSys = linearize(skyHogg, cruiseState)
linSys =
 
  A = 
                  XN          XD           U           W           Q
   XN              0           0           1           0           0
   XD              0           0           0           1           0
   U               0   1.319e-06   -0.001714  -0.0007608           0
   W               0           0   -0.002705     -0.3319       2.557
   Q               0           0     0.03443       -1.19      -24.84
   Theta           0           0           0           0           1
 
               Theta
   XN     -2.586e-07
   XD         -2.957
   U         -0.5617
   W      -4.867e-08
   Q               0
   Theta           0
 
  B = 
               Delta
   XN              0
   XD              0
   U      -0.0004314
   W        -0.02084
   Q          -2.239
   Theta           0
 
  C = 
             XN     XD      U      W      Q  Theta
   XN         1      0      0      0      0      0
   XD         0      1      0      0      0      0
   U          0      0      1      0      0      0
   W          0      0      0      1      0      0
   Q          0      0      0      0      1      0
   Theta      0      0      0      0      0      1
 
  D = 
          Delta
   XN         0
   XD         0
   U          0
   W          0
   Q          0
   Theta      0
 
Continuous-time state-space model.

Проверка статической устойчивости с динамическим ответом

С линейной созданной моделью в пространстве состояний можно построить динамическое поведение системы.

Чтобы проверить статические результаты устойчивости с динамическим поведением системы, постройте модель пробела состояний против начальных условий.

Чтобы вызвать возмущение в системе, 5 шагов степени в течение 1 секунды добавляются к сигналу лифта.

x0 = getState(cruiseState, linSys.OutputName);
t = linspace(0, 50, 500);
u = zeros(size(t));
u(t > 1 & t < 2) = 5;
lsim(linSys,u,t,x0)

Figure contains 6 axes objects. Axes object 1 contains 2 objects of type line. These objects represent Driving inputs, linSys. Axes object 2 contains 2 objects of type line. These objects represent Driving inputs, linSys. Axes object 3 contains 2 objects of type line. These objects represent Driving inputs, linSys. Axes object 4 contains 2 objects of type line. These objects represent Driving inputs, linSys. Axes object 5 contains 2 objects of type line. These objects represent Driving inputs, linSys. Axes object 6 contains 2 objects of type line. These objects represent Driving inputs, linSys.

Как ожидалось от статического анализа устойчивости, скорости полета и уровня тангажа устойчиво при ответе на небольшое возмущение в лифте.

Изоляция ответа блиц-резюме

В дополнение к статической верификации устойчивости, изолируя поверхности управления к их намеченному динамическому ответу может помочь спроектировать контроллеры, характерные для отдельных поверхностей.

В этом случае существует только одна поверхность управления, лифт.

Лифт управляет ответом тангажа самолета. Чтобы показать ответ тангажа, изолируйте вход лифта к углу тангажа к передаточной функции лифта.

linSysElevatorTF = tf(linSys(6,1))
linSysElevatorTF =
 
  From input "Delta" to output "Theta":
          -2.239 s^3 - 0.7221 s^2 - 0.001232 s - 8.935e-09
  -----------------------------------------------------------------
  s^5 + 25.17 s^4 + 11.33 s^3 + 0.0387 s^2 + 0.008227 s + 5.712e-08
 
Continuous-time transfer function.
step(linSysElevatorTF)

Figure contains an axes object. The axes object with title From: Delta To: Theta contains an object of type line. This object represents linSysElevatorTF.

Как видно графиком шага, ответ тангажа на вход лифта имеет нежелательную колебательную природу и большую установившуюся ошибку.

Путем добавления контроллера обратной связи ПИДа во вход лифта может быть достигнут намного более желательный ответ тангажа.

C = pidtune(linSysElevatorTF, "PID")
C =
 
        1 
  Ki * ---
        s 

  with Ki = -0.000596
 
Continuous-time I-only controller.
elevatorFeedback = feedback(linSysElevatorTF * C, 1)
elevatorFeedback =
 
  From input to output "Theta":
                                                                 
           0.001335 s^3 + 0.0004304 s^2 + 7.346e-07 s + 5.327e-12
                                                                 
  ------------------------------------------------------------------------
                                                                          
  s^6 + 25.17 s^5 + 11.33 s^4 + 0.04004 s^3 + 0.008657 s^2 + 7.917e-07 s  
                                                                          
                                                               + 5.327e-12
                                                                          
 
Continuous-time transfer function.
step(elevatorFeedback)

Figure contains an axes object. The axes object with title From: In(1) To: Theta contains an object of type line. This object represents elevatorFeedback.

Похожие темы