如何在Android中从GPS获得准确的速度?
是的,我知道location.getSpeed()
课程中的Location
方法。问题是,默认实现返回0.0作为速度:显然是that is the default behavior。
我目前正在做的事情,如下所示,考虑位置对象a和b,首先拍摄a,b后面:
a.distanceTo(b)/(b.getTime()-a.getTime());
(为便于阅读而简化,原始代码处理历史记录ArrayList
)
问题在于这有点不准确:在正常情况下,数据点彼此非常接近,导致GPS不准确性成为问题。我需要降低更新频率或计算相对于更远点的速度。前者我不想这样做,因为我想尽可能高的频率,但也许我可以根据彼此的距离过滤点来计算速度?
我假设getSpeed()
方法的最佳解决方案是计算GPS卫星本身的速度,从而获得更准确的结果。
我是否以某种方式使用getSpeed()
错误?
答案 0 :(得分:0)
既然你保留了历史,为什么不......
获取当前位置和时间
找出当前和最后的速度~10
取结果的平均值
答案 1 :(得分:0)
使用您说明的公式来确定平均速度,但要确保您的两个点在一条直线上。您可以通过调用Location.getBearing()来查看用户是否仍在朝同一方向行进。如果距离足够近,你可以假设它们是直线行进的。如果不只是丢弃结果。
请记住,此速度会受到停车标志或停车灯等任何停车的影响。尽可能经常采样并丢弃任何明显的异常值。
答案 2 :(得分:0)
模拟器显然总是以速度回答0,但真实设备 不应该。你在真实设备上有同样的问题吗? - 斯特凡 3月20日8:21
Stefan的回答其实是正确的。显然,仿真器没有提供速度,因为GPX文件输入中没有包含测试数据。因此,如果您想要显示速度,在真实设备上进行测试并进行慢跑,它将起作用(对于大多数设备而言)。
以下是其他检测速度的方法的一些想法,但不是严格相关的,但如果你正在使用GPS,可能会很有趣。
由于GPS的相对不准确性,特别是在慢速或弯曲的道路上,速度难以计算:数据点之间的距离是如此短暂,GPS不准确性发挥作用,或者长时间不变直接。此外,如果计算速度的数据点之间的最小距离很长,则在较慢的速度下,更新间隔成为问题。 有一些解决此问题的方法,例如使用getAccuracy()方法计算数据点之间的最小安全距离并动态使用它,根据最大加速度和减速度值,移动方向等过滤数据点。您还可以计算滚动平均值以平息变化,并很好地了解它是什么。
即使您不根据所覆盖的距离计算速度,上述方法也可能有用,因为即使您正在移动,GPS似乎也会将速度恢复为0。我使用F1赛车的加速/减速数据作为过滤器:)