MAVLink
Основная документация: https://mavlink.io/en/.
MAVLink – это протокол для организации связи между автономными летательными и транспортными системами (дронами, самолетами, автомобилями). Протокол MAVLink лежит в основе взаимодействия между Pixhawk и Raspberry Pi.
В Клевер включено 2 обертки над этим протоколом: MAVROS и simple_offboard.
Код для отправки произвольного MAVLink сообщения можно найти в примерах.
Основные концепции
Канал связи
Протокол MAVLink может быть использован поверх следующих каналов связи:
- последовательное соединение (UART, USB и др.);
- UDP (Wi-Fi, Ethernet, 3G, LTE);
- TCP (Wi-Fi, Ethernet, 3G, LTE).
Сообщение
MAVLink-сообщение это отдельная "порция" данных, передаваемая между устройствами. Отдельное MAVLink-сообщение содержит информацию о состоянии дрона (или другого устройства) или команду для дрона.
Примеры MAVLink-сообщений:
ATTITUDE
,ATTITUDE_QUATERNION
– ориентация квадрокоптера в пространстве;LOCAL_POSITION_NED
– локальная позиция квадрокоптера;GLOBAL_POSITION_INT
– глобальная позиция квадрокоптера (широта/долгота/высота);COMMAND_LONG
– команда для квадрокоптера (взлететь, сесть, переключить режим и т. д.).
Полный список MAVLink-сообщений можно посмотреть в документации MAVLink.
Система, компонент системы
Каждое устройство (дрон, базовая станция и т. д.) имеет ID в сети MAVLink. В PX4 MAVLink ID меняется с помощью параметра MAV_SYS_ID
. Каждое MAVLink сообщение содержит поле с ID системы-отправителя. Кроме того, некоторые сообщения (например, COMMAND_LONG
) содержат также ID системы-получателя.
Помимо ID систем, сообщения могут содержать ID компонента-отправителя и компонента-получателя. Примеры компонентов системы: полетный контроллер, внешняя камера, управляющий бортовой компьютер (Raspberry Pi в случае Клевера) и т. д.
Пример пакета
Пример структуры MAVLink-пакета с сообщением COMMAND_LONG
:
Поле | Длина | Имя | Комментарий | |
---|---|---|---|---|
Заголовок |
magic |
1 байт | Метка начала | 0xFD для MAVLink 2.0 |
len |
1 байт | Размер данных | ||
incompat_flags |
1 байт | Обратно несовместимые флаги | На данный момент не используется | |
compat_flags |
1 байт | Обратно совместимые флаги | На данный момент не используется | |
seq |
1 байт | Порядковый номер сообщения | ||
sysid |
1 байт | ID системы-отправителя | ||
compid |
1 байт | ID компонента-отправителя | ||
msgid |
3 байта | ID сообщения | ||
Данные (пример) |
target_system |
1 байт | ID системы-получателя | |
target_component |
1 байт | ID компонента–получателя | ||
command |
2 байта | ID команды | ||
confirmation |
1 байт | Номер для подтверждения | ||
param1 |
4 байта | Параметр 1 | Число с плавающей точкой одинарной точности | |
param2 |
4 байта | Параметр 2 | ||
param3 |
4 байта | Параметр 3 | ||
param4 |
4 байта | Параметр 4 | ||
param5 |
4 байта | Параметр 5 | ||
param6 |
4 байта | Параметр 6 | ||
param7 |
4 байта | Параметр 7 | ||
checksum |
2 байта | Контрольная сумма | ||
signature |
13 байт | Сигнатура (опционально) | Позволяет убедиться, что пакет не был скомпрометирован. Обычно не используется. |
Желтым цветом выделены поля данных (полезной нагрузки). Для каждого типа сообщения существует свой набор таких полей.