def vehicle_setup(): # ------------------------------------------------------------------ # Initialize the Vehicle # ------------------------------------------------------------------ vehicle = SUAVE.Vehicle() vehicle.tag = 'multicopter' vehicle.configuration = 'eVTOL' # ------------------------------------------------------------------ # Vehicle-level Properties # ------------------------------------------------------------------ # mass properties vehicle.mass_properties.takeoff = 2080. * Units.lb vehicle.mass_properties.operating_empty = 1666. * Units.lb vehicle.mass_properties.max_takeoff = 2080. * Units.lb vehicle.mass_properties.center_of_gravity = [2.6, 0., 0.] # This needs updating vehicle.passengers = 5 vehicle.reference_area = 73 * Units.feet**2 vehicle.envelope.ultimate_load = 5.7 vehicle.envelope.limit_load = 3. wing = SUAVE.Components.Wings.Main_Wing() wing.tag = 'main_wing' wing.aspect_ratio = 1 wing.spans.projected = 0.01 vehicle.append_component(wing) # ------------------------------------------------------ # FUSELAGE # ------------------------------------------------------ # FUSELAGE PROPERTIES fuselage = SUAVE.Components.Fuselages.Fuselage() fuselage.tag = 'fuselage' fuselage.configuration = 'Tube_Wing' fuselage.seats_abreast = 2. fuselage.seat_pitch = 3. fuselage.fineness.nose = 0.88 fuselage.fineness.tail = 1.13 fuselage.lengths.nose = 3.2 * Units.feet fuselage.lengths.tail = 6.4 * Units.feet fuselage.lengths.cabin = 6.4 * Units.feet fuselage.lengths.total = 16.0 * Units.feet fuselage.width = 5.85 * Units.feet fuselage.heights.maximum = 4.65 * Units.feet fuselage.heights.at_quarter_length = 3.75 * Units.feet fuselage.heights.at_wing_root_quarter_chord = 4.65 * Units.feet fuselage.heights.at_three_quarters_length = 4.26 * Units.feet fuselage.areas.wetted = 236. * Units.feet**2 fuselage.areas.front_projected = 0.14 * Units.feet**2 fuselage.effective_diameter = 5.85 * Units.feet fuselage.differential_pressure = 0. # Segment segment = SUAVE.Components.Fuselages.Segment() segment.tag = 'segment_1' segment.origin = [0., 0., 0.] segment.percent_x_location = 0. segment.percent_z_location = 0.0 segment.height = 0.1 * Units.feet segment.width = 0.1 * Units.feet segment.length = 0. segment.effective_diameter = 0.1 * Units.feet fuselage.append_segment(segment) # Segment segment = SUAVE.Components.Fuselages.Segment() segment.tag = 'segment_2' segment.origin = [4. * 0.3048, 0., 0.1 * 0.3048] segment.percent_x_location = 0.25 segment.percent_z_location = 0.05 segment.height = 3.75 * Units.feet segment.width = 5.65 * Units.feet segment.length = 3.2 * Units.feet segment.effective_diameter = 5.65 * Units.feet fuselage.append_segment(segment) # Segment segment = SUAVE.Components.Fuselages.Segment() segment.tag = 'segment_3' segment.origin = [8. * 0.3048, 0., 0.34 * 0.3048] segment.percent_x_location = 0.5 segment.percent_z_location = 0.071 segment.height = 4.65 * Units.feet segment.width = 5.55 * Units.feet segment.length = 3.2 * Units.feet segment.effective_diameter = 5.55 * Units.feet fuselage.append_segment(segment) # Segment segment = SUAVE.Components.Fuselages.Segment() segment.tag = 'segment_4' segment.origin = [12. * 0.3048, 0., 0.77 * 0.3048] segment.percent_x_location = 0.75 segment.percent_z_location = 0.089 segment.height = 4.73 * Units.feet segment.width = 4.26 * Units.feet segment.length = 3.2 * Units.feet segment.effective_diameter = 4.26 * Units.feet fuselage.append_segment(segment) # Segment segment = SUAVE.Components.Fuselages.Segment() segment.tag = 'segment_5' segment.origin = [16. * 0.3048, 0., 2.02 * 0.3048] segment.percent_x_location = 1.0 segment.percent_z_location = 0.158 segment.height = 0.67 * Units.feet segment.width = 0.33 * Units.feet segment.length = 3.2 * Units.feet segment.effective_diameter = 0.33 * Units.feet fuselage.append_segment(segment) # add to vehicle vehicle.append_component(fuselage) #------------------------------------------------------------------ # PROPULSOR #------------------------------------------------------------------ net = Vectored_Thrust() net.number_of_engines = 6 net.thrust_angle = 90. * Units.degrees net.nacelle_diameter = 0.6 * Units.feet # need to check net.engine_length = 0.5 * Units.feet net.areas = Data() net.areas.wetted = np.pi * net.nacelle_diameter * net.engine_length + 0.5 * np.pi * net.nacelle_diameter**2 net.voltage = 500. #------------------------------------------------------------------ # Design Electronic Speed Controller #------------------------------------------------------------------ esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller() esc.efficiency = 0.95 net.esc = esc #------------------------------------------------------------------ # Design Payload #------------------------------------------------------------------ payload = SUAVE.Components.Energy.Peripherals.Avionics() payload.power_draw = 0. payload.mass_properties.mass = 200. * Units.kg net.payload = payload #------------------------------------------------------------------ # Design Avionics #------------------------------------------------------------------ avionics = SUAVE.Components.Energy.Peripherals.Avionics() avionics.power_draw = 200. * Units.watts net.avionics = avionics #------------------------------------------------------------------ # Design Battery #------------------------------------------------------------------ bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion( ) bat.specific_energy = 350. * Units.Wh / Units.kg bat.resistance = 0.005 bat.max_voltage = net.voltage bat.mass_properties.mass = 300. * Units.kg initialize_from_mass(bat, bat.mass_properties.mass) net.battery = bat #------------------------------------------------------------------ # Design Rotors #------------------------------------------------------------------ # atmosphere and flight conditions for propeller/rotor design g = 9.81 # gravitational acceleration speed_of_sound = 340 # speed of sound rho = 1.22 # reference density Hover_Load = vehicle.mass_properties.takeoff * g # hover load design_tip_mach = 0.7 # design tip mach number rotor = SUAVE.Components.Energy.Converters.Rotor() rotor.tip_radius = 3.95 * Units.feet rotor.hub_radius = 0.6 * Units.feet rotor.disc_area = np.pi * (rotor.tip_radius**2) rotor.number_blades = 3 rotor.freestream_velocity = 500. * Units['ft/min'] rotor.angular_velocity = (design_tip_mach * speed_of_sound) / rotor.tip_radius rotor.design_Cl = 0.8 rotor.design_altitude = 1000 * Units.feet rotor.design_thrust = (Hover_Load / net.number_of_engines) * 2. rotor = propeller_design(rotor) rotor.induced_hover_velocity = np.sqrt( Hover_Load / (2 * rho * rotor.disc_area * net.number_of_engines)) # propulating propellers on the other side of the vehicle rotor.origin = [] for fuselage in vehicle.fuselages: if fuselage.tag == 'fuselage': continue else: rotor.origin.append(fuselage.origin[0]) # append propellers to vehicle net.rotor = rotor #------------------------------------------------------------------ # Design Motors #------------------------------------------------------------------ # Motor motor = SUAVE.Components.Energy.Converters.Motor() motor.efficiency = 0.95 motor.nominal_voltage = bat.max_voltage motor.mass_properties.mass = 3. * Units.kg motor.origin = rotor.origin motor.propeller_radius = rotor.tip_radius motor.gear_ratio = 1.0 motor.gearbox_efficiency = 1.0 motor.no_load_current = 4.0 motor = size_optimal_motor(motor, rotor) net.motor = motor # Define motor sizing parameters max_power = rotor.design_power * 1.2 max_torque = rotor.design_torque * 1.2 # test high temperature superconducting motor weight function mass = hts_motor(max_power) # test NDARC motor weight function mass = nasa_motor(max_torque) # test air cooled motor weight function mass = air_cooled_motor(max_power) motor.mass_properties.mass = mass net.motor = motor vehicle.append_component(net) vehicle.weight_breakdown = empty(vehicle, None) return vehicle
def vehicle_setup(): # ------------------------------------------------------------------ # Initialize the Vehicle # ------------------------------------------------------------------ vehicle = SUAVE.Vehicle() vehicle.tag = '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
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