十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
iOS传感器篇:CoreMotion初探
创新互联是一家专业提供海伦企业网站建设,专注与成都网站设计、网站建设、H5场景定制、小程序制作等业务。10年已为海伦众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
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
运动数据是准确常量
有三种获取磁力计数据的方法,如上图所示
来自磁力计的原始读数
磁场磁场 计读数针对器件偏差(板载磁场)进行了校正,没有器件偏差。
CMCalibratedMagneticField包括两个字段:field(XYZ轴上的磁场强度)和accuracy(磁场长度的精度)。
针对器件偏置校正磁性计读数并过滤以消除局部外部磁场(通过器件移动检测 - 如果器件随器件移动,忽略它;否则测量)
CLHeading是“ 偏离设备跟踪的磁场线”,而magnetometerData.magneticField是设备观察到的总磁场,等于地球的地磁场加上设备本身及其周围的偏置“ 。
因此,CLHeading会提供经过滤的值,其中“参照系”是现有的地球磁场。而磁力计数据提供未经过滤的值,参考帧是设备。
如果你想知道哪里是磁性或真正北方的位置,推荐使用 CLHeading ,可以做指南针的一类应用。如果想要创建一个响应紧邻设备磁场的应用,或者想要执行某种特定的传感器融合,可以尝试创建一个AHRS,然后使用 CMMagneticField 即第二种方式。
1.传感器的定义:传感器是一种感应、检测装置
2.传感器的作用:用于检测、感应设备的周边信息;不用类型的传感器,检测到的信息也不一样
3.iPhone内置传感器有:
(1)运动传感器/加速传感器/加速计(Motion/Accelerometer Sensor)
加速计用于检测设备在x、y、z轴上的加速度(那个方向有力的作用);加速计可用检测设备的摇晃(摇一摇、计步器)
(2) 环境传感器(Ambient Light Sensor)
检测周围环境光线的强弱,来控制当前屏幕的亮度,让我们在使用Mac、iPhone、iPad时,眼睛更为舒适
(3)距离传感器(Proximity Sensor)
检测是否有其他物体靠近设备屏幕,当距离太近时,会自动关闭屏幕,可以节省电量,防止耳朵或者面部不小心触碰屏幕引发不必要的意外操作
(4)磁力传感器(Magnetometer Sensor)
可以感应地球磁场,获取方向信息,使位置服务更为精确,可以用于电子罗盘、或者导航应用,iPad的smart cover 盒盖睡眠操作就是基于磁力计传感器实现的
(5)内部温度传感器(Internal Temperature Sensor)
用于检测内部组件的温度,当温度过高时,会有温度过高提示,可以防止温度超高引起iPhone设备的安全性与稳定性
(6)湿度传感器(Moisture Sensor)
湿度传感器跟其他基于微电子的传感器不同,湿度传感器是一个简单地物理传感器,湿度传感器及时一张遇水变红的试纸;apple维修店的员工就是根据是否试纸变红来判断当前设备是进水
(7)陀螺仪(Gyroscoper)
陀螺仪可以用于检测设备的持握方式;陀螺仪的原理是检测设备在x、y、z轴的角速度
4.传感器总结
关于传感器(Sensor),Apple官方好像并没有专门列出来介绍过,我只能从前辈的文章寻找,很多文章中都给iOS传感器进行过很详细的分类介绍,但有的传感器只是有过介绍,没有介绍使用方法或API,当然也有可能是我没搜索到,比如湿度传感器很多文章都提到,但详细使用方式就未曾看到过,还有这边的湿度传感器是指iPhone内部的?还是指iPhone所在外部环境的?
iPhone的传感器是经过长时间不停的变化和改进的,因为传感器一听名字就知道这种变化和改进十之八九是要与硬件有关系的。知乎中有一遍文章介绍的很详细, iPhone这十年在传感器上的演进- 知乎专栏 。
我姑且按照我查看的资料对iOS传感器进行一个不精确分类。
知乎知友 Hi-iD 的 答案 介绍过这两个传感器的关系,本人简单总结如下:
距离传感器的使用的使用相对简单:
现在对iPhone顶部中心一个孔进行遮挡,就能感受的距离传感器。
Core Motion 是关于accelerometers(加速计), gyroscopes(陀螺仪), pedometers(步数计), magnetometers( 磁力计), and barometers(气压计)等5个传感器使用的框架, 暂时就按照字面意思翻译成核心运动框架。官方文档的介绍:
之后的文章就学习 Core Motion 的使用。????