objective-c – 检测到iphone被撞击的时间

前端之家收集整理的这篇文章主要介绍了objective-c – 检测到iphone被撞击的时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望能够检测到 iphone是否已被撞到某个东西……最好是听陀螺仪/加速度计并判断其移动的速度或突然移动和停止的速度.

事实上我如何判断设备是否已移动然后突然停止?

这个答案很棒但反过来iOS: Accurately determining energy of a bump from accelerometer output – 它可以平滑运动,如果有什么我想检测一个急剧的运动.

还有适用于3GS的陀螺仪和加速度计?

更新代码

来自Apple doc http://developer.apple.com/library/iOS/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html#//apple_ref/doc/uid/TP40009541-CH4-SW26

从加速度数据中隔离瞬时运动
如果您使用加速度计数据来仅检测设备的瞬时运动,则需要能够将突然的运动变化与恒定的重力影响隔离开来.你可以用高通滤波器做到这一点.

清单4-6显示了一个简化的高通滤波器计算.上一个事件的加速度值存储在类的accelX,accelY和accelZ成员变量中.此示例计算低通滤波器值,然后从当前值中减去它以仅获得运动的瞬时分量.

清单4-6从加速度计数据中获取瞬时移动部分

define kFilteringFactor 0.1

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Subtract the low-pass value from the current value to get a simplified high-pass filter
    accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)) );
    accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)) );
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );

   // Use the acceleration data.
}

如果检测到瞬时运动,我将如何“使用加速度数据”计算出来?

解决方法

正确的方法是在传感器融合后使用高通滤波器和线性加速度.检查Sensor.TYPE_LINEAR_ACCELERATION here,它适用于Android.据我所知,iPhone没有传感器融合.正如凯指出的那样,Core Motion提供传感器融合,请参阅下面的评论.

如果你有兴趣,这里是一个很好的video on sensor fusion,从32:10开始.

一个有点混乱的解决方法是使用高通滤波器并使用加速度计数据而无需传感器融合.如果碰到手机,你可能会在陀螺仪数据中出现尖峰,但根据我的经验,加速度计会更好,因为它们会检测到突然的速度变化.

它很乱,因为你可以通过快速旋转手机来欺骗它.

猜你在找的C&C++相关文章