加速度センサ サンプル

加速度センサを使うには、UIAccelerometerDelegateをdelegateしたいオブジェクト(controlerとかviewとか)にプロトコルを追加。具体的には

// UIViewにUIAccelerometerDelegateプロトコルを追加
@interface EAGLView : UIView <UIAccelerometerDelegate> {
とか

// アプリクラスにUIAccelerometerDelegateプロトコルを追加
@interface MyAppDelegate : NSObject <UIApplicationDelegate,UIAccelerometerDelegate> {
とか

こんな感じで追加したいトコに記述(ViewControllerとかのがいいかも)

これで初期化時に以下の記述を追加してやれば、加速度センサイベント起きるようになる

UIAccelerometer *theAccelerometer = [UIAccelerometer sharedAccelerometer];
theAccelerometer.updateInterval = 1 / 100;	//検出頻度
theAccelerometer.delegate = self;  //←これはもちろんプロトコル追加したクラスを設定


以下、公式のGLGravityサンプルから抜粋。

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)accel
{
  //Use a basic low-pass filter to only keep the gravity in the accelerometer values
  const double kFilteringFactor = 0.1;  // 0.1なら10回、0.01なら100回 分を平均化
  accel[0] = accel.x * kFilteringFactor + accel[0] * (1.0 - kFilteringFactor);
  accel[1] = accel.y * kFilteringFactor + accel[1] * (1.0 - kFilteringFactor);
  accel[2] = accel.z * kFilteringFactor + accel[2] * (1.0 - kFilteringFactor);
}

ローパスフィルタって書かれてるけど、要はkFilteringFactorをかけて(10で割る)、割った値を前回の値に足し込んでって平坦化するって事。それによってノイズ除去して安定した値を取得したいと。


old = now x 0.1 + old x 0.9
old = now / 10 + (old / 10) x 9
kFilteringFactorが0.1の時、新しい値を10分の一ずつ足し込んでいく事で、10回かけて本来の値に近づく(途中経過が平坦になる)


kFilteringFactorを0.01とか小さく設定すればノイズも減りますが、当然、機敏な動作の検出とかはできなくなっていきます。この辺、やってみて調節って感じでしょうね。


以下、参考にしたサイト等
http://d.hatena.ne.jp/glass-_-onion/20081121/1227194373#c