iOS CoreMotion获取传感器数据

news/2024/7/23 9:42:08 标签: ios

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:计时的旋转速率,是陀螺仪的输出。
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) {
             // 往下晃动
        }
    })
}


http://www.niftyadmin.cn/n/5003657.html

相关文章

ElementUI浅尝辄止28:Dropdown 下拉菜单

将动作或菜单折叠到下拉菜单中。 1.如何使用&#xff1f; 移动到下拉菜单上&#xff0c;展开更多操作。 //通过组件slot来设置下拉触发的元素以及需要通过具名slot为dropdown 来设置下拉菜单。默认情况下&#xff0c;下拉按钮只要hover即可&#xff0c;无需点击也会显示下拉菜…

【C语言】——扫雷游戏

目录 ① 前言 ② 游戏规则 ③ 实现思路 一. test.c文件实现 1.创建菜单 2.实现switch case语句 3.创建雷盘 4.多种函数 二. game.c文件实现 1.初始化雷盘 2.打印雷盘 3.随机布雷 4. 进行排雷 三.game.h头文件实现 致谢&#xff1a; 三.整体代码实现 1.tes…

Matlab信号处理2:方波信号的合成与分解

周期信号可展开为傅里叶级数&#xff0c;因此方波信号可用若干谐波去拟合。以下是Matlab的实现&#xff1a; %% 方波信号的分解% 1.生成方波信号 % 方波信号周期、基波频率 T0 2; w0 (2 * pi) / T0; % 方波信号值为1的区间 T1 0.5; % 绘图周期&#xff1a;(2*n1)个周期 n …

Ubuntu18.04系统下通过moveit控制kinova真实机械臂,并用python脚本到达固定点

测试工作空间&#xff1a;test_ws Kinova机械臂型号&#xff1a;m1n6s300 双臂模型中的左臂 测试功能包为kinova-ros官方包 一、读取kinova机械臂末端执行器位姿及tf小知识 1. tf小知识之获取两个连杆坐标系的位姿关系&#xff0c;非常有用&#xff0c;非常有用&#xff0c;非…

算法笔记:哈夫曼树、哈夫曼编码

1 字符的机内表示 2 前缀编码 字符只放在叶结点中字符编码可以有不同的长度由于字符只放在叶结点中&#xff0c;所以每个字符的编码都不可能是其他字符编码的前缀前缀编码可被惟一解码 3 哈夫曼树 哈夫曼树是一棵最小代价的二叉树&#xff0c;在这棵树上&#xff0c;所有的字…

怎么激活IDM

IDM是一个下载软件。 激活它需要用到git上面的一个项目&#xff0c;同时网络要能连到github GitHub - lstprjct/IDM-Activation-Script: IDM Activation & Trail Reset Script WINR 输入powershell 输入命令行 iex(irm is.gd/idm_reset) 或者 iwr -useb https://raw.…

产品技术体系

产品&#xff0c;是一个企业或公司针对市场客户推出的一系列相关的功能或者服务&#xff0c;为对应的客户解决实际问题&#xff0c;进而产生对应的商业、社会价值。有了这些实际的价值&#xff0c;企业就会获得相应的利益或者利润回报。正常来讲&#xff0c;这应该是一个良性的…

执行adb指令报错:error: more than one device/emulator解决办法

执行adb指令报错&#xff1a;error: more than one device/emulator解决办法 进行安卓设备的测试过程中&#xff0c;执行adb指令可能会遇到一些小错误&#xff0c;若是报错&#xff1a;error: more than one device/emulator&#xff0c;是因为我们有多个设备连接了电脑&#…