ContentsFoundations to FrontierBezhig

eng-lab/design/drone.toml

All lab code. Download this file.

# The design: every knob of the drone, each number with its unit (EL01, section 2.13).
#
# This is EL01's worked example: a paper design in the class PX4's simulator
# flies by default (about 1 to 2 kg,
# 10-inch propellers, a 4S 5000 mAh battery), on a flat carbon-fibre frame whose
# arms you design in CAD. EL05 replaces it with YOUR design, chosen by a trade
# study after you have set a budget. Every catalog number names its source.
#
# Change a value here, or override it without editing this file:
#   python -m hwe tinker "battery.capacity=6000 mA*h" --predict "..."

[meta]
name = "EL01 worked example: a 10-inch paper quad"

[environment]
g = "9.80665 m/s^2"            # standard gravity; your local value differs by a few tenths of a percent

[requirements]
file = "design/requirements.toml"
min_thrust_to_weight = 2.0     # sets the allowable mass; must match SYS-001's threshold (the report checks)

[growth_allowance]
# Fraction added to each item's mass according to how mature its number is (EL01, 2.8).
# Chosen inside the ranges of ANSI/AIAA S-120A Table 1, reproduced in NASA/TM-20240014203
# (https://ntrs.nasa.gov/api/citations/20240014203/downloads/11-15-24%2020240014203.pdf).
estimated = 0.20   # E1 "estimated": 10-35% for most categories (wire harnesses 50-100%)
cad = 0.10         # C3 "preliminary design": 3-25%
catalog = 0.05     # A5 "existing hardware or catalog value": 1-5%
measured = 0.01    # A6 "actual mass": no allowance, only measurement uncertainty; 1% stands in for a kitchen scale

[propulsion]
motor_count = 4
motor = "T-Motor AIR2216 II, 920 KV"
prop = "T-Motor T1045 II (10 x 4.5 in, two blades)"
thrust_table = "data/catalog/tmotor_air2216ii_920kv_t1045_16v.csv"
source = "https://uav-en.tmotor.com/2022/Air-Gear_0510/798.html (bench test at a fixed 16 V, accessed 2026-09-26); the same sheet is Holybro's X500 V2 motor specification"

[battery]
cells = 4
capacity = "5000 mA*h"
cell_voltage = "3.7 V"               # LiPo nominal; full charge is 4.2 V per cell (Tattu LiPo guide)
usable_fraction = 0.8
specific_energy = "175.8 W*h/kg"     # Gens ace G-Tech 4S 5000 mAh: 74.0 W*h / 0.421 kg
maturity = "catalog"
source = "https://gensace.de/products/gens-ace-g-tech-5000mah-14-8v-4s1p-60c-lipo-battery-pack-with-xt90-plug-bashing-series"

[electronics]
power = "4 W"                        # flight controller, GPS, receiver: an estimate

[payload]
mass = "0 g"                         # try "200 g" for a camera
maturity = "estimated"

[arm]
# The CAD arm (hwe/core/arm.py). Carbon-fibre plate, clamped between the body plates.
material = "carbon_fiber_plate"
length = "190 mm"                    # frame end to motor centre: motors 225 mm from the centre, 450 mm apart diagonally
width = "16 mm"
thickness = "5 mm"
pad_size = "32 mm"
motor_hole_spacing = "19 mm"         # a square pattern keeps this first part simple; EL10 checks it against your motor's drawing
motor_hole_diameter = "3.2 mm"       # clearance for M3 screws
center_hole_diameter = "8 mm"
frame_hole_diameter = "3.2 mm"
frame_hole_inset = "8 mm"
frame_hole_pitch = "24 mm"

[tests.phone]
data = "data/tests/el01_phone/lift.csv"
still_until = "1.5 s"                # the phone lies still until this time
sign = 1                             # set -1 if your phone reads about -9.8 m/s^2 at rest

# ---------------------------------------------------------------------------
# The parts list. mass is for ONE part; count multiplies it. A count written as
# "propulsion.motor_count" follows that knob. mass = "cad" takes the mass from
# the CAD stage (fallback is used until your arm.py exists). The battery and the
# payload are added from their own sections above.

[[component]]
name = "arm"
subsystem = "structure"
count = "propulsion.motor_count"
mass = "cad"
fallback = "30 g"
maturity = "cad"
source = "CAD: hwe/core/arm.py x density of carbon_fiber_plate"

[[component]]
name = "body plates, standoffs, screws"
subsystem = "structure"
mass = "90 g"
maturity = "estimated"
source = "estimate: two 2 mm carbon plates about 140 mm square with cut-outs"

[[component]]
name = "landing gear"
subsystem = "structure"
mass = "40 g"
maturity = "estimated"
source = "estimate"

[[component]]
name = "motor"
subsystem = "propulsion"
count = "propulsion.motor_count"
mass = "64 g"
maturity = "catalog"
source = "https://uav-en.tmotor.com/2022/Air-Gear_0510/798.html (64 +/- 2 g including cable)"

[[component]]
name = "propeller"
subsystem = "propulsion"
count = "propulsion.motor_count"
mass = "12.5 g"
maturity = "catalog"
source = "https://cdn.shopify.com/s/files/1/0604/5905/7341/files/X500MotorSpec.png (T1045 II, 12.5 g)"

[[component]]
name = "flight controller and 4-in-1 ESC"
subsystem = "avionics"
mass = "21.8 g"
maturity = "catalog"
source = "Holybro Kakute H7 V2 (8 g) + Tekko32 F4 4in1 50A (13.8 g): https://holybro.com/products/kakute-h7-v2-stacks"

[[component]]
name = "GPS and compass"
subsystem = "avionics"
mass = "32 g"
maturity = "catalog"
source = "Holybro M10 GPS: https://docs.holybro.com/gps-and-rtk-system/m8n-m9n-m10-gps/standard-m10-m9n-m8n-gps/overview"

[[component]]
name = "radio receiver"
subsystem = "avionics"
mass = "2.2 g"
maturity = "catalog"
source = "RadioMaster RP1 V2 ExpressLRS: https://radiomasterrc.com/products/rp1-expresslrs-2-4ghz-nano-receiver"

[[component]]
name = "wiring, connectors, battery strap"
subsystem = "power"
mass = "45 g"
maturity = "estimated"
source = "estimate"