Skip to content

Telemetry

Continuous newline-delimited JSON stream. Connect and read; the app pushes updates automatically.

Telemetry fields:

FieldTypeDescription
droneNamestringDrone name (set via app UI)
speed{x, y, z}Velocity (m/s)
headingfloatCompass heading (degrees)
attitude{pitch, roll, yaw}Aircraft attitude (degrees)
location{latitude, longitude, altitude}GPS position
phoneLocation{latitude, longitude, heading, pressure, battery, wifiRssi}Operator phone/RC location and sensor data
gimbalAttitude{pitch, roll, yaw}Gimbal orientation (degrees)
gimbalJointAttitude{pitch, roll, yaw}Gimbal joint angles (degrees)
zoomRatiofloatCamera zoom ratio
zoomFl / hybridFl / opticalFlfloatFocal lengths (-1 if unavailable)
batteryLevelintBattery % (0–100)
satelliteCountintGPS satellite count
homeLocation{latitude, longitude}Home point coordinates
homeSetboolHome point set
distanceToHomefloatDistance to home (m)
waypointReachedboolFinal waypoint reached
waypointSeq / yawSeq / altitudeSeqintSequence id of the waypoint / yaw / altitude command currently being executed. Match against the seq returned by the command to avoid acting on a stale reach flag
intermediaryWaypointReachedboolIntermediate waypoint reached
yawReachedboolTarget yaw reached
altitudeReachedboolTarget altitude reached
isRecordingboolCamera recording active
flightModestringGPS / ATTI / VIRTUAL_STICK / GO_HOME / AUTO_LANDING / WAYPOINT / MANUAL
remainingFlightTimeintRemaining flight time (s)
timeNeededToGoHomefloatTime to return home (s)
timeNeededToLandfloatTime to land (s)
totalTimefloatGo-home + land time (s)
maxRadiusCanFlyAndGoHomefloatMax safe flyable radius (m)
batteryNeededToGoHomefloatBattery % needed for RTH
batteryNeededToLandfloatBattery % needed to land
remainingChargeintRaw remaining battery charge from SDK
seriousLowBatteryThresholdfloatCritical low battery %
lowBatteryThresholdfloatLow battery warning %
isManualOverrideActiveboolPilot has taken manual RC control
readyToTakeoffboolAll preflight conditions satisfied
takeoffBlockReasonstringWhy takeoff is blocked when readyToTakeoff is false
lrfTarget{latitude, longitude, altitude}Last geo-referenced laser rangefinder target, null until the laser locks
autoSensingActiveboolOn-device target detection running
detectedTargetsarrayDetected targets from auto-sensing
webRtcobjectWHIP/WebRTC sender state, FPS, processing, drop, error, bitrate, and recovery metrics when video is active; activeCamera and scaleMode identify the surface path

The webRtc object lets the dashboard distinguish a source/encoder problem from a network problem:

FieldMeaning
activeCamerasurface for the experimental DJI-to-MediaCodec path; the standard path reports its active DJI/phone/mock source
scaleModesurface when MediaCodec receives the DJI surface directly; native or fixed for the regular frame-source path
inputFps / outputFpsFrames entering and leaving the sender path
totalDroppedFrames / droppedFpsFrames discarded by source pacing or backpressure
qualityLimitationReasonWebRTC’s sender-side reason for limiting quality, when reported by the platform
framesEncodedNotSentEncoded frames waiting behind the network sender
sendBitrateBpsApproximate outbound WebRTC bitrate
recoveryCountNumber of source-pipeline recovery attempts, including keyframe recovery after queue pressure

On the surface path, a rising recoveryCount, falling outputFps, or non-zero framesEncodedNotSent is a reason to compare the same run with lb_whip_surface_h264_encoder=false. The comparison keeps the WHIP, MediaMTX, and browser path constant while changing only the camera-to-encoder stage.

  • Custom naming: Set the drone name and its MAVLink vehicle ID via the app UI (tap the name/ID display or the settings entry). Examples: "RedScout", "Bravo".
  • UDP broadcast discovery: DJIInterface("") broadcasts DISCOVER_LYREBIRD on port 30000; the app replies LYREBIRD_HERE:{ip}.
  • UDP multicast discovery: The app announces over 239.255.42.99:30001 for LANs where multicast is available.
  • mDNS/Bonjour: Lyrebird advertises _lyrebird._tcp. with service metadata.
  • Config endpoint: /config returns drone name and connection metadata (used by ROS auto-discovery and the dashboard).
  • Dynamic ROS namespaces: Nodes launch under the drone’s name (e.g., /RedScout/location), eliminating manual IP-to-name mapping.