一、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学习新知识-加速计和陀螺仪的更多相关文章

  1. iOS开发-CoreMotion框架(加速计和陀螺仪)

    CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来 ...

  2. ios开发——实用技术篇Swift篇&加速计和陀螺仪

    加速计和陀螺仪 //返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnim ...

  3. IOS科研IOS开发笔记学习基础知识

    这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollVi ...

  4. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  5. 纪录我的iOS学习之路

    学习资料的网址 田伟宇(Casa Taloyum)有几篇介绍iOS架构的文章,一级棒!原博客链接. iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方 ...

  6. iOS 学习资源

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  7. iOS学习资料整理

    视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...

  8. iOS 学习

    iOS 学习资料 (适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解 ...

  9. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

随机推荐

  1. c# 复制dataset中table结构跟数据

    DataTable dt = new DataTable(); dt = ds.Tables[0].Copy();

  2. Java类加载器的工作原理

    Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它. ...

  3. 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼

    我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...

  4. Python小代码_9_求水仙花数

    for i in range(100, 1000): ge = i % 10 shi = i // 10 % 10 bai = i // 100 if ge ** 3 + shi ** 3 + bai ...

  5. Android颜色配置器

    一.Android Color设置 1.在xml文件中 想设置颜色直接设置background的属性或者其他的color属性.随便设置一个颜色如#000,再点击左边的颜色方块,弹出颜色选择器选择颜色 ...

  6. FJUT寒假作业第二周C题解(位运算)

    题目来源:http://210.34.193.66:8080/vj/Contest.jsp?cid=161#P2 题意比较好理解.如果直接按题目要求一步一解.一定超时.作为一个懒人也不会这么暴力一个肯 ...

  7. Rails中rspec测试xxx_path调用失败的解决

    首先要想生成类似于home_path,about_path之类的方法,必须在路由文件中添加对应方法: match '/help',to:"static_pages#help",vi ...

  8. Zookeeper核心工作机制(zookeeper特性、zookeeper数据结构、节点类型)

    10.1 zookeeper特性 1.Zookeeper:一个leader,多个follower组成的集群. 2.全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个ser ...

  9. TCP发送源码学习(2)--tcp_write_xmit

    一.tcp_write_xmit()将发送队列上的SBK发送出去,返回值为0表示发送成功.函数执行过程如下:1.检测拥塞窗口的大小.2.检测当前报文是否完全处在发送窗口内.3.检测报文是否使用nagl ...

  10. Ubuntu等Linux系统显卡性能测试软件 Unigine 3D

    Ubuntu等Linux系统显卡性能测试软件 Unigine 3D Ubuntu Intel显卡驱动安装,请参考: http://blog.csdn.net/zhangrelay/article/de ...