当使用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秒/ km(或尽可能小)
答案 0 :(得分:1)
进展更新
我使用以下设置,并且在我的手机上同时使用Nike +和使用Styrd脚垫的Garmin Fenix 3手表(据说超精确)时测试代码。
_locationManager.desiredAccuracy = kCLLocationAccuracyBest
_locationManager.activityType = .fitness
_locationManager.distanceFilter = kCLDistanceFilterNone
然后在locationmanager:
if location.horizontalAccuracy < 40 {
distance += location.distance(from: savedLocations.last!)
}
使用此代码,与Nike +和Garmin相比,距离增加了20%。
My code 12.3 km
Nike + 10.01 km (running simultaneously on the phone, getting the same GPS updates)
Garmin 9.75 km
这些比率在整个运行期间保持不变,所以当Nike +记录5km时,我的代码记录了6km。
由于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 {
然而,我需要40才能在我的iPhone 7+上在城市中运作良好 显然,我不会得到比40米错误更新的更新
将distanceFilter设置为例如10
_locationManager.distanceFilter = 10.0
这两个想法都会影响将生成的位置更新的数量。这反过来将使跑步者看起来更直接&#34;更少的抖动。这将使距离缩短,这是我们想要的。但对于平均跑步路线来说,它是否具有良好的平衡精度?小转弯不会被捡起来。 * 0.81方法会更准确吗?
我今天可能会尝试
_locationManager.distanceFilter = 10.0
if location.horizontalAccuracy <= 20
然后看看我的位置。