【问题标题】:Android GPS Coordinates ScatteredAndroid GPS 坐标分散
【发布时间】:2012-12-21 13:02:04
【问题描述】:

下面的代码似乎工作正常:

    // GPS Reader
    // Criteria
    Criteria criteria = new Criteria();
    //criteria.setAccuracy(Criteria.ACCURACY_COARSE); // Used when we can't get a GPS Fix
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Used when we can get a GPS Fix

    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);

    LocationListener locationListener = new MyLocationListener();
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 0, 0,
            locationListener);

但是,当我在谷歌地图上绘制我收集的数据时,GPS 坐标在某些情况下非常分散,或者它会沿着我正在行走的路径前进,然后突然跳转到一个点一英里外然后回来。有没有什么办法解决这一问题?我猜是某种准确性检查?

更新

基本上我的问题看起来像这样 - GPS Jitter

更新 2

我考虑过不要把它作为赏金,但我想我不妨完全了解这里发生的事情,看看我的方法是否过度杀戮。尽管我的精度为 3m 等,但我仍然遇到同样的问题,即我的坐标中有抖动。现在这可能是可用的卫星等。我不知道,但基本上我想了解如何所有这些其他应用程序,尤其是运动应用程序,是否能够在相同的情况下获得如此流畅的读数。

我在 Quora 上找到了这个 Does any running app have a feature of filtering GPS data to get more accurate tracking? 不幸的是,它并没有对我的问题提供太多洞察,除非你可以根据需要使用卡尔曼滤波器,但肯定有不太复杂的方法,因为我怀疑大多数应用程序都实现了这一点。

无论如何,如果有开发人员想分享他们正在用一些伪代码做的事情,我们将不胜感激。我的意思是,如果我坚持使用 Kalman,我会坚持下去,但我确信必须有更容易实现的算法,并且希望学习这些算法以及如何实现它们,这很合适。

上下文:这是一个移动行人应用程序。

我试图从中收集信息的相关 SO 问题 Create a smooth curve from a series of GPS coordinates Smooth gps data :这是一个好的开始,虽然我不确定我需要实现什么伪代码才能正确地让最小二乘拟合正常工作,这样我就会有一个样条 GPS 数据,然后我可以在谷歌之类的东西上查看地图以确认我做对了。我认为问题在于,如果这是我正在处理的一般 X 和 Y 数据,而不是 GEO 坐标,我可以在 matlab 中写一些东西来测试它,然后继续。

更新 3

我收到的混乱 GPS 数据的图像 https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

代码 https://gist.github.com/4505688

【问题讨论】:

  • 您的功率要求和准确性似乎相互矛盾。为您提供 ACCURACY_FINE 结果的唯一提供者是 LocationManager.GPS_PROVIDER。你为什么不直接使用它而不是像这样创建某种标准:locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, MyLocationListener)?
  • 另外,也可能是因为设备不在露天/其他原因导致修复接收延迟。
  • 好的,我会回到那个状态——因为我最初有那个设置,但认为标准会做得更好,明天再试一次。关于开放天空的注意事项 - 我在运行测试时处于开放天空区域 - 但是当我运行像 mapmywalk 这样的程序时,没有散射。
  • 好的,我实现了,然后我记录了收集到的每个数据点的准确性。他们都回来了不到 10 米,但我仍然遇到和以前一样的问题 - 虽然也使用 GPS 的运动步行应用程序不存在这个问题。
  • 你的位置跳了多少米? (分散)

标签: android geolocation gps


【解决方案1】:

GPS 数据本身容易出错。即使您正确设置了所有 LocationManager(并且看起来像您所做的那样),您也会在位置中看到偶尔的抖动。

准确度

需要注意的一点是,GPS 精度只能让您估计接收到的 GPS 信号的计算效果。系统误差可以为您提供良好的准确度数( 100m),但在较低级别上,它只是给您一个计算收敛的指示。

过滤

过滤和很多事情一样,如果你做的越少越好。准确度过滤器应该能够消除较大的错误,如果您最终得到一个好的阈值,您可能能够获得平滑的数据。

如果您对正在运行的应用程序的位置变化设置一个阈值,您也可能会获得一些好处。例如,跑步者只能随着时间的推移跑过一定的距离,通过设置上限(Usain Bolt Cutoff),您应该能够消除坏点。问题在于,如果您的第一点是错误,您最终会删除所有其他点。

卡尔曼滤波器

卡尔曼滤波器是一个很好的解决方案,我已经在我正在开发的导航应用上实现了它。结果非常合理,甚至可以在 GPS 故障或不可用的情况下进行有限的航位推算。不幸的是,我不能分享源代码,但如果你决定这样做,我可以给你一些指导。最好的结果来自一个 6 DoF 滤波器,您可以在其中计算加速度和速度并使用它来估计位置。这不是最简单的解决方案,但我们已经看到了很好的结果。

最小二乘法

卡尔曼滤波器非常棒,因为它可以实时用于过滤位置。它跟踪自己的状态,您不需要存储旧位置。但另一方面,如果您想对路线进行后处理,最小二乘拟合是一种最佳方式。 (卡尔曼源自 LSQ 公式)。我没有做很多后期处理,但我怀疑我可以在上面挖掘一些旧教科书。然而,理论应该是相同的。

大多数 GPS 设备都非常好,从我看到的所有测试来看,我并不经常看到您在示例中看到的抖动。但是,我实施卡尔曼滤波器的一大优势和原因是您的行驶距离和速度计算更加准确

【讨论】:

  • "问题在于,如果您的第一点是错误,您最终会删除所有其他点。"经典问题,让我抓狂
【解决方案2】:

您得到的是因为您的标准将最佳提供商标识为NETWORK_PROVIDER。 它不会识别您的位置,而是为您提供覆盖您设备的手机信号塔的位置。因此,当您在任何建筑物之外时,最好使用GPS_PROVIDER 来获得精确的地理位置。为什么你会分散坐标是因为您的设备进入另一个蜂窝塔的范围,因此发生位置跳跃。直接使用GPS_PROVIDER 是您将获得的最佳解决方案。

【讨论】:

  • 我应该补充一点,感谢 Nitin 的建议,我确实只使用 GPS 实现如下: // GPS 阅读器 LocationListener locationListener = new MyLocationListener(); LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);但问题依然存在。
  • 感谢您的见解,不幸的是由于考试没有在我的SO问题之上,但基本上从中得到了一些提示,stackoverflow.com/questions/6181704/…,我仔细研究了另一个程序实现https://github .com/marcfasel/LocationMapper。我相信这个问题是因为我正在使用其他一些类来处理位置管理器,我在没有这个类的情况下重新实现了它,而且一切似乎都运行良好。现在需要优化电池寿命。多谢你们! :)
  • 非常感谢。简单而伟大的解释。修复了我的直接问题。我开始考虑使用 Kalman 和 blahblahblah 重新过滤传入数据,最后,这只是位置数据提供商选择问题。太好了!
  • 对于使用 Skobbler 的人,当您使用参数(true、false、false)调用 requestLocationUpdates 时禁用 NETWORK_PROVIDER 和 PASSIVE_PROVIDER developer.skobbler.com/docs/android/2.1.0/com/skobbler/ngx/…
【解决方案3】:

查看 Reto Meier 的 this 文章(包含代码)。它应该给你很多信息来思考。您至少应该设置最小距离和时间参数。

lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 5000, 20,
        locationListener);

您还可以组合多个提供商以获得目前可以得到的最佳坐标。祝你好运!

【讨论】:

  • 我会再次尝试标准设置,看看会产生什么结果。
  • 我执行了您的建议,但仍然遇到 GPS 散射问题 - 见下图 - dropbox.com/s/ilsf8snao2no65e/gpsdata2.png 蓝色路径是真实路径 - 但红色是 GPS 记录的路径。
  • 那么这个坐标的准确性怎么样?你也可以用地图绘制它吗?如果你愿意的话,你可以把你的 Skype 发给我,我想我会在这种情况下帮助你。
【解决方案4】:

一种简单的方法是丢弃任何旧的或不准确的数据,并保持经度和纬度的运行平均值。

private static final long WILDLY_OUT = 15;
private static final long TOO_OLD = 30000;
private static final long NO_SAMPLES = 5;

double lastLocationTime;

double calclongitude(Location location, double oldLongitude) {
    double newLongitude = oldLongitude;

    if (location.getAccuracy() < WILDLY_OUT) {
        newLongitude = (NO_SAMPLES * oldLongitude + location
                .getLongitude()) / (NO_SAMPLES + 1);
        lastLocationTime = System.currentTimeMillis();
    }

    if (lastLocationTime > TOO_OLD) {
        newLongitude = location.getLongitude();
    }

    return newLongitude;
}

对纬度做同样的事情。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多