bbdoctor
Drone diagnostics from logs: Betaflight, INAV, ArduPilot, PX4
RUENESPTUA

Drone Vibration: Find the Bad Motor or Prop From Your Log

After a crash the quad buzzes on throttle, the footage has jello, and one motor comes down hotter than the rest. Pulling props one at a time and swapping motors is slow, and unreliable when the problem comes and goes. With the right fields recorded, the log points straight at the motor and separates real vibration from look-alikes: an off-centre CG, a tilted motor, telemetry glitches.

Below: how it works in bbdoctor, its thresholds and what real logs showed.

What is shaking: motor, prop or frame

What the log showsLikely causeWhat to do
One motor has a much stronger component at its rotation frequency (1×) than the othersImbalance: bent or badly seated prop, debris under the hub, bent bell or shaftFresh prop, then inspect bell and shaft
One motor has elevated 2× or 3× componentsDamaged blade, blades with different pitch or trackingReplace the prop
A motor spins slower than the others at the same commandWorn bearings, rubbing bell, burnt winding, higher-pitch propSpin it by hand, swap it with a neighbour
A motor spins faster than the others at the same commandThe prop loads it less: chipped, clipped, wrong size, slipping on the shaftInspect and replace the prop
A peak at one frequency regardless of throttleFrame, stack, camera or antenna resonanceTighten screws, secure parts; a notch is only a stopgap
Motors of one spin direction always work harderTilted motor, twisted arm, mismatched prop pitch on the diagonalsCheck the frame on a flat table, straighten motors, matching props
One pair (front or rear) is always loaded more, pitch I-term never returns to zeroOff-centre CGMove the battery instead of replacing motors

The last two rows aren't vibration, but they usually explain one hot motor.

Why the spectrum can't name the motor

Motor speeds keep changing, so over a flight their peaks smear into one band, and equally loaded motors differ by a few hertz at most. Even when pairs spin differently (on the VX3.5 below, the rearward CG kept the rear motors at 240–280 Hz and the front at 190–215), the spectrum can point at a pair, not a motor.

Then there's the logging rate. On that 3.5-inch VX3.5 the peak motor speed across flights was 583–644 Hz (roughly 35,000–39,000 RPM), while the log ran at 1 kHz, so only content up to 500 Hz is visible. Everything above folds back: 600 Hz shows up at 400 Hz, 644 Hz at 356 Hz. The peak is there, but its frequency no longer says where it came from.

What the log needs

Two things: the unfiltered gyro and per-motor RPM.

For Betaflight 4.5+ (14 poles covers most motors from 18xx up; if in doubt, count the magnets in the bell):

set dshot_bidir = ON
set motor_poles = 14
set blackbox_disable_rpm = OFF
set blackbox_disable_gyrounfilt = OFF
set blackbox_sample_rate = 1/2
save

The 1/2 divider assumes a 4 kHz PID loop; at 8 kHz use 1/4, or you'll log at 4 kHz and fill the flash twice as fast. The test flight: a minute or two of hovering, smooth throttle sweeps, some forward flight. Freestyle with crashes is worse: impacts add their own noise and motor speeds keep crossing. More in the blackbox setup guide.

How per-motor order tracking works

It's borrowed from rotating-machinery diagnostics:

  1. Motor phase. eRPM gives each motor's rotation frequency at every sample; accumulating it gives the rotor angle, the phase.
  2. Blocks. The raw roll and pitch gyro, with motion below 30 Hz removed, is cut into 0.25 s blocks: 4 Hz frequency resolution.
  3. Demodulation. Each block is "unwound" by one motor's phase. Whatever rotates in sync with that motor adds up; the other motors and the noise average out. This yields 1× (once per revolution: imbalance), 2× and 3×.
  4. Noise floor. The same calculation 12 and 16 Hz either side of the harmonic gives the background, which is subtracted in power terms. The report shows vibration "with noise subtracted".
  5. Rejection. A block is skipped when any motor is below 20 Hz, and a harmonic when it is under 40 Hz, within 15 Hz of half the logging rate, or within 10 Hz of any other harmonic, another motor's or its own folded one: where they cross, they can't be told apart.
  6. Result. The median over all blocks, which shrugs off outliers. At least 8 blocks (two seconds of usable flight) are required.

Because the phase comes from the true rotation frequency, aliasing doesn't matter: a motor at 640 Hz in a 1 kHz log is analysed like one at 300 Hz. Rejection costs data: in a 193-second VX3.5 flight the front-left motor kept 387 of roughly 770 blocks.

ConditionThresholdWhy
Motor's harmonic above its own noiseat least ×2.5Don't accuse a motor over a level buried in the background
Referencemedian of the other motors whose harmonic is at least ×1.5 above noise; 0.1 deg/s if there are noneThe motor itself is excluded, and motors whose harmonic is lost in noise don't drag the reference down
1× stronger than the reference1.8× warning, 3× criticalFor comparison: unflagged spread in our logs reached 1.5–1.7×
2× or 3× stronger than the reference2.2× warningThese harmonics are weaker and scatter more between motors
Minimum data8 blocks of 0.25 s, data on at least three motorsTwo blocks or a single neighbour prove nothing

What real logs showed

The same motor in three flights

A 3.5-inch VX3.5 on Betaflight 4.5.2, 4S, 1 kHz logging, three flights of two to three minutes. All three times the report flagged M4, front left:

1× vibration per motor across seven flights: on the VX3.5, M4 is the highest in flights A, B and C (2.0×, 2.0×, 2.2×); on the 6S quad, flights D to G, the loudest motor is M3, then M3, M1 and M4
1× vibration per motor, noise subtracted: VX3.5 flights A–C (left), 6S quad flights D–G (right, threshold crossed only in E and F). Dashes: 1.8× the median of the other motors; labels: loudest motor vs the rest.

That's the signature of a hardware problem: chance doesn't pick the same motor three times. In a fourth flight M4 was the loudest again, at 1.75×, just under the threshold, so the report stayed quiet. The threshold cuts borderline cases; you decide from a series of logs.

M3 (rear left) also runs high at 1.6–1.7× but never crosses the threshold: worth a look, no more. And M4 is the least loaded motor on this quad (in flight two the front pair averaged 21% command, the rear 33%), yet it vibrates the most. So it's not load but an imbalance in the prop, bell or shaft.

A 6S quad where the culprit moves around

A different build on Betaflight 4.5.1, 6S, logging at about 1 kHz, four flights over two weeks. One flight flagged M3 (rear left): 3.2 vs ~1.7 deg/s, 1.8×, ×12.4 above noise, 619 blocks. Another flagged M1 (rear right): 4.0 vs ~2.1, 1.9×, ×13.3, 713 blocks. In the other two, M3 and M4 were loudest at 1.5× and 1.6×, below the threshold.

The signal is stronger here, but the culprit changes between flights. That usually means props, which get swapped, clip grass and chip. When the finding moves around, start with a fresh set of props, not motors.

These logs also show why the noise gate matters. Single motors had an alarming-looking 2× ratio of 4.8–5.3, but no other motor's 2× rose even ×1.5 above noise, so the ratio was taken against the 0.1 deg/s floor. The harmonic was about 0.5 deg/s, ×1.6–1.9 above noise, under the ×2.5 gate, so the report rightly ignored it.

Reading the "the more even, the better" line

The report lists each motor's 1× vibration. For VX3.5 flight two: M1: 1.4, M2: 0.7, M3: 2.3, M4: 2.9.

Left: bars of 1×, 2× and 3× vibration for motors M1 to M4; at 1× M4 stands out at 2.95 deg/s, 2× is low on every motor, 3× is even around 1 deg/s. Right: each motor's RPM deviation from the others at the same command; all lines stay within ±4%, far from the ±6% and −10% thresholds
VX3.5, flight two. A: 1×, 2× and 3× per motor, noise subtracted (grey dots: noise floor); M4 stands out at 1×, while 2× stays under 0.6 deg/s and 3× is even, so no damaged blade. B: RPM deviation from the other motors at the same command, within ±4%; red dashes ±6%, red dots −10%.

Absolute numbers depend on the frame, arm stiffness and FC mounting, so don't compare "2.9 deg/s" between quads; compare motors within one quad and against its earlier logs. If the line evens out after a prop change, it is fixed, even if nothing was flagged.

When data is thin

A PX4 1.12 log at 200 Hz from a large 6S craft, motors at 41–53 Hz: harmonics keep dropping below 40 Hz, hitting the 85 Hz ceiling or crossing. 1× was computable on two motors only. At 2× the report said "motor 2: elevated 2× harmonic, 52.9× stronger (5.3 vs ~0.0 deg/s)", but the other motors had no measurable noise floor, so none entered the reference and the ratio used 0.1 deg/s, although motor 1's own 2× was higher, 8.6 deg/s. Inspect the props, but it's no verdict: weigh absolute deg/s, block count and logging rate, not just the ratio.

RPM at the same command

The second, independent check covers friction and load. Healthy motors with matching props spin equally fast at the same command. The analysis bins the flight by motor command (10–90% in 5% steps, at least 0.3 s of data per motor in each bin) and compares each motor's median RPM with the average of the other motors, so one weak motor doesn't make its neighbours look fast. The result averages the bins.

RPM also lags the command by about 20 ms of rotor inertia. Ignored, that makes harder-working motors (say, the rear pair with a rearward CG) look 2–3% "slower" with nothing wrong, so the command gets the same lag first.

Deviation from the othersLevelWhat to check
−6% or lowerwarningBearings (spin by hand, feel for grinding), a rubbing bell, overheated windings, prop pitch
−10% or lowercriticalSame, and don't fly it until checked: it eats thrust headroom and overheats
+6% or higherwarningThe prop: chipped or clipped blade, wrong pitch or size, slipping on the shaft

Normal: the VX3.5 came out at +2.0%, −1.7%, +2.0%, −2.2%, with single bins up to ±4% (panel B above); the rear pair reads slightly "faster" almost everywhere, likely not the motors: the rearward CG keeps them at high command for long stretches, while the front pair only touches it in bursts. The 6S quad's totals stayed within ±0.6%. The 6% threshold sits well clear of this scatter.

Read both checks together. Strong 1× with normal RPM: imbalance (the VX3.5's M4). Low RPM without a 1× spike: friction or a cooked winding. Both on one motor: usually crash damage, a bent shaft or a rubbing bell.

Confirm it on the bench

  1. Fresh prop. Fit a new prop from the same batch to the suspect motor and fly. Peak gone — it was the prop. Check that the hub sits flat: sand or a cocked washer under the prop causes the same imbalance.
  2. Motor by hand. Battery disconnected, prop off (the motor may still be hot after a flight), spin the bell: grinding, notchiness, vertical shaft play or rub marks on the stator mean new bearings or a new motor. Watch from the side for bell wobble; impacts bend bells.
  3. Swap. Swap the motor with a neighbour. The problem moved — it's the motor. It stayed — check the ESC, solder joints or arm.
  4. Geometry. On a flat table, check that every motor stands vertical and no arm is twisted.
  5. Control log. Fly the same simple flight and compare the 1× line.

Motors tab spin tests — props off only. Some faults hide without load, so the log has the final word.

Numbering: Betaflight and INAV, Quad X — M1 rear right, M2 front right, M3 rear left, M4 front left. ArduPilot and PX4 — 1 front right, 2 rear left, 3 front left, 4 rear right. bbdoctor uses the log's firmware numbering and, when the frame layout is known, adds the position: "Motor 4 (front left)".

Look-alikes: when the motors are fine

Jello in the footage

Jello is a rolling-shutter artefact: the sensor reads the frame line by line, and if the camera shakes during readout, the lines shift. So jello directly shows vibration reaching the camera: prop or bell imbalance, a loose mount, a resonating bracket.

Log first: if one motor stands out at 1×, change its prop and inspect the motor, then fit fresh props all round. If per-motor vibration is even and the jello stays, it's the mount: tighten the screws, make sure the camera doesn't touch the frame, add dampers or a TPU mount. Stabilisation in post often won't remove fine high-frequency jello.

No RPM in the log

INAV and EmuFlight usually don't log per-motor RPM, nor does Betaflight before 4.5, and ArduPilot or PX4 without ESC telemetry have no source for it. Per-motor analysis is then unavailable, and the report says so. What still works:

Then it's the old way: new props first, then motor swaps. If your ESCs can do bidirectional DShot, enabling it on Betaflight 4.5 beats a day of swaps.

Check it automatically

Upload your log to bbdoctor, free and online. It runs every check in this guide. If fields are missing, the report says which to enable and gives the CLI commands. See the example report, and check your settings before flying with the config check.

FAQ

How do I tell which motor is causing the vibration?

You need a log with the unfiltered gyro and per-motor RPM (bidirectional DShot or ESC telemetry). Then the vibration can be split by motor: the culprit shows a much stronger component at its own rotation frequency (1×). bbdoctor flags a motor when that component is 1.8× stronger than on the others and clearly above the noise. Without RPM in the log you are back to swapping props and motors.

Is it the prop or the motor?

Put a fresh prop on the suspect motor and fly again. Peak gone — it was the prop. Still there — swap the motor with a neighbour: if the problem moves with the motor, the motor is at fault (bell, shaft, bearings); if it stays on the same arm, look at the ESC, solder joints or the arm. If the motor keeps standing out flight after flight, even with a new prop, look at the bell, shaft and bearings.

Why is one motor hotter than the others?

Compare its RPM at the same command: if it spins 6% or more slower than the others, something is dragging it — bearings, a rubbing bell, a burnt winding or a higher-pitch prop. If its RPM is normal, the usual cause is an off-centre CG: one pair of motors works harder all the time and runs hotter.

Does finding the bad motor work without bidirectional DShot?

The per-motor analysis does not: without RPM there is no way to tie vibration to a specific motor. The log still shows the overall noise level, frame resonances, load imbalance between motor pairs and a diagonal that is fighting yaw. The exact motor is then found by swapping props and motors.

Updated:

More guides