CoreMotionを使ってみる

スタンフォード大が公開しているCS 193P iPhone Application Development(http://www.stanford.edu/class/cs193p/cgi-bin/drupal/)の授業を参考にしながら、iOS4.0から追加されたCoreMotionFrameworkを実験中。

CMMotionManagerを使用すると、加速度(CMAccelerometerData)、ジャイロのデータ(CMGyroData)、デバイスの姿勢など(CMDeviceMotion)の情報を取得できる。

CMGyroData, CMDeviceMotionはiPhone4のみ取得可能。(iPod touch 4Gは未確認)

取得方法は2種類

CMMotionManagerが新しいサンプルを取得する度に、あらかじめ指定したBlockを実行する。(PUSH)
CMMotionManagerの値をNSTimerなどを使って、任意のタイミングで取得する。(PULL)

今回はPUSHの方法で、加速度のデータを取得してみた。

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface MotionSampleViewController : UIViewController {

	CMMotionManager *motionManager;

}

- (IBAction)startUpdate:(id)sender;
- (IBAction)stopUpdate:(id)sender;
@property (nonatomic, retain) CMMotionManager *motionManager;

@end
#import "MotionSampleViewController.h"

@implementation MotionSampleViewController

@synthesize motionManager;


- (void)setupMotionManager{
	CMMotionManager *manager = [[[CMMotionManager alloc] init] autorelease]; //CMMotionManagerの生成
	self.motionManager = manager;
	manager.accelerometerUpdateInterval = 10.0 / 60.0; //CMMotionManagerが1秒に何回データを取得するか指定する
}


	

- (IBAction)startUpdate:(id)sender{
	
	if (!self.motionManager) {
		[self setupMotionManager]; //CMMotionManagerの生成
	}
	if (! motionManager.accelerometerAvailable) {
		return; //motionManagerがaccelerometerを利用できないときはreturn
	}
	
	if ( ![self.motionManager isAccelerometerActive]) {
		
		//motionManagerがaccelerometerを使用中かチェック
		
		NSOperationQueue *opQueue = [[[NSOperationQueue alloc] init] autorelease];
		[self.motionManager startAccelerometerUpdatesToQueue:opQueue 
												 withHandler:^(CMAccelerometerData *data, NSError *error) {
													 
													 //新しい加速度のデータを取得する度にこのブロックを実行する
													 
													 dispatch_async(dispatch_get_main_queue(), ^{
														 
														 NSLog(@"加速度のデータ:%@",data);
														 
													 });
												 }];
		
	}
	
}

- (IBAction)stopUpdate:(id)sender{
	[self.motionManager stopAccelerometerUpdates];
}






- (void)dealloc {
	[self.motionManager stopAccelerometerUpdates];
	self.motionManager = nil;
    [super dealloc];
}

@end

Block,GrandCentralDispatch周りをまだ完全に理解できていない(^_^;)

広告

コメントは停止中です。

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