我正在为iPhone运行一个相当简单的旅行应用程序,以便在跑步,骑自行车等时使用。
我想要实现的功能之一是里程表。
我通过didUpdateToLocation定期获取该位置。
我已经尝试过测量newLocation和oldLocation之间的距离并累积结果,但这不是很准确。累积值通常远大于实际行进距离。
我可以使用什么算法来提高计算的准确性?
答案 0 :(得分:1)
听起来不好的GPS信号正在移动您设备的(报告的)位置,您的应用程序会将其解释为用户不断改变方向。也许它有助于将运动从一个位置分离到下一个位置到x和y分量,并通过某种低通滤波器运行它们。这应该可以最大限度地减少“错误”更新的影响,这些更新会将您的位置完全移出实际路径。
答案 1 :(得分:1)
我正试图弄明白这一点,并认为可以使用CLLocationManager
distanceFilter
属性完成某些操作。该属性允许您将didUpdateToLocation
委托调用限制为与上一次更新至少保持最小距离的更新。例如,在里程表问题上,假设你站着不动,但是gps不稳定地报告你身边1米的位置。如果将distanceFilter
设置为2,则这些更新都不会被注册为移动。
诀窍是找到一个有效的distanceFilter
值,我相信这与GPS的horizontalAccuracy
有某种关系(我认为这是导致错误更新的原因)你旅行的速度。 horizontalAccuracy
对于户外活动应该是好的,但假设这些小的不准确性会累积并导致里程表读数不正确。
如果每次拨打didUpdateLocation
都会引入少量错误(例如,每次阅读最多10厘米),那么如果每个电表都拨打电话,那么行走等慢速活动就会非常不准确didUpdateToLocation
。这将达到(10cm / 1m =)每次更新错误的10%。如果这是在一辆以100公里/小时的速度行驶并且distanceFilter
被设定为10米的车辆(这是一个安全的设置,因为以100公里/小时的速度行驶的车将非常接近直线超过10米),那么相同的10cm误差每次更新最多只有(10cm / 10m =)1%误差。它可能比这更复杂,但我试图说明速度起作用。
我认为解决方案是为distanceFilter
选择一个最小化错误更新的值,但最重要的是考虑用户的速度(例如上一个例子中的汽车)。有人想找出算法或公式吗?