Open source — ArduPilot log analysis and UAV telemetry research

Two Apache-2.0 Python packages behind the UAV tools on this site: flightdx, which finds faults in ArduPilot and PX4 flight logs with the evidence attached, and sentinel-realtime, a realtime detector tier plus an evaluation harness for LLM agent judges.

By Rahul Rajelli · updated 2026-07-10 · RSS

Apache-2.0 · Python · Runs on your machine

Open source

The browser tools on this site are deliberately small: they run as JavaScript on your machine and hand you an answer in a few seconds. Two things did not fit that shape — parsing a 3 MB dataflash log, and monitoring a live MAVLink link — so they are Python packages instead, published under Apache-2.0.

They follow the same rule as everything else here: every finding prints its evidence — the measured value against the threshold that was actually loaded on the aircraft — so you can check it rather than trust it.

flight.BIN dataflash / ULog ATT VIBE RCOU BAT SEVEN DETECTORS vibrationekfactuatorbattery gpscompassoscillation battery_threshold_misconfigured BATT_LOW_VOLT = 10.5 V BATT_ARM_VOLT = 22.1 V threshold 22.2 V · would never fire

Every finding carries the measured value and the threshold that was loaded on the aircraft, so you can check it instead of trusting it. That one is real: a three-cell failsafe left on a six-cell pack, found on a 3.4 MB log.

t = 8.00sinject t = 11.06s t = 12.78s actuator_saturation SYMPTOM · advised first control_oscillation CAUSE 1.719 s · the two imply opposite actions

Measured on one ArduPilot SITL flight. "Check the motors" is what the first advisory suggests; detuning the controller is what actually fixes it.

Apache-2.0 flightdx ArduPilot dataflash and PX4 ULog parsing with seven fault detectors — every finding prints the measured value against the threshold loaded on the aircraft. Apache-2.0 sentinel-realtime The same detectors over a live MAVLink link, with an escalation gate that absorbed 96.8% of raw detections on a real flight.
73 seconds, unedited: a quadcopter flying with its rate-loop damping removed and its gyro filter set to 4 Hz, oscillating through ±40° in ArduPilot SITL while holding altitude. The card at the end is what the detectors reported and what each judge answered.

The measurement, not a demo reel

32 seconds: the fault injected in simulation, the two advisories arriving in the wrong order, and then what each judge answered — including the free deterministic rule, which scores 0.00 here because it names the symptom every single time.

The last card is the honest ending: one added tool moved one model from 0.00 to 0.53 and moved a second model not at all. A tool surface cannot be evaluated apart from the model consuming it.

What ships, what it found, and how to run it →

flightdx — flight log analysis

ArduPilot dataflash (.BIN) and PX4 ULog parsers, seven fault detectors, and a citation validator that checks whether an LLM-written report is actually grounded in the log it claims to describe.

Detectors cover vibration and accelerometer clipping, EKF and compass inconsistency, GPS fix loss and dilution, actuator saturation, control oscillation, and battery sag and misconfiguration. Each emits the numbers it fired on rather than a verdict alone.

github.com/RahulRajelli/ardupilot-log-analyzer

sentinel-realtime — the realtime tier, and an honest evaluation of it

The same seven detectors over a live MAVLink link on a rolling window, with an escalation gate that collapses a continuous fault into one advisory that re-raises only when it gets worse. On a real flight the gate absorbed 96.8% of raw detector output; on injected simulator faults, 96.9% — produced independently, on completely different data.

The larger half of that repository is a measurement harness, and it exists because of a problem worth stating plainly.

The first alarm is usually not the fault

One fault trips several detectors, and the fastest detector is not the one that is right. A magnetometer offset raises the navigation filter's variance immediately, while the compass detector waits a full second to confirm the anomaly is sustained — so the symptom is reported a second before its own cause.

A mistuned attitude loop is the expensive version. Motor saturation is advised 1.719 s before the oscillation that caused it, and the two imply opposite actions: the first reads as a motor or ESC fault, the second means detune the controller. On the ground that is a wrongly swapped ESC. In the air, "motor failure" on a quadcopter can mean shutting a motor down.

So "whatever alarmed first is the cause" — free, no AI, and right on most faults — is wrong on this one every time, and wrong because of a constant in the detector source rather than by luck. That makes it a baseline an expensive method has to genuinely beat, and it scores 0.00.

What the measurements say

github.com/RahulRajelli/sentinel-realtime · write-ups, including a non-technical one

The cheapest model is not the cheapest answer

Nine models were asked the same question about the same flights, with the same prompts and the same tools. Ranking them by accuracy is the usual move and it hides the thing that decides which one you should actually use: what it costs to buy one correct answer.

TOKENS SPENT PER CORRECT ANSWER · LOWER IS BETTER gemini-3.7-flash 5,138 zai-glm-5.2 5,317 grok-4.6 8,459 qwen3.8-max 8,630 kimi-k3 9,030 gemini-2.5-flash 10,211 claude-sonnet-5 11,453 deepseek-v4-pro 11,895 deepseek-v4-flash 31,055 cheapest model per call — and sixth once accuracy is priced in

Measured on one fault, compass_offset. Seven of the nine have never been tested on a second fault, and both that were fall to zero on it. A ranking on one mechanism, not a league table.

Running them

Python 3.11+. No simulator, no MAVLink link, no API key and no account — it reads the .BIN files already on your SD card.

pip install sentinel-realtime
sentinel analyze YOURFLIGHT.BIN

One command. flightdx is a declared dependency and installs with it; pip install flightdx on its own gets you the detectors without the realtime tier. Both are on PyPI: sentinel-realtime · flightdx.

On a real 3.4 MB log, that reports a low-voltage failsafe configured at 10.5 V on a 22.2 V pack — a three-cell default left on a six-cell battery — sitting next to an arming threshold that was set correctly for six cells. One configuration file, one threshold right and one wrong, and the wrong one is the one meant to save the aircraft. It would never have fired.

What these are not

They are engineering and research artifacts, not products. There is no hosted service, no account and nothing to buy. The realtime tier has never commanded an aircraft and is not designed to: it reads telemetry and reports, and the analysis that decides what a fault means runs offline on a recorded flight rather than in the air.

Sample sizes are small and said so in the repository. Where a claim could not be verified, it is written down as unverified rather than rounded up.

The browser-based UAV tools on this site — including the ArduPilot parameter diff — cover the quick checks. These two cover the ones that need a real parser.