デベロッパー

デベロッパー

iPhone と iPod Touch の加速度センサーを利用する

Wei-Meng Lee
2010年8月3日 / 10:00
 
 
iPhone と iPod Touch の最も革新的な機能の1つが内蔵の加速度センサーだ。この加速度センサーは、デバイスがその姿勢を検知し、新しい姿勢に合わせてコンテンツを適応させられるようにする。たとえば、手にしているデバイスを横にすると、表示スペースが広がるよう Safari ウェブブラウザが画面を自動的にランドスケープモードに切り替える。

同様に、カメラも加速度センサーを頼りに写真を縦横どちらで撮影しているのか伝える。本稿では、加速度センサーが返すデータにプログラムでアクセスする方法を学習する。加速度センサーのデータを取得することで、水準器や、モーション検知を活用したゲームなど、かなり興味深いアプリケーションの開発が可能になる。

加速度センサーを理解する

iPhone と iPod Touch に搭載される加速度センサーは、自由落下に対するデバイスの加速度を計測する。1の値はデバイスに1G の重力がかかっていることを示す(1G の重力は、デバイスが静止状態の時に感じる地球の重力)。加速度センサーはデバイスの加速度を X、Y、および Z の3軸方向で計測する。図1は加速度センサーが計測する各軸を示している。



図1 加速度センサーが加速度を計測する iPhone 上の3軸

図2はデバイスがさまざまな位置にあるときの3軸の値を示している。



図2 X、Y、Z 軸のさまざまな値

デバイスを縦に持って素早く右に動かすと、X 軸の値は0から正の値へと変化する。左へ素早く動かすと、X 軸の値は0から負の値へと変化する。デバイスを上に素早く動かすと、Y 軸の値が-1.0から大きい値へと変化する。デバイスを下へ素早く動かすと、Y 軸の値が-1.0から小さい値へと変化する。

デバイスが平らなテーブル上に置かれていて、そこから下へ落ちると、Z 軸の値が-1.0から小さい値へと変化する。上に持ち上がると、Z 軸の値が-1.0から大きい値へと変化する。

iPhone と iPod Touch で使われている加速度センサーは+/- 2.3G までの範囲を約0.018G 単位で測定できる。

加速度センサーへのアクセス

Xcode を使って新しい View ベースの Application (iPhone)プロジェクトを作成し、これに「Accelerometer」という名前を付ける。

以下の太字のステートメントを「AccelerometerViewController.h」ファイルに追加する。
#import <UIKit/UIKit.h>

@interface AccelerometerViewController : UIViewController 
    <UIAccelerometerDelegate> {
}

@end

「AccelerometerViewController.m」ファイルに以下の太字のコードを追加する。

#import "AccelerometerViewController.h"

@implementation AccelerometerViewController

- (void)viewDidLoad {
    UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
    accel.delegate = self;
    accel.updateInterval = 1.0f/60.0f;       

    [super viewDidLoad];
}

- (void)accelerometer:(UIAccelerometer *)acel 
        didAccelerate:(UIAcceleration *)acceleration {
    
    NSLog(@"x: %g", acceleration.x);
    NSLog(@"y: %g", acceleration.y);
    NSLog(@"z: %g", acceleration.z);
}
基本的には「UIAccelerometer」クラスのインスタンスを取得し、そのアップデート間隔を設定する。ここでは、そのアップデート設定を1分間に60回にセットしている。その間隔ごとに「accelerometer:didAccelerate:」メソッドがコールされ、そこで3軸方向の加速度を得ることができる。

「Command-R」を押して本物のデバイス(これだけは「iPhone Simulator」ではテストできない)でアプリケーションをテストする。自分のデバイスを動かすと3軸方向の値が「Debugger Console」ウィンドウに表示されるはずだ(Xcode では「Shift-Command-R」。図3参照)。



図3 「Debugger Console」ウィンドウに表示されるデータ

加速度センサーのデータの新しい値をプリントするのはあまり楽な作業ではない。そこで、加速度センサーのデータを利用して画面上のテニスボールを動かせるようにアプリケーションを修正してみよう。

まず、図4のようなイメージを準備する。



図4 テニスボールのイメージ

プロジェクトの「Resources」フォルダにイメージをドラッグ&ドロップする(図5参照)。



図5 イメージをプロジェクトにコピー

AccelerometerViewController.xib ファイルをダブルクリックして Interface Builder で編集を行う。

「View」ウィンドウに「UIImageView」を追加して、イメージ属性を tennisball.jpg に設定する。また、「View」ウィンドウのバックグラウンドカラーを黒に設定する(図6参照)。



図6「View」ウィンドウへのデータ入力。

「AccelerometerViewController.h」ファイルに太字の以下のコードを追加する。
#import <UIKit/UIKit.h>

@interface AccelerometerViewController : UIViewController 
    <UIAccelerometerDelegate> {

    IBOutlet UIImageView *imageView;
    CGPoint delta;
    CGPoint translation;
    float ballRadius;    
}

@property (nonatomic, retain) UIImageView *imageView;

@end

Interface Builder で、コントロールキーを押さえながら「File’s Owner」アイテムをクリックして「UIImageView」までドラッグする。「imageView」を選択する。
「AccelerometerViewController.m」ファイルに以下の太字のコードを追加する。
#import "AccelerometerViewController.h"

@implementation AccelerometerViewController

@synthesize imageView;

- (void)viewDidLoad {
    UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
    accel.delegate = self;
    accel.updateInterval = 1.0f/60.0f;

    ballRadius = imageView.frame.size.width / 2;
    delta = CGPointMake(12.0,4.0);
    translation = CGPointMake(0.0,0.0);        

    [super viewDidLoad];
}

- (void)accelerometer:(UIAccelerometer *)acel 
        didAccelerate:(UIAcceleration *)acceleration {
    
    // NSLog(@"x: %g", acceleration.x);
    // NSLog(@"y: %g", acceleration.y);
    // NSLog(@"z: %g", acceleration.z);
    
    if (acceleration.x>0) delta.x = 2; else delta.x = -2;
    if (acceleration.y>0) delta.y = -2; else delta.y = 2;
    
    [UIView beginAnimations:@"translate" context:nil];    
    imageView.transform = 
        CGAffineTransformMakeTranslation(translation.x, translation.y);    
    translation.x = translation.x + delta.x;
    translation.y = translation.y + delta.y;    
    [UIView commitAnimations];    
    
    if (imageView.center.x + translation.x > 320 - ballRadius || 
        imageView.center.x + translation.x < ballRadius) {
        translation.x -= delta.x;
    }
    if (imageView.center.y + translation.y > 460 - ballRadius || 
        imageView.center.y + translation.y < ballRadius) {
        translation.y -= delta.y;
    }        
}

- (void)dealloc {
    [imageView release];
    [super dealloc];
}
ここでは、「UIImageView」のトランスフォームプロパティ経由でトランスレーション(イメージの移動用)を適用する。デルタは x と y の両軸方向への移動量を表している。

Command-R を押してアプリケーションをデバイス上でテストする。デバイスを動かしながら観察すると、テニスボールが自分の手と同じ方向に動く(図7参照)。



図7 本物のデバイス上でアプリケーションをテスト

まとめ

本稿では、加速度センサーのデータを iPhone や iPod touch からプログラムで入手する方法を見てきた。さらに、データを応用して有効利用する方法も見てきた。加速度センサーのデータ利用方法について名案のある方は、weimenglee@learn2develop.net までご連絡いただきたい。ぜひ、よろめくような感動を!
【関連記事】
Apple、『iOS 4』のパフォーマンス問題で調査を開始
RIM、次期 OS 搭載の『BlackBerry Bold 9800』発表間近?
お絵描きアプリは仕事で使える?―iPad アプリ「WebPad」
DMCA 見直しで、『iPhone』の「脱獄」は適用除外に
至れり尽くせりの入力支援ツール「BlindType」がすごそうだ……

New Topics

Special Ad

ゆりかごからロケットまで、すべての乗り物をエンジョイ
ゆりかごからロケットまで、すべての乗り物をエンジョイ えん乗り」は、ゆりかごからロケットまで、すべての乗り物をエンジョイする、ニュース、コラム、動画などをお届けします! てんこ盛りをエンジョイするのは こちらから

Hot Topics

IT Job

Interviews / Specials

Popular

Access Ranking

Partner Sites