iPhone/iPadスマートアプリ開発レシピ
iPhone/iPadスマートアプリ開発レシピ(2)

加速度センサとジャイロで体の動きを感じるアプリを作る


クラスメソッド株式会社
開発部 掛川敦史
2012/4/17
スマートフォンの「スマート」は、さまざまなセンサやハードウェアを使うところにある。本連載で、さまざまなセンサやハードウェアを使うiOSiPhoneiPadiPod touchのスマートなアプリを作ってみよう

モーションセンサでスマート度アップ!

- PR -

 前回の「iOS端末ハードウェアの歴史と近接センサアプリ開発」では、初回ということでiOS端末ハードウェアの歴史をまとめ、簡単な「近接センサ」の使い方を紹介しました。今回はデバイスの「動き」を検知するハードウェアである「加速度センサ」「ジャイロスコープ」について触れ、それらの機能を利用したアプリを作成します。

 なお、今回作成したアプリを動作させる際には、ジャイロスコープが搭載されているiPhone 4以降、iPod touch第4世代、もしくは、iPad 2以降のデバイスを使用してください。また、今回のサンプルアプリを作成するに当たって、開発環境はXcode 4.3.1・iOS SDK 5.1(ARC使用)を、検証用のデバイスはiPhone 4を使用しています。

いまさら聞けない「加速度センサ」とは

 加速度センサは、名前の通りデバイスの加速度を検出するハードウェアです。「加速度」とは「単位時間当たりの速度の変化率」のことですが、この説明ですとあまりピンと来ないですね。

 例えば、普段皆さんが電車に乗っていると、電車が加速したときに進行方向と逆に体が引っ張られ、電車が減速したときに進行方向に体が引っ張られるといった「力」を感じると思います。この力は電車の運動速度の変化に伴って、私たちの体の運動速度が変化した結果感じるものです。よくF1レースなどで「Gが掛かる」などといわれることがありますが、この「G」が加速度です。

 デバイスを手に持って移動させた際も同様に、加速や減速によってデバイスに加速度が掛かっています。加速度センサは、デバイスの運動速度の変化に伴ってどのくらいGが掛かっているか、つまり加速度が掛かっているかを検出しています。従って、デバイスが一定方向に一定速度で移動しているときには加速度は生じておらず、そこから速度が変化したときに初めて加速度が生じます

 また同時に、加速度センサは重力による地面方向への加速度も検出しており、加速度センサから取得できる加速度は常に、ユーザーによってデバイスに掛けられている加速度と重力加速度の合力です

 加速度センサによって検出された加速度は、下図のようなデバイスを中心とした3次元空間の、それぞれの空間軸の成分として取得できます。

 取得できる値の単位は重力加速度を基準とした「G」(1.0Gは約9.8m/s2)です。

いまさら聞けない「ジャイロスコープ」とは

 ジャイロスコープはデバイスの回転を検出するためのハードウェアです。下図のようなデバイスを中心とした3次元空間のそれぞれの空間軸を中心とした回転の速度を検出します。

 回転速度の単位はrad/s(ラジアン毎秒)です。

モーションデータを扱うiOSの「Core Motion」

 デバイスに搭載されている加速度センサなどのハードウェアを利用し、デバイスのモーションデータを扱うためのフレームワークとして、iOS 4から「Core Motion」が追加されました。Core Motionで取得できる情報は以下の通りです。

  • デバイスの加速度
  • デバイスの回転速度
  • 磁力計によって検出される磁場
  • ユーザーによって掛けられた加速度
  • 重力加速度
  • デバイスの姿勢

 Core Motionは、センサから取得された値に補正を掛けたり複数のセンサから得られた値から単体のハードウェアでは認識できなかった情報を提供するなど、モーションセンサを使用するに当たってのややこしい処理を肩代わりして、開発者が扱いやすいような形でデータを提供してくれています。

 例えば、デバイスの姿勢の検知などは、加速度センサとジャイロスコープの情報(設定によっては磁力計も利用)を組み合わせ、加工することによって実現されています。

Core Motionを利用した加速度データの取得

 Core Motionを利用した加速度センサのデータ取得方法を見てみましょう。加速度センサの情報を取得するには以下のようなコードを記述します。

CMMotionManager *motionManager = [[CMMotionManager alloc] init];
// 加速度データの更新間隔を0.1秒ごとに設定
motionManager.accelerometerUpdateInterval = 0.1;
// 加速度センサが利用可能かチェック
if (motionManager.accelerometerAvailable)
{
    // どちらか一方を使用する
    // プル型
    [motionManager startAccelerometerUpdates];
    // プッシュ型
    [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
                                        withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                                            // 加速度データの処理
                                        }];
}

モーションセンサの機能を管理するマネージャクラス「CMMotionManager」

 「CMMotionManager」はモーションセンサの機能を管理するマネージャクラスで、モーションデータ取得の開始・停止更新間隔の設定などを行います。CoreMotionを利用してモーションデータを取得する場合は、CMMotionManagerで更新間隔の設定やハードウェアが利用できるかをチェックした後、データの取得を開始するという流れになります。

注意! CMMotionManagerは1つにしないと重くなる

 なお、CMMotionManagerのインスタンスは、必ずアプリ内で1つになるようにしてください。複数のCMMotionManagerインスタンスを使用すると、モーションデータ取得のパフォーマンスに影響が出る恐れがあります。

データ取得開始メソッドは、プル型とプッシュ型の2種類

 上のコードでは、CMMotionManagerを利用して更新間隔の設定と加速度センサの利用が可能かをチェックした後、加速度データの取得を開始しています。

 データの取得を開始するメソッドは、プル型とプッシュ型の2種類が用意されてます。どちらのメソッドを利用した場合も、取得できる加速度データは「CMAccelerometerData」型で、x、y、zの3つのプロパティに3次元空間のそれぞれの軸で検出された加速度データが格納されています。

プル型のデータ取得開始メソッド

 プル型の「startAccelerometerUpdates」メソッドを呼び出すと、加速度センサのデータの取得を開始し、「accelerometerUpdateInterval」で設定した更新間隔でCMMotionManagerのaccelerometerDataプロパティの加速度データを更新します。このデータを、画面の描画ロジックや自前で用意したタイマーハンドラなどから利用します。

プッシュ型のデータ取得開始メソッド

 プッシュ型の「startAccelerometerUpdatesToQueue:withHandler:」メソッドは、加速度センサのデータの取得を開始して、accelerometerUpdateIntervalで設定した更新間隔でメソッドの2番目のパラメータで指定したブロックを呼び出します。従って、更新された加速度データに関する処理はこのブロック内に記述することになります。

 なおブロックは、メソッドの1番目のパラメータで指定されたオペレーションキューのスレッド上で実行されるので、ブロックがメインスレッド上で実行されない場合、UIの更新処理に関してはメインスレッド上で行う必要があります。

加速度データ取得停止処理

 以下は、加速度データ取得停止処理のコードです。

[motionManager stopAccelerometerUpdates];

 加速度センサをはじめとしたモーションセンサは電池を消耗するので、モーションデータを取得する必要がなくなったら、すぐに停止するようにしてください。

Core Motionを利用したジャイロデータの取得

 次に、Core Motionを利用したジャイロスコープのデータ取得方法を見てみましょう。ジャイロスコープの情報を取得するには、以下のようなコードを記述します。

CMMotionManager *motionManager = [[CMMotionManager alloc] init];
// ジャイロデータの更新間隔を0.1秒ごとに設定
motionManager.gyroUpdateInterval = 0.1;
// ジャイロスコープが利用可能かチェック
if (motionManager.gyroAvailable)
{
    // どちらか一方を呼び出す
    // プル型
    [motionManager startGyroUpdates];
    // プッシュ型
    [motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] 
                               withHandler:^(CMGyroData *gyroData, NSError *error) {
                                   // ジャイロデータの処理
                               }];
}

 ジャイロスコープも加速度センサの場合と同様に、更新間隔の設定とセンサの利用が可能かチェックをした後にジャイロデータの取得を開始します。

ジャイロデータ取得開始処理

 ジャイロデータ取得開始メソッドもプル型とプッシュ型が用意されており、その利用方法も加速度センサの場合と同じです。

 プル型のデータ取得開始メソッドを利用した場合、ジャイロデータはCMMotionManagerの「gyroData」プロパティに格納されます。ジャイロデータ取得開始後に取得できるジャイロデータは「CMGyroData」型で、x、y、zの3つのプロパティに3次元空間のそれぞれの軸で検出されたデバイスの回転速度のデータが格納されています。

ジャイロデータ取得停止処理

 以下は、ジャイロデータの取得を停止する処理です。

[motionManager stopGyroUpdates];

 こちらも加速度センサの場合と同じです。

 次ページからは、加速度センサやジャイロスコープを利用したアプリの例としてスクワットアプリや腹筋アプリを作ってみましょう。

  1-2-3

 INDEX
iPhone/iPadスマートアプリ開発レシピ(2) 
加速度センサとジャイロで体の動きを感じるアプリを作る
Page1
モーションセンサでスマート度アップ!
いまさら聞けない「加速度センサ」とは
いまさら聞けない「ジャイロスコープ」とは
モーションデータを扱うiOSの「Core Motion」
Core Motionを利用した加速度データの取得
Core Motionを利用したジャイロデータの取得
  Page2
加速度センサでスクワットアプリを作ってみよう
  Page3
デバイスの姿勢を利用した腹筋アプリを作ってみよう
Core Motionなら簡単にモーションデータを使える



 Smart&Social フォーラム トップページへ



Smart & Social フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Smart & Social 記事ランキング

本日 月間
ソリューションFLASH