基於iPhone 上的運動協處理器M7判斷用戶當前的運動(姿態)類型

前言

在開發運動app時咱們可能須要知道用戶當前的運動姿態來作一些數據上的判斷處理(cycling、running、walking、automotive),我發現了CoreMotion 框架下的CMMotionActivityManager彷佛能夠幫助咱們來處理這個問題。 活動數據的來源是由Apple的運動協處理器M7(M7在iPhone5s開始使用後面更新依次是M八、M9...)來處理來自iPhone中各類傳感器的運動數據。這涉及到iPhone中陀螺儀,加速度計和指南針的測量 具體能夠維基百科上查看一下Apple motion coprocessors Apple運動協處理器bash

image.png

什麼是運動協處理器 (M7 motion processor)?

2013年9月10日星期二,Apple發佈了iPhone 5s。這款iPhone是第一款配備M7運動處理器的iPhone,這款芯片能夠收集大量的移動數據,而不會讓iPhone電池快速耗盡。從那時起,運動處理器不斷更新,接着是型號M8,M9和M十、M11....... 運動處理器是一個獨立的處理器,能夠連續處理來自iPhone中各類傳感器的運動數據。這涉及到iPhone中陀螺儀,加速度計和指南針的測量。該芯片確保這些過程不須要由主處理器(A7,A8,A9,A10等)完成,這意味着須要更少的能量。當iPhone放在口袋中時,iPhone會繼續收集運動信息,例如,能夠區分步行和騎自行車。 在iPhone和iPad中的運動處理器能夠不被人注意地捕捉您的運動,而不會給電池帶來壓力 在Phone中的運動處理器能夠測量您的全部動做,並且不會消耗太多電量。微信

協處理器對與運動數據帶來的做用

運動處理器的巨大優點在於該芯片能夠以節能的方式收集數據,所以應用程序無需經過耗能的GPS芯片單獨進行。經過集中進行此數據收集,Apple能夠防止各類應用程序不斷跟蹤您的位置和移動。您沒必要在後臺運行多個運動和鍛鍊數據。 安裝的應用程序能夠訪問運動處理器收集的全部信息,但只有您授予它的權限。大多數數據將經過HealthKit健康應用程序收集,和其餘應用程序可使用 這使得開發可以讀取已經收集的數據的健身應用成爲可能。例如,若是您安裝了計步器應用程序,您將當即看到前幾周的運動數據。app

<CoreMotion/CoreMotion.h>

iOS核心運動傳感器器框架陀螺儀、加速計、計步計(CMPedometer)... 實現微信搖一搖、運動計步、相機方向調整等等... 後面我能夠吧計步補上 沒有了解過的能夠去Google一下 這些都有文章寫過了我這裏就再也不囉嗦了 能夠去看看別人的博客使用CoreMotion陀螺儀、加速計的使用框架

CMMotionActivityManager 運動活動管理類

咱們能夠先看一下她的頭文件dom

//引入了CoreMotion框架下的運動活動和認證受權
#import <CoreMotion/CMMotionActivity.h>
#import <CoreMotion/CMAvailability.h>
#import <CoreMotion/CMAuthorization.h>

//是否處於活躍狀態
+ (BOOL)isActivityAvailable;

//受權狀態
+ (CMAuthorizationStatus)authorizationStatus NS_AVAILABLE(NA, 11_0) __WATCHOS_AVAILABLE(4_0);

//查詢某一天startDate到某一天EndDate到活動數據
- (void)queryActivityStartingFromDate:(NSDate *)start
                               toDate:(NSDate *)end
                              toQueue:(NSOperationQueue *)queue
                          withHandler:(CMMotionActivityQueryHandler)handler;

//開始獲取更新當前的活動狀態 以CMMotionActivity對象包裹數據返回block
- (void)startActivityUpdatesToQueue:(NSOperationQueue *)queue
                        withHandler:(CMMotionActivityHandler)handler;

//中止數據獲取狀態更新
- (void)stopActivityUpdates;

複製代碼

乍一看API很簡單用起來也很簡單 你只須要去調用startActivityUpdatesToQueue 獲取活動狀態 返回你一個CMMotionActivity對象 這個對象的數據也很簡潔 以前說過Apple是經過M系列運動協處理器內部收集和處理計算用戶的運動活動狀態 咱們能夠利用這些狀態和查詢記錄結合咱們的運動記錄數據軟件作一些更精準的區分和計算處理iphone

@interface CMMotionActivity : CMLogItem

/*
 *  confidence
 *
 *  Discussion:
 *    A confidence estimate associated with this state.
 *
 *    CoreMotion always provides the most likely state.  Confidence represents
 *    how likely that the state is to be correct.
 */
@property(readonly, nonatomic) CMMotionActivityConfidence confidence;

/*
 *  startDate
 *
 *  Discussion:
 *    Time at which the activity started.
 */
@property(readonly, nonatomic) NSDate *startDate;

/*
 *  unknown
 *
 *  Discussion:
 *    True if there is no estimate of the current state.  This can happen if
 *    the device was turned off.
 */
@property(readonly, nonatomic) BOOL unknown;

/*
 *  stationary
 *
 *  Discussion:
 *    True if the device is not moving.
 */
@property(readonly, nonatomic) BOOL stationary;

/*
 *  walking
 *
 *  Discussion:
 *    True if the device is on a walking person.
 */
@property(readonly, nonatomic) BOOL walking;

/*
 *  running
 *
 *  Discussion:
 *    True if the device is on a running person.
 */
@property(readonly, nonatomic) BOOL running;

/*
 *  automotive
 *
 *  Discussion:
 *    True if the device is in a vehicle.
 */
@property(readonly, nonatomic) BOOL automotive;

/*
 *  cycling
 *
 *  Discussion:
 *    True if the device is on a bicycle.
 */
@property(readonly, nonatomic) BOOL cycling NS_AVAILABLE(NA, 8_0);

複製代碼
使用:用的人應該比較少 暫時先寫着麼多後面有機會再瞭解補充
self.motionActivityManager = [[CMMotionActivityManager alloc] init];
[self.motionActivityManager startActivityUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMMotionActivity *activity) {
            dispatch_async(dispatch_get_main_queue(), ^{
                
                if (activity.walking) {
                  //走路
                } else if (activity.running) {
                  //跑步
                } else if (activity.automotive) {
                  //汽車
                } else if (activity.stationary || activity.unknown) {
                    
                }else if (activity.cycling){
                  //騎行
                }
複製代碼

參考文章:Hoe werkt de motion processor in iPhone en iPad?async

相關文章
相關標籤/搜索