iPhoneには加速度センサーやGPSといった様々なセンサーが搭載されており、アプリでそれらのデータを取り出すことも可能です。
ググると行動履歴というのがよく出てきますが、これはGPSの記録をトレースしたもののようです。
今回は上記とは異なり自分が何時にどういった行動をしていたのかを振り返るためにCMMotionActivityManagerという機能を使って、1週間分の行動ログを取り出してみたいと思います。
得られる行動ログの種類としてstationary,walking,running,cycling,automotive,unknownがあります。
startDateで取得時間を把握できます。
またconfidenceという測定の自信度も取得できます。
startDate | stationary | walking | running | cycling |
atuto motive |
unknown | confidence |
2020-05-03 09:35:07 +0000 | 1 | 0 | 0 | 0 | 0 | 0 | Excellent |
2020-05-03 09:37:25 +0000 | 0 | 0 | 0 | 0 | 0 | 0 | Excellent |
2020-05-03 09:38:53 +0000 | 0 | 1 | 0 | 0 | 0 | 0 | Good |
2020-05-03 09:38:55 +0000 | 0 | 1 | 0 | 0 | 0 | 0 | Excellent |
2020-05-03 09:39:26 +0000 | 0 | 0 | 1 | 0 | 0 | 0 | Excellent |
2020-05-03 09:39:29 +0000 | 0 | 0 | 0 | 0 | 0 | 0 | Excellent |
2020-05-03 09:40:04 +0000 | 1 | 0 | 0 | 0 | 0 | 0 | Excellent |
2020-05-03 09:41:57 +0000 | 0 | 0 | 0 | 0 | 0 | 0 | Excellent |
やり方
(1) CMMotionActivityManagerをインスタンス化します。
queryActivityStartingの引数に開始時刻と終了時刻を指定して、キューに取得データを取り込みます。
最大7日間取れるようなので今回はd2を現在、d1を7日前としました。
コメントアウトしていますがmotionActivityをprintすれば上の表のような出力が得られることが確認できます。
let motionActivityManager = CMMotionActivityManager() var motionDataList = [motionData]() var motionConfidence : String = "" let d1 = Date() - (60*60*24*7) //7日間 let d2 = Date() motionActivityManager.queryActivityStarting(from: d1, to: d2, to: OperationQueue.main){ (motionActivities, error) in for motionActivity in motionActivities! { //print("-----motionActivity:\(motionActivity)")
(2)次にログを出力するための準備です。
motionDataという独自クラスにmotionActivityデータを格納することにします。
motionActivityを配列にしたものがmotionDataListです。
//motionDataList let motion = motionData() motion.startDate = motionActivity.startDate motion.confidence = motionConfidence motion.unknown = (motionActivity.unknown) ? 1 : 0 motion.stationary = (motionActivity.stationary) ? 1 : 0 motion.walking = (motionActivity.walking) ? 1 : 0 motion.running = (motionActivity.running) ? 1 : 0 motion.automotive = (motionActivity.automotive) ? 1 : 0 motion.cycling = (motionActivity.cycling) ? 1 : 0 motionDataList.append(motion)
(3)ログ出力
あとはCSVファイルとしてログ出しします。
//csv output let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.dateFormat = "MM-dd HH:mm:ss" let fileName = dateFormatter.string(from: motionDataList.last!.startDate) let filepath = NSHomeDirectory() + "/Documents/" + fileName + ".csv" self.createFile(filePath: filepath) self.CSVoutput(filePath: filepath, motionDataList: motionDataList)
ソースコード全体
import UIKit import CoreMotion class motionData { var startDate = Date() var confidence: String = "" var unknown: Int = 0 var stationary: Int = 0 var walking : Int = 0 var running: Int = 0 var automotive: Int = 0 var cycling: Int = 0 } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() SensorUpdate() } func SensorUpdate(){ let motionActivityManager = CMMotionActivityManager() var motionDataList = [motionData]() var motionConfidence : String = "" let d1 = Date() - (60*60*24*7) //7日間 let d2 = Date() motionActivityManager.queryActivityStarting(from: d1, to: d2, to: OperationQueue.main){ (motionActivities, error) in for motionActivity in motionActivities! { //print("-----motionActivity:\(motionActivity)") if motionActivity.confidence == CMMotionActivityConfidence.low{ motionConfidence = "Low" }else if motionActivity.confidence == CMMotionActivityConfidence.medium{ motionConfidence = "Good" } else if motionActivity.confidence == CMMotionActivityConfidence.high{ motionConfidence = "Excellent" } //motionDataList let motion = motionData() motion.startDate = motionActivity.startDate motion.confidence = motionConfidence motion.unknown = (motionActivity.unknown) ? 1 : 0 motion.stationary = (motionActivity.stationary) ? 1 : 0 motion.walking = (motionActivity.walking) ? 1 : 0 motion.running = (motionActivity.running) ? 1 : 0 motion.automotive = (motionActivity.automotive) ? 1 : 0 motion.cycling = (motionActivity.cycling) ? 1 : 0 motionDataList.append(motion) } //csv output let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.dateFormat = "MM-dd HH:mm:ss" let fileName = dateFormatter.string(from: motionDataList.last!.startDate) let filepath = NSHomeDirectory() + "/Documents/" + fileName + ".csv" self.createFile(filePath: filepath) self.CSVoutput(filePath: filepath, motionDataList: motionDataList) } } func createFile(filePath: String ){ FileManager.default.createFile(atPath: filePath, contents: nil, attributes: nil) } func CSVoutput(filePath: String ,motionDataList : [motionData]){ let fileURL = URL(fileURLWithPath: filePath) for index in 0..<motionDataList.count { var fileStrData = "\(motionDataList[index].startDate),\(motionDataList[index].stationary),\(motionDataList[index].walking),\(motionDataList[index].running),\(motionDataList[index].cycling),\(motionDataList[index].automotive),\(motionDataList[index].unknown),\(motionDataList[index].confidence)" fileStrData += "\n" do { let fileHandle = try FileHandle(forWritingTo: fileURL) if index==0{ let initStrData = "startDate,stationary,walking,running,cycling,atutomotive,unknown,confidence\n" fileHandle.write(initStrData.data(using: String.Encoding.utf8)!) } // add on end of file fileHandle.seekToEndOfFile() fileHandle.write(fileStrData.data(using: String.Encoding.utf8)!) print("logger success") } catch let error as NSError { print("failed to append: \(error)") } } } }
ログがファイルとして取得できるので、あとは色々なツールから可視化することもできます。
以上。