Мы начали работу над алгоритмами веломаршрутов в конце 2020-го, и сегодня рассказываем, каким получился он — навигатор для велосипедов.
Сделать маршруты для велосипедистов мы хотели давно, но именно в 2020-м особенно ощутили потребность — настал бум сервисов доставки, и многие курьеры пересели на велосипеды. К нам пришли B2B-клиенты с запросами на API для велосипедной маршрутизации, которое помогало бы строить оптимальные маршруты и предсказывать время в пути.
Мы приступили к разработке с прицелом, что в скором времени веломаршруты появятся в 2ГИС и будут использовать этот же API. Так и вышло.
Строим безопасный и кратчайший маршруты
Для начала мы опросили велосипедистов и выяснили, что большинство катается по тротуарам и велодорожкам, но есть и смельчаки, которые перемещаются по краю автомобильных дорог — это курьеры, спортсмены и те, кто на велике ездит на работу.
Мы получили две явные группы, которые ездят по городу по-разному. Это подсказало нам, что базовых маршрутов должно быть два: без выезда на проезжую часть — для комфортного «любительского» катания; и с возможностью передвигаться по автодороге — для тех, кому важно добраться максимально быстро. В приложении эти маршруты называются: «безопасный» — без выездов на проезжую часть, «кратчайший» — с выездом на проезжую часть, где это разрешено ПДД.
Чтобы строить маршруты и по дорогам, и по тротуарам, нужно подружить два отдельных графа — автомобильный и пешеходный — и учесть правила перемещения велосипедистов по городу.
Как алгоритм ищет оптимальный маршрут? Считает время преодоления разных типов дорог и препятствий. Нам пришлось попотеть, чтобы подобрать значения времени и настроить алгоритм так, чтобы маршрут вёл через дорогу в нужных местах, не перескакивал с дороги на тротуар и обратно, не делал слишком частых поворотов. Эта работа кипела до самого релиза и наверняка продолжится и после него — ждём, что скажут про маршруты наши пользователи.
Учитываем рельеф местности
У 2ГИС уже есть данные о рельефе местности — мы составляем карту высот на основе агрегированных обезличенных данных с устройств пользователей. Чем больше разных маршрутов строят пользователи, тем больше данных появляется у нас.
Эти данные мы и используем в велонавигаторе. Мы выбрали принцип раскраски, который напоминает пробки: в автонавигаторе мы показываем их жёлтым и красным, потому что пробки — это препятствие, проблема и стресс. Стресс для велосипедиста — чаще всего подъём в горку.
Данные о высотах выглядят как диаграммы и шкалы на линии маршрута. Диаграммы помогают оценить профиль местности, цветовая шкала покажет, на каких участках дороги есть подъёмы
На диаграмму уклоны переносятся так: столбик окрашивается в цвет, соответствующий самому крутому наклону вверх на этом участке пути. Мы не считаем средний перепад высоты на участке, потому что крутые подъёмы могут компенсироваться крутым спуском там же, и пользователь увидит горку как «зелёную» ровную зону.
Тот же график высот в режиме ведения показывает, какая часть маршрута уже пройдена и что осталось впереди — как «градусник» из автонавигатора.
Показываем препятствия и разное покрытие дорог
Мы говорили о том, что подъём в горку — стресс для велосипедиста, но не только он. Грунтовка, ямы и кочки, насыпи из щебня, разбитый асфальт, а ещё лестница и калитки — масса препятствий. И мы их учитываем. Данные о разных типах поверхности мы собирали годами и продолжаем обновлять, преодолевая тысячи километров на автомобилях и пешком, и рады, что теперь можем делиться этой информацией с пользователями.
В меню навигатора указано расстояние, которое придётся преодолеть по грунтовкам, велодорожкам, автодорогам и дорогам с атрибутом «плохая дорога» (может быть как на грунтовке, так и на автодороге, где покрытие пришло в негодность и ехать по нему трудно).
На карте, на линии маршрута, эти типы поверхности получили свою особую раскраску (паттерн), которая ложится поверх градиента изменения рельефа. На подбор и настройку паттернов ушло очень много времени: было важно, чтобы они выглядели хорошо на градиентной подложке, хорошо считывались при езде и, желательно, сами говорили о том, что означает каждый из них. Задача оказалась сложной и с точки зрения дизайна, и технически.
Пунктир внутри линии выбрали для грунтовой дороги, прерывистую линию — для автодороги, а шевроны — для велодорожки
Лестницы, калитки, места въезда на новые типы поверхности мы отмечаем на карте иконками с подписями, чтобы не было разночтений.
Также во время ведения мы предупреждаем о препятствиях и событиях нотификацией на месте диаграммы рельефа. Например, за 200 метров до въезда на плохую дорогу появится предупреждение, которое задержится на несколько секунд, чтобы велосипедист успел его заметить.
Один взгляд на линию маршрута даёт сразу всю нужную информацию: препятствия, тип поверхности, есть ли набор высоты.
Манёвры и фоновое ведение
В велосипедный навигатор мы добавили подсказки о манёврах и озвучку из пешеходного навигатора, где они хорошо себя зарекомендовали. Пока решили ничего не менять, но будем внимательно слушать фидбэк и, возможно, внесем некоторые изменения.
А вот маркер взяли из автонавигатора — очень уж он красив и понятен.
Когда ведение запущено, всю информацию о маршруте можно посмотреть в меню велонавигатора, потянув за панель ЕТА (индикаторы в нижней части экрана) или нажав на неё. Там собрано всё, что мы знаем о маршруте, а также доступ к настройкам, поиску и кнопке завершения маршрута.
Чтобы исключить лестницы и подземные переходы на всём пути, мы добавили в настройки отдельный фильтр. Приложение найдёт маршрут в обход всех лестниц. Часто проехать лишний километр проще и быстрее, чем тащить на себе велосипед через подземный переход. Здесь же есть фильтр автомобильных дорог: когда он включен, приложение будет искать маршруты без выезда на проезжую часть.
Мы запускаем веломаршруты с пометкой «бета» — такую принято добавлять к первым версиям продуктов. Будем следить за фидбэком и делать велонавигатор удобнее.
Пользоваться навигатором для велосипедов можно в версии 6.2 под iOS и 6.3 под Android.