MAVLab — a free, open-source phone-based drone simulator that connects to QGroundControl / Mission Planner (teaching tool + technical report)`

Hi everyone,

I’d like to share MAVLab, a free and open-source Android app for learning drone systems hands-on.

The main idea: it runs a full drone digital twin — 6-DOF physics, a cascaded-PID autopilot with ArduCopter-style flight modes, a mission engine, and a MAVLink v2 server — entirely on the phone. Then unmodified QGroundControl or Mission Planner connects to it (same-phone split-screen, or desktop over Wi-Fi) and drives it as a real vehicle. So a beginner can plan and fly a full autonomous mission with the actual professional GCS, using nothing but the phone in their hand — no Pixhawk, no SITL, no Docker. It’s meant as a first learning layer before ArduPilot/PX4 SITL, not a SITL replacement.

GitHub: https://github.com/Labs-Ascend/MAVLab
Download: https://github.com/Labs-Ascend/MAVLab/releases (v1.5.0 APK)
Technical report: https://doi.org/10.5281/zenodo.21319694

Main features:

  • Presents to a GCS as an ArduPilot-like copter over MAVLink 2.0 (UDP) — verified with both QGroundControl and Mission Planner

  • Full mission workflow: upload from the GCS → AUTO execution → live progress (MISSION_CURRENT / ITEM_REACHED) reported back

  • Command surface with COMMAND_ACK: arm/disarm, takeoff, land, mode change, mission start, stream-rate, capability handshake (full list in Appendix A of the report)

  • Phone sensors as flight input — tilt the phone and the aircraft responds; gyro/accel/mag/GPS fused into attitude

  • Real-time 3D digital twin that tracks the true vehicle state

  • Five teaching surfaces: Cockpit (telemetry) · Controller · Mission · SIM (3D) · Ops (diagnostics/setup)

  • Failure lab: injectable GPS loss/drift, motor failure, battery drain, compass interference, wind, heavy payload — watch the failsafes react

  • 100 Hz physics; runs on modest hardware

A few practical notes:

  • Same phone: open MAVLab, then QGC in split-screen — QGC auto-detects the vehicle on 127.0.0.1:14550

  • Desktop GCS: put the phone and computer on the same Wi-Fi; the phone’s UDP broadcast links automatically

  • Start location is configurable in the Ops screen (default is Nairobi)

  • Works fully offline — no cloud or internet required

Tested: the acceptance workflow — discovery (~5 s), arm/disarm, takeoff/land with acks, mission upload + AUTO with progress, link drop/reconnect, and a sustained-stability run — passes with both QGroundControl and Mission Planner on real Android devices. The written acceptance spec (QGC) is in the repo (docs/v1_5_qgc_acceptance.md). Not yet done: a formal learning-outcomes study (planned with an IEEE bootcamp cohort, pre-registered) and telemetry-latency instrumentation.

A couple of things we got wrong early and fixed, in case it helps anyone building MAVLink endpoints: using 0.0.0.0 as a UDP destination (it’s a bind address, not a broadcast target); underestimating how early a GCS wants command/param/stream-interval acks; and system-ID collisions when a whole classroom of phones shares one network (now stable per-install IDs).

Feedback, bug reports, and PRs welcome — the technical report doubles as architecture onboarding.

Some images: