CoreMotion框架(一)—— 基础理论

版本记录

版本号 时间
V1.0 2017.08.05

前言

我们的app很多都需要获取使用者的动作、方向以及其他和方位或者位置有关的参数,在ios中对应的框架就是CoreMotion,而在硬件对应的就是集成的加速计和陀螺仪。这几篇我们就从基础原理理论出发,讲一下相关的知识。

科普常识

一些iOS的应用,会有一些特殊的要求:

  • 电子罗盘指南针之类的应用,让我们知道方向。
  • 运动类型软件,让我们知道我们跑步多少公里。
  • 社交软件中的摇一摇功能,比如微信。
  • 游戏中扮演角色类中根据设备的晃动等进行操作。

其实,与这些功能相关的就是iOS中的一个核心运动框架CoreMotion.framework。这个框架,主要是为了访问加速度计陀螺仪的相关数据。 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。

下面我们简单的了解一下这几种硬件的实现原理。

1. 陀螺仪

用在手机里面的陀螺仪都是MEMS陀螺仪,里面的微机械结构为振动件,通过测量旋转产生的科氏加速度来获得角速度。

用途:照相防抖,以及配合加速度计(有的还有磁传感器)形成的组合传感器来完成特定的功能(如惯性导航,还有玩游戏时的一些角速度测试)。

下面看一下陀螺仪的三维示意图。

陀螺仪三维示意图

下面给出三个方向角度上的动态示意图。

roll
pitch
yaw

2. 加速度计

用在手机里的加速度计同样是MEMS的,也是由振动结构,由于外界加速度会影响结构的振动特性,由此来测量加速度。加速度几种有一种是线性加速度计,定义是:由于加速度计的输出包含了重力加速度,线性加速度计简单来说就是排除了重力加速度的影响得到的值。

用途:用途很多,只要跟手机运动相关的几乎都与加速度计有关(计步、手机的姿态测量、相关的游戏等等)。

下面给出就是三轴加速度计的传感器示意图,大家要注意的就是三个轴的正向是如何定义的。

加速度传感器

大家除了看上面的3D效果图,还可以看下面这个图。

加速度计

检测设备在x,y,z轴上的加速度(加速度范围为-1 ~ 1),可以感觉加速度值判断屏幕的方向,如下图所示。

手机不同方向对应的加速度值

3. 重力感应器

严格来说,重力感应仪就是加速度计。像手机里面说的重力感应器、方向感应器等等都是基于加速度计、陀螺仪、磁传感器(有的还有GPS)的数据获得的派生传感器。

区别:下面我们看一下它们的区别:

  • 加速度计和陀螺仪:从原理来说,陀螺仪和加速度计都是通过振动测量加速度的,只不过陀螺仪测量的是科氏加速度,而加速度计是测量的直接加速度。MEMS陀螺仪可以简单理解为一个谐振器+加速度计。因此陀螺仪的结构要比加速度计复杂得多,技术也难得多。
  • 重力传感器,方向传感器(电子罗盘),旋转传感器(姿态传感器):这三种都是派生的3D传感器。重力传感器是通过测量重力加速度方向来判断重力的方向,那跟旋转传感器有什么区别呢?旋转传感器用到了陀螺仪的数据,在动态情况(比如你在边走边看手机)也能很好的判断手机的姿态角。方向传感器则是主要通过磁传感器来测量地磁场来判断方向(类似指南针的作用),有时还需要配合GPS(各地的磁场不一样)。这些传感器能配合非常多的应用,如地图导航(手机上传感器的精度还不能满足惯导,主要是充当辅助的作用,比如判断你的朝向)。

框架基础

上面科普了关于传感器硬件上的知识,下面我们就来看一下CoreMotion框架。给出相关框架苹果资料地址CoreMotion

1. 基本API架构

我们先看一下这个框架API架构。

API架构

这个框架主要是要处理下面三种数据:

  • 加速度值CMAccelerometerData
  • 陀螺仪值CMGyroData
  • 设备motionCMDeviceMotion
    实际上,这个设备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 CMStepCounter类可以访问用户使用该设备的步骤数量。 步骤信息在具有适当内置硬件的设备上收集,并存储,以便您可以运行查询以确定用户最近的身体活动。 您使用此类收集当前步数据和任何历史数据。

后记

对于每一个知识点,我都是从浅入深、从宏观到微观的给大家介绍,这一篇也是从框架顶层和基础理论入手,后面我还会跟着写几篇结合具体的应用实例为大家讲解。谢谢大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容