Swift: CoreMotion 设备没有移动但正在记录加速度
Swift: CoreMotion device is not moving but recording accelerations
这是我的 CM 代码:
func checkMotion(_ myMotionManager:CMMotionManager) -> Bool {
//check to see if core motion is available
var isCoreMotionAvailable = myMotionManager.isAccelerometerAvailable
isCoreMotionAvailable = myMotionManager.isGyroAvailable
isCoreMotionAvailable = myMotionManager.isMagnetometerAvailable
isCoreMotionAvailable = myMotionManager.isDeviceMotionAvailable
if isCoreMotionAvailable {
myMotionManager.deviceMotionUpdateInterval = 0.25
myMotionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: checkMotionUpdate)
}
return false
}
并检查数据:
func checkMotionUpdate(data: CMDeviceMotion?, error:Error?) {
if error != nil {
print(error!.localizedDescription)
} else {
if let motionData = data {
//check to see if we have a base point and if not store one
if !bHasBasePoint {
basePoint = motionData
bHasBasePoint = true
print("Basepoint:\(basePoint!)")
}
print("Acceleration X: \(motionData.userAcceleration.x)")
print("Acceleration Y: \(motionData.userAcceleration.y)")
print("Acceleration Z: \(motionData.userAcceleration.z)")
print()
}
}
}
和一些结果:
基点:
Basepoint:QuaternionX 0.011783 QuaternionY -0.461725 QuaternionZ 0.000044 QuaternionW 0.886945 UserAccelX 0.006458 UserAccelY 0.000324 UserAccelZ 0.002740 RotationRateX 0.000997 RotationRateY -0.001316 RotationRateZ -0.001370 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ 0.000000 MagneticFieldAccuracy -1 Heading -1.000000 @ 73807.821537
一些加速检查:
Acceleration X: 0.00645828247070312
Acceleration Y: 0.0003238245844841
Acceleration Z: 0.00274038314819336
Acceleration X: 0.00522691011428833
Acceleration Y: 0.000595645979046822
Acceleration Z: 0.00370562076568604
Acceleration X: 0.00506830215454102
Acceleration Y: 0.000180358067154884
Acceleration Z: 0.0017169713973999
Acceleration X: 0.00555837154388428
Acceleration Y: -0.00128581002354622
Acceleration Z: 0.00320953130722046
Acceleration X: 0.00509798526763916
Acceleration Y: -4.2034313082695e-05
Acceleration Z: 0.00197714567184448
所以我是 CM 编码的新手(第 2 天),我有点困惑为什么当 iPhone 现在正坐在摇篮中时我看到 x、y 和 z 的加速度变化?这是预期的行为吗?是否存在我应该作为误报而忽略的加速范围?
所以,也许您现在找到了关于它的其他信息。但由于尚未回答:
一般情况下,由于设备处于静止状态,所以有一些运动记录是正常的。有两个原因:一个是传感器本身产生了一些误差噪声,另一个是传感器在一个轴上(或更实际地在轴之间分割)朝向我们生活的星球。现在这个引力部分被过滤器分离了,但这也引入了一些错误。
传感器本身的误差应该随机产生负误差和正误差,移动平均值应该消除这些影响(f.e。你的 Y 轴似乎没有受到重力分裂的影响和线性加速度,我猜它几乎会完全抵消某些值)。所以你应该已经通过对一些过去的值进行平均来获得更好的值。
从您获得的读数来看,通常有 2 个轴的值稍高。我猜它们是从引力分裂中出现的,而你的 phone 是静止的,但可能有点倾斜,因为在 gradle.
现在虽然0.00something不低,但也不是最高的错误。您可以通过查找 Wikipedia Magnitude or maybe this side for earthquakes where they show what acceleration is needed to have it felt by a human ;) Wikipedia Ground Acceleration.
等参考文献来了解这些值的含义
我不知道苹果用什么来分裂重力,但我记得它至少在前一段时间还不是最好的过滤器,但对于 UI 东西来说足够快和有用了。但 ARKit 可能会改变这种情况。因此,如果您需要更准确的拆分,也许可以根据原始引力实现另一个过滤器。
希望对您有所帮助。
这是我的 CM 代码:
func checkMotion(_ myMotionManager:CMMotionManager) -> Bool {
//check to see if core motion is available
var isCoreMotionAvailable = myMotionManager.isAccelerometerAvailable
isCoreMotionAvailable = myMotionManager.isGyroAvailable
isCoreMotionAvailable = myMotionManager.isMagnetometerAvailable
isCoreMotionAvailable = myMotionManager.isDeviceMotionAvailable
if isCoreMotionAvailable {
myMotionManager.deviceMotionUpdateInterval = 0.25
myMotionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: checkMotionUpdate)
}
return false
}
并检查数据:
func checkMotionUpdate(data: CMDeviceMotion?, error:Error?) {
if error != nil {
print(error!.localizedDescription)
} else {
if let motionData = data {
//check to see if we have a base point and if not store one
if !bHasBasePoint {
basePoint = motionData
bHasBasePoint = true
print("Basepoint:\(basePoint!)")
}
print("Acceleration X: \(motionData.userAcceleration.x)")
print("Acceleration Y: \(motionData.userAcceleration.y)")
print("Acceleration Z: \(motionData.userAcceleration.z)")
print()
}
}
}
和一些结果:
基点:
Basepoint:QuaternionX 0.011783 QuaternionY -0.461725 QuaternionZ 0.000044 QuaternionW 0.886945 UserAccelX 0.006458 UserAccelY 0.000324 UserAccelZ 0.002740 RotationRateX 0.000997 RotationRateY -0.001316 RotationRateZ -0.001370 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ 0.000000 MagneticFieldAccuracy -1 Heading -1.000000 @ 73807.821537
一些加速检查:
Acceleration X: 0.00645828247070312
Acceleration Y: 0.0003238245844841
Acceleration Z: 0.00274038314819336
Acceleration X: 0.00522691011428833
Acceleration Y: 0.000595645979046822
Acceleration Z: 0.00370562076568604
Acceleration X: 0.00506830215454102
Acceleration Y: 0.000180358067154884
Acceleration Z: 0.0017169713973999
Acceleration X: 0.00555837154388428
Acceleration Y: -0.00128581002354622
Acceleration Z: 0.00320953130722046
Acceleration X: 0.00509798526763916
Acceleration Y: -4.2034313082695e-05
Acceleration Z: 0.00197714567184448
所以我是 CM 编码的新手(第 2 天),我有点困惑为什么当 iPhone 现在正坐在摇篮中时我看到 x、y 和 z 的加速度变化?这是预期的行为吗?是否存在我应该作为误报而忽略的加速范围?
所以,也许您现在找到了关于它的其他信息。但由于尚未回答:
一般情况下,由于设备处于静止状态,所以有一些运动记录是正常的。有两个原因:一个是传感器本身产生了一些误差噪声,另一个是传感器在一个轴上(或更实际地在轴之间分割)朝向我们生活的星球。现在这个引力部分被过滤器分离了,但这也引入了一些错误。
传感器本身的误差应该随机产生负误差和正误差,移动平均值应该消除这些影响(f.e。你的 Y 轴似乎没有受到重力分裂的影响和线性加速度,我猜它几乎会完全抵消某些值)。所以你应该已经通过对一些过去的值进行平均来获得更好的值。
从您获得的读数来看,通常有 2 个轴的值稍高。我猜它们是从引力分裂中出现的,而你的 phone 是静止的,但可能有点倾斜,因为在 gradle.
现在虽然0.00something不低,但也不是最高的错误。您可以通过查找 Wikipedia Magnitude or maybe this side for earthquakes where they show what acceleration is needed to have it felt by a human ;) Wikipedia Ground Acceleration.
等参考文献来了解这些值的含义我不知道苹果用什么来分裂重力,但我记得它至少在前一段时间还不是最好的过滤器,但对于 UI 东西来说足够快和有用了。但 ARKit 可能会改变这种情况。因此,如果您需要更准确的拆分,也许可以根据原始引力实现另一个过滤器。
希望对您有所帮助。