• 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对象传递到块中。

    检查服务的可用性:

    属性类型作用
    accelerometerAvailableBOOL设备上是否有加速度计
    gyroAvailableBOOL设备上是否有陀螺仪
    magnetometerAvailableBOOL设备上是否有磁强计
    deviceMotionAvailableBOOL动作服务在设备上是否可用

    检查功能的活跃状态:

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

    更新间隔: 

    属性类型作用
    accelerometerUpdateIntervalTimeInterval加速度计更新间隔
    gyroUpdateIntervalTimeInterval陀螺仪更新间隔
    magnetometerUpdateIntervalTimeInterval磁力计更新间隔
    deviceMotionUpdateIntervalTimeInterval设备动作服务接收更新间隔

    CMDeviceMotion属性介绍

    • attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势。
    • gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达。
    • userAcceleration:加速度信息。
    • rotationRate:计时的旋转速率,是陀螺仪的输出。
    1. if (motionManager.isDeviceMotionAvailable) {
    2. motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (motion, error) in
    3. //翻滚
    4. let roll = motion!.attitude.roll
    5. let rollDegrees = roll * 180 / Double.pi
    6. //偏航
    7. let yaw = motion!.attitude.yaw
    8. let yawDegrees = yaw * 180 / Double.pi
    9. //俯仰
    10. let pitch = motion!.attitude.pitch
    11. let pitchDegrees = pitch * 180 / Double.pi
    12. print("Roll:%.2f", rollDegrees)
    13. print("Yaw:%.2f", yawDegrees)
    14. print("Pitch:%.2f", pitchDegrees)
    15. //重力加速度在各个方向的分量
    16. let gX = motion!.gravity.x;
    17. let gY = motion!.gravity.y;
    18. let gZ = motion!.gravity.z;
    19. print("重力X:%f -- Y:%f -- Z:%f", gX, gY, gZ);
    20. //检测到晃动
    21. let x = motion!.userAcceleration.x
    22. let y = motion!.userAcceleration.y
    23. let z = motion!.userAcceleration.z
    24. if (fabs(x)>2.0 || fabs(y)>2.0 || fabs(z)>2.0) {
    25. print("检测到晃动");
    26. }
    27. //带方向的晃动
    28. if (data.userAcceleration.x < -1.5f) {
    29. // 往左晃动
    30. }
    31. if (data.userAcceleration.x > 1.5f) {
    32. // 往右晃动
    33. }
    34. if (data.userAcceleration.y < -1.5f) {
    35. // 往上晃动
    36. }
    37. if (data.userAcceleration.y > 1.5f) {
    38. // 往下晃动
    39. }
    40. })
    41. }

    检测手机屏幕方向

    1. if (motionManager.isAccelerometerAvailable) {
    2. motionManager.accelerometerUpdateInterval = 1.0
    3. motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (accelerometerData, error) in
    4. let x = (accelerometerData?.acceleration.x)!
    5. let y = (accelerometerData?.acceleration.y)!
    6. let z = (accelerometerData?.acceleration.z)!
    7. if ((fabs(y) + 0.1) >= fabs(x)) {
    8. if (y >= 0.1) {
    9. print("竖向朝下")
    10. self.shootingOrientation = UIDeviceOrientation.portraitUpsideDown
    11. }
    12. else {
    13. print("竖向朝上")
    14. self.shootingOrientation = UIDeviceOrientation.portrait
    15. }
    16. }
    17. else {
    18. if (x >= 0.1) {
    19. print("横向朝右")
    20. self.shootingOrientation = UIDeviceOrientation.landscapeRight
    21. }
    22. else if (x <= -0.1) {
    23. print("横向朝左");
    24. self.shootingOrientation = UIDeviceOrientation.landscapeLeft
    25. }
    26. else {
    27. print("竖向朝上");
    28. self.shootingOrientation = UIDeviceOrientation.portrait
    29. }
    30. }
    31. if (fabs(z) < 0.5) {
    32. print("手机立起");
    33. self.isValidInterfaceOrientation = true
    34. }
    35. else {
    36. print("手机平放");
    37. self.isValidInterfaceOrientation = false
    38. }
    39. }
    40. }

  • 相关阅读:
    基于单片机的车载酒精含量自检系统设计与实现
    2023年10月【考试战报】|ORACLE OCP 19C考试通过
    红外线热像仪的热成像质量介绍
    setup里面 计算属性与监视
    德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”
    十四天学会C++之第二天(函数和库)
    Elasticsearch GC优化实践
    通过vue-codemirror和CodeMirror将代码编辑器添加到web项目中
    一文搞定MySQL的分区技术、NoSQL、NewSQL、基于MySQL的分表分库
    Leetcode.123 买卖股票的最佳时机 III
  • 原文地址:https://blog.csdn.net/watson2017/article/details/132695043