Esempio n. 1
0
def vehicle_setup():

    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle = SUAVE.Vehicle()
    vehicle.tag = 'multicopter'
    vehicle.configuration = 'eVTOL'
    # ------------------------------------------------------------------
    #   Vehicle-level Properties
    # ------------------------------------------------------------------
    # mass properties
    vehicle.mass_properties.takeoff = 2080. * Units.lb
    vehicle.mass_properties.operating_empty = 1666. * Units.lb
    vehicle.mass_properties.max_takeoff = 2080. * Units.lb
    vehicle.mass_properties.center_of_gravity = [2.6, 0., 0.]

    # This needs updating
    vehicle.passengers = 5
    vehicle.reference_area = 73 * Units.feet**2
    vehicle.envelope.ultimate_load = 5.7
    vehicle.envelope.limit_load = 3.

    wing = SUAVE.Components.Wings.Main_Wing()
    wing.tag = 'main_wing'
    wing.aspect_ratio = 1
    wing.spans.projected = 0.01
    vehicle.append_component(wing)

    # ------------------------------------------------------
    # FUSELAGE
    # ------------------------------------------------------
    # FUSELAGE PROPERTIES
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.configuration = 'Tube_Wing'
    fuselage.seats_abreast = 2.
    fuselage.seat_pitch = 3.
    fuselage.fineness.nose = 0.88
    fuselage.fineness.tail = 1.13
    fuselage.lengths.nose = 3.2 * Units.feet
    fuselage.lengths.tail = 6.4 * Units.feet
    fuselage.lengths.cabin = 6.4 * Units.feet
    fuselage.lengths.total = 16.0 * Units.feet
    fuselage.width = 5.85 * Units.feet
    fuselage.heights.maximum = 4.65 * Units.feet
    fuselage.heights.at_quarter_length = 3.75 * Units.feet
    fuselage.heights.at_wing_root_quarter_chord = 4.65 * Units.feet
    fuselage.heights.at_three_quarters_length = 4.26 * Units.feet
    fuselage.areas.wetted = 236. * Units.feet**2
    fuselage.areas.front_projected = 0.14 * Units.feet**2
    fuselage.effective_diameter = 5.85 * Units.feet
    fuselage.differential_pressure = 0.

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_1'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.0
    segment.height = 0.1 * Units.feet
    segment.width = 0.1 * Units.feet
    segment.length = 0.
    segment.effective_diameter = 0.1 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_2'
    segment.origin = [4. * 0.3048, 0., 0.1 * 0.3048]
    segment.percent_x_location = 0.25
    segment.percent_z_location = 0.05
    segment.height = 3.75 * Units.feet
    segment.width = 5.65 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 5.65 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_3'
    segment.origin = [8. * 0.3048, 0., 0.34 * 0.3048]
    segment.percent_x_location = 0.5
    segment.percent_z_location = 0.071
    segment.height = 4.65 * Units.feet
    segment.width = 5.55 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 5.55 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_4'
    segment.origin = [12. * 0.3048, 0., 0.77 * 0.3048]
    segment.percent_x_location = 0.75
    segment.percent_z_location = 0.089
    segment.height = 4.73 * Units.feet
    segment.width = 4.26 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 4.26 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_5'
    segment.origin = [16. * 0.3048, 0., 2.02 * 0.3048]
    segment.percent_x_location = 1.0
    segment.percent_z_location = 0.158
    segment.height = 0.67 * Units.feet
    segment.width = 0.33 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 0.33 * Units.feet
    fuselage.append_segment(segment)

    # add to vehicle
    vehicle.append_component(fuselage)

    #------------------------------------------------------------------
    # PROPULSOR
    #------------------------------------------------------------------
    net = Vectored_Thrust()
    net.number_of_engines = 6
    net.thrust_angle = 90. * Units.degrees
    net.nacelle_diameter = 0.6 * Units.feet  # need to check
    net.engine_length = 0.5 * Units.feet
    net.areas = Data()
    net.areas.wetted = np.pi * net.nacelle_diameter * net.engine_length + 0.5 * np.pi * net.nacelle_diameter**2
    net.voltage = 500.

    #------------------------------------------------------------------
    # Design Electronic Speed Controller
    #------------------------------------------------------------------
    esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller()
    esc.efficiency = 0.95
    net.esc = esc

    #------------------------------------------------------------------
    # Design Payload
    #------------------------------------------------------------------
    payload = SUAVE.Components.Energy.Peripherals.Avionics()
    payload.power_draw = 0.
    payload.mass_properties.mass = 200. * Units.kg
    net.payload = payload

    #------------------------------------------------------------------
    # Design Avionics
    #------------------------------------------------------------------
    avionics = SUAVE.Components.Energy.Peripherals.Avionics()
    avionics.power_draw = 200. * Units.watts
    net.avionics = avionics

    #------------------------------------------------------------------
    # Design Battery
    #------------------------------------------------------------------
    bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion(
    )
    bat.specific_energy = 350. * Units.Wh / Units.kg
    bat.resistance = 0.005
    bat.max_voltage = net.voltage
    bat.mass_properties.mass = 300. * Units.kg
    initialize_from_mass(bat, bat.mass_properties.mass)
    net.battery = bat

    #------------------------------------------------------------------
    # Design Rotors
    #------------------------------------------------------------------
    # atmosphere and flight conditions for propeller/rotor design
    g = 9.81  # gravitational acceleration
    speed_of_sound = 340  # speed of sound
    rho = 1.22  # reference density
    Hover_Load = vehicle.mass_properties.takeoff * g  # hover load
    design_tip_mach = 0.7  # design tip mach number

    rotor = SUAVE.Components.Energy.Converters.Rotor()
    rotor.tip_radius = 3.95 * Units.feet
    rotor.hub_radius = 0.6 * Units.feet
    rotor.disc_area = np.pi * (rotor.tip_radius**2)
    rotor.number_blades = 3
    rotor.freestream_velocity = 500. * Units['ft/min']
    rotor.angular_velocity = (design_tip_mach *
                              speed_of_sound) / rotor.tip_radius
    rotor.design_Cl = 0.8
    rotor.design_altitude = 1000 * Units.feet
    rotor.design_thrust = (Hover_Load / net.number_of_engines) * 2.
    rotor = propeller_design(rotor)
    rotor.induced_hover_velocity = np.sqrt(
        Hover_Load / (2 * rho * rotor.disc_area * net.number_of_engines))

    # propulating propellers on the other side of the vehicle
    rotor.origin = []
    for fuselage in vehicle.fuselages:
        if fuselage.tag == 'fuselage':
            continue
        else:
            rotor.origin.append(fuselage.origin[0])

    # append propellers to vehicle
    net.rotor = rotor

    #------------------------------------------------------------------
    # Design Motors
    #------------------------------------------------------------------
    # Motor
    motor = SUAVE.Components.Energy.Converters.Motor()
    motor.efficiency = 0.95
    motor.nominal_voltage = bat.max_voltage
    motor.mass_properties.mass = 3. * Units.kg
    motor.origin = rotor.origin
    motor.propeller_radius = rotor.tip_radius
    motor.gear_ratio = 1.0
    motor.gearbox_efficiency = 1.0
    motor.no_load_current = 4.0
    motor = size_optimal_motor(motor, rotor)
    net.motor = motor

    # Define motor sizing parameters
    max_power = rotor.design_power * 1.2
    max_torque = rotor.design_torque * 1.2

    # test high temperature superconducting motor weight function
    mass = hts_motor(max_power)

    # test NDARC motor weight function
    mass = nasa_motor(max_torque)

    # test air cooled motor weight function
    mass = air_cooled_motor(max_power)
    motor.mass_properties.mass = mass
    net.motor = motor

    vehicle.append_component(net)

    vehicle.weight_breakdown = empty(vehicle, None)
    return vehicle
def vehicle_setup():

    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle = SUAVE.Vehicle()
    vehicle.tag = 'multicopter'
    vehicle.configuration = 'eVTOL'
    # ------------------------------------------------------------------
    #   Vehicle-level Properties
    # ------------------------------------------------------------------
    # mass properties
    vehicle.mass_properties.takeoff = 2080. * Units.lb
    vehicle.mass_properties.operating_empty = 1666. * Units.lb
    vehicle.mass_properties.max_takeoff = 2080. * Units.lb
    vehicle.mass_properties.center_of_gravity = [[2.6, 0., 0.]]

    # This needs updating
    vehicle.passengers = 5
    vehicle.reference_area = 73 * Units.feet**2
    vehicle.envelope.ultimate_load = 5.7
    vehicle.envelope.limit_load = 3.

    wing = SUAVE.Components.Wings.Main_Wing()
    wing.tag = 'main_wing'
    wing.aspect_ratio = 1.
    wing.spans.projected = 0.1
    wing.chords.root = 0.1
    wing.chords.tip = 0.1
    wing.origin = [[2.6, 0., 0.]]
    wing.symbolic = True
    vehicle.append_component(wing)

    # ------------------------------------------------------
    # FUSELAGE
    # ------------------------------------------------------
    # FUSELAGE PROPERTIES
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.configuration = 'Tube_Wing'
    fuselage.seats_abreast = 2.
    fuselage.seat_pitch = 3.
    fuselage.fineness.nose = 0.88
    fuselage.fineness.tail = 1.13
    fuselage.lengths.nose = 3.2 * Units.feet
    fuselage.lengths.tail = 6.4 * Units.feet
    fuselage.lengths.cabin = 6.4 * Units.feet
    fuselage.lengths.total = 16.0 * Units.feet
    fuselage.width = 5.85 * Units.feet
    fuselage.heights.maximum = 4.65 * Units.feet
    fuselage.heights.at_quarter_length = 3.75 * Units.feet
    fuselage.heights.at_wing_root_quarter_chord = 4.65 * Units.feet
    fuselage.heights.at_three_quarters_length = 4.26 * Units.feet
    fuselage.areas.wetted = 236. * Units.feet**2
    fuselage.areas.front_projected = 0.14 * Units.feet**2
    fuselage.effective_diameter = 5.85 * Units.feet
    fuselage.differential_pressure = 0.

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_1'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.0
    segment.height = 0.1 * Units.feet
    segment.width = 0.1 * Units.feet
    segment.length = 0.
    segment.effective_diameter = 0.1 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_2'
    segment.origin = [4. * 0.3048, 0., 0.1 * 0.3048]
    segment.percent_x_location = 0.25
    segment.percent_z_location = 0.05
    segment.height = 3.75 * Units.feet
    segment.width = 5.65 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 5.65 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_3'
    segment.origin = [8. * 0.3048, 0., 0.34 * 0.3048]
    segment.percent_x_location = 0.5
    segment.percent_z_location = 0.071
    segment.height = 4.65 * Units.feet
    segment.width = 5.55 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 5.55 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_4'
    segment.origin = [12. * 0.3048, 0., 0.77 * 0.3048]
    segment.percent_x_location = 0.75
    segment.percent_z_location = 0.089
    segment.height = 4.73 * Units.feet
    segment.width = 4.26 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 4.26 * Units.feet
    fuselage.append_segment(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_5'
    segment.origin = [16. * 0.3048, 0., 2.02 * 0.3048]
    segment.percent_x_location = 1.0
    segment.percent_z_location = 0.158
    segment.height = 0.67 * Units.feet
    segment.width = 0.33 * Units.feet
    segment.length = 3.2 * Units.feet
    segment.effective_diameter = 0.33 * Units.feet
    fuselage.append_segment(segment)

    # add to vehicle
    vehicle.append_component(fuselage)

    # -----------------------------------------------------------------
    # Design the Nacelle
    # -----------------------------------------------------------------
    nacelle = SUAVE.Components.Nacelles.Nacelle()
    nacelle.diameter = 0.6 * Units.feet  # need to check
    nacelle.length = 0.5 * Units.feet
    nacelle.tag = 'nacelle_1'
    nacelle.areas.wetted = np.pi * nacelle.diameter * nacelle.length + 0.5 * np.pi * nacelle.diameter**2
    nacelle.origin = [[0., 2., 1.4]]
    vehicle.append_component(nacelle)

    nacelle_2 = deepcopy(nacelle)
    nacelle_2.tag = 'nacelle_2'
    nacelle_2.origin = [[0.0, -2., 1.4]]
    vehicle.append_component(nacelle_2)

    nacelle_3 = deepcopy(nacelle)
    nacelle_3.tag = 'nacelle_3'
    nacelle_3.origin = [[2.5, 4., 1.4]]
    vehicle.append_component(nacelle_3)

    nacelle_4 = deepcopy(nacelle)
    nacelle_4.tag = 'nacelle_4'
    nacelle_4.origin = [[2.5, -4., 1.4]]
    vehicle.append_component(nacelle_4)

    nacelle_5 = deepcopy(nacelle)
    nacelle_5.tag = 'nacelle_5'
    nacelle_5.origin = [[5.0, 2., 1.4]]
    vehicle.append_component(nacelle_5)

    nacelle_6 = deepcopy(nacelle)
    nacelle_6.tag = 'nacelle_6'
    nacelle_6.origin = [[5.0, -2., 1.4]]
    vehicle.append_component(nacelle_6)

    #------------------------------------------------------------------
    # Network
    #------------------------------------------------------------------
    net = SUAVE.Components.Energy.Networks.Battery_Propeller()
    net.number_of_lift_rotor_engines = 6
    net.nacelle_diameter = 0.6 * Units.feet  # need to check
    net.engine_length = 0.5 * Units.feet
    net.areas = Data()
    net.areas.wetted = np.pi * net.nacelle_diameter * net.engine_length + 0.5 * np.pi * net.nacelle_diameter**2
    net.voltage = 500.
    net.identical_lift_rotors = True

    #------------------------------------------------------------------
    # Design Electronic Speed Controller
    #------------------------------------------------------------------
    esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller()
    esc.efficiency = 0.95
    net.esc = esc

    #------------------------------------------------------------------
    # Design Payload
    #------------------------------------------------------------------
    payload = SUAVE.Components.Energy.Peripherals.Avionics()
    payload.power_draw = 0.
    payload.mass_properties.mass = 200. * Units.kg
    net.payload = payload

    #------------------------------------------------------------------
    # Design Avionics
    #------------------------------------------------------------------
    avionics = SUAVE.Components.Energy.Peripherals.Avionics()
    avionics.power_draw = 200. * Units.watts
    net.avionics = avionics

    #------------------------------------------------------------------
    # Design Battery
    #------------------------------------------------------------------
    bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion_LiNiMnCoO2_18650(
    )
    bat.mass_properties.mass = 300. * Units.kg
    bat.max_voltage = net.voltage
    initialize_from_mass(bat)
    net.battery = bat

    #------------------------------------------------------------------
    # Design Rotors
    #------------------------------------------------------------------
    # atmosphere and flight conditions for propeller/lift_rotor design
    g = 9.81  # gravitational acceleration
    speed_of_sound = 340  # speed of sound
    Hover_Load = vehicle.mass_properties.takeoff * g  # hover load
    design_tip_mach = 0.7  # design tip mach number

    lift_rotor = SUAVE.Components.Energy.Converters.Lift_Rotor()
    lift_rotor.tip_radius = 3.95 * Units.feet
    lift_rotor.hub_radius = 0.6 * Units.feet
    lift_rotor.disc_area = np.pi * (lift_rotor.tip_radius**2)
    lift_rotor.number_of_blades = 3
    lift_rotor.freestream_velocity = 10.0
    lift_rotor.angular_velocity = (design_tip_mach *
                                   speed_of_sound) / lift_rotor.tip_radius
    lift_rotor.design_Cl = 0.7
    lift_rotor.design_altitude = 1000 * Units.feet
    lift_rotor.design_thrust = Hover_Load / (
        net.number_of_lift_rotor_engines - 1
    )  # contingency for one-engine-inoperative condition

    lift_rotor.airfoil_geometry = ['../Vehicles/Airfoils/NACA_4412.txt']
    lift_rotor.airfoil_polars = [[
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_50000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_100000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_200000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_500000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt'
    ]]

    lift_rotor.airfoil_polar_stations = [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ]
    lift_rotor = propeller_design(lift_rotor)

    # Appending rotors with different origins
    origins = [[0., 2., 1.4], [0.0, -2., 1.4], [2.5, 4., 1.4], [2.5, -4., 1.4],
               [5.0, 2., 1.4], [5.0, -2., 1.4]]

    for ii in range(6):
        lift_rotor = deepcopy(lift_rotor)
        lift_rotor.tag = 'lift_rotor'
        lift_rotor.origin = [origins[ii]]
        net.lift_rotors.append(lift_rotor)

    #------------------------------------------------------------------
    # Design Motors
    #------------------------------------------------------------------
    # Motor
    lift_motor = SUAVE.Components.Energy.Converters.Motor()
    lift_motor.efficiency = 0.95
    lift_motor.nominal_voltage = bat.max_voltage * 0.5
    lift_motor.mass_properties.mass = 3. * Units.kg
    lift_motor.origin = lift_rotor.origin
    lift_motor.propeller_radius = lift_rotor.tip_radius
    lift_motor.no_load_current = 2.0
    lift_motor = size_optimal_motor(lift_motor, lift_rotor)
    net.lift_motor = lift_motor

    # Define motor sizing parameters
    max_power = lift_rotor.design_power * 1.2
    max_torque = lift_rotor.design_torque * 1.2

    # test high temperature superconducting motor weight function
    mass = hts_motor(max_power)

    # test NDARC motor weight function
    mass = nasa_motor(max_torque)

    # test air cooled motor weight function
    mass = air_cooled_motor(max_power)
    lift_motor.mass_properties.mass = mass

    # Appending motors with different origins
    for ii in range(6):
        lift_rotor_motor = deepcopy(lift_motor)
        lift_rotor_motor.tag = 'motor'
        net.lift_rotor_motors.append(lift_rotor_motor)

    vehicle.append_component(net)

    vehicle.weight_breakdown = empty(vehicle)
    compute_component_centers_of_gravity(vehicle)
    vehicle.center_of_gravity()

    return vehicle
Esempio n. 3
0
def vehicle_setup():
    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle = SUAVE.Vehicle()
    vehicle.tag = 'Tiltwing'
    vehicle.configuration = 'eVTOL'
    # ------------------------------------------------------------------
    #   Vehicle-level Properties
    # ------------------------------------------------------------------
    # mass properties
    vehicle.mass_properties.takeoff = 2250. * Units.lb
    vehicle.mass_properties.operating_empty = 2250. * Units.lb
    vehicle.mass_properties.max_takeoff = 2250. * Units.lb
    vehicle.mass_properties.center_of_gravity = [[2.0144, 0., 0.]]
    vehicle.passengers = 1
    vehicle.reference_area = 10.58275476
    vehicle.envelope.ultimate_load = 5.7
    vehicle.envelope.limit_load = 3.

    # ------------------------------------------------------
    # WINGS
    # ------------------------------------------------------
    wing = SUAVE.Components.Wings.Main_Wing()
    wing.tag = 'canard_wing'
    wing.aspect_ratio = 11.37706641
    wing.sweeps.quarter_chord = 0.0
    wing.thickness_to_chord = 0.18
    wing.taper = 1.
    wing.spans.projected = 6.65
    wing.chords.root = 0.95
    wing.total_length = 0.95
    wing.chords.tip = 0.95
    wing.chords.mean_aerodynamic = 0.95
    wing.dihedral = 0.0
    wing.areas.reference = 6.31
    wing.areas.wetted = 12.635
    wing.areas.exposed = 12.635
    wing.twists.root = 0.
    wing.twists.tip = 0.
    wing.origin = [[0.1, 0.0, 0.0]]
    wing.aerodynamic_center = [0., 0., 0.]
    wing.winglet_fraction = 0.0
    wing.symmetric = True

    # add to vehicle
    vehicle.append_component(wing)

    wing = SUAVE.Components.Wings.Main_Wing()
    wing.tag = 'main_wing'
    wing.aspect_ratio = 11.37706641
    wing.sweeps.quarter_chord = 0.0
    wing.thickness_to_chord = 0.18
    wing.taper = 1.
    wing.spans.projected = 6.65
    wing.chords.root = 0.95
    wing.total_length = 0.95
    wing.chords.tip = 0.95
    wing.chords.mean_aerodynamic = 0.95
    wing.dihedral = 0.0
    wing.areas.reference = 6.31
    wing.areas.wetted = 12.635
    wing.areas.exposed = 12.635
    wing.twists.root = 0.
    wing.twists.tip = 0.
    wing.origin = [[5.138, 0.0, 1.323]]  # for images 1.54
    wing.aerodynamic_center = [0., 0., 0.]
    wing.winglet_fraction = 0.0
    wing.symmetric = True

    # add to vehicle
    vehicle.append_component(wing)

    # ------------------------------------------------------
    # FUSELAGE
    # ------------------------------------------------------
    # FUSELAGE PROPERTIES
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.seats_abreast = 0.
    fuselage.seat_pitch = 1.
    fuselage.fineness.nose = 1.5
    fuselage.fineness.tail = 4.0
    fuselage.lengths.nose = 1.7
    fuselage.lengths.tail = 2.7
    fuselage.lengths.cabin = 1.7
    fuselage.lengths.total = 6.1
    fuselage.width = 1.15
    fuselage.heights.maximum = 1.7
    fuselage.heights.at_quarter_length = 1.2
    fuselage.heights.at_wing_root_quarter_chord = 1.7
    fuselage.heights.at_three_quarters_length = 0.75
    fuselage.areas.wetted = 12.97989862
    fuselage.areas.front_projected = 1.365211404
    fuselage.effective_diameter = 1.318423736
    fuselage.differential_pressure = 0.

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_0'
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.
    segment.height = 0.09
    segment.width = 0.23473
    segment.length = 0.
    segment.effective_diameter = 0.
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_1'
    segment.percent_x_location = 0.97675 / 6.1
    segment.percent_z_location = 0.21977 / 6.1
    segment.height = 0.9027
    segment.width = 1.01709
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_2'
    segment.percent_x_location = 1.93556 / 6.1
    segment.percent_z_location = 0.39371 / 6.1
    segment.height = 1.30558
    segment.width = 1.38871
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_3'
    segment.percent_x_location = 3.44137 / 6.1
    segment.percent_z_location = 0.57143 / 6.1
    segment.height = 1.52588
    segment.width = 1.47074
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_4'
    segment.percent_x_location = 4.61031 / 6.1
    segment.percent_z_location = 0.81577 / 6.1
    segment.height = 1.14788
    segment.width = 1.11463
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_5'
    segment.percent_x_location = 1.
    segment.percent_z_location = 1.19622 / 6.1
    segment.height = 0.31818
    segment.width = 0.23443
    fuselage.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(fuselage)

    #------------------------------------------------------------------
    # PROPULSOR
    #------------------------------------------------------------------
    net = Vectored_Thrust()
    net.number_of_engines = 8
    net.thrust_angle = 0.0 * Units.degrees  #  conversion to radians,
    net.nacelle_diameter = 0.2921  # https://www.magicall.biz/products/integrated-motor-controller-magidrive/
    net.engine_length = 0.95
    net.areas = Data()
    net.areas.wetted = np.pi * net.nacelle_diameter * net.engine_length + 0.5 * np.pi * net.nacelle_diameter**2
    net.voltage = 400.

    #------------------------------------------------------------------
    # Design Electronic Speed Controller
    #------------------------------------------------------------------
    esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller()
    esc.efficiency = 0.95
    net.esc = esc

    # Component 6 the Payload
    payload = SUAVE.Components.Energy.Peripherals.Payload()
    payload.power_draw = 10.  #Watts
    payload.mass_properties.mass = 0.0 * Units.kg
    net.payload = payload

    # Component 7 the Avionics
    avionics = SUAVE.Components.Energy.Peripherals.Avionics()
    avionics.power_draw = 20.  #Watts
    net.avionics = avionics

    #------------------------------------------------------------------
    # Design Battery
    #------------------------------------------------------------------
    bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion(
    )
    bat.mass_properties.mass = 200. * Units.kg
    bat.specific_energy = 200. * Units.Wh / Units.kg
    bat.resistance = 0.006
    bat.max_voltage = 400.

    initialize_from_mass(bat, bat.mass_properties.mass)
    net.battery = bat
    net.voltage = bat.max_voltage

    # Component 9 Miscellaneous Systems
    sys = SUAVE.Components.Systems.System()
    sys.mass_properties.mass = 5  # kg

    #------------------------------------------------------------------
    # Design Rotors
    #------------------------------------------------------------------
    # atmosphere conditions
    speed_of_sound = 340
    rho = 1.22
    fligth_CL = 0.75
    AR = vehicle.wings.main_wing.aspect_ratio
    Cd0 = 0.06
    Cdi = fligth_CL**2 / (np.pi * AR * 0.98)
    Cd = Cd0 + Cdi

    # Create propeller geometry
    rot = SUAVE.Components.Energy.Converters.Rotor()
    rot.y_pitch = 1.850
    rot.tip_radius = 0.8875
    rot.hub_radius = 0.15
    rot.disc_area = np.pi * (rot.tip_radius**2)
    rot.design_tip_mach = 0.5
    rot.number_of_blades = 3
    rot.freestream_velocity = 10
    rot.angular_velocity = rot.design_tip_mach * speed_of_sound / rot.tip_radius
    rot.design_Cl = 0.7
    rot.design_altitude = 500 * Units.feet
    Lift = vehicle.mass_properties.takeoff * 9.81
    rot.design_thrust = (Lift * 1.5) / net.number_of_engines
    rot.induced_hover_velocity = np.sqrt(
        Lift / (2 * rho * rot.disc_area * net.number_of_engines))

    rot.airfoil_geometry = ['../Vehicles/Airfoils/NACA_4412.txt']
    rot.airfoil_polars = [[
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_50000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_100000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_200000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_500000.txt',
        '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt'
    ]]
    rot.airfoil_polar_stations = [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ]
    rot = propeller_design(rot)
    rot.rotation = [1, 1, 1, 1, 1, 1, 1, 1]

    # Front Rotors Locations
    rot_front = Data()
    rot_front.origin = [[-0.2, 1.347, 0.]]
    rot_front.symmetric = True
    rot_front.x_pitch_count = 1
    rot_front.y_pitch_count = 2
    rot_front.y_pitch = 1.95

    # populating rotors on one side of wing
    if rot_front.y_pitch_count > 1:
        for n in range(rot_front.y_pitch_count):
            if n == 0:
                continue
            for i in range(len(rot_front.origin)):
                propeller_origin = [
                    rot_front.origin[i][0],
                    rot_front.origin[i][1] + n * rot_front.y_pitch,
                    rot_front.origin[i][2]
                ]
                rot_front.origin.append(propeller_origin)

    # populating rotors on the other side of the vehicle
    if rot_front.symmetric:
        for n in range(len(rot_front.origin)):
            propeller_origin = [
                rot_front.origin[n][0], -rot_front.origin[n][1],
                rot_front.origin[n][2]
            ]
            rot_front.origin.append(propeller_origin)

    # Rear Rotors Locations
    rot_rear = Data()
    rot_rear.origin = [[5.138 - 0.2, 1.347, 1.54]]
    rot_rear.symmetric = True
    rot_rear.x_pitch_count = 1
    rot_rear.y_pitch_count = 2
    rot_rear.y_pitch = 1.95
    # populating rotors on one side of wing
    if rot_rear.y_pitch_count > 1:
        for n in range(rot_rear.y_pitch_count):
            if n == 0:
                continue
            for i in range(len(rot_rear.origin)):
                propeller_origin = [
                    rot_rear.origin[i][0],
                    rot_rear.origin[i][1] + n * rot_rear.y_pitch,
                    rot_rear.origin[i][2]
                ]
                rot_rear.origin.append(propeller_origin)

    # populating rotors on the other side of the vehicle
    if rot_rear.symmetric:
        for n in range(len(rot_rear.origin)):
            propeller_origin = [
                rot_rear.origin[n][0], -rot_rear.origin[n][1],
                rot_rear.origin[n][2]
            ]
            rot_rear.origin.append(propeller_origin)

    # Assign all rotors (front and rear) to network
    rot.origin = rot_front.origin + rot_rear.origin

    # append rotors to vehicle
    net.rotor = rot

    # Motor
    #------------------------------------------------------------------
    # Design Motors
    #------------------------------------------------------------------
    # Propeller (Thrust) motor
    motor = SUAVE.Components.Energy.Converters.Motor()
    motor.origin = rot_front.origin + rot_rear.origin
    motor.efficiency = 0.935
    motor.gear_ratio = 1.
    motor.gearbox_efficiency = 1.  # Gear box efficiency
    motor.nominal_voltage = bat.max_voltage * 3 / 4
    motor.propeller_radius = rot.tip_radius
    motor.no_load_current = 2.0
    motor = size_optimal_motor(motor, rot)
    motor.mass_properties.mass = nasa_motor(motor.design_torque)
    net.motor = motor
    vehicle.append_component(net)

    # Add extra drag sources from motors, props, and landing gear. All of these hand measured
    motor_height = .25 * Units.feet
    motor_width = 1.6 * Units.feet
    propeller_width = 1. * Units.inches
    propeller_height = propeller_width * .12
    main_gear_width = 1.5 * Units.inches
    main_gear_length = 2.5 * Units.feet
    nose_gear_width = 2. * Units.inches
    nose_gear_length = 2. * Units.feet
    nose_tire_height = (0.7 + 0.4) * Units.feet
    nose_tire_width = 0.4 * Units.feet
    main_tire_height = (0.75 + 0.5) * Units.feet
    main_tire_width = 4. * Units.inches
    total_excrescence_area_spin      = 12.*motor_height*motor_width + 2.* main_gear_length*main_gear_width \
                                         + nose_gear_width*nose_gear_length + 2 * main_tire_height*main_tire_width\
                                         + nose_tire_height*nose_tire_width
    total_excrescence_area_no_spin = total_excrescence_area_spin + 12 * propeller_height * propeller_width
    vehicle.excrescence_area_no_spin = total_excrescence_area_no_spin
    vehicle.excrescence_area_spin = total_excrescence_area_spin

    # append motor origin spanwise locations onto wing data structure
    motor_origins_front = np.array(rot_front.origin)
    motor_origins_rear = np.array(rot_rear.origin)
    vehicle.wings[
        'canard_wing'].motor_spanwise_locations = motor_origins_front[:, 1] / vehicle.wings[
            'canard_wing'].spans.projected
    vehicle.wings[
        'canard_wing'].motor_spanwise_locations = motor_origins_front[:, 1] / vehicle.wings[
            'canard_wing'].spans.projected
    vehicle.wings[
        'main_wing'].motor_spanwise_locations = motor_origins_rear[:, 1] / vehicle.wings[
            'main_wing'].spans.projected

    net.origin = rot.origin

    vehicle.weight_breakdown = empty(vehicle)
    compute_component_centers_of_gravity(vehicle)
    vehicle.center_of_gravity()

    return vehicle
Esempio n. 4
0
def vehicle_setup():
    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle                                     = SUAVE.Vehicle()
    vehicle.tag                                 = 'Tiltwing'
    vehicle.configuration                       = 'eVTOL'
    # ------------------------------------------------------------------
    #   Vehicle-level Properties
    # ------------------------------------------------------------------
    # mass properties
    vehicle.mass_properties.takeoff             = 2250. * Units.lb
    vehicle.mass_properties.operating_empty     = 2250. * Units.lb
    vehicle.mass_properties.max_takeoff         = 2250. * Units.lb
    vehicle.mass_properties.center_of_gravity   = [[ 2.0144,   0.  ,  0.]]
    vehicle.passengers                          = 1
    vehicle.reference_area                      = 10.58275476
    vehicle.envelope.ultimate_load              = 5.7
    vehicle.envelope.limit_load                 = 3.

    # ------------------------------------------------------
    # WINGS
    # ------------------------------------------------------
    wing                          = SUAVE.Components.Wings.Main_Wing()
    wing.tag                      = 'canard_wing'
    wing.aspect_ratio             = 11.37706641
    wing.sweeps.quarter_chord     = 0.0
    wing.thickness_to_chord       = 0.18
    wing.taper                    = 1.
    wing.spans.projected          = 6.65
    wing.chords.root              = 0.95
    wing.total_length             = 0.95
    wing.chords.tip               = 0.95
    wing.chords.mean_aerodynamic  = 0.95
    wing.dihedral                 = 0.0
    wing.areas.reference          = 6.31
    wing.areas.wetted             = 12.635
    wing.areas.exposed            = 12.635
    wing.twists.root              = 0.
    wing.twists.tip               = 0.
    wing.origin                   = [[0.1,  0.0 , 0.0]]
    wing.aerodynamic_center       = [0.3,  0.0 , 0.0]
    wing.winglet_fraction         = 0.0
    wing.symmetric                = True

    # add to vehicle
    vehicle.append_component(wing)

    wing                          = SUAVE.Components.Wings.Main_Wing()
    wing.tag                      = 'main_wing'
    wing.aspect_ratio             = 11.37706641
    wing.sweeps.quarter_chord     = 0.0
    wing.thickness_to_chord       = 0.18
    wing.taper                    = 1.
    wing.spans.projected          = 6.65
    wing.chords.root              = 0.95
    wing.total_length             = 0.95
    wing.chords.tip               = 0.95
    wing.chords.mean_aerodynamic  = 0.95
    wing.dihedral                 = 0.0
    wing.areas.reference          = 6.31
    wing.areas.wetted             = 12.635
    wing.areas.exposed            = 12.635
    wing.twists.root              = 0.
    wing.twists.tip               = 0.
    wing.origin                   = [[ 5.138, 0.0  ,  1.323 ]]  # for images 1.54
    wing.aerodynamic_center       = [ 5.3, 0.0  ,  1.323 ]
    wing.winglet_fraction         = 0.0
    wing.symmetric                = True

    # add to vehicle
    vehicle.append_component(wing)


    # ------------------------------------------------------
    # FUSELAGE
    # ------------------------------------------------------
    # FUSELAGE PROPERTIES
    fuselage                                    = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag                                = 'fuselage'
    fuselage.seats_abreast                      = 0.
    fuselage.seat_pitch                         = 1.
    fuselage.fineness.nose                      = 1.5
    fuselage.fineness.tail                      = 4.0
    fuselage.lengths.nose                       = 1.7
    fuselage.lengths.tail                       = 2.7
    fuselage.lengths.cabin                      = 1.7
    fuselage.lengths.total                      = 6.1
    fuselage.width                              = 1.15
    fuselage.heights.maximum                    =  1.7
    fuselage.heights.at_quarter_length          = 1.2
    fuselage.heights.at_wing_root_quarter_chord = 1.7
    fuselage.heights.at_three_quarters_length   = 0.75
    fuselage.areas.wetted                       = 12.97989862
    fuselage.areas.front_projected              = 1.365211404
    fuselage.effective_diameter                 = 1.318423736
    fuselage.differential_pressure              = 0.

    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_0'
    segment.percent_x_location                  = 0.
    segment.percent_z_location                  = 0.
    segment.height                              = 0.09
    segment.width                               = 0.23473
    segment.length                              = 0.
    segment.effective_diameter                  = 0.
    fuselage.Segments.append(segment)

    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_1'
    segment.percent_x_location                  = 0.97675/6.1
    segment.percent_z_location                  = 0.21977/6.1
    segment.height                              = 0.9027
    segment.width                               = 1.01709
    fuselage.Segments.append(segment)


    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_2'
    segment.percent_x_location                  = 1.93556/6.1
    segment.percent_z_location                  = 0.39371/6.1
    segment.height                              = 1.30558
    segment.width                               = 1.38871
    fuselage.Segments.append(segment)


    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_3'
    segment.percent_x_location                  = 3.44137/6.1
    segment.percent_z_location                  = 0.57143/6.1
    segment.height                              = 1.52588
    segment.width                               = 1.47074
    fuselage.Segments.append(segment)

    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_4'
    segment.percent_x_location                  = 4.61031/6.1
    segment.percent_z_location                  = 0.81577/6.1
    segment.height                              = 1.14788
    segment.width                               = 1.11463
    fuselage.Segments.append(segment)

    # Segment
    segment                                     = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag                                 = 'segment_5'
    segment.percent_x_location                  = 1.
    segment.percent_z_location                  = 1.19622/6.1
    segment.height                              = 0.31818
    segment.width                               = 0.23443
    fuselage.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(fuselage)


    #------------------------------------------------------------------
    # network
    #------------------------------------------------------------------
    net                                = SUAVE.Components.Energy.Networks.Battery_Propeller()
    net.number_of_propeller_engines    = 8
    net.thrust_angle                   = 0.0   * Units.degrees #  conversion to radians,
    net.nacelle_diameter               = 0.2921 # https://www.magicall.biz/products/integrated-motor-controller-magidrive/
    net.engine_length                  = 0.95
    net.areas                          = Data()
    net.areas.wetted                   = np.pi*net.nacelle_diameter*net.engine_length + 0.5*np.pi*net.nacelle_diameter**2
    net.voltage                        = 400.
    net.identical_propellers           = True

    #------------------------------------------------------------------
    # Design Electronic Speed Controller
    #------------------------------------------------------------------
    esc                          = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller()
    esc.efficiency               = 0.95
    net.esc                      = esc

    # Component 6 the Payload
    payload = SUAVE.Components.Energy.Peripherals.Payload()
    payload.power_draw           = 10. #Watts
    payload.mass_properties.mass = 0.0 * Units.kg
    net.payload                  = payload

    # Component 7 the Avionics
    avionics = SUAVE.Components.Energy.Peripherals.Avionics()
    avionics.power_draw = 20. #Watts
    net.avionics        = avionics

    #------------------------------------------------------------------
    # Design Battery
    #------------------------------------------------------------------ 
    bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion_LiNiMnCoO2_18650()   
    bat.mass_properties.mass = 200. * Units.kg  
    bat.max_voltage          = net.voltage    
    initialize_from_mass(bat)
    
    # Here we, are going to assume a battery pack module shape. This step is optional but
    # required for thermal analysis of tge pack
    number_of_modules                = 10
    bat.module_config.total          = int(np.ceil(bat.pack_config.total/number_of_modules))
    bat.module_config.normal_count   = int(np.ceil(bat.module_config.total/bat.pack_config.series))
    bat.module_config.parallel_count = int(np.ceil(bat.module_config.total/bat.pack_config.parallel))
    net.battery              = bat 

    # Component 9 Miscellaneous Systems
    sys = SUAVE.Components.Systems.System()
    sys.mass_properties.mass = 5 # kg

    #------------------------------------------------------------------
    # Nacelles
    #------------------------------------------------------------------  
    nacelle                 = SUAVE.Components.Nacelles.Nacelle()
    nacelle.diameter        = 0.2921
    nacelle.length          = 0.95 
    nacelle_origins         = [[-0.2, 1.347, 0.0], [-0.2, 3.2969999999999997, 0.0],
                               [-0.2, -1.347, 0.0], [-0.2, -3.2969999999999997, 0.0], 
                               [4.938, 1.347, 1.54], [4.938, 3.2969999999999997, 1.54],
                               [4.938, -1.347, 1.54], [4.938, -3.2969999999999997, 1.54]]
    nacelle.areas.wetted    =  np.pi*nacelle.diameter*nacelle.length + 0.5*np.pi*nacelle.diameter**2   

    for idx in range(8):
        nacelle          = deepcopy(nacelle)
        nacelle.tag      = 'nacelle_' +  str(idx)
        nacelle.origin   = [nacelle_origins[idx]] 
        vehicle.append_component(nacelle)       


    #------------------------------------------------------------------
    # Design Rotors
    #------------------------------------------------------------------
    # atmosphere conditions
    speed_of_sound               = 340

    # Create propeller geometry
    prop                          = SUAVE.Components.Energy.Converters.Propeller() # This is truly a prop because the default of the mission is pointing forward
    prop.tip_radius               = 0.8875
    prop.hub_radius               = 0.15
    prop.disc_area                = np.pi*(prop.tip_radius**2)
    prop.design_tip_mach          = 0.5
    prop.number_of_blades         = 3
    prop.freestream_velocity      = 10
    prop.angular_velocity         = prop.design_tip_mach*speed_of_sound/prop.tip_radius
    prop.design_Cl                = 0.7
    prop.design_altitude          = 500 * Units.feet
    Hover_Load                   = vehicle.mass_properties.takeoff*9.81
    prop.design_thrust            = Hover_Load/(net.number_of_propeller_engines-1) # contingency for one-engine-inoperative condition

    prop.airfoil_geometry         =  ['../Vehicles/Airfoils/NACA_4412.txt']
    prop.airfoil_polars           = [['../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_50000.txt' ,
                                     '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_100000.txt' ,
                                     '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_200000.txt' ,
                                     '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_500000.txt' ,
                                     '../Vehicles/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt' ]]
    prop.airfoil_polar_stations   = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    prop                          = propeller_design(prop)
    prop.rotation                 = 1

    # Front Rotors Locations

    origins = [[-0.2, 1.347, 0.0], [-0.2, 3.2969999999999997, 0.0], [-0.2, -1.347, 0.0], [-0.2, -3.2969999999999997, 0.0],\
               [4.938, 1.347, 1.54], [4.938, 3.2969999999999997, 1.54], [4.938, -1.347, 1.54], [4.938, -3.2969999999999997, 1.54]]

    for ii in range(8):
        rotor          = deepcopy(prop)
        rotor.tag      = 'propeller'
        rotor.origin   = [origins[ii]]
        net.propellers.append(rotor)


    # Motor
    #------------------------------------------------------------------
    # Design Motors
    #------------------------------------------------------------------
    # Propeller (Thrust) motor
    motor                      = SUAVE.Components.Energy.Converters.Motor()
    motor.efficiency           = 0.9
    motor.nominal_voltage      = bat.max_voltage *3/4
    motor.propeller_radius     = prop.tip_radius
    motor.no_load_current      = 2.0
    motor                      = size_optimal_motor(motor,prop)
    motor.mass_properties.mass = nasa_motor(motor.design_torque)
    net.motor                  = motor

    for ii in range(8):
        rotor_motor = deepcopy(motor)
        rotor_motor.tag    = 'motor'
        rotor_motor.origin = [origins[ii]]
        net.propeller_motors.append(rotor_motor)



    # Add extra drag sources from motors, props, and landing gear. All of these hand measured
    motor_height                     = .25 * Units.feet
    motor_width                      =  1.6 * Units.feet
    propeller_width                  = 1. * Units.inches
    propeller_height                 = propeller_width *.12
    main_gear_width                  = 1.5 * Units.inches
    main_gear_length                 = 2.5 * Units.feet
    nose_gear_width                  = 2. * Units.inches
    nose_gear_length                 = 2. * Units.feet
    nose_tire_height                 = (0.7 + 0.4) * Units.feet
    nose_tire_width                  = 0.4 * Units.feet
    main_tire_height                 = (0.75 + 0.5) * Units.feet
    main_tire_width                  = 4. * Units.inches
    total_excrescence_area_spin      = 12.*motor_height*motor_width + 2.* main_gear_length*main_gear_width \
                                         + nose_gear_width*nose_gear_length + 2 * main_tire_height*main_tire_width\
                                         + nose_tire_height*nose_tire_width
    total_excrescence_area_no_spin   = total_excrescence_area_spin + 12*propeller_height*propeller_width
    vehicle.excrescence_area_no_spin = total_excrescence_area_no_spin
    vehicle.excrescence_area_spin    = total_excrescence_area_spin

    # append motor origin spanwise locations onto wing data structure
    motor_origins_front                                   = np.array(origins[:4])
    motor_origins_rear                                    = np.array(origins[5:])
    vehicle.wings['canard_wing'].motor_spanwise_locations = motor_origins_front[:,1]/ vehicle.wings['canard_wing'].spans.projected
    vehicle.wings['canard_wing'].motor_spanwise_locations = motor_origins_front[:,1]/ vehicle.wings['canard_wing'].spans.projected
    vehicle.wings['main_wing'].motor_spanwise_locations   = motor_origins_rear[:,1]/ vehicle.wings['main_wing'].spans.projected

    vehicle.append_component(net)

    vehicle.weight_breakdown  = empty(vehicle)
    compute_component_centers_of_gravity(vehicle)
    vehicle.center_of_gravity()

    return vehicle