Thank you, it's cool!
Congratulations --- this is a super cool project. I wonder if you've considered using ultralight filaments and 3dprinting the frame? PLA is stiff but brittle, and I know Bambu and a few others sell specialised versions that supposedly weigh less than normal.
Until that happens, this guy here is probably the next best thing: https://www.youtube.com/@MyTechFun
Plot twist: many of the "special" filaments aren't special at all or at least very exaggerated.
https://karolina.mgdubiel.com/drone/drone-img/05-30-26/cnc_c...
I've got a question: why CNC milling and not just FDM 3D printed parts? TFA doesn't talk much about it except saying she went to a machine shop.
> 2. CNC milling forms out of G-10 fiberglass (arms) and 5mm carbon fiber (body)
TFA also says this:
> The solution for this is to 3D print a 0-tolerance assembly jig to hold the arms in perfect position while the center of the drone is superglued together.
Why not 3D print it all?
There's this guy who built a drone that can fly for 3 hours and cover hundreds of miles, 3D printed at home on a $250 printer:
Then there was the $200 K quote for the body for a car that just did Pike's Peak with a four times Pike's Peak champion and instead the team... 3D-printed the car's body at home (something like 40 parts, assembled together), which cost them less than $2 K to make (1/100th of the quoted price for the car's body). Here's the vid where they print all the parts (on a $1500 consumer printer):
Basically: why CNC milling and not 3D printing at home when many drones enthusiasts (and now too people building race cars) simply print parts at home on a consumer-grade 3D printer?
The milled fiberglass the author used is a much better UAS frame material than anything from a filament 3d printer due to stiffness and related considerations.
The name "octocopter" does not make sense. "Helicopter" is a compound word made of "helico-" and "pter", which means "screw-wings". "Octo-" means eight, "-co-" means nothing.
"Octopter" would be a correct compound word meaning "8-wings", but that would be ambiguous, so the object discussed in TFA is better named just "8-propeller drone".
Copter-style drones are exposed to vibration across a huge frequency range in every axis, and it's almost impossible to avoid really nasty resonance issues using generally-printable FDM filaments and "standard" design techniques; it's a lot easier to just use super-stiff carbon fiber and CNC it.
For planes, like what you linked, 3D printing is more "plausible" than for copters but also not really practical; you can 3D print a good plane, but plastic lacks the durability and favorable weight characteristics of foam - plastic planes tend to be "one time crashed" while foam is easy to repair, restore, and rebuild.
You think s/—/--/g is more work than rewriting a whole article? Is this what you're saying?
Higher end stuff will use a ton of inputs (visual odometry, binocular vision, lidar, range finding, etc) fused into some kind of proprietary blended algorithm that you could probably call an MPC.
RL is pretty cutting edge, especially for fast path motor control; there are a lot of university competitions for drone control that lead to a lot of papers and projects in the space (some promising) but most commercial stuff has not adopted this yet, certainly not at the low end.
On top of this (Maybe at a few hundred hz), you can add outer controls to set attitude. This could be an autopilot, or having the controls command attitude instead of rate. Betaflight pilots usually don't both with this, and have the simple setup of control maps to rate.
I've programmed firmware using a weird hybrid where the controls command a change in the target attitude. So it flies like rate, but has the forced attitude stability of an attitude-based control system. Non-standard, but makes it so you don't need to worry as much about tuning the PID loop. In practice, you can do full aerobatic flight with this like you'd do with a rate-only setup. (Basically, there is a commanded attitude quaternion; controls nudge it; the PIDs update motor power to maintain this commanded quaternion.)
I'd expect an engineering project with "no prior experience" to take weird/experimental approaches more often compared to a "from scratch" project (where I would expect proven minimalism instead).
Multi-rotor drones have been called tricopters, quadcopters, hexacopters, octocopters based on their propeller counts conversationally for as long as I can remember.
There are plenty of commercial vendors who use the exact term for their expensive industrial drones.
Update: I see that in the four minutes it took for me to validate my initial inclination and post that plenty of others also had the same thought :) No need to me to belabor the point!
And frankly as a pilot, I'd rather not see any completely autonomous drones with no oversight in the sky - that's one incident away in which blame cannot be put solely on the operator from getting the hobby completely banned.
The delta between what is possible with current autonomous flight missions and manual FPV style flight is by having a brain on board that can dynamically adapt to a changing environment. There are a finite amount of PID profiles for each steadystate solution that a researcher can preprepare for. But RL allows an overarching heuristic to transiently alter the PIDs depending on the changing environment.
We use PIDs because analyzing robotics platforms as seeking a steadystate dramatically simplifies the math needed to where its computationally possible for us to solve for a situation.
We use RL in systems that have continuously changing environments with transient solution spaces that are easier to model in hyperspace with a RL model.
Take for example platforms that have tiltrotors. They ideally have a minimum of 3 PID profiles for flying. One when it best fits a multirotor profile. A second when it is transitioning from multirotor to fixed wing flight, and a third for when fixed wing flight is established. What happens when the researcher has a need to fly in the transition state, or subconfigurations of the states? How many PID profiles are you looking to think of and train for? This is where RL has dividends.
A nit pick with your post - you use the word 'ambiguous' but really this is from the latin root 'ambiguus' so we don't need the supurflous 'o' in between the two u's.
gyrocopter, helicopter, quadcopter, hexacopter, octocopter, parcelcopter, and—most famously—
roflcopter, https://en.wiktionary.org/wiki/roflcopter#/media/File:Roflco...
They all have their own dictionary entries.
Octocopter makes perfect sense. Everyone understands immediately what it means, and that's the only purpose of language: to convey ideas. It should be clear, which this is, and concise, which this is.
Fidelity to ancient Greek is not, and should not, be a goal for English.
Oh, language changes and now "nit pick" means "to make trivial criticisms" even though neither "nit" nor "pick" etymologically has anything to do with criticisms? How very self-serving of you ;)
Which also means great people can go beyond what’s their school was about, so a CS major doing CNC isn’t “weird” or different, I remember when applying for jobs in systems in aerospace industry and get rejected despite having a systems background too, with feedback of “they are looking for people with education only in aerospace”, which is idiotic thing to consider.
So good luck OP, start exploring hacking mavlink or similar protocols which is what im working on.
I've heard the dust from carbon fiber is second to asbestos for inhaling.
Since posting on X, I've gotten many DMs asking exactly how I want to approach the next phase of this project: making the drone fly with RL. Here's the plan I have so far.
Most importantly, the RL policy will directly command all 8 motors at 50 Hz over a serial link to the flight controller with no traditional PID loop in the path. This is the only architecture that gives the policy full authority to reallocate thrust when motors fail.
I'm focusing on six unique failure classes (ignoring rotational equivalence): single motor, adjacent pair (45°, mixed CW/CCW), 90° same-type, 135° mixed, 180° same-type, and full ESC loss (each ESC controls its own quad). The hardest case is the 90° same-type failure, because it's the only one that hits both problems simultaneously: a yaw torque imbalance (the two dead motors were the same spin direction) and a spatial asymmetry in the remaining thrust geometry.

The single- and dual-motor failures that I want to support, plus ESC loss
Losing two same-spin motors leaves 2 CW and 4 CCW running (or vice versa), yaw-torque imbalanced 2:1 at equal throttle. Balancing them forces the CW motors to run at 2× the per-motor thrust of the CCW motors. At 1393 gf max per motor, the yaw-balanced thrust ceiling works out to 5,572 gf -- enough to maintain a 2:1 thrust-to-weight ratio up to ~2.8 kg of drone weight (we're at 1 kg). The remaining 6 motors span a 270° arc, so roll and pitch authority still exists. The worst case is survivable -- the drone would be spinning, but it could still hover to a soft landing.
| Full 8-motor | 90° same-type (6 motors) | |
|---|---|---|
| Max total thrust | 11,144 gf | 5,572 gf (yaw balanced) |
| CW motor load at hover | ~9% | ~18% |
| Max drone weight at 2:1 T/W | ~5.6 kg | ~2.8 kg |
| Yaw authority | full | near zero |
Simulation
I'm building the sim in MuJoCo, because it runs fast on a CPU and I have a Mac, which rules out Isaac Lab and basically everything else NVIDIA-shaped. For a single rigid body with 8 thrust points, MuJoCo is more than enough, and I can run ~128 environments in parallel on my laptop.
The model itself comes from measurements, not the CAD. I'll be gathering data on:
I'm also adding two things to my sim environment that I keep reading are what actually kill sim-to-real transfer for motor-level control:
1. Motor lag: real motors take 20–50 ms to reach a commanded speed. In sim, thrust changes instantly unless you model it. A policy that learns with instant motors learns to twitch.
2. Loop latency: on the real drone, there's ~15–30 ms between the IMU reading and thrust actually changing (serial read, inference, serial write, ESC response). If I train with zero latency, the policy will oscillate the second it touches hardware. This one scares me the most, so it's getting randomized aggressively (the policy trains against a delay that changes every episode and jitters within episodes).

The high-level plan moving forward
puffer. just puffer. trust me. you will thank me in about a month from now.
— Chris von Csefalvay 🔜 CVPR26 (@epichrisis) June 7, 2026
Everything else physical gets randomized too: mass ±10%, per-motor thrust constants ±15% (cheap motors are not identical, I own eight data points proving this), center of mass, battery sag over a flight, sensor noise[4].
Training
PPO[1] via PufferLib. I looked at SAC since it's more sample-efficient, but sample efficiency solves a problem I don't have -- my sim steps are nearly free. PPO with a pile of parallel environments is what almost every sim-to-real flight paper I've read actually shipped, and it scales more simply across parallel envs and is more stable under the variance that heavy randomization adds". (Also: an X reply told me "puffer. just puffer. trust me.")
Two more decisions I stole from sim-to-real literature:
1. The critic gets to cheat. During training, the value network sees ground truth the real drone will never have, like which motors are dead, the exact thrust constants, and true velocity. The actor only sees what real sensors provide. The critic gets thrown away after training, so this costs nothing at deployment. (This is called asymmetric actor-critic[2], and I've read that it makes a huge difference when the physics are randomized this hard.)
2. No fault detector (for now). The policy sees its last 5 observation/action frames and has to figure out failures on its own, from the gap between what it commanded and what the drone did.
Under a same-type dual failure the drone physically cannot hold its heading -- the torques don't balance at any throttle combination. The right behavior is to give up on yaw, spin slowly about vertical, and stay level. If the reward punishes spinning, the policy sacrifices roll and pitch chasing a heading it can't have. Mueller & D'Andrea showed the same thing for quads losing a motor[3] -- their recovering quad spins the whole time. Mine will too, on purpose.
Deployment
If the policy shows promising survival rates in sim, it'll get exported to ONNX and run on the RPi 4 (I think. Any opinions on this vs other microcontroller options?) the network is ~45k parameters, which is under a millisecond of inference, so the Pi is not the bottleneck. The 50 Hz loop will read attitude and gyro over serial, run the policy, and write 8 motor commands.
Then, the actual experiment: fly, kill motors from the transmitter, and find out if millions of simulated crashes taught it anything!
large schedule 40 or 80 tubing sliced into rings would be pretty quick source material, starting with duct tape and zipties until you find a good arrangment then get into the glue and screws.