2012-07-27 149 views
10

写一个GPS记录应用程序〜Android的GPS定位速度不可靠

我发现通过LocationsgetSpeed()方法,通过LocationManager报道返回的值是大量不可靠的。我正在使用LocationManager.GPS_PROVIDER,过滤通过onLocationChanged提供的位置以获得最佳准确性。即使在一位数的精度水平上,返回的速度通常也很高。当手机处于静止状态时,我们正在谈论高达200 mp/h(是的,我知道它以米/秒记录)。

我在两个不同型号的Android手机上测试相同的代码库,运行两个不同的操作系统版本,并看到相同的问题,所以我期望这是一个代码问题。

我错过了什么?我尝试过在一段时间内平均地点,但无济于事。我是否必须根据行驶距离/时间计算出我自己的速度值?这会令人失望。

正如你所看到的,我没有做什么特别的东西 - 对精度的过滤不大,甚至在此之后双方AverageSpeed_bestLocation.getSpeed()是定期unfeasibly高,即使在定位精度好。

public void onLocationChanged(Location location) { 
    if (location.getAccuracy() < 25f) { 
     _recentLocations.add(location); 

     if (_bestLocation == null || location.getAccuracy() <= _bestLocation.getAccuracy()) 
      _bestLocation = location; 
    } 

    if ((_bestLocation != null && _bestLocation.getAccuracy() < 10f && _recentLocations.size() >= 10) 
      || _recentLocations.size() >= 25) 
    { 
     int Count = 0; 
      float TotalSpeed = 0f; 
      float AverageSpeed = 0f; 
      for (int i = 0; i<_recentLocations.size(); i++) { 
       if (_recentLocations.get(i).hasSpeed()) { 
        Count++; 
        TotalSpeed += _recentLocations.get(i).getSpeed(); 
       } 
      } 

     if (Count > 0) 
       AverageSpeed = TotalSpeed/Count; 
     } 
} 
+0

您在不同的地方*尝试这个*呢?在某些地方,无论如何你都无法获得GPS定位。 – Piskvor 2012-07-27 10:26:27

+0

我应该指定,我得到非常可以接受的精确修正 - 通常是5 - 10米。地方是尽可能变化 - 从办公室到客户网站和家庭等 – 2012-07-27 10:30:34

+0

@DanWray海,你有没有解决这个问题,现在我正在努力相同,你能帮助我吗? – 2014-08-04 09:35:16

回答

22

我已经在GPS硬件上工作了7年多了。精确度读数也不是100%准确的。 制造商国家准确性以及用于测量它的系统。 CEP,RMS,2DRMS和R95是一些系统。 阅读这篇文章的更多信息:http://en.wikipedia.org/wiki/Circular_error_probable

准确度数字不包括异常值。例如,如果规定精度为5米,那么在良好信号条件下读取的最大误差为5米,95%的时间。对剩下的5%的数据没有什么可说的。对这些异常值的保护是特殊的酱料,它使得基于位置的应用程序与其他应用程序脱颖而出。

有些事情你可以做的是:

  1. 筛选出出奇高的速度。利用高度作为在飞机上的提示。
  2. 关联来自运动传感器的信息,看看他们是否同意GPS的 。运动传感器签名在稳态 和运动中会有很大不同。
  3. GSM/3G小区的典型规模在城市 区域不到一公里,在人口稀少的地区有5-10公里。如果 车辆正在高速行驶一段时间,并且信息塔 的信息仍然相同,则您知道有问题。
  4. GPS定点高速读取南北片刻和南下 ?如果是,那很可能是GPS错误。
  5. 检查GPS通信中使用的卫星数量。 12个出色,9个健康,5个或更少,4个最低纬度,lon +海拔高度 计算,3个最低纬度,lon计算。小于3不是有效的读数。如果楼梯数量很多,你可以对数据的有效性更有信心。
+3

有帮助。我也一直在使用GPS应用程序,我通常使用的第一个指标是卫星数。在Android的情况下,我忽略了可以通过getExtras()方法获得卫星数量,并且依赖于以米为单位报告的准确度,以保证我的置信水平。我会考虑您的意见并尝试改进我的代码,谢谢。 – 2012-07-27 11:51:30

+2

非常真实。 Android文档还提供了有关位置提供程序如何工作以及如何过滤未覆盖的位置的非常好的说明。 http://developer.android.com/guide/topics/location/strategies.html – 2012-12-03 09:32:33

+0

写得好点..(Y) – Farhan 2013-04-03 17:51:25

1

GPS设备的位置的里程计,基于所述接收器 多远自从上次测量移动。它的速度计算不是 ,但与车辆的速度计 (车轮尺寸,变速箱/传动比)相同。取而代之的是,GPS的位置精度以及其计算出的速度的准确度取决于当时的卫星信号质量是 。速度 计算将在更高速度时更准确,当位置误差与位置变化的比率较低时。

来自维基百科。

也许你应该试试这个地方,你有良好的信号强度。

+0

了解,并感谢您的评论。我已经写了这个相同的应用程序在Blackberry手机上运行,​​在WinMo和WP7上也有类似的功能,而且我从来没有在速度和GPS准确性方面遇到过这样的问题。从代码中可以看出,我不会接受精度<25m的位置,通常会看到精度<10m,特别是当电话在外面并且移动时(即,当我需要速度时)。在这个准确度水平上,我期望看到的速度值至少在正确的数量级上。 – 2012-07-27 10:36:27

+0

我没有意识到手机之间的差异,但当我尝试不同的位置时,我在iPhone上遇到了同样的问题。 GPS精度在几米之内的地方,我们在速度上有非常好的准确度,但在准确度为50米的地方,我们的速度精度非常差。而且就像引言所解释的那样,它完全基于位置估计,速度通过之前的位置估计和当前位置估计以及时间差来计算。 – codetiger 2012-07-27 10:51:32

+0

然而,它在室外露天场所非常好。 – codetiger 2012-07-27 10:52:41

1

我遇到了同样的问题。我认为GPS信号取决于一个位置,一些位置可能会给出一个精确的位置输出,否则就是一个“不太可靠”的结果。就我而言,我距离我的实际位置约200米。你呢?

要添加,GPS_PROVIDER在我的区域不起作用。 NETWORK_PROVIDER的确如此,并且它能够给出200米远的结果。

+0

我很幸运能够使用GPS_PROVIDER,但即使使用NETWORK_PROVIDER,我也能看到比200m更精确的修正。你有没有尝试过一段时间看你的听众,并寻找更好的准确性?有点类似于我上面的代码。当然,网络/无线网络的覆盖范围在世界不同地区会有很大的差异,所以你的经验可能会与我的差异很大。 – 2012-07-27 11:04:17

+0

是的,我试过得到最好的提供者,最好的准确性和最好的标准,但是当我使用GPS_PROVIDER时,它不返回任何位置结果。 – JetPro 2012-07-29 08:16:17

0

这似乎表明,大多数人都假设来自GPS的速度信息是基于比较与时差有关的位置。这种方法对于确定速度不是很好,而且在较低的行驶速度下更差。

GPS接收机可以根据卫星测量的多普勒频移输出速度测量结果。与基于位置/时间计算的速度测量相比,基于多普勒的速度测量精度要好得多。

Google on gps speed doppler and you can find find a lot to read。

一个环节是在这里: http://nujournal.net/HighAccuracySpeed.pdf

/城市Holmdahl