iOS_陀螺仪、加速计的使用

  • CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用。
  • CoreMotionManager类能够使用到设备的所有移动数据(motion data),Core Motion框架提供了两种对motion数据的操作方式,一个是”pull”,另一个是”push”,其中”pull”方式能够以CoreMotionManager的只读方式获取当前任何传感器状态或是组合数据。”push”方式则是以块或者闭包的形式收集到你想要得到的数据并且会在特定周期内得到实时的更新
  • 加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟,需要真机。
  • 坐标系:手机平放于桌面,屏幕朝上。以屏幕中心点为原点,平行于屏幕向右为X轴正方向,平行于屏幕向上为Y轴正方向,垂直于屏幕向上为Z轴正方向。
  • CMMotionManager内包含加速计(Accelerometer)、陀螺仪(Gyro)、磁力计(Magnetometer)等,加速计、陀螺仪、磁力计等的使用方式基本一致。

CMMotionManager的一些属性和方法

  • 加速计(Accelerometer)相关
// 加速计采集频率
@property(assign, nonatomic) NSTimeInterval accelerometerUpdateInterval
// 加速计是否可用
@property(readonly, nonatomic, getter=isAccelerometerAvailable) BOOL accelerometerAvailable
// 加速计是否开启
@property(readonly, nonatomic, getter=isAccelerometerActive) BOOL accelerometerActive
// 调用加速计时获取的参数对象
@property(readonly, nullable) CMAccelerometerData *accelerometerData
/* 
    开始调用加速计方法一(pull方式更新数据,只会获取到当时数据,数据不会根据采集频率进行更新)
    可以用属性accelerometerData获取加速计获取的数据
*/
- (void)startAccelerometerUpdates;
/* 
    开始调用加速计方法二(push方式更新数据,实时获取数据,可以根据频率进行实时更新)
    参数handler为block方法:
    typedef void (^CMAccelerometerHandler)(CMAccelerometerData * __nullable accelerometerData, NSError * __nullable error);
    参数accelerometerData即加速计获取到的参数
        |--> X:accelerometerData.acceleration.x
        |--> Y:accelerometerData.acceleration.y
        |--> Z:accelerometerData.acceleration.z
*/
- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;
// 停止加速计
- (void)stopAccelerometerUpdates;
  • 陀螺仪(Gyro)相关
// 陀螺仪采集频率
@property(assign, nonatomic) NSTimeInterval gyroUpdateInterval
// 陀螺仪是否可用
@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable
// 陀螺仪是否开启
@property(readonly, nonatomic, getter=isGyroActive) BOOL gyroActive
// 陀螺仪获取的数据
@property(readonly, nullable) CMGyroData *gyroData

/*
    开始调用陀螺仪方法一
    可以通过属性gyroData得到陀螺仪获取到的数据
*/ 
 - (void)startGyroUpdates;
/*
    开始调用陀螺仪方法二
    参数handler为block方法:
    typedef void (^CMGyroHandler)(CMGyroData * __nullable gyroData, NSError * __nullable error);
    gyroData即陀螺仪获取到的数据
        |--> X:gyroData.rotationRate.x
        |--> Y:gyroData.rotationRate.y
        |--> Z:gyroData.rotationRate.z
*/ 
 - (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler;
// 停止调用陀螺仪
 - (void)stopGyroUpdates;

  • 添加框架
    CoreMotion.framework
  • 导入框架
    #import <CoreMotion/CoreMotion.h>
  • 创建对象
@property (nonatomic,strong) CMMotionManager *motionManager;

 - (CMMotionManager *)motionManager{
    if (!_motionManager) {
        _motionManager = [[CMMotionManager alloc]init];
    }
    return _motionManager;
}
  • 加速计的调用
#pragma mark - 测试加速计
// pull方式获取数据
- (void)testAccelerometerPull{
    //判断加速计是否可用
    if ([self.motionManager isAccelerometerAvailable]) {
        if ([self.motionManager isAccelerometerActive]) {
            [self.motionManager setAccelerometerUpdateInterval:1/60.0];
            [self.motionManager startAccelerometerUpdates];
        }
        CMAccelerometerData *accelerometerData = self.motionManager.accelerometerData;
        NSLog(@"acceleration_X:%.2f",accelerometerData.acceleration.x);
        NSLog(@"acceleration_Y:%.2f",accelerometerData.acceleration.y);
        NSLog(@"acceleration_Z:%.2f",accelerometerData.acceleration.z);
    } else {
        NSLog(@">>加速计不可用");
    }
}
// push方式获取数据
- (void)testAccelerometerPush{
    //判断加速计是否可用
    if ([self.motionManager isAccelerometerAvailable]) {
        // 设置加速计采样频率
        [self.motionManager setAccelerometerUpdateInterval:1/60.0];
        __weak typeof(self) weakself = self;
        [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"acceleration_X:%.2f",accelerometerData.acceleration.x);
                NSLog(@"acceleration_Y:%.2f",accelerometerData.acceleration.y);
                NSLog(@"acceleration_Z:%.2f",accelerometerData.acceleration.z);
            }else{
                [weakself.motionManager stopAccelerometerUpdates];
            }
        }];
    } else {
        NSLog(@">>加速计不可用");
    }
}
  • 陀螺仪的调用
#pragma mark - 测试陀螺仪(push方式获取数据,pull方式与加速计调用方式相同)
- (void)testGyro{
    if ([self.motionManager isGyroAvailable]) {
        [self.motionManager setGyroUpdateInterval:1/60];
        __weak typeof(self) weakself = self;
        [self.motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"rotationRate_X:%.2f",gyroData.rotationRate.x);              NSLog(@"rotationRate_Y:%.2f",gyroData.rotationRate.y);              NSLog(@"rotationRate_Z:%.2f",gyroData.rotationRate.z);
            }else{
                [weakself.motionManager stopAccelerometerUpdates];
            }
        }];
    }else{
        NSLog(@">>陀螺仪不可用");
    }
}

代码地址:
https://github.com/FlyingKuiKui/AccelerometerAndGyro.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值