当使用 RunKeeper 或 Nike+ 运行时,当前配速跳跃很多(以 4.30/km 的速度运行时显示 4-5 分钟/km,而整体距离和平均配速相当不错。
我开始开发自己的运行应用程序,并注意到他们可能正在使用直接来自 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+ 和带有 Styrd footpod(据说非常准确)的 Garmin Fenix 3 watch 时测试代码。
_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+ 记录 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 {
但是我需要 40 才能在城市中使用我的 iPhone 7+ 很明显,我宁愿没有更新,也不愿得到 40m 错误的更新
将 distanceFilter 设置为例如 10
_locationManager.distanceFilter = 10.0
这两种想法都会影响将生成的位置更新的数量。这反过来会使运行者看起来更“直线”,更少抖动。这将使距离更短,这正是我们想要的。但对于平均运行轨迹来说,它是否具有平衡的准确性?小转弯不会被拾起。它会比 * 0.81 方法更准确吗?
我今天可能会尝试
_locationManager.distanceFilter = 10.0
if location.horizontalAccuracy <= 20
看看它会把我带到哪里。
关于ios - 使用 iPhone GPS 运行时获得最准确的 "current pace",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43980198/