ios - 使用 iPhone GPS 运行时获得最准确的 "current pace"

标签 ios iphone swift gps accelerometer

当使用 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/

相关文章:

ios - 当应用程序在后台时如何检查位置?

iOS:添加新单元格时编辑StyleForRowAtIndexPath

iphone - iOS 7 后退按钮符号?

iphone - 如何计算 NSString 中大写字符的数量?

ios - Swift 中的事件指示器

ios - UNNotificationCategory 子类初始化问题

ios - 我真的需要导航 Controller 吗?

iphone - Settings.bundle 与 NSUserDefaults

swift - 如何在 spritekit 中缓存或预加载 SKLabelNode 字体

ios - 如何在 Xcode8 中手动设置配置文件?