На протяжении многих лет команда stfalcon.com работала над разработкой веб-сервиса и приложений для проекта UARoads. В июле 2018 мы передали его другой команде, которая продолжает развивать сервис. Знакомьтесь ниже с процессом разработки.
Задача
«Дороги Украины» — любимое детище нашей студии. Украина не может похвастаться высоким качеством дорожного покрытия — 95% дорог страны находятся в неудовлетворительном состоянии. Это увеличивает риск дорожно-транспортных происшествий, а также затраты автомобилистов на ремонт, поэтому в 2013 году мы запустили социальный стартап, ориентированный на автомобилистов.
Главная цель проекта — общими усилиями определить самые удобные, быстрые и безопасные дороги с наименьшим количеством ям. Он помогает:
- Повысить безопасность водителей путем прокладывания маршрутов дорогами с лучшим покрытием;
- Защитить автомобиль от преждевременного ремонта из-за ям и выбоин;
- Уменьшить расходы из бюджета на мониторинг качества дорог;
- Контролировать деятельность дорожных служб и качество ремонта дорог;
Структура
Проект «Дороги Украины» состоит из:
- основного сайта, на котором отображается карта (front-end);
- системы обработки треков (back-end);
- инструментов для анализа (data science);
- сервиса для рендеринга карт (tile server);
- сервиса для прокладывания оптимального маршрута (OSRM);
Также проект можно условно разделить на 2 части: навигацию и отображение состояния дорог на карте. Разумеется, все начинается со сбора данных.
Сбор данных
В основе работы «Дорог Украины» был заложен принцип фиксирования сотрясений с помощью мобильных устройств и их привязка к GPS-координатам. Сбор данных осуществляется автоматически с помощью мобильного приложения для Android, iOS или Windows Phone. Android и iOS-версия делались в студии, а за разработку под Windows Phone взялись волонтеры из числа пользователей. Водитель устанавливает приложение на свое мобильное устройство и ездит как обычно. В это время приложение автоматически фиксирует сотрясения, сохраняет данные с акселерометра и GPS-координаты в трек, а также самостоятельно включается и выключается. При подключении к сети передачи данных или Wi-Fi данные передаются на сервер.
Сбор данных начинается с момента, когда приложение распознает движения автомобиля, основываясь на данных акселерометра. Все данные, которые передаются на сервер, обезличены, то есть не содержат никакой информации о пользователе или его автомобиле.
Роутинг и навигация
Для того, чтобы прокладывать оптимальный маршрут по хорошим дорогам мы используем собственный сервис для роутинга (прокладвания маршрута). С нуля разрабатывать приложения для этих целей — это сложная ресурсоемкая задача, но существуют уже готовые open source решения. Мы выбрали OSRM, который легко конфигурировать с помощью скриптового языка LUA.
Для OSRM мы использовали собственный конфигурационный профиль на .lua который при построении маршрута учитывает не только длину отрезка дороги (графа), а и тип отрезка, среднюю скорость и состояние дороги. База данных о состоянии дорожного покрытия обновляется каждый день. OSRM сервер работает по REST API. Клиент посылает запрос с координатами начала и конца маршрута, а сервер рассчитывает маршрут и отдает результат в виде JSON-объекта.
Карта состояния дорог
«Дороги Украины» используют картографические решения с открытым исходным кодом:
- Карты OpenStreetMap (OSM) — для прокладывания маршрута;
- Инструментарий Mapnik — для рендеринга растровых карт из векторных данных;
- JS-библиотеку Leaflet — для отображения карты на мобильных и стационарных устройствах.
Тайлы
Карта на сайте проекта состоит из 2 основных слоев:
- слой мира, который использует тайл-сервер OSM;
- слой с состоянием дорог, который работает на собственном тайл-сервере.
Чтобы карту было удобно отображать, ее изображение разбивается на тайлы, которые представляют собой квадраты 256 x 256 пикселей. Когда пользователь открывает карту в браузере, загружаются только те тайлы, которые видны в данный момент, что ускоряет отображение и экономит трафик.
Слои накладываются друг на друга и мы получаем карту с состоянием дорог:
Рендерингом карт занимается тайловый сервер:
- При запросе тайла — сервер проверяет его наличие в своем кэше, если тайл найден — он возвращается клиенту;
- Если тайл не найден, то осуществляется его рендеринг, после чего он сохраняется в кэше и только после этого возвращается клиенту.
Дизайн мобильного приложения
Пользователю предлагается создать учетную запись, если он хочет иметь возможность просматривать свою статистику на сайте и принимать участие в рейтинге пользователей.
Разработка мобильного приложения
Проект «Дороги Украины» отличался от всего того, что мы делали ранее. Полного описания бизнес-процессов, алгоритмов и принципов работы приложения попросту не было. Поэтому перед командой разработчиков была поставлена задача разработать экспериментальный прототип приложения, которое будет собирать сырые данные со всех возможных датчиков, хранить в удобном для дальнейшего анализа виде и отображать в режиме реального времени. Данное приложение должно было помочь команде подтвердить гипотезу на практике, помочь найти закономерности в потоках данных и уже на их основании ввести алгоритмы, которые решили бы проблему анализа состояния дорожного покрытия.
Был создан инструмент, с которым разработчики и команда математиков проводили полевые испытания. Он состоял из двух приложений:
- Клиента, который устанавливался на все девайсы, участвующие в эксперименте;
- Сервера, которым являлось приложение, инсталлированное на планшет.
Серверное приложение создавало сеть Wi-Fi, к которой подключались все клиенты, передавая данные во время эксперимента в режиме реального времени. Первоначальные приложения были очень простыми с минимальным количеством опций:
Формат экспериментов
Экспериментальное тестирование проводилось в соответствии со всеми научными канонами. Изначально был выбран эталонный отрезок дороги, на котором и проводились все эксперименты. На данном участке присутствовали все типи дефектов дорожного покрытия (ямы, трещины, выбоины, наплыви и колии), все было измерено вдоль и поперек рулеткой и линейкой, записано и схематизировано для дальнейшего использования при анализе результатов.
В день эксперимента заранее подготовленные тестовые девайсы помещались в те части автомобиля, где их обычно перевозят водители (холдеры, подлокотники, приборная панель и т.д.). Водитель проезжал тестовый отрезок по несколько раз на оговоренных скоростях, а экспериментатор при этом наблюдал за потоком данных со всех тестовых девайсов в реальном времени и параллельно делал пометки о совершенных проездах тестового участка. Потом команда возвращалась в офис и проводила анализ собранных данных. По результатам вносились изменения в текущую версию приложения и все повторялось.
Прежде, чем получить первую рабочую версию алгоритма, было проведено несколько итераций полевых экспериментов, в них участвовали несколько разнотипных автомобилей с разными водителями, чтобы исключить влияние стиля вождения на конечный результат. Также был проведен ряд экспериментов на грунтовых дорогах.
Результатом работы команды на данном этапе было приложение, способное корректно собирать нужные нам данные и передавать их на сервер.
Итоги экспериментов
Эксперименты дали нам четкое понимание физики движения автомобиля, вибраций, которые возникают при проезде разных типов дефектов на дороге, силы ударов и влияния скорости на конечные показатели.
Но данные собранные во время экспериментов помогли решить только часть проблемы, а именно проблему сбора данных пользователями. Вторую же часть — анализ и классификация состояния дорог на карте, которую пользователи сейчас видят на сайте — только предстояло решить. Для этого нам нужно было куда больше треков, чем нам могли предоставить эксперименты. Было решено выпускать пользовательскую версию приложения раньше сайта с целью сбора нового массива данных, необходимого для дальнейшего развития проекта.
Разработка пользовательской версии
Основным мотивом при создании приложения было повышение безопасности на дорогах. Исходя из этого, при разработке стояла задача минимизировать все отвлекающие факторы, которые возникают во время использования приложения.
В основу пользовательской версии легла экспериментальная версия. Был разработан удобный UI и два алгоритма работы с приложением — ручной и автоматический. Работа автоматического режима зависит от многих факторов, одним из которых является мощность GPS-сигнала. Если сигнал плохой, пользователь может воспользоваться ручным режимом. Также пользователь может сам определить как отправлять треки, используя Wi-Fi или мобильную сеть, вручную либо автоматически отправлять все.
Разработка проводилась одновременно под две платформы, Android и iOS, с использованием нативного кода. Для связи с RestFull API сервера в Android изначально использовалась библиотека robospice, в процессе развития проекта она была заменена на связку Retrofit2.0 и OkHttp. В качестве локальной базы для хранения записанных треков был применен SQLite (в планах заменить на Realm). Минимальная поддерживаемая версия SDK — v9. Также приложение активно использует Google Play Services, потому важно, чтобы на девайсе пользователя была установлена их актуальная версия.
Таким образом, первая пользовательская версия приложения располагала только функционалом для сбора статистики. О роутинге с точки А в точку Б команда пока только мечтала, не говоря уже о навигаторе. Но все верили в успех проекта, в первую очередь благодаря комьюнити, которое проявляло огромный интерес к готовящемуся в релиз продукту.
Анализ данных
Вскоре после релиза пользовательской версии мы получили первые реальные данные от пользователей, подсчитав количество ям, которые в итоге были зафиксированы.
Команда принялась своими силами искать подходы, которые помогли бы усреднить значения, коррелировать результаты и применив шкалу, выведенную в ходе экспериментов, нанести их на карту в соответствующей расцветке.
Первой задачей, которую предстояло решить, была привязка GPS-треков, записанных пользователями к существующим контурам дорог на карте. Так как точность электронных карт и датчиков, установленных на устройствах, не являются идеальными — просто соединить GPS-точки линиями и нанести поверх карты не выйдет. Если так сделать, то при достаточно большом увеличении получим что-то похожее на кардиограмму поверх дороги.
Поэтому все дороги на карте были поделены на сегменты по 30-50 м, а GPS-точки пользовательских треков, которые подходили сегменту по критерию отдаленности и направления движения, связывались с ним и записывались в базу для дальнейшего анализа. Таким образом, мы получили карту GPS-треков и базу с отсортированными точками вместе с данными акселерометра. Это упрощенное описание процесса, множество критериев и подводных камней опущено для простоты понимания алгоритма привязки треков на карту.
Второй задачей стал непосредственно анализ данных. Немного абстрагировав, его можно разделить на несколько этапов:
- Валидация. Так как данным, пришедшим от пользователя, доверять на все сто нельзя, сначала их нужно валидировать. Для этого используется простая математическая модель поведения автомобиля на дороге. Сравнив последовательность с критериями, которые диктует нам модель, алгоритм определяет является ли данный трек валидным и стоит ли пропускать его на следующий этап статистического анализа.
- Статистический анализ. В его ходе определяются места, в которых последовательности подчиняются определенным закономерностям, указывающим, что на данном отрезке дороги присутствует дефект. Оценивается вероятность правдивости выводов относительно данного отрезка дороги и силы сотрясения, которую зафиксировали датчики в этом месте. Таким образом, мы получаем яму на карте. Оценка всегда основывается на данных, которые имеют определенный период актуальности и достаточный объем для статистического анализа.
Таким образом, имея постоянный поток GPS-треков от пользователей и алгоритм, который в реальном времени валидирует поступающие треки и добавляет их к общей статистике, мы получаем «живую» карту дорог, т. е. основанную на данных в реальном времени. На протяжении полугода мы опробовали несколько подходов, прежде чем прийти к описанному выше адаптивному алгоритму.
Узкие места
Что же может повлиять на точность полученных результатов? Ответ прост — внешние факторы. Это могут быть погодные условия, человеческий фактор, технические моменты и т. д. Математика наука точная, и можно бесконечно усложнять алгоритмы, включая все больше и больше переменных в условие задачи, которые предоставляет нам реальный мир.
Но это приведет к непременному росту потребления ресурсов. Вряд ли пользователь обрадуется когда приложение прикончит его батарею за час. Да и сама серверная часть не обладает неограниченным вычислительным ресурсом. Поэтому в математике принято искать результаты, точность которых удовлетворяет наши потребности и затраты на ресурсы. Вот такой вычислительный баланс.
Первой задачей, которую предстояло решить, была привязка GPS-треков, записанных пользователями к существующим контурам дорог на карте. Так как точность электронных карт и датчиков, установленных на устройствах, не являются идеальными — просто соединить GPS-точки линиями и нанести поверх карты не выйдет. Если так сделать, то при достаточно большом увеличении получим что-то похожее на кардиограмму поверх дороги.
Закрывая вопрос об уровне точности, который устраивает условия задач поставленных перед сервисом, назовем такие цифры:
- погрешность GPS мобильного устройства: точность 5-40 м с вероятностью 60% оказаться внутри диаметра этой окружности.
- 20% погрешность в определении скорости движения.
Не считая неисправных девайсов, в которых датчики по тем или иным причинам потеряли свою точность и нуждаются в дополнительной калибровке, есть момент с данными, которые изредка поступают от исправных девайсов, но диктуют аномальные показатели. Они успешно отсеиваются алгоритмом, но в процессе изучения проблемы мы обнаружили следующее:
- GPS нельзя принимать за постоянную величину: на уровень сигнала также влияет множество факторов, от места расположения устройства в автомобиле до брони, с которой этот автомобиль сделан. Есть также локации, в которых попросту нет сигнала, причем в некоторых не обнаруживается достаточное количество спутников для вычисления местоположения, а в других есть спутники, но ОS так и не предоставляет никаких обновлений о местоположении. В любом случае в таких условиях все приложения, использующие GPS в этот момент времени ведут себя одинаково.
- Так как данные с акселерометра не приводятся к какой-либо пространственной оси, а анализируются в комплексно, мы получаем показатель комфорта езды по дорожнему покрытию, включая боковое ускорение в повороте, резкие ускорения и торможения.
Последний фактор трудно определить как негативный или позитивный. С одной стороны, он говорит нам о том, что водитель в конкретном месте предпринял резкий маневр (возможно он уклонялся от дорожного дефекта), а, с другой стороны, мы получаем такие же данные от лихачей на светофорах и резких поворотах. Команда работает в данном направлении и ищет полезное применение этой особенности.
Разработка навигатора
Вот уже сервер активно обрабатывает данные, постоянно поступающие от пользователей, а объемы поступлений составляют примерно 1000 треков в день. Карта все дополняется новыми подробностями. Пришло время использовать собранную статистику во благо тех же пользователей, которые ее и собирали. Карта на сайте достаточно информативный вариант, если вы водитель с большим опытом в построении маршрутов и знаете без навигатора как и куда добраться. Если же ваша стихия город, а вам нужно поехать куда-нибудь дальше, вы попадаете в мир ям, выбоин и ухабов, поэтому удобнее, конечно, если вас проведут по маршруту, который минимизирует встречу с этими зверьками. Так так изначально планировалась разработка именно навигатора, команда с нетерпением ждала возможности реализовать эту функцию.
На этапе разработки навигатора было решено привлечь сторонних разработчиков с опытом работы в данной сфере. Это помогло сэкономить время и избежать проблем, связанных с нюансами написания навигаторов. На помощь нам пришли ребята с Днепропетровска, за что им отдельное спасибо!
«Зачем же писать свой навигатор, если есть множество готовых и популярных решений, таких как Google и Яндекс?» — спросите вы. Оказывается, не все так просто. Для того, чтобы провести пользователя по максимально безопасному и удобному маршруту, нам нужно указать все промежуточные точки между пунктами отбытия и прибытия. К сожалению, ни один из больших популярных навигаторов не способен такое делать, ему важно лишь откуда и куда вы хотите попасть.
Иногда более продвинутые решения предлагают ограниченное количество промежуточных пунктов, которое можно сосчитать на пальцах, что не устраивает условие поставленной задачи. Мы связались с разработчиками самых популярных продуктов по вопросу интеграции с ихними приложениями, кое-кто заинтересовался, но переговоры как правило дело не быстрое, а навигатор нам нужен уже. Поэтому не исключая возможность сотрудничества, мы создали собственное решение.
Мы точно знаем, что тема качества украинских дорог близка каждому автомобилисту. На июль 2018 сервис «Дороги Украины» получил более 1200 треков от пользователей. Таким образом было уже обработанно 54% украинских дорог.
Команда проекта:
- Степан Танасийчук
CEO и основатель
- Игорь Федун
Менеджер
- Дима Коваленко
Менеджер
- Юля Кондратюк
Руководитель проектов
- Олег У.
Дизайнер
- Вадим Гуменный
Back-end разработчик
- Саша Ленский
Back-end разработчик
- Тимур
Back-end разработчик
- Евгений
Системный администратор
- Александр
Android разработчик
- Антон Б.
Android разработчик
- Костя Колесник
iOS разработчик
- Александра
PR-менеджер
Другие наши проекты
Вебсайт для MeinFernbus
Разработка программной части и дизайн сайта для крупнейшей автобусной компании, Германия
Сервис BenzinPreis24
Сервис для эффективного поиска заправок в Швейцарии
Uber like решение для перевозки зерна
Инновационное решение для рынка грузовой перевозки зерновых культур