Узнайте, как повысить точность GPS-трекера с 50% до 95% с помощью отлова выбросов, счисления пути и фильтрации. Примените эти методы прямо сейчас.
Представьте: приложение для отслеживания пробега показывает, что вы разогнались до 400 км/ч, хотя стояли на красном светофоре. Это не баг — это GPS. В этой статье я расскажу, как мы повысили точность трекера с 50% до 95%, используя три простых приёма: отлов выбросов, счисление пути и взвешенное слияние данных. Вы узнаете, как заставить GPS работать надёжно даже в туннелях и городских каньонах.
Мы привыкли считать GPS источником правды. Но в реальном мире, где люди действительно ездят, он ведёт себя как свидетель, получивший удар по голове: уверенный, сговорчивый, но часто ошибающийся.
Три места, где GPS ломается особенно сильно:
Ни одно из этих мест не является редким случаем. Это обычный вторник. Поэтому вопрос перестал быть «как улучшить GPS» и стал «как перестать верить плохому GPS».
Самая дешёвая победа — проверка на физическую возможность. Для любого режима передвижения существует допустимый диапазон скорости. Пешеход не может телепортироваться на 200 метров за секунду. Автомобиль не разгоняется как ракета.
fun GpsFix.isImpossible(prev: GpsFix, mode: Mode): Boolean {
val meters = haversine(prev, this)
val seconds = (timestamp - prev.timestamp).coerceAtLeast(1)
val speed = meters / seconds
return speed > mode.maxPlausibleSpeed // для пешехода, велосипеда, авто — разные
}Если точка невозможна — отбрасываем. Эта простая проверка убила самые вопиющие ошибки, включая случай с 400 км/ч. Она не умна, она просто отказывается быть обманутой.
Отбрасывание плохих точек оставляет пробелы, и туннель — большой пробел. Если заморозить трек до возвращения GPS, получится прямая линия, пересекающая три улицы.
Решение: когда GPS пропадает, перестаньте его ждать и начните оценивать положение. Возьмите последний хороший курс и скорость, считайте данные с акселерометра и экстраполируйте позицию. Старые моряки делали это «на глаз» — без звёзд, только направление и время.
def dead_reckon(last_position, imu, dt):
# imu.forward_accel — ускорение вперёд, imu.turn_rate — скорость поворота
speed = last_position.speed + imu.forward_accel * dt
distance = speed * dt
new_heading = last_position.heading + imu.turn_rate * dt
return last_position.moved_by(distance, heading=new_heading)Этот метод дрейфует, поэтому на него нельзя полагаться долго. Но туннель короток, и «примерно верно в течение 40 секунд» лучше, чем «уверенно неверно» или «дыра на карте».
Большая часть точности пришла от отказа от привычки «верить тому, кто сказал последним». Вместо этого мы взвешиваем каждый входной сигнал по его текущей достоверности.
Чистый, стабильный сигнал GPS сильно тянет оценку к себе. Дрожащий — почти не влияет. Оценка счисления пути заполняет промежутки. Никто не имеет права вето — каждый получает голос, взвешенный по уверенности.
Классический способ реализовать это — фильтр Калмана. Но победа не в фильтре, а в мышлении: держать несколько шумных мнений одновременно и склоняться к тому, которое выглядит надёжным в данную секунду.
Всё это бесполезно, если трекер убит. На Android, как только экран гаснет, система начинает искать фоновые задачи для уничтожения. Мы запускали конвейер в foreground-сервисе с небольшим плавающим пузырьком — отчасти чтобы пользователь видел, что он работает, но в основном чтобы ОС не трогала процесс. Трекер, который убит, имеет точность 0%, какой бы хорошей ни была математика. Я потратил почти столько же времени на выживание процесса, сколько на алгоритмы.
Не одно серебряное пуля. Обнаружение выбросов убрало мусор. Счисление пути закрыло пробелы. Слияние сделало всё согласованным. Выживание сделало это реальным. Каждый приём дал свой вклад, и они сработали вместе.
Одна мысль, которая осталась после всего: хорошие системы — это не те, у которых идеальные входные данные, потому что ни у кого их нет. Хорошие системы предполагают, что их входные данные будут лгать, и планируют день, когда это случится.
Доверяй, но проверяй. Особенно своим датчикам.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →