MAVLink-M is an open dialect of MAVLink 2 for coordination and situational-awareness messaging between uncrewed platforms and the command systems that work with them.
Where the common MAVLink message set covers flying the aircraft, MAVLink-M adds a shared vocabulary for what a platform observes and coordinates with others: tracks, positions, taskings, status, and structured reports. The messages are shaped so that a platform speaking this dialect can be understood by the wider force, translating cleanly, through a gateway, into the command-and-control message standards those systems already run on.
MAVLink-M is a message-schema dialect. It defines field layouts on top of open MAVLink; it is not an implementation, and it does not describe how any device works internally.
What the dialect deliberately does and does not carry is the core of its design:
- It carries descriptive intent and observation — what was seen, what is requested, and the current status of a participant. This is the information a cooperating system needs to coordinate.
- It excludes device-internal configuration — no fuze timing values, no laser codes, no performance or effectiveness data. The messages describe coordination between participants, never the internal programming of a device.
- Kinetic and non-kinetic intent are separable — observation cueing is a distinct message from action requests, so a consumer can tell "observe this" from "act on this" by message ID alone.
- Accountability is a record, not a trigger — messages that record a decision or authorization are exactly that: a record for audit and shared awareness, not a command that causes an action.
These boundaries are intentional. They keep the dialect a coordination and telemetry vocabulary that interoperates across systems, and keep the internal programming of any device off the wire.
| File | Purpose |
|---|---|
military.xml |
The shared MAVLink-M dialect. Includes common.xml. |
military_extensions.xml |
A template only, showing how a downstream implementor defines private, local messages in the reserved 53900-53999 block without adding them to the shared dialect. Not part of the generated dialect here. |
generated/ |
Pre-generated language bindings for the shared dialect. |
IDMAPPING.md |
Message-ID allocation for the 53000-53999 range. |
Message IDs are allocated as 53000-53099 for the initial shared messages,
53100-53899 reserved for future shared growth, and 53900-53999 for
private/downstream messages. See IDMAPPING.md for the full map.
The dialect drops into any MAVLink 2 stack. Generate bindings for your language with mavgen, for example:
python3 -m pymavlink.tools.mavgen \
--lang=C --wire-protocol=2.0 \
--output=out military.xmlPre-generated C headers are also provided under generated/.
For a worked example on real hardware — a flight controller relaying MAVLink-M messages to a peripheral — see nucleo-mavlink-m-demo.
The 53000-53099 allocation is active for this dialect. Message IDs are stable
once assigned. To propose a new shared message or a change, open a pull request
against military.xml; keep additions within the scope and boundaries above.
MIT. See LICENSE.