v1.3.0 β€” Now Available Β· Apache 2.0

GOOSE

Open Source Drone Flight Analysis

Analyze crash logs. Diagnose failures. Ship safer drones.

terminal
$ goose serve flight.ulgπŸͺΏ GOOSE v1.3.0 β€” Flight Analysis Dashboard━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Parsing flight.ulg ...  βœ“  (14,832 samples, 18m 42s)Running 11 analysis plugins ...  [βœ“] crash_detection      CRITICAL  Motor #3 failure at T+847s  [βœ“] vibration            WARNING   RMS spike 3.2Οƒ above baseline  [βœ“] battery_sag          OK        Max sag: 0.31V (within limits)  [βœ“] gps_health           OK        Min sats: 12, max HDOP: 1.4  [βœ“] motor_saturation     CRITICAL  Motor #3 saturated 100% (6.2s)  [βœ“] ekf_consistency      WARNING   Innovation spike before crash  [βœ“] rc_signal            OK        Min RSSI: -68 dBm  [βœ“] attitude_tracking    WARNING   Uncontrolled roll divergence  [βœ“] position_tracking    CRITICAL  Position loss after T+847s  [βœ“] failsafe_events      INFO      LAND failsafe triggered T+849s  [βœ“] log_health           OK        No dropouts detected━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ROOT CAUSE: Motor #3 electrical failureCONFIDENCE: 94%CRASH SCORE: 87/100 (CRITICAL)Dashboard ready β†’ http://localhost:8000  Flight Analysis Summary:  18m 42s flight, Quadcopter in Position mode (fw v1.14.3).  Overall score: 23/100 (Critical).  CRITICAL β€” Motor #3 electrical failure. 94% confidence.  CRITICAL β€” Motor #3 saturated 100% for 6.2s before impact.  3 warnings: vibration spike, EKF innovation, roll divergence.  Interactive charts, flight path map, and gauges ready.

Everything you need to understand a crash

Snort for drone flight data β€” pattern-match your telemetry against known failure signatures.

πŸ’₯

Crash Root Cause Engine

Automatic crash diagnosis with confidence scoring and inspection checklists

πŸ“Š

Interactive Flight Charts

Altitude, battery, motors, attitude, vibration, GPS β€” all with zoom/pan

πŸ—ΊοΈ

Flight Path Map

GPS track on dark satellite tiles with timeline-linked position scrubbing

πŸ“

Auto Flight Narrative

Plain-English flight summary generated from findings β€” no AI, pure analysis

πŸ”Œ

11 Analysis Plugins

Vibration, GPS, battery, motors, EKF, attitude, RC, position tracking, and more

🎯

Health Gauges

Battery, vibration, motor balance, and stability gauges with color-coded scoring

🧩

Plugin Ecosystem

Write your own analysis plugins, share with pip install

πŸ–₯️

Local Web Dashboard

Full GUI at localhost β€” no terminal required. Upload, analyze, explore

Up and running in 3 steps

01

Install

pip install goose-flight

One command. No Docker, no accounts, no cloud.

02

Analyze

goose crash flight.ulg

Point it at your log. Get a root-cause report in seconds.

03

Review

goose serve

Local web UI opens at localhost:8000 with full findings.

Architecture

A clean pipeline from raw log bytes to scored findings β€” no magic, no black boxes.

data-flow
  .ulg / .bin / .tlog / .csv           |      [ Parser Layer ]      Auto-detects format           |      [ Normalized Flight Object ]      pandas DataFrames + metadata           |      [ Plugin Engine ]      Discovers & runs all plugins           |      [ Findings + Scoring + Narrative ]      Severity, scores, evidence, summary           |      β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”      |         |    [ CLI ]  [ Web Dashboard ]    Terminal   localhost:8000    output     Score ring, gauges,    + JSON     interactive charts,               flight path map,               auto narrative
Parser Layer

Auto-detects log format from file header magic bytes. Normalises timestamps, resamples to a common time base, and handles corrupt or truncated files gracefully.

Normalized Flight Object

All data lives in typed pandas DataFrames keyed by stream name. Every plugin sees the same interface regardless of whether the log came from PX4, ArduPilot, or a custom autopilot.

Plugin Engine

Discovers plugins via Python entry-points β€” no config file needed. Runs each plugin in isolation, catches exceptions so one bad plugin never kills the run.

Findings + Scoring

Each finding carries a severity (critical / warning / info / pass) and a 0–100 score. The overall flight score is a weighted average, with crash_detection weighted highest.

Plugin Library

11 active plugins in v1.3 Β· 8 more planned Β· write your own in ~50 lines of Python

Active β€” v1.3

crash_detectionactive

Motor failure, power loss, GPS loss, impact signature detection

Detects rapid altitude loss (>5 m/s sustained), sudden attitude divergence (>30 deg in <2s), motor output drops to zero, and high-g impact signatures. Classifies crashes as motor_failure, power_loss, gps_loss, pilot_error, mechanical, or unknown with confidence scoring.

altitudeattitudeimpactconfidence
vibrationactive

Accelerometer RMS/peak analysis, clipping, bearing degradation

Computes RMS and peak vibration per axis against PX4 thresholds: good <15 m/sΒ², warning 15–30, bad >30. Detects accelerometer clipping/saturation and bearing degradation trends over flight duration.

RMSpeakclippingbearing
battery_sagactive

Voltage sag under load, brownout risk, cell health

Measures voltage drop under load, minimum cell voltage (warning <3.5V, critical <3.3V), brownout risk detection (>0.5V drop in <1s), and battery temperature monitoring.

voltagecellbrownouttemperature
gps_healthactive

Satellite count, HDOP, dropout detection, jamming

Monitors satellite count (warning <10, critical <6), HDOP quality (warning >2.0, critical >4.0), GPS dropout detection, fix type degradation, and jamming indicators.

satsHDOPdropoutjamming
motor_saturationactive

Output limits, asymmetry, failure signatures

Detects motors hitting 100% output (saturated), motor asymmetry between axes, motor failure signatures (output drops to 0 while others compensate), and remaining motor headroom.

saturationasymmetryheadroomfailure
ekf_consistencyactive

Innovation monitoring, filter health, fault detection

Checks velocity and position innovation ratios (warning >0.8, critical >1.0), magnetometer consistency, EKF reset detection, and estimator fault flags.

innovationsmagresetsfaults
rc_signalactive

RSSI monitoring, dropout detection, stuck channels

Monitors RSSI minimum and average (warning <70%, critical <50%), signal dropout detection (gaps >2s), stuck channel detection, and RC failsafe event tracking.

RSSIdropoutchannelsfailsafe
attitude_trackingactive

Roll/pitch/yaw error vs setpoint, oscillation

Compares roll/pitch/yaw actual vs setpoint, computes RMS tracking error per axis (warning >5 deg, critical >15 deg), detects PID oscillation via sign-change rate analysis.

rollpitchyawPID
position_trackingactive

Position error vs commanded, hover drift

Measures horizontal position error via Haversine calculation (warning >3m, critical >10m), vertical altitude error (warning >2m, critical >5m), and hover drift detection during low-velocity flight.

Haversinealtitudedrifthover
failsafe_eventsactive

Failsafe triggers, emergency mode transitions

Catalogs all failsafe triggers with timestamps, identifies emergency mode transitions (RTL, LAND, emergency), distinguishes failsafe-triggered vs pilot-initiated mode changes.

RTLLANDtimestampsmodes
log_healthactive

Data integrity, dropouts, rate checks

Checks for data dropouts (timestamp gaps >1s), verifies all expected data streams are present, validates data rates (warning if <1 Hz), and cross-checks measured duration against metadata.

dropoutsstreamsratesmetadata

Planned β€” Community Help Wanted

Write Your Own Plugin

The plugin API is dead simple. If you know pandas, you can ship a plugin in an afternoon.

Flight object

Normalized data from any log format. pandas DataFrames for time-series (position, attitude, battery, motors, vibration, GPS, EKF, RC). Lists for events and mode changes. Dict for parameters.

Finding object

What your plugin returns. Title, severity (critical / warning / info / pass), score (0–100), description, evidence dict, optional phase and timestamps.

Scoring

90–100 = pass (green), 60–89 = warning (amber), 0–59 = critical (red). Overall flight score is a weighted average of all plugin scores.

Phase awareness

Plugins can tag findings with the flight phase they occurred in β€” takeoff, on_mission, landing, etc. β€” for contextual reporting.

1. Implement the Plugin class

wind_estimation.py
from goose.plugins.base import Pluginfrom goose.core.finding import Findingfrom goose.core.flight import Flightclass WindEstimationPlugin(Plugin):    """Estimate wind speed and direction from flight data."""    name = "wind_estimation"    version = "1.0.0"    description = "Estimates wind conditions from GPS and airspeed data"    min_mode = "position"    def analyze(self, flight: Flight, config: dict) -> list[Finding]:        findings = []        if flight.velocity.empty:            return [Finding(                plugin_name=self.name,                title="No velocity data available",                severity="info",                score=50,                description="Wind estimation requires velocity data.",            )]        # Access flight.velocity, flight.position, flight.gps, etc.        # All time-series data is in pandas DataFrames        ground_speed = (            flight.velocity["vx"]**2 + flight.velocity["vy"]**2        )**0.5        max_speed = float(ground_speed.max())        findings.append(Finding(            plugin_name=self.name,            title=f"Max ground speed: {max_speed:.1f} m/s",            severity="pass",            score=95,            description=f"Peak ground speed was {max_speed:.1f} m/s.",            evidence={"max_ground_speed_ms": round(max_speed, 2)},        ))        return findings

2. Register via entry-points

pyproject.toml
# In your plugin's pyproject.toml[project.entry-points."goose.plugins"]wind_estimation = "my_package:WindEstimationPlugin"

3. Install and discover

terminal
pip install goose-plugin-wind# Plugin is automatically discovered by Goosegoose plugins list  # Shows your new plugin

How to contribute

  1. 1.Write a plugin class that extends Plugin and implements analyze()
  2. 2.Register via pyproject.toml entry points β€” Goose auto-discovers on install
  3. 3.Publish as goose-plugin-xyz on PyPI
  4. 4.Submit PRs or grab a good first issue from the 8 planned plugins

Ready to contribute?

Check the GitHub issues for plugins tagged good first issue β€” 8 planned plugins are waiting for community authors.

Browse Good First Issues β†’

Supported Formats

FormatAutopilotStatus
ULog (.ulg)PX4Supported
DataFlash (.bin/.log)ArduPilotComing v1.4
MAVLink tlog (.tlog)GCS recordingsPlanned
CSVCustom autopilotsPlanned

Roadmap

βœ“
v1.0Shipped

11 plugins, ULog parser, CLI, Web UI, JSON reports, scoring engine

βœ“
v1.2Shipped

Interactive charts, flight path map, health gauges, auto narrative, timeline scrubber

βœ“
v1.3Shipped

SVG flight path, timeline-synced charts + map, auto narrative, health gauges

v1.4

Cockpit themes, drag-drop layout, timeline-linked gauges, ArduPilot parser

v2.0

Online analysis at flygoose.dev, fleet baselines, PDF reports, team features

Tech Stack

Built on battle-tested open source Python tooling

PythonpandasnumpyFastAPIClickpyulogpymavlinkWeasyPrint

Community

Open source, no strings attached. Build on it, fork it, ship it.

11
analysis plugins
258
tests passing
370K+
public PX4 logs available
Apache 2.0
open source, modify anything