iOS传感器

iOS传感器篇:CoreMotion初探

转载 https://www.jianshu.com/p/9f915876771c

Core Motion

加速计程序,螺旋仪,步数计,环境相关的事件

iOS传感器篇:CoreMotion使用

目录索引

Core Motion报告了来自iOS设备的硬件和环境相关的数据,包括加速度计陀螺仪计步器磁力计气压计。你可以使用这个框架来访问硬件生成的数据,这样你就可以在你的应用中使用它。例如,游戏可以使用加速计和陀螺仪数据来控制屏幕上的游戏行为。

这个框架的许多服务允许您访问硬件记录的原始值和这些值的处理版本。处理过的值不包括可能会对如何使用该数据产生负面影响的数据偏移。例如,一个处理过的加速度计值只反映了用户造成的加速度,而不是由重力引起的加速度。

重要提示

在10.0 以后,为了保护用户隐私,必须在info.plist文件增加描述,错误的描述导入或未填写将会引起App崩溃。参考NSMotionUsageDescription

需要在info.plist 新增NSMotionUsageDescription(Privacy - Motion Usage Description) 键值对,并进行说明。

这个键值对支持7.0+的版本。

CMMotionManager

启动和管理动作服务的对象。

您使用CMMotionManager对象来访问加速计数据、旋转速率数据、磁力计数据和其他设备运动数据。这些类型的数据来源于一个设备的加速度计和(在一些模型上)它的磁计和陀螺仪。在创建了CMMotionManager的实例之后,应用程序可以使用它来接收四种类型的运动:

原始的加速度计数据

原始的陀螺仪数据

原始的磁力计数据

设备运动数据(包括加速计、旋转速率和属性测量值)。

由核心运动的传感器融合算法提供的处理设备运动数据提供了设备的姿态、旋转速率、校准的磁场、重力方向以及用户在设备上的加速度。

重要提示

应用程序应该只创建CMMotionManager类的一个实例。这个类的多实例可以影响从加速计和陀螺仪接收数据的速率。

在接收运动数据时,应用程序可以采用两种方法中的一种

指定的更新间隔

定期对运动数据进行采样

用这两种方法,应用程序应该调用适当的停止方法

stopAccelerometerUpdates 停止加速计更新

stopGyroUpdates 停止陀螺仪更新

stopMagnetometerUpdates停止磁强计更新

stopDeviceMotionUpdates 停止设备运动更新

完成处理加速度计,转速、磁强计,或者设备运动数据。

处理设备更新和指定间隔

为了在特定的时间间隔接收移动数据,应用程序调用一个“start”方法,该方法使用一个操作队列(NSOperationQueue实例)和一个特定类型的block处理程序来处理这些更新。移动数据被传递到block处理程序中。更新的频率是由interval属性的值决定的。

1. 加速计 Accelerometer

1. 设置accelerometerUpdateInterval属性来指定更新间隔。

2. 调用startAccelerometerUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMAccelerometerHandler 类型的CMAccelerometerData类获取。

2. 陀螺仪 Gyroscope

设置gyroUpdateInterval属性来指定更新间隔。

2. 调用startGyroUpdatesToQueue:withHandler:方法

陀螺仪数据通过 block 中CMGyroHandler 类型的CMGyroData类获取。

3. 磁强计 Magnetometer

1. 设置magnetometerUpdateInterval属性来指定更新间隔。

2. 调用startMagnetometerUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMMagnetometerHandler 类型的CMMagnetometerData类获取。

4. 设备动作 Device motion

1. 设置deviceMotionUpdateInterval属性来指定更新间隔。

2. 调用startDeviceMotionUpdatesUsingReferenceFrame:或startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:或 startDeviceMotionUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMDeviceMotionHandler 类型的CMDeviceMotion类获取。

周期性获取数据

为了通过周期性采样来处理运动数据,该应用程序调用一个“star”方法,不带参数,并周期性地访问给定类型的运动数据所持有的运动数据。这种方法是游戏等应用程序的推荐方法。在一个block块中处理加速计数据会带来额外的开销,大多数游戏应用只对最新的运动数据感兴趣,当它们渲染一个帧时。

1. 加速计 Accelerometer

调用startAccelerometerUpdates开始更新和定期访问CMAccelerometerData类的accelerometerData属性

2. 陀螺仪 Gyroscope

调用startGyroUpdates开始更新和定期访问CMGyroData类的gyroData属性

3. 磁强计 Magnetometer

调用startMagnetometerUpdates开始更新和定期访问CMMagnetometerData类的magnetometerData属性

4. 设备动作 Device motion

调用startDeviceMotionUpdatesUsingReferenceFrame: 或 startDeviceMotionUpdates开始更新和定期访问CMDeviceMotion类的 deviceMotion属性。startDeviceMotionUpdatesUsingReferenceFrame:方法(iOS 5.0中的新特性)允许您指定一个参考帧用于估计的属性。

硬件的可用性和状态

如果硬件特性(例如陀螺仪)在设备上是不可用的,那么调用与该特性相关的启动方法就没有效果。通过检查适当的属性,您可以了解硬件特性是否可用;例如,对于陀螺仪数据,您可以检查gyroAvailable或gyroActive属性的值。

确定服务的可用性 【Determining the Availability of Services】

1. deviceMotionAvailable 属性

一个布尔值来表明设备的“设备姿态”服务是否可用

2. accelerometerAvailable 属性

一个布尔值来表明设备的“加速计”服务是否可用

gyroAvailable 属性

一个布尔值来表明设备的“陀螺仪”服务是否可用

magnetometerAvailable 属性

一个布尔值来表明设备的“磁强计”服务是否可用

确定哪些服务是活跃的 【Determining Which Services Are Active】

deviceMotionActive 属性

一个布尔值来表明应用程序是否接收来自“设备姿态”服务的更新。

accelerometerActive 属性

一个布尔值指示是否正在进行“加速计”更新。

gyroActive 属性

一个布尔值用来表明“陀螺仪”更新是否正在进行

magnetometerActive 属性

一个布尔值用来表明“磁强计”更新是否正在进行

管理设备姿态更新 【Managing Device Motion Updates】

1. showsDeviceMovementDisplay

控制设备移动显示是否显示。

deviceMotionUpdateInterval

以秒为间隔,为block块处理程序提供设备移动更新

3. - startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:

在操作队列上启动设备移动更新,并使用指定的引用帧和block块处理程序

- startDeviceMotionUpdatesToQueue:withHandler:

在操作队列上启动设备移动更新,并使用指定的block块处理程序。

- startDeviceMotionUpdatesUsingReferenceFrame:

使用一个引用框架启动设备移动更新,但是没有block块处理程序。

- startDeviceMotionUpdates

在没有block块处理程序的情况下启动设备移动更新。

- stopDeviceMotionUpdates

停止设备运动更新。

deviceMotion

最新的设备移动数据样本。

管理加速计更新 【Managing Accelerometer Updates】

1. accelerometerUpdateInterval

以秒为间隔,为block块处理程序提供加速计更新。

- startAccelerometerUpdatesToQueue:withHandler:

启动加速计在一个操作队列上的更新和一个指定的处理程序。

- startAccelerometerUpdates

在没有处理程序的情况下启动加速计更新。

- stopAccelerometerUpdates

停止加速表更新。

accelerometerData

最新的加速度计数据样本。

管理陀螺仪更新【Managing Gyroscope Updates】

1. gyroUpdateInterval

以秒为间隔,为block块处理程序提供陀螺仪更新。

- startGyroUpdatesToQueue:withHandler:

启动陀螺仪在一个操作队列上的更新和一个指定的处理程序。

- startGyroUpdates

在没有处理程序的情况下启动陀螺仪更新。

- stopGyroUpdates

停止陀螺仪更新

gyroData

最新的陀螺仪数据样本。

管理磁强计更新【Managing Magnetometer Updates】

1. magnetometerUpdateInterval

以秒为间隔,为block块处理程序提供磁强计更新。

- startMagnetometerUpdatesToQueue:withHandler:

启动磁强计在一个操作队列上的更新和一个指定的处理程序。

- startMagnetometerUpdates

在没有处理程序的情况下启动磁强计更新。

- stopMagnetometerUpdates

停止磁强计更新

magnetometerData

最新的磁强计数据样本。

常量

1. CMAccelerometerHandler

处理回调加速计block数据

CMGyroHandler

处理回调陀螺仪block数据

CMMagnetometerHandler

处理回调磁强计block数据

CMDeviceMotionHandler

处理回调设备姿态block数据

CMErrorDomain

Core Motion 的错误域名

CMError

定义一个管理ColorSync 结果码的类型

CMLogItem

所有设备关联数据类的基类

1. timestamp

日志记录项有效的时间。

Device Motion 【设备姿态】

CMDeviceMotion

封装测量设备的姿态、旋转速率和加速度。

得到处理的设备运动数据

1. attitude

设备属性,包括角度倾斜值等等

2. rotationRate

设备的旋转速率。

3. gravity

重力加速度矢量在设备的参考系.

4. userAcceleration

用户给设备的加速度。

5. magneticField

在设备上返回磁场矢量。

6. heading

相对于当前的参考帧,起始角度(以度数测量)。

7. CMCalibratedMagneticField

校准的磁场数据,并估计校准的准确性。

8. CMMagneticFieldCalibrationAccuracy

指示磁场估计的校准精度

CMAttitude

该设备的朝向,相对于已知的参考帧,在某个时间点上的方位。

Core Motion输出一个方向余弦矩阵(DCM)——基本上是一个从上一个“old”方向到设备新方向的旋转。

1. roll

设备转动的弧度

2. pitch

设备倾斜的弧度

3. yaw

设备偏航的弧度

4. rotationMatrix

返回一个代表设备姿势的旋转矩阵

5. quaternion

返回一个代表设备姿势的四元数

6. - multiplyByInverseOfAttitude:

以一种特定的姿势产生的改变

常量

1. CMRotationMatrix

代表旋转矩阵的结构体类型

2. CMQuaternion

四元组的类型表示一种姿势的测量。

3. CMAttitudeReferenceFrame

用于表示引用的所有姿势示例的引用框架的枚举常量

Accelerometers 【加速计】

为设备的所有三个轴提供加速度计数据。

获得原始加速计事件

CMAccelerometerData

来自该设备的三轴加速计的数据样本。

if([CMSensorRecorderisAccelerometerRecordingAvailable]) {CMSensorRecorder* recorder = [[CMSensorRecorderalloc] init];  [recorder recordAccelerometerForDuration:(20*60)];// Record for 20 minutes}

1.acceleration

加速度有加速计计算得出

常量

1.CMAcceleration

一种包含3轴加速度值的结构类型

CMRecordedAccelerometerData

一个由设备记录的加速度计数据。

1. startDate

当传感器样品被记录时,已经经过的时间

2. identifier

加速计数据唯一的标识符

CMSensorRecorder

从设备中收集和检索加速度计数据。

1. + isAccelerometerRecordingAvailable

返回一个布尔值来表明当前设备加速计是否支持记录。

2. - recordAccelerometerForDuration:

开始指定时间并周期性记录加速计数据

3. - accelerometerDataFromDate:toDate:

检索在指定日期之间收集的加速计数据

4. - accelerometerDataSince:

为同一批处理中的条目检索加速计数据。

5. + authorizationStatus

授权状态

CMSensorDataList

系统记录的加速计数据列表

-(void)processSamplesFromDate:(NSDate*)start toDate:(NSDate)end {CMSensorRecorder* recorder = [[CMSensorRecorderalloc] init];CMSensorDataList* list = [recorder accelerometerDataFrom:start to:end];for(CMRecordedAccelerometerData* datainlist) {// Process the data.NSLog(@"Sample: (%f, %f, %f)", data.acceleration.x,              data.acceleration.y, data.acceleration.z);  }}

Gyroscopes

原始的陀螺仪数据。

获得原始陀螺仪数据事件

CMGyroData

一种测量设备转速的方法。

1. rotationRate

由设备陀螺仪测量的旋转速率。

常量

1.CMRotationRate

由设备陀螺仪测量的旋转速率的结构体类型

Pedometer

提供来自内置的处理器来获取计步数据

CMPedometer

一个取得系统生成实时行走数据

1. + isStepCountingAvailable

返回一个布尔值,指示在当前设备上是否可以使用计步计数。

2. + isDistanceAvailable

返回一个布尔值,指示在当前设备上是否可以使用距离估算。

3. + isFloorCountingAvailable

返回一个布尔值,指示当前设备上是否可以使用楼层计数。

4. + isPaceAvailable

返回一个布尔值,该值指示当前设备上是否可速度信息。

5. + isCadenceAvailable

返回一个布尔值,指示当前设备上是否有可用的步调信息

6. + isPedometerEventTrackingAvailable

返回一个布尔值,指示是否计步器事件是当前设备上可用。

7. - startPedometerUpdatesFromDate:withHandler:

将最近与行人相关的数据发送到你的应用

8. - stopPedometerUpdates

停止向你的应用发送最近的步行数据更新。

9. -startPedometerEventUpdatesWithHandler:

开始向你的应用程序发送计步器事件。

10. -stopPedometerEventUpdates

停止向你的应用程序提交计步器事件

11. -queryPedometerDataFromDate:toDate:withHandler:

查询在指定时间段的数据

12. CMPedometerHandler

处理计步器关联数据的block

13. CMPedometerEventHandler

处理计步器事件的block

14. + authorizationStatus

授权状态

CMPedometerData

关于用户步行的距离的信息。

1. startDate

计步器开始时间

2. endDate

计步器结束时间

3. numberOfSteps

用户所采取的步数

4. distance

用户移动的估计的距离(米)

5. averageActivePace

用户的平均速度,以秒为单位。

6. currentPace

用户的当前速度,以秒为单位。

7. currentCadence

用户当前的步调频率,以秒为单位

8. floorsAscended

步行的楼层大概有几层楼 升序。

9. floorsDescended

步行的楼层大概有几层楼 降序。

CMPedometerEvent

用户的步行活动发生了变化。

1. date

记录计步器事件的日期。

2. type

发生的变化类型。

常量

1. CMPedometerEventType

显示用户的步行活动发生的变化的常量。

Magnetometer

提供定向数据和原始磁量数据。

CMMagnetometerData

测量地球磁场相对于设备的尺寸。

1. magneticField

返回磁力仪测量的磁场。

2. CMMagneticField

包含3轴磁力仪的结构

Altitude

提供基于气压传感器信息的高度数据。

CMAltimeter

一个初始化与高海拔相关的变化的对象。

1. + isRelativeAltitudeAvailable

返回一个布尔值,指示当前设备是否支持生成相对高度变化的数据。

2. - startRelativeAltitudeUpdatesToQueue:withHandler:

开始向指定的处理程序块发送高度数据。

3. - stopRelativeAltitudeUpdates

停止对高度计对象的高度数据传输

4. + authorizationStatus

授权状态

常量

1. CMAltitudeHandler

接收高度计数据的block

CMAltitudeData

记录海拔高度变化的数据。

1.relativeAltitude

自上次报告事件以来,海拔(米)的变化。

2. pressure

有记录的压力值(千帕 hpa)

Historical Data

提供记录的运动事件来帮助你分析运动模式。

CMMotionActivityManager

用来管理设备存储的运动数据的对象。

1. + isActivityAvailable

返回一个布尔值,指示当前设备上是否可用移动数据。

2. - startActivityUpdatesToQueue:withHandler:

启动当前移动数据更新到你的应用程序。

3. - stopActivityUpdates

停止向你的应用发送动态更新

4. - queryActivityStartingFromDate:toDate:toQueue:withHandler:

收集并返回指定时间段的历史运动数据

5. + authorizationStatus

授权状态

常量

1. CMMotionActivityHandler

一个能报告与设备相关的当前运动的block

2. CMMotionActivityQueryHandler

它报告在指定的查询间隔之间发生的动作更新的block

CMMotionActivity

单个动作更新事件的数据。

1. stationary

一个布尔指示设备是否是静止的。

2. walking

一个布尔指示设备是否在行走。

3. running

一个布尔指示设备是否在一个正在奔跑。

4. automotive

一个布尔指示设备是否在汽车中。

5. cycling

一个布尔指示设备是否在骑自行车

6. unknown

一个布尔指示设备不知道的类型

7. startDate

动作发生的开始时间

confidence

对运动类型的评估的信任

常量

1. CMMotionActivityConfidence

运动数据是准确常量

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