2012-03-19 195 views
3

如何从Android中获取GPS的准确速度? 是的,我知道Location类中的location.getSpeed()方法。问题是,默认实现返回0.0作为速度:显然that is the default behavior如何在Android中获取GPS中最准确的速度

什么我目前正在做的,如下,考虑位置对象A和B,其中A为第一考虑,B后:

a.distanceTo(b)/(b.getTime()-a.getTime()); 

(简化可读性,历史ArrayList原代码协议)

问题是这样做有些不准确:在正常情况下,数据点彼此非常接近以至于GPS误差确实成为问题。要么我需要减少更新频率或计算相对于更远点的速度。前者我不想这样做,因为我希望获得尽可能高的频率,但也许我可以根据它们相互之间的距离过滤点数来计算速度。 我假定采用getSpeed()方法的最佳解决方案是计算GPS卫星本身的速度,从而获得更准确的结果。 我使用getSpeed()错误吗?

+0

你好签证,我认为你应该包括精度参数的距离,当我们得到经纬度,从位置类登录,它不是100%准确的,位置类有方法命名“getAccuracy()”。它以米为单位返回int - 精度。你应该在计算中包含这个 – 2012-03-19 08:54:29

+0

模拟器显然总是以0的速度回答,但真正的设备不应该。你在真实设备上遇到同样的问题吗? – Stefan 2012-03-20 08:21:04

回答

0

模拟器显然总是以0的速度回答,但真正的设备 不应该。你在真实设备上遇到同样的问题吗? - Stefan Mar 20 at 8:21

Stefan的回答其实是正确的。显然,仿真器不能提供速度,因为它不包含在GPX文件输入中作为测试数据。所以,如果你想显示速度,在真实设备上测试并慢跑,它将工作(对于大多数设备)。

下面是其他一些检测速度的方法,但并不严格相关,但如果您使用GPS,可能会感兴趣。

由于GPS的相对不准确性,特别是在低速或弯曲的道路上,速度很难计算:数据点之间的距离如此短以至于GPS不准确,或者很长时间,当不移动时它变得不准确直行。另外,如果计算速度的数据点之间的最小距离很长,则在较慢的速度下,更新间隔会成为问题。 解决此问题的方法有很多,例如使用getAccuracy()方法计算数据点之间的最小安全距离并动态使用它,根据最大加速度和减速度值,移动方向等过滤数据点。你也可以计算一个滚动平均值来平息这些变化,并很好地理解这是什么。

即使您没有根据覆盖距离计算速度,上述方法也可能会有用,因为有时GPS似乎将速度恢复为0,即使在移动时也是如此。我使用F1汽车的加速/减速数字作为过滤器:)

0

由于您保持一个历史,为什么不......

获取当前位置和时间

找到当前和过去之间的速度〜10

把你的结果的平均值

0

使用你陈述的公式来确定平均速度,但确保你的两点是在一条直线上。您可以通过调用Location.getBearing()来查看用户是否仍然沿同一方向行进。如果距离足够近,则可以假设他们沿着直线行进。如果不是就放弃结果。

请注意,此速度会受到停止标志或停车灯等任何挡块的影响。尽可能经常抽样并丢弃任何明显的异常值。