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

小怪獸飼養猿發表於2019-02-27

前言

在開發運動app時我們可能需要知道使用者當前的運動姿態來做一些資料上的判斷處理(cycling、running、walking、automotive),我發現了CoreMotion 框架下的CMMotionActivityManager似乎可以幫助我們來處理這個問題。
活動資料的來源是由Apple的運動協處理器M7(M7在iPhone5s開始使用後面更新依次是M8、M9…)來處理來自iPhone中各種感測器的運動資料。這涉及到iPhone中陀螺儀,加速度計和指南針的測量
具體可以維基百科上檢視一下Apple motion coprocessors
Apple運動協處理器

image.png

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

2013年9月10日星期二,Apple釋出了iPhone 5s。這款iPhone是第一款配備M7運動處理器的iPhone,這款晶片可以收集大量的移動資料,而不會讓iPhone電池快速耗盡。從那時起,運動處理器不斷更新,接著是型號M8,M9和M10、M11…….
運動處理器是一個獨立的處理器,可以連續處理來自iPhone中各種感測器的運動資料。這涉及到iPhone中陀螺儀,加速度計和指南針的測量。該晶片確保這些過程不需要由主處理器(A7,A8,A9,A10等)完成,這意味著需要更少的能量。當iPhone放在口袋中時,iPhone會繼續收集運動資訊,例如,可以區分步行和騎自行車。
在iPhone和iPad中的運動處理器可以不被人注意地捕捉您的運動,而不會給電池帶來壓力
在Phone中的運動處理器可以測量您的所有動作,而且不會消耗太多電量。

協處理器對與運動資料帶來的作用

運動處理器的巨大優勢在於該晶片可以以節能的方式收集資料,因此應用程式無需通過耗能的GPS晶片單獨進行。通過集中進行此資料收集,Apple可以防止各種應用程式不斷跟蹤您的位置和移動。您不必在後臺執行多個運動和鍛鍊資料。
安裝的應用程式可以訪問運動處理器收集的所有資訊,但只有您授予它的許可權。大多數資料將通過HealthKit健康應用程式收集,和其他應用程式可以使用
這使得開發能夠讀取已經收集的資料的健身應用成為可能。例如,如果您安裝了計步器應用程式,您將立即看到前幾周的運動資料。

<CoreMotion/CoreMotion.h>

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

CMMotionActivityManager 運動活動管理類

我們可以先看一下她的標頭檔案

//引入了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系列運動協處理器內部收集和處理計算使用者的運動活動狀態 我們可以利用這些狀態和查詢記錄結合我們的運動記錄資料軟體做一些更精準的區分和計算處理

@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?

相關文章