Ios 使用iPhone GPS跑步时获得最准确的“当前速度”

Ios 使用iPhone GPS跑步时获得最准确的“当前速度”,ios,iphone,swift,gps,accelerometer,Ios,Iphone,Swift,Gps,Accelerometer,当使用RunKeeper或Nike+跑步时,当前的配速跳跃很多,以4.30/km的速度跑步时,从4-5分钟/公里不等,而整体距离和平均配速相当不错 我开始开发自己的跑步应用程序,并注意到他们可能直接使用CLLocationManager中的数据。以下是我的Swift 3代码,在当前配速下获得与Nike+相似的结果 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation

当使用RunKeeper或Nike+跑步时,当前的配速跳跃很多,以4.30/km的速度跑步时,从4-5分钟/公里不等,而整体距离和平均配速相当不错

我开始开发自己的跑步应用程序,并注意到他们可能直接使用CLLocationManager中的数据。以下是我的Swift 3代码,在当前配速下获得与Nike+相似的结果

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    for location in locations {

        print("GOT LOCATION \(location)")

        if location.horizontalAccuracy < 20 {

            if self.locations.count > 0 {

                distance += location.distance(from: self.locations.last!)
            }
            self.locations.append(location)
        }
    }
}
获得更好的当前速度的最佳方法是什么?如果有帮助的话,目前的配速可以延长到最后30秒。最大误差应为+-5秒/公里或尽可能小

进度更新

我正在使用以下设置,并在手机上同时使用Nike+和Garmin Fenix 3手表进行跑步测试,据说这款手表的Styrd脚垫非常精准

_locationManager.desiredAccuracy = kCLLocationAccuracyBest
_locationManager.activityType = .fitness
_locationManager.distanceFilter = kCLDistanceFilterNone
然后在locationmanager中:

if location.horizontalAccuracy < 40 {
    distance += location.distance(from: savedLocations.last!)
}
这些比率在整个跑步过程中都保持不变,因此当Nike+记录5公里时,我的代码记录6公里

由于GPS定位通常具有较低的实际水平精度,因此需要进行一些额外的操作才能获得真正准确的距离。我想看看如果我简单地调整比率,使之与Nike+保持一致,即10/12,3=0.81的比率,会发生什么

所以我把代码改成

distance += location.distance(from: savedLocations.last!) * 0.81
昨天跑了同样的10公里。这次我得到了结果:

My code 9.04 km (or 11.16 if I wouldn't have used * 0.81)
Nike+ 10.00 km
Garmin 9.66 km
所以,这次的比率实际上是0.9,而不是0.81。因此,Nike+肯定还有其他功能

最令人沮丧的事实是,我的代码第一次记录了12.3公里,第二次记录了11.16公里

想法:

增加或降低所需精度的值

if location.horizontalAccuracy < 40 {
这两种想法都会影响将生成的位置更新的数量。这反过来又会使跑步者看起来更直线,更少抖动。这将缩短我们想要的距离。但是,对于平均跑步轨迹来说,这是一个很好的平衡精度吗?小转弯不会被拾取。*0.81方法是否更准确

我今天可能会和你一起试试

_locationManager.distanceFilter = 10.0
if location.horizontalAccuracy <= 20 

看看这会把我带到哪里。

不,对不起。我放弃了。你有什么想法吗?
_locationManager.distanceFilter = 10.0
_locationManager.distanceFilter = 10.0
if location.horizontalAccuracy <= 20