iOS 传感器(加速计 + 陀螺仪)

 iOS中常用的传感器主要有以下2种

 (1)加速计

    加速计使用度量单位g,这是重力(gravity)的简称。1g是物体在地球的海平面上收到的下拉力(9.8米/秒)

    加速计以相对于自由落体的方式度量加速度。

    这意味着如果将iOS设备在能够持续自由落体的地方丢下,在下落过程中,其加速计测量到的加速度将为0g

    另一方面,放在左面上的设备的加速度计测量出的加速度为1g,且方向朝上。

 (2)陀螺仪

    陀螺仪将报告设备绕xyz轴的旋转速度,单位为弧度每秒

     2弧度等于1圈,所以陀螺仪返回读数2.0表示设备绕相应的轴每秒旋转一圈

 (3)两者的区别

    仅当设备的朝向相对于重力的方向发生变化时,加速计才能检测的到;而无论设备处于什么朝向,只要它在旋转,陀螺仪都能检测的到


主要代码如下,分别用了2种方式获取数据

(1)定时器(NSTimer)

(2)操作队列(NSOperationQueue)

#import <CoreMotion/CoreMotion.h>

#define ACCELEROMETER_UPDATE_INTERVAL 1.0
#define GYRO_UPDATE_INTERVAL 1.0

@interface ViewController () {
CMMotionManager *motionManager;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    motionManager = [[CMMotionManager alloc] init];
    [self startAccelerometerSensor];
    [self startGyroSensor];
    [self startDeviceOrientationChangeListener];
}

//加速计
-(void)startAccelerometerSensor {
    //更新时间间隔
    motionManager.accelerometerUpdateInterval = ACCELEROMETER_UPDATE_INTERVAL;
    //开始获取数据
    [motionManager startAccelerometerUpdates];
    
    //(1)使用”定时器“(NSTimer)获取数据
    [NSTimer scheduledTimerWithTimeInterval:ACCELEROMETER_UPDATE_INTERVAL target:self selector:@selector(accelerometerDidUpdate) userInfo:nil repeats:YES];
    
    //(2)将数据传递给“操作队列”(NSOperationQueue)
    NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
    [motionManager startAccelerometerUpdatesToQueue:operationQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
    }];
    
    //[motionManager stopAccelerometerUpdates];
}

- (void)accelerometerDidUpdate {
    CMAcceleration acceleration = motionManager.accelerometerData.acceleration;
    NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
}

//陀螺仪
-(void)startGyroSensor {
    //首先需要判断陀螺仪是否可用,因为2010年以前的设备是没有“陀螺仪”的
    if(motionManager.gyroAvailable) {
        //更新时间间隔
        motionManager.gyroUpdateInterval = GYRO_UPDATE_INTERVAL;
        //开始获取数据
        [motionManager startGyroUpdates];
        //(1)使用”定时器“(NSTimer)获取数据
        [NSTimer scheduledTimerWithTimeInterval:GYRO_UPDATE_INTERVAL target:self selector:@selector(gyroDidUpdate) userInfo:nil repeats:YES];
        
        //(2)将数据传递给“操作队列”(NSOperationQueue)
        NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
        [motionManager startGyroUpdatesToQueue:operationQueue withHandler:^(CMGyroData * gyroData, NSError * error) {
            CMRotationRate rotationRate = gyroData.rotationRate;
            NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
        }];

        //[motionManager stopGyroUpdates];
    } else {
        NSLog(@"gyro not available");
    }
}

-(void)gyroDidUpdate {
    CMRotationRate rotationRate = motionManager.gyroData.rotationRate;
    NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
}
需要注意的是:模拟器是无法对传感器进行测试的,所以请使用真机运行以上代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值