Программирование ARM MAVLink: руководство разработчика Fri, May 09 2025  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


MAVLink: руководство разработчика Печать
Добавил(а) microsin   

MAVLink это очень облегченный протокол обмена сообщениями для коммуникаций с дронами (и между бортовыми компонентами дронов).

MAVLink следует современной гибридной схеме публикации-подписки (publish-subscribe) и шаблону организации взаимосвязи точка-точка (point-to-point): потоки данных отправляются / публикуются как темы (topics), в то время как конфигурация подчиненных протоколов, таких как протокол функционирования (mission protocol) или протокол параметров (parameter protocol) является point-to-point с повторной передачей (retransmission).

Сообщения протокола определяются стандартным способом через файлы XML [2]. Каждый файл XML определяет набор сообщений, поддерживаемых частной системой MAVLink, что также называют диалектом. Набор справочных сообщений, реализуемый большинством наземных станций управления и автопилотов, определен в common.xml (большинство диалектов строится на основе этого определения).

Генераторы кода [3] создают из этих XML-описаний готовые программные библиотеки для определенных языков программирования. Эти библиотеки можно использовать для комуницирования в дронах, наземных станциях (пультах) управления, и в других MAVLink-системах. Генерируемые библиотеки обычно имеют защиту лицензией MIT, и таким образом могут без каких-либо ограничений использоваться в любых приложениях, в том числе и с закрытым исходным кодом.

Примечание: C-реализация состоит библиотеки состоит только из заголовочных файлов (*.h), и она жестко оптимизирована, что хорошо подходит для встраиваемых систем, ограниченных по ресурсам памяти (RAM, flash). Это проверенное решение, используемое во многих продуктах, обеспечивающее надежное взаимодействие между компонентами от разных производителей.

Ключевые особенности MAVlink:

• Очень высокая эффективность. MAVLink 1 использует только 8 байт дополнительной информации на пакет, включающей поддержку сигнала старта (start sign) и детектирования пропуска пакета (packet drop). MAVLink 2 использует уже 14 байт служебной информации (однако этот протокол более безопасный и расширяемый). Поскольку MAVLink не требует дополнительного кадрирования, он очень хорошо подходит для приложений, где используется очень ограниченная полоса пропускания канала.
• Очень надежный. MAVLink используется с 2009 для обмена между различными моделями, пультами управления (и другими узлами) по различным и сложным каналам связи (с высокой задержкой и шумами). Он предоставляет методы обнаружения отбрасывания, повреждения пакетов и их аутентификацию.
• Можно использовать множество популярных языков программирования на различных микроконтроллерах и операционных системах (ARM7, ATMega, dsPic, STM32, а также Windows, Linux, MacOS, Android и iOS).
• Позволяет сосуществовать в сети до 255 конкурентных систем (модели, пульты управления, и т. д.).
• Позволяет реализовать как внешние коммуникации (offboard, т. е. как пример между наземной станцией управления и дроном), так и внутренние (onboard, например между автопилотом и бортовой камерой, управляемой через MAVLink).

Список поддерживаемых языков и генераторов см. [1].

[Пошаговое руководство для новичка]

1. Определитесь с диалектом вашего протокола MAVlink. Т. е. нужно подготовить XML-файл, где будут описаны передаваемые сообщения протокола. За основу можно взять готовый XML-файл из папки message_definitions/v1.0 репозитория [4].

2. Скачайте пакет генератора C-библиотеки. Рекомендую утилиту mavlink [5], она написана на Python и имеет простой интерфейс как командной строки, так и GUI.

MAVLink Generator GUI

3. Сгенерируйте библиотеку, получится примерно вот такой набор файлов:

$ tree
.
├── checksum.h
├── mavlink_conversions.h
├── mavlink_helpers.h
├── mavlink_types.h
├── MyMavlink
│   ├── mavlink.h
│   ├── mavlink_msg_battery_status.h
│   ├── mavlink_msg_command_ack.h
│   ├── mavlink_msg_command_cancel.h
│   ├── mavlink_msg_command_int.h
│   ├── mavlink_msg_command_long.h
│   ├── mavlink_msg_converter_status.h
│   ├── MyMavlink.h
│   ├── testsuite.h
│   └── version.h
└── protocol.h
2 directories, 15 files

Скопируйте сгенерированные файлы библиотеки в каталог вашего проекта.

[Как использовать, на примере протокола UART]

4. Передача. Реализуйте низкоуровневую функцию передачи через последовательный порт. В зависимости от вашей системы это может быть функция, которая передает по одному байту, или функция, которая передает сразу блок байт:

comm_send_ch (chan, uint8_t) Функция, которая передает один байт через MAVlink-канал chan.

MAVLINK_SEND_UART_BYTES(chan, (const uint8_t *)buf, len) Функция, которая передает len байт данных из буфера buf через MAVlink-канал chan.

Пример формирования, проверки и передачи пакетов см. в сгенерированном файле MyMavlink/testsuite.h

5. Прием. Вставьте вызов функции mavlink_parse_char на каждом получаемом байте. Например:

// Получена порция из received байт данных в буфере buf.
mavlink_status_t status;
mavlink_message_t msg;
int chan;

int byteidx = 0;
while(byteidx < received) { if (mavlink_parse_char(chan, buf[byteidx], &msg, &status)) { printf("Received message with ID %d, sequence: %d from component %d of system %d\n", msg.msgid, msg.seq, msg.compid, msg.sysid); // В этом месте должна быть обработка данных в структурах status и msg. memset(&status, 0, sizeof(status)); memset(&msg, 0, sizeof(msg)); } byteidx++; }

Функция mavlink_parse_char накапливает и парсит приходящие данные по протоколу MAVlink. Функция может вернуть 0, 1 или 2. Если 0, то делать ничего не надо, пакет MAVlink еще не принят. Если функция возвратила 1, то это означает, что пакет был успешно принят, и данные могут быть использованы/проанализированы в структурах msg и status. Если функция возвратила 2, то произошла ошибка CRC.

В случае успешного возврата (когда функция mavlink_parse_char вернула 1) данные полезной нагрузки могут быть извлечены из msg с помощью вспомогательных функций наподобие mavlink_msg_status_get_имя_параметра, которые были автоматически сгенерированы в соответствующем заголовочном файле MyMavlink/mavlink_msg_xxxxxx.h.

В случае ошибочного возврата (когда функция mavlink_parse_char вернула 2) данные в msg могут быть недостоверны, и их использование может быть только с учетом определенного риска. Данные в структуре status можно потенциально использовать для оценки причины отказа.

Вы можете запрограммировать два одинаковых устройства, соединить их сигналы RXD и TXD, и проверить работу протокола MAVlink вызовом функции mavlink_test_all (определена в MyMavlink/testsuite.h).

[Пример PC-утилиты MAVlink]

Скачайте и скомпилируйте утилиту mavlink_control [6].

$ git clone https://github.com/mavlink/c_uart_interface_example.git
$ cd c_uart_interface_example
$ make

Подключите вашу систему к UART тестируемого устройства, и выполните команду:

$ ./mavlink_control -d /dev/ttyUSB1 -b 115200

Запустите передачу сообщений MAVlink на тестируемом устройстве. Обратите внимание, что на обоих сторонах обмена должны обрабатываться одинаковые диалекты MAVlink.

[Ссылки]

1. MAVLink Developer Guide site:mavlink.io.
2. MAVLink-Standard Definitions site:mavlink.io.
3. Generating MAVLink Libraries site:mavlink.io.
4. mavlink / mavlink.
5. Installing MAVLink Toolchain site:mavlink.io.
6. mavlink / c_uart_interface_example.

 

Добавить комментарий


Защитный код
Обновить

Top of Page