8

iPhoneが何かにぶつかったかどうかを検出できるようにしたい...ジャイロスコープ/加速度計を聞いて、移動の速さを判断するか、移動して突然停止したかを判断するのが最善でしょうか。

実際、デバイスが動いてから突然停止したかどうかをどのように判断しますか?

この答えは素晴らしいですが、逆にiOS: 加速度計の出力からバンプのエネルギーを正確に決定します。どちらかといえば、鋭い動きを検出したい場合は、動きを滑らかにします。

また、ジャイロスコープと加速度計の両方を 3GS で使用できますか?

コードで更新

Apple doc 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

以前の回答から、少し一般化して、次のようにうまく機能します。

// 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 に答える
4

適切な方法は、センサー フュージョンの後にハイパス フィルターと線形加速度を使用することです。ここでSensor.TYPE_LINEAR_ACCELERATION を確認してください。これは Android 用です。私の知る限り、iPhoneにはセンサーフュージョンがありません。Kay が指摘したように、Core Motion はセンサー フュージョンを提供します。以下のコメントを参照してください。

興味のある方は、こちらのセンサー フュージョンに関する優れたビデオを 32:10 からご覧ください。

やや厄介な回避策は、ハイパス フィルターを使用し、センサー フュージョンを使用せずに加速度計のデータを使用することです。携帯電話を何かにぶつけると、ジャイロ データにもスパイクが発生する可能性がありますが、私の経験では、急激な速度の変化を検出するため、加速度計の方が優れています。

電話をすばやく回転させることでこれをだますことができるので、面倒です。

于 2011-08-04T09:54:48.327 に答える
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. 自由に落下する場合、携帯電話が障害物にぶつかった瞬間の入射角に依存すると思います。電話がちょうどその面の 1 つに落ちている場合、ジャイロは回転を報告しません。しかし、これを判断するのは難しいでしょう。
  3. ぶつかっている素材の弾力性。

加速に関するアリの答えには同意しますが、投げるときは同意しません。とにかく、ユーザーに iPhone を捨てさせるようなアプリは、アプリ ストアの承認を得るチャンスが少ないことを覚えておいてください ,-)

于 2011-08-04T10:03:46.077 に答える