首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测iphone何时被颠簸

检测iphone何时被颠簸
EN

Stack Overflow用户
提问于 2011-08-04 07:45:37
回答 4查看 11.2K关注 0票数 10

我希望能够检测到一部iphone是否撞上了something...would,最好听一听陀螺仪/加速度计,判断它的移动速度,或者它的移动和突然停止。

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

这个答案是伟大的,但在反向iOS:从加速度计输出中精确测定碰撞能量 -它平滑的运动,如果有什么,我想检测到一个尖锐的运动。

另外,陀螺仪和加速度计都适用于3GS吗?

用代码更新的

来自Apple 编号/doc/uid/doc 40009541-CH4-SW26

将瞬时运动与加速度数据隔离----如果你使用加速度计数据来检测设备的瞬间运动,你需要能够将运动中的突然变化与重力的恒定效应隔离开来。你可以用高通滤波器来做。

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

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

代码语言:javascript
运行
复制
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.
}

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-28 08:14:17

我使用了这个代码:

代码语言:javascript
运行
复制
#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;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-05-31 09:30:29

从前面的答案中,我概括了一下,得到了以下几点效果很好的结果:

代码语言:javascript
运行
复制
// 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);
}
票数 4
EN

Stack Overflow用户

发布于 2011-08-04 08:29:33

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6937867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档