def main(): configs, analyses = full_setup() simple_sizing(configs) configs.finalize() analyses.finalize() # evaluate the weight of an electric general aviation aircraft using eVTOL weight build-up evtol_breakdown = empty(configs.base,contingency_factor=1.1) print(evtol_breakdown) # mission analysis mission = analyses.missions.base results = mission.evaluate() # save results # This should be always left uncommented to test the SUAVE's Input/Output archive functions save_results(results) # plot the results plot_results(results) # load and plot old results old_results = load_results() plot_results(old_results) # RPM of rotor check during hover RPM = results.segments.climb_1.conditions.propulsion.propeller_rpm[3][0] RPM_true = 884.7650260408985 print(RPM) diff_RPM = np.abs(RPM - RPM_true) print('RPM difference') print(diff_RPM) assert np.abs((RPM - RPM_true)/RPM_true) < 1e-3 # lift Coefficient Check During Cruise lift_coefficient = results.segments.cruise.conditions.aerodynamics.lift_coefficient[2][0] lift_coefficient_true = 0.3837615929758772 print(lift_coefficient) diff_CL = np.abs(lift_coefficient - lift_coefficient_true) print('CL difference') print(diff_CL) assert np.abs((lift_coefficient - lift_coefficient_true)/lift_coefficient_true) < 1e-3 return
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
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
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
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