开发一个应用程序来计算人类走路时的步数, 我用加速度计做了这个,但我发现它不准确。 因此在谷歌搜索后,我发现使用陀螺仪传感器比加速度计更准确。 任何可能做到这一点的控件的帮助,因为我没有使用GyroScope开发,或者是一个文档来阅读有关GyroScope传感器的更多信息。 在此先感谢您的帮助。
-(void)addAcceleration:(UIAcceleration*)accel
{
x = accel.x;
y = accel.y;
z = accel.z;
}
-(NSString*)name
{
return @"You should not see this";
}
@end
#define kAccelerometerMinStep 5.02
#define kAccelerometerNoiseAttenuation 1.0
double Norm(double x, double y, double z)
{
return sqrt(x * x + y * y + z * z);
}
double Clamp(double v, double min, double max)
{
if(v > max)
return max;
else if(v < min)
return min;
else
return v;
}
// See http://en.wikipedia.org/wiki/Low-pass_filter for details low pass filtering
@implementation LowpassFilter
-(id)initWithSampleRate:(double)rate cutoffFrequency:(double)freq
{
self = [super init];
if(self != nil)
{
double dt = 1.0 / rate;
double RC = 1.0 / freq;
filterConstant = dt / (dt + RC);
}
return self;
}
-(void)addAcceleration:(UIAcceleration*)accel
{
double alpha = filterConstant;
if(adaptive)
{
double d = Clamp(fabs(Norm(x, y, z) - Norm(accel.x, accel.y, accel.z)) / kAccelerometerMinStep - 1.0, 0.0, 1.0);
alpha = (1.0 - d) * filterConstant / kAccelerometerNoiseAttenuation + d * filterConstant;
}
x = accel.x * alpha + x * (1.0 - alpha);
y = accel.y * alpha + y * (1.0 - alpha);
z = accel.z * alpha + z * (1.0 - alpha);
}
-(NSString*)name
{
return adaptive ? @"Adaptive Lowpass Filter" : @"Lowpass Filter";
}
@end
// See http://en.wikipedia.org/wiki/High-pass_filter for details on high pass filtering
@implementation HighpassFilter
-(id)initWithSampleRate:(double)rate cutoffFrequency:(double)freq
{
self = [super init];
if(self != nil)
{
double dt = 1.0 / rate;
double RC = 1.0 / freq;
filterConstant = RC / (dt + RC);
}
return self;
}
-(void)addAcceleration:(UIAcceleration*)accel
{
double alpha = filterConstant;
if(adaptive)
{
double d = Clamp(fabs(Norm(x, y, z) - Norm(accel.x, accel.y, accel.z)) / kAccelerometerMinStep - 1.0, 0.0, 1.0);
alpha = d * filterConstant / kAccelerometerNoiseAttenuation + (1.0 - d) * filterConstant;
}
x = alpha * (x + accel.x - lastX);
y = alpha * (y + accel.y - lastY);
z = alpha * (z + accel.z - lastZ);
lastX = accel.x;
lastY = accel.y;
lastZ = accel.z;
}
-(NSString*)name
{
return adaptive ? @"Adaptive Highpass Filter" : @"Highpass Filter";
}
答案 0 :(得分:3)
使用CoreMotion FrameWork。
#import <CoreMotion/CoreMotion.h>
self.motionManager = [[CMMotionManager alloc] init];
//Gyroscope
if([self.motionManager isGyroAvailable])
{
/* Start the gyroscope if it is not active already */
if([self.motionManager isGyroActive] == NO)
{
/* Update us 2 times a second */
[self.motionManager setGyroUpdateInterval:1.0f / 2.0f];
/* Add on a handler block object */
/* Receive the gyroscope data on this block */
[self.motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMGyroData *gyroData, NSError *error)
{
NSString *x = [[NSString alloc] initWithFormat:@"%.02f",gyroData.rotationRate.x];
self.gyro_xaxis.text = x;
NSString *y = [[NSString alloc] initWithFormat:@"%.02f",gyroData.rotationRate.y];
self.gyro_yaxis.text = y;
NSString *z = [[NSString alloc] initWithFormat:@"%.02f",gyroData.rotationRate.z];
self.gyro_zaxis.text = z;
}];
}
}
else
{
NSLog(@"Gyroscope not Available!");
}
需要使用两个类:CMGyrodata和CMMotionManager
与您的问题相关:How to count steps using an Accelerometer?
阅读,这将是一个很好的起点...
希望这会有所帮助......
答案 1 :(得分:1)
在Android设备上,我可以使用加速度计计算步数而没有太大问题,请参阅my answer here。