drop-pod
/
Phase 1 Active Dev MIT
OPEN SOURCE PRECISION DELIVERY
DROP
POD
GPS + Nose-Camera guided aerial delivery pod. Carried on RC aircraft wing. Released on command. Homes to red carpet target nose-first.
ArduPlane RPi Zero 2W OpenCV MAVLink u-blox M10 ELRS 4× Canard Fins No Propulsion
GPS Pi 2W 3S LiPo FIN×4 CAM
📁 Code 17
📊 Overview
🛒 BOM 32
🔄 Mission Flow
feat: initial complete system — GPS+optical guidance, full avionics stack, BOM, docs a1b2c3d just now
NameDescriptionUpdated
📁software/Python mission manager, vision, guidance, commsjust now
📁firmware/ArduPlane .param file, Lua vision inject scriptjust now
📁hardware/Wiring diagrams, 3D print guidesjust now
📁docs/Assembly, tuning, safety documentationjust now
📄README.mdComplete project documentation and quick-startjust now
📊BOM.csv32-item bill of materials with sourcing and pricesjust now
⚖️LICENSEMIT Licensejust 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
32 components · Estimated total: ~$265 USD Excludes carrier aircraft, TX, GCS laptop
IDCategoryComponentDescriptionQtyUnit $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
Copied to clipboard ✓