Automated analysis pipeline for 4G LTE telemetry link performance on ArduPilot-based UAV test flights. Push flight logs from the field → GitHub parses them, builds an interactive dashboard, and publishes it as a live webpage — no manual steps after the initial setup.
Each ArduPilot .BIN flight log contains raw LTES (LTE Status) records capturing the modem's cell connection throughout the flight. This pipeline parses those records and produces an interactive HTML report covering:
Link reliability
- Outage events detected from LTES record gaps (ground truth — not just MSG strings)
- Per-outage timeline: when it dropped, how long it was down, whether it recovered
- Uptime % per flight and per day
Script performance scoring
- Recovery speed after a drop (how fast the reconnect sequence completed)
- Connect success rate (successful AT sequences vs failed/stuck ones)
- Stuck AT step detection (CMUX, CPIN, CREG loops that stalled)
RF / network quality scoring
- Mean RSRP and SINR per flight
- LTE band usage and cross-band handover rate
- Day-over-day signal quality comparison
Tower switch analysis
- Cell ID transitions mapped to GPS coordinates
- Cross-band switch hotspots (locations where band changes recur)
- Cell boundary pair frequency
Day ranking Script performance and network quality are scored separately — so a day with many drops but fast recoveries scores differently from a day where the script stalled. This separates what the script did from what the network environment was.
Logs come from a Pixhawk 6C running ArduPlane with a Quectel EC25 modem managed by a Lua script over CMUX. The .BIN files are standard ArduPilot dataflash logs.
The analyser extracts four record types: LTES, GPS, BARO, MSG.
Log folders must follow this pattern exactly:
DD_MM_YYYY_fieldname
The field name is freeform but the keywords far, near, and fighting are recognised and used as labels in the dashboard. Examples:
logs/
13_05_2026_far/
00000060.BIN
19_05_2026_near/
00000067.BIN
00000068.BIN
21_05_2026_fighting/
00000072.BIN
Multiple .BIN files per folder are supported — each is treated as a separate flight within that day.
Go to github.com/new:
- Name:
airbound-lte-dashboard(or anything) - Visibility: Public — required for free GitHub Pages
- Leave it completely empty (no README, no .gitignore)
cd airbound-lte-v2
git init
git add .
git commit -m "initial setup"
git remote add origin https://github.com/YOUR_USERNAME/airbound-lte-dashboard.git
git branch -M main
git push -u origin mainAfter the first push triggers the Action and the gh-pages branch is created (~3 min):
- Repo → Settings → Pages
- Source: Deploy from a branch
- Branch: gh-pages / folder: / (root)
- Save
Your dashboard URLs will be:
| Page | URL |
|---|---|
| All dates index | https://YOUR_USERNAME.github.io/airbound-lte-dashboard/date_index.html |
| Combined (all days) | https://YOUR_USERNAME.github.io/airbound-lte-dashboard/ |
| Specific date | https://YOUR_USERNAME.github.io/airbound-lte-dashboard/2026-05-21/ |
# Copy the day's folder into logs/
cp -r /path/to/21_05_2026_far logs/
# Commit and push
git add logs/
git commit -m "21-May-2026 far field"
git pushGitHub Actions then:
- Detects which date folders are new in this push
- Parses all
.BINfiles viamavlogdump - Builds a per-date dashboard + regenerates the combined dashboard
- Publishes both to the
gh-pagesbranch (live within ~1 min of the build finishing) - Creates a Release tagged
flight-2026-05-21with a direct link to that date's report
Find it under: repo → Releases → click the date → click Open Dashboard in the description.
Repo → Actions tab → latest run:
- 🟡 Running (~3–4 min for a typical day's logs)
- ✅ Done — dashboard updated
- ❌ Failed — click the run to see which step errored
gh-pages branch/
├── index.html ← combined dashboard (all dates)
├── date_index.html ← clickable index of all dates
├── 2026-05-13/
│ └── index.html
├── 2026-05-19/
│ └── index.html
└── 2026-05-21/
└── index.html ← linked from the Release
Operator filter — edit .github/workflows/build-dashboard.yml:
--operator AirtelChange to Jio, Vi, BSNL, etc.
.BIN files over 100 MB — GitHub blocks files above this limit. Use Git LFS:
git lfs install
git lfs track "*.BIN"
git add .gitattributes
git commit -m "track BIN files with LFS"
git pushGitHub Free includes 1 GB LFS storage and 1 GB/month bandwidth.
| Component | Detail |
|---|---|
| Flight controller | Pixhawk 6C / ArduPlane |
| Modem | Quectel EC25 (4G LTE) |
| Modem script | Lua over CMUX on Serial4 |
| Log format | ArduPilot dataflash .BIN |
| Parser | mavlogdump.py via pymavlink |
| CI | GitHub Actions |
| Dashboard hosting | GitHub Pages |