ACSL Aircraft MAVLink Interface – Developer Guide (Part 1)

This is the first in a series of developer notes for building applications that talk directly to ACSL aircraft. It describes the MAVLink interface that ACSL TAKEOFF uses, so that you can develop your own ground control software (GCS) as an alternative to TAKEOFF. This document is a living reference and will be expanded as additional detail is requested and cleared for release.

1. Audience and prerequisites

This guide assumes you are comfortable with the MAVLink protocol and with at least one MAVLink library. If MAVLink is new to you, read the official protocol documentation at mavlink.io first. You do not need ACSL TAKEOFF to develop against the aircraft, but TAKEOFF is built on QGroundControl (QGC), so QGC behavior is a good reference for how a working GCS interacts with our aircraft.

2. Protocol overview

ACSL aircraft communicate using MAVLink 2. The dialect includes message and command identifiers above 255 (for example MOUNT_ORIENTATION #265, ESC_INFO #290, the PARAM_EXT_* family #320–324, HEALTH #59002, and MAV_CMD_DO_FUNCTION_ENABLE #44001), which require v2 framing. Confirm message-signing behavior and the exact v2 incompatibility flags against the sample log below before assuming them in your implementation.

A standard MAVLink 2 frame is structured as follows:

STX(0xFD) LEN INCOMPAT COMPAT SEQ SYSID COMPID MSGID(24-bit) PAYLOAD CRC(16) [SIGNATURE(13)]

Each endpoint is addressed by a system ID and component ID. Your GCS must emit a HEARTBEAT and address commands to the aircraft’s system/component IDs. The specific IDs used by ACSL aircraft and by TAKEOFF are listed in section 4 once confirmed from the sample log.

3. Connecting to the aircraft

Your application exchanges the same MAVLink 2 stream with the aircraft regardless of how it connects — only the transport differs. There are three connection paths, depending on how you deploy your software.

3.1 On the TAITEN smart controller (most common)

An application running on the TAITEN smart controller — typically an Android GCS that replaces or adapts TAKEOFF — reaches the aircraft over UDP. The controller bridges the radio link to a local UDP endpoint that your application connects to.

ParameterValue
TransportUDP
Host[to be confirmed]
Port[to be confirmed]
Connection model[to be confirmed: e.g. GCS connects as client, or binds and waits for the stream]

3.2 Directly to a ground Raptor radio module

You can interface with a ground-side Raptor radio module directly. This is a serial connection carrying the same MAVLink 2 stream.

ParameterValue
TransportSerial (UART)
Baud rate115200
Data / parity / stop8N1 (8 data bits, no parity, 1 stop bit)
Flow controlNone

3.3 Legacy “bring your own device” controller (USB)

The earlier bring-your-own-device controller (2.4 GHz only at Japan/EU transmit power) connects over USB and enumerates as a USB-serial device on Android or Windows. Serial parameters are the same as the direct Raptor connection (115200, 8N1, no flow control); confirm against your unit.

3.4 Addressing (all transports)

On every transport the stream is MAVLink 2, and endpoints are addressed by system and component ID. The values below are placeholders pending confirmation from the sample log:

ParameterValue
MAVLink version2
Aircraft flight controller system ID1
Aircraft flight controller component ID1
Expected GCS system ID11

4. Message definition files (dialects)

Two XML dialect definitions accompany this post:

  • common.xml — the standard MAVLink common dialect.
  • acsl.xml — ACSL-specific messages and commands (for example HEALTH #59002, DISTANCE_CONTROL #59001, and the ACSL MAV_CMD entries 42425 / 42426 / 44001). This dialect includes common.xml.

You can compile these into language bindings using the MAVLink generator. For example, with pymavlink installed:

python -m pymavlink.tools.mavgen --lang=Python --wire-protocol=2.0 \
    -o acsl_dialect.py acsl.xml

Generate C, C++, or other targets by changing --lang. Always build against the ACSL dialect (which pulls in common) so that custom messages decode correctly.

5. Supported telemetry / periodic messages

Messages the aircraft emits during normal operation. Update rates are not published in this revision.

MessageIDDescription
HEARTBEAT#0Heartbeat
SYS_STATUS#1System status
CHANGE_OPERATOR_CONTROL#5R/C switching (pilot / observer switching)
GPS_RAW_INT#24GPS raw data
ATTITUDE#30Attitude data
GLOBAL_POSITION_INT#33Downlink: aircraft position. Uplink: GCS position
MISSION_CURRENT#42Mission item number currently being executed
NAV_CONTROLLER_OUTPUT#62R/C output data
RC_CHANNELS#65R/C channel data
VFR_HUD#74Speed, heading, altitude, etc.
POSITION_TARGET_GLOBAL_INT#87Target position during autonomous flight
HIGHRES_IMU#105IMU data
RADIO_STATUS#109Radio link condition
DISTANCE_SENSOR#132Distance sensor data (one per sensor)
BATTERY_STATUS#147Battery status
HOME_POSITION#242Takeoff point
EXTENDED_SYS_STATE#245Extended system status
COLLISION#247Collision-avoidance state (threat_level HIGH/LOW)
DEBUG#254Debug output
MOUNT_ORIENTATION#265Gimbal angle data
ESC_INFO#290ESC information
ESC_STATUS#291ESC status
HEALTH#59002Aircraft health (ACSL-specific)

6. Other supported messages

Request/response and protocol messages. Direction is given relative to the flight controller (FCU).

MessageIDDirectionDescription
SYSTEM_TIME#2GCS→FCUSet time
CHANGE_OPERATOR_CONTROL_ACK#6GCS→FCUR/C switching response
SET_MODE#11GCS→FCUMode setting
PARAM_REQUEST_READ#20GCS→FCURead specified parameter
PARAM_REQUEST_LIST#21GCS→FCURequest full parameter list
PARAM_VALUE#22FCU→GCSParameter value
PARAM_SET#23GCS→FCUSet parameter
RAW_IMU#27FCU→GCSMeasurement data during calibration
MISSION_REQUEST_LIST#43GCS→FCUBegin mission download
MISSION_COUNT#44BidirectionalBegin mission upload / item count
MISSION_CLEAR_ALL#45GCS→FCUClear mission
MISSION_ITEM_REACHED#46FCU→GCSLast reached mission item number
MISSION_ACK#47BidirectionalMission transfer complete
MISSION_REQUEST_INT#51BidirectionalRequest an individual mission item
MANUAL_CONTROL#69GCS→FCUR/C directive
MISSION_ITEM_INT#73BidirectionalMission item data
COMMAND_INT#75GCS→FCUSingle waypoint command
COMMAND_LONG#76GCS→FCUCommand (see Commands table)
COMMAND_ACK#77FCU→GCSCommand response
AUTOPILOT_VERSION#148FCU→GCSFCU version information
FENCE_STATUS#162FCU→GCSGeofence violation status
MAG_CAL_REPORT#192FCU→GCSMagnetic calibration result
STATUSTEXT#253BidirectionalStatus / error notification
CAMERA_INFORMATION#259FCU→GCSCamera information
CAMERA_SETTINGS#260FCU→GCSCamera settings
STORAGE_INFORMATION#261FCU→GCSCamera storage information
CAMERA_CAPTURE_STATUS#262FCU→GCSCapture status
CAMERA_IMAGE_CAPTURED#263FCU→GCSStill-image capture event
GIMBAL_MANAGER_INFORMATION#280FCU→GCSGimbal information
PARAM_EXT_REQUEST_READ#320GCS→FCUExtended parameter (camera / aircraft) read
PARAM_EXT_REQUEST_LIST#321GCS→FCUExtended parameter list
PARAM_EXT_VALUE#322FCU→GCSExtended parameter value
PARAM_EXT_SET#323GCS→FCUSet extended parameter
PARAM_EXT_ACK#324FCU→GCSExtended parameter ack

7. Supported commands (MAV_CMD)

Commands are sent inside COMMAND_LONG / COMMAND_INT (immediate) or as mission items inside MISSION_ITEM_INT (planned flight). The middle column lists the container(s) in which each command is accepted.

CommandIDAccepted inDescription
MAV_CMD_NAV_WAYPOINT16MISSION_ITEM_INTWaypoint
MAV_CMD_NAV_RETURN_TO_LAUNCH20COMMAND_LONG, MISSION_ITEM_INTGo-home
MAV_CMD_NAV_LAND21COMMAND_LONG, MISSION_ITEM_INTLand
MAV_CMD_NAV_TAKEOFF22COMMAND_LONG, MISSION_ITEM_INTTake off
MAV_CMD_DO_FOLLOW32COMMAND_LONGStart tracking a target
MAV_CMD_NAV_PAYLOAD_PLACE94MISSION_ITEM_INTPackage delivery destination
MAV_CMD_DO_SET_MODE176COMMAND_LONGMode setting (free ↔ planned transition only)
MAV_CMD_DO_CHANGE_SPEED178MISSION_ITEM_INTChange flight speed
MAV_CMD_DO_FLIGHTTERMINATION185COMMAND_LONGForced stop
MAV_CMD_DO_LAND_START189COMMAND_LONG, MISSION_ITEM_INTLanding sequence start
MAV_CMD_DO_RALLY_LAND190COMMAND_LONGEmergency landing
MAV_CMD_DO_REPOSITION192COMMAND_LONG, COMMAND_INTFly to specified position
MAV_CMD_DO_PAUSE_CONTINUE193COMMAND_LONGPause / resume
MAV_CMD_DO_SET_ROI_LOCATION195MISSION_ITEM_INTSet POI / ROI
MAV_CMD_DO_SET_ROI_NONE197MISSION_ITEM_INTRelease POI / ROI
MAV_CMD_DO_DIGICAM_CONTROL203COMMAND_LONG, MISSION_ITEM_INTCamera zoom (flight planning only)
MAV_CMD_DO_MOUNT_CONTROL205COMMAND_LONG, MISSION_ITEM_INTGimbal operation
MAV_CMD_DO_SET_CAM_TRIGG_DIST206COMMAND_LONG, MISSION_ITEM_INTCamera trigger at fixed distance
MAV_CMD_DO_FENCE_ENABLE207COMMAND_LONGEnable / disable geofence
MAV_CMD_PREFLIGHT_CALIBRATION241COMMAND_LONGCalibration
MAV_CMD_PREFLIGHT_STORAGE245COMMAND_LONGClear R/C bindings (reset only)
MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN246COMMAND_LONGReboot aircraft (reboot only)
MAV_CMD_MISSION_START300COMMAND_LONGPlanned-flight transition + takeoff
MAV_CMD_COMPONENT_ARM_DISARM400COMMAND_LONGMotor idle start/stop (autonomous mode only)
MAV_CMD_REQUEST_MESSAGE512COMMAND_LONGGimbal setting acquisition (msg 280 only)
MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES520COMMAND_LONG, COMMAND_INTFCU information request
MAV_CMD_REQUEST_CAMERA_INFORMATION521COMMAND_LONGRequest CAMERA_INFORMATION
MAV_CMD_REQUEST_CAMERA_SETTINGS522COMMAND_LONGRequest CAMERA_SETTINGS
MAV_CMD_REQUEST_STORAGE_INFORMATION525COMMAND_LONGRequest storage information
MAV_CMD_STORAGE_FORMAT526COMMAND_LONGFormat storage medium
MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS527COMMAND_LONGRequest CAMERA_CAPTURE_STATUS
MAV_CMD_RESET_CAMERA_SETTINGS529COMMAND_LONGReset camera settings
MAV_CMD_SET_CAMERA_MODE530COMMAND_LONGChange camera mode
MAV_CMD_IMAGE_START_CAPTURE2000COMMAND_LONG, MISSION_ITEM_INTStart still capture
MAV_CMD_IMAGE_STOP_CAPTURE2001COMMAND_LONG, MISSION_ITEM_INTStop still capture
MAV_CMD_VIDEO_START_CAPTURE2500COMMAND_LONG, MISSION_ITEM_INTStart video recording
MAV_CMD_VIDEO_STOP_CAPTURE2501COMMAND_LONG, MISSION_ITEM_INTStop video recording
MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION2504MISSION_ITEM_INTRequest video stream information
MAV_CMD_REQUEST_VIDEO_STREAM_STATUS2505MISSION_ITEM_INTRequest video stream status
MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION5001MISSION_ITEM_INTGeofence: polygon inclusion vertex
MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION5002MISSION_ITEM_INTGeofence: polygon exclusion vertex
MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION5003MISSION_ITEM_INTGeofence: circular inclusion
MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION5004MISSION_ITEM_INTGeofence: circular exclusion
MAV_CMD_NAV_RALLY_POINT5100MISSION_ITEM_INTEmergency landing site
MAV_CMD_DO_ACCEPT_MAG_CAL42425COMMAND_LONGAccept magnetic calibration result (ACSL)
MAV_CMD_DO_CANCEL_MAG_CAL42426COMMAND_LONGRedo magnetic calibration (ACSL)
MAV_CMD_DO_FUNCTION_ENABLE44001COMMAND_LONGVision sensor ON/OFF (ACSL)

8. Command parameter notes

The full parameter-by-parameter matrix (which of param1–param7 are used, ignored, or fixed for each command, in both COMMAND_LONG/COMMAND_INT and MISSION_ITEM_INT contexts) is in the attached spreadsheet. Conventions used there:

  • unsupported — the parameter has a defined meaning in MAVLink but is not used by the aircraft.
  • struck-through / reserved — not used because the parameter is reserved in the MAVLink specification. Note that a few parameters reserved in MAVLink are used by ACSL aircraft.

High-value specifics worth calling out:

  • MAV_CMD_DO_PAUSE_CONTINUE (193): param1 = 0 pause, 1 resume.
  • MAV_CMD_COMPONENT_ARM_DISARM (400): param1 = 0 disarm, 1 arm. Valid only in autonomous mode.
  • MAV_CMD_DO_FLIGHTTERMINATION (185): param1 must be > 0.5 to take effect.
  • MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN (246): only reboot (param1 = 1) is supported.
  • MAV_CMD_PREFLIGHT_STORAGE (245): only reset (param1 = 2) is supported.
  • MAV_CMD_DO_SET_MODE (176): supports free-flight ↔ planned-flight transition only.
  • MAV_CMD_REQUEST_MESSAGE (512): valid only to request message 280 (gimbal information).
  • MAV_CMD_DO_FUNCTION_ENABLE (44001): param1 = function ID, param2 = enable.
  • MAV_CMD_MISSION_START (300): performs the planned-flight transition and takeoff.

9. Protocols you will need

Heartbeat

Emit a HEARTBEAT at ~1 Hz and watch for the aircraft’s heartbeat to track link state and arm/mode status.

Parameters

Use PARAM_REQUEST_LIST / PARAM_REQUEST_READ to read and PARAM_SET to write, with values returned in PARAM_VALUE. Camera and certain aircraft settings use the extended set (PARAM_EXT_*, #320–324).

Commands

Send via COMMAND_LONG or COMMAND_INT and wait for COMMAND_ACK. Re-send on timeout until acknowledged.

Mission (planned flight)

Upload: send MISSION_COUNT, then respond to each MISSION_REQUEST_INT with the corresponding MISSION_ITEM_INT, finishing on MISSION_ACK. Download is the mirror image, beginning with MISSION_REQUEST_LIST. A representative planned flight assembles items in this order:

  1. MAV_CMD_NAV_TAKEOFF (22) — takeoff
  2. MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION (5001) — geofence
  3. MAV_CMD_DO_CHANGE_SPEED (178) — set speed
  4. MAV_CMD_NAV_WAYPOINT (16) — waypoint 1
  5. MAV_CMD_NAV_WAYPOINT (16) — waypoint 2
  6. MAV_CMD_NAV_RALLY_POINT (5100) — rally point
  7. MAV_CMD_DO_CHANGE_SPEED (178) — speed to next leg
  8. MAV_CMD_NAV_PAYLOAD_PLACE (94) — land and drop payload
  9. MAV_CMD_NAV_RETURN_TO_LAUNCH (20) — go home

10. ACSL-specific usage

A few standard messages are used in non-obvious sequences. These are listed for awareness; full sequences will be documented in a later revision.

Message / commandIDUse
CHANGE_OPERATOR_CONTROL#5R/C pilot/observer switching sequence (specific parameter value)
PARAM_EXT_SET#323Firmware-update sequence (specific parameter value)
PARAM_REQUEST_READ#20Firmware-update sequence (specific parameter value)
PARAM_VALUE#22Firmware-update sequence (specific parameter value)
PARAM_EXT_ACK#324Firmware-update sequence (specific parameter value)
HEALTH#59002ACSL custom telemetry: aircraft health
DISTANCE_CONTROL#59001ACSL custom (support status not yet determined)

11. Worked example: sample mission log

Two files accompany this post to show real traffic:

  • A raw serial dump captured during a sample mission.
  • A decoded version of the same dump, with frames parsed into named messages and fields.

Use the decoded log to confirm the link parameters, system/component IDs, and the exact ordering of the heartbeat, parameter, command, and mission exchanges described above. If you build a parser against the dialect files, this dump is a useful regression input.

12. Recommended tooling

  • pymavlink — the reference Python implementation; includes mavutil for connections and mavgen for dialect generation.
  • MAVSDK — higher-level APIs (C++, Python, and others) for common operations.
  • QGroundControl — TAKEOFF’s upstream; a working reference for GCS behavior.
  • MAVLink Inspector (in QGC or standalone) — for live message inspection during development.

Getting started

  1. Download the dialect files and generate bindings with mavgen.
  2. Open your chosen connection (section 3) and listen for the aircraft heartbeat.
  3. Emit your own heartbeat and confirm the aircraft sees your GCS.
  4. Read parameters, then try a simple command (for example request AUTOPILOT_VERSION via #520) and confirm the COMMAND_ACK.
  5. Build up to mission upload using the sequence in section 9, validating against the decoded sample log.

13. Downloads

Attach the files to this post in the WordPress Media Library and link them here.

14. Contact

Questions, corrections, or requests for additional detail: use the ACSL contact form.


Revision history

  • Rev 1 (2026-06-19) — Initial publication: protocol overview, supported message / command tables, protocol summaries, and worked-example references.