




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、iOS4 中 Core Motion 框架的介紹和使用時間: 2010-08-11 17:31 點擊:829 次在 iOS4 之前,加速度計由 UIAccelerometer 類來負(fù)責(zé)工作,而電子羅盤則由 Core Location 接管。而4 的推出,由于加速度計的升級(有消息說使用的是這款) 和陀螺儀的引入,與 motion 相關(guān)的編程成為重頭戲,所以,蘋果在 iOS4 中增加一個一個專門負(fù)責(zé)該方面處理的框架,就是 Core Motion Framework。這個 Core Motion好處呢?簡單來說,它不僅僅提供給你獲得實時的加速度值和旋轉(zhuǎn)速度值,更重要的是,蘋果在其中集成了很多算法,
2、可以直接給你輸出把重力 加速度分量剝離的加速度,省去你的高通濾波操作,以及提供給你一個專門的設(shè)備的三維 attitude 信息!在iOS4 之前,加速度計由UIAccelerometer 類來負(fù)責(zé)工作,而電子羅盤則由Core Location 接管。而4 的推出,由于加速度計的升級(有消息說使用的是 這款) 和陀螺儀的引入,與mot有這么一個好東西,自然就要好好利用了。下面就介紹一下,如何利用 Core Motion Framework,來獲得對應(yīng)的 motion 信息。Core Motion 在 iOS4.0 主要負(fù)責(zé)三種數(shù)據(jù):加速度值,陀螺儀值,設(shè)備 motion 值。實際上,這個設(shè)備 m
3、otion 值就是通過加速度和旋轉(zhuǎn)速度進行 fusing 變換算出來的,基本原理后面會介紹。Core Motion 在系統(tǒng)中以單獨的線程的方式去獲得原始數(shù)據(jù),并同時執(zhí)行一些motion 算法來提取的信息,然后呈獻給應(yīng)用層做進一步處理。Core Motion 框架包含有一個專門的 Manager 類,CMMotionManager,然后由這個 manager 去管理三種和運動相關(guān)的數(shù)據(jù)封裝類,而 且,這些類都是 CMLogItem 類的子類,所以相關(guān)的 motion 數(shù)據(jù)都可以和發(fā)生的時間信息一起保存到對應(yīng)文件中,有了時間戳,兩個相鄰數(shù)據(jù)之間的實 際更新時間就很容易得到了。這個東西是非常有用的,
4、比希望知道的是每一秒加速度的平均值。些時候,你得到的是 50Hz 的采樣數(shù)據(jù),但從 Core Motion 中獲取數(shù)據(jù)主要是兩種方式,一種是 Push,就是你提供一個線程管理器 NS OperationQueue,再提供一個 Block(有點像 C 中 的回調(diào)函數(shù)),這樣,Core Motion 自動在每一個采樣數(shù)據(jù)到來的時候回調(diào)這個 Block,進行處理。在這中情況下,block 中的操作會在你自己的主線執(zhí)行。另式叫做 Pull,在這個方式里,你必須主動去像 CoreMotion Manager 要數(shù)據(jù),這個數(shù)據(jù)就是最近一次的采樣數(shù)據(jù)。你不去要,Core Motion Manager 就不會
5、給你。當(dāng)然,在這種情況下,Core Motion 所有的操作都在自己的進行,不會有任何干擾你當(dāng)前線程的行為。線程中那接下來就是,我在什么時候選擇什么方式呢?蘋果了一個使用指南,比較了兩種方式的優(yōu)劣,并做出了使用場景的。如下圖所示。應(yīng)該說,兩種方式各自的優(yōu)缺點還是很鮮明的,使用場景也大不一樣,很好區(qū)分。Core Motion 的大體介紹就是這些。下面說說 Core Motion 具體負(fù)責(zé),計算和處理。Core Motion 的使用就是一:初始化,獲取數(shù)據(jù),處理后事。在初始化階段,不管你要獲取的是什么數(shù)據(jù),首先需要做的就是所有的操作都會由這個 manager 接管。后面的初始化操作相當(dāng)直觀,以加速
6、度的 pull 方式為例如果是 push 方式,更新的代碼可以寫成這樣接下來就是獲取數(shù)據(jù)了。Again,很簡單的代碼通過定義的 CMAccelerometerData 變量,獲取 CMAcceleration 信息。和以前的 UIAccelerometer 類的使用方式一樣,CMAcceleration 在Core Motion 中是以結(jié)構(gòu)體形式定義的對應(yīng)的 motion 信息,比如加速度或者旋轉(zhuǎn)速度,就可以直接從這三個成員變量中得到。最后是處理后事,就是在你不需要 Core Motion 進行處理的時候,資源motionManager stopAccelerometerUpdates;/mo
7、tionManager stopGyroUpdates;/motionManager stopDeviceMotionUpdates; motionManager release;typedef struct double x; double y; double z;CMAccelerometerData *newestAccel = motionManager.accelerometerData; filteredAcceleration0 = newestAccel.acceleration.x; filteredAcceleration1 = newestAccel.accelerati
8、on.y; filteredAcceleration2 = newestAccel.acceleration.z;motionManager startAccelerometerUpdatesToQueue:NSOperationQueue currentQueue withHandler:(CMAccelerometerData *latestAcc, NSError *error)/ Your code here;if (!motionManager.accelerometerAvailable) / fail code / 檢查傳感器到底在設(shè)備上是否可用motionManager.acc
9、elerometerUpdateerval = 0.01; / 告訴 manager,更新頻率是 10 0HzmotionManager startAccelerometerUpdates; / 開始更新,線程開始運行。這是 p ull 方式。motionManager = CMMotionManager alloc init;你看,就是這么簡單。當(dāng)然,如果這么 Core Motion 這么簡單,就太無趣了。實際上,Cor e Motion 最好玩的地方,既不是加速度,也不是角速度,而是經(jīng)過 sensor fusing 算法處理的 Device Motion 信息的提供。Core Motion
10、 里面提供了一個叫做 CMDeviceMotion 的類,用來把下圖所示的這些數(shù)據(jù)封裝成 Device Motion 信息:來看看這些被封裝數(shù)據(jù)的介紹。第一個 attitude,就是剛才說到的三維 attitude,通俗來講,就是告訴你在當(dāng)前空間的位置和。第二個是重力信息,其本質(zhì)是重力加速度矢量在當(dāng)前設(shè)備的參考坐標(biāo)系中的表達,開發(fā)不再需要通過濾波來提取這個信息了,因為 Core Motion 已經(jīng)給你了。第三個是加速度信息。同樣,濾波在這里不再需要(根據(jù)程序需求而加的濾波算法自然是可以保留的)。第四個是即時的旋轉(zhuǎn)速率,也就是 roion rate,是陀螺儀的輸出。下面就來詳細介紹一下這四種數(shù)據(jù)
11、。1. Attitude。在 CMDeviceMotion 對象中,attitude 是以property (readonly, nonatomic) CMAttitude *attitude;屬性定義的。一個 CMAttitude 的實例,封裝了關(guān)于當(dāng)前設(shè)備在空間中的姿態(tài)信息。這個信息是由下面集中數(shù)學(xué)表達式定義的:1.一個四元數(shù)。2.3.一個變換 roion 矩陣三個歐拉角 (roll, pitch, 和 yaw)。關(guān)于歐拉角,again,請參考我上一篇文章。四元數(shù)是一種 Attitude Determination System 經(jīng)常使用的數(shù)據(jù)保存形式,我不是很清楚。而歐拉角和變換矩陣則是
12、相輔相成的,兩者之間可以相互推導(dǎo)。所以這里主要介紹一下對虛擬現(xiàn)實或者都大有幫助的變換矩陣。這個 roion 變換矩陣究竟用呢?來這本質(zhì)上講,變換矩陣給闡述了從一個向量空間到另一個向量空間的關(guān)系。舉個例子,在很多應(yīng)用中都需要對加速度信息進行判斷,但是,用戶在使用的過程中,是不到 t2斷變換的,可以到某個設(shè)備在 t1 時間點的加速度以及重力信息,也可以時間點的信息,卻不能直接拿他們做運 算。為什么?因為由于各個軸方向的變化,加速度和重力信息在 t1 時間點屬于一個向量空間,在 t2 時間點,就屬于另一個向量空間了,如果你硬拿 acc.x1 和 acc.x2 求設(shè)備的運動模式,自然不可能準(zhǔn)的。所以,
13、現(xiàn)在是,要找到兩個三的線性變換 T,讓這個變換關(guān)系幫把某個空間的值變換到另一個空間去,這樣就可以在同一個空間做比較 或者任何計算了。CoreMotion 如何解決這個問題呢?它首先讓你可以在程序開始的初始時間點 t1(比如你畫第一禎的時候)一個 attitude 的值作為參照坐標(biāo)系,假定這個向量是 v_ref。在任何時間點,比如 t2,一個 attitude 的值,假定這個向量是 v_dev,位于當(dāng)前設(shè)備的坐標(biāo)系,那么有以下關(guān) 系:其中 R 就是 roion matrix。由于 v_ref 是正交基向量,所以剛才說到了,v_ref 和v_dev 都是其對應(yīng)向量空間的正交基,而這個 R 矩陣正好
14、是正交矩陣,所有的列向量線性獨立。所以,R 所對應(yīng)的變換,正是而且這是一對一變換。要找的這兩個空間的線性變換,好,上面這個結(jié)論告訴什么呢?你在當(dāng)前時刻 t2的當(dāng)前坐標(biāo)系下的加速度信息,不僅在 t1 時刻的參照坐標(biāo)系下有對應(yīng)的向量,而且僅有一個對應(yīng) 向量!如果定義 a_dev 是當(dāng)前的加速度向量,那么它在參照坐標(biāo)系里面對應(yīng)的加速度向量只有一個,而且肯定可以由下面式子求出這個式子不存在無解的情況,因為正交矩陣都是有逆矩陣的。經(jīng)此變換,你就可以隨意比較和計算不同時間點的加速度和重力信息,從而得出精確的用戶運動模式了。比較有趣的一點是,R 變換矩陣的表達形式,正好表明了 R 和 roion rate
15、的關(guān)系: 當(dāng)前時間點的坐標(biāo)系和參照坐標(biāo)系的變換矩陣,是由陀螺儀提供的 yaw, pitch 和roll 三個軸上角度信息推斷的。于是,再一次,感受到了新加的陀螺儀強大的地方。更強大的地方在于,Core Motion 直接就把 R 矩陣提供給開發(fā)者了,省去了開發(fā)者很多易錯而繁瑣的工作。說了這么多鋪墊,還是簡單介紹一下獲得當(dāng)前時間點的 R 矩陣信息的步驟吧:首先,獲得參考矩陣信息然后在希望得到 R 矩陣的時候,執(zhí)行下列操作:很簡單,也很直觀,一個 multiplyByInverseOfAttitude 的調(diào)用,正好反應(yīng)了剛才推導(dǎo)的矩陣運算關(guān)系。至此,ro做不到了。ionMatrix 被拿到,接下來
16、的事情就只有想不到,沒有2. Gravity 和 UserAcceleration。之所以把他們放在一起講,是因為他們本質(zhì)上比較類似,而且原始的加速度(就是通過 motionManager startAccelerometerUpdates獲得的那個值)本來就是他們的疊加和,換句話說,將原始加速度分解就得到了他們倆,只不過現(xiàn)在蘋果幫你把這個濾波分解給做了。他倆在 Core Motion 中的屬性定義是都是 CMAcceleration 所包裝的結(jié)構(gòu)體。而且,兩者的參考坐標(biāo)系都是一樣的,以設(shè)備的外框架為準(zhǔn):property (readonly, nonatomic) CMAcceleration
17、 gravity; property (readonly, nonatomic) CMAcceleration UserAcceleration;CMRoionMatrix roion;CMDeviceMotion *deviceMotion = motionManager.deviceMotion; CMAttitude *attitude = deviceMotion.attitude;if (referenceAttitude != nil) attitude multiplyByInverseOfAttitude:referenceAttitude;roion = attitude.r
18、oionMatrix;if (motionManager != nil) CMDeviceMotion *deviceMotion = motionManager.deviceMotion; referenceAttitude = deviceMotion.attitude retain;得到這兩種數(shù)據(jù)的方式比較簡單,就是直接通過celeration/gravity 的三個成員變量即可。motionManager.deviceMotion.userAc3. Roion rate。旋轉(zhuǎn)速率是通過叫 CMRoionRate 的結(jié)構(gòu)體封裝的,其變量定義和 CMAcceleration 一模一樣。正負(fù)的確定,由右手法 則判斷。看到這里,不少朋友可能會有問題:這個數(shù)據(jù),和之前介紹的直接通過 motionManager 獲得的 CMGyroData區(qū)別呢?通過 Device Motion 封裝處理后的 Roion rate,去掉了原始的 CMGyroData 所有的bias。舉個例子,如果把設(shè)備放在桌上不動,理想情況下,陀螺儀的輸出應(yīng)該是 0。問題在于, 你直接從陀螺儀獲得的原始數(shù)據(jù)并不是 0,而是由很多不確定值,這其中就包括了很多的漂移誤差等等,比如陀螺儀溫漂,就會影響到導(dǎo)致的非 0的讀數(shù)。 Core M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程測量技術(shù)實踐訓(xùn)練題
- 2025年上半年宜昌市直事業(yè)單位招考工作人員(62名)易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年宜賓江安縣招考工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省阜陽潁上縣江店孜鎮(zhèn)人民政府招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年抽紗刺繡工藝品項目投資申請報告代可行性研究報告
- 2025年上半年安徽省宿州市直事業(yè)單位易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省交通控股集團限公司社會化公開招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽宿州市督查信息中心選調(diào)事業(yè)單位3人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽宿州學(xué)院專職輔導(dǎo)員招聘10人(第二批)易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安慶市太湖縣縣人民醫(yī)院招考專業(yè)技術(shù)人員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年食品供應(yīng)商合同范本
- 《網(wǎng)絡(luò)信息安全教學(xué)》課件
- 徐州2025年江蘇徐州市口腔醫(yī)院招聘非在編醫(yī)務(wù)人員53人筆試歷年參考題庫附帶答案詳解-1
- 2025年01月2025中國作家協(xié)會所屬單位公開招聘11人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 用色彩情感引發(fā)共鳴社交媒體運營秘訣
- 2025年江西機電職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- (高清版)JTGT 3650-01-2022 公路橋梁施工監(jiān)控技術(shù)規(guī)程
- GB/T 28799.2-2020冷熱水用耐熱聚乙烯(PE-RT)管道系統(tǒng)第2部分:管材
- 2023-瑞幸咖啡vi手冊
- 公司生產(chǎn)進度表
- 10000中國普通人名大全
評論
0/150
提交評論