Android GPS定位速度不可靠

Dan*_*ray 10 android location locationmanager

编写GPS日志应用程序〜

我发现报告的getSpeed()方法返回的值非常不可靠.我正在使用,过滤提供的位置以获得最佳准确度.即使在单位数精度水平下,返回的速度通常也非常高.当电话静止不动时,我们说的是200 mp/h(是的,我知道它以米/秒记录).LocationsLocationManagerLocationManager.GPS_PROVIDERonLocationChanged

我正在两个不同型号的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;
        }
}
Run Code Online (Sandbox Code Playgroud)

Doj*_*ojo 26

我已经在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个是最小的lat,lon +高度计算,3个是lat,lon计算的最小值.任何小于3都不是有效读数.如果staellites的数量很高,你可以对数据的有效性更加自信.

  • 很有帮助.我也一直在使用GPS应用程序,我通常使用的第一个准确度指标是卫星计数.在Android的情况下,我忽略了通过getExtras()方法可以获得卫星计数,并且依赖于以米为单位的报告精度以获得我的置信水平.我会考虑您的意见并尝试改进我的代码,谢谢. (3认同)
  • 非常的.Android文档还非常好地描述了locaiton提供程序的工作方式以及如何过滤不准确的位置.http://developer.android.com/guide/topics/location/strategies.html (2认同)