• iOS学习笔记34-加速计和陀螺仪


    一、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);
            }];
        }
    }
  • 相关阅读:
    CentOS7 64位下MySQL5.7安装与配置(YUM)
    在windows 7中vagrant up 无反应,没任何信息输出
    vagrant在windows下的安装和配置
    html中嵌入flvplayer.swf播放器,播放视频
    FileItem 出现部分中文乱码解决办法
    华为P6-C00电信版,刷机总是失败? FAIL
    MyEclipse发布按钮无效的办法
    Ubuntu 下建立WiFi热点的方法
    Android系统源码学习步骤
    android源代码在线阅读
  • 原文地址:https://www.cnblogs.com/ming1025/p/6069499.html
Copyright © 2020-2023  润新知