检测iphone被撞击的时间

dai*_*dai 7 objective-c accelerometer gyroscope

我希望能够检测到iphone是否已被撞到某个东西......最好是听陀螺仪/加速度计并判断其移动的速度或突然移动和停止的速度.

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

这个答案很棒,但在反向iOS中:准确地确定加速度计输出的凸起能量 - 如果我想要检测到急剧的运动,它会平滑运动.

还有适用于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.
}
Run Code Online (Sandbox Code Playgroud)

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

dai*_*dai 4

我使用了这段代码:

#define kUpdateFrequency    100.0
#define kFilteringFactor    0.1
float accelZ;
int spikeZCount = 0; 

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0 / kUpdateFrequency];
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];

- (void) accelerometer: (UIAccelerometer *) accelerometer didAccelerate: (UIAcceleration *) acceleration 
{
    accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );

    if (accelZ > 0.0f)
    {
        if (spikeZCount > 9)
        {
            //  NSLog(@"SPIKE!");
            [[UIAccelerometer sharedAccelerometer] setDelegate:nil];

            [self isBumped];
        }
        else
        {
            spikeZCount++;
            //  NSLog(@"spikeZCount %i",spikeZCount);
        }
    }
    else
    {
        // NSLog(@"spikeZCount Reset");
        spikeZCount = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)