Back to blogVolver al blog

Lyrebird: turn any DJI remote controller into a networked drone serverLyrebird: convierte cualquier mando DJI en un servidor de drones en red

SDU UAS Center — open-sourceSDU UAS Center — open-source

The lyrebird is Australia's most famous mimic — it can reproduce camera shutters, chainsaws and other birds' calls so convincingly that even the animals listening are fooled. That's exactly what this project does to a DJI drone. Lyrebird, from the SDU UAS Center, is an open-source Android application (Kotlin, DJI Mobile SDK V5) that runs on the DJI remote controller and teaches the aircraft to speak MAVLink 2 — so convincingly that QGroundControl, MAVSDK or any standard ground station can't tell it apart from a real PX4 vehicle.El lyrebird es el imitador más famoso de Australia — reproduce disparos de cámara, motosierras y cantos de otras aves con tal fidelidad que hasta los animales que lo escuchan se dejan engañar. Eso es exactamente lo que este proyecto le hace a un dron DJI. Lyrebird, del SDU UAS Center, es una aplicación Android open-source (Kotlin, DJI Mobile SDK V5) que corre en el mando de DJI y enseña a la aeronave a hablar MAVLink 2 — con tanta fidelidad que QGroundControl, MAVSDK o cualquier ground station estándar no la distingue de un PX4 real.

The result: any ground station, in any language, can fly a DJI drone without touching DJI's proprietary SDK. Lyrebird is a renamed continuation of WildBridge, which grew out of the WildDrone project — and it's been through real missions, not just demos.El resultado: cualquier ground station, en cualquier lenguaje, puede volar un dron DJI sin tocar el SDK propietario de DJI. Lyrebird es la continuación renombrada de WildBridge, nacido del proyecto WildDrone — y ha pasado por misiones reales, no solo demos.

Lyrebird logo
LyrebirdLyrebirdopen-source, from the SDU UAS Center.open-source, del SDU UAS Center.
Lyrebird system architecture: DJI remote controllers running Lyrebird exposing MAVLink 2, HTTP, TCP telemetry and WHIP/WHEP video over Wi-Fi
Figure 1Figura 1Lyrebird's network architecture: each RC runs the app and exposes MAVLink 2, HTTP, TCP telemetry and WHIP/WHEP video over the local Wi-Fi network.Arquitectura de red de Lyrebird: cada mando ejecuta la app y expone MAVLink 2, HTTP, telemetría TCP y vídeo WHIP/WHEP sobre la red Wi-Fi local.

Looks like PX4 to everything elseParece un PX4 para todo lo demás

The headline trick: each drone presents itself as a complete MAVLink 2 vehicle — not a telemetry feed, a full control surface. QGroundControl connects, shows telemetry and video, and flies it with no plugin and no configuration file. Because the aircraft reports itself as PX4, swarm software, mission planners and research pipelines built for a PX4 fleet can fly a DJI aircraft alongside genuine PX4 vehicles in the same swarm, unmodified.El truco estrella: cada dron se presenta como un vehículo MAVLink 2 completo — no un feed de telemetría, una superficie de control entera. QGroundControl se conecta, muestra telemetría y vídeo, y lo vuela sin plugins ni archivos de configuración. Como la aeronave se identifica como PX4, el software de enjambres, planificadores de misión y pipelines de investigación construidos para flotas PX4 pueden volar un DJI junto a PX4 reales en el mismo enjambre, sin modificar nada.

Missions go end-to-end: build a plan in QGC's Plan view (waypoints, take-off, land/RTL, camera, gimbal, change speed, region of interest), upload it, and Lyrebird flies it — translating onto its own onboard PID sequencer or DJI's native wayline engine. The upload handshake stores every item exactly as MAVLink sent it, in wire format, so a later download returns precisely what was uploaded, regardless of how it was flown. MAVLink 2 is on by parameter, following PX4's own pattern — and every flight command is gated twice before it moves the aircraft.Las misiones van de punta a punta: diseña un plan en la vista Plan de QGC (waypoints, despegue, aterrizaje/RTL, cámara, gimbal, cambio de velocidad, región de interés), súbelo, y Lyrebird lo vuela — traduciéndolo a su propio secuenciador PID embarcado o al motor de waylines nativo de DJI. El handshake de subida guarda cada ítem exactamente como lo envió MAVLink, en formato de red, así que una descarga posterior devuelve exactamente lo subido, sin importar cómo se voló. MAVLink 2 se activa por parámetro, siguiendo el patrón de PX4 — y cada comando de vuelo pasa un doble gate antes de mover la aeronave.

Protocols, not SDKsProtocolos, no SDKs

Every aircraft exposes the full stack over open protocols:Cada aeronave expone el stack completo sobre protocolos abiertos:

  • HTTP API (port 8080) — every control and status endpoint, with the two-computer safety model built into the request flow.API HTTP (puerto 8080) — todos los endpoints de control y estado, con el modelo de seguridad de dos computadores integrado en el flujo de peticiones.
  • TCP telemetry (port 8081) — a newline-delimited JSON stream, field by field: attitude, GPS, home point, battery, satellite count, flight mode, zoom, recording state, even the operator phone's own location, pressure and Wi-Fi RSSI.Telemetría TCP (puerto 8081) — un stream JSON delimitado por saltos de línea, campo a campo: actitud, GPS, home point, batería, número de satélites, modo de vuelo, zoom, grabación, incluso la localización, presión y RSSI Wi-Fi del propio teléfono del operador.
  • Video — WHIP/WHEP publishing through MediaMTX, plus a multi-drone video dashboard. Auto-discovery over UDP broadcast (port 30000) finds every drone on the LAN by name.Vídeo — publicación WHIP/WHEP vía MediaMTX, además de un dashboard multi-drone. Auto-descubrimiento por broadcast UDP (puerto 30000) encuentra cada dron de la LAN por su nombre.
Lyrebird app running on a DJI RC controlling a Mini 4
Figure 2Figura 2Lyrebird running on the remote controller with a DJI Mini 4 connected — the whole ground station lives on the RC.Lyrebird corriendo en el mando con un DJI Mini 4 conectado — la ground station entera vive en el mando.

Two-computer safetySeguridad con dos computadores

Autonomy needs a kill switch you can actually trust. Lyrebird's safety model is latch-based: two computers can drive the same drone over HTTP, and which one is in command is decided purely by an X-Safety-Token header on each request. The Pilot Computer holds control at startup; the first command from the Safety Computer seizes authority, cancels whatever autonomous loop the Pilot left running, and holds the aircraft in place. From then on, every Pilot command is rejected — persistently, with no timeout. If the Safety Computer goes silent, the Pilot does not regain control; the only way back is /releaseSafetyControl, callable only by the Safety Computer. While it holds authority, a red SAFETY COMPUTER IN CONTROL banner sits over the video feed. An app restart resets to Pilot control — restart means fresh mission.La autonomía necesita un kill switch de verdad. El modelo de seguridad de Lyrebird es un latch: dos computadores pueden pilotar el mismo dron por HTTP, y cuál está al mando lo decide únicamente la cabecera X-Safety-Token de cada petición. El Pilot Computer tiene el control al arrancar; el primer comando del Safety Computer arrebata la autoridad, cancela el bucle autónomo que el Pilot dejara corriendo y mantiene la aeronave en su sitio. A partir de ahí, cada comando del Pilot es rechazado — de forma persistente, sin timeout. Si el Safety Computer se queda en silencio, el Pilot no recupera el control; la única vuelta atrás es /releaseSafetyControl, que solo puede llamar el Safety Computer. Mientras tiene la autoridad, un banner rojo SAFETY COMPUTER IN CONTROL aparece sobre el feed de vídeo. Reiniciar la app vuelve al control del Pilot — reinicio significa misión nueva.

Two-computer safety control request flow diagram
Figure 3Figura 3The two-computer safety arbitration: how a single HTTP command is classified and latched.El arbitraje de seguridad de dos computadores: cómo se clasifica y fija un único comando HTTP.

Ground station and ROS 2Ground station y ROS 2

The Python interface (DJIInterface) wraps every HTTP command and the TCP telemetry socket in a thread-safe background receiver, with auto-discovery if you don't want to hardcode an IP. For the robotics crowd, the ROS 2 Humble package publishes 45+ topics per drone under dynamic namespaces (/mini1/, /mini2/, …) and subscribes to command topics; the node publishes only when the drone actually sends a new snapshot, so topic rate follows the aircraft, not a polling loop. The auto_discovery_native.launch.py launch file spins up one namespaced controller per discovered drone and re-scans periodically — zero config.La interfaz Python (DJIInterface) envuelve cada comando HTTP y el socket de telemetría TCP en un receptor en segundo plano thread-safe, con auto-descubrimiento si no quieres hardcodear una IP. Para la gente de robótica, el paquete ROS 2 Humble publica 45+ topics por dron bajo namespaces dinámicos (/mini1/, /mini2/, …) y se suscribe a topics de comando; el nodo publica solo cuando el dron envía un snapshot nuevo, así que la tasa del topic sigue a la aeronave, no a un bucle de polling. El launch file auto_discovery_native.launch.py levanta un controller namespaced por dron descubierto y re-escanea periódicamente — configuración cero.

Lyrebird ROS 2 tab showing topics and namespaces
Figure 4Figura 4ROS 2 integration view: per-drone namespaces and topics, straight from the ground-station dashboard.Vista de integración ROS 2: namespaces y topics por dron, desde el dashboard de la ground station.

Mission-provenProbado en misión

Lyrebird (and its WildBridge predecessor) has flown in three published research applications (Rolland et al., RiTA 2025):Lyrebird (y su predecesor WildBridge) ha volado en tres aplicaciones de investigación publicadas (Rolland et al., RiTA 2025):

StudyEstudioUAVsFeaturesFuncionalidadesVideoVídeo
Drone swarm for wildlife monitoringEnjambre para monitorización de fauna2× Mini 3, 1× M3ETelemetry, video, waypointsTelemetría, vídeo, waypoints▶ Watch
Drone swarm for wildfire detectionEnjambre para detección de incendios1× M3E, 1× M4T, 2× M300Thermal detection, coordinated take-off, payload drop — XPRIZE Wildfire finalistDetección térmica, despegue coordinado, lanzamiento de carga — finalista XPRIZE Wildfire▶ Watch
Atmospheric wind-field profilingPerfilado de campo de viento atmosférico3× Mini 3Vertical wind profiles validated against LiDARPerfiles verticales de viento validados contra LiDAR▶ Watch
Custom PID position controllerControlador PID de posición propioOn-device PID controllerControlador PID en el dispositivo▶ Watch
Table 1Tabla 1Research applications where Lyrebird/WildBridge has been used in the field.Aplicaciones de investigación donde Lyrebird/WildBridge se ha usado en campo.

Hardware and getting startedHardware y primeros pasos

Supported aircraft: DJI Mini 3 / Mini 4 Pro, Mavic 3 Enterprise, and the Matrice 30 / 300 RTK / 350 RTK / 4 Thermal, flown from the RC Pro, RC Plus or RC-N3. Enterprise sensors are supported too — thermal capture and temperature, laser rangefinder, and payload drop. Everything is MIT-licensed: install the app on your RC or build from source, and the docs cover the HTTP API, telemetry, MAVLink 2, missions, ROS 2, and a field-test procedure that walks the link, settings and payload checks before your first flight.Aeronaves soportadas: DJI Mini 3 / Mini 4 Pro, Mavic 3 Enterprise, y las Matrice 30 / 300 RTK / 350 RTK / 4 Thermal, voladas desde el RC Pro, RC Plus o RC-N3. Los sensores enterprise también funcionan — captura térmica y temperatura, telémetro láser y lanzamiento de carga. Todo con licencia MIT: instala la app en tu mando o compílala desde el código, y la documentación cubre la API HTTP, la telemetría, MAVLink 2, las misiones, ROS 2 y un procedimiento de campo que repasa el link, los ajustes y las comprobaciones antes del primer vuelo.

📡 Project site  ·  🐙 GitHub  ·  🎥 Demo videos  ·  📖 WildBridge (predecessor)📡 Web del proyecto  ·  🐙 GitHub  ·  🎥 Vídeos demo  ·  📖 WildBridge (predecesor)