示例#1
0
def weight(nexus):
    vehicle = nexus.vehicle_configurations.base

    # weight analysis
    weights = nexus.analyses.base.weights.evaluate()

    # print "nexus_rest"
    compute_component_centers_of_gravity(vehicle)
    nose_load_fraction = .06
    compute_aircraft_center_of_gravity(vehicle, nose_load_fraction)

    weights = nexus.analyses.cruise.weights.evaluate()
    # print weights # FIXME
    weights = nexus.analyses.landing.weights.evaluate()
    # print weights
    weights = nexus.analyses.takeoff.weights.evaluate()
#    weights = nexus.analyses.short_field_takeoff.weights.evaluate()

    empty_weight = vehicle.mass_properties.operating_empty

    passenger_weight = 0

    for config in nexus.vehicle_configurations:
        # config.mass_properties.max_zero_fuel                = empty_weight+passenger_weight
        config.mass_properties.zero_fuel_center_of_gravity = vehicle.mass_properties.zero_fuel_center_of_gravity
        config.fuel = vehicle.fuel

    return nexus
示例#2
0
def weight(nexus):
    vehicle = nexus.vehicle_configurations.base

    # weight analysis
    weights = nexus.analyses.base.weights.evaluate()

    # print "nexus_rest"
    compute_component_centers_of_gravity(vehicle)
    nose_load_fraction = .06
    compute_aircraft_center_of_gravity(vehicle, nose_load_fraction)

    weights = nexus.analyses.cruise.weights.evaluate()
    # print weights # FIXME
    weights = nexus.analyses.landing.weights.evaluate()
    # print weights
    weights = nexus.analyses.takeoff.weights.evaluate()
    #    weights = nexus.analyses.short_field_takeoff.weights.evaluate()

    empty_weight = vehicle.mass_properties.operating_empty

    passenger_weight = 0

    for config in nexus.vehicle_configurations:
        # config.mass_properties.max_zero_fuel                = empty_weight+passenger_weight
        config.mass_properties.zero_fuel_center_of_gravity = vehicle.mass_properties.zero_fuel_center_of_gravity
        config.fuel = vehicle.fuel

    return nexus
示例#3
0
def simple_sizing(configs, analyses):

    base = configs.base
    base.pull_base()

    # zero fuel weight
    base.mass_properties.max_zero_fuel = 0.9 * base.mass_properties.max_takeoff 

    # wing areas
    for wing in base.wings:
        wing.areas.wetted   = 2.0 * wing.areas.reference
        wing.areas.exposed  = 0.8 * wing.areas.wetted
        wing.areas.affected = 0.6 * wing.areas.wetted

    # fuselage seats
    base.fuselages['fuselage'].number_coach_seats = base.passengers
    
    # weight analysis
    #need to put here, otherwise it won't be updated
    weights = analyses.configs.base.weights
    breakdown = weights.evaluate()    
    
    
    #compute centers of gravity
    #need to put here, otherwise, results won't be stored
    compute_component_centers_of_gravity(base,compute_propulsor_origin=True)
    compute_aircraft_center_of_gravity(base)
    
    # diff the new data
    base.store_diff()

    # ------------------------------------------------------------------
    #   Landing Configuration
    # ------------------------------------------------------------------
    landing = configs.landing

    # make sure base data is current
    landing.pull_base()

    # landing weight
    landing.mass_properties.landing = 0.85 * base.mass_properties.takeoff

    # diff the new data
    landing.store_diff()

    # done!
    return
示例#4
0
def weight(nexus):
    vehicle = nexus.vehicle_configurations.base

    # weight analysis
    weights = nexus.analyses.base.weights.evaluate()

    nose_load_fraction = .06
    compute_component_centers_of_gravity(vehicle, nose_load_fraction)
    vehicle.center_of_gravity()

    weights = nexus.analyses.cruise.weights.evaluate()
    weights = nexus.analyses.landing.weights.evaluate()
    weights = nexus.analyses.takeoff.weights.evaluate()
    weights = nexus.analyses.short_field_takeoff.weights.evaluate()

    empty_weight = vehicle.mass_properties.operating_empty
    for config in nexus.vehicle_configurations:
        config.mass_properties.zero_fuel_center_of_gravity = vehicle.mass_properties.zero_fuel_center_of_gravity
        config.fuel = vehicle.fuel
    return nexus
示例#5
0
def vehicle_setup():

    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle = SUAVE.Vehicle()
    vehicle.tag = 'Lift_Cruise_CRM'
    vehicle.configuration = 'eVTOL'

    # ------------------------------------------------------------------
    #   Vehicle-level Properties
    # ------------------------------------------------------------------
    # mass properties
    vehicle.mass_properties.takeoff = 2450. * Units.lb
    vehicle.mass_properties.operating_empty = 2250. * Units.lb  # Approximate
    vehicle.mass_properties.max_takeoff = 2450. * Units.lb  # Approximate
    vehicle.mass_properties.max_payload = 200. * Units.lb
    vehicle.mass_properties.center_of_gravity = [[2.0144, 0.,
                                                  0.]]  # Approximate

    # basic parameters
    vehicle.reference_area = 10.76
    vehicle.envelope.ultimate_load = 5.7
    vehicle.envelope.limit_load = 3.

    # ------------------------------------------------------------------
    # WINGS
    # ------------------------------------------------------------------
    # WING PROPERTIES
    wing = SUAVE.Components.Wings.Main_Wing()
    wing.tag = 'main_wing'
    wing.aspect_ratio = 10.76
    wing.sweeps.quarter_chord = 0.0 * Units.degrees
    wing.thickness_to_chord = 0.18
    wing.taper = 1.
    wing.spans.projected = 35.0 * Units.feet
    wing.chords.root = 3.25 * Units.feet
    wing.total_length = 3.25 * Units.feet
    wing.chords.tip = 3.25 * Units.feet
    wing.chords.mean_aerodynamic = 3.25 * Units.feet
    wing.dihedral = 1.0 * Units.degrees
    wing.areas.reference = 113.75 * Units.feet**2
    wing.areas.wetted = 227.5 * Units.feet**2
    wing.areas.exposed = 227.5 * Units.feet**2
    wing.twists.root = 4.0 * Units.degrees
    wing.twists.tip = 0.0 * Units.degrees
    wing.origin = [[1.5, 0., 0.]]
    wing.aerodynamic_center = [1.975, 0., 0.]
    wing.winglet_fraction = 0.0
    wing.symmetric = True
    wing.vertical = False

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_1'
    segment.percent_span_location = 0.
    segment.twist = 0.
    segment.root_chord_percent = 1.5
    segment.dihedral_outboard = 1.0 * Units.degrees
    segment.sweeps.quarter_chord = 8.5 * Units.degrees
    segment.thickness_to_chord = 0.18
    wing.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_2'
    segment.percent_span_location = 0.227
    segment.twist = 0.
    segment.root_chord_percent = 1.
    segment.dihedral_outboard = 1.0 * Units.degrees
    segment.sweeps.quarter_chord = 0.0 * Units.degrees
    segment.thickness_to_chord = 0.12
    wing.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_3'
    segment.percent_span_location = 1.0
    segment.twist = 0.
    segment.root_chord_percent = 1.0
    segment.dihedral_outboard = 1.0 * Units.degrees
    segment.sweeps.quarter_chord = 0.0 * Units.degrees
    segment.thickness_to_chord = 0.12
    wing.Segments.append(segment)

    # Fill out more segment properties automatically
    wing = wing_segmented_planform(wing)

    # add to vehicle
    vehicle.append_component(wing)

    # WING PROPERTIES
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_tail'
    wing.aspect_ratio = 4.0
    wing.sweeps.quarter_chord = 0.0
    wing.thickness_to_chord = 0.12
    wing.taper = 1.0
    wing.spans.projected = 8.0 * Units.feet
    wing.chords.root = 2.0 * Units.feet
    wing.total_length = 2.0 * Units.feet
    wing.chords.tip = 2.0 * Units.feet
    wing.chords.mean_aerodynamic = 2.0 * Units.feet
    wing.dihedral = 0. * Units.degrees
    wing.areas.reference = 16.0 * Units.feet**2
    wing.areas.wetted = 32.0 * Units.feet**2
    wing.areas.exposed = 32.0 * Units.feet**2
    wing.twists.root = 0. * Units.degrees
    wing.twists.tip = 0. * Units.degrees
    wing.origin = [[4.0, 0.0, 0.205]]
    wing.aerodynamic_center = [4.2, 0., 0.]
    wing.symmetric = True

    # add to vehicle
    vehicle.append_component(wing)

    # WING PROPERTIES
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'vertical_tail_1'
    wing.aspect_ratio = 2.
    wing.sweeps.quarter_chord = 20.0 * Units.degrees
    wing.thickness_to_chord = 0.12
    wing.taper = 0.5
    wing.spans.projected = 3.0 * Units.feet
    wing.chords.root = 2.0 * Units.feet
    wing.total_length = 2.0 * Units.feet
    wing.chords.tip = 1.0 * Units.feet
    wing.chords.mean_aerodynamic = 1.5 * Units.feet
    wing.areas.reference = 4.5 * Units.feet**2
    wing.areas.wetted = 9.0 * Units.feet**2
    wing.areas.exposed = 9.0 * Units.feet**2
    wing.twists.root = 0. * Units.degrees
    wing.twists.tip = 0. * Units.degrees
    wing.origin = [[4.0, 4.0 * 0.3048, 0.205]]
    wing.aerodynamic_center = [4.2, 0, 0]
    wing.winglet_fraction = 0.0
    wing.vertical = True
    wing.symmetric = False

    # add to vehicle
    vehicle.append_component(wing)

    # WING PROPERTIES
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'vertical_tail_2'
    wing.aspect_ratio = 2.
    wing.sweeps.quarter_chord = 20.0 * Units.degrees
    wing.thickness_to_chord = 0.12
    wing.taper = 0.5
    wing.spans.projected = 3.0 * Units.feet
    wing.chords.root = 2.0 * Units.feet
    wing.total_length = 2.0 * Units.feet
    wing.chords.tip = 1.0 * Units.feet
    wing.chords.mean_aerodynamic = 1.5 * Units.feet
    wing.areas.reference = 4.5 * Units.feet**2
    wing.areas.wetted = 9.0 * Units.feet**2
    wing.areas.exposed = 9.0 * Units.feet**2
    wing.twists.root = 0.0 * Units.degrees
    wing.twists.tip = 0.0 * Units.degrees
    wing.origin = [[4.0, -4.0 * 0.3048, 0.205]]
    wing.aerodynamic_center = [4.2, 0, 0]
    wing.winglet_fraction = 0.0
    wing.vertical = True
    wing.symmetric = False

    # add to vehicle
    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 = 5.1
    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_0'
    segment.percent_x_location = 0.
    segment.percent_z_location = -0.267 / 4.10534
    segment.height = 0.1
    segment.width = 0.1
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_1'
    segment.percent_x_location = 0.2579 / 4.10534
    segment.percent_z_location = -0.05881 / 1.372
    segment.height = 0.5201
    segment.width = 0.75
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_2'
    segment.percent_x_location = 0.9939 / 4.10534
    segment.percent_z_location = -0.0446 / 4.10534
    segment.height = 1.18940
    segment.width = 1.42045
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_3'
    segment.percent_x_location = 1.95060 / 4.10534
    segment.percent_z_location = 0
    segment.height = 1.37248
    segment.width = 1.35312
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_4'
    segment.percent_x_location = 3.02797 / 4.10534
    segment.percent_z_location = 0.25 / 4.10534
    segment.height = 0.6
    segment.width = 0.4
    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 = 0.42522 / 4.10534
    segment.height = 0.05
    segment.width = 0.05
    fuselage.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(fuselage)

    #-------------------------------------------------------------------
    # INNER BOOMS
    #-------------------------------------------------------------------
    long_boom = SUAVE.Components.Fuselages.Fuselage()
    long_boom.tag = 'boom_1r'
    long_boom.configuration = 'boom'
    long_boom.origin = [[0.543, 1.630, -0.326]]
    long_boom.seats_abreast = 0.
    long_boom.seat_pitch = 0.0
    long_boom.fineness.nose = 0.950
    long_boom.fineness.tail = 1.029
    long_boom.lengths.nose = 0.2
    long_boom.lengths.tail = 0.2
    long_boom.lengths.cabin = 2.5
    long_boom.lengths.total = 3.5
    long_boom.width = 0.15
    long_boom.heights.maximum = 0.15
    long_boom.heights.at_quarter_length = 0.15
    long_boom.heights.at_three_quarters_length = 0.15
    long_boom.heights.at_wing_root_quarter_chord = 0.15
    long_boom.areas.wetted = 0.018
    long_boom.areas.front_projected = 0.018
    long_boom.effective_diameter = 0.15
    long_boom.differential_pressure = 0.
    long_boom.symmetric = True
    long_boom.index = 1

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_1'
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.0
    segment.height = 0.05
    segment.width = 0.05
    long_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_2'
    segment.percent_x_location = 0.2 / 5.6
    segment.percent_z_location = 0.
    segment.height = 0.15
    segment.width = 0.15
    long_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_3'
    segment.percent_x_location = 5.4 / 5.6
    segment.percent_z_location = 0.
    segment.height = 0.15
    segment.width = 0.15
    long_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_4'
    segment.percent_x_location = 1.
    segment.percent_z_location = 0.
    segment.height = 0.05
    segment.width = 0.05
    long_boom.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(long_boom)

    # add left long boom
    long_boom = deepcopy(vehicle.fuselages.boom_1r)
    long_boom.origin[0][1] = -long_boom.origin[0][1]
    long_boom.tag = 'Boom_1L'
    long_boom.index = 1
    vehicle.append_component(long_boom)

    #-------------------------------------------------------------------
    # OUTER BOOMS
    #-------------------------------------------------------------------
    short_boom = SUAVE.Components.Fuselages.Fuselage()
    short_boom.tag = 'boom_2r'
    short_boom.configuration = 'boom'
    short_boom.origin = [[0.543, 2.826, -0.326]]
    short_boom.seats_abreast = 0.
    short_boom.seat_pitch = 0.0
    short_boom.fineness.nose = 0.950
    short_boom.fineness.tail = 1.029
    short_boom.lengths.nose = 0.2
    short_boom.lengths.tail = 0.2
    short_boom.lengths.cabin = 2.0
    short_boom.lengths.total = 3.3
    short_boom.width = 0.15
    short_boom.heights.maximum = 0.15
    short_boom.heights.at_quarter_length = 0.15
    short_boom.heights.at_three_quarters_length = 0.15
    short_boom.heights.at_wing_root_quarter_chord = 0.15
    short_boom.areas.wetted = 0.018
    short_boom.areas.front_projected = 0.018
    short_boom.effective_diameter = 0.15
    short_boom.differential_pressure = 0.
    short_boom.y_pitch_count = 2
    short_boom.y_pitch = 1.196
    short_boom.symmetric = True
    short_boom.index = 1

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_1'
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.0
    segment.height = 0.05
    segment.width = 0.05
    short_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_2'
    segment.percent_x_location = 0.2 / 3.3
    segment.percent_z_location = 0.
    segment.height = 0.15
    segment.width = 0.15
    short_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_3'
    segment.percent_x_location = 3.1 / 3.3
    segment.percent_z_location = 0.
    segment.height = 0.15
    segment.width = 0.15
    short_boom.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    segment.tag = 'segment_4'
    segment.percent_x_location = 1.
    segment.percent_z_location = 0.
    segment.height = 0.05
    segment.width = 0.05
    short_boom.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(short_boom)

    # add outer right boom
    short_boom = deepcopy(vehicle.fuselages.boom_2r)
    short_boom.origin[0][1] = short_boom.y_pitch + short_boom.origin[0][1]
    short_boom.tag = 'boom_3r'
    short_boom.index = 1
    vehicle.append_component(short_boom)

    # add inner left boom
    short_boom = deepcopy(vehicle.fuselages.boom_2r)
    short_boom.origin[0][1] = -(short_boom.origin[0][1])
    short_boom.tag = 'boom_2l'
    short_boom.index = 1
    vehicle.append_component(short_boom)

    short_boom = deepcopy(vehicle.fuselages.boom_2r)
    short_boom.origin[0][1] = -(short_boom.origin[0][1] + short_boom.y_pitch)
    short_boom.tag = 'boom_3l'
    short_boom.index = 1
    vehicle.append_component(short_boom)

    #------------------------------------------------------------------
    # Nacelles
    #------------------------------------------------------------------
    rotor_nacelle = SUAVE.Components.Nacelles.Nacelle()
    rotor_nacelle.tag = 'rotor_nacelle'
    rotor_nacelle_origins = [[0.543, 1.63, -0.126], [0.543, -1.63, -0.126],
                             [3.843, 1.63, -0.126], [3.843, -1.63, -0.126],
                             [0.543, 2.826, -0.126], [0.543, -2.826, -0.126],
                             [3.843, 2.826, -0.126], [3.843, -2.826, -0.126],
                             [0.543, 4.022, -0.126], [0.543, -4.022, -0.126],
                             [3.843, 4.022, -0.126], [3.843, -4.022, -0.126]]
    rotor_nacelle.length = 0.25
    rotor_nacelle.diameter = 0.25
    rotor_nacelle.orientation_euler_angles = [0, -90 * Units.degrees, 0.]
    rotor_nacelle.flow_through = False

    nac_segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    nac_segment.tag = 'segment_1'
    nac_segment.percent_x_location = 0.0
    nac_segment.height = 0.2
    nac_segment.width = 0.2
    rotor_nacelle.append_segment(nac_segment)

    nac_segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    nac_segment.tag = 'segment_2'
    nac_segment.percent_x_location = 0.25
    nac_segment.height = 0.25
    nac_segment.width = 0.25
    rotor_nacelle.append_segment(nac_segment)

    nac_segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    nac_segment.tag = 'segment_3'
    nac_segment.percent_x_location = 0.5
    nac_segment.height = 0.3
    nac_segment.width = 0.3
    rotor_nacelle.append_segment(nac_segment)

    nac_segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    nac_segment.tag = 'segment_4'
    nac_segment.percent_x_location = 0.75
    nac_segment.height = 0.25
    nac_segment.width = 0.25
    rotor_nacelle.append_segment(nac_segment)

    nac_segment = SUAVE.Components.Lofted_Body_Segment.Segment()
    nac_segment.tag = 'segment_5'
    nac_segment.percent_x_location = 1.0
    nac_segment.height = 0.2
    nac_segment.width = 0.2
    rotor_nacelle.append_segment(nac_segment)

    rotor_nacelle.areas.wetted = np.pi * rotor_nacelle.diameter * rotor_nacelle.length + 0.5 * np.pi * rotor_nacelle.diameter**2

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

    #------------------------------------------------------------------
    # network
    #------------------------------------------------------------------
    net = Lift_Cruise()
    net.number_of_lift_rotor_engines = 12
    net.number_of_propeller_engines = 1
    net.nacelle_diameter = 0.6 * Units.feet
    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
    #------------------------------------------------------------------
    lift_rotor_esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller(
    )
    lift_rotor_esc.efficiency = 0.95
    net.lift_rotor_esc = lift_rotor_esc

    propeller_esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller(
    )
    propeller_esc.efficiency = 0.95
    net.propeller_esc = propeller_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 = 500. * 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

    #------------------------------------------------------------------
    # Design Rotors and Propellers
    #------------------------------------------------------------------
    # atmosphere and flight conditions for propeller/rotor design
    g = 9.81  # gravitational acceleration
    S = vehicle.reference_area  # reference area
    speed_of_sound = 340  # speed of sound
    rho = 1.22  # reference density
    fligth_CL = 0.75  # cruise target lift coefficient
    AR = vehicle.wings.main_wing.aspect_ratio  # aspect ratio
    Cd0 = 0.06  # profile drag
    Cdi = fligth_CL**2 / (np.pi * AR * 0.98)  # induced drag
    Cd = Cd0 + Cdi  # total drag
    V_inf = 110. * Units['mph']  # freestream velocity
    Drag = S * (0.5 * rho * V_inf**2) * Cd  # cruise drag
    Hover_Load = vehicle.mass_properties.takeoff * g  # hover load
    net.identical_propellers = True
    net.identical_lift_rotors = True

    # Thrust Propeller
    propeller = SUAVE.Components.Energy.Converters.Propeller()
    propeller.number_of_blades = 3
    propeller.freestream_velocity = V_inf
    propeller.tip_radius = 1.0668
    propeller.hub_radius = 0.21336
    propeller.design_tip_mach = 0.5
    propeller.angular_velocity = propeller.design_tip_mach * speed_of_sound / propeller.tip_radius
    propeller.design_Cl = 0.7
    propeller.design_altitude = 1000 * Units.feet
    propeller.design_thrust = (Drag * 2.5) / net.number_of_propeller_engines
    propeller.variable_pitch = True

    propeller.airfoil_geometry = ['../Vehicles/Airfoils/NACA_4412.txt']
    propeller.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'
    ]]

    propeller.airfoil_polar_stations = [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ]
    propeller = propeller_design(propeller,
                                 number_of_airfoil_section_points=50)
    propeller.origin = [[16. * 0.3048, 0., 2.02 * 0.3048]]
    net.propellers.append(propeller)

    # Lift Rotors
    lift_rotor = SUAVE.Components.Energy.Converters.Lift_Rotor()
    lift_rotor.tip_radius = 2.8 * Units.feet
    lift_rotor.hub_radius = 0.35 * Units.feet
    lift_rotor.number_of_blades = 2
    lift_rotor.design_tip_mach = 0.65
    lift_rotor.disc_area = np.pi * (lift_rotor.tip_radius**2)
    lift_rotor.freestream_velocity = 500. * Units['ft/min']
    lift_rotor.angular_velocity = lift_rotor.design_tip_mach * speed_of_sound / lift_rotor.tip_radius
    lift_rotor.design_Cl = 0.7
    lift_rotor.design_altitude = 20 * Units.feet
    lift_rotor.design_thrust = Hover_Load / (
        net.number_of_lift_rotor_engines - 1
    )  # contingency for one-engine-inoperative condition
    lift_rotor.variable_pitch = True

    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
    rotations = [1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1]
    origins = [[0.543, 1.63, -0.126], [0.543, -1.63, -0.126],
               [3.843, 1.63, -0.126], [3.843, -1.63, -0.126],
               [0.543, 2.826, -0.126], [0.543, -2.826, -0.126],
               [3.843, 2.826, -0.126], [3.843, -2.826, -0.126],
               [0.543, 4.022, -0.126], [0.543, -4.022, -0.126],
               [3.843, 4.022, -0.126], [3.843, -4.022, -0.126]]

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

    net.number_of_lift_rotor_engines = 12

    # append propellers to vehicle
    net.lift_rotor = lift_rotor

    #------------------------------------------------------------------
    # Design Motors
    #------------------------------------------------------------------
    # Propeller (Thrust) motor
    propeller_motor = SUAVE.Components.Energy.Converters.Motor()
    propeller_motor.efficiency = 0.95
    propeller_motor.nominal_voltage = bat.max_voltage
    propeller_motor.mass_properties.mass = 2.0 * Units.kg
    propeller_motor.origin = propeller.origin
    propeller_motor.propeller_radius = propeller.tip_radius
    propeller_motor.no_load_current = 2.0
    propeller_motor = size_optimal_motor(propeller_motor, propeller)
    net.propeller_motors.append(propeller_motor)

    # Rotor (Lift) Motor
    lift_rotor_motor = SUAVE.Components.Energy.Converters.Motor()
    lift_rotor_motor.efficiency = 0.85
    lift_rotor_motor.nominal_voltage = bat.max_voltage * 3 / 4
    lift_rotor_motor.mass_properties.mass = 3. * Units.kg
    lift_rotor_motor.origin = lift_rotor.origin
    lift_rotor_motor.propeller_radius = lift_rotor.tip_radius
    lift_rotor_motor.gearbox_efficiency = 1.0
    lift_rotor_motor.no_load_current = 4.0
    lift_rotor_motor = size_optimal_motor(lift_rotor_motor, lift_rotor)

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

    # append motor origin spanwise locations onto wing data structure
    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

    vehicle.wings['main_wing'].motor_spanwise_locations = np.multiply(
        2. / 36.25, [
            -5.435, -5.435, -9.891, -9.891, -14.157, -14.157, 5.435, 5.435,
            9.891, 9.891, 14.157, 14.157
        ])

    vehicle.wings['main_wing'].winglet_fraction = 0.0
    vehicle.wings['main_wing'].thickness_to_chord = 0.18
    vehicle.wings['main_wing'].chords.mean_aerodynamic = 0.9644599977664836

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

    return vehicle
示例#6
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
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
示例#8
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
示例#9
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
    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.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_of_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.airfoil_geometry = ['../Vehicles/Airfoils/NACA_4412.txt']
    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'
    ]]

    rotor.airfoil_polar_stations = [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ]
    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)
    compute_component_centers_of_gravity(vehicle)
    vehicle.center_of_gravity()

    return vehicle