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

How to Read a Blackbox Log: From Squiggly Lines to a Diagnosis

You open a log in Blackbox Explorer and get thirty traces. Explorer shows everything the flight controller recorded; the conclusions are yours. Below: a seven-step manual read, then one real log with every bbdoctor finding, its numbers and how to check it by eye, and when automation has to say "I don't know".

Tools for reading a log

ToolWhat it does for youWhat's left to you
Blackbox Viewer (Blackbox Explorer)Timeline of every field, video sync, spectrum analyser (PSD, throttle and RPM heatmaps, spectrum comparison via CSV import), CSV export. Since 2026.6 a tab in the Betaflight App; standalone blackbox.betaflight.com is frozen.Finding the moments, judging what's normal, picking the parameter.
INAV Blackbox ExplorerThe same for INAV logs.The same; INAV doesn't log motor RPM.
PIDtoolboxThrottle spectrograms, step response, several logs side by side.Interpretation and the parameter.
PID-Analyzer (Plasmatree)Python script: step response by deconvolution, noise against throttle.Interpretation; it won't say whether overshoot comes from FF or P/D.
blackbox_decodeLog to CSV.Everything else, in your own scripts.
Mission Planner, UAV Log Viewer (ArduPilot)Plots of .bin messages: RATE, PIDR/PIDP, VIBE, BAT, RCOU; FFT in the web Filter Review tool.Conclusions and VIBE limits.
PX4 Flight ReviewOnline .ulg plots: rate tracking, motor outputs, spectrograms.Conclusions and parameters.
bbdoctor"What's wrong → what to do" findings with numbers, 90% intervals and commands for Betaflight, EmuFlight, INAV, Rotorflight, ArduPilot, PX4.No frame-by-frame view or video (that's Explorer). Deciding whether to apply the advice.

They don't compete: Explorer studies one second of the flight, automation tells you which second and what to change.

Reading a log by hand in 7 steps

Field names as stored in the log. Index 0 is roll, 1 pitch, 2 yaw. In Explorer, View → Analyser (or the A key) opens the spectrum analyser; then click a trace in the legend.

  1. Timeline and modes. One file can hold several flights, one per arm. Check flightModeFlags: PID response reads far worse in ANGLE and HORIZON than in ACRO. rcCommand[3] shows hovers, chops and punch-outs. Don't trust spectra across logging gaps.
  2. Gyro vs setpoint on flips. gyroADC[0] and setpoint[0] together. Gyro past the target: overshoot. Wobble after the stick stops: low damping or bounce-back. Trailing 20–30 ms behind: sluggish. Add axisP[0], axisD[0], axisF[0] to see which term pushes the quad.
  3. Motors. motor[0..3]. 100% on a full-throttle punch or briefly on a snap flip is fine; pinned there through moves at mid throttle means no headroom. A motor parked at idle after a chop is a common propwash cause. One pair higher than the other all through a hover points to the CG.
  4. Spectrum before and after filters. gyroUnfilt against gyroADC. Above about 80 Hz it's noise, not flying. What survives the filters goes into the PIDs and heats the motors.
  5. Frequency against throttle. A diagonal moving right with throttle is motors and props. A vertical band at every throttle is the frame, stack or an antenna (fig. 1).
  6. I-term in a hover. axisI[0] and axisI[1] should wander around zero. One that holds a value all flight is compensating for an imbalance: CG, a tilted or tired motor.
  7. Voltage and current. vbatLatest and amperageLatest: sag per cell on current peaks, voltage at the end. Voltage step over current step is a rough internal resistance.
Raw gyro noise heatmaps against throttle: a diagonal motor line on the left, vertical frame-resonance bands on the right
Raw gyro noise against throttle. A: roll, Betaflight 4.2.5, 4S, 2 kHz log. The diagonal is the motors: 242 Hz at 20–25% throttle, 398 Hz at 50–55%, about 600 Hz at full. B: pitch, Betaflight 4.5.1, 6S, 1013 Hz log, so the scale ends at 506 Hz. Bands near 186 and 225 Hz hold still from 15 to 80% throttle: frame or stack, not motors. bbdoctor flags them (seen as 186 Hz on pitch, 198 Hz on roll) without a notch: at 1013 Hz logging, 186 Hz may really be 827 or 1199 Hz. Empty rows: throttle the quad barely used.

Steps 4 and 5 need a fast enough log: anything above half the logging rate folds into fake peaks. Setup: blackbox setup guide.

One real log, start to finish

The public log behind the sample report: Betaflight 4.5.2, SpeedyBee F405 Mini, 4S, a 3.5-inch judging by the craft name VX3.5. 110 s of log, 107 airborne, all ACRO. Gyro 8 kHz, PID 4 kHz, logging 1 kHz with raw gyro and eRPM. Of the report's 20 items, here are the main ones and where each number comes from.

Rear motors loaded 50% more: the CG

Average command: rear M1 and M3 28.7%, front 19.2%. Over 12% is a warning, over 30% critical. Confirmation: the pitch I-term median is 45, not near zero, so the controller adds rear thrust all flight. Usually the battery or camera sits too far back; otherwise it's lots of fast forward flight, and a calm hover shows almost no gap. Not a PID problem: move the battery until the quad hangs level on your fingers under the frame's centre.

Roll: 36% overshoot, caused by feedforward

Roll step response: 36% overshoot (90% interval 29–44%), from 165 usable one-second windows (overlapping) of 372 with stick movement; half the requested rate in 8 ms. Lower bound above 15%: a finding. But the advice isn't "lower P" or "raise D". On fast stick moves feedforward does 60% of the work (FF against P), and the gyro runs on average 3 ms ahead of the setpoint: FF is dragging the quad. So only FF changes: f_roll 120 → 102, 15% off your header value, P and D untouched. If overshoot remains only on snappy flips, next comes feedforward_boost 15 → 8. Pitch, same story: 28% (23–37%), FF 56%, f_pitch 125 → 106.

set f_roll = 102
set f_pitch = 106
set simplified_pids_mode = OFF
save

Why simplified_pids_mode: this log's PIDs don't match the sliders, and the Configurator would overwrite them on the next save.

The sharpest roll input in the sample log: setpoint and gyro on top, P, D and feedforward terms below with large FF spikes
Sharpest roll input in the sample log, 0.8 s. A: the stick moves at 200 ms. At 100 deg/s the gyro lags setpoint by 10 ms; at 200 deg/s it leads by 13 ms. Peak 267 deg/s, target 245. On release the gyro dips 66 deg/s below setpoint (496 ms). B: FF spikes to +446 and −467 on stick steps; P stays within 95, D within ±88 (logged PID units).

By eye you won't see 36%: here the peak is only 22 deg/s (9%) over target. Step response is the reaction to an ideal instant step, deconvolved from 165 windows; a real stick input is a ~100 ms ramp. The ramp shows the same thing another way: gyro ahead of setpoint, FF spikes nearly five times P. More in PID tuning from blackbox.

Raw noise 4.1 deg/s: mechanics, not filters

Raw gyro noise above 80 Hz: roll 4.1, pitch 2.4, yaw 2.5 deg/s, just over the 4 deg/s warning line. Filtered: 0.53 deg/s at about 1.4 ms delay, and the report calls the filters fine. So leave them and check props, bearings and stack mounting. 1× vibration per motor is even (M1 1.1, M2 0.5, M3 1.8, M4 1.9 deg/s), and RPM at equal command differs by 1.9% at most. Hunting a bad motor when the spread is large: motor vibration guide.

Motors up to 610 Hz, logged at 1 kHz

eRPM shows motors up to 610 Hz, but a 1000 Hz log sees only up to 500; above that, frequencies fold down, so 610 Hz shows at 390. The per-motor analysis copes (it uses rotation phase from eRPM), but the spectrum and resonance frequencies are ambiguous. The fix:

set blackbox_sample_rate = 1/2
save

FF jitter from the radio: 2.1% of motor range

While the sticks move, FF above 40 Hz (a kick on every radio step) is 2.1% of motor range on roll, 1.7% on pitch, with 34 and 28 kicks per second over 5%. Useful FF below 12 Hz: 1.5 and 1.2%. Sticks still: 0.40%, so stick steps are the source. Link 494 Hz, stick smoothing 185 Hz. FF makes 89% of the high-frequency PID output noise, D 10%, so don't lower D or D-term filters for it; that only adds delay. Lower FF first, smooth it next flight:

set feedforward_averaging = 2_POINT
set feedforward_smooth_factor = 65
save

The D boost barely kicks in

Configured: d_min_roll = 30, d_roll = 45, boost up to ×1.50. bbdoctor measures the real multiplier from the logged D-term (slope of axisD against the gyro derivative at 8–40 Hz, 0.25 s blocks, TPA removed). On the sharpest moves D reaches only ×1.06 on roll, ×1.04 on pitch. You fly on d_min, so change damping via base D (the Derivative column), not D Max. In 2025.12 the names follow the UI (base d_roll, ceiling d_max_roll); see the PID tuning guide.

Propwash 1.1 deg/s: fine

A chop: throttle drops over 25% of travel within 0.15 s from above 35%. There are 46; two rolled straight into a flip, and bbdoctor drops those since stick motion produces the same 15–80 Hz. Over 44 clean chops, gyro minus setpoint at 15–80 Hz, 0.08–0.6 s after the chop: 1.1 deg/s RMS, mostly ~20 Hz; normal is up to 4. Nothing to fix; see the propwash guide if it still bugs you.

Battery: 3.23 V per cell at 72 A

Started at 3.84 V per cell, not full. Sustained minimum (over 0.5 s) 3.23 V, peak 72 A, 3.66 V at the end, about 248 mAh. Internal resistance ≈ 7 mΩ per cell from 182 sharp current changes, wiring included. The pack is at its limit: warning.

The rest

How to verify each finding in Explorer

FindingWhat to plotWhat you should see
CGmotor[0..3], axisI[1]In a hover M1 and M3 (rear in Betaflight's layout) above M2 and M4; axisI[1] near 45.
Overshoot from FFsetpoint[0], gyroADC[0], axisF[0], axisP[0]Gyro above setpoint while still rising; axisF peaks several times axisP. Small FF plus wobble after the stop: P/D.
Raw noisegyroUnfilt[0], gyroADC[0] in the analyserRaw spectrum clearly higher across 100–500 Hz; a nearly flat floor after filtering.
Motors faster than loggingeRPM[0..3]Motor Hz = field × 100 / (motor_poles / 2) / 60. With 14 poles, 610 Hz reads 2562.
FF jitteraxisF[0], setpoint[0]A short axisF spike on every setpoint step; nearly nothing with the stick still.
PropwashrcCommand[3], gyroADC[0..1]A ~20 Hz wobble 0.1–0.6 s after the chop; at 1 deg/s barely visible.
SagvbatLatest, amperageLatestA minimum around 12.9 V on peaks up to 72 A.

Why some findings say "not enough data"

With thin data, an analyser must stay quiet or it confidently recommends nonsense. bbdoctor's minimums:

CheckMinimumBelow it
Whole log10 s in the airAll downgraded to info, no commands
Step response per axis10 usable windows, at least a quarter of all"Not enough data for the step response"
Critical overshoot, deep PID checks50 windows per axisWarning at most, some checks silent
Bounce-back after flips6 sharp stops per axisNot checked
Dips on punch-outs6 punches without stick movementNot checked
Propwash3 clean chops, 5 for a warningNo estimate; info only at 3–4

Example: a Betaflight 4.2.5 log (2 kHz, 4S, 215 s airborne) has 15 chops, but 12 roll straight into a flip or roll. Averaged, "propwash" is 18.4 deg/s: critical (threshold 10). Per chop it runs from 1.4 to 58.6 deg/s, the big numbers being the flips. The three clean chops: 1.8 deg/s, normal. A tool that keeps maneuvers would have you raising D and idle on a quad with no propwash.

Second safeguard: "method bias already subtracted". Deconvolution shows a little overshoot even for a perfect response, especially when setpoint isn't logged and is rebuilt from the sticks. bbdoctor runs the same calculation on a setpoint shifted by the same delay and subtracts it. A Betaflight 4.5.1 log without setpoint (801 Hz, 6S): pitch 29% raw overshoot, 9% of it bias, reported as 20%. On yaw the raw 9.6% was all bias: no overshoot.

How to tell whether to trust the numbers

Workflow: one change per flight

  1. Record 1–2 minutes in ACRO: hover, smooth turns, 5–6 chops, 6–8 flips and as many rolls with a sharp return to centre, 6–8 punch-outs with the sticks still.
  2. Upload it to the online blackbox analyzer. Start with critical items and mechanics; tuning PIDs on an unbalanced frame with chipped props is pointless.
  3. One change per flight. Here: battery, then FF, then FF smoothing. blackbox_sample_rate can ride along with any step, since it doesn't affect flight. Props off when configuring on battery.
  4. Same props, a similar pack at similar charge, the same flying style.
  5. Use "Compare analyses" under your history. Overlapping 90% intervals before and after mean "no change"; flights of different style (average throttle 10% of travel or more apart, or one three times longer) get flagged.

Limitations

Next, by problem: noise and filters, propwash, PIDs from the step response.

FAQ

What can I use instead of Blackbox Explorer?

Betaflight's log viewer now lives in the Betaflight App (app.betaflight.com) as the Blackbox Viewer tab, since the 2026.6 release; the standalone Explorer is feature frozen. INAV has its own INAV Blackbox Explorer. For findings with numbers and CLI commands, upload the log to bbdoctor.

Which log files does bbdoctor read?

Betaflight, EmuFlight, INAV and Rotorflight blackbox (.bbl, .bfl, .txt), ArduPilot .bin and PX4 .ulg, detected by content. ArduPilot text .log and .tlog aren't supported, and neither are ArduPlane, Rover or PX4 fixed-wing logs.

Can I trust an automatic blackbox analysis?

Every estimate has a 90% interval, and below a minimum amount of data there's no verdict at all. The method's bias is subtracted and the advice is cross-checked. Still, it's a pointer, not a ruling: change one setting at a time and check the next log.

Is my log stored?

Only so the analysis can be re-run, and it's deleted automatically; the privacy policy states how long the log and the report are kept. You can share the report link with anyone.

Updated:

More guides