美文网首页iOS开发
iOS感应器之加速度计和陀螺仪(CoreMotion)

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

作者: i_belive | 来源:发表于2016-10-29 20:59 被阅读365次

    前言:之前参加了一个比赛,里面主要涉及到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中获取数据主要是两种方式:

    • 一种是Push,就是你提供一个线程管理器NSOperationQueue,再提供一个Block,这样,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这中情况下,block中的操作会在你自己的主线程内执行。

    • 一种是 Pull,在这个方式里,你必须主动去像CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你。当然,在这种情况下,CoreMotion所有的操作都在自己的后台线程中进行,不会有任何干扰你当前线程的行为。

    4、加速计

    • Pull获取方式
    //判断加速计是否可用
    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);
    
    • Push获取方式
    //判断加速计是否可用
    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、陀螺仪

    • Pull获取方式
    //判断陀螺仪是否可用
    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);
    
    • Push获取方式
    //判断陀螺仪是否可用
    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(@"设备不支持陀螺仪");
    }
    

    相关文章

      网友评论

        本文标题:iOS感应器之加速度计和陀螺仪(CoreMotion)

        本文链接:https://www.haomeiwen.com/subject/btuyuttx.html