我遇到了accelometer的问题。
如果设备平躺,我会得到(0,0,-1),这显然是不对的。当我旋转手机时,这个-1会移动到其他轴,具体取决于手机的位置。
到目前为止,我的代码非常简单:
override func viewDidAppear(_ animated: Bool) {
motionManager.accelerometerUpdateInterval = 0.1
motionManager.startAccelerometerUpdates(to: OperationQueue.current!){(data,error)
in
if let myData = data {
print(Double(myData.acceleration.y) )
}
答案 0 :(得分:6)
您正在访问原始加速度,其中包括重力。这意味着(0,0,-1)实际上显然是正确的。
如果你想要一些更稳定的东西(并且没有重力矢量),请使用设备动作。值得注意的是,使用传感器融合滤波方法对来自设备运动界面的数据进行过滤和稳定,因此加速度数据将更加准确。
import UIKit
import CoreMotion
class ViewController: UIViewController {
let motionManager = CMMotionManager()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
motionManager.deviceMotionUpdateInterval = 0.1
motionManager.startDeviceMotionUpdates(to: .main) { (motion, error) in
if let motion = motion {
var x = motion.userAcceleration.x
var y = motion.userAcceleration.y
var z = motion.userAcceleration.z
// Truncate to 2 significant digits
x = round(100 * x) / 100
y = round(100 * y) / 100
z = round(100 * z) / 100
// Ditch the -0s because I don't like how they look being printed
if x.isZero && x.sign == .minus {
x = 0.0
}
if y.isZero && y.sign == .minus {
y = 0.0
}
if z.isZero && z.sign == .minus {
z = 0.0
}
print(String(format: "%.2f, %.2f, %.2f", x, y, z))
}
}
}
}
顺便说一句,这都在the docs,第一段。
创建CMMotionManager实例后,应用程序可以使用它来接收四种类型的动作:原始加速度计数据,原始陀螺仪数据,原始磁力计数据和处理过的设备运动数据(包括加速度计,旋转速率和态度测量)。 Core Motion的传感器融合算法提供的经过处理的设备运动数据可以提供设备的姿态,旋转速率,校准磁场,重力方向以及用户赋予设备的加速度。