iOS开发

iOS感应器之加速度计和陀螺仪(CoreMotion)

2016-10-29  本文已影响365人  i_belive

前言:之前参加了一个比赛,里面主要涉及到VR图片拍摄和图片3D呈现,本次主要说说图片拍摄中使用到的陀螺仪和加速度计。

1、什么是CoreMotion

CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用。加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。

2、CoreMotion作用

CoreMotion主要负责三种数据:加速度值,陀螺仪值,设备motion值。实际上,这个设备motion值就是通过加速度和旋转速度进行 fusing变换算出来的,基本原理后面会介绍。CoreMotion在系统中以单独的后台线程的方式去获得原始数据,并同时执行一些motion算法来提取更多的信息,然后呈献给应用层做进一步处理。CoreMotion框架包含有一个专门的Manager类,CMMotionManager,然后由这个manager去管理三种和运动相关的数据封装类,而 且,这些类都是CMLogItem类的子类,所以相关的motion数据都可以和发生的时间信息一起保存到对应文件中,有了时间戳,两个相邻数据之间的实 际更新时间就很容易得到了。这个东西是非常有用的,比如有些时候,你得到的是50Hz的采样数据,但希望知道的是每一秒加速度的平均值。

3、CoreMotion数据获取

CoreMotion中获取数据主要是两种方式:

4、加速计

//判断加速计是否可用
if ([_motionManager isAccelerometerAvailable]) {    
    // 设置加速计采样频率
    [_motionManager setAccelerometerUpdateInterval:1 / 40.0];
    [_motionManager startAccelerometerUpdates];
}else {
    NSLog(@"设备不支持加速计");
}
//获取数据
CMAcceleration acceleration=_motionManager.accelerometerData.acceleration;
NSLog(@"%f---%f---%f",acceleration.x,acceleration.y,acceleration.z);
//判断加速计是否可用
if([_motionManager isAccelerometerAvailable]) {
    // 设置加速计频率
    [_motionManager setAccelerometerUpdateInterval:1 / 40.0];
    //开始采样数据
    [_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        NSLog(@"%f---%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);
    }];
} else{
    NSLog(@"设备不支持加速计");
}

5、陀螺仪

//判断陀螺仪是否可用
if ([_motionManager isGyroAvailable]) {    
    // 设置陀螺仪采样频率
    [_motionManager setGyroUpdateInterval:1 / 40.0];
    [_motionManager startGyroUpdates];
}else {
    NSLog(@"设备不支持陀螺仪");
}
//获取数据
CMGyroData *gyroData=_motionManager.gyroData;
NSLog(@"%f---%f---%f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData/rotationRate.z);
//判断陀螺仪是否可用
if([_motionManager isGyroAvailable]) {
    // 设置陀螺仪频率
    [_motionManager setGyroUpdateInterval:1 / 40.0];
    //开始采样数据
    [_motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
        NSLog(@"%f---%f---%f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData/rotationRate.z);
    }];
} else{
    NSLog(@"设备不支持陀螺仪");
}
上一篇下一篇

猜你喜欢

热点阅读