Удалить плохие сигналы GPS внутри здания - PullRequest
5 голосов
/ 20 июня 2011

У меня есть проблема, которую я не могу решить, когда регистратор данных GPS находится внутри здания, устройства все еще считывают данные «с большим шумом».Таким образом, когда устройство остается неподвижным, оно все еще считывает данные, и записанные точки скачут безумно.то есть, если я держу устройство в течение 2 часов на столе.Я по-прежнему буду записывать точки, удаленные друг от друга, например, на 150 м.

Это проблема для меня, так как я хочу создать программу, которая рассчитывает общее расстояние, на которое переместилось устройство.Таким образом, если я держу прибор неподвижным на столе в течение 3 часов, он продолжает записывать множество точек данных, которые удалены друг от друга, например, на 150 метров.Итак, моя программа будет читать, что устройство переместилось на 20 км за этот период, хотя оно и не двигалось.

Я попытался отфильтровать полученные данные по HDOP, PDOP, VDOP, но он удалил только 5%плохих точек данных.Я также пытался отфильтровать данные по количеству спутников, которые читает gps-регистратор, но это также не идентифицировало все плохие сигналы.

Я знаю, что не существует решения для предотвращения этой ошибки, это связано с технологиейСам по себе GPS не предназначен для чтения внутри зданий.Моя самая большая проблема состоит в том, чтобы удалить эти точки данных, которые не будут рассчитываться моей программой.Я знаю, что могут быть некоторые фильтры, которые работают.

Если хотите, я могу прикрепить файл Excel, содержащий некоторые данные, которые записаны внутри здания.Моя цель - только дать моей программе знать, что это за точки, чтобы я мог удалить их из своих расчетов.Обратите внимание, что скорость, заголовок - это нули, потому что я настроил устройство не сохранять эти параметры, но если вам нужны эти данные для фильтрации, я могу отправить вам данные.

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

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

Я имею дело с шумом GPS следующим образом:

  • Чтобы избавиться от 90% бесполезного шума, регистратор прекращает регистрировать, когда нет движения (нет измерений со скоростью более 10 км / ч) или нет сигнала в течение более 3 минут. Таким образом, мы не прорубаем дыры, когда кто-то ждет светофора или на поворотах; Во время последующей обработки мы удалим задний шум, если в течение более длительного периода действительно не было никакого движения.

  • Как только будет выполнено 3 последовательных измерения со скоростью более 10 км / ч, мы предполагаем, что это не просто шум, и мы храним все, что мы буферизировали, до первого измерения со скоростью < 2 км / ч. Таким образом, если машина медленно уезжает, мы все равно фиксируем, как она уезжает.

На данный момент мы отфильтровали 90% шума, но у нас все еще остается незначительный шум, когда кто-то стоит на месте во время поездок. Мы занимаемся этим следующим образом:

  • Если существует короткий период без движения, все позиции с низкой скоростью интерполируются по кривой Безье между последним движением перед тем, как стоять, и первым движением после того, как он стоит. Положение, скорость и курс учитываются. Линейная интерполяция (или просто удаление этих измерений), вероятно, даст полезные результаты с меньшими усилиями.

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

Все это было реализовано для задания, где требуется точность 99% для расчета расстояния, поэтому требуется гораздо больше. Например, путем сопоставления с картой, планирования маршрутов для проверки совпадений и заполнения GPS в сигнале в туннелях или когда сигнал был плохим из-за отражений, а также путем проверки соответствия заголовков, позиций и скорости последовательных измерений ( Вы всегда можете использовать любые 2 из них для расчета 3-го). Но это в основном то, что мы делаем, чтобы отфильтровать большую часть шума GPS.

Если вам не нужно вычислять вещи в режиме реального времени, у вас есть большое преимущество, благодаря которому вы можете заглянуть «в будущее», что значительно упрощает фильтрацию вещей.

1 голос
/ 20 июня 2011

Вы можете найти все «места отдыха» - радиус, в котором ваш регистратор находится в течение определенного периода времени - и отфильтровать все близлежащие точки.Это приведет к тому, что вы не будете отслеживать что-то вроде трехмильного пробежки на 400-метровой трассе (потому что все точки будут близки, даже если человек находится в движении), но до тех пор, пока все ваши ориентированные на расстояние проблемы более мобильны, чем этадолжно работать нормально.

Другое предложение фильтрации по скорости прекрасно, потому что много раз прогрев GPS или кратковременные ошибки могут быть более 100 метров в секунду, и если вы отслеживаете машины, вы, скорее всего, не поверитеболее 80 м / с.Вот пример кода, написанный на языке программирования Haskell , который использует пакет GPS , который я поддерживаю в Hackage:

import Data.GPS
import System.Environment
import Data.List
import Control.Monad

main = do
        file <- liftM head getArgs
        xs <- readGPX file
        let rests = restLocations d t xs  -- all points within 100 meters for two minutes
            goodPoints = xs \\ concat rests   -- all points that aren't considered rest locations
            bestPoints = filterByMaxSpeed s goodPoints
            totalDist = map totalDistance [xs, goodPoints, bestPoints]
            lxs = length xs
            lgp = length goodPoints
            lbp = length bestPoints
        putStrLn $ "We filtered out " ++ (show $ lxs - lgp) ++ " points by eliminating\
                   \ all points where the device stayed in " ++ show d ++
                   "meters for " ++ (show t) ++ " or more seconds.\
                   \  We filtered an additional " ++ (show $ lgp - lbp) ++
                   " points by eliminating movements over " ++ show s ++ " meters / second"
        print $ totalDist
  where
  d = 100
  t = 120
  s = 35

Сначала мы открываем файл ипрочитать все точки в переменную с именем xs.Затем мы находим все места отдыха (точки в пределах 100 метров в течение 120 или более секунд) и удаляем указанные точки, в результате чего получается переменная goodPoints.Наконец, мы удаляем все точки, которые потребовали бы, чтобы устройство перемещалось со скоростью более 35 метров в секунду (78 миль в час), что дает нам результат bestPoints.

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

 $ ./so ~/Maps/23Apr2011.gpx 

 We filtered out 26601 points by
 eliminating all points where the
 device stayed in 100.0 meters for 120s
 or more seconds.  We filtered an
 additional 6 points by eliminating
 movements over 35.0 meters / second
 [NaN,6724.717043334737,6676.349134626797]

В нижней строке показано общее расстояние при рассмотрении точек xs, goodPoints и bestPoints.Как видите, xs переполняет double, тогда как расстояния goodPoints и bestPoints более разумны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...