Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS

в 13:28, , рубрики: CAN, Dead Reckoning, embedded, GNSS, gps, Rtk, навигация, позиционирование, трамвай, транспорт

Введение

Открываешь навигатор — а ты уже в деревне Пупкино. Знакомо? Спуфинг и глушение 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 > 5text{ м}

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

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

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

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

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

Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS - 9

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

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

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

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


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

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

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

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

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

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

Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS - 12

График 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‑шины.

Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS - 24

График 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 — значение соответствующего статистического критерия.

Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS - 40

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

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

Как мы заставили трамвай ехать без GPS: калибровка CAN‑скорости с помощью GNSS - 41

График 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.

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

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

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

Автор: hex_61

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js