iOS使用Core Motion计算设备的速度

时间:2018-04-16 09:45:35

标签: ios swift core-motion

我试图计算物理设备的速度

在google中我得到了

  1. 使用via CLLocationManager //我不想使用

  2. 使用UIAccelerometer类:DEPECRATED

  3. 到目前为止我已尝试过这样的

        func coreMotion() { // CALLING FROM VIEW DID LOAD
                if self.motionManager.isDeviceMotionAvailable {
                   self.motionManager.deviceMotionUpdateInterval = 0.5
                   self.motionManager.startDeviceMotionUpdates(to: OperationQueue.current!,
                                                               withHandler: { [weak self] (deviceMotion, error) -> Void in
    
                        if let error = error {
                            print("ERROR : \(error.localizedDescription)")
                        }
    
                        if let deviceMotion = deviceMotion {
                            self?.handleDeviceMotionUpdate(deviceMotion)
                        }
                   })
                } else {
                    print("WHAT THE HELL")
                }
            }
    
     func handleDeviceMotionUpdate(_ deviceMotion: CMDeviceMotion) {
            let attitude = deviceMotion.attitude
            let roll = self.degrees(attitude.roll)
            let pitch = self.degrees(attitude.pitch)
            let yaw = self.degrees(attitude.yaw)
            let accl = deviceMotion.userAcceleration
            self.calculateSpeed(accl)
            self.previousAccl = accl
            print("Roll: \(roll), Pitch: \(pitch), Yaw: \(yaw)")
            print("ACCELRATION: \(accl.x) \(accl.y) \(accl.z)")
        }
    
        func degrees(_ radians: Double) -> Double {
            return 180 / Double.pi * radians
        }
    

    我也获得了加速对象,即userAcceleration 我怎样才能从中计算速度?

1 个答案:

答案 0 :(得分:1)

要计算设备的速度,您有两种可能:

1 - 通过近似位置的导数函数:有两个位置,两个位置之间的时间可以估算速度。

2 - 或计算加速度的基元。但是考虑到只有当你知道速度àt_ 0 (你的措施开始)时,这种方法才会给你正确的速度值

但如果您坚持使用加速进行,您可以在t_i计算速度(其中i是您从加速度计收到的更新次数)

速度(t_ i )=速度(t_ i-1 )+加速度(t_ i )*(t_ i - t_ i-1 ) 和速度(t_ 0 )应该是已知的

你必须在加速计的每次更新时这样做 speed = speed + acceleration * (lastUpdateTime - currentTime)

[编辑]

这确实就像你在评论中提到的只有一个维度,如果你想计算所有三个维度的速度,你必须为每个轴做三次这样的

speedX = speedX + accelerationX * (lastUpdateTime - currentTime)

speedY = speedY + accelerationY * (lastUpdateTime - currentTime)

speedZ = speedZ + accelerationZ * (lastUpdateTime - currentTime)

您需要了解t_ 0 的speedX / Y / Z,以便将var初始化为正确的值。