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.
| Parameter | Value |
|---|---|
| Transport | UDP |
| 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.
| Parameter | Value |
|---|---|
| Transport | Serial (UART) |
| Baud rate | 115200 |
| Data / parity / stop | 8N1 (8 data bits, no parity, 1 stop bit) |
| Flow control | None |
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:
| Parameter | Value |
|---|---|
| MAVLink version | 2 |
| Aircraft flight controller system ID | 1 |
| Aircraft flight controller component ID | 1 |
| Expected GCS system ID | 11 |
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 ACSLMAV_CMDentries 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.
| Message | ID | Description |
|---|---|---|
HEARTBEAT | #0 | Heartbeat |
SYS_STATUS | #1 | System status |
CHANGE_OPERATOR_CONTROL | #5 | R/C switching (pilot / observer switching) |
GPS_RAW_INT | #24 | GPS raw data |
ATTITUDE | #30 | Attitude data |
GLOBAL_POSITION_INT | #33 | Downlink: aircraft position. Uplink: GCS position |
MISSION_CURRENT | #42 | Mission item number currently being executed |
NAV_CONTROLLER_OUTPUT | #62 | R/C output data |
RC_CHANNELS | #65 | R/C channel data |
VFR_HUD | #74 | Speed, heading, altitude, etc. |
POSITION_TARGET_GLOBAL_INT | #87 | Target position during autonomous flight |
HIGHRES_IMU | #105 | IMU data |
RADIO_STATUS | #109 | Radio link condition |
DISTANCE_SENSOR | #132 | Distance sensor data (one per sensor) |
BATTERY_STATUS | #147 | Battery status |
HOME_POSITION | #242 | Takeoff point |
EXTENDED_SYS_STATE | #245 | Extended system status |
COLLISION | #247 | Collision-avoidance state (threat_level HIGH/LOW) |
DEBUG | #254 | Debug output |
MOUNT_ORIENTATION | #265 | Gimbal angle data |
ESC_INFO | #290 | ESC information |
ESC_STATUS | #291 | ESC status |
HEALTH | #59002 | Aircraft health (ACSL-specific) |
6. Other supported messages
Request/response and protocol messages. Direction is given relative to the flight controller (FCU).
| Message | ID | Direction | Description |
|---|---|---|---|
SYSTEM_TIME | #2 | GCS→FCU | Set time |
CHANGE_OPERATOR_CONTROL_ACK | #6 | GCS→FCU | R/C switching response |
SET_MODE | #11 | GCS→FCU | Mode setting |
PARAM_REQUEST_READ | #20 | GCS→FCU | Read specified parameter |
PARAM_REQUEST_LIST | #21 | GCS→FCU | Request full parameter list |
PARAM_VALUE | #22 | FCU→GCS | Parameter value |
PARAM_SET | #23 | GCS→FCU | Set parameter |
RAW_IMU | #27 | FCU→GCS | Measurement data during calibration |
MISSION_REQUEST_LIST | #43 | GCS→FCU | Begin mission download |
MISSION_COUNT | #44 | Bidirectional | Begin mission upload / item count |
MISSION_CLEAR_ALL | #45 | GCS→FCU | Clear mission |
MISSION_ITEM_REACHED | #46 | FCU→GCS | Last reached mission item number |
MISSION_ACK | #47 | Bidirectional | Mission transfer complete |
MISSION_REQUEST_INT | #51 | Bidirectional | Request an individual mission item |
MANUAL_CONTROL | #69 | GCS→FCU | R/C directive |
MISSION_ITEM_INT | #73 | Bidirectional | Mission item data |
COMMAND_INT | #75 | GCS→FCU | Single waypoint command |
COMMAND_LONG | #76 | GCS→FCU | Command (see Commands table) |
COMMAND_ACK | #77 | FCU→GCS | Command response |
AUTOPILOT_VERSION | #148 | FCU→GCS | FCU version information |
FENCE_STATUS | #162 | FCU→GCS | Geofence violation status |
MAG_CAL_REPORT | #192 | FCU→GCS | Magnetic calibration result |
STATUSTEXT | #253 | Bidirectional | Status / error notification |
CAMERA_INFORMATION | #259 | FCU→GCS | Camera information |
CAMERA_SETTINGS | #260 | FCU→GCS | Camera settings |
STORAGE_INFORMATION | #261 | FCU→GCS | Camera storage information |
CAMERA_CAPTURE_STATUS | #262 | FCU→GCS | Capture status |
CAMERA_IMAGE_CAPTURED | #263 | FCU→GCS | Still-image capture event |
GIMBAL_MANAGER_INFORMATION | #280 | FCU→GCS | Gimbal information |
PARAM_EXT_REQUEST_READ | #320 | GCS→FCU | Extended parameter (camera / aircraft) read |
PARAM_EXT_REQUEST_LIST | #321 | GCS→FCU | Extended parameter list |
PARAM_EXT_VALUE | #322 | FCU→GCS | Extended parameter value |
PARAM_EXT_SET | #323 | GCS→FCU | Set extended parameter |
PARAM_EXT_ACK | #324 | FCU→GCS | Extended 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.
| Command | ID | Accepted in | Description |
|---|---|---|---|
MAV_CMD_NAV_WAYPOINT | 16 | MISSION_ITEM_INT | Waypoint |
MAV_CMD_NAV_RETURN_TO_LAUNCH | 20 | COMMAND_LONG, MISSION_ITEM_INT | Go-home |
MAV_CMD_NAV_LAND | 21 | COMMAND_LONG, MISSION_ITEM_INT | Land |
MAV_CMD_NAV_TAKEOFF | 22 | COMMAND_LONG, MISSION_ITEM_INT | Take off |
MAV_CMD_DO_FOLLOW | 32 | COMMAND_LONG | Start tracking a target |
MAV_CMD_NAV_PAYLOAD_PLACE | 94 | MISSION_ITEM_INT | Package delivery destination |
MAV_CMD_DO_SET_MODE | 176 | COMMAND_LONG | Mode setting (free ↔ planned transition only) |
MAV_CMD_DO_CHANGE_SPEED | 178 | MISSION_ITEM_INT | Change flight speed |
MAV_CMD_DO_FLIGHTTERMINATION | 185 | COMMAND_LONG | Forced stop |
MAV_CMD_DO_LAND_START | 189 | COMMAND_LONG, MISSION_ITEM_INT | Landing sequence start |
MAV_CMD_DO_RALLY_LAND | 190 | COMMAND_LONG | Emergency landing |
MAV_CMD_DO_REPOSITION | 192 | COMMAND_LONG, COMMAND_INT | Fly to specified position |
MAV_CMD_DO_PAUSE_CONTINUE | 193 | COMMAND_LONG | Pause / resume |
MAV_CMD_DO_SET_ROI_LOCATION | 195 | MISSION_ITEM_INT | Set POI / ROI |
MAV_CMD_DO_SET_ROI_NONE | 197 | MISSION_ITEM_INT | Release POI / ROI |
MAV_CMD_DO_DIGICAM_CONTROL | 203 | COMMAND_LONG, MISSION_ITEM_INT | Camera zoom (flight planning only) |
MAV_CMD_DO_MOUNT_CONTROL | 205 | COMMAND_LONG, MISSION_ITEM_INT | Gimbal operation |
MAV_CMD_DO_SET_CAM_TRIGG_DIST | 206 | COMMAND_LONG, MISSION_ITEM_INT | Camera trigger at fixed distance |
MAV_CMD_DO_FENCE_ENABLE | 207 | COMMAND_LONG | Enable / disable geofence |
MAV_CMD_PREFLIGHT_CALIBRATION | 241 | COMMAND_LONG | Calibration |
MAV_CMD_PREFLIGHT_STORAGE | 245 | COMMAND_LONG | Clear R/C bindings (reset only) |
MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN | 246 | COMMAND_LONG | Reboot aircraft (reboot only) |
MAV_CMD_MISSION_START | 300 | COMMAND_LONG | Planned-flight transition + takeoff |
MAV_CMD_COMPONENT_ARM_DISARM | 400 | COMMAND_LONG | Motor idle start/stop (autonomous mode only) |
MAV_CMD_REQUEST_MESSAGE | 512 | COMMAND_LONG | Gimbal setting acquisition (msg 280 only) |
MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES | 520 | COMMAND_LONG, COMMAND_INT | FCU information request |
MAV_CMD_REQUEST_CAMERA_INFORMATION | 521 | COMMAND_LONG | Request CAMERA_INFORMATION |
MAV_CMD_REQUEST_CAMERA_SETTINGS | 522 | COMMAND_LONG | Request CAMERA_SETTINGS |
MAV_CMD_REQUEST_STORAGE_INFORMATION | 525 | COMMAND_LONG | Request storage information |
MAV_CMD_STORAGE_FORMAT | 526 | COMMAND_LONG | Format storage medium |
MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS | 527 | COMMAND_LONG | Request CAMERA_CAPTURE_STATUS |
MAV_CMD_RESET_CAMERA_SETTINGS | 529 | COMMAND_LONG | Reset camera settings |
MAV_CMD_SET_CAMERA_MODE | 530 | COMMAND_LONG | Change camera mode |
MAV_CMD_IMAGE_START_CAPTURE | 2000 | COMMAND_LONG, MISSION_ITEM_INT | Start still capture |
MAV_CMD_IMAGE_STOP_CAPTURE | 2001 | COMMAND_LONG, MISSION_ITEM_INT | Stop still capture |
MAV_CMD_VIDEO_START_CAPTURE | 2500 | COMMAND_LONG, MISSION_ITEM_INT | Start video recording |
MAV_CMD_VIDEO_STOP_CAPTURE | 2501 | COMMAND_LONG, MISSION_ITEM_INT | Stop video recording |
MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION | 2504 | MISSION_ITEM_INT | Request video stream information |
MAV_CMD_REQUEST_VIDEO_STREAM_STATUS | 2505 | MISSION_ITEM_INT | Request video stream status |
MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION | 5001 | MISSION_ITEM_INT | Geofence: polygon inclusion vertex |
MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION | 5002 | MISSION_ITEM_INT | Geofence: polygon exclusion vertex |
MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION | 5003 | MISSION_ITEM_INT | Geofence: circular inclusion |
MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION | 5004 | MISSION_ITEM_INT | Geofence: circular exclusion |
MAV_CMD_NAV_RALLY_POINT | 5100 | MISSION_ITEM_INT | Emergency landing site |
MAV_CMD_DO_ACCEPT_MAG_CAL | 42425 | COMMAND_LONG | Accept magnetic calibration result (ACSL) |
MAV_CMD_DO_CANCEL_MAG_CAL | 42426 | COMMAND_LONG | Redo magnetic calibration (ACSL) |
MAV_CMD_DO_FUNCTION_ENABLE | 44001 | COMMAND_LONG | Vision 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:
MAV_CMD_NAV_TAKEOFF(22) — takeoffMAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION(5001) — geofenceMAV_CMD_DO_CHANGE_SPEED(178) — set speedMAV_CMD_NAV_WAYPOINT(16) — waypoint 1MAV_CMD_NAV_WAYPOINT(16) — waypoint 2MAV_CMD_NAV_RALLY_POINT(5100) — rally pointMAV_CMD_DO_CHANGE_SPEED(178) — speed to next legMAV_CMD_NAV_PAYLOAD_PLACE(94) — land and drop payloadMAV_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 / command | ID | Use |
|---|---|---|
CHANGE_OPERATOR_CONTROL | #5 | R/C pilot/observer switching sequence (specific parameter value) |
PARAM_EXT_SET | #323 | Firmware-update sequence (specific parameter value) |
PARAM_REQUEST_READ | #20 | Firmware-update sequence (specific parameter value) |
PARAM_VALUE | #22 | Firmware-update sequence (specific parameter value) |
PARAM_EXT_ACK | #324 | Firmware-update sequence (specific parameter value) |
HEALTH | #59002 | ACSL custom telemetry: aircraft health |
DISTANCE_CONTROL | #59001 | ACSL 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
mavutilfor connections andmavgenfor 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
- Download the dialect files and generate bindings with
mavgen. - Open your chosen connection (section 3) and listen for the aircraft heartbeat.
- Emit your own heartbeat and confirm the aircraft sees your GCS.
- Read parameters, then try a simple command (for example request
AUTOPILOT_VERSIONvia #520) and confirm theCOMMAND_ACK. - 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.
- Supported MAVLink message list (spreadsheet)
- common.xml dialect
- acsl.xml dialect
- Sample mission — raw serial dump and decoded log
- Sample mission — plan file
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.
