iOS Core Motion基本使用

weixin_33866037發表於2017-08-07

Core Motion可以讓開發者從各個內建感測器那裡獲取未經修改的感測資料,並觀測或響應裝置各種運動和角度變化。通過這些感測器可以獲取加速度值,陀螺儀值,裝置motion值等。

CoreMotionManager

CoreMotionManager類能夠使用到裝置的所有移動資料(motion data),Core Motion框架提供了兩種對motion資料的操作方式,一個是"pull",另一個是"push",其中"pull"

方式能夠以CoreMotionManager的只讀方式獲取當前任何感測器狀態或是組合資料。"push"方式則是以塊或者閉包的形式收集到你想要得到的資料並且會在特定週期內得到實時的更新。

push:提供一個執行緒管理器NSOperationQueue和一個回撥Block,CoreMotion自動在每一個取樣資料到來的時候回撥這個Block,進行處理。在這種情況下,Block中的操作會在你自己的主執行緒內執行

pull:你必須主動去向CMMotionManager要資料,這個資料就是最近一次的取樣資料。你不去要,CMMotionManager就不會給你,在這種情況下,Core Motion所有的操作都在自己的後臺執行緒中進行,不會有任何干擾你當前執行緒的行為

Core Motion的基本使用:初始化->獲取資料->處理資料->不需要時 停止獲取資料, 為了保證效能,蘋果建議在使用CoreMotionManager的時候採用單例模式。

-(void)stopAccelerometerUpdates;//停止獲取加速度計資料

-(void)stopGyroUpdates;//停止獲取陀螺儀資料

-(void)stopDeviceMotionUpdates;//停止獲取裝置motion資料

CoreMotion主要負責三種資料:

加速度值CMAccelerometerData

陀螺儀值CMGyroData

裝置motion值CMDeviceMotion

CMDeviceMotion屬性介紹:

attitude:通俗來講,就是告訴你手機在當前空間的位置和姿勢

gravity:重力資訊,其本質是重力加速度向量在當前裝置的參考座標系中的表達

userAcceleration:加速度資訊

rotationRate:即時的旋轉速率,是陀螺儀的輸出

CMMotionManager *mManager = [[CMMotionManager alloc] init];

_mManager = mManager;

//加速度器檢測

if ([mManager isAccelerometerAvailable]) {//是否可用

NSLog(@"Accelerometer is available");

}else{

NSLog(@"Accelerometer is not available");

}

if ([mManager isAccelerometerActive]) {//是否啟動

NSLog(@"Accelerometer is active");

}else{

NSLog(@"Accelerometer is not actiove");

}

//陀螺儀檢測

if ([mManager isGyroAvailable]) {

NSLog(@"Gryro is available");

}else{

NSLog(@"Gryro is not available");

}

if ([mManager isGyroActive]) {

NSLog(@"Gryo is active");

}else{

NSLog(@"Gryo is not active");

}

/************************獲取加速度***********************/

//1.push 方式

if ([mManager isAccelerometerAvailable] ) {

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

mManager.accelerometerUpdateInterval = 0.01;

[mManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {

NSLog(@"X = %.04f, Y = %.04f, Z = %.04f",accelerometerData.acceleration.x, accelerometerData.acceleration.y, accelerometerData.acceleration.z);

}];

}

//2.pull方式 備註:pull方式獲取acceletation資料,需要自己實現計時器功能

if ([mManager isAccelerometerAvailable]) {//是否可用

NSLog(@"111Accelerometer is available");

mManager.accelerometerUpdateInterval = 0.01;//頻率100HZ

[mManager startAccelerometerUpdates];//開始更新

}

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateAccelerometer) userInfo:nil repeats:YES];

[timer fire];

/************************獲取陀螺儀***********************/

if ([mManager isGyroAvailable]) {

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

mManager.accelerometerUpdateInterval = 0.01;

[mManager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {

NSLog(@"X = %.04f, Y = %.04f, Z = %.04f",gyroData.rotationRate.x, gyroData.rotationRate.y, gyroData.rotationRate.z);

}];

}

參考:http://www.cocoachina.com/ios/20141103/10111.html

相關文章