Main Content

Customize Fixed-Wing Aircraft with the Object Interface

This example shows how to customize fixed-wing aircraft in MATLAB using objects.

For an example of how to get started using fixed-wing aircraft in MATLAB, see “Get Started with Fixed-Wing Aircraft”. 

For an example of setting realistic coefficients on an aircraft and calculating static stability, see  “Determine Nonlinear Dynamics and Static Stability of Fixed-Wing Aircraft”. 

For an example of importing coefficients from Digital DATCOM analysis and linearizing to a state-space model, see “Perform Controls and Static Stability Analysis with Linearized Fixed-Wing Aircraft”. 

Fixed-Wing Object Interface

Each fixed-wing aircraft function returns an object of its defining type.

Functions provide convenience to constructing each object. However, their predefined input structure might be inconvenient to some workflows. For example, consider using objects if you want more control over the specific inputs of each component, or if you want to avoid repmat calls to create arrays of each component. Objects let you directly construct each component.

The table mapping each function to object can be seen below.

Component = ["Properties"; "Environment"; "Aircraft"; "States"; "Coefficients"; "Surfaces"; "Thrust"];
Formal = ["Aero.Aircraft.Properties"; "Aero.Aircraft.Environment"; "Aero.FixedWing"; "Aero.FixedWing.State"; "Aero.FixedWing.Coefficient";"Aero.FixedWing.Surface"; "Aero.FixedWing.Thrust"];
Informal = ["aircraftProperties"; "aircraftEnvironment"; "fixedWingAircraft"; "fixedWingState"; "fixedWingCoefficient"; "fixedWingSurface"; "fixedWingThrust"];
objMap = table(Formal, Informal, 'RowNames', Component, 'VariableNames',["Formal Interface", "Informal Interface"])
objMap=7×2 table
                          Formal Interface            Informal Interface  
                    ____________________________    ______________________

    Properties      "Aero.Aircraft.Properties"      "aircraftProperties"  
    Environment     "Aero.Aircraft.Environment"     "aircraftEnvironment" 
    Aircraft        "Aero.FixedWing"                "fixedWingAircraft"   
    States          "Aero.FixedWing.State"          "fixedWingState"      
    Coefficients    "Aero.FixedWing.Coefficient"    "fixedWingCoefficient"
    Surfaces        "Aero.FixedWing.Surface"        "fixedWingSurface"    
    Thrust          "Aero.FixedWing.Thrust"         "fixedWingThrust"     

The constructor for each fixed-wing aircraft component is structured the same way:

  • The first argument is either a vector or repeating set of integers that specifies the size of the returned object array, like the "zeros" function, with the default being size 1.

  • Every argument after the first argument is a name-value pair specifying the object property and value for setting non-default values.

  • Each non-default value is set for every object in the returned object array.

For example, creating a 3-element fixed-wing state vector where each state has a mass of 50 kg would have the following syntax:

states = Aero.FixedWing.State(1,3, Mass=50)
states=1×3 object
  1x3 State array with properties:

    Alpha
    Beta
    AlphaDot
    BetaDot
    Mass
    Inertia
    CenterOfGravity
    CenterOfPressure
    AltitudeMSL
    GroundHeight
    XN
    XE
    XD
    U
    V
    W
    Phi
    Theta
    Psi
    P
    Q
    R
    Weight
    AltitudeAGL
    Airspeed
    GroundSpeed
    MachNumber
    BodyVelocity
    GroundVelocity
    Ur
    Vr
    Wr
    FlightPathAngle
    CourseAngle
    InertialToBodyMatrix
    BodyToInertialMatrix
    BodyToWindMatrix
    WindToBodyMatrix
    DynamicPressure
    Environment
    ControlStates
    OutOfRangeAction
    DiagnosticAction
    Properties
    UnitSystem
    AngleSystem
    TemperatureSystem

states.Mass
ans = 50
ans = 50
ans = 50

As can be seen from the returned Mass values, each state has a mass of 50 in the vector.

Following this format, this example constructs the same aircraft from the "Get Started with Fixed-Wing Aircraft" example, replacing the function interface with the associated object interface.

Fixed-Wing Aircraft Configuration

Create the 3 control surfaces using Aero.FixedWing.Surface.

By default, the surface objects are defined to be symmetric and not controllable, so these two properties must be set for the aileron along with the maximum and minimum values.

aileron = Aero.FixedWing.Surface(...
              Controllable="on", ...
              Symmetry="Asymmetric", ...
              MinimumValue=-20, ...
              MaximumValue=20)
aileron = 
  Surface with properties:

            Surfaces: [1x0 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: 20
        MinimumValue: -20
        Controllable: on
            Symmetry: "Asymmetric"
    ControlVariables: ["_1"    "_2"]
          Properties: [1x1 Aero.Aircraft.Properties]

Additionally, the set the name on the properties of the aileron surface object. This is helpful for setting coefficients later.

aileron.Properties.Name = "aileron"
aileron = 
  Surface with properties:

            Surfaces: [1x0 Aero.FixedWing.Surface]
        Coefficients: [1x1 Aero.FixedWing.Coefficient]
        MaximumValue: 20
        MinimumValue: -20
        Controllable: on
            Symmetry: "Asymmetric"
    ControlVariables: ["aileron_1"    "aileron_2"]
          Properties: [1x1 Aero.Aircraft.Properties]

For the elevator and rudder, the symmetry is already the desired value, so the "Symmetry" name-value argument can be excluded.

elevator = Aero.FixedWing.Surface(...
              Controllable="on", ...
              MinimumValue=-20, ...
              MaximumValue=20)
elevator = 
  Surface with properties:

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

rudder = Aero.FixedWing.Surface(...
               Controllable="on", ...
               MinimumValue=-20, ...
               MaximumValue=20)
rudder = 
  Surface with properties:

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

elevator.Properties.Name = "Elevator"
elevator = 
  Surface with properties:

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

rudder.Properties.Name = "Rudder"
rudder = 
  Surface with properties:

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

With the control surfaces defined, define the thrust object using the Aero.FixedWing.Thrust object.

By default, the minimum and maximum values for the thrust object are 0 and 1, which represent the throttle lever position.

In this aircraft, they are limited to 0 and 0.75.

propeller = Aero.FixedWing.Thrust(MaximumValue=0.75)
propeller = 
  Thrust with properties:

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

The name of the thrust vector can also be set at this time.

propeller.Properties.Name = "propeller"
propeller = 
  Thrust with properties:

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

With these control surfaces and thrust vectors defined, they can now be set on the body of the aircraft.

The aircraft body is defined through the Aero.FixedWing object.

For simplicity, this aircraft will have a reference area, span, and length of 3, 2, and 1, respectively.

aircraft = Aero.FixedWing(...
           ReferenceArea=3, ...
           ReferenceSpan=2, ...
           ReferenceLength=1)
aircraft = 
  FixedWing with properties:

        ReferenceArea: 3
        ReferenceSpan: 2
      ReferenceLength: 1
         Coefficients: [1x1 Aero.FixedWing.Coefficient]
     DegreesOfFreedom: "6DOF"
             Surfaces: [1x0 Aero.FixedWing.Surface]
              Thrusts: [1x0 Aero.FixedWing.Thrust]
          AspectRatio: 1.3333
           Properties: [1x1 Aero.Aircraft.Properties]
           UnitSystem: "Metric"
          AngleSystem: "Radians"
    TemperatureSystem: "Kelvin"

aircraft.Surfaces = [aileron, elevator, rudder]
aircraft = 
  FixedWing with properties:

        ReferenceArea: 3
        ReferenceSpan: 2
      ReferenceLength: 1
         Coefficients: [1x1 Aero.FixedWing.Coefficient]
     DegreesOfFreedom: "6DOF"
             Surfaces: [1x3 Aero.FixedWing.Surface]
              Thrusts: [1x0 Aero.FixedWing.Thrust]
          AspectRatio: 1.3333
           Properties: [1x1 Aero.Aircraft.Properties]
           UnitSystem: "Metric"
          AngleSystem: "Radians"
    TemperatureSystem: "Kelvin"

aircraft.Thrusts = propeller
aircraft = 
  FixedWing with properties:

        ReferenceArea: 3
        ReferenceSpan: 2
      ReferenceLength: 1
         Coefficients: [1x1 Aero.FixedWing.Coefficient]
     DegreesOfFreedom: "6DOF"
             Surfaces: [1x3 Aero.FixedWing.Surface]
              Thrusts: [1x1 Aero.FixedWing.Thrust]
          AspectRatio: 1.3333
           Properties: [1x1 Aero.Aircraft.Properties]
           UnitSystem: "Metric"
          AngleSystem: "Radians"
    TemperatureSystem: "Kelvin"

Set the aircraft coefficients using the setCoefficient and getCoefficient methods, creating a coefficient using the Aero.FixedWing.Coefficient object, or indexing directly to the coefficient values.

coeff = Aero.FixedWing.Coefficient
coeff = 
  Coefficient with properties:

                     Table: [6x1 table]
                    Values: {6x1 cell}
            StateVariables: "Zero"
               StateOutput: [6x1 string]
            ReferenceFrame: "Wind"
    MultiplyStateVariables: on
            NonDimensional: on
                Properties: [1x1 Aero.Aircraft.Properties]

aircraft.Coefficients.Values{3,3} = 0.2
aircraft = 
  FixedWing with properties:

        ReferenceArea: 3
        ReferenceSpan: 2
      ReferenceLength: 1
         Coefficients: [1x1 Aero.FixedWing.Coefficient]
     DegreesOfFreedom: "6DOF"
             Surfaces: [1x3 Aero.FixedWing.Surface]
              Thrusts: [1x1 Aero.FixedWing.Thrust]
          AspectRatio: 1.3333
           Properties: [1x1 Aero.Aircraft.Properties]
           UnitSystem: "Metric"
          AngleSystem: "Radians"
    TemperatureSystem: "Kelvin"

aircraft.Coefficients.Table
ans=6×9 table
          Zero    U    Alpha    AlphaDot    Q    Beta    BetaDot    P    R
          ____    _    _____    ________    _    ____    _______    _    _

    CD     0      0       0        0        0     0         0       0    0
    CY     0      0       0        0        0     0         0       0    0
    CL     0      0     0.2        0        0     0         0       0    0
    Cl     0      0       0        0        0     0         0       0    0
    Cm     0      0       0        0        0     0         0       0    0
    Cn     0      0       0        0        0     0         0       0    0

Fixed-Wing Aircraft States

Define fixed-wing aircraft states using the Aero.FixedWing.State object.

To directly create an array of states that all have the same properties, use the state constructor instead of using the repmat function.

In this example, 11 states are created by varying mass, but with constant airspeed.

mass = num2cell(1000:50:1500)
mass=1×11 cell array
  Columns 1 through 6

    {[1000]}    {[1050]}    {[1100]}    {[1150]}    {[1200]}    {[1250]}

  Columns 7 through 11

    {[1300]}    {[1350]}    {[1400]}    {[1450]}    {[1500]}

states = Aero.FixedWing.State(size(mass), U=100);
[states.Mass] = mass{:}
states=1×11 object
  1x11 State array with properties:

    Alpha
    Beta
    AlphaDot
    BetaDot
    Mass
    Inertia
    CenterOfGravity
    CenterOfPressure
    AltitudeMSL
    GroundHeight
    XN
    XE
    XD
    U
    V
    W
    Phi
    Theta
    Psi
    P
    Q
    R
    Weight
    AltitudeAGL
    Airspeed
    GroundSpeed
    MachNumber
    BodyVelocity
    GroundVelocity
    Ur
    Vr
    Wr
    FlightPathAngle
    CourseAngle
    InertialToBodyMatrix
    BodyToInertialMatrix
    BodyToWindMatrix
    WindToBodyMatrix
    DynamicPressure
    Environment
    ControlStates
    OutOfRangeAction
    DiagnosticAction
    Properties
    UnitSystem
    AngleSystem
    TemperatureSystem

However, unlike the fixedWingState function, the control states are not automatically set up on the states from the aircraft.

To set up the control states, use the setupControlStates function.

states = setupControlStates(states, aircraft)
states=1×11 object
  1x11 State array with properties:

    Alpha
    Beta
    AlphaDot
    BetaDot
    Mass
    Inertia
    CenterOfGravity
    CenterOfPressure
    AltitudeMSL
    GroundHeight
    XN
    XE
    XD
    U
    V
    W
    Phi
    Theta
    Psi
    P
    Q
    R
    Weight
    AltitudeAGL
    Airspeed
    GroundSpeed
    MachNumber
    BodyVelocity
    GroundVelocity
    Ur
    Vr
    Wr
    FlightPathAngle
    CourseAngle
    InertialToBodyMatrix
    BodyToInertialMatrix
    BodyToWindMatrix
    WindToBodyMatrix
    DynamicPressure
    Environment
    ControlStates
    OutOfRangeAction
    DiagnosticAction
    Properties
    UnitSystem
    AngleSystem
    TemperatureSystem

Related Topics