Введение

Открываешь навигатор — а ты уже в деревне Пупкино. Знакомо? Спуфинг и глушение GNSS стали новой реальностью, ломая работу служб логистики, такси и даже общественного транспорта. Наша компания столкнулась с этим лицом к лицу в проекте по интеграции V2X в московские трамваи. Вагоны с нефункционирующим GPS начали «дрейфовать» в цифровом пространстве, а инерциальные системы (IMU) требовали калибровки через N поворотов на 90° — в рельсовом транспорте такое просто невозможно.

Так родился «Курвиметр» — наша реализация Dead Reckoning. Идея проста: если GPS молчит, а CAN‑шина даёт скорость, почему бы не использовать её для расчёта пройденного пути, а пройденный путь соотносить с треком? Спойлер: всё оказалось сложнее. Или спасибо машинному обучению. Вот как мы заставили трамвай «знать», где он находится, даже в зоне глушения. Кажется, это интересный кейс, поэтому не ограничивали себя в количестве представленных расчетов и графиков.

Описание проблемы

Для тех, кто не в контексте.

Dead Reckoning — алгоритм оценки текущего положения движущегося объекта на основе его предыдущего положения, скорости, направления и прошедшего времени.

Как мы могли бы использовать Dead Reckoning для решения нашей задачи?

Рассмотрим простой пример.

Что необходимо, чтобы понять, где оказался трамвай через минуту после начала движения? А через 10 минут? А через час?

Всё это можно разбить на несколько простых шагов:

  1. Узнать точку старта движения трамвая.

  2. Узнать, как изменялась скорость, с которой он ехал в течение заданного промежутка времени. Ведь скорость трамвая не постоянна.

  3. По скорости и времени рассчитать пройденную дистанцию.

  4. Наложить пройденную дистанцию на заранее записанный маршрут трамвая.

  5. Выдать новое местоположение трамвая.

Расчёт пройденного расстояния

Для каждого измерения используем среднюю скорость между двумя соседними отсчётами:

S = t \cdot \frac{V_{can1} + V_{can0}}{2}

где:

  • V_{can0}— скорость из CAN‑шины на предыдущем измерении, м/с;

  • V_{can1}— скорость из CAN‑шины на текущем измерении, м/с;

  • t— время между измерениями, примерно 0,1 с.

План готов, осталось проверить его в действии.

Обкатка проводилась в зоне без глушения GNSS, поскольку, чтобы сказать, что Dead Reckoning работает как задумано, мы сравнивали его с GNSS.

В идеальном мире расчётная координата должна полностью совпадать с координатами, которые выдал GNSS‑модуль.

Но мы не в идеальном мире, поэтому договорились, что 5 метров — максимальное расстояние, на которое может ошибиться Dead Reckoning по сравнению с данными GNSS.

Если ошибка превышена — алгоритмом пользоваться нельзя.

Качество определяется разницей между пройденным расстоянием, рассчитанным по CAN, и расстоянием, рассчитанным по GNSS:

\Delta S = \left|S_{can} - S_{gnss}\right|

где:

  • S_{can}— путь, рассчитанный на основе скорости из CAN‑шины;

  • S_{gnss}— путь, рассчитанный на основе скорости, которую предоставляет GNSS‑модуль.

Если:

\Delta S > 5\text{ м}

считаем, что накопленная ошибка превысила допустимый предел работы Dead Reckoning.

Стоит отметить, что GNSS‑модуль работает в режиме RTK, который обеспечивает точность позиционирования до 5 см.

RTK — совокупность методов получения плановых координат и высот точек местности сантиметровой точности с помощью спутниковой системы навигации посредством получения поправок с базовой станции, принимаемых аппаратурой пользователя во время съёмки.

Первый результат

Результаты MVP, мягко говоря, расстроили: путь, который удалось пройти трамваю с заданным критерием, составил всего 196 метров — даже до ближайшей остановки не доехал.

График 1. Пройденный путь по данным из CAN‑шины и GNSS‑модуля.

График 1. Пройденный путь по данным из CAN‑шины и GNSS‑модуля.

Выдвинули гипотезу: скорость CAN‑шины содержит ошибку, которая накапливается в ходе расчёта расстояния.

Для проверки надо собрать данные.


Анализ данных и обучение

Набор данных для анализа состоит из 25 000 измерений. Руководствуемся простой логикой: больше измерений — лучше результат.

Одно измерение содержит:

  • скорость, рассчитанную GNSS‑модулем (V_{gnss});

  • скорость, полученную из CAN‑шины (V_{can});

  • время между измерениями.

График 2. Отображение собранных Vcan и Vgnss, м/с.

График 2. Отображение собранных Vcan и Vgnss, м/с.

Приближаем один из участков графика.

График 3. Участок графика 2.
График 3. Участок графика 2.

График 3. Участок графика 2.

Приближение дало небольшой намёк на наличие лага графика V_{gnss}.

Обратимся к математике, а если точнее — к методу кросс‑корреляции.

Метод достаточно прост: один из рядов сдвигается относительно другого, после чего проверяется, насколько сигналы похожи друг на друга. Так происходит N раз, пока сдвигаемый сигнал не вернётся в исходное состояние, после чего определяется сдвиг, при котором был выявлен наилучший показатель корреляции.

Кросс‑корреляция подтвердила, что график V_{gnss} требуется сдвинуть влево относительно V_{can}, прежде чем анализировать данные.

Так и сделаем.

Смещение еле заметно, но картинка выглядит поприятнее:

График 4. Приближение Vcan и Vgnss, без учета лага.
График 4. Приближение Vcan и Vgnss, без учета лага.

График 4. Приближение Vcan и Vgnss, без учета лага.

График 5. Приближение Vcan и Vgnss, с учетом лага.
График 5. Приближение Vcan и Vgnss, с учетом лага.

График 5. Приближение Vcan и Vgnss, с учетом лага.

Корреляция скорости

GNSS‑модуль, который мы используем в рамках текущей работы, «под капотом» использует фильтр Калмана для обработки сырых данных со спутника.

Для скорости из CAN‑шины фильтр использовать не стали, так как большого разброса данных не обнаружили.

На графике 6 представлена зависимость ошибки — разницы скоростей (V_{gnss} - V_{can}) — от V_{gnss}.

В идеальном случае красная линия тренда должна быть расположена вдоль оси X. В данном случае линия тренда отклонена от нуля — значит, чем быстрее мы едем, тем больше расходятся значения двух источников.

Это означает, что мы не можем использовать V_{can} для расчёта расстояния без дополнительной коррекции.

Нужно определить правило, по которому будем корректировать значение скорости, полученное из CAN‑шины.

График 6. Зависимость ошибки от скорости из GNSS модуля.

График 6. Зависимость ошибки от скорости из GNSS модуля.


Построение модели коррекции

Чтобы корректировать V_{can}, нужно выбрать подходящую функцию F(V_{can}), которая даст скорректированное значение скорости V_{corr}, максимально приближённое к V_{gnss}:

V_{corr} = F(V_{can})

Нам предстояло определиться с видом функции F(V_{can}).

Так как применяемые физические законы движения представлены в виде полиномов, то и F(V_{can}) тоже попробуем представить в виде полинома.

Общее представление модели выглядит так:

V_{corr} =a_n V_{can}^{n}+ a_{n-1} V_{can}^{n-1}+ \dots+ a_1 V_{can}+ a_0

Считываем V_{can}, подставляем значение в полином, находим V_{corr} и используем его для расчёта расстояния.

Получаем прирост в точности позиционирования.

Мы в шоколаде!

Осталось ответить на два вопроса:

  1. Чему равен порядок полинома N?

  2. Как рассчитать коэффициенты полинома?


Обучение моделей

Мы взяли ранее собранный датасет, состоящий из измерений V_{gnss} и V_{can}, и с помощью метода наименьших квадратов подобрали оптимальные коэффициенты для регрессионных моделей от 1-го до 6-го порядка.

Другими словами — произвели обучение.

Чтобы сравнить модели между собой, использовали три критерия:

  • скорректированный R^2;

  • AIC;

  • BIC.

Скорректированный R^2 — скорректированный коэффициент детерминации. Показывает, насколько хорошо модель объясняет данные, но с поправкой на количество предикторов.

Чем ближе значение к 1, тем лучше модель объясняет наблюдаемые данные.

AIC — информационный критерий Акаике, используемый в статистике для выбора модели из нескольких возможных.

Абсолютное значение AIC само по себе не имеет смысла — критерий используется для сравнения моделей между собой.

BIC — байесовский информационный критерий.

Он аналогичен AIC, но сильнее штрафует модель за увеличение её сложности. Особенно полезен при работе с большими выборками.


Ниже представлены графики для каждого критерия в отдельности.

На всех графиках:

  • ось X — порядок модели;

  • ось Y — значение соответствующего статистического критерия.

График 7. Скорректированный R².

График 7. Скорректированный R².

График 8. BIC.

График 8. BIC.

График 9. АІС.
График 9. АІС.

График 9. АІС.

Сравнение моделей

order

AIC

BIC

adjusted R^2

1

-96327,21512

-96310,81149

0,9998789281

2

-97755,07149

-97730,46605

0,9998851795

3

-98261,58887

-98228,78162

0,9998873214

4

-98332,5578

-98291,54874

0,9998876219

5

-98348,97331

-98299,76244

0,9998876945

6

-98383,04839

-98325,6357

0,9998878406

Таблица 1. Сравнение статистических критериев АІС, ВІС, Скор. R².

По графикам и таблице видно, что с ростом степени полинома наблюдается улучшение статистических показателей.

Однако наибольший прирост наблюдается при переходе от 1-го к 3-му порядку. Поэтому модели 4–6-го порядков были исключены из дальнейшего рассмотрения.

Полином 3-го порядка показал наилучшие результаты по статистическим критериям среди оставшихся вариантов.


Получившиеся модели

В результате обучения получили следующие модели.

Полином 1-го порядка

F(V_{can}) =0{,}9731879 V_{can}+ 0{,}0110223

Полином 2-го порядка

F(V_{can}) =-0{,}0007160 V_{can}^{2}+ 0{,}9802512 V_{can}+ 0{,}0044346

Полином 3-го порядка

F(V_{can}) =0{,}0001287 V_{can}^{3}- 0{,}0029323 V_{can}^{2}+ 0{,}9892832 V_{can}+ 0{,}0017262

Коэффициенты полиномов, представленных выше, получены на основе данных с конкретного трамвая.

Чтобы в будущем использовать одну из перечисленных моделей для другого трамвая, потребуется проводить переобучение — то есть пересчитывать коэффициенты модели на данных соответствующего вагона.


Проверка моделей на тестовых данных

Следующий этап — прогон модели на тестовых данных.

Мы собрали ещё один набор данных, чтобы протестировать исходные модели.

Во время теста на вход моделей поступала скорость из CAN‑шины, на выходе получались скорректированные значения скорости, на основе которых рассчитывался пройденный путь S_{corr} для каждого полинома.

Также в момент поступления новой скорости производился расчёт накопленной ошибки, чтобы понять, насколько S_{corr} отличается от реального пройденного пути в каждый момент времени.

Оценка моделей для предстоящего проезда производилась по двум параметрам:

  1. процент пройденного пути;

  2. максимальное значение накопленной ошибки во время движения.

Процент пройденного пути

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

Набор тестовых данных содержал 13 км маршрута.

Максимальная накопленная ошибка

Максимальное значение накопленной ошибки показывает самое большое расстояние между расчётной координатой и идеальной координатой на всём пути движения.

В случае, если предыдущий показатель будет равен 100% у нескольких моделей, этот показатель позволяет сравнить их между собой.

Результаты

Степень полинома

Пройденный путь,%

Макс. накопленная ошибка, м

1

41,25757318

11,68719365

2

100

4,479686143

3

100

2,243722127

Таблица 2. Результат прогона моделей на тестовых данных.

По итогам тестирования моделей, полином 3-го порядка показал наилучшие результаты по рассматриваемым показателям.

Модель 3-й степени смогла уменьшить накопленную ошибку по расстоянию до 2,24 метров на всём пути следования.


Запуск MVP

Определив подходящую модель корректировки скорости, мы перешли к обкатке Dead Reckoning на реальном маршруте.

Эксперимент проводился на беспилотном трамвае, оборудованном нашим устройством.

Чтобы не демонстрировать скучные графики, которых и так было много, мы решили прикрепить это видео:

Сравнение траекторий GNSS RTK и Dead Reckoning на реальном трамвае
Сравнение траекторий GNSS RTK и Dead Reckoning на реальном трамвае

В ходе испытания мы получали две точки:

  • координату, рассчитанную алгоритмом Dead Reckoning;

  • координату от GNSS‑модуля, работающего в режиме RTK.

Для наглядности треки Dead Reckoning и GNSS отображались на карте FortMonitor.

FortMonitor — комплексная программная платформа для ГЛОНАСС/GPS‑мониторинга транспорта. Предназначена для получения в режиме реального времени информации о местонахождении, передвижении и состоянии транспортных средств, а также других ключевых показателей работы автопарка.

Это продукт нашей компании.

На видео отображено, как Dead Reckoning — красный вертолёт — двигается вместе с трамваем, который получает высокоточные данные на протяжении всего маршрута.

Заключение

Главный вывод: результат нас вдохновил!

Используя CAN‑шину и относительно простую модель машинного обучения, можно добиться высокой точности определения местоположения трамвая даже без постоянного использования GNSS.

В нашем случае простая схема:

V_{can} \rightarrow F(V_{can}) \rightarrow V_{corr} \rightarrow S \rightarrow \mathrm{coordinates}

позволила значительно уменьшить накопление ошибки.

Вместо того чтобы пытаться заставить IMU работать в условиях, для которых требуется специальная калибровка, мы использовали уже доступный на борту трамвая источник информации о скорости — CAN‑шину — и скорректировали его показания на основе данных GNSS.

При этом есть важное ограничение: полученная модель привязана к конкретному трамваю. Для переноса решения на другой вагон потребуется собрать данные и заново определить коэффициенты модели.

Пока мы писали эту статью, мы продвинулись ещё дальше, а с этой точки уже хорошо видно, куда двигаться дальше.

Почти так же точно, как в нашей модели.

Комментарии (22)


  1. dzherri
    24.09.2026 13:54

    Вся статья про то, как не строить сложную IMU-калибровку, а просто взять скорость из CAN-шины и подкрутить её полиномом. И это, пожалуй, самый честный инженерный подход: не изобретать велосипед, а использовать то, что уже есть на борту. Респект


    1. iWowik
      24.09.2026 13:54

      Главное назвать по-модному, что использовали не "определение параметров кривой по экспериментальным данным", а "относительно простую модель машинного обучения"


  1. unwrecker
    24.09.2026 13:54

    А можете вообще про DR прояснить? Вот есть у меня приёмник uBlox с поддержкой DR. Но, как я понял, само по себе это ничего не даёт - нужно приложение, которое будет всё это обрабатывать. Что же тогда такое DR? Просто акселерометр? Неужели нет готового приложения под андроид, которое будет обрабатывать с учётом этого аксилерометра и проксировать GNSS?


    1. NutsUnderline
      24.09.2026 13:54

      само по себе это ничего не даёт

      да вроде как должно давать. обработка ускорений довольно сложный а значит дорогой процесс который давать на откуп android (и только android) очень нелогично: легко скопировать, отреверсить и что делать с системамии где нет anrdoid


      1. unwrecker
        24.09.2026 13:54

        Ну я тоже думал, что чип за 10т.р. должен давать что-то большее чем просто дополнительный акселерометр. Но нет: ведёт себя как обычный навигационный приёмник.


        1. Sencis
          24.09.2026 13:54

          А вы какие сообщения из протокола UBX парсите? Насколько мне известно для DR отдельные сообщения в UBX предусмотрены стандартные отдают стандарную GPS позицию и с корость без DR. Также на вашейм Ublox-то вообще imu распаян, вы видели? Или требуется внешний imu развести на плате, если да он есть на плате?


          1. unwrecker
            24.09.2026 13:54

            Да я просто подключил его в автомобильному ГУ, и использую обычный транслятор GNSS для внешнего USB-приёмника. Чип всё-таки умеет отдавать скорректированные по DR координаты, но делает это через свой протокол, а через обычный NMEA не делает? Почему?


            1. NutsUnderline
              24.09.2026 13:54

              сколь я помню там нужно подавать особые команды для конфигурации нужного режима


            1. Sencis
              24.09.2026 13:54

              Звучит как вопрос к Ublox. На NMEA помойму нет сообщений с DR, и вообще позиция Ublox по NMEA такая, что это текстовый протокол он человеко ориентированный старый это legacy, требует парсить строки текста что-бы переводить их в бинарный машинный код для устройства а UBX это бинарный протокол для общения машины с машиной сразу байтиками он более удобен и компактен (в бинарном виде данные предаются быстрее т.к. занимают меньше байт и могут загружаться сразу в ОЗУ без парсера) и потому развивают именно его!


  1. Michroz
    24.09.2026 13:54

    Я бы к прекрасной математике, а лучше до неё, подключил физику. Надо прежде всего выяснить откуда физически в Кан шине скорость и какой датчик её обеспечивает, и нельзя ли получить сразу перемещение (обороты колеса). Трамвай -относительно простой случай, поскольку идёт по рельсам и по маршруту. При хорошей точности датчиков должен быть хороший результат. Возможно несложный копеечный лидар под днищем даст лучшую точность, причём сразу перемещение, а не скорость (как компьютерная мышка). И ещё для счисления (дэд рэконинга) важно и возможно в случае трамвая делать физическую коррекцию. Например, остановка, светофор, поворот. Математика - это круто, но ещё круче, если подумать и поработать до неё. Удач.


  1. Terakomari
    24.09.2026 13:54

    Опять московское княжество


  1. equipment66
    24.09.2026 13:54

    Детсад на прогулке. А исходные данные - обороты колеса - с КАН шины, сразу и без заморочек, не судьба было получить? Вместо того, чтобы расстояние высчитывать, как производное от производного и потом мучатся с корректировкой неизбежно набежавших ошибок?

    Для привязки к маршруту на остановках можно разместить радиочастотные метки, а на вагон - считыватель. За несколько рейсов наберёте данные для калибровки с точностью погрешности расстояния считывания метки. Если в ключевых местах использовать уникальные метки, то по ним вагон может определять маршрут. И никакого GNSS.


    1. x89377
      24.09.2026 13:54

      Можно табличку c QR кодом на остановку и камеру внутрь трамвая. Можно и на светофоры повесить.


      1. NutsUnderline
        24.09.2026 13:54

        собственно первый штрих код и был для ЖД вагонов


    1. Sergey78
      24.09.2026 13:54

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


      1. equipment66
        24.09.2026 13:54

        После калибровки можно и так, но качественно откалибровать систему так не получится. Метка устанавливается в конкретном месте, а трамваев к остановке может подъехать несколько одновременно и двери могут открываются в разных местах.


  1. P_58
    24.09.2026 13:54

    Насколько мне известно, в московских трамваях активно внедрялась система идентификации трамвая по меткам, спрятанным в полотне. Считыватель установлен на трамвае снизу. Как только трамвай проезжает над меткой, его местоположение определяется с высокой точностью. Чем больше таких меток, тем точнее и чаще определяется местоположение трамвая. Это надёжный способ уточнения координаты борта.


  1. AbuMohammed
    24.09.2026 13:54

    Как человек 16 лет посвятивший созданию путеобследовательских станций могу сказать вот что(странно что мне вам надо это говорить, ну да ладно). Говорю без сарказма и юмора.

    1.одометрия на жд транспорте вещь очень важная и тяжелая, несмотря на кажующуся простоту. Собсно, проблема в том что колеса на кп жестко связаны, а движение тележки в колее вещь с точки зрения физики очень сложная. Профиль колеса, профиль рельса(рельс - мужского рода), угол установки рельса в колее(подуклонка), все непросто так.

    2.Клуб и его аналоги достаточно продвинуты и постоянно корректируются. Это на жд и метро, с их телемеханикой. Бог в свое время отвел от трамваев, поэтому за них не скажу, но все таки думаю что аналог алсн должен быть и там. Это самая лучшая коррекция. Ординаты по изостыкам считают до см и актуальность этих данных постоянно поддерживают.

    3. Как уже указали, можно брать инфу непосредственно с одометра. В Бакинском метро например точность позиционирования по одометру в прямых участках была порядка см, это с учетом сложного виляния тележки. Но надо учитывать кучу факторов, самое простое и часто встречающееся - эксцентриситет установки, на метро кстати с его гораздо более высокими требованиями по позиционированию очень интересный конструктив.

    4. Как уже сказали в путь (в московском и питерском метро точно, сам этого касался) зашивают рфиды с путевой ординатой и географическими координатами, их тоже можно использовать.

    Кстати, в трамвайных ордигатах отрицательные и нулевые пикеты бывают?


    1. NutsUnderline
      24.09.2026 13:54

      в некоторых странах вагоны метро отделены еще одной стенкой с дверями и нужно их точно сопоставить, но это нужно и можно только на станции. зачем сантиметровая точность на всем пути?


      1. AbuMohammed
        24.09.2026 13:54

        В первую очередь телемеханика. Стрелками там щелкать и тп.


  1. FotoHunter
    24.09.2026 13:54

    Вообще с одной стороны вы проделали большую работу, НО это реально похоже на изобретение велосипеда.

    Такие "инерциальные" системы существуют очень давно и стали бытовыми, как пример в моём Nissan 2012 года навигационная система продолжает работать после гашения спутников, разброс позиционирование порядка сотни метров на десяток километров, система учитывает скорость и поворот руля, в вашем случае руля нет, НО кто мешает добавить в схему несколько датчиков типа гироскопа и компаса и за счёт них корректировать то, что прилетело с can???, Так же трамвай не в ваккуме движется, а проходит через множество известных контрольных точек (остановки и перекрёстки) на которые можно так же опираться в расчётах, у вас же там камеры и системы распознавания....


  1. sergyk2
    24.09.2026 13:54

    по мере износа колеса точность поплывёт. пусть там будет 1мм/об но он жэ накапливаеца.

    в авто еще сложнее, там явно будет зависимость от загрузки и давления в шынах.