All blade counts the tool tried
| Blades | Thrust (gf) | vs target | gf/W | In band |
|---|
ML + physics + CAD for small electric UAS
Give it a target thrust, a diameter and a motor speed. A model trained on simulated propellers proposes blade geometry, a blade-element momentum solver checks what that blade actually does, and CadQuery turns it into STEP and STL files. Every performance number on this page is simulated, not measured.
Four stages. The third is what makes it a design tool rather than a regression: the model proposes, the physics decides.
Thrust, diameter and rpm (from motor Kv × battery voltage), plus an optional blade count. These become two dimensionless inputs: a thrust coefficient and a Reynolds number.
A linear regression predicts chord and twist at 18 radial stations for each blade count from 2 to 6. It was trained on the efficient frontier (29,639 blades) of 200,000 synthetic propellers.
Each candidate is simulated with blade-element momentum theory. The most efficient one landing between 0% and +20% of the thrust target wins.
CadQuery lofts cambered NACA sections (14% thick at the root, 7% at the tip) along the blade, patterns the blades around a hub, and exports STEP and STL.
Six requirements that span the range, generated ahead of time by
src/export_showcase.py with the same code the local web app runs.
Two sit outside the validated diameter range and one misses the thrust band,
and the tool flags all three.
Loading designs…
Before trusting simulated training data, the BEMT solver was run on all 119 propellers in the UIUC database (2,121 operating points) and compared against wind-tunnel measurements.
The small within-propeller spread means the solver tracks each blade consistently. The large between-propeller spread comes mostly from unknown airfoil sections: the solver assumes one airfoil for every blade, and the database doesn't say which each one uses. That is a floor to report, not a bug to tune away. Because the bias runs low, a real blade built to a design that simulates exactly on target would likely make more thrust than predicted.
The deployed model is a plain linear regression. XGBoost was benchmarked against it on the same data and tied, so the simpler, smoother model shipped. Every one of the 119 real propellers is held out from training, because training uses synthetic blades only.
For 15 real operating points, the tool designed a propeller for the same thrust, diameter and rpm. That design was compared with the best real propeller meeting the same requirement. Both sides are simulated in the same solver, so its bias cancels and the comparison measures design quality. It is not a test against measured data.
Result in the 6–11 in range: 8 of 10 cases were no more than 15% less
efficient than the best real reference. The two failures are both 11 in cases,
ma_11x4 and grcp_11x4. For those, auto-select picked
5 blades where the real propellers use 2, and the designs came out 38–42% worse.
Outside 6–11 in, the model extrapolates below its training Reynolds range and does
markedly worse, which is why the tool warns there.
Phase 3 closed-loop results (CSV). “vs best real” compares thrust per shaft watt; positive means the design beats the reference. Pass means no more than 15% worse.
| Case | Dia. (in) | Target (gf) | Thrust err. | Blades (tool / real) | Design gf/W | Best real gf/W | vs best real | Verdict |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
Large positive values like +77% (mi_5x3.5) don't mean the tool beats real
propellers by that much. They sit outside the validated range, and they mostly show that the
nearest real reference was built for a different operating point.
This rebuilds my high-school AIAA paper, Using Machine Learning to Expedite Production of Aircraft Propellers. The original trained a model on labels that already contained a fixed efficiency assumption, so it mostly relearned that assumption. This version generates its training data with a physics solver that was first validated against wind-tunnel data, and it retargets the problem from piston aircraft to small electric hover rotors (2–30 in).
The full tool is a local Flask app. It isn't hosted here because its CAD stack needs about 2 GB of dependencies and about 760 MB of memory per design. The examples above were generated offline with the same code. Measured data comes from the UIUC Propeller Data Site.
| Blades | Thrust (gf) | vs target | gf/W | In band |
|---|