Существенно переработали отображение автобусов на карте в Android-версии приложения. Отобразить автобусы точно там, где они находятся, не так уж просто. Но мы сильно к этому приблизились. И вот что мы сделали.
Как работает прогноз времени
На большинстве автобусов установлены специальные GPS-трекеры, которые передают данные в автопарк или Центр организации дорожного движения для мониторинга. Затем они ретранслируются нам. Вот откуда 2ГИС знает, где едет автобус.
Одна из первых сложностей, которые нам нужно решить, — оперативно получить данные от поставщика. Дело в том, что в некоторых автобусах есть задержка доставки данных до поставщика и, соответственно, до нас. Поэтому мы всегда получаем данные о позициях автобусов как бы из какого-то недалекого прошлого.
Но проблема в том, что автобус не стоит на месте, а движется. При скорости, например, в 36 км/ч автобус перемещается на десять метров за секунду. И получается, что при возникновении задержки на каком-нибудь этапе хотя бы на пару секунд точность позиции уже определяется десятками метров. А учитывая, что многие автобусы отсылают своё местоположение раз в 20−30 секунд, то мы имеем неопределённость в сотни метров. Это нехорошо.
Что мы сделали
Когда мы узнаём, где сейчас едет автобус, нам нужно определить, по какому маршруту он движется и в каком направлении. Очень часто эта информация не совпадает с данными поставщиков, и тут бывают ошибки. Поэтому это очень важный этап.
Когда мы определились с номером маршрута и позицией, мы должны предугадать, с какой скоростью автобус будет двигаться по дороге в ближайшие минуты. Чтобы отобразить его позицию на карте точно, нам нужно учесть как можно больше факторов, включая скорость пробки, если она есть, и то, что автобус притормаживает на остановках.
Раньше мы отдавали в приложение одну скорость — константу — скорость, с которой автобус будет в среднем двигаться в ближайшие минуты. Но часто ошибались из-за неравномерной скорости движения в реальной жизни. Чтобы стало лучше, каждый автобусный маршрут мы разбили на участки, где автобус движется с постоянной скоростью. Например, если нет поворотов, светофоров и пробок, скорость автобуса будет линейной. Но при возникновении каких-то препятствий и остановок она будет меняться.
Каждому такому кусочку дороги мы сопоставили информацию из дорожного графа 2ГИС — какие там есть остановки, светофоры, пробки и так далее. И после определения позиции, мы уже можем отдать мобильному приложению набор кусочков и скоростей, с которыми будет двигаться автобус. Заодно посчитали, как долго автобус находится на остановке — обычно это около 11 секунд.
Чтобы автобус отображался в нужных местах и без скачков, мы сделали механизм сглаживания движения. Раньше он был прямо в приложении 2ГИС, но это часто приводило к ошибкам, потому что приложение не обладает всеми знаниями, что есть у нас на серверах. Поэтому мы перенесли эту логику на сервер. Сервер всегда знает, на сколько метров он ошибся при предыдущем прогнозе и поэтому может отдать клиенту такие скорости, чтобы он либо догнал реальную позицию на карте, либо наоборот — немного притормозил и подождал, пока результат предсказания догонит его.
На видео слева — старая версия автобусов, которые местами едут рывками. Справа — обновлённые автобусы, которые поехали плавно
Что в итоге
У нас множество различных метрик, но одна из самых главных для нас — ошибка позиции автобусов в метрах. Причём она может быть как отрицательной, когда мы дали автобусу слишком маленькую скорость, так и положительной, когда автобус на карте обогнал реальную позицию. За время разработки новой версии позиций автобусов на карте нам удалось сократить ошибку с сотен метров до десятков.
Мы ставили себе цель сделать так, чтобы неточность в позиции автобуса была соизмерима с длиной одного жилого квартала по расстоянию. Обычно это около 100 метров. Чтобы автобус прибывал и отправлялся с остановки с небольшой ошибкой.
Работа не остановилась, мы дальше будем улучшать расчёт позиции автобусов на карте.