デベロッパー
デベロッパー
iPhone と iPod Touch の加速度センサーを利用する
iPhone と iPod Touch の最も革新的な機能の1つが内蔵の加速度センサーだ。この加速度センサーは、デバイスがその姿勢を検知し、新しい姿勢に合わせてコンテンツを適応させられるようにする。たとえば、手にしているデバイスを横にすると、表示スペースが広がるよう Safari ウェブブラウザが画面を自動的にランドスケープモードに切り替える。
同様に、カメラも加速度センサーを頼りに写真を縦横どちらで撮影しているのか伝える。本稿では、加速度センサーが返すデータにプログラムでアクセスする方法を学習する。加速度センサーのデータを取得することで、水準器や、モーション検知を活用したゲームなど、かなり興味深いアプリケーションの開発が可能になる。
図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 単位で測定できる。
以下の太字のステートメントを「AccelerometerViewController.h」ファイルに追加する。
「AccelerometerViewController.m」ファイルに以下の太字のコードを追加する。
基本的には「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」ファイルに太字の以下のコードを追加する。
Interface Builder で、コントロールキーを押さえながら「File’s Owner」アイテムをクリックして「UIImageView」までドラッグする。「imageView」を選択する。
「AccelerometerViewController.m」ファイルに以下の太字のコードを追加する。
ここでは、「UIImageView」のトランスフォームプロパティ経由でトランスレーション(イメージの移動用)を適用する。デルタは x と y の両軸方向への移動量を表している。
Command-R を押してアプリケーションをデバイス上でテストする。デバイスを動かしながら観察すると、テニスボールが自分の手と同じ方向に動く(図7参照)。
図7 本物のデバイス上でアプリケーションをテスト
同様に、カメラも加速度センサーを頼りに写真を縦横どちらで撮影しているのか伝える。本稿では、加速度センサーが返すデータにプログラムでアクセスする方法を学習する。加速度センサーのデータを取得することで、水準器や、モーション検知を活用したゲームなど、かなり興味深いアプリケーションの開発が可能になる。
加速度センサーを理解する
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);
}
「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];
}
Command-R を押してアプリケーションをデバイス上でテストする。デバイスを動かしながら観察すると、テニスボールが自分の手と同じ方向に動く(図7参照)。
図7 本物のデバイス上でアプリケーションをテスト
まとめ
本稿では、加速度センサーのデータを iPhone や iPod touch からプログラムで入手する方法を見てきた。さらに、データを応用して有効利用する方法も見てきた。加速度センサーのデータ利用方法について名案のある方は、weimenglee@learn2develop.net までご連絡いただきたい。ぜひ、よろめくような感動を!New Topics
Special Ad
| “超高速無線 LAN 時代”の幕開け--新規格 11ac(Draft)に対応したバッファロー最新ルーターの潜在能力を試す | |
![]() |
バッファローは次世代無線 LAN 規格 IEEE802.11ac(Draft)通信速度最大 1,300Mbps 対応無線 LAN ルーター「WZR-1750DHP」を3月下旬に販売開始。今回、同機器を入手できたので、使用感や便利な機能についてレポートしたい。⇒詳細記事へ |
Hot Topics
IT Job
今週のIT求人情報
Interviews / Specials
Follow japan.internet.com
Popular
Access Ranking
Partner Sites










