# ============================================================================= # MADETOOL - Product Requirements Document (PRD) format 1.4 # ============================================================================= # INTEGRATION TEST FIXTURE: piston-propeller, runway take-off, Group 2-3 class UAV. # Every number is an ILLUSTRATIVE placeholder for testing the code-2 (PISTON_ICE) path. # # Every value with src = PLACEHOLDER is an example, NOT customer data. # Values with src = "ALES-2 baseline (user)" come from an existing 20 kg # aircraft (3.5 m span, NACA 4412, V-tail, 12S pack) and must be confirmed. # The tool reports every placeholder in its validation summary. # # HOW TO WRITE THIS FILE # ---------------------- # [section] groups keys # key = value unit REF | attr = value ... fixed value / target # key >= value unit REF | ... requirement: must be AT LEAST # key <= value unit REF | ... requirement: must NOT EXCEED # # ... comment (to end of line) # # value : 12.5 3e-4 [300 200 150] "quoted text" WORD # unit : case-sensitive, e.g. m km ft kg lb s min h m/s kt km/h W kW hp # Wh Wh/kg K degC deg % (full list: docs/02_PRD_SCHEMA.md) # REF : airspeeds MUST state TAS | EAS | CAS | IAS # altitudes MUST state AGL | MSL (AGL is from site_elevation) # keyword : TBD = not known yet (never treated as zero) # NONE = no limit / not applicable # AUTO = the tool sizes/estimates it # DEFAULT = use the model default (model options only) # # Requirement attributes (after "|"): # type = HARD_LIMIT must never be violated # MINIMUM minimum acceptable capability; FAIL if not met # TARGET desired value; deviation reported (tol = allowed deviation) # PREFERENCE nice to have; ranks trade-study options # prio = 1 (highest) .. 5 src = where the number comes from # id = "customer ID" note = "free text" # Operating condition: alt = 1000 m MSL | CRUISE | SITE # isa_dev = 15 K or oat = 35 degC # config = CLEAN | TAKEOFF | LANDING # If no isa_dev/oat is given: alt = SITE uses site_isa_dev, # every other condition uses enroute_isa_dev. # # Author: Syed Yasir Rehan Ali | WhatsApp: +90-551-681-9256 # ============================================================================= [prd] format_version = 1.4 revision = "B" date = "2026-10-29" author = "TBD" status = DRAFT [aircraft] name = "TEST-PISTON-RWY (piston pusher, runway; integration fixture)" mission_role = "ISR - EO/IR gimbal, day and night" description = "Integration test fixture for propulsion code 2 and VTOL code 0. Not a requirement set." propulsion_code = 2 # 1..7 (docs/03_CODES.md) propulsion_label = PISTON_ICE # optional cross-check of the code vtol_code = 0 # 0..5 vtol_label = NONE # optional cross-check of the code [configuration] layout = CONVENTIONAL tail = V_TAIL wing_position = HIGH fuselage = POD_AND_BOOM cruise_propulsor_position = PUSHER n_cruise_propulsors = 1 landing_gear = FIXED_TRICYCLE [payload] mass_max >= 5.0 kg | type = MINIMUM | prio = 1 | src = PLACEHOLDER mass_normal = 4.0 kg | src = PLACEHOLDER volume >= TBD | type = MINIMUM | prio = 3 | src = PLACEHOLDER dims = [250 180 160] mm | src = PLACEHOLDER power_avg = 40 W | src = PLACEHOLDER power_peak = 80 W | src = PLACEHOLDER cg_offset = TBD mount = BELLY_GIMBAL interface = "12 V power, Ethernet video, UART control (example)" droppable = NO [performance] # Endurance / range: normal payload, take-off to landing, reserves EXCLUDED. endurance >= 5.0 h | type = MINIMUM | prio = 1 | src = PLACEHOLDER range >= 250 km | type = MINIMUM | prio = 2 | src = PLACEHOLDER speed_max_level >= 38 m/s TAS | alt = CRUISE | isa_dev = 0 K | type = MINIMUM | prio = 2 | src = PLACEHOLDER speed_cruise = 28 m/s TAS | alt = CRUISE | isa_dev = 0 K | type = TARGET | tol = 5 % | prio = 2 | src = PLACEHOLDER speed_stall <= 18 m/s EAS | config = CLEAN | type = TARGET | tol = 1 m/s | prio = 3 | src = PLACEHOLDER altitude_max >= 3000 m MSL | isa_dev = 0 K | type = MINIMUM | prio = 2 | src = PLACEHOLDER altitude_cruise = 800 m AGL | isa_dev = 0 K | type = TARGET | tol = 100 m | prio = 2 | src = PLACEHOLDER climb_rate >= 2.5 m/s | alt = SITE | type = MINIMUM | prio = 3 | src = PLACEHOLDER [constraints] mtow <= 60 kg | type = HARD_LIMIT | prio = 1 | src = PLACEHOLDER wingspan <= 4.5 m | type = HARD_LIMIT | prio = 1 | src = PLACEHOLDER length <= 3.0 m | type = PREFERENCE | prio = 4 | src = PLACEHOLDER height <= NONE | type = PREFERENCE | prio = 5 | src = PLACEHOLDER transport_box = [2000 600 500] mm | src = PLACEHOLDER assembly_time <= 10 min | type = PREFERENCE | prio = 4 | src = PLACEHOLDER [launch_recovery] takeoff_distance <= 150 m | type = MINIMUM | prio = 2 | src = PLACEHOLDER landing_distance <= 300 m | type = MINIMUM | prio = 2 | src = PLACEHOLDER | note = "= runway_length; with a 5 deg approach from the 15 m obstacle the air distance alone is about 170 m, so the earlier 200 m made the landing line bind and the sizing diverge (build 0.5.0)" takeoff_method = RUNWAY # VTOL RUNWAY HAND CATAPULT BUNGEE ROCKET_ASSIST VEHICLE_ROOF recovery_method = RUNWAY # VTOL RUNWAY BELLY PARACHUTE NET DEEP_STALL # runway landing model inputs (PRD format 1.3/1.4; required with RUNWAY recovery) approach_angle = 5 deg | src = "test fixture (synthetic)" braking_friction = 0.3 | src = "test fixture (synthetic)" | note = "wheel brakes on" free_roll_time = 1 s | src = "test fixture (synthetic)" landing_speed_schedule = MILITARY | src = "user decision 2026-10-28 (D-22)" | note = "approach 1.2, flare 1.15, touchdown 1.1 x V_stall" [environment] site_elevation = 100 m MSL | src = PLACEHOLDER site_isa_dev = 20 K | src = PLACEHOLDER | note = "hot day: ISA+20 K = 35 degC at sea level" enroute_isa_dev = 0 K | src = PLACEHOLDER wind_mean = 8 m/s | src = PLACEHOLDER wind_gust = 12 m/s | src = PLACEHOLDER crosswind = 6 m/s | src = PLACEHOLDER | note = "if omitted, wind_mean is used as crosswind" runway_length = 300 m | src = PLACEHOLDER runway_surface = PAVED obstacle_height = 15 m | src = PLACEHOLDER [vtol] # not used: vtol_code = 0 [mission] name = "ISR endurance / range" cruise_speed_policy = FIXED # FIXED uses performance.speed_cruise loiter_speed_policy = BEST_ENDURANCE climb_rate = 2.5 m/s | src = PLACEHOLDER descent_rate = 2.0 m/s | src = PLACEHOLDER headwind = 0 m/s # 0 = still-air range warmup_time = 3 min | src = PLACEHOLDER custom_profile = NO # custom_payload = NORMAL # NORMAL | MAX - required when custom_profile = YES [mission.custom] # Read only when mission.custom_profile = YES. Example profile: # seg01 = VTOL_TAKEOFF | time = 30 s | height = 20 m AGL (climb at vertical_climb_rate, then hover) # seg02 = TRANSITION_FWD | time = 15 s # seg03 = CLIMB | to = CRUISE | rate = 2.5 m/s # seg04 = CRUISE | distance = 30 km | speed = CRUISE # seg05 = LOITER | time = 90 min | speed = BEST_ENDURANCE # seg06 = CRUISE | distance = 30 km | speed = BEST_RANGE # seg07 = DESCENT | to = 20 m AGL | rate = 2 m/s # seg08 = TRANSITION_BACK | time = 20 s # seg09 = VTOL_LANDING | time = 45 s | height = 20 m AGL (hover, then vertical descent) [reserves] # All components are added: loiter time + divert distance + extra hover # (flown level at the reserve altitude / hover height from the trip-end state) # + contingency_fraction of the trip energy/fuel; then energy_fraction of the # usable energy/fuel must still remain at landing. time = 10 min | src = PLACEHOLDER altitude = 100 m AGL | src = PLACEHOLDER distance = 0 km | src = PLACEHOLDER hover_time = 0 s energy_fraction = 10 % | src = PLACEHOLDER contingency_fraction = 5 % | src = PLACEHOLDER [component.fuel] type = MOGAS density = 0.74 kg/L | src = PLACEHOLDER lhv = 43.5 MJ/kg | src = PLACEHOLDER unusable_fraction = 3 % | src = PLACEHOLDER [component.engine] mass = AUTO power_max_sl = AUTO bsfc = 600 g/kWh | src = PLACEHOLDER | note = "small two-stroke; replace with dyno data" [component.battery] # not used: no propulsion battery [component.cruise_motor] # not used [component.cruise_prop] diameter = AUTO pitch = AUTO blades = 2 efficiency_cruise = AUTO [component.lift_motor] # not used [component.lift_rotor] # not used [component.esc] # not used [component.avionics] mass = 1.5 kg | src = PLACEHOLDER power = 40 W | src = PLACEHOLDER [component.airfoil_wing] name = "NACA 4412" | src = "ALES-2 baseline (user)" data_file = "" cl_max_2d = AUTO cd_min_2d = AUTO cm_ac = AUTO alpha_zero_lift = AUTO [data_files] # External data files owned by the specialist modules; paths are relative to # this PRD's folder. "" = not used. A value may be given in a data file OR in # [component.*], not both. propulsion_components = "components_piston_rwy.txt" # PE format; ILLUSTRATIVE placeholders aero_data = "aero_piston_rwy.txt" # AERO format; SYNTHETIC example layout = "layout_piston_rwy.txt" # MSC format; placeholders [design_choices] mtow_guess = 25 kg | note = "iteration start value only" wing_loading = AUTO aspect_ratio = 14 | src = PLACEHOLDER | note = "user-fixed: exercises the USER_FIXED path; rule D-07 (AR = b_max^2/S) gave AR 27 at the 4.5 m span limit" taper_ratio = 0.6 | src = PLACEHOLDER sweep_c4 = 0 deg dihedral = 2 deg | src = PLACEHOLDER thickness_ratio = 12 % | note = "consistent with NACA 4412" tail_volume_h = AUTO tail_volume_v = AUTO power_loading = AUTO [stability] static_margin_min >= 5 % | type = HARD_LIMIT | prio = 1 | src = PLACEHOLDER static_margin_max <= 20 % | type = PREFERENCE | prio = 4 | src = PLACEHOLDER [loads] # PART23_PRE_A64 = 14 CFR Part 23 normal category before Amendment 23-64: public # reference values only, NOT a UAS airworthiness requirement. For STANAG 4671 / # STANAG 4703 / USER, enter every value (AUTO is not allowed). basis = PART23_PRE_A64 n_limit_pos = AUTO n_limit_neg = AUTO factor_of_safety = 1.5 | src = PLACEHOLDER | note = "14 CFR 23.303 (pre-Amdt 23-64) uses 1.5 for manned aircraft; confirm for this UAS" gust_ude_vc = AUTO gust_ude_vd = AUTO [manufacturing] structure_material = CFRP_GFRP process = VACUUM_INFUSION max_part_length <= 1.8 m | type = HARD_LIMIT | prio = 2 | src = PLACEHOLDER | note = "mould / oven size" [classification] dod_group <= 3 | type = HARD_LIMIT | prio = 1 | src = PLACEHOLDER dod_table = DOD_UAS_GROUPS civil_jurisdiction = "Turkey (SHGM) - informational only; civil rules are separate inputs" [model] sizing_mode = SIZE_TO_MISSION # or FIXED_MTOW (uses constraints.mtow) fidelity_default = 2 # 1 statistical, 2 semi-empirical, 3 user/external data fidelity_sizing = DEFAULT fidelity_aero = DEFAULT fidelity_drag = DEFAULT fidelity_propulsion = DEFAULT fidelity_mass = DEFAULT fidelity_stability = DEFAULT fidelity_performance = DEFAULT allow_fidelity_fallback = NO allow_generic_estimates = NO # YES = labelled generic estimates when component data are missing iter_max = 50 iter_tol = 1e-4 iter_relax = 0.5 mass_margin = 10 % | src = PLACEHOLDER | note = "empty-mass growth margin" ceiling_roc_min = 100 ft/min | note = "service-ceiling definition; confirm convention" report_units = SI_PLUS_US output_dir = "out" make_plots = NO timestamp_outputs = YES debug = NO [trade] enable = NO parameter = "design_choices.aspect_ratio" values = [10 12 14 16] metric = MTOW