Skip to the content
8 layers35 × 35 mmOpenAIO, the printed circuit board in 3D

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.

Size
35 × 35 mm
Copper layers
8
Thickness
1.6 mm
Parts
285
Nets
284
Pads
1,500
Tracks, vias
1,775, 1,091
Pours
48
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
3 Aug 2026
Updated
1 Nov 2026

Overview

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.

Main components

12

README

README.md

NIDAR RescueSwarm

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 mass mission finals


1. Status

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.

Ground station mid-mission: three drones in AUTO at 40 m over offline satellite imagery
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

Next actions

#ActionWhenWhy first
1Send the organiser questions — draftedThis weekExternal latency; nothing else here has any
2Start collecting recall dataP1The long pole. 250 points, irreducible calendar cost
3Bench the cold-boot timingP1The 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.


2. Design point

Outputs of a closed model in tools/sizing-model/, reconciled with the BOM to ~2 %.

AircraftMission
ConfigurationQuadrotor · 18 in CF folding propsDesign mission7.7 min of 30
Battery6S3P 21700 · 18 cells · 292 WhSearch60 m AGL at 8 m/s
MTOW6.36 kg (model) · 6.23 kg (BOM)Sweep93 s/drone, 10 ha over 3
Fleet19.1 kg of 25 kg — 24 % marginGSD1.82 cm/px — a person is ~93 px
Hover913 W · 9.7 kg/m² disk loadingLink≥13 dB at 600 m · 2.5 Mbps
Endurance15.3 min — ≈2.0× the mission ⚠Geotag targetCEP50 ≤ 0.75 m with RTK
Thrust-to-weight2.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.


3. Proof

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.

3.1 The battery failsafe brings them home

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.

Battery failsafe

3.2 They no longer collide

Three defects, none visible in review, all found by running the real artifact:

  • Launches were simultaneous. Three aircraft leaving slots 1.22 m apart measured 1.3 m from each other at 2–3 m altitude. Now NAV_DELAY 0/15/30 s in the mission file.
  • Two of three swept the wrong way round, finishing 516 m and 540 m from the pad on the lowest state of charge of the flight, because sweep direction keyed on drone index. Now all three finish inside 130 m, same path length.
  • They landed on top of each other. See §4.

Launch sequencing

Separation, three aircraftBeforeAfter
Launch, closest pair1.31 m26.96 m
Whole flight, both airborne3.99 m5.51 m
Closest horizontal, any time0.83 m — overlap1.89 m
Recovery run, closest at any time0.83 m — overlap2.27 m

3.3 The search pattern

Each strip is swept twice, the second pass on the reverse heading, and every sweep finishes near the pad.

Sweep pattern

3.4 The pad

Pad layout

"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.


4. Decisions

DecisionOutcomeWhy
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 countQuadHex/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 diameter18 inMatches the BOM, and better than 20 in on descent (0.42 v_i) and gust sensitivity (0.168)
Thrust-to-weight2.0Tilt only reaches 12° at 15 m/s — attitude authority is never the wind limit
Recovery chuteFit oneCannot meet the "land on the pad" condition, but −10 beats −50, so it is worth ~40 points anyway
Pad layoutCorners, not a rowA 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 patternTwo passes, second reversedNot 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 recoverySequenced in the mission fileNAV_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 redundancyOpenOnly 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.


5. Scoring, and what reading it properly changed

1000 points: 600 flight · 200 design review · 200 business strategy.

Flight — 600PointsPenaltyCost
Detection + geotagging25025 each, max 10Manual input or reset−50
Kit delivery accuracy200≤1 m: 20 · ≤2 m: 14 · ≤3 m: 8Crash−50
Multi-drone collaboration50binaryGeofence breach−20
Single GCS interface50binaryLanding outside the box−10/drone
Finish inside 15 min50binarycapped at 150

Three findings that moved the design more than any engineering analysis did:

  • Geolocation gates 450 of 600 points, not 250. Kits are scored from the survivor, so a drop is never better than the tag it aimed at. RTK alone is worth 82 delivery points.
  • We were designing to the worst zone. The old ≤3 m target scored 8 of 20 per drop; the old "90 % within 5 m" requirement sat outside every zone and would have scored nothing.
  • Speed is worth 50 points and is already won. The bonus needs 15 min; we fly 7.7. Spend the surplus on recall — fly lower, take more looks.

Full breakdown in rulebook compliance.


6. Open

RiskDetailStatus
Setup margin15 s against a 5-minute rule — modelled, not measuredRecovered by SYS-42/43; bench in P1
VRS on every delivery2.5 m/s descent sits at 0.48 v_i, on the vortex-ring boundaryFix in the flight profile, not the airframe
Wind cliff at 8 m/sSearch groundspeed is 8 m/s, so at that windspeed we make no headway. Wind is natural and uncappedRequirement: 10 m/s headway (SYS-37)
Business strategy200 points, barely started; sponsorship evidence cannot be produced in the final weekStart 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.


7. Repository

text
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 record

The 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_backend have drifted. mavlink_ingest.py is 186 lines here against 304 in NIDAR-GSC, and only the GSC copy calls SET_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.

bash
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 telemetry

NIDAR_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.

DocumentWhat's in it
HandoffStart here. What is proven, what waits on a human, what is unowned
TrapsTen classes of defect this project has already paid for, and what now prevents each
Competition dayHow the GCS is actually operated on the day — draft, never rehearsed
System overviewMission flow, architecture, perception, indigenisation, failsafes
Sizing calculationsWhy every number is what it is
Requirements baselineEvery SYS-xx requirement, traced to a rule and a verification method
Rulebook complianceRule-by-rule matrix, scoring, conflicts
Development planSchedule, critical path, risk and de-scope order
Implementation planWhat to build for autonomy, perception and failsafes — and what can be skipped
Frame design constraintsWhat CAD needs before the first part is cut

Parts

285
QtyValueFootprintReferences
3610kResistor_SMD:R_0201_0603MetricR4, R5, R10, R19, R20, R27, R29, R30, R32, R33, R35, R38, R39, R46, R48, R49 +20
325Vlib:small_padJ10, J12, J13, J14, J15, J16, J17, J18, J19, J20, J21, J22, J23, J24, J25, J26 +16
25100nFCapacitor_SMD:C_0201_0603MetricC2, C3, C11, C12, C14, C16, C43, C44, C45, C49, C53, C54, C55, C59, C63, C64 +9
2415RResistor_SMD:R_0201_0603MetricR17, R18, R23, R24, R25, R26, R36, R37, R42, R43, R44, R45, R55, R56, R61, R62 +8
24DOY180N03TPackage_SON:Diodes_PowerDI3333-8Q1, Q2, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23 +8
14100nFCapacitor_SMD:C_0402_WIDEC46, C47, C48, C56, C57, C58, C66, C67, C68, C76, C77, C78, C83, C85
14CCapacitor_SMD:C_0805_2012MetricC35, C36, C50, C51, C52, C60, C61, C62, C70, C71, C72, C80, C81, C82
121kResistor_SMD:R_0201_0603MetricR28, R31, R34, R47, R50, R53, R66, R69, R72, R85, R88, R91
8TestPointTestPoint:TestPoint_Pad_D1.0mmTP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10
71uFCapacitor_SMD:C_0201_0603MetricC13, C19, C20, C21, C26, C27, C30
4100kResistor_SMD:R_0201_0603MetricR8, R9, R11, R13
410RResistor_SMD:R_0201_0603MetricR22, R41, R60, R79
4220RResistor_SMD:R_0201_0603MetricR21, R40, R59, R78
4AT32F421G8U74in1ESC:QFN-28_L4.0-W4.0-P0.40-TL-EP2.4U11, U13, U15, U17
4NSG2065Q4in1ESC:QFN-24_L4.0-W4.0-P0.50-TL-EP2.8U12, U14, U16, U18
310uFCapacitor_SMD:C_0402_1005MetricC9, C23, C31
347pCapacitor_SMD:C_0201_0603MetricC17, C28, C32
21.2pFCapacitor_SMD:C_0201_0603MetricC22, C25
2100nCapacitor_SMD:C_0201_0603MetricC37, C38
215pFCapacitor_SMD:C_0201_0603MetricC4, C8
21kCapacitor_SMD:C_0201_0603MetricR93, R94
222uFCapacitor_SMD:C_0603_1608MetricC41, C42
24.7uF 50vCapacitor_SMD:C_0805_2012MetricC33, C34
25.1kResistor_SMD:R_0201_0603MetricR1, R2
2CCapacitor_SMD:C_1206_3216MetricC39, C40
2DSK24lib:SOD-123_L2.8-W1.8-LS3.7-RDD2, D3
2LED_1_GreenLED_SMD:LED_0402_1005MetricD4, D5
2LMR51430YFDDCRlib:SOT-23-6_L2.9-W1.6-P0.95-LS2.9-BLU8, U9
2XRTC303020D4R7MBCAlib:IND-SMD_L3.0-W3.0_AFE303020SL6, L7
10.2mRResistor_SMD:R_2512_6332MetricRsense2
10900PC16J0042001EOpenRX-Shared:FILTER-SMD_10P-L2.0-W1.6-BLT1
110nFCapacitor_SMD:C_0201_0603MetricC18
110pFCapacitor_SMD:C_0201_0603MetricC6
110uHInductor_SMD:L_0603_1608MetricL3
113.7kResistor_SMD:R_0201_0603MetricR14
11k4in1ESC:R_0201_0603MetricR95
11nCapacitor_SMD:C_0201_0603MetricC29
11uFCapacitor_SMD:C_0402_1005MetricC84
12.0nHInductor_SMD:L_0201_0603MetricL2
12.2nFCapacitor_SMD:C_0201_0603MetricC5
12.4kResistor_SMD:R_0201_0603MetricR16
12.5nHInductor_SMD:L_0201_0603MetricL5
1200Resistor_SMD:R_0201_0603MetricR7
1220Resistor_SMD:R_0201_0603MetricR3
1220pFCapacitor_SMD:C_0201_0603MetricC24
12450AT18A100EOpenRX-Shared:ANT-SMD_L3.2-W1.6AE1
12450FM07D0034TOpenRX-Shared:FILTER-SMD_4P-L1.0-W0.5-LFL1
124nHInductor_SMD:L_0201_0603MetricL1
1470nFCapacitor_SMD:C_0201_0603MetricC15
147nHInductor_SMD:L_0402_1005MetricL4
147pFCapacitor_SMD:C_0201_0603MetricC10
16.49kResistor_SMD:R_0201_0603MetricR12
17.5kResistor_SMD:R_0201_0603MetricR15
1AIO_outlineOpenDrone:AIO_outlineU1
1CJ17-400001010B20OpenRX-Shared:CRYSTAL-SMD_4P-L1.6-W1.2-BLX1
1Conn_Coaxial_SmallConnector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_VerticalJ2
1ESP32-C3Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.7x3.7mmU4
1INA186A3IDCKR4in1ESC:SOT-363_SC-70-6U19
1LR1121IMLTRTPackage_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.7x3.7mmU3
1OW7EL89CENUYO3YLC-32MOpenRX-Shared:OSC-SMD_4P-L2.0-W1.6-BL_TXC_7ZOSC1
1OpenDrone-Corelib:OpenDrone-Core_LGA_landJ1
1RFX2401COpenRX-Shared:QFN-16_L3.0-W3.0-P0.50-BL-EP1.7U5
1SKY13373-460LFOpenRX-Shared:QFN-12_EP_2x2_Pitch0.5mmU7
1SM06B-SRSS-TB(LF)(SN)lib:CONN-SMD_SM06B-SRSS-TB-LF-SNU10
1TLV75533PDQNROpenRX-Shared:X2SON-4_L1.0-W1.0-P0.65-TL-EPU6
1TS2306A 240GF MSM 9_C2976675lib:SW-SMD_4P-L3.0-W2.0-P0.85-LS3.5U22
1TYPE-C 16P QTWTlib:USB-TYPE-C-SMD_TYPE-C-16P-QTWTUSB1
1XL-1010RGBC-WS2812BOpenRX-Shared:LED-SMD_4P-L1.0-W1.0-TL_XL-1010RGBC-WS2812BD1

Similar boards

  • 6 layers31.2 × 33 mm4in1-mini, the printed circuit board in 3D

    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.

    191 parts279CERN-OHL-S-2.0
  • 8 layers35 × 35 mmOpenAIO, the printed circuit board in 3D

    OpenAIO

    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.

    343 parts19CERN-OHL-S-2.0
  • 6 layers64.2 × 17.3 mmOpenRX panel rev2.2, the printed circuit board in 3D

    OpenRX panel rev2.2

    OpenDrone-hw/OpenRX

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

    254 parts489CERN-OHL-S-2.0
  • 6 layers41.6 × 42.5 mm4in1, the printed circuit board in 3D

    4in1

    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.

    222 parts85CERN-OHL-S-2.0
  • 6 layers13 × 11.1 mmELRS Receiver, the printed circuit board in 3D

    ELRS Receiver

    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.

    47 partsCERN-OHL-S-2.0
  • 6 layers26.9 × 26.9 mmOpenFC, the printed circuit board in 3D

    OpenFC

    OpenDrone-hw/OpenFC-Lite-Mini

    Open-source Betaflight flight controller. RP2354A, 20x20 mm, 6-layer, 3-6S, CERN-OHL-S-2.0.

    131 parts147CERN-OHL-S-2.0
  • 4 layersCABadge V2 1, the printed circuit board in 3D

    CABadge V2 1

    nbtca/CABadge

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

    110 parts15MIT
  • 6 layers32 × 35 mmDreamscape F405-2020, the printed circuit board in 3D

    Dreamscape F405-2020

    sneakylizard123-4/Dreamscape-F405-2020

    a 20x20mm flight controller for 3" fpv drone

    122 parts

Questions

How big is the OpenAIO PCB?

It measures 35 × 35 mm and has 8 copper layers, 1.6 mm thick.

What parts does the OpenAIO use?

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.

Where can I download the OpenAIO KiCad files?

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.

Can I use the OpenAIO design in my own project?

Its repository states no licence, so its author keeps all rights: ask tetraethylmethane before reusing the design.