If you define custom messages for a payload or sensor, you write an XML dialect file that includes common.xml and adds your messages. Then run mavgen to produce language-specific libraries.
xml
<!-- my_dialect.xml -->
<?xml version="1.0"?>
<mavlink>
<include>common.xml</include>
<messages>
<message id="50001" name="MY_SENSOR_DATA">
<field type="uint32_t" name="timestamp_ms">Milliseconds since boot</field>
<field type="float" name="temperature">Celsius</field>
<field type="float" name="pressure">Pascal</field>
</message>
</messages>
</mavlink>bash
# Generate C headers from your dialect python3 -m pymavlink.tools.mavgen \ --lang=C \ --wire-protocol=2.0 \ --output=generated/my_dialect \ my_dialect.xml # Generate Python bindings python3 -m pymavlink.tools.mavgen \ --lang=Python \ --wire-protocol=2.0 \ --output=generated/my_dialect.py \ my_dialect.xml
Message ID ranges
IDs 0–149 are reserved for common.xml. 150–229 are for vendor dialects. 230–255 are for MAVLink 1 testing. MAVLink 2 extends to 0–16777215 — use IDs above 50000 for private/experimental messages.