iOS 加速计和陀螺仪 简介

一、CoreMotion框架介绍

我们知道有一些iOS的应用,会有一些特殊的要求,比如:
1. 电子罗盘指南针之类的应用:让我们知道方向。
2. 运动类型软件:让我们知道我们跑步多少公里。
3. 社交软件中的摇一摇功能。
4. 游戏中扮演角色类中根据设备的晃动等进行操作。

其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework

使用iOS提供给我们的 CoreMotion 框架,主要是为了访问 加速度计 陀螺仪 的相关数据。 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。
传感器介绍:
加速度计:
加速度计的原理很简单,现在手机里面基本配备的都是3维线传感器,也就是说,用来测量x,y,z三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。
<img alt="\" src="http://www.2cto.com/uploadfile/Collfiles/20160418/20160418153000105.png" title="" kf="" ware="" vc="" "="" target="_blank" class="keylink" style="border-width: 0px; padding: 0px; margin: 0px; list-style: none; color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; width: 340px; height: 395px;">

vc/yo6y1sdTLtq/O78zltcTUy7avt73P8sarwOvUpLaot73P8sqxo6zN08Ld0se+zb/J0tS40Mrcs/bAtKGjPGJyIC8+DQo8aW1nIGFsdD0="" src="/uploadfile/Collfiles/20160418/20160418153000107.png" title="\" />

二、CoreMotion使用

\

CoreMotion主要负责三种数据:
加速度值 CMAccelerometerData  陀螺仪值 CMGyroData  设备motion值 CMDeviceMotion

实际上,这个设备motion值就是通过加速度和旋转速度进行变换算出来的
\

CMDeviceMotion属性介绍:
attitude :通俗来讲,就是告诉你手机在当前空间的位置和姿势  gravity :重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达  userAcceleration :加速度信息  rotationRate :即时的旋转速率,是陀螺仪的输出
使用CoreMotion的步骤:
初始化 CMMotionManager 管理对象 调用管理对象的对象方法获取数据,有2种方式 处理数据 当你不需要使用的时候,停止获取数据
-(void)stopAccelerometerUpdates;//停止获取加速度计数据
-(void)stopGyroUpdates;//停止获取陀螺仪数据
-(void)stopDeviceMotionUpdates;//停止获取设备motion数据
在CoreMotion中有2种获取数据方式:
Push 方式:
提供一个线程管理器 NSOperationQueue 和一个回调 Block CoreMotion 自动在每一个采样数据到来的时候回调这个 Block ,进行处理。在这种情况下, Block 中的操作会在你自己的 主线程 内执行。  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);
        }];
    }
}

CMMotionManager常用的属性

CMAttitude的三个属性Yaw,PitchRoll分别代表左右摆动、俯仰以及滚动。它的大小跟速度没有关系只跟位置有关。

motionManager.attitude.yaw(左右摆动)

motionManager.attitude.pitch(俯仰)

motionManager.attitude.roll(滚动)

Gravity的三个属性x,y,z代表重力1g在三个轴上的设备的重力分布情况,它的大小跟速度没有关系只跟位置有关。

motionManager.gravity.x

motionManager.gravity.y

motionManager.gravity.z

UserAcceleration三个属性x,y,z代表三个轴上的设备运动的加速度分布情况,它的大小跟位置没有关系只跟单位时间内的速度变化有关。

motionManager.userAcceleration.x

motionManager.userAcceleration.y

motionManager.userAcceleration.z

CMRotationRateXY,Z分别代表三个轴上的旋转速率,单位为弧度/秒。它的大小跟位置没有关系只跟速度大小有关。

motionManager.rotationRate.x

motionManager.rotationRate.y

motionManager.rotationRate.z



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值