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
运动数据是准确常量