Следующие XML-файлы определений представляют собой стандартный набор свойств, управляемых проектом mavlink.io. Они содержат сообщения, команды и перечисления, которые ожидаются в использовании для многих стеках дистанционно управляемых устройств (multiple flight stacks, MFS, так называемые полетные стеки) и наземных станциях управления (ground control stations, GCS):
common.xml - набор элементов, которые были реализованы как минимум в одном основном полетном стеке (включая объекты в standard.xml и common.xml).
standard.xml - стандартный набор элементов, совместимым образом реализованных как минимум двумя полетными стеками.
minimal.xml - минимальный набор элементов (сообщения, перечисления, MAV_CMD), необходимый для установки сети MAVLink.
Примечание: расшифровку незнакомых терминов и сокращений см. в Словарике MAVLink статьи [2].
[Диалекты MAVLink]
Далектами называют XML-файлы, которые определяют протокол - как стандартные его элементы, так и специфичные для вендора сообщения, перечисления и команды.
См. врезку "Диалекты и тестовые определения" для примеров XML-определений некоторых полетных стеков.
Замечание: специфические диалекты не управляются проектом mavlink.io. Они обычно используются только в одном частном полетном стеке, и управляются этим полетным стеком. Соответствующий XML диалекта обычно включает информацию о владельце в виде заголовка комментария. Форки MAVLink вендора могут содержать элементы XML, которые еще не были опубликованы в основном репозитории проекта (и они могут быть не документированы).
Обратите внимание, что диалекты могут включать стандартные определения MAVLink [1] или другие диалекты. Разрешается до 5 уровней вложения в файле XML, см. MAXIMUM_INCLUDE_FILE_NESTING в mavgen.py. Типовой шаблон для диалекта обычно подключает common.xml (содержащий стандартные определения MAVLink), расширяя его сообщениями, специфичными для вендора или протокола.
[MAVLink Standard Definitions]
Следующие определения используются для тестирования и проверки корректности диалекта:
all.xml - включает все другие файлы XML, и используется для проверки отсутствия конфликтов идентификаторов ID (и может потенциально использоваться GCS для обмена с любым основным диалектом).
test.xml - тестовый XML-файл определений.
python_array_test.xml - тестовый XML-файл определений для массивов.
[MAVLink XML File Schema / Format]
Формат и структура файлов диалекта формально определена в документе XML Schema: mavschema.xsd. Хотя это каноническая ссылка, легче понять XML-файл на примере (как показано в следующих разделах).
Структура файла. Общая структура XML-файлов MAVLink приведена ниже. Если вы создаете пользовательский файл диалекта, структура вашего файла должна быть аналогична приведенной ниже (но может пропустить любые/все разделы).
< ?xml version="1.0"?> < mavlink> < include>common.xml< /include>< include>other_dialect.xml< /include> < !-- ЗАМЕЧАНИЕ: если подключенный файл уже содержит тег version,
то здесь этот тег удалите, иначе раскоментируйте
следующую строку. -->< !-- < version>6< /version> --> < dialect>8< /dialect> < enums>< !-- Здесь определены перечисления (опционально) -->< /enums> < messages>< !-- Здесь определены сообщения (опционально) -->< /messages> < /mavlink>
Ниже перечислены основные теги (все они опциональны):
• include: этот тег используется для указания других XML-файлов, подключенных в ваш диалект.
- Обычно файлы диалекта будут подключать common.xml, как показано выше. - Вы можете подключить несколько файлов, используя отдельные теги include. - Путь подключаемых файлов относителен к вашему файлы диалекта. Однако обратите внимание, что тесты проекта охватывают только случай, когда диалекты находятся в одной папке. - Вложенные include не поддерживаются (импортируются только файлы, указанные в теге include верхнего уровня). - При сборке утилиты генератора будут сливать вместе (присоединять) перечисления во всех файлах, и сообщать о дубликатах элементов перечислений и сообщений.
• version: minor-номер версии для релиза, как подключено в поле mavlink_version [HEARTBEAT](../messages/common.md#HEARTBEAT message).
- Для диалектов, которые подключают common.xml, тег version должен быть удален, чтобы использовался version из common.xml (если тег version указан, то он будет использоваться из файла верхнего уровня). - Для частных диалектов вы можете использовать любую версию, какую захотите.
• dialect: число, уникальное для вашего диалекта.
• enums: в этом блоке могут быть определены перечисления, специфические для диалекта (если они не определены в файле, то этот блок опционален или может быть удален).
• messages: в этом блоке могут быть определены сообщения, специфические для диалекта (если они не определены в файле, то этот блок опционален или может быть удален).
Определения enum. Перечисления применяются для определения именованных значений, которые могут использоваться как опции в сообщениях - например для определения ошибок, состояний или режимов. Существует также специальное перечисление MAV_CMD, которое используется для определения команд MAVLink.
Перечисления определяются внутри блоков < enums> ... < /enums> (как обсуждалось в предыдущей секции) с помощью тегов < enum> ... < /enum> tags. Значения перечисления определены внутри enum с помощью тегов < entry> ... < /entry>.
Например, может быть определено вот такое перечисление LANDING_TARGET_TYPE:
У перечисления существуют следующие основные атрибуты:
• name: имя перечисления (обязательное). Это строка из заглавных букв, где слова отделены друг от друга символом нижнего подчеркивания.
• bitmask: установите в true для перечислений, которые определяют увеличивающиеся значения степени двойки, такие как флаги.
У перечисления существуют следующие вложенные теги (все они опциональные):
• description: строка, описывающая предназначение этого перечисления.
• entry: элемент перечисления (для каждого перечисления можно указать 0 или большее количество элементов).
• deprecated: этот тег показывает, что перечисление устарело.
entry. Элемент перечисления определяет одно из возможных значений этого перечисления. Атрибуты "нормального" элемента перечисления:
• name: имя значения перечисления (обязательное). Это строка из заглавных букв, где слова отделены друг от друга символом нижнего подчеркивания.
• value (опционально): значение элемента (число).
Вложенные поля "нормального" элемента (все они опциональные):
• description: описание элемента.
• deprecated: показывает, что элемент устарел.
• wip: показывает, что элемент разрабатывается (work in progress).
Замечание: entry может также определять опциональные элементы: param, hasLocation, isDestination, missionOnly. На практике они должны использоваться только в перечислении MAV_CMD (описано далее).
[Команды MAVLink (enum MAV_CMD)]
Отдельные значения элементов в перечислении MAV_CMD используются для определения команд MAVLink. У каждой команды есть значение (её "номер команды"), и команда указывает до 7 параметров.
Замечание: эти параметры закодированы в сообщениях MISSION_ITEM или MISSION_ITEM_INT (Mission Protocol, протокол миссии), либо сообщениях COMMAND_INT или COMMAND_LONG messages (Command Protocol).
Для примера рассмотрим MAV_CMD_NAV_PAYLOAD_PLACE:
< enumname="MAV_CMD">
...
< entryvalue="94"name="MAV_CMD_NAV_PAYLOAD_PLACE">< description>Спуск и размещение полезной нагрузки. Квадрик снижается, \
пока не обнаружит, что висящая нагрузка достигла земли, после чего \
раскрывает захват и освобождает полезную нагрузку< /description>< paramindex="1">Максимальная дистанция для снижения (метров)< /param>< paramindex="2">Пусто< /param>< paramindex="3">Пусто< /param>< paramindex="4">Пусто< /param>< paramindex="5">Latitude (широта, deg * 1E7)< /param>< paramindex="6">Longitude (долгота, deg * 1E7)< /param>< paramindex="7">Altitude (высота, метров)< /param> < /entry>
... < /enum>
Поле value элементов MAV_CMD может дополнительно определять следующие теги/поля:
• param (опционально): до 7 тегов параметров, пронумерованных атрибутом index.
• Одно из следующего (но не одновременно):
hasLocation (опционально): двоичное значение (по умолчанию true), которое предоставляется подсказку для GCS, что элемент должен отображаться как "автономное" месторасположения (standalone location), а не как место назначение на маршруте полета. Применяется для команд MAV_CMD, которые содержат широту/долготу/высоту (lat/lon/alt) информации места размещения в param-значениях 5, 6 и 7, но которые не находятся на маршруте полета (например: MAV_CMD_DO_SET_ROI_LOCATION).
isDestination (опционально): двоичное значение (по умолчанию true), которое предоставляется подсказку для GCS, что элемент должен отображаться как точка на маршруте полета. Применяется для команд MAV_CMD, которые содержат широту/долготу/высоту (lat/lon/alt) информации места размещения в param-значениях 5, 6 и 7, и которые устанавливают путь/место назначения (например: MAV_CMD_NAV_WAYPOINT и MAV_CMD_NAV_LAND).
missionOnly (опционально): применяется со значением true, если MAV_COMMAND имеет смысл только в миссии. Например, команды задания ограждения не могут быть полезны в команде.
param. Тег < param> используется в перечислении MAV_CMD как часть определения команд миссии. Каждое значение entry может иметь до 7 декларированных с помощью param параметров, с индексами от 1 до 7 (индекс параметра указывается атрибутом index, и он является обязательным для param).
У param может присутствовать описание:
• description - описание параметра (находится в теле тега).
Параметр также может включать следующие опциональные атрибуты (которые могут использоваться графическим интерфейсом пользователя для отображения и редактирования параметров):
• label - видимое имя, представляющее параметр на GCS или другом UI. Все слова label должны быть в верхнем регистре.
• units - единицы СИ (SI) для значения.
• enum - перечисление, содержащее возможные значения для параметра (если это имеет место).
• decimalPlaces - подсказка для UI, сколько десятичных позиций использовать в отображаемом параметре.
• increment - разрешенные инкременты для значения параметра.
• minValue - минимальное значение для параметра.
• maxValue - максимальное значение для параметра.
• multiplier - умножается на это значение для получения не масштабированного оригинального значения. Это предназначено главным образом для масштабирования, применяемого для значений без единиц, когда масштабирование не закодировано единицами units.
• reserved - двоичное значение, которое показывает, что параметр зарезервирован для использования в будущем. Если атрибуты не декларированы, то неявно reserved="False".
• default - значение по умолчанию для param (используется главным образом для зарезервирвоанных параметров, где значение 0 или NaN).
[Определение сообщения (messages)]
Сообщения определены в блоке < messages> ... < /messages> с использованием тегов < message>...< /message> Отдельные поля кодируются в полезной нагрузке сообщения с использованием определений тегов < field> ... < /field>. Каждое сообщение должно иметь как минимум одно поле.
Для примера ниже приведено определение сообщения BATTERY_STATUS (оно было выбрано потому, что содержит многие основные поля и атрибуты).
< messageid="147"name="BATTERY_STATUS">< description>Информация о батарее. Обновляет GCS статусом батареи полетного контроллера. \
Умные батареи также используют это сообщение, но могут дополнительно посылать \
SMART_BATTERY_INFO.< /description>< fieldtype="uint8_t"name="id"instance="true">Идентификатор батареи (Battery ID)< /field>< fieldtype="uint8_t"name="battery_function"enum="MAV_BATTERY_FUNCTION">Функция батареи< /field>< fieldtype="uint8_t"name="type"enum="MAV_BATTERY_TYPE">Тип (химия) батареи< /field>< fieldtype="int16_t"name="temperature"units="cdegC"invalid="INT16_MAX">Температура \
батареи. INT16_MAX для неизвестной температуры.< /field>< fieldtype="uint16_t[10]"name="voltages"units="mV"invalid="[UINT16_MAX]">Напряжение \
ячеек 1 .. 10 батареи (см. voltages_ext для ячеек 11 .. 14). Ячейки в этом поле сверх \
допустимого количества ячеек для этой батареи должны иметь значение UINT16_MAX. \
Если напряжения отдельных ячеек неизвестны или не измерены, то общее напряжение \
батареи должно быть заполнено в ячейке 0, а у всех других установлено значение UINT16_MAX. \
Если напряжение батареи больше чем (UINT16_MAX - 1), то ячейка 0 должна быть установлена \
в (UINT16_MAX - 1), а ячейка 1 в оставшееся напряжение. Это может быть расширено на несколько \
ячеек, если общее напряжение больше, чем 2 * (UINT16_MAX - 1).< /field>< fieldtype="int16_t"name="current_battery"units="cA"invalid="-1">Ток батареи, \
-1: автопилот не измеряет ток< /field>< fieldtype="int32_t"name="current_consumed"units="mAh"invalid="-1">Потребленный заряд, \
-1: автопилот не предоставляет оценку потребления заряда< /field>< fieldtype="int32_t"name="energy_consumed"units="hJ"invalid="-1">Потребленная энергия, \
-1: автопилот не предоставляет оценку потребления энергии< /field>< fieldtype="int8_t"name="battery_remaining"units="%"invalid="-1">Оставшаяся энергия батареи. \
Значения: [0-100], -1: автопилот не предоставляет оценку разряжености батареи.< /field>< extensions/>< fieldtype="int32_t"name="time_remaining"units="s"invalid="0">Оставшееся время работы от \
батареи, 0: автопилот не предоставляет оценку оставшегося времени батареи< /field>< fieldtype="uint8_t"name="charge_state"enum="MAV_BATTERY_CHARGE_STATE">Состояние степени \
разряда, предоставленное автопилотом для предупреждения или внешних реакций< /field>< fieldtype="uint16_t[4]"name="voltages_ext"units="mV"invalid="[0]">Напряжения батареи для \
ячеек 11 .. 14. Ячейки с номерами выше допустимого количества для этой батареи должны иметь \
значение 0, где 0 показывает, что ячейка не поддерживается (обратите внимание, что это отличается \
от поля напряжений и позволяет усечение пустого байта). Если измеренное значение 0, то вместо \
него должно быть отправлено 1.< /field>< fieldtype="uint8_t"name="mode"enum="MAV_BATTERY_MODE">Режим батареи. Умолчание (0) означает, \
что сообщение о режиме батареи не поддерживается, или батарея находится в режиме нормального \
использования.< /field>< fieldtype="uint32_t"name="fault_bitmask"enum="MAV_BATTERY_FAULT">Индикации отказа/здоровья \
(fault/health). Это должно быть установлено, когда charge_state MAV_BATTERY_CHARGE_STATE_FAILED \
или MAV_BATTERY_CHARGE_STATE_UNHEALTHY (если нет, то fault reporting не поддерживается).< /field> < /message>
Каждое сообщение инкапсулируется тегами message со следующими атрибутами:
• id: атрибут идентификатора, уникальный номер индекса для этого сообщения (в показанном выше примере 147).
Для протокола MAVLink 1: допустимы номера id в диапазоне 0 .. 255. Идентификаторы 0-149 и 230-255 зарезервированы для common.xml. Диалекты могут использовать 180-229 для своих сообщений (при условии, что они не используются другими подключенными диалектами).
Для MAVLink 2: допустимы номера id в диапазоне 0 .. 16777215. Все номера ниже 255 должны считаться зарезервированными, за исключением сообщений, которые также предназначены для MAVLink 1.
Замечание: значения идентификаторов являются дорогим ресурсом в MAVLink 1.
• name: атрибут имени предоставляет удобную для чтения человеком форму для сообщения (например "BATTERY_STATUS"). Это используется для именования в helper-функциях генерируемых библиотек, но не посылается по каналу связи.
Внутренние теги message:
• description: удобочитаемое описание сообщения, которое показывается в интерфейсах пользователя и комментариях кода. Здесь должна содержаться вся информация (и гиперссылки) для полного понимания сообщения.
• field: кодирует поле сообщения. Значение field это строка имени/текста, используемая в документации GUI (но она не посылается по каналу связи). Каждое message должно иметь как минимум одно field.
Атрибуты для field следующие:
type: подобно полю в структуре C - размер данных, необходимый для сохранения/представления типа данных. Поля могут быть целыми числами signed/unsigned размером 8, 16, 23, 64 бита ({u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t), одиночной/двойной точности IEEE754 float. Они также могут быть массивами других типов - например uint16_t[10].
name: имя поля (используется в коде).
enum (опционально): имя перечисления, определяющего возможные значения поля (например MAV_BATTERY_CHARGE_STATE).
units (опционально): единицы для полей сообщения, которые принимают числовые значения (не перечисления). Они определены в schema (см. name="SI_Unit").
multiplier (опционально): множитель на это значение, чтобы получить не масштабированное оригинальное значение. Допустимые значения определены в schema (см. name="factor"). Например, GPS_STATUS это значение в градусах (0-360), посылаемое в поле байта (0-255). Чтобы получить оригинальное значение, байт умножается на значение multiplier (360/256). Это в настоящее время используется только для значений, масштабирование которых не закодировано в units.
print_format (опционально): TBD (пока не реализовано).
default (опционально): TBD (пока не реализовано).
increment: разрешенные инкременты для изменения значения.
minValue: минимальное значение поля.
maxValue: максимальное значение поля.
instance: если true, то это показывает, что сообщение содержит информацию определенного сенсора или батареи (например Battery 1, Battery 2, и т. д.), и что это поле показывает, какой сенсор. По умолчанию false. Это поле позволяет получателю автоматически связать сообщения с определенным сенсором и нарисовать их в одной последовательности.
invalid: указывает значение, которое можно установить на поле, чтобы показать недопустимость данных. В этом случае получатель должен игнорировать поле, если в нем оказалось такое значение. Например, BATTERY_STATUS.current_battery указывает invalid="-1", таким образом для батареи, у которой не измеряется ток, должно быть установлено BATTERY_STATUS.current_battery = -1.
Там, где это возможно, значение invalid должно быть выбрано вне ожидаемого/допустимого значения поля (предпочтителен 0, если это не относится к допустимому значению поля). Для целых чисел обычно выбирается самое большое возможное значение (например UINT16_MAX, INT16_MAX, UINT8_MAX, UINT8_MAX). Для чисел float мы обычно используем invalid="NaN".
Массивы представляют несколько элементов, где некоторые (или все) могут нуждаться в пометке как недопустимые. Используется следующая нотация, чтобы пометить недопустимые элементы массива:
invalid="[value]": элементы массива, содержащие значение value, являются недопустимыми.
invalid="[value:]": все элементы массива недопустимы, если первый элемент массива установлен в значение value.
invalid="[value1,,value3,]": элементы массива недопустимы, если они содержат значение, присутствующее в этом списке. Если позиция списка пустая, то невозможно указать, что соответствующий элемент массива недействителен. В этом примере показано, что элементы 1 и 3 недопустимы, если они содержат значения value1 и value3 соответственно. Для элемента 2 и любых элементов >4 недопустимое свойство поля не может быть установлено.
invalid="[value1,]": первый элемент массива недопустим, если содержит value1: недопустимое свойство поля не может быть установлено для всех других элементов.
• deprecated (опционально): помечает сообщение как устаревшее.
• wip (опционально): помечает, что сообщение в разработке (work in progress).
• extensions (опционально): это самозакрывающийся тег, используемый для отображения последующих полей, применимых только к MAVLink 2. Тег должен использоваться только для сообщений MAVLink 1 (id < 256), которые были расширены в MAVLink 2.
[Общие теги]
Здесь перечислены теги, которые могут использоваться в нескольких других типах - например в message и enum.
deprecated. Тег < deprecated> может использоваться в перечислении (enum), элементе перечисления (value) или сообщении, чтобы показать, что элемент был заменен. Атрибуты тега показывают время устаревания и замещающий его элемент, в то время как элемент может (опционально) содержать строку с дополнительной информацией, описывающей устаревание.
Утилита генерации библиотеки (MAVlink generator toolchain) может быть сконфигурирована для условной сборки сообщений, когда устаревшие элементы опускаются.
Совет: сущность должна быть помечена как deprecated только когда основные пользователи выбрали вариант обновления на новый метод.
В качестве конкретного примера рассмотрим SET_MODE, что устарело и было заменено на MAV_CMD_DO_SET_MODE в декабре 2015 года (2015-12).
< messageid="11"name="SET_MODE">< deprecatedsince="2015-12"replaced_by="MAV_CMD_DO_SET_MODE">Вместо этого используйте \
COMMAND_LONG вместе с MAV_CMD_DO_SET_MODE < /deprecated>
Атрибуты deprecated:
• since: год/месяц, когда началось устаревание. Формат: YYYY-MM.
• replaced_by: строка сущности, которая заменила устаревший элемент.
wip. Тег < wip> может использоваться в элементе перечисления (value) или сообщения, чтобы показать, что это находится в процессе разработки (work in progress). Элемент может (опционально) содержать строку с дополнительной информацией о новом элементе.
Утилита генерации библиотеки может быть сконфигурирована для условной сборки сообщений, когда wip-элементы опускаются.
Чаще всего этот тег используется следующим образом: