版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.05 |
前言
我们的app很多都需要获取使用者的动作、方向以及其他和方位或者位置有关的参数,在ios中对应的框架就是
CoreMotion
,而在硬件对应的就是集成的加速计和陀螺仪。这几篇我们就从基础原理理论出发,讲一下相关的知识。
科普常识
一些iOS的应用,会有一些特殊的要求:
- 电子罗盘指南针之类的应用,让我们知道方向。
- 运动类型软件,让我们知道我们跑步多少公里。
- 社交软件中的摇一摇功能,比如微信。
- 游戏中扮演角色类中根据设备的晃动等进行操作。
其实,与这些功能相关的就是iOS
中的一个核心运动框架CoreMotion.framework
。这个框架,主要是为了访问加速度计
和陀螺仪
的相关数据。 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。
下面我们简单的了解一下这几种硬件的实现原理。
1. 陀螺仪
用在手机里面的陀螺仪都是MEMS陀螺仪
,里面的微机械结构为振动件,通过测量旋转产生的科氏加速度来获得角速度。
用途:照相防抖,以及配合加速度计(有的还有磁传感器)形成的组合传感器来完成特定的功能(如惯性导航,还有玩游戏时的一些角速度测试)。
下面看一下陀螺仪的三维示意图。
下面给出三个方向角度上的动态示意图。
2. 加速度计
用在手机里的加速度计同样是MEMS的,也是由振动结构,由于外界加速度会影响结构的振动特性,由此来测量加速度。加速度几种有一种是线性加速度计,定义是:由于加速度计的输出包含了重力加速度,线性加速度计简单来说就是排除了重力加速度的影响得到的值。
用途:用途很多,只要跟手机运动相关的几乎都与加速度计有关(计步、手机的姿态测量、相关的游戏等等)。
下面给出就是三轴加速度计的传感器示意图,大家要注意的就是三个轴的正向是如何定义的。
大家除了看上面的3D效果图,还可以看下面这个图。
检测设备在x,y,z轴上的加速度(加速度范围为-1 ~ 1),可以感觉加速度值判断屏幕的方向,如下图所示。
3. 重力感应器
严格来说,重力感应仪就是加速度计
。像手机里面说的重力感应器、方向感应器等等都是基于加速度计、陀螺仪、磁传感器(有的还有GPS)的数据获得的派生传感器。
区别:下面我们看一下它们的区别:
- 加速度计和陀螺仪:从原理来说,陀螺仪和加速度计都是通过振动测量加速度的,只不过陀螺仪测量的是科氏加速度,而加速度计是测量的直接加速度。MEMS陀螺仪可以简单理解为一个谐振器+加速度计。因此陀螺仪的结构要比加速度计复杂得多,技术也难得多。
- 重力传感器,方向传感器(电子罗盘),旋转传感器(姿态传感器):这三种都是派生的3D传感器。重力传感器是通过测量重力加速度方向来判断重力的方向,那跟旋转传感器有什么区别呢?旋转传感器用到了陀螺仪的数据,在动态情况(比如你在边走边看手机)也能很好的判断手机的姿态角。方向传感器则是主要通过磁传感器来测量地磁场来判断方向(类似指南针的作用),有时还需要配合GPS(各地的磁场不一样)。这些传感器能配合非常多的应用,如地图导航(手机上传感器的精度还不能满足惯导,主要是充当辅助的作用,比如判断你的朝向)。
框架基础
上面科普了关于传感器硬件上的知识,下面我们就来看一下CoreMotion
框架。给出相关框架苹果资料地址CoreMotion。
1. 基本API架构
我们先看一下这个框架API架构。
这个框架主要是要处理下面三种数据:
- 加速度值
CMAccelerometerData
- 陀螺仪值
CMGyroData
- 设备
motion
值CMDeviceMotion
实际上,这个设备motion
值就是通过加速度和旋转速度进行变换算出来的。
下面看一下CMDeviceMotion
这几个motion
值
- attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势 。
- gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达 。
- userAcceleration:加速度信息。
- rotationRate:即时的旋转速率,是陀螺仪的输出。
2. 框架内容
Core Motion
框架可让您的应用程序从设备硬件接收运动数据并处理该数据。 该框架支持使用Block对象接口访问原始和已处理的加速度计数据。 对于具有内置陀螺仪的设备,您可以检索原始陀螺仪数据以及反映设备的姿态和旋转速度的处理数据。 您可以使用加速度计和基于陀螺仪的数据,用于游戏或使用动作作为输入的其他应用程序,或作为增强整体用户体验的方式。
注意:在iOS 10.0
之上或之后链接的iOS应用程序必须在其Info.plist文件中包含其需要访问的数据类型的使用说明键,否则会崩溃。 要具体访问运动和健身数据,它必须包括NSMotionUsageDescription
。
下面我们看一下这个框架的类。
类名 | 详情 |
---|---|
CMAccelerometerData |
CMAccelerometerData 类的一个实例表示加速度计事件。 它是在一个时刻沿着三个空间轴的加速度的测量。 |
CMAltimeter | 使用CMAltimeter 对象开始向您的应用程序发送高度相关数据。 高度事件反映了当前高度的变化,而不是绝对高度。 因此,远足应用程序可能会使用此对象来跟踪用户在远足过程中的高程增益。 因为所有设备上的高度事件可能不可用,所以在使用此服务之前,请始终调用isRelativeAltitudeAvailable() 方法。 |
CMAltitudeData |
CMAltDataData 对象封装有关高度相对更改的信息。 您不直接创建此类的实例。 当您要接收高度计更改时,请创建CMAltimeter类的实例,并使用该对象查询事件或开始事件的传递。 高度计对象在适当的时间创建此类的新实例,并将其传递给您指定的处理程序。 |
CMAttitude |
CMAttitude 类的一个实例表示设备在某个时间点的高度的度量。 “高度”是指身体相对于给定参考框架的方向。 |
CMDeviceMotion |
CMDeviceMotion 的实例封装了设备的姿态,旋转速率和加速度的测量。 |
CMGyroData |
CMGyroData 类的实例包含设备旋转速率的单次测量。 |
CMLogItem |
CMLogItem 类是处理特定类型运动事件的Core Motion类的基类。 此类的对象表示可以记录到文件的一段时间标记的数据。 |
CMMagnetometerData |
CMMagnetometerData 类的实例封装了由设备的磁力计产生的磁场的测量值。 |
CMMotionActivity |
CMMotionActivity 类包含单个运动更新事件的数据。 在支持运动的设备上,您可以使用CMMotionActivityManager对象来在当前类型的运动更改时请求更新。 发生更改时,更新信息将打包成CMMotionActivity 对象并发送到您的应用程序。 |
CMMotionActivityManager |
CMMotionActivityManager 类提供对设备存储的运动数据的访问。 运动数据反映用户是在步行,跑步,在车辆中,还是静止的一段时间。 导航应用程序可能会查找当前运动类型的变化,并为每个运动提供不同的方向。 使用此类,您可以在当前类型的动作发生变化或者可以收集过去的动态变化数据时询问通知。 |
CMMotionManager |
CMMotionManager 对象是由iOS提供的运动服务的入口。 这些服务为应用程序提供加速度计数据,旋转速率数据,磁力计数据和其他设备运动数据,如姿态。 这些类型的数据源自设备的加速度计和(在某些型号上)的磁强计和陀螺仪。 |
CMPedometer | 使用CMPedometer 对象获取行人相关数据。 您可以使用计步器对象来检索步数和有关行驶距离以及上升或下降楼层数的其他信息。 计步器对象管理可以查询的历史数据缓存,也可以在处理数据时要求实时更新。 |
CMPedometerData |
CMPedometerData 对象封装了用户步行距离的信息。 你不会自己创建这个类的实例。 相反,您可以使用CMPedometer对象从系统中请求计步器数据。 每个请求的数据被打包到这个类的一个实例中,并传递给您在计步器对象中注册的处理程序。 |
CMPedometerEvent | 无资料 |
CMRecordedAccelerometerData |
CMRecordedAccelerometerData 对象包含由设备记录的单个加速度计数据。 您不直接创建此类的实例。 而是使用CMSensorRecorder对象从系统中检索已记录的数据。 |
CMSensorDataList |
CMSensorDataList 对象允许您枚举由系统记录的CMRecordedAccelerometerData 对象。 您不直接创建此类的实例。 相反,您会收到一个来自CMSensorRecorder 对象的加速度计数据查询的结果。 |
CMSensorRecorder |
CMSensorRecorder 对象控制从设备收集和检索加速度计数据。 使用传感器记录器启动加速度计数据的采集。 之后,使用传感器记录器取出记录的数据,以便您可以对其进行分析。 您可以使用记录的数据来评估特定类型的运动,并将结果并入您的应用程序。 |
CMStepCounter 类可以访问用户使用该设备的步骤数量。 步骤信息在具有适当内置硬件的设备上收集,并存储,以便您可以运行查询以确定用户最近的身体活动。 您使用此类收集当前步数据和任何历史数据。 |
后记
对于每一个知识点,我都是从浅入深、从宏观到微观的给大家介绍,这一篇也是从框架顶层和基础理论入手,后面我还会跟着写几篇结合具体的应用实例为大家讲解。谢谢大家。