安卓GPS定位速度不可靠

14

编写GPS记录应用程序~

我发现LocationManager返回的LocationsgetSpeed()方法返回值极不可靠。我正在使用LocationManager.GPS_PROVIDER,通过onLocationChanged提供的位置进行过滤以获得最佳准确性。即使在单位数的准确性水平下,返回的速度通常也非常高。当手机静止时,速度甚至高达每小时200英里(是的,我知道它以米/秒记录)。

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

我错过了什么?我已经尝试了一段时间内对位置进行平均处理,但没有效果。难道我要根据旅行距离/时间计算自己的速度值吗?这将是令人失望的。

正如您所看到的,我没有做任何特殊的事情-即使在经过一些准确性过滤后,AverageSpeed_bestLocation.getSpeed()仍然经常出现不合理的高速度,即使位置准确性很好。

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;
        }
}

你在不同的地方尝试过吗?有些地方,无论如何都无法获得GPS信号。 - Piskvor left the building
我应该指出,我得到的修复非常准确 - 通常在5-10米左右。地点尽可能多样化 - 包括从办公室到客户现场和家等行程。 - Dan Wray
@DanWray 你好,你解决了这个问题吗?我现在也遇到同样的问题,能帮我一下吗? - Sreedhu Madhu
@madhu,问题确实出在我的代码上。请查看(非常好的)已接受答案,它应该告诉你几乎所有你需要知道的内容。你不能仅仅依赖单个GPS定位,你必须在一段时间内过滤和聚合数据,以给你的应用程序提供强有力的位置指示。 - Dan Wray
@DanWray,感谢您的及时评论,让我来检查一下被接受的答案。 - Sreedhu Madhu
只是一种想法(我不知道它是否真实)。如果速度是通过多普勒效应从单个固定点计算的,那么测量速度非常快,以至于来自运行发动机等振动可能会破坏整个测量?在这种情况下,您的过滤类型将无济于事,因为您无法看到振动的当前方向(朝向您的移动向量还是反对它或者有些侧向..)。 - FrankKrumnow
4个回答

31

我已经从事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单元的典型大小在城市区域内不到1公里,在人口稀少的地区为5-10公里。如果车辆在高速移动一段时间后,基站信息仍然相同,则知道有问题。
  4. GPS修复在某一时刻读取北方,下一时刻读取南方,并且速度很快吗? 如果是,则很可能是GPS错误。
  5. 检查GPS计算中使用的卫星数量。 12个卫星非常出色,9个卫星健康,5个或更少则较差,4个是仅适用于纬度,经度+海拔计算的最低要求,3个是仅适用于纬度,经度计算的最低要求。 少于3的任何数字都不是有效的读数。如果卫星数量很多,则可以更加自信地确认数据的有效性。

3
很有帮助。我也长时间使用GPS应用程序,通常我使用的第一个准确度指标是卫星数量。在Android的情况下,我忽略了卫星数量可通过getExtras()方法获取,并一直依赖于以米为单位报告的准确性来确定自己的信心水平。我会考虑你的意见,并尝试改进我的代码,谢谢。 - Dan Wray
2
非常正确。Android文档还提供了非常好的位置提供者工作原理和如何过滤不准确位置的描述。http://developer.android.com/guide/topics/location/strategies.html - L. G.
@Dojo 谢谢你的详细回答。你能否指点我正确的方向?我需要在低级别的安卓设备上计算车辆的距离,通常是10-25公里,但每个会话的精度不能低于0.5-0.8公里。你提到的预防措施对这种情况足够吗?还是我需要使用更高级的过滤技术,比如卡尔曼滤波(我听说过)?提前感谢! - ar-g
@Dojo 我正在使用 iPhone 获取 GPS 值。在拍摄期间报告的速度非常低(1-15 英里/小时),但如果我手动计算速度(两点之间的直线距离/时间),它会达到 250-350 英里/小时。手机的 GPS 在如此高的速度下失效并报告不准确的数据吗? - nr5
@nr5 在进行计算之前,您是否检查 GPS 信息的有效性?一种可能性是 GPS 信号不好,导致位置长时间不更新,因此您会得到旧的位置信息,然后突然设备获得有效的修复并获取当前位置。因此,在您的算法中,它看起来像位置变化发生在1秒钟内。对于所有这样的计算,请仅使用有效的 GPS 修复。 - Dojo
在我的三星10+上,我发现速度相当不错。由于GPS精度的原因,在低速时使用距离差异会更好。我会平滑处理数据,使用几秒钟的移动平均值,并且排除无法解释为加速度不合理的异常值。使用这种方法似乎效果很好。 - Dave Hubbard

1
GPS设备是基于接收器自上次测量以来移动的距离而定位的速度计,其速度计算不受车辆速度表(轮胎尺寸、传动/驱动比)的同样误差来源的影响。相反,GPS的位置精度及其计算速度的准确性取决于当时卫星信号的质量。当位置误差与位置变化的比率较低时,速度计算将更加准确,特别是在高速行驶时。来自维基百科。
可能您应该在信号强度良好的地方尝试此操作。

明白了,感谢您的评论。我已经编写了相同的应用程序,可以在黑莓手机上运行,并在WinMo和WP7上运行类似的应用程序,我从未遇到过速度与GPS精度的问题。正如您从代码中看到的,我不会接受精度小于25m的位置,并且通常会看到精度小于10m,特别是当手机在室外移动时(即当我需要速度时)。在这种精度水平下,我希望看到至少正确数量级的速度值。 - Dan Wray
我不了解手机之间的差异,但是当我尝试不同的位置时,在iPhone上遇到了相同的问题。在GPS精度为几米的地方,我们得到了非常好的速度准确性,但在精度为50米的地方,我们的速度准确性非常差。正如引语所解释的那样,它完全基于位置估计,速度是通过先前的位置估计和当前位置估计以及时间差计算出来的。 - codetiger
确实,这就是我的问题所在 - 在开放的户外位置,具有强大的固定精度,报告了愚蠢的速度。我打算通过比较连续的位置和经过的时间来手动确定速度,但感觉自己在重复已经完成的工作,并且我对能否得到更好的结果并不抱太大希望。无论如何,感谢您的建议。 - Dan Wray
在网上搜索时,您会发现多个看似可靠的网站声称GPS速度是通过Δ距离除以Δ时间计算的。其他一些看似可靠的网站则表示,使用多普勒效应可以直接计算速度(且误差较小),而无需借助先前的修复来计算。考虑到静止车辆上不准确的GPS跳跃,这完全有道理。我认为第二个答案是正确的,使用了多普勒效应。但这可能取决于芯片组的能力?有人可以详细说明吗? - FrankKrumnow

1

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

另外,GPS_PROVIDER在我的地区不起作用。NETWORK_PROVIDER可以使用,并且它是给出200米偏差结果的那个。


我很幸运能使用GPS_PROVIDER,即便使用NETWORK_PROVIDER,我也能看到比200米更精确的修复结果。你是否尝试过在一段时间内观察监听器,并寻找更好的准确性呢?这与我的代码有些相似。当然,在世界不同地区,网络/ WiFi覆盖范围会有很大变化,因此你的体验可能会有所不同。 - Dan Wray
是的,我尝试获取最好的提供程序、最高的准确度和最佳标准,但当我使用GPS_PROVIDER时,它没有返回任何位置结果。 - JetPro

0

看起来大多数人都认为从GPS获取的速度信息是基于比较与时间差有关的位置。这种方法在确定速度方面并不好,而且在较低速度下更糟糕。

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

在Google上搜索“gps speed doppler”,您会发现很多阅读材料。

这里有一个链接: http://nujournal.net/HighAccuracySpeed.pdf

/Urban Holmdahl


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接