Android的GPS坐标散(Android GPS Coordinates Scattered)

2019-07-17 23:18发布

我有以下的代码下面,这似乎是做工精细:

  // 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抖动

更新2:

我认为不使这个赏金,但我想我也可以得到什么是怎么回事的完整理解,看看也许我的做法是超必杀。 我仍然有我的坐标,在他们抖动尽管我有3米的精度,等等。现在,这可能是可用卫星,等等。我不知道同样的问题,但基本上我想了解在所有这些其他的应用,尤其是在运动应用程序,能够获得相同的情况下这种流畅的读数。

我在Quora上,并能够找到这是否所有正在运行的应用程序具有滤波GPS数据的功能来获得更准确的追踪? 遗憾的是它并没有提供多少洞悉了我的问题,但如果你愿意,你可以使用一个卡尔曼滤波器,但肯定必须有那么复杂的手段,因为我怀疑大多数应用程序在那里正在实现这一点。

不管怎么说,如果一个家伙开发商想与大家分享他们与一些伪代码,将不胜感激做什么。 我的意思是,如果我坚持与卡尔曼我,但我相信有必须要更容易实现的算法,并会希望了解那些和如何实现它们,这是体面的配合。

背景:这是一个移动应用程序的行人。

相关SO问题,我试图搜集信息,从 由一系列GPS的创建平滑曲线坐标 平滑的GPS数据 :这是一个良好的开端,但我不知道我需要实现正确得到最小二乘法拟合到什么伪适当的工作,让我将有一个花键GPS数据,然后我就可以在一些像查看谷歌地图来确认我正确地做到了。 我认为这个问题是如果这是一般的X和Y数据我正在处理,而不是地理坐标,我可以写在MATLAB测试的东西了,不管了。

更新3

一团糟的GPS数据,我recieving的图像https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

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

Answer 1:

你所得到的是因为你的标准确定最佳供应商为NETWORK_PROVIDER 。 这并不确定自己的位置,而是让你的手机信号塔,其范围覆盖了你的device.So当你是任何建筑的外面,最好是使用的位置GPS_PROVIDER获得地理locations.Why的细精度你零散合作纵坐标是因为你的设备进入到另一个手机信号塔的位置,因此会发生跳跃的范围。 直接使用GPS_PROVIDER将是你获得最佳的解决方案。



Answer 2:

GPS数据本身就容易出错。 即使你拥有所有的LocationManager设置正确(和它看起来像你这样做),你将看到的位置偶尔抖动。

准确性

有一点要注意的是,GPS的精确度只给你一个估计的计算是如何好给定的接收GPS信号。 系统误差可以给你一个良好的精度数(<10米),但仍然代表了很大的位置误差。 这就是为什么你会看到的抖动,即使你的准确度是非常好的。 精度的措施是好的,除去非常大的错误(> 100米),但在一个较低的水平,它只是给你一个迹象表明,计算收敛。

过滤

过滤,像许多事情,是最好的,如果你做的尽可能少。 精度过滤器应该能够去除大错误,如果你结束了一个良好的门槛你也许能获得平稳的数据。

如果你把位置变化的阈值运行的应用程序也可能会得到一些好处。 例如,一个亚军只能覆盖随着时间的推移,并通过设置上限阈值(博尔特截止),你应该能够删除坏点有一定的距离。 但问题是,如果你的第一点是你最终删除所有其他点的误差。

卡尔曼滤波

卡尔曼滤波器是一个很好的解决方案,我已经实现了它在我的工作的导航应用。 结果是非常合理的,它甚至允许在GPS是坏的或不可用情况下有限的航位推算。 不幸的是,我不能共享的源代码,但如果你决定走那条路,我可以给你一些指导。 最好的结果已经出来,从那里你计算加速度和速度,并用它来估计位置的6自由度过滤器。 这不是最简单的解决方案,但我们已经看到了它良好的效果。

最小二乘

卡尔曼滤波器是伟大的,因为它可以实时用于过滤的位置。 它跟踪自己的状态,而你并不需要保存旧的位置。 但在另一方面,如果你想进行后处理路线,最小二乘法拟合是去的最佳方式。 (卡尔曼从LSQ式得出)。 我没有做很多后期处理的,但我怀疑我可以在上面挖了一些旧课本。 这个理论应该是一样的,但是。

大多数GPS设备都非常好,从我所看到的,我不经常看你看到在你的榜样抖动的所有测试。 然而,一个很大的优势,为什么我实现了卡尔曼滤波器的原因是你的行驶距离和速度的计算更加精确



Answer 3:

检查此文章雷托•梅耶尔的(含代码)。 它应该给你大量的信息需要思考的问题。 你至少应该设置最小距离和时间参数。

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

您还可以结合几个供应商以获得最佳的坐标,您可以在瞬间。 祝好运!



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

做同样的纬度。



文章来源: Android GPS Coordinates Scattered