MAVLink: стандартные определения |
![]() |
Добавил(а) microsin |
Следующие 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, которые еще не были опубликованы в основном репозитории проекта (и они могут быть не документированы). cubepilot.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"?> Ниже перечислены основные теги (все они опциональны): • include: этот тег используется для указания других XML-файлов, подключенных в ваш диалект. - Обычно файлы диалекта будут подключать common.xml, как показано выше. • 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: < enum name="LANDING_TARGET_TYPE"> < description>Тип цели приземления< /description> < entry value="0" name="LANDING_TARGET_TYPE_LIGHT_BEACON"> < description>Цель приземления сигнализирует световым маячком (например:\ IR-LOCK)< /description> < /entry> < entry value="1" name="LANDING_TARGET_TYPE_RADIO_BEACON"> < description>Цель приземления сигнализирует радио маячком (например: \ ILS, NDB)< /description> < /entry> < entry value="2" name="LANDING_TARGET_TYPE_VISION_FIDUCIAL"> < description>Цель приземления представлена реперным маркером (например: \ ARTag)< /description> < /entry> < entry value="3" name="LANDING_TARGET_TYPE_VISION_OTHER"> < description>Цель приземления представлена визуальной формой/фигурой \ (например: X-маркер, H-маркер, квадрат)< /description> < /entry> У перечисления существуют следующие основные атрибуты: • 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: < enum name="MAV_CMD"> ... < entry value="94" name="MAV_CMD_NAV_PAYLOAD_PLACE"> < description>Спуск и размещение полезной нагрузки. Квадрик снижается, \ пока не обнаружит, что висящая нагрузка достигла земли, после чего \ раскрывает захват и освобождает полезную нагрузку< /description> < param index="1">Максимальная дистанция для снижения (метров)< /param> < param index="2">Пусто< /param> < param index="3">Пусто< /param> < param index="4">Пусто< /param> < param index="5">Latitude (широта, deg * 1E7)< /param> < param index="6">Longitude (долгота, deg * 1E7)< /param> < param index="7">Altitude (высота, метров)< /param> Поле 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". Совет: для дополнительной информации см. Defining XML Enums/Messages > Reserved/Undefined Parameters. • default - значение по умолчанию для param (используется главным образом для зарезервирвоанных параметров, где значение 0 или NaN). [Определение сообщения (messages)] Сообщения определены в блоке < messages> ... < /messages> с использованием тегов < message>...< /message> Отдельные поля кодируются в полезной нагрузке сообщения с использованием определений тегов < field> ... < /field>. Каждое сообщение должно иметь как минимум одно поле. Для примера ниже приведено определение сообщения BATTERY_STATUS (оно было выбрано потому, что содержит многие основные поля и атрибуты). < message id="147" name="BATTERY_STATUS"> < description>Информация о батарее. Обновляет GCS статусом батареи полетного контроллера. \ Умные батареи также используют это сообщение, но могут дополнительно посылать \ SMART_BATTERY_INFO.< /description> < field type="uint8_t" name="id" instance="true">Идентификатор батареи (Battery ID)< /field> < field type="uint8_t" name="battery_function" enum="MAV_BATTERY_FUNCTION">Функция батареи< /field> < field type="uint8_t" name="type" enum="MAV_BATTERY_TYPE">Тип (химия) батареи< /field> < field type="int16_t" name="temperature" units="cdegC" invalid="INT16_MAX">Температура \ батареи. INT16_MAX для неизвестной температуры.< /field> < field type="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> < field type="int16_t" name="current_battery" units="cA" invalid="-1">Ток батареи, \ -1: автопилот не измеряет ток< /field> < field type="int32_t" name="current_consumed" units="mAh" invalid="-1">Потребленный заряд, \ -1: автопилот не предоставляет оценку потребления заряда< /field> < field type="int32_t" name="energy_consumed" units="hJ" invalid="-1">Потребленная энергия, \ -1: автопилот не предоставляет оценку потребления энергии< /field> < field type="int8_t" name="battery_remaining" units="%" invalid="-1">Оставшаяся энергия батареи. \ Значения: [0-100], -1: автопилот не предоставляет оценку разряжености батареи.< /field> < extensions/> < field type="int32_t" name="time_remaining" units="s" invalid="0">Оставшееся время работы от \ батареи, 0: автопилот не предоставляет оценку оставшегося времени батареи< /field> < field type="uint8_t" name="charge_state" enum="MAV_BATTERY_CHARGE_STATE">Состояние степени \ разряда, предоставленное автопилотом для предупреждения или внешних реакций< /field> < field type="uint16_t[4]" name="voltages_ext" units="mV" invalid="[0]">Напряжения батареи для \ ячеек 11 .. 14. Ячейки с номерами выше допустимого количества для этой батареи должны иметь \ значение 0, где 0 показывает, что ячейка не поддерживается (обратите внимание, что это отличается \ от поля напряжений и позволяет усечение пустого байта). Если измеренное значение 0, то вместо \ него должно быть отправлено 1.< /field> < field type="uint8_t" name="mode" enum="MAV_BATTERY_MODE">Режим батареи. Умолчание (0) означает, \ что сообщение о режиме батареи не поддерживается, или батарея находится в режиме нормального \ использования.< /field> < field type="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 со следующими атрибутами: • 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). < message id="11" name="SET_MODE"> < deprecated since="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-элементы опускаются. Чаще всего этот тег используется следующим образом: < wip />
[Ссылки] 1. MAVLink-Standard Definitions site:mavlink.io. |