移除建筑物内的不良GPS信号

时间:2011-06-19 21:16:32

标签: algorithm filter gps

我遇到了一个无法解决的问题,当GPS数据记录器位于建筑物内部时,这些单元仍然会读取数据"噪音很大"。因此,当单元保持静止时,它仍然读取数据并且记录的点以疯狂的方式跳跃。也就是说,如果我把这个单元放在桌子上2个小时。我仍将通过例如记录彼此远离的点。 150米。

这对我来说是一个问题,因为我想制作一个程序来计算单位移动的总距离。因此,如果我将设备固定在桌面上3小时,则该设备会记录许多彼此远离的数据点。 150米。因此,我的程序会读到该单位在此期间移动了20公里,尽管它没有移动。

我试图通过HDOP,PDOP,VDOP过滤获得的数据,但它只删除了5%的坏数据点。我还尝试按gps记录器读取的卫星数量过滤数据,但这也没有识别出所有不良信号。

我知道没有解决方案来防止这种错误,这是由于技术本身,因为GPS不是为了阅读建筑物内部而设计的。我最大的问题是删除这些数据点不能由我的程序计算。我知道可能有一些过滤器可行。

如果您愿意,我可以附加一个excel文件,其中包含一些记录在建筑物内的数据。我的目的只是让我的程序知道这些点是什么,以便我可以从计算中删除它们。请注意,速度,标题为零,因为我将设备配置为不存储这些参数,但如果您需要这些数据进行过滤,我可以将数据发送给您。

2 个答案:

答案 0 :(得分:5)

我们使用记录在汽车中的数据,我们对手机在某人桌面上收费时收集的位置数据不感兴趣。我认为我们的方法将解决您的大部分问题。

我按如下方式处理GPS噪音:

  • 为了消除90%的无用噪音,记录仪在没有移动时停止记录(没有超过10公里/小时的速度测量),或者没有超过3分钟的信号。这样,当有人在等待红绿灯或拐角处时,我们不会漏洞;在后期处理过程中,如果长时间没有移动,我们将删除尾随噪音。

  • 一旦连续进行3次测量,速度超过10 km / h,我们就会认为它不仅仅是噪音,我们将所有已经缓冲的内容存储起来,直到第一次测量速度为

此时我们已经滤除了90%的噪音,但是当有人在旅途中静止不动时,我们仍然会留下轻微的噪音。我们按如下方式处理:

  • 如果没有移动的短时间段,所有低速位置都会在静止前的最后一次移动和静止后的第一次移动之间的贝塞尔曲线上进行插值。位置,速度和航向都算在内。线性插值(或简单地删除这些测量)可能会以较小的努力提供可用的结果。

通过测量行驶的原始距离以及该时段中第一个和最后一个位置之间的距离,有一些额外的启发式方法可以确保交通拥堵中的慢速驾驶不会被视为GPS噪音。

这一切都是针对要求距离计算精度为99%的任务实施的,因此涉及的内容要多得多。例如,通过匹配地图,规划路线以验证匹配,并在隧道中填充信号中的gps,或者当信号因反射而变坏时,以及检查连续测量的标题,位置和速度是否匹配(你可以随时使用其中任何两个来计算第三个)。但这基本上就是我们过滤掉大部分GPS噪音的方法。

如果您不需要实时计算内容,那么您就可以看到“未来”,这样可以更轻松地过滤内容。

答案 1 :(得分:1)

您可以找到所有“休息位置” - 记录器在指定时间内停留的半径 - 并过滤掉所有附近的点。这会导致你不能跟踪400米跑道上的三英里慢跑(因为所有的点都会靠近,即使这个人处于运动状态),但只要你所有以距离为中心的关注点都更具移动性,那么这个应该工作正常。

过滤速度的另一个建议是很好的,因为大量的时间GPS预热或瞬间错误可能超过每秒100米,如果你跟踪汽车的机会,你不相信任何超过80米/秒的东西。以下是一些用Haskell programming language编写的示例代码,它使用我在Hackage上维护的GPS package

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]

底线显示考虑点xsgoodPointsbestPoints时的总距离。如您所见,xs溢出double,而goodPointsbestPoints的距离更合理。