版本記錄
版本號(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)示意圖登舞。
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è)圖守谓。
檢測(cè)設(shè)備在x,y,z軸上的加速度(加速度范圍為-1 ~ 1),可以感覺加速度值判斷屏幕的方向您单,如下圖所示斋荞。
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)铃辖。
這個(gè)框架主要是要處理下面三種數(shù)據(jù):
- 加速度值
CMAccelerometerData
- 陀螺儀值
CMGyroData
- 設(shè)備
motion
值CMDeviceMotion
實(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 類可以訪問用戶使用該設(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í)例為大家講解铃慷。謝謝大家单芜。