Skip to content

[Objective-C]加速度センサーログ

2011/11/17

iOS deviceで加速度センサーをロギング+csvファイル出力まで。
加速度の取得に大事なのは次の3つ。

1. UIAccelerometerDelegateをプロトコル宣言しておく。

@interface HogeViewController : UIViewController <UIAccelerometerDelegate>{
...

2. 検出するタイミングを指定。

       [[UIAccelerometer sharedAccelerometer]setUpdateInterval:0.1];
       [[UIAccelerometer sharedAccelerometer]setDelegate:self];

UpdateIntervalの値を小さくしすぎると、実機テストの際バッテリーをかなり消耗する。

3. (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)accelerationで検出。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{

    NSLog(@"x:%f",acceleration.x);   // x-axis
    NSLog(@"y:%f",acceleration.y);   // y-axis
    NSLog(@"z:%f",acceleration.z);   // z-axis

}

センサーの向きはハードウェア依存なので、shouldAutorotateToInterfaceOrientationの設定でviewが回転する場合は注意が必要。

ログ出力は出力フォーマット生成、出力先パス指定、ファイル生成という流れ。
ファイル名は(log_[実行時刻].csv)としてみた。

    NSMutableArray accelerationData = [[NSMutableArray array] retain];   // センサーログ
    NSDate startTime = [[NSDate date] retain];   // プログラム実行開始時刻
    ...

    // 出力フォーマット生成
    NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];   // 経過時刻
    NSString* str = [NSString stringWithFormat:@"%f,%f,%f,%f",-elapsedTime,acceleration.x,acceleration.y,acceleration.z];
    [accelerationData addObject:str];
    ...

    // 出力先パス指定
    NSDateFormatter* format = [[NSDateFormatter alloc]init];
    NSString *dateFormatter = @"yyMMdd_HHmmss";
    [format setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"JST"]];
    [format setDateFormat:dateFormatter];
    NSString *dateStr = [format stringFromDate:startTime];
    
    NSString* path = [[NSString stringWithString:@"~/Documents"]stringByExpandingTildeInPath];
    path = [path stringByAppendingString:@"log_"];
    path = [path stringByAppendingString:dateStr];
    path = [path stringByAppendingString:@".csv"];
    ...

    // ファイル生成
    NSString* fullstring = [accelerationData componentsJoinedByString:@"\n"];
    [fullstring writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

accelerationDataやstartTimeはあちこちのメソッドで参照されるため、retainしている。
動的にログデータを追加し、まとめてファイルに出力したかったので、accelerationDataはNSArrayではなくNSMutableArrayで定義。

・・・サンプルコードを色々繋ぎ合わせたものなので、高速化のためには改良が必要。

広告

From → Objective-C

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。