Назад к кейсам

Управление беспилотниками с помощью OpenStreetMap

3 мая, 2023 9 минут
О проекте

Интерактивные карты окружают нас повсеместно — почти каждый из нас ежедневно пользуется картами. Их используют для разнообразных целей: для навигации; чтобы узнать об интересных местах; посмотреть погоду; поделиться своим местоположением с близкими; отследить положение курьера или общественного транспорта.

Мы уже не представляем своей жизни без карт, а на нашем проекте Moses это едва ли не ключевой инструмент управления беспилотниками. В этом материале расскажем о том, как мы разработали удобный интерфейс работы с картами для операторов беспилотного транспорта на гольф-поле.

Цели
  • Высокодетализированная карта. Для точного управления беспилотником требуется максимальное разрешение карты.

  • Отображение рельефа. Для избежания опрокидывания беспилотника оператору важно иметь представление о рельефе местности.

  • Просмотр истории перемещения беспилотника. Необходим возможность посмотреть на карте, где находился ровер в любой момент времени.

Решение

Фотографирование полигона

Большинство карт в мире состоят из огромного количества снимков. Подобно плитке снимки выстраиваются в определённом порядке, чтобы образовать целостную карту. Такие карты так и называются — плиточные (tilemaps). Карта нужного нам гольф-поля была представлена в Google Maps и прочих сервисах, но её разрешение оставляет желать лучшего. Чтобы решить эту проблему, наша команда запустила дрон с камерой высокого разрешения, которая с помощью специального ПО сделала очень детализированные снимки с разной высоты. Результат превысил все ожидания: мы получили карту, на которой можно разглядеть даже камушки и цветы, а это именно то, что нужно для точной работы с беспилотником.


Выбор технологии

Все наши снимки без какой-либо обработки представляли собой просто слабо структурированный набор данных. Нам необходимо было собрать из них полноценную карту. Помимо этого, мы нуждались в инструментах для создания геометрических фигур на карте, которые представляли бы собой зоны различного назначения для беспилотников. Также нам было необходимо размечать маршруты, по которым будут перемещаться беспилотники. Разработка таких инструментов с нуля могла продлиться непредвиденное количество времени, поэтому мы воспользовались библиотекой OpenLayers, которая работает на базе OpenStreetMap и практически полностью отвечает нашим требованиям.


OpenLayers & Turf.js

OpenLayers — написанная на JavaScript библиотека и отличный инструмент, который закрывает наши потребности, позволяя гибко работать с OpenStreetMap-картами. С помощью этой технологии мы реализовали:

  • отображение местоположения и статуса всех беспилотников в режиме реального времени;
  • плавную анимацию движущихся объектов на карте;
  • просмотр траектории движения беспилотника.

Несмотря на богатый набор возможностей, библиотека не представляет инструментов для построения и разметки зон, что требовалось нам для создания редактора зон. Перед нами стояли типовые задачи по объединению и вычитанию 2D-полигонов, и для этих целей нам также удалось подобрать готовое решение — библиотеку Turf.js.


Видеоплеер для карт

Интересной и необычной задачей для нашей команды стало создание аналога видеоплеера для карт. С точки зрения пользователя, разработанный нами плеер для карт визуально выглядит как обычный видеоплеер со всеми присущими ему элементами управления. Плеер позволяет посмотреть куда, как и где перемещался ровер, а на привычной шкале времени выбрать нужную минуту и даже секунду. Кроме того, плеер не блокирует работу с основной картой — мы по-прежнему можем менять масштаб и перемещаться по карте.

Примеры пользовательского интерфейса карт.
Вызовы
  • Ограниченный бюджет и короткие сроки. С первого взгляда, планируемая к разработке система выглядела невероятно сложной, требовала многих месяцев разработки и, соответственно, значительного бюджета. Все вероятные риски мы сразу открыто обсудили с заказчиком, заручились его согласием и, прежде чем приступать к реализации, выделили достаточное количество времени на проектирование и изучение инструментария. Целью было поставлено найти подходящие инструменты для реализации самых сложных компонентов будущей системы и, тем самым, сэкономить средства и время. В итоге, после этапа проектирования у нас было четко выстроенный план реализации и полная уверенность, что большинство самых сложных компонентов системы мы сможем построить, используя в качестве основы имеющиеся библиотеки с открытым исходным кодом.

  • Высокая нагрузка на клиентском оборудовании. Вся работа по отображению карты, элементов на ней, анимированию их позиции и прочее, происходит не на сервере, а буквально на компьютере оператора. Это довольно сильно нагружает процессор и оперативную память, что сказывается на общей производительности — оператор начинает замечать подвисания или задержки в отрисовке элементов. Мы не могли оставить это как есть, а потому стали искать правильное решение по оптимизации. Произведя отладку кода, мы смогли выявить места, которые вызывали сильную нагрузку. На поиск оптимальных решений ушло немало времени, но результат того стоил — теперь огромная карта с множеством элементов работает так, словно это статичное изображение.

  • Различие проекции координат в модулях системы. Во избежание искажения изображения, при аэрофотосъемке была использована одна проекция координат. Она же используется при отображении карты. Загвоздка заключалась в том, что программное обеспечение беспилотников ожидает получить координаты в иной проекции. Чтобы решить возникшую проблему, мы разработали механизм конвертации координат из одной проекции в другую. Не сразу получилось добиться нужного результата из-за ошибок в формулах. Спустя несколько попыток и продолжительных экспериментов на реальной местности мы смогли реализовать алгоритм конвертации координат, который работает без потери точности.

  • Разнообразный набор инструментов. Проект изначально имел непростые требования, но с их дальнейшим ростом кодовая база могла бы усложняться в геометрической прогрессии. Важно было с самого начала разработки не допустить подобной ситуации, когда поддерживать приложение уже становится невозможно. Чтобы избежать трудностей, мы поставили себе задачу грамотно спроектировать архитектуру проекта. Для этого мы задействовали одного из архитекторов компании, совместно с которым постарались учесть все факторы, технические возможности и ограничения, текущие и будущие планы бизнеса. Спустя время невооруженным глазом остается виден результат их работы — помимо соответствий всем бизнес-требованиям, у разработчиков сохраняется возможность развивать и поддерживать проект, а вовсе незнакомые с ним программисты не имеют сложностей с тем, чтобы подключиться к работе.

Примеры пользовательского интерфейса карт.

Результат

  • Удобный интерфейс для решения повседневных задач, связанных с планированием рабочего дня беспилотника.

  • Точное и своевременное отслеживание, позволяющее оператору быстро принимать решения для избежания аварий и прочих нежелательных ситуаций.

  • Увеличение эффективности обслуживания поля. Наглядное отображение всех беспилотников на карте даёт оператору целостную картину, которая позволяет эффективно распределять работу между ними.

Технологии

  • React
  • TypeScript
  • OpenLayers
  • Turf.js
  • OpenStreetMap

Годы работы

2022 — 2023