読者です 読者をやめる 読者になる 読者になる

koogawa log

iOS、Android、foursquareに関する話題

【Tips】iOSで加速度センサーを使用する - CoreMotion(Swift対応)

iOS Tips Swift

2016/4/10追記:Swift 2.2のコードを追記しました


Core Motionを使って、加速度センサーを使用する方法をメモしておきます。

このセンサーを使用することでx、y、z軸に沿った速度の変化を測定することができます。

f:id:koogawa:20131126021537p:plain
iOSイベント処理ガイドより)

実装方法

まずは「CoreMotion.framework」を追加します。

f:id:koogawa:20131122152458p:plain

ヘッダをインポートします。

Swift:

import CoreMotion

Objective-C:

#import <CoreMotion/CoreMotion.h>

インスタンスを生成します。

Swift:

let manager = CMMotionManager()

Objective-C:

_motionManager = [[CMMotionManager alloc] init];

適切な更新間隔を設定をして加速度センサーを有効化します。

Swift:

if manager.accelerometerAvailable {
    // センサーの更新間隔の指定
    manager.accelerometerUpdateInterval = 1 / 10; // 10Hz

    // ハンドラを指定
    let accelerometerHandler:CMAccelerometerHandler = {
        [weak self] (data: CMAccelerometerData?, error: NSError?) -> Void in

        self?.xLabel.text = "".stringByAppendingFormat("x %.4f", data!.acceleration.x)
        self?.yLabel.text = "".stringByAppendingFormat("y %.4f", data!.acceleration.y)
        self?.zLabel.text = "".stringByAppendingFormat("z %.4f", data!.acceleration.z)

        print("x: \(data!.acceleration.x) y: \(data!.acceleration.y) z: \(data!.acceleration.z)")
    }

    // 加速度の取得開始
    manager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!,
                                             withHandler: accelerometerHandler)
}

Objective-C:

if (_motionManager.accelerometerAvailable)
{
    // センサーの更新間隔の指定
    _motionManager.accelerometerUpdateInterval = 1 / 10;  // 10Hz

    // ハンドラを指定
    CMAccelerometerHandler handler = ^(CMAccelerometerData *data, NSError *error)
    {
        // 画面に表示
        self.xLabel.text = [NSString stringWithFormat:@"x %f", data.acceleration.x];
        self.yLabel.text = [NSString stringWithFormat:@"y %f", data.acceleration.y];
        self.zLabel.text = [NSString stringWithFormat:@"z %f", data.acceleration.z];
    };

    // 加速度の取得開始
    [_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:handler];
}

加速度イベントの一般的な更新間隔(iOSイベント処理ガイドより)

イベント頻度(Hz) 用途
10~20 デバイスの向きベクトルを調べる目的。
30〜60 ゲームその他、実時間のユーザ入力用に加速度センサーを用いるアプリケーション。
70〜100 高い頻度でモーションを検出する必要があるアプリケーション。デバイスを叩く、激しく振る、などの操作を検出する使い方が考えられます。

startAccelerometerUpdatesToQueueメソッドを実行すると、指定した更新間隔でハンドラの内容が実行されます。

加速度センサーを無効化するには次のメソッドを実行します。

Swift:

if manager.accelerometerAvailable {
    manager.stopAccelerometerUpdates()
}

Objective-C:

if (_motionManager.accelerometerActive) {
    [_motionManager stopAccelerometerUpdates];
}

サンプルコード

注意点

  • iOS 4以上で使用できます

応用できそうなアプリ

  • iPhoneの傾きによって物体が転がるゲーム

私がリリースしているiOSアプリ「まりも」では、加速度センサーを利用して「まりも」を転がしています。

f:id:koogawa:20130413131940p:plain

参考リンク