我希望能够检测到一部iphone是否撞上了something...would,最好听一听陀螺仪/加速度计,判断它的移动速度,或者它的移动和突然停止。
事实上,我如何判断设备是否移动了,然后突然停止了?
这个答案是伟大的,但在反向iOS:从加速度计输出中精确测定碰撞能量 -它平滑的运动,如果有什么,我想检测到一个尖锐的运动。
另外,陀螺仪和加速度计都适用于3GS吗?
用代码更新的
来自Apple 编号/doc/uid/doc 40009541-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.
}
那么,如果检测到瞬时运动,我将如何“使用加速度数据”来计算呢?
发布于 2011-09-28 08:14:17
我使用了这个代码:
#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;
}
}
发布于 2013-05-31 09:30:29
从前面的答案中,我概括了一下,得到了以下几点效果很好的结果:
// 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);
}
发布于 2011-08-04 08:29:33
iPhone 3GS有加速度计,但没有陀螺仪。然而,根据http://techcrunch.com/2010/06/18/iphone-4-gyroscope-perspectiverse/,对陀螺仪的支持。
https://stackoverflow.com/questions/6937867
复制相似问题