| Name | Description | Updated | |
|---|---|---|---|
| 📁 | software/ | Python mission manager, vision, guidance, comms | just now |
| 📁 | firmware/ | ArduPlane .param file, Lua vision inject script | just now |
| 📁 | hardware/ | Wiring diagrams, 3D print guides | just now |
| 📁 | docs/ | Assembly, tuning, safety documentation | just now |
| 📄 | README.md | Complete project documentation and quick-start | just now |
| 📊 | BOM.csv | 32-item bill of materials with sourcing and prices | just now |
| ⚖️ | LICENSE | MIT License | just now |
SYSTEM SPECS
GLIDE RATIO
4:1 min
RELEASE ALT
60–200 m AGL
OPTICAL ACT.
40 m AGL
LANDING CEP
≤0.5 m optical
TOTAL MASS
≤650 g target
SERVO RATE
400 Hz
VISION FPS
30 fps
WIND LIMIT
≤8 m/s
MISSION PHASES
S0
IDLE
›
S1
ARMED
›
S2
RELEASED
›
S3
GPS GLIDE
›
S4
CAM LOCK
›
S5
LANDED
AVIONICS STACK
PRIMARY COMPUTE
Matek H743-WING
STM32H743 · ArduPlane · PID @ 400Hz · 4× servo PWM · GPS · IMU · Baro
VISION COMPUTE
RPi Zero 2W
ARM Cortex-A53×4 · OpenCV HSV detection · Mission FSM · MAVLink bridge
NOSE CAMERA
RPi Cam Module 3 Wide
IMX708 · 102° FOV · CSI-2 · Mounted at nose tip · Forward-facing
NAVIGATION
u-blox M10 GNSS
GPS+GLO+GAL · 10Hz · concurrent GNSS · patch antenna in nose
REACHABILITY ALGORITHM
guidance.py — reachability check
Python
VISION PIPELINE
INPUT
BGR Frame
1280×720
→
STEP 1
BGR→HSV
Downscale 640×360
→
STEP 2
Dual Mask
Hue 0-12 + 165-180
→
STEP 3
Morph Filter
Open + Close kernels
→
STEP 4
Contour
Largest blob → cx,cy
→
OUTPUT
Correction
→ FC roll/pitch
| ID | Category | Component | Description | Qty | Unit $ | Total $ |
|---|
FULL MISSION SEQUENCE
INTER-PROCESSOR COMMUNICATION
MAVLink message flow — Pi ↔ FC
Diagram
# RC TRANSMITTER → ELRS → FC SBUS RC TX ──[2.4GHz ELRS]──► ELRS Rx ──[SBUS]──► F405 FC │ reads CH7 (ARM), CH8 (DROP), CH9 (ABORT) # GROUND CONTROL → TELEMETRY RADIO → FC GCS Laptop ──[915MHz SiK]────────────────────────► F405 FC │ HEARTBEAT, COMMAND_LONG(ARM/DROP), SET_TARGET # FC ↔ RPi COMPANION (MAVLink v2 / 115200 baud) F405 FC ──[UART1 TX]──► RPi GPIO15 (RX) RPi GPIO14 (TX) ──► F405 FC UART1 RX FC → Pi messages: GLOBAL_POSITION_INT, ATTITUDE, SYS_STATUS, RC_CHANNELS Pi → FC messages: HEARTBEAT, NAMED_VALUE_FLOAT("VIS_ROLL"), NAMED_VALUE_FLOAT("VIS_PTCH") SET_POSITION_TARGET_GLOBAL_INT (guided waypoint) COMMAND_LONG DO_SET_RELAY (latch fire) # RPi CAMERA → RPi (internal CSI-2) RPi Cam Module 3 ──[CSI-2 ribbon]──► RPi Zero 2W │ OpenCV HSV pipeline @ 30fps → centroid cx, cy, confidence → angular correction via MAVLink
SAFETY GATE LOGIC
Drop release — two-stage safety
Python
# GATE 1 — ARM received? if rc_arm_high: if not gps_fix or hdop > 3.0: reject("GPS NOT READY") else: state = ARMED # gate 1 passes # GATE 2 — DROP received? (only valid in ARMED) if rc_drop_high and state == ARMED: dist = haversine(pod_pos, target_pos) max_r = alt_agl × GLIDE_RATIO × SAFETY_MARGIN # 0.85 if dist > max_r: reject(f"OUT OF RANGE {dist:.0f}m > {max_r:.0f}m") elif alt_agl < MIN_AGL: reject(f"TOO LOW {alt_agl:.0f}m") else: await fc.fire_latch() # both gates passed state = GLIDE_GPS