iOS CoreMotion获取传感器数据

这篇具有很好参考价值的文章主要介绍了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) {
             // 往下晃动
        }
    })
}

检测手机屏幕方向文章来源地址https://www.toymoban.com/news/detail-708225.html

if (motionManager.isAccelerometerAvailable) {
    motionManager.accelerometerUpdateInterval = 1.0
    motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (accelerometerData, error) in
        let x = (accelerometerData?.acceleration.x)!
        let y = (accelerometerData?.acceleration.y)!
        let z = (accelerometerData?.acceleration.z)!
        if ((fabs(y) + 0.1) >= fabs(x)) {
            if (y >= 0.1) {
                print("竖向朝下")
                self.shootingOrientation = UIDeviceOrientation.portraitUpsideDown
            }
            else {
                print("竖向朝上")
                self.shootingOrientation = UIDeviceOrientation.portrait
            }
        }
        else {
            if (x >= 0.1) {
                print("横向朝右")
                self.shootingOrientation = UIDeviceOrientation.landscapeRight
            }
            else if (x <= -0.1) {
                print("横向朝左");
                self.shootingOrientation = UIDeviceOrientation.landscapeLeft
            }
            else {
                print("竖向朝上");
                self.shootingOrientation = UIDeviceOrientation.portrait
            }
        }
        if (fabs(z) < 0.5) {
            print("手机立起");
            self.isValidInterfaceOrientation = true
        }
        else {
            print("手机平放");
            self.isValidInterfaceOrientation = false
        }
    }
}

到了这里,关于iOS CoreMotion获取传感器数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【雕爷学编程】Arduino智能家居之光照传感器数据获取和远程控制

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年01月25日
    浏览(47)
  • 无线传感器基础:获取手机传感器、加速度

    一些实验过程中的疑问: 如何知道设备上有哪些传感器? 如果手机不支持的传感器,程序运行往往不会抛出异常,只是无法获得传感器传回的数据。那么如何知道设备上有哪些传感器可用呢?有两种方式,一种是直接方式,一种是间接方式。直接方式就是遍历获取得到传感

    2024年02月02日
    浏览(61)
  • 使用 Qt for Android 获取并利用手机传感器数据(下篇)使用C++实现功能

    在上一篇,我们搭建了开发环境。本篇,使用C++代码真正实现功能。我们使用UDP协议从手机上指定发送的目的地、端口。效果如下图,完整工程参考https://gitcode.net/coloreaglestdio/qtcpp_demo/-/tree/master/android/sensors2pc: 移动端1 移动端2 桌面 我们建立一个Qt的Widgets程序,添加 positio

    2024年02月13日
    浏览(44)
  • STM32模拟I2C协议获取HDC1080温度和湿度传感器数据

    HDC1080是一款温湿度传感器,具有如下特点: 其中温度和湿度经过出厂校准。这里介绍STM32模拟I2C总线协议访问HDC1080的HAL库实现范例。 HDC1080的内部原理及电路连接如下: HDC1080具有低功耗特征,每次触发检测转换后进入睡眠状态,另外内部有一个加热电阻,在环境湿度高时,

    2024年02月11日
    浏览(123)
  • 用树莓派获取传感器数据通过Onenet云平台(物模型)传输至微信小程序(上)

           为了传输传感器数据,在网上找了很多方法,但都因为各种各样的问题最终没能成功实现。最终找到这个既简单,又方便实现的方法。步骤有点多,希望大家可以跟着教程,一步步耐心的做下去,愿大家都能成功实现数据传输。代码放在最后啦,下面开始我的教程。

    2024年03月23日
    浏览(56)
  • 使用人工智能和传感器技术,结合观测数据,实时获取自然界中变化的事件并进行分析预测。

    作者:禅与计算机程序设计艺术 随着全球数字化转型,物联网、智慧城市、智能农业、智能医疗等新兴产业正在改变世界,传感器网络已经成为连接各类传感器设备的基础设施。而人工智能也逐渐成为各行各业的基础性科技工具,在对环境的高速采集、实时的计算、及其规模

    2024年02月06日
    浏览(48)
  • 【Android开发基础】手机传感器信息的获取

    描述:关于传感器的使用,我在同栏目下发了一篇关于传感器(方向传感器、加速度传感器)的使用,这篇博客主要以获取不同手机所支持的传感器信息为主,具体如何使用这些传感器,需要自己进行查阅和学习,也可以私聊我。 博客:传感器(方向传感器、加速度传感器)

    2024年02月10日
    浏览(99)
  • 第十八篇、基于Arduino uno,获取手势识别传感器的信号——结果导向

    说明:该传感器模块集手势识别和触摸检测功能于一体,提供0~30cm以内的可调检测范围。它可以检测 5 向触摸信号和 7 种手势:向左移动、向右移动、向前移动、向后移动、向上拉、向下拉、拉和移除。 说明:虽然手势识别传感器形态各异,但是原理和代码都是适用的。  

    2024年02月07日
    浏览(44)
  • 多传感器数据融合技术

    多传感器数据融合技术形成于上世纪80年代,目前已成为研究的热点。它不同于一般信号处理,也不同于单个或多个传感器的监测和测量,而是对基于多个传感器测量结果基础上的更高层次的综合决策过程。把分布在不同位置的多个同类或不同类传感器所提供的局部数据资源

    2024年02月06日
    浏览(40)
  • LabVIEW-模拟传感器采集数据并预测数据

    已知某传感器过去的一段时间内采集的数据为d1,d2,d3,......,dn,现欲以m点的数据宽度,预测 tao 步后的数据值,即将一维的时间序列数据重构为如下m+1列的形式: d(1)    d(2 )   .......    d(m),        d(m+tao) d(2)    d(3 )   .......    d(m+1),    d(m+tao+1) ......................

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包