Android GPS定位速度不可靠

Posted

技术标签:

【中文标题】Android GPS定位速度不可靠【英文标题】:Android GPS Location Speed Unreliable 【发布时间】:2012-07-26 00:23:22 【问题描述】:

编写 GPS 记录应用程序~

我发现LocationManager 报告的Locations 上的getSpeed() 方法返回的值非常不可靠。我正在使用LocationManager.GPS_PROVIDER,过滤通过onLocationChanged 提供的位置以获得最佳准确性。即使在个位数的精度水平下,返回的速度通常也高得离谱。当手机静止时,我们的通话速度高达 200 mp/h(是的,我知道它是以米/秒为单位记录的)。

我正在两部不同型号的 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 定位。 我应该指定,我得到了非常可接受的准确修复 - 通常 5 - 10 米。地点尽可能多样化——从办公室到客户现场和家庭等。 @DanWray hai,你解决了这个问题吗,现在我也在努力解决这个问题,你能帮我解决这个问题吗? @madhu 问题确实出在我的代码上。查看(非常好的)接受的答案,它应该告诉你几乎所有你需要知道的。您不能相信单个 GPS 定位,您必须在一段时间内过滤和汇总数据,以便为您的应用程序提供强有力的位置指示。 @DanWray,感谢您的及时评论,让我检查接受的答案。 【参考方案1】:

我从事 GPS 硬件方面的工作已经 7 年多了。准确度读数也不是 100% 准确的。 制造商说明精度以及用于测量它的系统。 CEP、RMS、2DRMS 和 R95 是其中的一些系统。 阅读本文了解更多信息:http://en.wikipedia.org/wiki/Circular_error_probable

准确度数字不包括异常值。例如,如果规定精度为 5 米,则在良好信号条件下读取的读数在 95% 的情况下最大误差为 5 米。剩下的 5% 读数或在不良信号条件下读取的读数无话可说。防止这些异常值是使基于位置的良好应用程序脱颖而出的特殊方法。

你可以做的一些事情是:

    过滤出疯狂的高速。利用高度作为在飞机上的提示。 关联来自运动传感器的信息,看看它们是否符合 全球定位系统。运动传感器特征在稳定状态下会有很大不同 并且在运动中。 GSM/3G 小区的典型尺寸在市区不到一公里 人烟稀少的地区和5-10公里。如果 车辆高速移动了一段时间,手机信号塔 信息还是一样,你就知道有问题了。 GPS 定位是否前一秒读北,下一秒也读南 高速?如果是,则很可能是 GPS 错误。 检查 GPS 计算中使用的卫星数量。 12 是优秀的,9 是健康的,5 或更少是差,4 是最低纬度,经度 + 海拔 计算,3 是纬度,经度计算的最低要求。任何小于 3 的都不是有效读数。如果卫星数量多,您可以对数据的有效性更有信心。

【讨论】:

很有帮助。我也一直在使用 GPS 应用程序,我通常使用的第一个准确度指标是卫星数量。在 Android 的案例中,我忽略了卫星计数可通过 getExtras() 方法获得,并且一直依赖以米为单位的报告精度作为我的置信水平。我会考虑您的 cmets 并尝试改进我的代码,谢谢。 非常正确。 Android 文档还很好地描述了位置提供程序的工作方式以及如何过滤不准确的位置。 developer.android.com/guide/topics/location/strategies.html @Dojo 感谢您提供如此广泛的回答。请你给我指出正确的方向吗?我需要使用 gps 计算低级 android 设备上车辆支架的距离,通常为 10-25 公里,但在一次此类会话中精度不低于 0.5-0.8 公里。对于这种情况,您的预防措施是否足够?或者我需要使用更高级的滤波技术,比如卡尔曼滤波(我听说过)。提前致谢! @Dojo 我正在使用 iPhone 获取 GPS 值。拍摄期间报告的速度非常低(1-15 mph),但如果我手动计算速度(两点之间的直线距离/时间),结果为 250-350 mph。手机的gps在如此高的速度下是否会出现故障并报告不准确的数据? @nr5 您是否在将 GPS 消息纳入计算之前检查其有效性?一种可能性是 GPS 信号不好,导致位置暂时无法更新,因此您获得旧位置,然后突然设备获得有效修复并获得当前位置。所以对于你的算法,看起来位置变化发生在 1 秒内。对于所有此类计算,仅使用有效的 GPS 定位。【参考方案2】:

GPS 设备是定位速度计,基于接收器的距离 自上次测量以来已移动。它的速度计算不是 与车辆的车速表存在相同的误差源 (车轮尺寸、传动/传动比)。相反,GPS 的位置 精度,因此其计算速度的精度,是 取决于当时的卫星信号质量。速度 在更高的速度下,计算将更准确,当比率 位置变化的位置误差较低。

来自***。

或许您应该在信号强度好的地方试试这个。

【讨论】:

明白,感谢您的评论。我已经编写了同样的应用程序来在黑莓手机上运行,​​并且在 WinMo 和 WP7 上运行类似的应用程序,我从来没有遇到过速度与 GPS 准确性的问题。正如您从代码中看到的那样,我不会接受精度 我不知道手机之间的差异,但是当我尝试不同的位置时,我在 iPhone 上遇到了同样的问题。 GPS 精度只有几米的地方,我们的速度精度非常好,但在 50 米精度的地方,我们的速度精度很差。而且就像报价解释的那样,它完全基于位置估计,速度是通过之前的位置估计和当前的位置估计以及时间差来计算的。 确实,这就是我的问题 - 修复精度很高的开放户外位置报告的速度很愚蠢。我将尝试通过比较连续位置与经过的时间来手动确定速度,但是感觉就像我正在复制应该已经完成​​的工作,我希望看到更好的结果并不高.无论如何感谢您的意见。 在网上搜索时,您会发现多个看似可靠的网站,称gps速度是通过delta设备的delta距离计算的。其他看似可靠的网站指出,多普勒效应用于直接计算来自一个 gps 修复的速度(并且不易出错),而无需求助于先前的修复。考虑到静止车辆上不准确的 gps 跳跃,这是完全有道理的。我认为第二个答案是正确的,并且使用了多普勒。但这可能取决于芯片组的功能?谁能详细说明一下?【参考方案3】:

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

补充一点,GPS_PROVIDER 在我所在的地区不起作用。 NETWORK_PROVIDER 可以,它是提供 200 米距离结果的那个。

【讨论】:

我很幸运能够使用 GPS_PROVIDER,但是即使使用 NETWORK_PROVIDER,我也能够看到比 200m 更准确的定位。您是否尝试过在一段时间内观察您的听众并寻求更好的准确性?有点类似于我上面的代码。当然,网络/wifi 覆盖范围在世界不同地区会有很大差异,因此您的体验可能与我的有所不同。 是的,我尝试找到最好的提供者、最好的精度和最好的标准,但是当我使用 GPS_PROVIDER 时,它不会返回任何位置结果。【参考方案4】:

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

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

在 gps 速度多普勒上谷歌,您会发现很多要阅读的内容。

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

/城市霍姆达尔

【讨论】:

以上是关于Android GPS定位速度不可靠的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中获取精确的 Android GPS 位置

如何获取Android设备用户移动的速度? Location.getSpeed 可靠吗?

在 Android Emulator 上模拟 GPS 速度和航向

具体解释Android定位

Android如何开启GPS定位服务?

android怎么获取用户所在地 csdn