iOS CoreMotion获取传感器数据

CoreMotion是iOS系统目前用于处理加速度计,陀螺仪,计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据,包括加速度计和陀螺仪,以及计步器,磁力计和气压计。

为了以特定的时间间隔接收运动数据,应用程序调用一个“start”方法,该方法接受一个操作队列(NSOperationQueue的实例)和一个特定类型的块处理程序来处理这些更新。运动数据被传递到块处理程序。更新频率由“interval”属性的值决定。

Accelerometer加速度计使用方式:

  • 设置accelerometerUpdateInterval属性以指定更新间隔。
  • 调用startAccelerometerUpdates(to queue, withHandler handler)方法,传入一个CMAccelerometerHandler类型的块。
  • 加速度计数据作为CMAccelerometerData对象传递到块。

Gyroscope陀螺仪使用方式:

  • 设置gyroUpdateInterval属性以指定更新间隔。
  • 调用startGyroUpdates(to queue, withHandler handler)方法,传入一个类型CMGyroHandler的块。
  • 旋转速率数据作为CMGyroData对象传递到块中。

Magnetometer磁强计使用方式:

  • 设置magnetometerUpdateInterval属性以指定一个更新间隔。
  • 调用startMagnetometerUpdates(to queue, withHandler handler)方法,传递一个CMMagnetometerHandler类型的块。
  • 磁场数据作为CMMagnetometerData对象传递到块中。

Device motion设备运动使用方式:

  • 设置deviceMotionUpdateInterval属性以指定更新间隔。
  • 调用startDeviceMotionUpdates(to queue, withHandler handler) 或startDeviceMotionUpdates(using referenceFrame) 或 startDeviceMotionUpdates(using referenceFrame, to queue, withHandler handler)方法,传入一个CMDeviceMotionHandler类型的块。
  • motion数据作为CMDeviceMotion对象传递到块中。

检查服务的可用性:

属性 类型 作用
accelerometerAvailable BOOL 设备上是否有加速度计
gyroAvailable BOOL 设备上是否有陀螺仪
magnetometerAvailable BOOL 设备上是否有磁强计
deviceMotionAvailable BOOL 动作服务在设备上是否可用

检查功能的活跃状态:

属性 类型 作用
accelerometerActive BOOL 当前是否正在进行加速度计更新
gyroActive BOOL 确定当前是否正在进行陀螺仪更新
magnetometerActive BOOL 确定当前是否正在进行磁力计更新
deviceMotionActive BOOL 确定应用程序是否从设备动作服务接收更新

更新间隔: 

属性 类型 作用
accelerometerUpdateInterval TimeInterval 加速度计更新间隔
gyroUpdateInterval TimeInterval 陀螺仪更新间隔
magnetometerUpdateInterval TimeInterval 磁力计更新间隔
deviceMotionUpdateInterval TimeInterval 设备动作服务接收更新间隔

CMDeviceMotion属性介绍

  • attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势。
  • gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达。
  • userAcceleration:加速度信息。
  • rotationRate:计时的旋转速率,是陀螺仪的输出。
if (motionManager.isDeviceMotionAvailable) {
    motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (motion, error) in
        //翻滚
        let roll = motion!.attitude.roll
        let rollDegrees = roll * 180 / Double.pi
        //偏航
        let yaw = motion!.attitude.yaw
        let yawDegrees = yaw * 180 / Double.pi
        //俯仰
        let pitch = motion!.attitude.pitch
        let pitchDegrees = pitch * 180 / Double.pi

        print("Roll:%.2f", rollDegrees)
        print("Yaw:%.2f", yawDegrees)
        print("Pitch:%.2f", pitchDegrees)

        //重力加速度在各个方向的分量
        let gX = motion!.gravity.x;
        let gY = motion!.gravity.y;
        let gZ = motion!.gravity.z;
        print("重力X:%f -- Y:%f -- Z:%f", gX, gY, gZ);

        //检测到晃动
        let x = motion!.userAcceleration.x
        let y = motion!.userAcceleration.y
        let z = motion!.userAcceleration.z
        if (fabs(x)>2.0 || fabs(y)>2.0 || fabs(z)>2.0) {
            print("检测到晃动");
        }

        //带方向的晃动
        if (data.userAcceleration.x < -1.5f) {
             // 往左晃动
        }
        if (data.userAcceleration.x > 1.5f) {
             // 往右晃动
        }
        if (data.userAcceleration.y < -1.5f) {
             // 往上晃动
        }
        if (data.userAcceleration.y > 1.5f) {
             // 往下晃动
        }
    })
}

你可能感兴趣的:(iOS,ios)