iOS事件-加速计陀螺仪

传感器

传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上,用于感应\检测设备周边的信息,不同类型的传感器, 检测的信息也不一样

iOS中传感器

iOS事件-加速计陀螺仪_第1张图片
590107-b80b8936f8277f84.png

核心运动框架-CoreMotion.framework

我们可以使用iOS提供给我们的CoreMotion 框架来访问加速度器和陀螺仪的相关数据!
它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维attitude信息!

加速计

iOS事件-加速计陀螺仪_第2张图片
590107-98de475675ae93b7.png

加速度计的原理很简单,现在手机里面基本配备的都是3维线传感器,也就是说,用来测量x,y,z三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。

陀螺仪

iOS事件-加速计陀螺仪_第3张图片
1795722-b93020a639168c7e.png

陀螺仪可以检测设备的持握方式,原理是检测在X、Y、Z轴上的角速度,当物体运动方向偏离预定方向时,陀螺仪可以检测出来

CoreMotion处理的数据有三种

  • 加速度值CMAccelerometerData
  • 陀螺仪值 CMGyroData
  • 设备motion值 CMDeviceMotion

CMDeviceMotion属性

  • attitude: 手机当前空间位置姿势
  • gravity : 重力信息,重力加速度矢量在当前设备的参考坐标系中的表达
  • userAcceleration: 加速度信息
  • rotationRate: 即使旋转速率,陀螺仪输出
1.对加速度器和陀螺仪相关的访问,都被封装在CoreMotion.framework框架下的CMMotionManager类中。
我们通过使用类的方法,来得到我们想要的加速度数据和陀螺仪数据。
2. isAccelerometerAvailable方法用来查看加速度器是否可用。
3. isAccelerometerAvailable方法用来查看加速度器的状态:是否Active(启动)。
4.同理isGyroAvailable方法和isGyroActive方法用来检测陀螺仪。
5.获取加速度器和陀螺仪的数据。主要有两种方式:
push方式
这种方式,是实时获取到Accelerometer的数据,并且用相应的队列来显示。即主动。
pull方式
就是获取数据,如果要显示,就要向Accelerometer来索要数据。即:被动的方式。

简单调用

加速计push方式

// 初始化
    self.manger = [[CMMotionManager alloc] init];
    //  设备是否支持
    if (![self.manger isAccelerometerAvailable])
    {
        NSLog(@"加速计不可用");
    }
    
    // 采样频率
    self.manger.accelerometerUpdateInterval = 1;

    [self.manger startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        if (error) return;
        
        // 获取加速计的信息
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
    }];
    
  // 结束
    [self.manger stopAccelerometerUpdates];

加速计pull方式

self.manger = [[CMMotionManager alloc] init];
    
    if (![self.manger isAccelerometerAvailable])
    {
        NSLog(@"加速计不可用");
    }

    [self.manger startAccelerometerUpdates];
    
    // 需要时获取
    CMAccelerometerData *accelerometerdata = self.manger.accelerometerData;
    NSLog(@"x:%f y:%f z:%f", accelerometerdata.acceleration.x, accelerometerdata.acceleration.y, accelerometerdata.acceleration.z);
-(void)stopAction
{
    if ([self.manger isAccelerometerActive] == YES)
    {
        [self.manger stopAccelerometerUpdates];
    }
}

陀螺仪push方式

// 初始化陀螺仪
    self.manger = [[CMMotionManager alloc] init];
    
    if (![self.manger isGyroAvailable])
    {
        NSLog(@"陀螺仪不可用");
    }
    
    if (![self.manger isGyroActive])
    {
        [self.manger setGyroUpdateInterval:0.5];
        
        [self.manger startGyroUpdatesToQueue:[[NSOperationQueue alloc] init] 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);
        
        }];
    }

    [self.manger stopGyroUpdates];

你可能感兴趣的:(iOS事件-加速计陀螺仪)