Определение нелинейной динамики и статической устойчивости самолетов

Этот пример показывает процесс создания и анализа самолета в MATLAB с помощью геометрии C182 Cessna и данных коэффициентов.

Данные, используемые для создания самолета, взяты из Airplane Flight Dynamics and Controls Яном Роскамом [1].

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

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

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

  • Определение полного самолета.

  • Определение коэффициентов на самолете.

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

  • Выполнение численного анализа.

Настройка аэродинамических и управляющих поверхностей фиксированного крыла

The Aero.FixedWing.Surface класс может служить как аэродинамической, так и управляющей поверхностью.

Этим поведением управляет Controllable свойство в классе.

Настройка Controllable на on создает управляющую поверхность и ControlState переменная.

Гнездование поверхности управления на аэродинамической поверхности имитирует фактическую конструкцию самолета.

Ниже пример создает поверхность управления лифтом и гнездит ее на горизонтальном стабилизаторе.

elevator = Aero.FixedWing.Surface()
elevator = 
  Surface with properties:

            Surfaces: [1x0 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: Inf
        MinimumValue: -Inf
        Controllable: off
            Symmetry: "Symmetric"
    ControlVariables: [0x0 string]
          Properties: [1x1 Aero.Aircraft.Properties]

elevator.MaximumValue = deg2rad(20);
elevator.MinimumValue = deg2rad(-20);
elevator.Properties = Aero.Aircraft.Properties("Name", "Elevator");
elevator.Controllable = "on";
elevator.Coefficients = Aero.FixedWing.Coefficient("StateVariables", "Elevator")
elevator = 
  Surface with properties:

            Surfaces: [1x0 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: 0.3491
        MinimumValue: -0.3491
        Controllable: on
            Symmetry: "Symmetric"
    ControlVariables: "Elevator"
          Properties: [1x1 Aero.Aircraft.Properties]

horizontalStabilizer = Aero.FixedWing.Surface()
horizontalStabilizer = 
  Surface with properties:

            Surfaces: [1x0 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: Inf
        MinimumValue: -Inf
        Controllable: off
            Symmetry: "Symmetric"
    ControlVariables: [0x0 string]
          Properties: [1x1 Aero.Aircraft.Properties]

horizontalStabilizer.Surfaces = elevator
horizontalStabilizer = 
  Surface with properties:

            Surfaces: [1x1 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: Inf
        MinimumValue: -Inf
        Controllable: off
            Symmetry: "Symmetric"
    ControlVariables: [0x0 string]
          Properties: [1x1 Aero.Aircraft.Properties]

horizontalStabilizer.Properties = Aero.Aircraft.Properties("Name", "HorizontalStabilizer")
horizontalStabilizer = 
  Surface with properties:

            Surfaces: [1x1 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: Inf
        MinimumValue: -Inf
        Controllable: off
            Symmetry: "Symmetric"
    ControlVariables: [0x0 string]
          Properties: [1x1 Aero.Aircraft.Properties]

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

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

aileron = Aero.FixedWing.Surface(...
    "MaximumValue", deg2rad(20), ...
    "MinimumValue", deg2rad(-20), ...
    "Properties"  , Aero.Aircraft.Properties(1, "Name", "Aileron"), ...
    "Controllable", "on", ...
    "Coefficients", Aero.FixedWing.Coefficient("StateVariables", "Aileron"));

rudder = Aero.FixedWing.Surface(...
    "MaximumValue", deg2rad(20), ...
    "MinimumValue", deg2rad(-20), ...
    "Properties"  , Aero.Aircraft.Properties("Name", "Rudder"), ...
    "Controllable", "on", ...
	"Coefficients", Aero.FixedWing.Coefficient("StateVariables", "Rudder"));

wing = Aero.FixedWing.Surface(...
    "Surfaces"  , aileron, ...
    "Properties", Aero.Aircraft.Properties("Name", "Wing"));

verticalStabilizer = Aero.FixedWing.Surface(...
    "Surfaces"  , rudder, ...
    "Properties", Aero.Aircraft.Properties("Name", "VerticalStabilizer"));

Определение движения

Используйте Aero.FixedWing.Thrust объект для создания двигательных моделей на моделях самолета, аналогичных поверхностям управления.

The Aero.FixedWing.Thrust объект всегда управляемый. Оно не может быть вложено как аэродинамические и управляющие поверхности.

propeller = Aero.FixedWing.Thrust(...
    "Properties"  , Aero.Aircraft.Properties("Name","Propeller"), ...
    "Coefficients", Aero.FixedWing.Coefficient("StateVariables", "Propeller"))
propeller = 
  Thrust with properties:

        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: 1
        MinimumValue: 0
        Controllable: on
            Symmetry: "Symmetric"
    ControlVariables: "Propeller"
          Properties: [1x1 Aero.Aircraft.Properties]

Построение самолета

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

Во-первых, задайте отдельное Aero.Aircraft.Properties класс для самолета. Используйте этот класс для отслеживания версий компонентов и компонентов, используемых данным самолетом.

Все Aero.FixedWing и Aero.Aircraft классы содержат это свойство.

C182Properties = Aero.Aircraft.Properties(...
    "Name"       , "Cessna C182", ...
    "Type"       , "General Aviation", ...
    "Version"    , "1.0", ...
    "Description", "Cessna 182 Example")
C182Properties = 
  Properties with properties:

           Name: "Cessna C182"
    Description: "Cessna 182 Example"
           Type: "General Aviation"
        Version: "1.0"

C182 = Aero.FixedWing(...
    "Properties"       , C182Properties, ...
    "UnitSystem"       , "English (ft/s)", ...
    "AngleSystem"      , "Radians", ...
    "TemperatureSystem", "Fahrenheit", ...
    "ReferenceArea"    , 174, ...
    "ReferenceSpan"    , 36, ...
    "ReferenceLength"  , 4.9, ...
    "Surfaces"         , [wing, horizontalStabilizer, verticalStabilizer], ...
    "Thrusts"          , propeller)
C182 = 
  FixedWing with properties:

        ReferenceArea: 174
        ReferenceSpan: 36
      ReferenceLength: 4.9000
         Coefficients: [1x1 Aero.FixedWing.Coefficient]
     DegreesOfFreedom: "6DOF"
             Surfaces: [1x3 Aero.FixedWing.Surface]
              Thrusts: [1x1 Aero.FixedWing.Thrust]
          AspectRatio: 7.4483
           UnitSystem: "English (ft/s)"
          AngleSystem: "Radians"
    TemperatureSystem: "Fahrenheit"
           Properties: [1x1 Aero.Aircraft.Properties]

Установка авиационных коэффициентов

Далее определите коэффициенты на самолете.

Эти коэффициенты описывают динамическое поведение самолета. Этот пример задает скалярные коэффициенты константы, которые определяют линейное поведение самолета.

Чтобы определить нелинейное динамическое поведение самолета, задайте Simulink.LookupTable коэффициенты. Simulink.LookupTables не используются в этом примере. Чтобы увидеть пример с использованием Simulink .LookupTables, откройте пример «Выполнить управление» и «Статический анализ устойчивости с помощью линеаризированных самолетов с неподвижным крылом».

По умолчанию все коэффициенты 0.

BodyCoefficients = {
    'CD', 'Zero', 0.027;
    'CL', 'Zero', 0.307;
    'Cm', 'Zero', 0.04;
    'CD', 'Alpha', 0.121;
    'CL', 'Alpha', 4.41;
    'Cm', 'Alpha', -0.613;
    'CD', 'AlphaDot', 0
    'CL', 'AlphaDot',  1.7;
    'Cm', 'AlphaDot', -7.27;
    'CD', 'Q', 0;
    'CL', 'Q', 3.9;
    'Cm', 'Q', -12.4;
    'CY', 'Beta', -0.393;
    'Cl', 'Beta', -0.0923;
    'Cn', 'Beta', 0.0587;
    'CY', 'P', -0.075;
    'Cl', 'P', -0.484;
    'Cn', 'P', -0.0278;
    'CY', 'R', 0.214;
    'Cl', 'R', 0.0798;
    'Cn', 'R', -0.0937;
    };
 
C182 = setCoefficient(C182, BodyCoefficients(:, 1), BodyCoefficients(:, 2), BodyCoefficients(:, 3));

Коэффициенты могут быть определены для любого компонента на самолете. Эти компоненты могут включать в себя любые Aero.FixedWing.Surface или Aero.FixedWing.Thrust.

The setCoefficient метод обеспечивает Component Name,Value аргумент, который принимает коэффициенты от желаемого имени компонента, устраняя необходимость точно знать, где компонент находится на самолете.

Допустимые имена компонентов зависят от Name свойство компонента.

AileronCoefficients = {
    'CY', 'Aileron', 0;
    'Cl', 'Aileron', 0.229;
    'Cn', 'Aileron', -0.0504;
    };
ElevatorCoefficients = {
    'CY', 'Elevator', 0.187;
    'Cl', 'Elevator', 0.0147;
    'Cn', 'Elevator', -0.0805;
    };
RudderCoefficients = {
    'CD', 'Rudder', 0;
    'CL', 'Rudder', 0.43;
    'Cm', 'Rudder', -1.369;
    };
PropellerCoefficients = {
    'CD', 'Propeller', -21.1200;
    };

C182 = setCoefficient(C182, AileronCoefficients(:, 1), AileronCoefficients(:, 2), AileronCoefficients(:, 3), "Component", "Aileron");
C182 = setCoefficient(C182, ElevatorCoefficients(:, 1), ElevatorCoefficients(:, 2), ElevatorCoefficients(:, 3), "Component", "Elevator");
C182 = setCoefficient(C182, RudderCoefficients(:, 1), RudderCoefficients(:, 2), RudderCoefficients(:, 3), "Component", "Rudder");
C182 = setCoefficient(C182, PropellerCoefficients(:, 1), PropellerCoefficients(:, 2), PropellerCoefficients(:, 3), "Component", "Propeller");

Определение текущего состояния

Самолеты полностью построены и готовы к численному анализу.

Для выполнения численного анализа на самолете задайте Aero.FixedWing.State объект.

The Aero.FixedWing.State объект определяет текущее состояние Aero.FixedWing объект в образце во время. The Aero.FixedWing.State где также заданы динамические физические свойства самолета, включая массу и инерцию.

В этом примере мы анализируем круизное состояние.

CruiseState = Aero.FixedWing.State(...
    "UnitSystem","English (ft/s)",...
    "AngleSystem","Radians", ...
    "TemperatureSystem","Fahrenheit", ...
    "Mass",82.2981, ...
    "U", 220.1, ...
    "AltitudeMSL",5000);

CruiseState.Inertia.Variables = [
    948, 0,    0   ;
    0  , 1346, 0   ;
    0  , 0   , 1967;
    ];

CruiseState.CenterOfGravity = [0.264, 0 , 0] .* C182.ReferenceLength;
CruiseState.CenterOfPressure = [0.25, 0, 0] .* C182.ReferenceLength;
CruiseState.Environment = Aero.Aircraft.Environment(...
    "Temperature", 500.839, ...
    "Density", 0.00204834, ...
    "SpeedOfSound", 1097.09, ...
    "Pressure", 84307.3, ...
    "Gravity", 32.2);

Настройка состояний управления

В дополнение к окружению и динамическим физическим свойствам Aero.FixedWing.State класс также содержит текущие отклонения поверхности управления и положения тяги. Эти должности занимают в ControlStates свойство. Используйте этот класс для настройки состояний управления.

По умолчанию это свойство пустое. Инициализируйте свойство с поверхности управления и информацию о тяге на самолете.

Чтобы настроить эти состояния управления, используйте setupControlStates метод ниже.

CruiseState = setupControlStates(CruiseState, C182)
CruiseState = 
  State with properties:

                   Alpha: 0
                    Beta: 0
                AlphaDot: 0
                 BetaDot: 0
                    Mass: 82.2981
                 Inertia: [3x3 table]
         CenterOfGravity: [1.2936 0 0]
        CenterOfPressure: [1.2250 0 0]
             AltitudeMSL: 5000
            GroundHeight: 0
                      XN: 0
                      XE: 0
                      XD: -5000
                       U: 220.1000
                       V: 0
                       W: 0
                     Phi: 0
                   Theta: 0
                     Psi: 0
                       P: 0
                       Q: 0
                       R: 0
                  Weight: 2.6500e+03
             AltitudeAGL: 5000
                Airspeed: 220.1000
             GroundSpeed: 220.1000
              MachNumber: 0.2006
            BodyVelocity: [220.1000 0 0]
          GroundVelocity: [220.1000 0 0]
                      Ur: 220.1000
                      Vr: 0
                      Wr: 0
         FlightPathAngle: 0
             CourseAngle: 0
    InertialToBodyMatrix: [3x3 double]
    BodyToInertialMatrix: [3x3 double]
        BodyToWindMatrix: [3x3 double]
        WindToBodyMatrix: [3x3 double]
         DynamicPressure: 49.6149
             Environment: [1x1 Aero.Aircraft.Environment]
              UnitSystem: "English (ft/s)"
             AngleSystem: "Radians"
       TemperatureSystem: "Fahrenheit"
           ControlStates: [1x4 Aero.Aircraft.ControlState]
        OutOfRangeAction: "Limit"
        DiagnosticAction: "Warning"
              Properties: [1x1 Aero.Aircraft.Properties]

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

Выполнение численного анализа

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

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

Силы и моменты

Для вычисления сил и моментов на самолете в образец времени используйте forcesAndMoments способ.

Эти силы и моменты находятся в каркасе кузова самолета. Коэффициенты, заданные в другой системе координат, имеют соответствующие матрицы преобразования, примененные для преобразования их в каркас кузова.

[F, M] = forcesAndMoments(C182, CruiseState)
F = 3×1

 -233.0908
         0
   -0.3300

M = 3×1
103 ×

         0
    1.8739
         0

Нелинейная динамика

Для вычисления динамического поведения самолета используйте nonlinearDynamics способ.

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

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

disp(load("astFixedWingDOFtable.mat").DOFtable)
                  PM4    PM6    3DOF    6DOF
                  ___    ___    ____    ____

    dXN /dt       "X"    "X"    "X"     "X" 
    dXE /dt       ""     "X"    ""      "X" 
    dXD /dt       "X"    "X"    "X"     "X" 
    dU /dt        "X"    "X"    "X"     "X" 
    dV /dt        ""     "X"    ""      "X" 
    dW /dt        "X"    "X"    "X"     "X" 
    dP /dt        ""     ""     ""      "X" 
    dQ /dt        ""     ""     "X"     "X" 
    dR /dt        ""     ""     ""      "X" 
    dPhi /dt      ""     ""     ""      "X" 
    dTheta /dt    ""     ""     "X"     "X" 
    dPsi /dt      ""     ""     ""      "X" 
dydt = nonlinearDynamics(C182, CruiseState)
dydt = 12×1

  220.1000
         0
         0
   -2.8323
         0
   -0.0040
         0
    1.3922
         0
         0
      ⋮

Статическая стабильность

Статическая остойчивость - это тенденция самолета возвращаться в исходное состояние после небольшого возмущения от начального состояния. Это важная функция самолетов для гражданского использования и уменьшает потребность в сложных контроллерах для поддержания динамической устойчивости. В некоторых условиях самолёты, которые требуют передовой маневренности, могут выбрать статическую нестабильность.

The Aero.FixedWing способ статической устойчивости объекта вычисляет изменения сил и моментов из-за возмущений при текущем состоянии самолета.

Метод сравнивает возмущения с предопределенным набором критериев как меньшие, большие или равные нулю. Можно также задать пользовательские критерии. Затем метод оценивает статическую стабильность как:

  • Если критерии удовлетворены, то возмущение статически стабильно.

  • Если критерии не удовлетворены, то возмущение статически нестабильно.

  • Если возмущение 0, возмущение статически нейтрально.

The staticStability метод не выполняет анализ, основанный на требованиях. Используйте этот метод только на фазе предварительного проекта.

[stability, derivatives] = staticStability(C182, CruiseState)
stability=6×8 table
             U           V           W         Alpha        Beta         P           Q           R    
          ________    ________    ________    ________    ________    ________    ________    ________

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

derivatives=6×8 table
             U            V            W       Alpha        Beta            P              Q           R   
          _______    ___________    _______    ______    __________    ___________    ___________    ______

    FX     -2.118    -5.4001e-08     7.2955    1606.1    -0.0023309              0              0         0
    FY          0        -15.415          0         0       -3392.8        -647.47              0    1847.5
    FZ    -24.083    -5.9117e-07    -174.03    -38305     -0.026503              0         -33669         0
    L           0        -130.33          0         0        -28686    -1.5042e+05              0     24801
    M      17.028     4.5475e-07    -105.88    -23303      0.018739              0    -5.2223e+05         0
    N           0         83.944          0         0         18476        -8595.5              0    -29248

Ссылки

  1. Roskam, J., «Airplane Flight Dynamics and Automatic Flight Controls (Part 1)», DAR Corporation, 2003.