Разработка беспилотного транспорта
Беспилотные летательные аппараты (БПЛА), также известные как дроны, и беспилотные наземные транспортные средства (БНТС), или просто беспилотники, в последние годы становятся всё более популярными для различных применений: аэрофотосъемка, доставка, поисково-спасательные работы. В рамках нашего проекта
Moses в качестве БНТС выступает парк машин-газонокосилок для покоса травы на полях, оборудованных автопилотом и возможностью задавать собственную программу движения.
В этом материале мы расскажем об одном из элементов системы Moses: протоколе обмена данными между узлами системы и ровером, обеспечивающем непрерывную двустороннюю доставку информации.
- Сделать из обычной газонокосилки автоматизированную. Комплект оборудования устанавливается на обычные косилки.
- Получить возможность удаленного управления косилками. Оператор через приложение может отправлять косилки на “миссии”.
- Добиться высокой безопасности и доступности. Наши решения позволяют обеспечить гарантированное соединение с аппаратом.
Выбор протокола
Рассматривая технологии для взаимодействия с беспилотными аппаратами, среди которых были UranusLink и UAVCAN, наша команда остановилась на одной из ключевых технологий — MAVLink. Это протокол связи, который позволяет передавать данные между беспилотным транспортом и наземной станцией управления (GCS — Ground Control Station). Протокол отличается от альтернатив большим охватом и поддержкой сообщества, низкими задержками и возможностью масштабирования.
Брокер сообщений
Инфраструктура проекта состоит из множества узлов. MavLINK является промежуточным узлом, который может принимать более высокоуровневые команды от других систем и передавать их на беспилотник. Для обмена информацией с другими узлами нам был необходим брокер сообщений — он отвечает за получение сообщений от одной системы, хранение их в очереди и пересылку соответствующему получателю. В качестве реализации брокера сообщений мы выбрали давно зарекомендовавшего себя RabbitMQ, полностью подходящего для наших задач, обеспечивающего очень низкие задержки и в то же время достаточно нетребовательного к ресурсам.
MavLINK
Получив сообщение от брокера, мы обмениваемся сообщениями с беспилотниками, используя протокол MAVLink. Каждое MAVLink-сообщение содержит данные, относящиеся к определенному аспекту работы беспилотного средства — его местоположение, ориентация или уровень заряда батареи. В спецификации MAVLink определено множество различных типов сообщений, охватывающих широкий спектр тем, но в нашем случае интерес пал на телеметрию — получение информации о состоянии машин. Также на основе сообщений реализовывалась основная функция газонокосилок — создание миссий с указанием точек, скорости и угла покоса травы.
Несмотря на выбор MAVLink в качестве протокола, предстояло решить, как именно формировать и отправлять сообщения. Мы рассмотрели два инструмента, которые решают эту задачу.
MAVLink C
MAVLink C — это библиотека с открытым исходным кодом, которая предоставляет реализацию протокола MAVLink на языке C. Это мощный и гибкий инструмент для работы с протоколом MAVLink, но при её использовании следует учитывать несколько потенциальных недостатков:
- Библиотека написана на очень низкоуровневых технологиях, что серьезно увеличивало сложность ее использования (и как следствие – стоимость разработки).
- Необходимость следить за соблюдением некоторых стандартов. Например, heartbeat-сообщений, периодически отправляемых на наземную станцию, сигнализирующие о присутствии системы в сети и так далее.
- Время на реализацию необходимой системы. Из-за сложностей разработка с использованием этой библиотеки заняла бы недопустимо большое время.
MavSDK
К счастью, мы обнаружили более надежный вариант. Им оказалась библиотека MavSDK. Она обеспечивает простой и согласованный интерфейс для доступа к большому спектру функциональных возможностей, предоставляемых MAVLink, включая управление, телеметрию, а также получение данных с камер и датчиков.
Несмотря на удобный программный интерфейс, библиотека не лишена недостатков. Одной из проблем MavSDK стало отсутствие возможности точной настройки маршрутов у газонокосилок. Библиотека автоматически добавляла пакеты смены скорости, манипуляции с лезвиями. Это было неприемлемо, так как для нас была крайне важна точность в постановке маршрутов. Для обхода этого ограничения пришлось написать надстройку над MavSDK, прибегнув к помощи MAVLink C.
Еще одной проблемой оказалась сломанная отправка сообщений в последних версиях библиотеки. Проблема приводила к потере случайных пакетов данных.
Обнаружить причину потери пакетов было крайне непросто. Помимо ошибок в коде, необходимо было исключить внешние факторы: влияние операционной системы и других программ, сетевых протоколов и так далее. И когда поиск дошел до анализа битов данных, которые отправляет компьютер по сети, стало очевидно, что проблема в составлении пакетов с данными.
Решение оказалось очень неоднозначным. Единственным способом решить эту проблему без серьезных изменений в ядре библиотеки оказался переход на более старую версию MavSDK.
Таким образом удалось решить проблему с составлением пакетов, но возникла следующая — в более ранних версиях библиотеки не было возможности реализовать отправку
RTK-корректировок, предоставляющих сантиметровую точность при использовании GPS. Изучив в подробностях отправку RTK-сообщений по протоколу MAVLink, мы снова обратились к библиотеке MAVLink C и самостоятельно реализовали обмен на ней.s
Высокие требования скорости и точности обмена
Для этого проекта недопустимы компромиссы в области скорости обмена информацией между узлами или ее точности. Поэтому, чтобы достигнуть необходимых показателей, нам потребовалось глубоко погрузиться в эту область и самостоятельно реализовать некоторые возможности, которые не представлены в готовом виде.
Недостаточно развитый инструментарий
Несмотря на распространенность протокола MAVLink, библиотека MavSDK – относительно новая и не имеет большой поддержки. Она не так хорошо протестирована и не имеет некоторый важный для проекта функционал, который понадобилось реализовывать самостоятельно.
Низкая надежность MavSDK
Ошибки в работе библиотеки, несовместимые изменения от версии к версии – все это очень усложнило разработку нашего решения и потребовало собственноручной реализации некоторых функций