CoreMotion框架(一)—— 基礎(chǔ)理論

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.08.05

前言

我們的app很多都需要獲取使用者的動(dòng)作淘钟、方向以及其他和方位或者位置有關(guān)的參數(shù),在ios中對(duì)應(yīng)的框架就是CoreMotion泡躯,而在硬件對(duì)應(yīng)的就是集成的加速計(jì)和陀螺儀。這幾篇我們就從基礎(chǔ)原理理論出發(fā),講一下相關(guān)的知識(shí)。

科普常識(shí)

一些iOS的應(yīng)用,會(huì)有一些特殊的要求:

  • 電子羅盤指南針之類的應(yīng)用,讓我們知道方向膀跌。
  • 運(yùn)動(dòng)類型軟件,讓我們知道我們跑步多少公里固灵。
  • 社交軟件中的搖一搖功能捅伤,比如微信。
  • 游戲中扮演角色類中根據(jù)設(shè)備的晃動(dòng)等進(jìn)行操作巫玻。

其實(shí)丛忆,與這些功能相關(guān)的就是iOS中的一個(gè)核心運(yùn)動(dòng)框架CoreMotion.framework。這個(gè)框架仍秤,主要是為了訪問加速度計(jì)陀螺儀的相關(guān)數(shù)據(jù)熄诡。 它不僅僅提供給你獲得實(shí)時(shí)的加速度值和旋轉(zhuǎn)速度值,更重要的是诗力,蘋果在其中集成了很多算法凰浮,可以直接給你輸出把重力加速度分量剝離的加速度,省去你的高通濾波操作苇本,以及提供給你一個(gè)專門的設(shè)備的三維位置信息袜茧。

下面我們簡(jiǎn)單的了解一下這幾種硬件的實(shí)現(xiàn)原理。

1. 陀螺儀

用在手機(jī)里面的陀螺儀都是MEMS陀螺儀瓣窄,里面的微機(jī)械結(jié)構(gòu)為振動(dòng)件笛厦,通過測(cè)量旋轉(zhuǎn)產(chǎn)生的科氏加速度來(lái)獲得角速度。

用途:照相防抖康栈,以及配合加速度計(jì)(有的還有磁傳感器)形成的組合傳感器來(lái)完成特定的功能(如慣性導(dǎo)航递递,還有玩游戲時(shí)的一些角速度測(cè)試)。

下面看一下陀螺儀的三維示意圖啥么。

陀螺儀三維示意圖

下面給出三個(gè)方向角度上的動(dòng)態(tài)示意圖登舞。

roll
pitch
yaw

2. 加速度計(jì)

用在手機(jī)里的加速度計(jì)同樣是MEMS的,也是由振動(dòng)結(jié)構(gòu)悬荣,由于外界加速度會(huì)影響結(jié)構(gòu)的振動(dòng)特性菠秒,由此來(lái)測(cè)量加速度。加速度幾種有一種是線性加速度計(jì)氯迂,定義是:由于加速度計(jì)的輸出包含了重力加速度践叠,線性加速度計(jì)簡(jiǎn)單來(lái)說就是排除了重力加速度的影響得到的值。

用途:用途很多嚼蚀,只要跟手機(jī)運(yùn)動(dòng)相關(guān)的幾乎都與加速度計(jì)有關(guān)(計(jì)步禁灼、手機(jī)的姿態(tài)測(cè)量、相關(guān)的游戲等等)轿曙。

下面給出就是三軸加速度計(jì)的傳感器示意圖弄捕,大家要注意的就是三個(gè)軸的正向是如何定義的。

加速度傳感器

大家除了看上面的3D效果圖导帝,還可以看下面這個(gè)圖守谓。

加速度計(jì)

檢測(cè)設(shè)備在x,y,z軸上的加速度(加速度范圍為-1 ~ 1),可以感覺加速度值判斷屏幕的方向您单,如下圖所示斋荞。

手機(jī)不同方向?qū)?yīng)的加速度值

3. 重力感應(yīng)器

嚴(yán)格來(lái)說,重力感應(yīng)儀就是加速度計(jì)虐秦。像手機(jī)里面說的重力感應(yīng)器平酿、方向感應(yīng)器等等都是基于加速度計(jì)、陀螺儀悦陋、磁傳感器(有的還有GPS)的數(shù)據(jù)獲得的派生傳感器染服。

區(qū)別:下面我們看一下它們的區(qū)別:

  • 加速度計(jì)和陀螺儀:從原理來(lái)說,陀螺儀和加速度計(jì)都是通過振動(dòng)測(cè)量加速度的叨恨,只不過陀螺儀測(cè)量的是科氏加速度柳刮,而加速度計(jì)是測(cè)量的直接加速度。MEMS陀螺儀可以簡(jiǎn)單理解為一個(gè)諧振器+加速度計(jì)痒钝。因此陀螺儀的結(jié)構(gòu)要比加速度計(jì)復(fù)雜得多秉颗,技術(shù)也難得多。
  • 重力傳感器送矩,方向傳感器(電子羅盤)蚕甥,旋轉(zhuǎn)傳感器(姿態(tài)傳感器):這三種都是派生的3D傳感器。重力傳感器是通過測(cè)量重力加速度方向來(lái)判斷重力的方向栋荸,那跟旋轉(zhuǎn)傳感器有什么區(qū)別呢菇怀?旋轉(zhuǎn)傳感器用到了陀螺儀的數(shù)據(jù)凭舶,在動(dòng)態(tài)情況(比如你在邊走邊看手機(jī))也能很好的判斷手機(jī)的姿態(tài)角。方向傳感器則是主要通過磁傳感器來(lái)測(cè)量地磁場(chǎng)來(lái)判斷方向(類似指南針的作用)爱沟,有時(shí)還需要配合GPS(各地的磁場(chǎng)不一樣)帅霜。這些傳感器能配合非常多的應(yīng)用,如地圖導(dǎo)航(手機(jī)上傳感器的精度還不能滿足慣導(dǎo)呼伸,主要是充當(dāng)輔助的作用身冀,比如判斷你的朝向)。

框架基礎(chǔ)

上面科普了關(guān)于傳感器硬件上的知識(shí)括享,下面我們就來(lái)看一下CoreMotion框架搂根。給出相關(guān)框架蘋果資料地址CoreMotion

1. 基本API架構(gòu)

我們先看一下這個(gè)框架API架構(gòu)铃辖。

API架構(gòu)

這個(gè)框架主要是要處理下面三種數(shù)據(jù):

  • 加速度值CMAccelerometerData
  • 陀螺儀值CMGyroData
  • 設(shè)備motionCMDeviceMotion
    實(shí)際上剩愧,這個(gè)設(shè)備motion值就是通過加速度和旋轉(zhuǎn)速度進(jìn)行變換算出來(lái)的。

下面看一下CMDeviceMotion這幾個(gè)motion

  • attitude:通俗來(lái)講娇斩,就是告訴你手機(jī)在當(dāng)前空間的位置和姿勢(shì) 隙咸。
  • gravity:重力信息,其本質(zhì)是重力加速度矢量在當(dāng)前設(shè)備的參考坐標(biāo)系中的表達(dá) 成洗。
  • userAcceleration:加速度信息五督。
  • rotationRate:即時(shí)的旋轉(zhuǎn)速率,是陀螺儀的輸出瓶殃。

2. 框架內(nèi)容

Core Motion框架可讓您的應(yīng)用程序從設(shè)備硬件接收運(yùn)動(dòng)數(shù)據(jù)并處理該數(shù)據(jù)充包。 該框架支持使用Block對(duì)象接口訪問原始和已處理的加速度計(jì)數(shù)據(jù)。 對(duì)于具有內(nèi)置陀螺儀的設(shè)備遥椿,您可以檢索原始陀螺儀數(shù)據(jù)以及反映設(shè)備的姿態(tài)和旋轉(zhuǎn)速度的處理數(shù)據(jù)基矮。 您可以使用加速度計(jì)和基于陀螺儀的數(shù)據(jù),用于游戲或使用動(dòng)作作為輸入的其他應(yīng)用程序冠场,或作為增強(qiáng)整體用戶體驗(yàn)的方式家浇。

注意:在iOS 10.0之上或之后鏈接的iOS應(yīng)用程序必須在其Info.plist文件中包含其需要訪問的數(shù)據(jù)類型的使用說明鍵,否則會(huì)崩潰碴裙。 要具體訪問運(yùn)動(dòng)和健身數(shù)據(jù)钢悲,它必須包括NSMotionUsageDescription

下面我們看一下這個(gè)框架的類舔株。

類名 詳情
CMAccelerometerData CMAccelerometerData類的一個(gè)實(shí)例表示加速度計(jì)事件莺琳。 它是在一個(gè)時(shí)刻沿著三個(gè)空間軸的加速度的測(cè)量。
CMAltimeter 使用CMAltimeter對(duì)象開始向您的應(yīng)用程序發(fā)送高度相關(guān)數(shù)據(jù)载慈。 高度事件反映了當(dāng)前高度的變化惭等,而不是絕對(duì)高度。 因此办铡,遠(yuǎn)足應(yīng)用程序可能會(huì)使用此對(duì)象來(lái)跟蹤用戶在遠(yuǎn)足過程中的高程增益辞做。 因?yàn)樗性O(shè)備上的高度事件可能不可用琳要,所以在使用此服務(wù)之前,請(qǐng)始終調(diào)用isRelativeAltitudeAvailable()方法秤茅。
CMAltitudeData CMAltDataData對(duì)象封裝有關(guān)高度相對(duì)更改的信息稚补。 您不直接創(chuàng)建此類的實(shí)例。 當(dāng)您要接收高度計(jì)更改時(shí)嫂伞,請(qǐng)創(chuàng)建CMAltimeter類的實(shí)例孔厉,并使用該對(duì)象查詢事件或開始事件的傳遞拯钻。 高度計(jì)對(duì)象在適當(dāng)?shù)臅r(shí)間創(chuàng)建此類的新實(shí)例帖努,并將其傳遞給您指定的處理程序。
CMAttitude CMAttitude類的一個(gè)實(shí)例表示設(shè)備在某個(gè)時(shí)間點(diǎn)的高度的度量粪般。 “高度”是指身體相對(duì)于給定參考框架的方向拼余。
CMDeviceMotion CMDeviceMotion的實(shí)例封裝了設(shè)備的姿態(tài),旋轉(zhuǎn)速率和加速度的測(cè)量亩歹。
CMGyroData CMGyroData類的實(shí)例包含設(shè)備旋轉(zhuǎn)速率的單次測(cè)量匙监。
CMLogItem CMLogItem類是處理特定類型運(yùn)動(dòng)事件的Core Motion類的基類。 此類的對(duì)象表示可以記錄到文件的一段時(shí)間標(biāo)記的數(shù)據(jù)小作。
CMMagnetometerData CMMagnetometerData類的實(shí)例封裝了由設(shè)備的磁力計(jì)產(chǎn)生的磁場(chǎng)的測(cè)量值亭姥。
CMMotionActivity CMMotionActivity類包含單個(gè)運(yùn)動(dòng)更新事件的數(shù)據(jù)。 在支持運(yùn)動(dòng)的設(shè)備上顾稀,您可以使用CMMotionActivityManager對(duì)象來(lái)在當(dāng)前類型的運(yùn)動(dòng)更改時(shí)請(qǐng)求更新达罗。 發(fā)生更改時(shí),更新信息將打包成CMMotionActivity對(duì)象并發(fā)送到您的應(yīng)用程序静秆。
CMMotionActivityManager CMMotionActivityManager類提供對(duì)設(shè)備存儲(chǔ)的運(yùn)動(dòng)數(shù)據(jù)的訪問粮揉。 運(yùn)動(dòng)數(shù)據(jù)反映用戶是在步行,跑步抚笔,在車輛中扶认,還是靜止的一段時(shí)間。 導(dǎo)航應(yīng)用程序可能會(huì)查找當(dāng)前運(yùn)動(dòng)類型的變化殊橙,并為每個(gè)運(yùn)動(dòng)提供不同的方向辐宾。 使用此類,您可以在當(dāng)前類型的動(dòng)作發(fā)生變化或者可以收集過去的動(dòng)態(tài)變化數(shù)據(jù)時(shí)詢問通知膨蛮。
CMMotionManager CMMotionManager對(duì)象是由iOS提供的運(yùn)動(dòng)服務(wù)的入口螃概。 這些服務(wù)為應(yīng)用程序提供加速度計(jì)數(shù)據(jù),旋轉(zhuǎn)速率數(shù)據(jù)鸽疾,磁力計(jì)數(shù)據(jù)和其他設(shè)備運(yùn)動(dòng)數(shù)據(jù)吊洼,如姿態(tài)。 這些類型的數(shù)據(jù)源自設(shè)備的加速度計(jì)和(在某些型號(hào)上)的磁強(qiáng)計(jì)和陀螺儀制肮。
CMPedometer 使用CMPedometer對(duì)象獲取行人相關(guān)數(shù)據(jù)冒窍。 您可以使用計(jì)步器對(duì)象來(lái)檢索步數(shù)和有關(guān)行駛距離以及上升或下降樓層數(shù)的其他信息递沪。 計(jì)步器對(duì)象管理可以查詢的歷史數(shù)據(jù)緩存,也可以在處理數(shù)據(jù)時(shí)要求實(shí)時(shí)更新综液。
CMPedometerData CMPedometerData對(duì)象封裝了用戶步行距離的信息款慨。 你不會(huì)自己創(chuàng)建這個(gè)類的實(shí)例。 相反谬莹,您可以使用CMPedometer對(duì)象從系統(tǒng)中請(qǐng)求計(jì)步器數(shù)據(jù)檩奠。 每個(gè)請(qǐng)求的數(shù)據(jù)被打包到這個(gè)類的一個(gè)實(shí)例中,并傳遞給您在計(jì)步器對(duì)象中注冊(cè)的處理程序附帽。
CMPedometerEvent 無(wú)資料
CMRecordedAccelerometerData CMRecordedAccelerometerData對(duì)象包含由設(shè)備記錄的單個(gè)加速度計(jì)數(shù)據(jù)埠戳。 您不直接創(chuàng)建此類的實(shí)例。 而是使用CMSensorRecorder對(duì)象從系統(tǒng)中檢索已記錄的數(shù)據(jù)蕉扮。
CMSensorDataList CMSensorDataList對(duì)象允許您枚舉由系統(tǒng)記錄的CMRecordedAccelerometerData對(duì)象整胃。 您不直接創(chuàng)建此類的實(shí)例。 相反喳钟,您會(huì)收到一個(gè)來(lái)自CMSensorRecorder對(duì)象的加速度計(jì)數(shù)據(jù)查詢的結(jié)果屁使。
CMSensorRecorder CMSensorRecorder對(duì)象控制從設(shè)備收集和檢索加速度計(jì)數(shù)據(jù)。 使用傳感器記錄器啟動(dòng)加速度計(jì)數(shù)據(jù)的采集奔则。 之后蛮寂,使用傳感器記錄器取出記錄的數(shù)據(jù),以便您可以對(duì)其進(jìn)行分析易茬。 您可以使用記錄的數(shù)據(jù)來(lái)評(píng)估特定類型的運(yùn)動(dòng)酬蹋,并將結(jié)果并入您的應(yīng)用程序。
CMStepCounter CMStepCounter類可以訪問用戶使用該設(shè)備的步驟數(shù)量疾呻。 步驟信息在具有適當(dāng)內(nèi)置硬件的設(shè)備上收集除嘹,并存儲(chǔ),以便您可以運(yùn)行查詢以確定用戶最近的身體活動(dòng)岸蜗。 您使用此類收集當(dāng)前步數(shù)據(jù)和任何歷史數(shù)據(jù)尉咕。

后記

對(duì)于每一個(gè)知識(shí)點(diǎn),我都是從淺入深璃岳、從宏觀到微觀的給大家介紹年缎,這一篇也是從框架頂層和基礎(chǔ)理論入手,后面我還會(huì)跟著寫幾篇結(jié)合具體的應(yīng)用實(shí)例為大家講解铃慷。謝謝大家单芜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市犁柜,隨后出現(xiàn)的幾起案子洲鸠,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒腕,死亡現(xiàn)場(chǎng)離奇詭異绢淀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瘾腰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門皆的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蹋盆,你說我怎么就攤上這事费薄。” “怎么了栖雾?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楞抡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我岩灭,道長(zhǎng)拌倍,這世上最難降的妖魔是什么赂鲤? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任噪径,我火速辦了婚禮,結(jié)果婚禮上数初,老公的妹妹穿的比我還像新娘找爱。我一直安慰自己,他們只是感情好泡孩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布车摄。 她就那樣靜靜地躺著,像睡著了一般仑鸥。 火紅的嫁衣襯著肌膚如雪吮播。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天眼俊,我揣著相機(jī)與錄音意狠,去河邊找鬼。 笑死疮胖,一個(gè)胖子當(dāng)著我的面吹牛环戈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澎灸,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼院塞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了性昭?” 一聲冷哼從身側(cè)響起拦止,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糜颠,沒想到半個(gè)月后汹族,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艺玲,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年鞠抑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饭聚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搁拙,死狀恐怖秒梳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箕速,我是刑警寧澤酪碘,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站盐茎,受9級(jí)特大地震影響兴垦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜字柠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一探越、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窑业,春花似錦钦幔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至西潘,卻和暖如春卷玉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喷市。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工相种, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人东抹。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓蚂子,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缭黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子食茎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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