前言:之前参加了一个比赛,里面主要涉及到VR图片拍摄和图片3D呈现,本次主要说说图片拍摄中使用到的陀螺仪和加速度计。
1、什么是CoreMotion
CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用。加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟以上动作,真机调试需要开发者账号。
2、CoreMotion作用
CoreMotion主要负责三种数据:加速度值,陀螺仪值,设备motion值。实际上,这个设备motion值就是通过加速度和旋转速度进行 fusing变换算出来的,基本原理后面会介绍。CoreMotion在系统中以单独的后台线程的方式去获得原始数据,并同时执行一些motion算法来提取更多的信息,然后呈献给应用层做进一步处理。CoreMotion框架包含有一个专门的Manager类,CMMotionManager,然后由这个manager去管理三种和运动相关的数据封装类,而 且,这些类都是CMLogItem类的子类,所以相关的motion数据都可以和发生的时间信息一起保存到对应文件中,有了时间戳,两个相邻数据之间的实 际更新时间就很容易得到了。这个东西是非常有用的,比如有些时候,你得到的是50Hz的采样数据,但希望知道的是每一秒加速度的平均值。
3、CoreMotion数据获取
CoreMotion中获取数据主要是两种方式:
一种是Push,就是你提供一个线程管理器NSOperationQueue,再提供一个Block,这样,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这中情况下,block中的操作会在你自己的主线程内执行。
一种是 Pull,在这个方式里,你必须主动去像CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你。当然,在这种情况下,CoreMotion所有的操作都在自己的后台线程中进行,不会有任何干扰你当前线程的行为。
4、加速计
- Pull获取方式
//判断加速计是否可用
if ([_motionManager isAccelerometerAvailable]) {
// 设置加速计采样频率
[_motionManager setAccelerometerUpdateInterval:1 / 40.0];
[_motionManager startAccelerometerUpdates];
}else {
NSLog(@"设备不支持加速计");
}
//获取数据
CMAcceleration acceleration=_motionManager.accelerometerData.acceleration;
NSLog(@"%f---%f---%f",acceleration.x,acceleration.y,acceleration.z);
- Push获取方式
//判断加速计是否可用
if([_motionManager isAccelerometerAvailable]) {
// 设置加速计频率
[_motionManager setAccelerometerUpdateInterval:1 / 40.0];
//开始采样数据
[_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
NSLog(@"%f---%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y);
}];
} else{
NSLog(@"设备不支持加速计");
}
5、陀螺仪
- Pull获取方式
//判断陀螺仪是否可用
if ([_motionManager isGyroAvailable]) {
// 设置陀螺仪采样频率
[_motionManager setGyroUpdateInterval:1 / 40.0];
[_motionManager startGyroUpdates];
}else {
NSLog(@"设备不支持陀螺仪");
}
//获取数据
CMGyroData *gyroData=_motionManager.gyroData;
NSLog(@"%f---%f---%f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData/rotationRate.z);
- Push获取方式
//判断陀螺仪是否可用
if([_motionManager isGyroAvailable]) {
// 设置陀螺仪频率
[_motionManager setGyroUpdateInterval:1 / 40.0];
//开始采样数据
[_motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
NSLog(@"%f---%f---%f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData/rotationRate.z);
}];
} else{
NSLog(@"设备不支持陀螺仪");
}