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

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


クラスメソッド株式会社
開発部 掛川敦史
2012/4/17

デバイスの姿勢を利用した腹筋アプリを作ってみよう

- PR -

 今回作成する腹筋アプリは以下の仕様を満たすものにします。

  • デバイスを縦向きの状態で手で持って腹筋をすることによって、腹筋の回数をカウントできる
  • デバイスの位置は胸の中心に当てた状態、もしくは顔の前に掲げた状態である
  • スタートボタンをタップするとカウントが始まり、ストップボタンをタップすると、カウントが止まってリセットされる
  • 腹筋は体を起こした状態からスタートする
  • 体を起こしている状態から体を寝かし、再び起こした際にカウントが1回増える

CMDeviceMotionのオイラー角を使う

 腹筋の回数をカウントするために利用するデバイスの姿勢の情報は、モーションデータである「CMDeviceMotion」の「attitude」プロパティに「CMAttitude」型で格納されています。CMAttitudeには、以下の3つの方式でデバイスの姿勢の情報が格納されています。

  • オイラー角
  • 回転行列
  • 四元数

 今回はオイラー角の情報を利用して仰角を取得します。オイラー角そのものの説明は、本稿では割愛しますが、CMAttitudeで取得できるオイラー角での姿勢情報がどのような形式であるかについて簡単に説明したいと思います。

 CMAttitudeにはオイラー角の情報として、ロール角ピッチ角ヨー角の3つの角度が、それぞれ「roll」「pitch」「yaw」プロパティにラジアン単位の値で格納されています。縦向きのデバイスの画面を正面から見る視点において、ロール角はデバイス上部から下部方向への垂直方向の軸を中心とした回転角度、ピッチ角はデバイス左右を通る水平方向の軸を中心とした回転角度、ヨー角はデバイス前面から背面へと通る軸を中心とした回転角度を表しています。

 基準となる姿勢は、デバイス前面が上を向いた状態でデバイスと地面が水平になっている状態、つまり画面を上にして机などに置いた状態で、このときロール角とピッチ角の測定値が「0」付近を示します。ヨー角については通常基準となる方向が不定なのですが、モーションデータの測定開始時に、CMMotionManagerの「startDeviceMotionUpdatesToQueue:withHandler:」メソッドの代わりに「startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:」メソッドを利用し、その最初のパラメータを設定することによって磁北や真北を基準にできます。

アプリのUI

 下のスクリーンショットは、作成したアプリを実行したときの様子です。

 スタートボタンを押した後、デバイスを持って上半身を寝かすと矢印のイメージが上向きになり、上半身を起こすと矢印のイメージが再び下向きになって回数がカウントされます。

ソースコードは、こちら

 では、ソースコードの主要な部分を説明していきます。完成したアプリのソースコードはこちらからダウンロードしてください。

CMMotionManagerのインスタンスを生成してデータ取得開始

 viewDidLoadメソッド内のCMMotionManagerを生成している部分は、スクワットアプリと同じです。腹筋回数カウントのスタート時の処理です。

- (void)startCounting
{
    // モーションデータ更新時のハンドラを作成
    void (^handler)(CMDeviceMotion *, NSError *) = ^(CMDeviceMotion *motion, NSError *error)
    {
        // ピッチ角で腹筋動作の判定
        [self validatePitch:motion.attitude.pitch];
    };
    
    // モーションデータの測定を開始
    NSOperationQueue *queue = [NSOperationQueue currentQueue];
    [motionManager startDeviceMotionUpdatesToQueue:queue withHandler:handler];
    
    isCounting = YES;
    count = 0;
    isRising = NO;
    
    [self updateViewAnimated:NO];
    [self changeViewState];
}

 startCountingメソッドは、スタートボタンタップ時のハンドラから呼び出されています。まず、モーションデータ更新時のハンドラブロックを作成しています。ブロック内ではピッチ角で腹筋動作を判定するメソッドを呼んでいます。次に、スクワットアプリのときと同様にNSOperationQueueを取得後、モーションデータのサンプリングを開始しています。

データ更新処理

 以下は、モーションデータが更新された際の処理です。

- (void)validatePitch:(double)pitch
{
    // 角度を度数に変換
    int pitchDegree = round(180 * pitch / M_PI);
    
    if (isRising && pitchDegree > 90 - kPitchDegreeMargin)
    {
        // 起き上がりフェイズかつデバイスの仰角が一定値を超えた場合、起き上がったと判定
        isRising = NO;
        count++;
        [self updateViewAnimated:YES];
    }
    else if (!isRising && pitchDegree < kPitchDegreeMargin)
    {
        // 起き上がりフェイズでないかつデバイスの仰角が一定値を下回った場合、寝たと判定
        isRising = YES;
        [self updateViewAnimated:YES];
    }
}

 validatePitch:メソッドはモーションデータ更新時のハンドラブロックから呼ばれています。モーションデータ更新時にCMAttitudeインスタンスのpitchプロパティから取得したピッチ角がパラメータとして渡されているので、まずその値を度数法の角度に変換しています。その値を利用して、取得したピッチ角が75度を超えていたら「起き上がった」と判定し、15度を下回ったら「寝た」と判定することで、腹筋の回数をカウントしています。

 なお、ピッチ角の値は90度から-90度の間までで表され、±90度を超えてデバイスを傾けると、角度の値は再び減って(マイナスの場合は増えて)いきます。その代わり、デバイスが裏返ったとみなされ、ロール角の値が180度回転した値となります。

Core Motionなら簡単にモーションデータを使える

 加速度センサやジャイロスコープなどのモーションセンサは、デバイスのハードウェア機能の中でもちょっと取っ付きづらいイメージがありますが、Core Motionのおかげで意外と手軽に利用できることが分かったのではないかと思います。皆さんも、ぜひモーションセンサで遊んでみてください!

■ @IT関連記事


iPhoneアプリ開発入門
盛り上がるiOS(iPhone・iPad・iPod touch)アプリ開発。そのハウツーや魅力に関する@IT記事一覧です

PerfumeのモーションデータをiPhoneアプリで動かす
Retinaに映える! iOS美麗アプリ制作入門(2) 先日GitHubで公開されたダンスのデータを使うopenFrameworks製のサンプルアプリをiOS用にして動かす方法を解説します
Smart & Social」フォーラム 2012/4/3
Windows PhoneをShake!加速度センサアプリを作る
Silverlightベースで作るWP7アプリ開発入門(8)
 iOSやAndroidでも人気の加速度センサを使ってグラフィックを動かす方法やジェスチャを使ってアプリを動かす方法を解説
Smart & Social」フォーラム 2012/1/13
iPhoneより多彩なAndroidのセンサをアプリで操作
Androidで動く携帯Javaアプリ作成入門(13) 
Androidで使えるさまざまなセンサを紹介し、加速度や磁気、方位、温度などの値を取得して使うアプリの作り方を解説します
Smart & Social」フォーラム 2010/1/15
開発者が知らないと損するAndroid 4.0の新機能44選
Androidで動く携帯Javaアプリ作成入門(26)
 AndroidビームやWi-Fiダイレクト、ライブエフェクト、顔認識、スクリーンリーダ、ソーシャル系などの新機能をテーマ別に紹介
Smart & Social」フォーラム 2011/11/2

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 記事ランキング

本日 月間