Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?
@FollowTheDarkside

【CoreMotion】iPhoneのモーションデータ(加速度や角速度など)をCSVで記録するアプリを作成してみた

More than 1 year has passed since last update.

はじめに

iPhoneには加速度センサーや角速度センサー(ジャイロ)といったセンサー類が搭載されており、Core Motionというフレームワークを使うことでこれらのセンサーデータを簡単に取得することができます(機種による違いはありますが)。
モーションセンサーによる行動認識系の論文を見ていると、スマートフォンを使った研究もけっこう多かったりします(お手軽にデータを記録できる端末ということなんでしょう)。

私もiPhoneから得られたモーションデータを機械学習させたいなということでそれらをCSVファイルとして記録する簡易アプリを作成したのですが、せっかくなのでGitHubでも公開しました。注意事項や使い方などはREADMEをご参照ください。

今回はシンプルに、CoreMotionの中でもCMDeviceMotion経由で得られる以下の項目に限定しています。

  • Attitude(姿勢)
  • Rotation Rate(角速度)
  • Gravity(重力加速度)
  • User Acceleration(加速度)

本記事ではデータの取得部分のコードだけ抜粋して載せておきます。
他にもCoreMotionを使用することで磁気センサーや気圧センサー等のデータも取得可能ですので、興味ある方は良さげに改良してください(すでにそういうのも転がっているかも)。

モーションデータの取得例

// CMMotionManagerのインスタンスを生成
let motionManager = CMMotionManager()

// モーションデータの取得を開始
func startSensorUpdates(intervalSeconds:Double) {
    if motionManager.isDeviceMotionAvailable{
        motionManager.deviceMotionUpdateInterval = intervalSeconds

        motionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: {(motion:CMDeviceMotion?, error:Error?) in
            self.getMotionData(deviceMotion: motion!)

        })
    }
}

// モーションデータの取得(例としてコンソールへ出力)
func getMotionData(deviceMotion:CMDeviceMotion) {
    print("attitudeX:", deviceMotion.attitude.pitch)
    print("attitudeY:", deviceMotion.attitude.roll)
    print("attitudeZ:", deviceMotion.attitude.yaw)
    print("gyroX:", deviceMotion.rotationRate.x)
    print("gyroY:", deviceMotion.rotationRate.y)
    print("gyroZ:", deviceMotion.rotationRate.z)
    print("gravityX:", deviceMotion.gravity.x)
    print("gravityY:", deviceMotion.gravity.y)
    print("gravityZ:", deviceMotion.gravity.z)
    print("accX:", deviceMotion.userAcceleration.x)
    print("accY:", deviceMotion.userAcceleration.y)
    print("accZ:", deviceMotion.userAcceleration.z)
}

intervalSecondsでデータの更新間隔(秒)を指定してあげてください。ちなみにstartDeviceMotionUpdates後はIntervalを変更できないみたいなので、ひとまず今回は変更するたびに毎回stopDeviceMotionUpdatesするようにしてみました(GitHubのコードを参照)。

おまけ

スマートフォンのセンサーデータの活用にはZIG SIMというアプリも便利です。昔に書いたQiita記事でちょっと使わせていただいていたりしています。
https://qiita.com/FollowTheDarkside/items/1a4632ca7c75e2b90127

また、機械学習では靴型のウェアラブルデバイスORPHEを使ってブレイクダンスの動作識別をしていたりします。よろしければそちらの記事もご覧ください!
https://qiita.com/FollowTheDarkside/items/956b78869d3198982c9c
http://hahaeatora.hateblo.jp/entry/2018/10/14/183000

17
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
FollowTheDarkside
bboy / dancer / programmer / videographer

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
17
Help us understand the problem. What is going on with this article?