MAVLink - MAVLink
MAVLink или Micro Air Vehicle Link - это протокол для связи с небольшими беспилотный автомобиль. Он разработан как библиотека маршалинга сообщений только для заголовков. MAVLink был впервые выпущен в начале 2009 г.[1] Лоренца Мейера под LGPL лицензия.[2]
Приложения
Он используется в основном для связи между Наземная станция управления (GCS) и Беспилотные автомобили, и в межсетевом взаимодействии подсистемы транспортного средства. Его можно использовать для передачи информации об ориентации автомобиля, его местоположении по GPS и скорости.
Структура пакета
В версии 1.0 структура пакета следующая:
Имя поля | Индекс (байты) | Цель |
---|---|---|
Начало кадра | 0 | Обозначает начало передачи кадра (v1.0: 0xFE) |
Длина полезной нагрузки | 1 | длина полезной нагрузки (n) |
Последовательность пакетов | 2 | Каждый компонент считает свою последовательность отправки. Позволяет обнаруживать потерю пакетов. |
Системный ID | 3 | Идентификация ОТПРАВЛЯЮЩЕЙ системы. Позволяет различать разные системы в одной сети. |
ID компонента | 4 | Идентификация компонента ОТПРАВКА. Позволяет различать разные компоненты одной и той же системы, например ИДУ и автопилот. |
ID сообщения | 5 | Идентификация сообщения - идентификатор определяет, что «означает» полезная нагрузка и как она должна быть правильно декодирована. |
Полезная нагрузка | От 6 до (n + 6) | Данные в сообщении зависят от идентификатора сообщения. |
CRC | (n + 7) - (n + 8) | Контрольная сумма всего пакета, исключая знак начала пакета (от LSB к MSB) |
После версии 2 структура пакета была расширена до следующего:[3]
Имя поля | Индекс (байты) | Цель |
---|---|---|
Начало кадра | 0 | Обозначает начало передачи кадра (v2: 0xFD) |
Длина полезной нагрузки | 1 | длина полезной нагрузки (n) |
флаги несовместимости | 2 | Флаги, которые необходимо понимать для совместимости с MAVLink |
флаги совместимости | 3 | Флаги, которые можно игнорировать, если их не понимают |
Последовательность пакетов | 4 | Каждый компонент считает свою последовательность отправки. Позволяет обнаруживать потерю пакетов. |
Системный ID | 5 | Идентификация ОТПРАВЛЯЮЩЕЙ системы. Позволяет различать разные системы в одной сети. |
ID компонента | 6 | Идентификация компонента ОТПРАВКА. Позволяет различать разные компоненты одной и той же системы, например ИДУ и автопилот. |
ID сообщения | 7-9 | Идентификация сообщения - идентификатор определяет, что «означает» полезная нагрузка и как она должна быть правильно декодирована. |
Полезная нагрузка | От 10 до (n + 10) | Данные в сообщении зависят от идентификатора сообщения. |
CRC | (n + 11) - (n + 12) | Контрольная сумма всего пакета, исключая знак начала пакета (от LSB к MSB) |
Подпись | от (n + 13) до (n + 25) | Подпись, чтобы убедиться, что сообщения отправляются из надежного источника. (необязательный) |
Поле CRC
Чтобы гарантировать целостность сообщения, для каждого сообщения в последних двух байтах рассчитывается циклический контроль избыточности (CRC). Другой функцией поля CRC является обеспечение согласия отправителя и получателя в передаваемом сообщении. Он вычисляется с использованием хэша ITU X.25 / SAE AS-4 байтов в пакете, за исключением индикатора начала кадра (поэтому оцениваются 6 + n + 1 байтов, дополнительный +1 является начальным значением) .
Кроме того, начальное значение добавляется к концу данных при вычислении CRC. Начальное число генерируется с каждым новым набором сообщений протокола и хэшируется таким же образом, как и пакеты из каждой спецификации сообщения. Системы, использующие протокол MAVLink, могут использовать для этой цели предварительно вычисленный массив.[4]
Алгоритм CRC MAVLink был реализован на многих языках, таких как Python.[5] и Java.[6][7][8]
Сообщения
Полезная нагрузка из описанных выше пакетов - это сообщения MAVLink. Каждое сообщение идентифицируется по полю идентификатора в пакете, а полезная нагрузка содержит данные из сообщения. An XML документ в источнике MAVlink[9] содержит определение данных, хранящихся в этой полезной нагрузке.
Ниже приведено сообщение с ID 24, извлеченное из XML-документа.
<сообщение id ="24" имя =«GPS_RAW_INT»> <description>Глобальное положение, возвращаемое глобальной системой позиционирования (GPS). Это НЕ оценка глобального положения системы, а скорее значение датчика RAW. См. Сообщение GLOBAL_POSITION для оценки глобальной позиции. Рамка координат правая, ось Z вверх (рамка GPS).</description> <поле type ="uint64_t" имя ="time_usec">Отметка времени (микросекунды с эпохи UNIX или микросекунды с момента загрузки системы)</field> <поле type ="uint8_t" имя ="fix_type">0-1: без исправлений, 2: исправление 2D, 3: исправление 3D. Некоторые приложения не будут использовать значение этого поля, если оно не равно как минимум двум, поэтому всегда правильно заполняйте исправление.</field> <поле type ="int32_t" имя ="лат">Широта (WGS84), в градусах * 1E7</field> <поле type ="int32_t" имя ="лон">Долгота (WGS84), в градусах * 1E7</field> <поле type ="int32_t" имя ="alt">Высота (WGS84), в метрах * 1000 (положительно вверх)</field> <поле type ="uint16_t" имя ="эф">Горизонтальное разбавление положения GPS HDOP в см (м * 100). Если неизвестно, установите: UINT16_MAX</field> <поле type ="uint16_t" имя ="epv">GPS VDOP горизонтальное разбавление положения в см (м * 100). Если неизвестно, установите: UINT16_MAX</field> <поле type ="uint16_t" имя ="вел">Скорость относительно земли по GPS (м / с * 100). Если неизвестно, установите: UINT16_MAX</field> <поле type ="uint16_t" имя ="винтик">Курс относительно земли (НЕ курс, а направление движения) в градусах * 100, 0,0..359,99 градуса. Если неизвестно, установите: UINT16_MAX</field> <поле type ="uint8_t" имя ="satellites_visible">Количество видимых спутников. Если неизвестно, установите 255</field></message>
Примечание. В документе XML описывается логический порядок полей протокола. В фактическом формате провода (и типичном представлении в памяти) поля переупорядочены.[10] уменьшить Выравнивание структуры данных вопросы. Это может быть источником путаницы при чтении кода, созданного на основе определений сообщений.
Экосистема MAVLink
MAVLink используется в качестве протокола связи во многих проектах, что может означать, что между ними существует некоторая совместимость. Написано интересное руководство, объясняющее основы MAVLink.[11]
Рекомендации
- ^ "Начальная фиксация · mavlink / mavlink @ a087528". GitHub.
- ^ «Архивная копия». Архивировано из оригинал на 2018-08-18. Получено 2013-07-31.CS1 maint: заархивированная копия как заголовок (связь)
- ^ «Сериализация · Руководство разработчика MAVLink». mavlink.io. Получено 2019-08-22.
- ^ http://qgroundcontrol.org/mavlink/crc_extra_calculation
- ^ «GitHub - ArduPilot / pymavlink: интерфейс и утилиты python MAVLink». 18 августа 2019 г. - через GitHub.
- ^ "GitHub - arthurbenemann / droidplanner: наземная станция управления для устройств Android". 2 июля 2019 г. - через GitHub.
- ^ «Генератор кода Java и библиотека Java для MAVLink: ghelle / MAVLinkJava». 4 августа 2019 г. - через GitHub.
- ^ "GitHub - dronefleet / mavlink: Java API для связи MAVLink". 2 августа 2019 г. - через GitHub.
- ^ "GitHub - mavlink / mavlink: библиотека маршаллинга / связи для дронов". 20 августа 2019 г. - через GitHub.
- ^ http://qgroundcontrol.org/mavlink/crc_extra_calculation#field_reordering
- ^ Написал Шьям Баласубраманян 15 ноября 2013 г. в 14:36 в группе пользователей ArduCopter; Обсуждения, Вернуться к группе пользователей ArduCopter. "Учебник MAVLink для абсолютных чайников (Часть –I)". diydrones.com.