
4in1-mini
OpenDrone-hw/OpenESC-20x20
Open-source 4-in-1 AM32 ESC for FPV drones. 20x20 mm, 2-6S, one MCU per motor, CERN-OHL-S-2.0.

Three autonomous drones that search a flood zone, find survivors, geotag them, and drop medical kits — with no network, no pilot, and one operator who only presses start.
OpenAIO is an open-source printed circuit board by tetraethylmethane, from the tetraethylmethane/NIDAR-RescueSwarm repository on GitHub. It is an 8-layer board of 35 × 35 mm with 285 parts on 284 nets, routed with 1,775 tracks and 1,091 vias.
It is built around the AT32F421G8U7, ESP32-C3 and LR1121IMLTRT, with the RFX2401C, SKY13373-460LF and 2450FM07D0034T among its other parts. Its parts include 95 resistors, 86 capacitors, 34 connectors, 24 transistors and 19 ICs. It belongs with the ESP32 and RISC-V boards of this library.
Three autonomous drones that search a flood zone, find survivors, geotag them,
and drop medical kits — with no network, no pilot, and one operator who only presses start.
NIDAR 2026–27 · Track 1 · Mission 1
MeitY · Drone Federation of India · SwaYaan
Phase 0/1. Sized end to end, requirements baselined against the rulebook, and the ground station runs as a system against three real ArduCopter SITL autopilots.
What exists: coverage planner, geotag geometry and its error model, ArduPilot parameter sets, safety-link protocol, ground station. All tested — 129 + 17 + 67 tests, 13 committed model outputs.
What does not: the aircraft, and the detector. There is no camera anywhere in the loop; survivors have only ever come from a simulator. Nothing has flown on hardware.
Three real autopilots flying the coverage planner's output in AUTO, in 6 m/s wind, over locally cached imagery. Every number came from an autopilot.
▶ mission-flight.mp4 · ground-station/README.md
| # | Action | When | Why first |
|---|---|---|---|
| 1 | Send the organiser questions — drafted | This week | External latency; nothing else here has any |
| 2 | Start collecting recall data | P1 | The long pole. 250 points, irreducible calendar cost |
| 3 | Bench the cold-boot timing | P1 | The only constraint under 20 % margin, still modelled |
Registration Aug 2026 · reviews Oct and Dec · finals Jan 2027. About 21 weeks, but monsoon and exams cut the flight-test window to ~8 weeks. See the development plan.
Outputs of a closed model in tools/sizing-model/, reconciled with the BOM to ~2 %.
| Aircraft | Mission | ||
|---|---|---|---|
| Configuration | Quadrotor · 18 in CF folding props | Design mission | 7.7 min of 30 |
| Battery | 6S3P 21700 · 18 cells · 292 Wh | Search | 60 m AGL at 8 m/s |
| MTOW | 6.36 kg (model) · 6.23 kg (BOM) | Sweep | 93 s/drone, 10 ha over 3 |
| Fleet | 19.1 kg of 25 kg — 24 % margin | GSD | 1.82 cm/px — a person is ~93 px |
| Hover | 913 W · 9.7 kg/m² disk loading | Link | ≥13 dB at 600 m · 2.5 Mbps |
| Endurance | 15.3 min — ≈2.0× the mission ⚠ | Geotag target | CEP50 ≤ 0.75 m with RTK |
| Thrust-to-weight | 2.0 static · hover at 50 % | Delivery target | ≥60 % within 2 m, ≥30 % within 1 m |
⚠ The reserve is spent. The 300 g parachute (SYS-41) takes endurance to ≈2.0× against a self-imposed ≥2.0× policy. Any further mass growth breaks it. See
bom_reconcile.py.Under review: 40 m beats 60 m — 140 px on a person instead of 93, for 2.5 min of a 15 min allowance. Pending recall measurement in P7.
Three ArduCopter SITL instances, the real rescueswarm-drone{1,2,3}.parm, the real planned missions. Every number below came off MAVLink. Telemetry is committed in simulations/recordings/; the figures redraw from it.
BATT_FS_LOW_ACT = 2 had been reviewed and unit-tested for weeks, and no simulation ever loaded the file — every SITL script used stock defaults, where the value is 0 and a low battery does nothing at all. Now proven end to end: RTL fires at 10 809 mAh of a 10 800 mAh trip, on all three aircraft, within two seconds of each other.

Three defects, none visible in review, all found by running the real artifact:
NAV_DELAY 0/15/30 s in the mission file.
| Separation, three aircraft | Before | After |
|---|---|---|
| Launch, closest pair | 1.31 m | 26.96 m |
| Whole flight, both airborne | 3.99 m | 5.51 m |
| Closest horizontal, any time | 0.83 m — overlap | 1.89 m |
| Recovery run, closest at any time | 0.83 m — overlap | 2.27 m |
Each strip is swept twice, the second pass on the reverse heading, and every sweep finishes near the pad.


"Measured" means measured in simulation. That rules out whole classes of error and none of the physical ones. HANDOFF.md §2 keeps measured, modelled and assumed apart.
| Decision | Outcome | Why |
|---|---|---|
| Coaxial X8? | Rejected | +59–119 % hover power, +34–50 % fleet mass, cuts the margin to 2 %, buys no footprint back, worst attitude bandwidth tested |
| Rotor count | Quad | Hex/octo match or beat it on physics, but cost 1.5–2× the propulsion integration on a 21-week calendar. Decided on schedule risk, not physics |
| Prop diameter | 18 in | Matches the BOM, and better than 20 in on descent (0.42 v_i) and gust sensitivity (0.168) |
| Thrust-to-weight | 2.0 | Tilt only reaches 12° at 15 m/s — attitude authority is never the wind limit |
| Recovery chute | Fit one | Cannot meet the "land on the pad" condition, but −10 beats −50, so it is worth ~40 points anyway |
| Pad layout | Corners, not a row | A row is the worst packing on a square. Compliance said "3 per row"; they landed 0.83 m apart — an overlap. Corners give 2.61 m instead of 1.22 m. Measured closest approach 0.83 → 2.27 m |
| Search pattern | Two passes, second reversed | Not for coverage — one pass has no gaps. Boresight bias is systematic, so flying the reverse heading cancels it where more frames cannot. Costs a full second sweep |
| Launch and recovery | Sequenced in the mission file | NAV_DELAY 0/15/30 s and RTL_LOIT_TIME 0/60/120 s — parameters, not companion code, because the failsafe RTL is a mode change inside the flight controller. The loiter stagger is 60 s because the descent was measured at 53 s; at the 20 s it was first set to, two aircraft closed to 3.10 m over the pad |
| Motor-out redundancy | Open | Only rotors keep the aircraft flying and scoring, and only rotors work in the 6 m delivery hover. Ties to rotor count |
Numbers in configuration trade.
1000 points: 600 flight · 200 design review · 200 business strategy.
| Flight — 600 | Points | Penalty | Cost | |
|---|---|---|---|---|
| Detection + geotagging | 250 | 25 each, max 10 | Manual input or reset | −50 |
| Kit delivery accuracy | 200 | ≤1 m: 20 · ≤2 m: 14 · ≤3 m: 8 | Crash | −50 |
| Multi-drone collaboration | 50 | binary | Geofence breach | −20 |
| Single GCS interface | 50 | binary | Landing outside the box | −10/drone |
| Finish inside 15 min | 50 | binary | capped at 150 |
Three findings that moved the design more than any engineering analysis did:
Full breakdown in rulebook compliance.
| Risk | Detail | Status |
|---|---|---|
| Setup margin | 15 s against a 5-minute rule — modelled, not measured | Recovered by SYS-42/43; bench in P1 |
| VRS on every delivery | 2.5 m/s descent sits at 0.48 v_i, on the vortex-ring boundary | Fix in the flight profile, not the airframe |
| Wind cliff at 8 m/s | Search groundspeed is 8 m/s, so at that windspeed we make no headway. Wind is natural and uncapped | Requirement: 10 m/s headway (SYS-37) |
| Business strategy | 200 points, barely started; sponsorship evidence cannot be produced in the final week | Start now |
Four questions are drafted and unsent — how "correctly geotagged" is verified, whether a canopy descent scores −10 or −50, whether motor-out tolerance is required, and whether the pad can be surveyed beforehand. The first decides whether ~1–2 m of absolute base error costs anything against 250 points. Answers already received are recorded in the same file.
HANDOFF.md read this first if you are picking the project up
TRAPS.md read this before adding a config, a generated file or a test
docs/ requirements, sizing, business, system overview
tools/sizing-model/ the model everything traces back to
hardware/bom/ Indian BOM + indigenisation scorecard
autonomy/coverage_planner/ boundary in, one AUTO mission per drone out
perception/geotagging/ pixel to lat/lon, and a Monte Carlo of its error
firmware/ardupilot-params/ the five failsafes, as parameters not code
simulations/ SITL harness, committed telemetry, figures
ground-station/ mission_backend + the GCS engineering recordThe running ground station — Flask server, React client, SITL launch scripts — is in NIDAR-GSC. What lives here is ground-station/mission_backend/ (fleet model, KML parser, MAVLink ingest, and the SYS-20 module split that makes a retask route structurally unreachable), plus the requirement evidence: PLAN.md, the flight screenshots and mission-flight.mp4.
⚠ The two copies of
mission_backendhave drifted.mavlink_ingest.pyis 186 lines here against 304 in NIDAR-GSC, and only the GSC copy callsSET_MESSAGE_INTERVAL— without which a passive listener receives nothing but heartbeats. The GSC copy is the one that flies; this one is what CI tests. See HANDOFF.md §4.5.
communication/ is still planned.
pip install -r tools/sizing-model/requirements.txt
python3 tools/sizing-model/rescueswarm_sizing_model.py # the design point
python3 tools/sizing-model/bom_reconcile.py # read before ordering
export NIDAR_SYS=$PWD
../NIDAR-GSC/scripts/test-battery-failsafe.sh # low battery brings it home
python3 simulations/sitl/fly_and_record.py # three aircraft fly the plan
python3 simulations/sitl/proof_figures.py # redraw §3 from telemetryNIDAR_SPEEDUP=3 slows the sim enough to see the launch stagger. Do not use NIDAR-GSC/scripts/run-sim.sh — it launches a fixed wing with no project parameters.
Change the model, re-run it, commit the new output in the same commit. Every number in this README traces to
docs/sizing/, and CI fails if one drifts.
| Document | What's in it |
|---|---|
| Handoff | Start here. What is proven, what waits on a human, what is unowned |
| Traps | Ten classes of defect this project has already paid for, and what now prevents each |
| Competition day | How the GCS is actually operated on the day — draft, never rehearsed |
| System overview | Mission flow, architecture, perception, indigenisation, failsafes |
| Sizing calculations | Why every number is what it is |
| Requirements baseline | Every SYS-xx requirement, traced to a rule and a verification method |
| Rulebook compliance | Rule-by-rule matrix, scoring, conflicts |
| Development plan | Schedule, critical path, risk and de-scope order |
| Implementation plan | What to build for autonomy, perception and failsafes — and what can be skipped |
| Frame design constraints | What CAD needs before the first part is cut |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 36 | 10k | Resistor_SMD:R_0201_0603Metric | R4, R5, R10, R19, R20, R27, R29, R30, R32, R33, R35, R38, R39, R46, R48, R49 +20 |
| 32 | 5V | lib:small_pad | J10, J12, J13, J14, J15, J16, J17, J18, J19, J20, J21, J22, J23, J24, J25, J26 +16 |
| 25 | 100nF | Capacitor_SMD:C_0201_0603Metric | C2, C3, C11, C12, C14, C16, C43, C44, C45, C49, C53, C54, C55, C59, C63, C64 +9 |
| 24 | 15R | Resistor_SMD:R_0201_0603Metric | R17, R18, R23, R24, R25, R26, R36, R37, R42, R43, R44, R45, R55, R56, R61, R62 +8 |
| 24 | DOY180N03T | Package_SON:Diodes_PowerDI3333-8 | Q1, Q2, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23 +8 |
| 14 | 100nF | Capacitor_SMD:C_0402_WIDE | C46, C47, C48, C56, C57, C58, C66, C67, C68, C76, C77, C78, C83, C85 |
| 14 | C | Capacitor_SMD:C_0805_2012Metric | C35, C36, C50, C51, C52, C60, C61, C62, C70, C71, C72, C80, C81, C82 |
| 12 | 1k | Resistor_SMD:R_0201_0603Metric | R28, R31, R34, R47, R50, R53, R66, R69, R72, R85, R88, R91 |
| 8 | TestPoint | TestPoint:TestPoint_Pad_D1.0mm | TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10 |
| 7 | 1uF | Capacitor_SMD:C_0201_0603Metric | C13, C19, C20, C21, C26, C27, C30 |
| 4 | 100k | Resistor_SMD:R_0201_0603Metric | R8, R9, R11, R13 |
| 4 | 10R | Resistor_SMD:R_0201_0603Metric | R22, R41, R60, R79 |
| 4 | 220R | Resistor_SMD:R_0201_0603Metric | R21, R40, R59, R78 |
| 4 | AT32F421G8U7 | 4in1ESC:QFN-28_L4.0-W4.0-P0.40-TL-EP2.4 | U11, U13, U15, U17 |
| 4 | NSG2065Q | 4in1ESC:QFN-24_L4.0-W4.0-P0.50-TL-EP2.8 | U12, U14, U16, U18 |
| 3 | 10uF | Capacitor_SMD:C_0402_1005Metric | C9, C23, C31 |
| 3 | 47p | Capacitor_SMD:C_0201_0603Metric | C17, C28, C32 |
| 2 | 1.2pF | Capacitor_SMD:C_0201_0603Metric | C22, C25 |
| 2 | 100n | Capacitor_SMD:C_0201_0603Metric | C37, C38 |
| 2 | 15pF | Capacitor_SMD:C_0201_0603Metric | C4, C8 |
| 2 | 1k | Capacitor_SMD:C_0201_0603Metric | R93, R94 |
| 2 | 22uF | Capacitor_SMD:C_0603_1608Metric | C41, C42 |
| 2 | 4.7uF 50v | Capacitor_SMD:C_0805_2012Metric | C33, C34 |
| 2 | 5.1k | Resistor_SMD:R_0201_0603Metric | R1, R2 |
| 2 | C | Capacitor_SMD:C_1206_3216Metric | C39, C40 |
| 2 | DSK24 | lib:SOD-123_L2.8-W1.8-LS3.7-RD | D2, D3 |
| 2 | LED_1_Green | LED_SMD:LED_0402_1005Metric | D4, D5 |
| 2 | LMR51430YFDDCR | lib:SOT-23-6_L2.9-W1.6-P0.95-LS2.9-BL | U8, U9 |
| 2 | XRTC303020D4R7MBCA | lib:IND-SMD_L3.0-W3.0_AFE303020S | L6, L7 |
| 1 | 0.2mR | Resistor_SMD:R_2512_6332Metric | Rsense2 |
| 1 | 0900PC16J0042001E | OpenRX-Shared:FILTER-SMD_10P-L2.0-W1.6-BL | T1 |
| 1 | 10nF | Capacitor_SMD:C_0201_0603Metric | C18 |
| 1 | 10pF | Capacitor_SMD:C_0201_0603Metric | C6 |
| 1 | 10uH | Inductor_SMD:L_0603_1608Metric | L3 |
| 1 | 13.7k | Resistor_SMD:R_0201_0603Metric | R14 |
| 1 | 1k | 4in1ESC:R_0201_0603Metric | R95 |
| 1 | 1n | Capacitor_SMD:C_0201_0603Metric | C29 |
| 1 | 1uF | Capacitor_SMD:C_0402_1005Metric | C84 |
| 1 | 2.0nH | Inductor_SMD:L_0201_0603Metric | L2 |
| 1 | 2.2nF | Capacitor_SMD:C_0201_0603Metric | C5 |
| 1 | 2.4k | Resistor_SMD:R_0201_0603Metric | R16 |
| 1 | 2.5nH | Inductor_SMD:L_0201_0603Metric | L5 |
| 1 | 200 | Resistor_SMD:R_0201_0603Metric | R7 |
| 1 | 220 | Resistor_SMD:R_0201_0603Metric | R3 |
| 1 | 220pF | Capacitor_SMD:C_0201_0603Metric | C24 |
| 1 | 2450AT18A100E | OpenRX-Shared:ANT-SMD_L3.2-W1.6 | AE1 |
| 1 | 2450FM07D0034T | OpenRX-Shared:FILTER-SMD_4P-L1.0-W0.5-L | FL1 |
| 1 | 24nH | Inductor_SMD:L_0201_0603Metric | L1 |
| 1 | 470nF | Capacitor_SMD:C_0201_0603Metric | C15 |
| 1 | 47nH | Inductor_SMD:L_0402_1005Metric | L4 |
| 1 | 47pF | Capacitor_SMD:C_0201_0603Metric | C10 |
| 1 | 6.49k | Resistor_SMD:R_0201_0603Metric | R12 |
| 1 | 7.5k | Resistor_SMD:R_0201_0603Metric | R15 |
| 1 | AIO_outline | OpenDrone:AIO_outline | U1 |
| 1 | CJ17-400001010B20 | OpenRX-Shared:CRYSTAL-SMD_4P-L1.6-W1.2-BL | X1 |
| 1 | Conn_Coaxial_Small | Connector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_Vertical | J2 |
| 1 | ESP32-C3 | Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.7x3.7mm | U4 |
| 1 | INA186A3IDCKR | 4in1ESC:SOT-363_SC-70-6 | U19 |
| 1 | LR1121IMLTRT | Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.7x3.7mm | U3 |
| 1 | OW7EL89CENUYO3YLC-32M | OpenRX-Shared:OSC-SMD_4P-L2.0-W1.6-BL_TXC_7Z | OSC1 |
| 1 | OpenDrone-Core | lib:OpenDrone-Core_LGA_land | J1 |
| 1 | RFX2401C | OpenRX-Shared:QFN-16_L3.0-W3.0-P0.50-BL-EP1.7 | U5 |
| 1 | SKY13373-460LF | OpenRX-Shared:QFN-12_EP_2x2_Pitch0.5mm | U7 |
| 1 | SM06B-SRSS-TB(LF)(SN) | lib:CONN-SMD_SM06B-SRSS-TB-LF-SN | U10 |
| 1 | TLV75533PDQNR | OpenRX-Shared:X2SON-4_L1.0-W1.0-P0.65-TL-EP | U6 |
| 1 | TS2306A 240GF MSM 9_C2976675 | lib:SW-SMD_4P-L3.0-W2.0-P0.85-LS3.5 | U22 |
| 1 | TYPE-C 16P QTWT | lib:USB-TYPE-C-SMD_TYPE-C-16P-QTWT | USB1 |
| 1 | XL-1010RGBC-WS2812B | OpenRX-Shared:LED-SMD_4P-L1.0-W1.0-TL_XL-1010RGBC-WS2812B | D1 |

OpenDrone-hw/OpenESC-20x20
Open-source 4-in-1 AM32 ESC for FPV drones. 20x20 mm, 2-6S, one MCU per motor, CERN-OHL-S-2.0.

OpenDrone-hw/OpenAIO
Open-source AIO for 2-6S toothpick quads: flight controller, 4-in-1 AM32 ESC and ExpressLRS receiver, 25.5x25.5 mm.

OpenDrone-hw/OpenRX
OpenRX open-source ExpressLRS receiver family hub; board sources live in four dedicated hardware repositories.

OpenDrone-hw/OpenESC-30x30
Open-source 4-in-1 AM32 ESC for FPV drones. 30.5x30.5 mm, 2-8S, one MCU per motor, CERN-OHL-S-2.0.

aprskalo1/nano24-elrs-receiver
nano24: compact 2.4 GHz ExpressLRS receiver prototype with ESP32-C3, SX1281, CRSF and a printed Wi-Fi antenna. KiCad sources, BOM, Gerbers and validation notes.

OpenDrone-hw/OpenFC-Lite-Mini
Open-source Betaflight flight controller. RP2354A, 20x20 mm, 6-layer, 3-6S, CERN-OHL-S-2.0.

nbtca/CABadge
CABadge 计协电子吧唧:基于 ESP32-S3 的开源圆屏互动徽章,支持动态壁纸、触摸交互、Wi-Fi/BLE 和趣味小应用,提供 PCB、3D 打印外壳、固件及配套工具。

sneakylizard123-4/Dreamscape-F405-2020
a 20x20mm flight controller for 3" fpv drone
It measures 35 × 35 mm and has 8 copper layers, 1.6 mm thick.
285 parts, built around the AT32F421G8U7, ESP32-C3, LR1121IMLTRT and RFX2401C. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the tetraethylmethane/NIDAR-RescueSwarm repository on GitHub, at the commit this page was made from: the board is pcb/OpenAIO-main/hardware/OpenAIO.kicad_pcb and its schematic pcb/DrikrAIO/hardware/DrikrAIO.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask tetraethylmethane before reusing the design.