iOS學習筆記34-加速計和陀螺儀

來源:互聯網
上載者:User

標籤:

一、CoreMotion架構介紹

我們知道有一些iOS的應用,會有一些特殊的要求,比如:
1. 電子羅盤指南針之類的應用:讓我們知道方向。
2. 運動類型軟體:讓我們知道我們跑步多少公裡。
3. 社交軟體中的搖一搖功能。
4. 遊戲中扮演角色類中根據裝置的晃動等進行操作。

其實,他們多半是使用了iOS中的一個核心運動架構CoreMotion.framework

  • 使用iOS提供給我們的CoreMotion架構,主要是為了訪問加速度計陀螺儀的相關資料。
  • 它不僅僅提供給你獲得即時的加速度值和旋轉速度值,更重要的是,蘋果在其中整合了很多演算法,可以直接給你輸出把重力加速度分量剝離的加速度,省去你的高通濾波操作,以及提供給你一個專門的裝置的三維位置資訊。
感應器介紹:
  1. 加速度計:
    加速度計的原理很簡單,現在手機裡面基本配備的都是3維線感應器,也就是說,用來測量x,y,z三個軸上的加速力。加速力就是當物體在加速過程中作用在物體上的力,就好比地球引力,也就是重力。
  2. 陀螺儀:
    陀螺儀的主要作用,是基於角動量守恒的理論,沿著某個特定的座標軸測量旋轉速率。在使用中,陀螺儀的轉子在高速旋轉時,始終指向一個固定的方向,當運動物體的運動方向偏離預定方向時,陀螺儀就可以感受出來。
二、CoreMotion使用

CoreMotion主要負責三種資料:
  • 加速度值CMAccelerometerData
  • 陀螺儀值CMGyroData
  • 裝置motion值CMDeviceMotion

實際上,這個裝置motion值就是通過加速度和旋轉速度進行變換算出來的

CMDeviceMotion屬性介紹:
  1. attitude:通俗來講,就是告訴你手機在當前空間的位置和姿勢
  2. gravity:重力資訊,其本質是重力加速度向量在當前裝置的參考座標系中的表達
  3. userAcceleration:加速度資訊
  4. rotationRate:即時的旋轉速率,是陀螺儀的輸出
使用CoreMotion的步驟:
  1. 初始化CMMotionManager管理對象
  2. 調用管理對象的對象方法擷取資料,有2種方式
  3. 處理資料
  4. 當你不需要使用的時候,停止擷取資料
-(void)stopAccelerometerUpdates;//停止擷取加速度計資料-(void)stopGyroUpdates;//停止擷取陀螺儀資料-(void)stopDeviceMotionUpdates;//停止擷取裝置motion資料
在CoreMotion中有2種擷取資料方式:
  1. Push方式:
    提供一個線程管理器NSOperationQueue和一個回調BlockCoreMotion自動在每一個採樣資料到來的時候回調這個Block,進行處理。在這種情況下,Block中的操作會在你自己的主線程內執行。
  2. 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-加速計和陀螺儀

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.