2

歩行中の人間の歩数を計算するアプリケーションを開発しています。加速度計を使用してこれを行いましたが、正確ではないことがわかりました。これをグーグルで調べた後、GyroScopeセンサーを使用する方が加速度計よりも正確であることがわかりました. GyroScope を使用して開発したことがないため、これを行う可能性のあるコントロールのヘルプ、または GyroScope Sensor について詳しく読むためのドキュメント。助けてくれてありがとう。

-(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";
}
4

2 に答える 2

1

Android デバイスでは、加速度計を使用して問題なく歩数をカウントできました。こちらの回答を参照してください。

于 2013-05-26T17:07:53.330 に答える