iOS 加速計(jì)和陀螺儀

一焚志、概念

加速計(jì):通過(guò)感知特定方向的慣性力總量,測(cè)量x,y,z軸三個(gè)方向的加速度胆筒。


陀螺儀:測(cè)量繞x邮破、y、z三個(gè)方向的旋轉(zhuǎn)的值仆救。特性:如果保持手機(jī)平放的同時(shí)旋轉(zhuǎn)它抒和,加速計(jì)的值不會(huì)改變,此時(shí)它將是繞z軸的旋轉(zhuǎn)值發(fā)生改變彤蔽。順時(shí)針旋轉(zhuǎn)設(shè)備將生成負(fù)值摧莽,逆時(shí)針旋轉(zhuǎn)生成正值。


二顿痪、CoreMotion框架

加速計(jì)和陀螺儀是通過(guò)Core Motion框架訪問(wèn)的镊辕。此框架提供了CMMotionManager等類,該類提供的所有數(shù)據(jù)都用來(lái)描述用戶如何移動(dòng)設(shè)備蚁袭。

Core Motion獲取數(shù)據(jù)的兩種方式:

? ? ? ? ? ? ? ? ? ? ? ? ?push?: 實(shí)時(shí)采集所有數(shù)據(jù),采集頻率高;

? ? ? ? ? ? ? ? ? ? ? ? ?pull?: 在有需要的時(shí)候,才去采集數(shù)據(jù);

加速計(jì):

? ? push: ??- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;

? ? pull: ? ? - (void)startAccelerometerUpdates;

?判斷加速計(jì)是否可用:

@property(readonly, nonatomic, getter=isAccelerometerAvailable) BOOL accelerometerAvailable;

設(shè)置加速計(jì)采樣的時(shí)間間隔:

@property(assign, nonatomic) NSTimeInterval accelerometerUpdateInterval;

陀螺儀:

? ? ?push: ?? - (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler;

? ? ?pull: ? ? ? - (void)startGyroUpdates;

判斷陀螺儀是否可用:

@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable;

設(shè)置陀螺儀采樣的時(shí)間間隔:

@property(assign, nonatomic) NSTimeInterval gyroUpdateInterval;

磁力:

? ? ?push: ?? - (void)startMagnetometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMagnetometerHandler)handler;

? ? ?pull: ? ? ? - (void)startMagnetometerUpdates;

判斷磁力是否可用:

@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable;

設(shè)置磁力采樣的時(shí)間間隔:

@property(assign, nonatomic) NSTimeInterval magnetometerUpdateInterval

示例代碼:

檢測(cè)搖動(dòng)

方式一:在正常使用中征懈,3個(gè)軸上的注冊(cè)值高達(dá)1.3g,但獲取比該值更大的值通常需要特意施加力量揩悄。加速計(jì)不太可能注冊(cè)比2.3g更大的值卖哎,所以不需要設(shè)置比該值更大的值。要檢測(cè)搖動(dòng)删性,我們可以通過(guò)檢查比1.5大的絕對(duì)值來(lái)檢測(cè)細(xì)微搖動(dòng)亏娜,通過(guò)檢查比2.0更大的值來(lái)檢測(cè)強(qiáng)烈的搖動(dòng)。

檢測(cè)任何軸上的力大于2.0g的任何運(yùn)動(dòng):

檢測(cè)任何軸上的力大于2.0g的任何運(yùn)動(dòng)

我們可以實(shí)現(xiàn)更復(fù)雜的搖動(dòng)檢測(cè)镇匀,要求用戶來(lái)回?fù)u動(dòng)一定次數(shù)以注冊(cè)為搖動(dòng):

一定次數(shù)以注冊(cè)為搖動(dòng)

方式二:

?還有一種檢測(cè)搖動(dòng)的方法照藻,這種方法被結(jié)合到了響應(yīng)者鏈中。iOS提供了3個(gè)類似的響應(yīng)程序方法來(lái)檢測(cè)動(dòng)作:

動(dòng)作開(kāi)始時(shí):- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;

動(dòng)作結(jié)束時(shí):- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;

動(dòng)作取消時(shí):- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;(搖動(dòng)期間電話振鈴或其他干擾動(dòng)作)

三汗侵、感知設(shè)備移動(dòng)

除了獲取加速度數(shù)據(jù)幸缕、陀螺儀數(shù)據(jù)和磁場(chǎng)數(shù)據(jù)之外群发,CMMotionManager還可以用于感知設(shè)備移動(dòng)數(shù)據(jù)。與前獲取加速度數(shù)據(jù)发乔、陀螺儀數(shù)據(jù)熟妓、磁場(chǎng)數(shù)據(jù)的方式完全相同,程序可通過(guò)如下兩種方式來(lái)感知設(shè)備的移動(dòng)數(shù)據(jù)栏尚。

使用基于代碼的方式獲取設(shè)備移動(dòng)數(shù)據(jù)起愈;

使用哪個(gè)周期性主動(dòng)請(qǐng)求的方式獲取設(shè)備移動(dòng)數(shù)據(jù);

獲取設(shè)備移動(dòng)數(shù)據(jù)時(shí)译仗,CMMotionManager將會(huì)返回一個(gè)CMDeviceMotion對(duì)象抬虽,該對(duì)象包含如下屬性:

attitude:該屬性返回設(shè)備的方位信息。該屬性的分那會(huì)至是一個(gè)CMAttitude類型的對(duì)象纵菌,該對(duì)象包含roll阐污、pitch、yaw3個(gè)歐拉角的值咱圆,通過(guò)這3個(gè)值即可獲取該設(shè)備的空間方位笛辟;

rotationRate:該屬性返回原始的陀螺儀信息,該屬性值為CMRotationRate結(jié)構(gòu)體變量序苏,該屬性值基本等同于前面介紹的陀螺儀數(shù)據(jù)手幢;

gravity:該屬性返回地球重力對(duì)該設(shè)備在X、Y忱详、Z軸上施加的重力加速度围来;

userAcceleration:該屬性返回用戶外力對(duì)該設(shè)備在X、Y踱阿、Z軸上施加的重力加速度管钳;

magneticField:該屬性返回校準(zhǔn)后的磁場(chǎng)信息钦铁。該屬性值是一個(gè)CMCalibratedMagneticField結(jié)構(gòu)體變量软舌。CMCalibratedMagneticField類型的變量包括field和accuracy兩個(gè)字段,其中field代表X牛曹、Y佛点、Z、軸上的磁場(chǎng)強(qiáng)度黎比,accuracy則代表磁場(chǎng)強(qiáng)度的精度超营;

四、iOS 7新增的計(jì)步器

iOS 7新增的CMStepCounter作為計(jì)步器阅虫,該計(jì)步器可以獲取用戶攜帶該設(shè)備行走的步數(shù)演闭,iOS設(shè)備通過(guò)內(nèi)置硬件來(lái)手機(jī)并存儲(chǔ)用戶行走的步數(shù)。程序通過(guò)該類即可獲取用戶當(dāng)前行走的步數(shù)颓帝,也可查詢用戶行走的歷史活動(dòng)數(shù)據(jù)米碰。

注意:iOS 8用 CMPedometer代替窝革。

iOS 8新增的CMPedometer代替iOS 7的CMStepCounter作為計(jì)步器,該計(jì)步器可以獲取用戶攜帶該設(shè)備行走的步數(shù)吕座。該類包含如下幾個(gè)方法:

該方法跟CMStepCounter一樣虐译,判斷計(jì)步服務(wù)是否可用:

+ (BOOL)isStepCountingAvailable;

判斷計(jì)算距離是否可用:

+ (BOOL)isDistanceAvailable;

判斷計(jì)算層樓測(cè)量是否可用:

+ (BOOL)isFloorCountingAvailable;

該方法進(jìn)行實(shí)時(shí)測(cè)量,第一個(gè)參數(shù)是指進(jìn)行實(shí)時(shí)測(cè)量的開(kāi)始時(shí)間吴趴;第二個(gè)參數(shù)是block ^(CMPedometerData *pedometerData, NSError *error)漆诽;其中pedometerData為測(cè)量數(shù)據(jù),error為測(cè)量錯(cuò)誤信息:

-(void)startPedometerUpdatesFromDate:(NSDate*)start withHandler:(CMPedometerHandler)handler;

停止計(jì)步服務(wù):

-(void)stopPedometerUpdates;

第一個(gè)參數(shù)為開(kāi)始時(shí)間锣枝;第二個(gè)參數(shù)為結(jié)束時(shí)間厢拭;第三個(gè)參數(shù)為block^(CMPedometerData *pedometerData, NSError *error);其中pedometerData為測(cè)量數(shù)據(jù)撇叁,error為測(cè)量錯(cuò)誤信息蚪腐。

-(void)queryPedometerDataFromDate:(NSDate*)start toDate:(NSDate*)end withHandler:(CMPedometerHandler)handler;

測(cè)量數(shù)據(jù):CMPedometerData屬性如下:

統(tǒng)計(jì)開(kāi)始時(shí)間:@property(readonly,nonatomic)NSDate*startDate;

統(tǒng)計(jì)結(jié)束時(shí)間:@property(readonly,nonatomic)NSDate*endDate;

步數(shù):@property(readonly,nonatomic)NSNumber*numberOfSteps;

推算距離:@property(readonly,nonatomic)NSNumber*distance;

上升的樓層數(shù):@property(readonly,nonatomic)NSNumber*floorsAscended;

下降的樓層數(shù):@property(readonly,nonatomic)NSNumber*floorsDescended;

示例代碼:


五、iOS 7新增的CMMotionActivityManager

iOS新增了CMMotionActivityManager來(lái)收集税朴、存儲(chǔ)用戶的運(yùn)動(dòng)數(shù)據(jù)——此處的運(yùn)動(dòng)數(shù)據(jù)用于反映用戶當(dāng)前處于步行回季、跑步、駕駛車輛或處于靜止?fàn)顟B(tài)正林。對(duì)于導(dǎo)航應(yīng)用而言泡一,可通過(guò)該類獲取用于當(dāng)前的運(yùn)動(dòng)類型的改變,并根據(jù)不同的運(yùn)動(dòng)類型提供更精確的導(dǎo)航觅廓。

通過(guò)CMMotionActivityManager類鼻忠,應(yīng)用程序即可獲取用戶當(dāng)前的運(yùn)動(dòng)數(shù)據(jù),也可查詢用戶在過(guò)去某個(gè)時(shí)間段的運(yùn)動(dòng)數(shù)據(jù)杈绸。

CMMotionActivityManager提供了isActivityAvailable類方法來(lái)判斷獲取運(yùn)動(dòng)數(shù)據(jù)是否可用帖蔓,在傳統(tǒng)的iPhone、iPad設(shè)備上瞳脓,CMMotionActivityManager暫時(shí)不可用塑娇。

使用CMMotionAcvitityManager獲取實(shí)時(shí)的運(yùn)動(dòng)數(shù)據(jù)可通過(guò)如下方法:

-(void)startActivityUpdatesToQueue:(NSOperationQueue*)queue withHandler:(CMMotionActivityHandler)handler;

該方法的第一個(gè)參數(shù)需要傳一個(gè)NSOperationQueue對(duì)象;第二個(gè)參數(shù)是一個(gè)形如^(CMMotionActivity *activity){}的代碼塊劫侧,該代碼塊中的CMMotionActivityManager參數(shù)代表用戶當(dāng)前的運(yùn)動(dòng)數(shù)據(jù)埋酬;

該方法用于停止獲取運(yùn)動(dòng)數(shù)據(jù):

-(void)stopActivityUpdates;

該方法用于查詢歷史數(shù)據(jù),前面兩個(gè)從哪回溯用于指定獲取那個(gè)時(shí)間段的運(yùn)動(dòng)數(shù)據(jù):

-(void)queryActivityStartingFromDate:(NSDate*)start toDate:(NSDate*)end toQueue:(NSOperationQueue*)queue withHandler:(CMMotionActivityQueryHandler)handler;


通過(guò)CMMotionActivityManager獲取運(yùn)動(dòng)數(shù)據(jù)時(shí)烧栋,程序?qū)?huì)得到一個(gè)CMMotionActivity對(duì)象写妥,該對(duì)象包含如下屬性:

該屬性返回用戶是否處于靜止?fàn)顟B(tài):@property(readonly,nonatomic)BOOLstationary;

該屬性返回用戶是否正在步行:@property(readonly,nonatomic)BOOLwalking;

該屬性返回用戶是否正在跑步:@property(readonly,nonatomic)BOOLrunning;

該屬性返回用戶是否正在駕車:@property(readonly,nonatomic)BOOLautomotive;

該屬性返回用戶是否處于未知運(yùn)動(dòng)中:@property(readonly,nonatomic)BOOLunknown;

獲取該運(yùn)動(dòng)的開(kāi)始時(shí)間:@property(readonly,nonatomic)NSDate*startDate;

獲取該運(yùn)動(dòng)的開(kāi)始時(shí)間:@property(readonly,nonatomic) CMMotionActivityConfidence confidence;

示例代碼:

總結(jié):

掌握CoreMotion框架中的CMMotionManager、CMDeviceMotion审姓,通過(guò)CMMotionManager能以代碼塊或主動(dòng)請(qǐng)求的方式獲取設(shè)備的加速度數(shù)據(jù)珍特、陀螺儀數(shù)據(jù)以及磁場(chǎng)數(shù)據(jù),通過(guò)CMDeviceMotion則可以感知設(shè)備移動(dòng)信息魔吐。除此之外扎筒,本章還介紹了iOS 7新增的CMStepCounter和CMMotionActivityManager呼猪,其中CMStepCounter用于獲取攜帶該設(shè)備的用戶跑步的步數(shù),而CMMotionActivityManager則用于感知設(shè)備當(dāng)前的運(yùn)動(dòng)狀態(tài)砸琅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宋距,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子症脂,更是在濱河造成了極大的恐慌谚赎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诱篷,死亡現(xiàn)場(chǎng)離奇詭異壶唤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)棕所,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)闸盔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琳省,你說(shuō)我怎么就攤上這事迎吵。” “怎么了针贬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵击费,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我桦他,道長(zhǎng)蔫巩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任快压,我火速辦了婚禮圆仔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔫劣。我一直安慰自己坪郭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布拦宣。 她就那樣靜靜地躺著截粗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸵隧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天意推,我揣著相機(jī)與錄音豆瘫,去河邊找鬼。 笑死菊值,一個(gè)胖子當(dāng)著我的面吹牛外驱,可吹牛的內(nèi)容都是我干的育灸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昵宇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磅崭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瓦哎,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砸喻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蒋譬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體割岛,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年犯助,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癣漆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剂买,死狀恐怖惠爽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞬哼,我是刑警寧澤疆股,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站倒槐,受9級(jí)特大地震影響旬痹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讨越,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一两残、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧把跨,春花似錦人弓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耸别,卻和暖如春健芭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秀姐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工慈迈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人省有。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓痒留,卻偏偏與公主長(zhǎng)得像谴麦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伸头,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容