Объединение беспилотных летательных аппаратов (БПЛА) и беспилотных наземных транспортных средств (БНТС) в единую систему и разработка программного обеспечения для дистанционного управления устройствами. Нестандартная задача, решаемая нами в рамках реализуемого нашей компанией проекта Moses. В качестве БНТС выступает парк машин-газонокосилок для покоса травы на полях, оборудованных автопилотом и возможностью задавать собственную программу движения.
Решение проекта реализовано много интересных решений, но сейчас мы хотим поделиться одним из элементов системы: протоколом обмена данными между узлами системы и ровером, обеспечивающим непрерывную двустороннюю доставку информации.
Какие цели стояли перед нашей командой
Превратить обычную газонокосилку в дистанционно управляемый наземный транспортный
Реализовать возможность управления устройством с помощью приложения
Обеспечить беспрерывное соединение устройства с системой по Wi-Fi
Решение
Выбор протокола
Для реализации проекта команда рассматривала все возможные протоколы взаимодействия с беспилотными аппаратами, включая UranusLink и UAVCAN. Однако, выбор мы остановили на одном из популярных протоколов MavLINK. Данная технология позволяет обмен данные между беспилотным транспортом и наземной станцией управления (GCS — Ground Control Station). Весомым преимуществом данного протокола низкая задержка передачи пакетов и возможность масштабирования системы.
Брокер сообщений
Архитектура проекта строится на множестве узлов, в которых промежуточным звеном является MAVLink, которое принимает высокоуровневые команды от других систем и передает их на беспилотник. Обмен информацией между узлами осуществляется через брокер сообщений. С его помощью полученные пакеты данных от одной системы, отправляются в очередь на передачу пакета получателю. В качестве брокера сообщений мы выбрали RabbitMQ на основе стандарта AMQP. Он полностью подходит для решения задач проекта так как протокол нетребовательный к ресурсам и обеспечивает минимальные задержки времени при передаче.
MAVLink
Получив сообщение от брокера, мы обмениваемся сообщениями с беспилотниками, используя протокол MAVLink. Каждый пакет содержит данные, которые относится к определенному процессу отвечающему за работу беспилотного средства — местоположение, ориентация или уровень заряда батареи. В спецификации MAVLink определено множество типов сообщений, охватывающих широкий спектр задач, но в нашем случае интерес пал на телеметрию — получение информации о состоянии машин. Также на основе сообщений реализовывалась основная функция газонокосилок — создание миссий с указанием точек, скорости и угла покоса травы.
Несмотря на выбор MAVLink в качестве протокола, предстояло решить, как именно формировать и отправлять сообщения. Мы рассмотрели два инструмента, которые решают эту задачу.
MAVLink C
MAVLink C — это мощная и гибкая библиотека с открытым исходным кодом, предоставляющая реализацию протокола MAVLink на языке C. Однако, следует учитывать следующие потенциальные недостатки при использовании данной библиотеки:
Библиотека основана на низкоуровневых технологиях, что может повысить сложность ее использования и, следовательно, увеличить стоимость разработки.
Для эффективной работы с MAVLink C необходимо следить за соблюдением определенных стандартов, например, отправка периодических heartbeat-сообщений на наземную станцию для сигнализации о присутствии системы в сети.
Использование данной библиотеки может потребовать значительного времени для реализации необходимой системы из-за своей сложности.
При выборе MAVLink C важно внимательно оценить эти факторы и решить, соответствует ли данная библиотека требованиям проекта, учитывая затраты на разработку и сложности, связанные с ее использованием.
MavSDK
Мы нашли еще один вариант подходящий для решения наших задач, им оказалась MavSDK. Библиотека обеспечивает простой и согласованный интерфейс для доступа к большому спектру функциональных возможностей, предоставляемых MAVLink, включая управление, телеметрию, а также получение данных с камер и датчиков.
Несмотря на удобный программный интерфейс, библиотека имеет несколько недостатков. Отсутствие возможности точной настройки маршрутов у газонокосилок стало одной из проблем MavSDK. Библиотека автоматически добавляет пакеты смены скорости, управлениями лезвиями. Такое решение нам не подходило, поскольку для нас была крайне важна точность в постановке маршрутов. Чтобы обойти это ограничение пришлось запрограммировать собственную надстройку над MavSDK, прибегнув к помощи MAVLink C.
Еще одной проблемой была не правильная отправка сообщений в последних версиях библиотеки, что приводило к случайной потере пакетов данных. Выявление причины потери пакетов оказалось сложной задачей. Мы анализировали код и исключали влияние внешних факторов, таких как операционная система, другие программы и сетевые протоколы. При изучении передаваемых битов данных стало очевидно, что проблема связана с формированием пакетов данных. Решение оказалось неоднозначным. Мы перешли на более старую версию MavSDK, чтобы избежать проблемы с формированием пакетов. Однако, это привело к новой проблеме: более ранние версии не поддерживали отправку RTK-корректировок, которые обеспечивают сантиметровую точность с помощью GPS. Мы изучили протокол MAVLink в отношении отправки RTK-сообщений и реализовали обмен данными с использованием библиотеки MAVLink C.
Вызовы
Высокие требования скорости и точности обмена. В рамках данного проекта нам необходимо достичь высокой скорости и точности обмена информацией между узлами, и никакие компромиссы в этом аспекте недопустимы. Для достижения необходимых показателей нам пришлось тщательно изучить эту область и самостоятельно реализовать некоторые функциональности, которые не были доступны в готовом виде.
Недостаточно развитый инструментарий. Несмотря на широкую распространенность протокола MAVLink, библиотека MavSDK относительно нова и не обладает обширной поддержкой. Она не прошла достаточное количество тестирования и не предоставляет некоторые важные функциональности, необходимые для нашего проекта. В связи с этим, нам пришлось самостоятельно реализовывать часть функционала.
Низкая надежность MavSDK. Проблемы с работой библиотеки, несовместимые изменения между версиями - все это значительно усложнило разработку нашего решения и потребовало собственной реализации некоторых функций. Мы столкнулись с ошибками в работе MavSDK, а также необходимостью адаптации к изменениям между версиями, что повлекло за собой значительные сложности в процессе разработки.
Цифры
4000 Сообщений в секунду может обрабатывать система
300+ млн.Столько сообщений в день обрабатывалось в ходе тестов.
<5 мс. Занимает весь путь сообщения от ровера до точки хранения.
Результат
4 месяца потрачено на реализацию всей инфраструктуры проекта Moses, включая изучение, разработку и тестирование.
Удаленная передача команд, позволяет контролировать газонокосилку от и до: как она поедет, под каким углом и на какое расстояние будут выдвинуты её лезвия.
Поддержка сотен газонокосилок, работающих одновременно, каждая из которых передает информацию на сервера десятки раз в секунду.
Безошибочная работа. Беспилотная газонокосилка успешно принимает и выполняет все команды, без потери даже одного пакета данных в течение месяцев.