我试图计算物理设备的速度
在google中我得到了
使用via CLLocationManager
//我不想使用
使用UIAccelerometer
类:DEPECRATED
到目前为止我已尝试过这样的
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 我怎样才能从中计算速度?
答案 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初始化为正确的值。