8

我希望能够检测到 iphone 是否撞到了什么东西……最好听一下陀螺仪/加速度计并判断它的移动速度或它是否突然移动和停止。

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

这个答案很好,但在iOS 中是相反的:从加速度计输出中准确确定碰撞的能量- 如果我想检测急剧运动,它可以平滑运动。

陀螺仪和加速度计是否也可用于 3GS?

用代码更新

来自苹果文档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.
}

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

4

5 回答 5

4

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

如果您有兴趣,这里有一个关于传感器融合的精彩视频,从 32:10 开始。

一个有点混乱的解决方法是使用高通滤波器并在没有传感器融合的情况下使用加速度计数据。如果你碰到什么东西,你也可能会在陀螺仪数据中出现尖峰,但根据我的经验,加速度计更好,因为它们可以检测到突然的速度变化。

这很混乱,因为您可以通过快速旋转手机来愚弄这一点。

于 2011-08-04T09:54:48.327 回答
4

从之前的答案中,我进行了一些概括,以获得以下效果很好:

// Isolate Instantaneous Motion from Acceleration Data
// (using a simplified high-pass filter)
CMAcceleration acceleration = accelerometerData.acceleration;
float prevAccelX = w_self.accelX;
float prevAccelY = w_self.accelY;
float prevAccelZ = w_self.accelZ;
w_self.accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) +
                                   (w_self.accelX * (1.0 - kFilteringFactor)) );
w_self.accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) +
                                   (w_self.accelY * (1.0 - kFilteringFactor)) );
w_self.accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) +  
                                   (w_self.accelZ * (1.0 - kFilteringFactor)) );

// Compute the derivative (which represents change in acceleration).
float deltaX = ABS((w_self.accelX - prevAccelX));
float deltaY = ABS((w_self.accelY - prevAccelY));
float deltaZ = ABS((w_self.accelZ - prevAccelZ));

// Check if the derivative exceeds some sensitivity threshold
// (Bigger value indicates stronger bump)
float sensitivityThreshold = 1.0;
float bumpVectorLength = sqrtf(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ);
if ( bumpVectorLength > sensitivityThreshold ) {
    NSLog( @"BUMP:  |%.3f, %.3f, %.3f| = %.3f", deltaX, deltaY, deltaZ, bumpVectorLength);
}
于 2013-05-31T09:30:29.360 回答
3

我使用了这段代码:

#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;
    }
}
于 2011-09-28T08:14:17.563 回答
2

iPhone 3GS 有加速计但没有陀螺仪。但是,根据http://techcrunch.com/2010/06/18/iphone-4-gyroscope-perspectiverse/支持陀螺仪。

于 2011-08-04T08:29:33.440 回答
0

这取决于不同的情况:

  1. 手机是否在空中自由落下(或被抛出),即您不再将其握在手中。
  2. 如果自由落体,我的猜测是它取决于手机撞击障碍物时的入射角。如果手机正好落在它的一个面上,陀螺仪不会报告旋转。但这将很难确定。
  3. 你碰到的材料的弹性。

我同意阿里关于加速的回答,但在投掷时不同意。但无论如何请记住,让用户扔掉他们的 iPhone 的应用程序不会有很好的机会获得应用程序商店的批准,-)

于 2011-08-04T10:03:46.077 回答