標籤:
一、CoreMotion架構介紹
我們知道有一些iOS的應用,會有一些特殊的要求,比如:
1. 電子羅盤指南針之類的應用:讓我們知道方向。
2. 運動類型軟體:讓我們知道我們跑步多少公裡。
3. 社交軟體中的搖一搖功能。
4. 遊戲中扮演角色類中根據裝置的晃動等進行操作。
其實,他們多半是使用了iOS中的一個核心運動架構CoreMotion.framework
- 使用iOS提供給我們的
CoreMotion架構,主要是為了訪問加速度計和陀螺儀的相關資料。
- 它不僅僅提供給你獲得即時的加速度值和旋轉速度值,更重要的是,蘋果在其中整合了很多演算法,可以直接給你輸出把重力加速度分量剝離的加速度,省去你的高通濾波操作,以及提供給你一個專門的裝置的三維位置資訊。
感應器介紹:
- 加速度計:
加速度計的原理很簡單,現在手機裡面基本配備的都是3維線感應器,也就是說,用來測量x,y,z三個軸上的加速力。加速力就是當物體在加速過程中作用在物體上的力,就好比地球引力,也就是重力。
- 陀螺儀:
陀螺儀的主要作用,是基於角動量守恒的理論,沿著某個特定的座標軸測量旋轉速率。在使用中,陀螺儀的轉子在高速旋轉時,始終指向一個固定的方向,當運動物體的運動方向偏離預定方向時,陀螺儀就可以感受出來。
二、CoreMotion使用
CoreMotion主要負責三種資料:
- 加速度值
CMAccelerometerData
- 陀螺儀值
CMGyroData
- 裝置motion值
CMDeviceMotion
實際上,這個裝置motion值就是通過加速度和旋轉速度進行變換算出來的
CMDeviceMotion屬性介紹:
attitude:通俗來講,就是告訴你手機在當前空間的位置和姿勢
gravity:重力資訊,其本質是重力加速度向量在當前裝置的參考座標系中的表達
userAcceleration:加速度資訊
rotationRate:即時的旋轉速率,是陀螺儀的輸出
使用CoreMotion的步驟:
- 初始化
CMMotionManager管理對象
- 調用管理對象的對象方法擷取資料,有2種方式
- 處理資料
- 當你不需要使用的時候,停止擷取資料
-(void)stopAccelerometerUpdates;//停止擷取加速度計資料-(void)stopGyroUpdates;//停止擷取陀螺儀資料-(void)stopDeviceMotionUpdates;//停止擷取裝置motion資料
在CoreMotion中有2種擷取資料方式:
Push方式:
提供一個線程管理器NSOperationQueue和一個回調Block,CoreMotion自動在每一個採樣資料到來的時候回調這個Block,進行處理。在這種情況下,Block中的操作會在你自己的主線程內執行。
Pull方式:
你必須主動去向CMMotionManager要資料,這個資料就是最近一次的採樣資料。你不去要,CMMotionManager就不會給你。
1. 加速度計使用Pull方式擷取:
- (void)useAccelerometerPull{ //初始化全域管理對象 CMMotionManager *manager = [[CMMotionManager alloc] init]; self.motionManager = manager; //判斷加速度計可不可用,判斷加速度計是否開啟 if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){ //告訴manager,更新頻率是100Hz manager.accelerometerUpdateInterval = 0.01; //開始更新,後台線程開始運行。這是Pull方式。 [manager startAccelerometerUpdates]; } //擷取並處理加速度計資料 CMAccelerometerData *newestAccel = self.motionManager.accelerometerData; NSLog(@"X = %.04f",newestAccel.acceleration.x); NSLog(@"Y = %.04f",newestAccel.acceleration.y); NSLog(@"Z = %.04f",newestAccel.acceleration.z);}
2. 加速度計使用Push方式擷取:
- (void)useAccelerometerPush{ //初始化全域管理對象 CMMotionManager *manager = [[CMMotionManager alloc] init]; self.motionManager = manager; //判斷加速度計可不可用,判斷加速度計是否開啟 if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){ //告訴manager,更新頻率是100Hz manager.accelerometerUpdateInterval = 0.01; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //Push方式擷取和處理資料 [manager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { NSLog(@"X = %.04f",accelerometerData.acceleration.x); NSLog(@"Y = %.04f",accelerometerData.acceleration.y); NSLog(@"Z = %.04f",accelerometerData.acceleration.z); }]; }}
3. 陀螺儀使用Push方式擷取,Pull方式就不列出來了,和加速度計使用相似:
- (void)useGyroPush{ //初始化全域管理對象 CMMotionManager *manager = [[CMMotionManager alloc] init]; self.motionManager = manager; //判斷陀螺儀可不可以,判斷陀螺儀是不是開啟 if ([manager isGyroAvailable] && [manager isGyroActive]){ NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //告訴manager,更新頻率是100Hz manager.gyroUpdateInterval = 0.01; //Push方式擷取和處理資料 [manager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData *gyroData, NSError *error) { NSLog(@"Gyro Rotation x = %.04f", gyroData.rotationRate.x); NSLog(@"Gyro Rotation y = %.04f", gyroData.rotationRate.y); NSLog(@"Gyro Rotation z = %.04f", gyroData.rotationRate.z); }]; }}
以上代碼必須是真機上才能正常運行,利用上面的知識我們可以做類似於這樣的效果:
有什麼建議可以在下方評論區中提出!
iOS學習筆記34-加速計和陀螺儀