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
Esempio n. 2
0
def vehicle_setup():

    # ------------------------------------------------------------------
    #   Initialize the Vehicle
    # ------------------------------------------------------------------
    vehicle = SUAVE.Vehicle()
    vehicle.tag = 'Vahana'
    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.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.span_efficiency = 0.9
    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.0, 0.0, 0.0]
    wing.aerodynamic_center = [0., 0., 0.]
    wing.winglet_fraction = 0.0
    wing.symmetric = True

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_1'
    segment.origin = [0., 0., 0.]
    segment.percent_span_location = 0.
    segment.twist = 0.
    segment.root_chord_percent = 1.
    segment.dihedral_outboard = 0.
    segment.sweeps.quarter_chord = 0.
    segment.thickness_to_chord = 0.18
    wing.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_2'
    segment.origin = [0., 0., 0.]
    segment.percent_span_location = 1.
    segment.twist = 0.
    segment.root_chord_percent = 1.
    segment.dihedral_outboard = 0.
    segment.sweeps.quarter_chord = 0.
    segment.thickness_to_chord = 0.18
    wing.Segments.append(segment)

    # 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.span_efficiency = 0.9
    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.24]
    wing.aerodynamic_center = [0., 0., 0.]
    wing.winglet_fraction = 0.0
    wing.symmetric = True

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_1'
    segment.origin = [0., 0., 0.]
    segment.percent_span_location = 0.
    segment.twist = 0.
    segment.root_chord_percent = 1.
    segment.dihedral_outboard = 0.
    segment.sweeps.quarter_chord = 0.
    segment.thickness_to_chord = 0.18
    wing.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Wings.Segment()
    segment.tag = 'Section_2'
    segment.origin = [0., 0., 0.]
    segment.percent_span_location = 1.
    segment.twist = 0.
    segment.root_chord_percent = 1.
    segment.dihedral_outboard = 0.
    segment.sweeps.quarter_chord = 0.
    segment.thickness_to_chord = 0.18
    wing.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(wing)

    # ------------------------------------------------------
    # FUSELAGE
    # ------------------------------------------------------
    # FUSELAGE PROPERTIES
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.origin = [0., 0., 0.]
    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_1'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.
    segment.percent_z_location = 0.
    segment.height = 0.
    segment.width = 0.
    segment.length = 0.
    segment.effective_diameter = 0.
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_2'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.275
    segment.percent_z_location = -0.009
    segment.height = 0.309 * 2
    segment.width = 0.28 * 2
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_3'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.768
    segment.percent_z_location = 0.046
    segment.height = 0.525 * 2
    segment.width = 0.445 * 2
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_4'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.25 * 6.2
    segment.percent_z_location = 0.209
    segment.height = 0.7 * 2
    segment.width = 0.55 * 2
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_5'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.5 * 6.2
    segment.percent_z_location = 0.407
    segment.height = 0.850 * 2
    segment.width = 0.61 * 2
    segment.effective_diameter = 0.
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_6'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 0.75
    segment.percent_z_location = 0.771
    segment.height = 0.63 * 2
    segment.width = 0.442 * 2
    fuselage.Segments.append(segment)

    # Segment
    segment = SUAVE.Components.Fuselages.Segment()
    segment.tag = 'segment_7'
    segment.origin = [0., 0., 0.]
    segment.percent_x_location = 1. * 6.2
    segment.percent_z_location = 1.192
    segment.height = 0.165 * 2
    segment.width = 0.125 * 2
    fuselage.Segments.append(segment)

    # add to vehicle
    vehicle.append_component(fuselage)

    #------------------------------------------------------------------
    # PROPULSOR
    #------------------------------------------------------------------
    net = Vectored_Thrust()
    net.number_of_engines = 8
    net.thrust_angle = 90.0 * Units.degrees  #  conversion to radians,
    net.nacelle_diameter = 0.2921  # https://www.magicall.biz/products/integrated-motor-controller-magidrive/
    net.engine_length = 0.106
    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 = 300. * Units.Wh / Units.kg
    bat.resistance = 0.005
    bat.max_voltage = net.voltage
    bat.mass_properties.mass = 350. * Units.kg
    initialize_from_mass(bat, bat.mass_properties.mass)
    net.battery = bat

    #------------------------------------------------------------------
    # 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.1
    rot.disc_area = np.pi * (rot.tip_radius**2)
    rot.design_tip_mach = 0.5
    rot.number_blades = 3
    rot.freestream_velocity = 85. * Units['ft/min']  # 110 mph
    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 = propeller_design(rot)

    # Front Rotors Locations
    rot_front = Data()
    rot_front.origin = [[0.0, 1.347, 0.0]]
    rot_front.symmetric = True
    rot_front.x_pitch_count = 1
    rot_front.y_pitch_count = 2
    rot_front.y_pitch = 1.85

    # 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 = [[0.0, 1.347, 1.24]]
    rot_rear.symmetric = True
    rot_rear.x_pitch_count = 1
    rot_rear.y_pitch_count = 2
    rot_rear.y_pitch = 1.85
    # 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.mass_properties.mass = 9. * Units.kg
    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 = compute_optimal_motor_parameters(motor, rot)
    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)

    vehicle.wings['canard_wing'].motor_spanwise_locations = np.multiply(
        0.19, motor_origins_front[:, 1])
    motor_origins_rear = np.array(rot_rear.origin)
    vehicle.wings['main_wing'].motor_spanwise_locations = np.multiply(
        0.19, motor_origins_rear[:, 1])

    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