专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

iOS学习-加速计和陀螺仪

Cocoa开发者社区  · 公众号  · ios  · 2016-08-12 08:03

正文

▲点击上方“CocoaChina”关注即可免费学习 iOS 开发


作者:执着_执念

原文链接:http://www.jianshu.com/p/5bf81ef8d35a


一、CoreMotion框架介绍


我们知道有一些iOS的应用,会有一些特殊的要求,比如:


  1. 电子罗盘指南针之类的应用:让我们知道方向。

  2. 运动类型软件:让我们知道我们跑步多少公里。

  3. 社交软件中的摇一摇功能。

  4. 游戏中扮演角色类中根据设备的晃动等进行操作。


其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework


  1. 使用iOS提供给我们的CoreMotion框架,主要是为了访问加速度计和陀螺仪的相关数据。


  2. 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。


传感器介绍:


1. 加速度计:


加速度计的原理很简单,现在手机里面基本配备的都是3维线传感器,也就是说,用来测量x,y,z三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。




2. 陀螺仪:


陀螺仪的主要作用,是基于角动量守恒的理论,沿着某个特定的坐标轴测量旋转速率。在使用中,陀螺仪的转子在高速旋转时,始终指向一个固定的方向,当运动物体的运动方向偏离预定方向时,陀螺仪就可以感受出来。



二、CoreMotion使用



CoreMotion主要负责三种数据:


  • 加速度值CMAccelerometerData

  • 陀螺仪值CMGyroData

  • 设备motion值CMDeviceMotion


实际上,这个设备motion值就是通过加速度和旋转速度进行变换算出来的




CMDeviceMotion属性介绍:


  1. attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势

  2. gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达

  3. userAcceleration:加速度信息

  4. rotationRate:即时的旋转速率,是陀螺仪的输出


使用CoreMotion的步骤:


  1. 初始化CMMotionManager管理对象

  2. 调用管理对象的对象方法获取数据,有2种方式

  3. 处理数据

  4. 当你不需要使用的时候,停止获取数据


-(void)stopAccelerometerUpdates;//停止获取加速度计数据

-(void)stopGyroUpdates;//停止获取陀螺仪数据

-(void)stopDeviceMotionUpdates;//停止获取设备motion数据


在CoreMotion中有2种获取数据方式:


1. Push方式:


提供一个线程管理器NSOperationQueue和一个回调Block,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这种情况下,Block中的操作会在你自己的主线程内执行。


2. Pull方式:


你必须主动去向CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你。


1. 加速度计使用Pull方式获取:


- (void)useAccelerometerPull{

//初始化全局管理对象

CMMotionManager *manager = [[CMMotionManager alloc] init];

self.motionManager = manager;

//判断加速度计可不可用,判断加速度计是否开启

if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){

//告诉manager,更新频率是100Hz

manager.accelerometerUpdateInterval = 0.01;

//开始更新,后台线程开始运行。这是Pull方式。

[manager startAccelerometerUpdates];

}

//获取并处理加速度计数据

CMAccelerometerData *newestAccel = self.motionManager.accelerometerData;

NSLog(@"X = %.04f",newestAccel.acceleration.x);

NSLog(@"Y = %.04f",newestAccel.acceleration.y);

NSLog(@"Z = %.04f",newestAccel.acceleration.z);

}


2. 加速度计使用Push方式获取:


- (void)useAccelerometerPush{

//初始化全局管理对象

CMMotionManager *manager = [[CMMotionManager alloc] init];

self.motionManager = manager;

//判断加速度计可不可用,判断加速度计是否开启

if ([manager isAccelerometerAvailable] && [manager isAccelerometerActive]){

//告诉manager,更新频率是100Hz

manager.accelerometerUpdateInterval = 0.01;

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//Push方式获取和处理数据

[manager startAccelerometerUpdatesToQueue:queue

withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)

{

NSLog(@"X = %.04f",accelerometerData.acceleration.x);

NSLog(@"Y = %.04f",accelerometerData.acceleration.y);

NSLog(@"Z = %.04f",accelerometerData.acceleration.z);

}];

}

}


3. 陀螺仪使用Push方式获取,Pull方式就不列出来了,和加速度计使用相似:


- (void)useGyroPush{

//初始化全局管理对象

CMMotionManager *manager = [[CMMotionManager alloc] init];

self.motionManager = manager;

//判断陀螺仪可不可以,判断陀螺仪是不是开启

if ([manager isGyroAvailable] && [manager isGyroActive]){

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//告诉manager,更新频率是100Hz

manager.gyroUpdateInterval = 0.01;

//Push方式获取和处理数据

[manager startGyroUpdatesToQueue:queue

withHandler:^(CMGyroData *gyroData, NSError *error)

{

NSLog(@"Gyro Rotation x = %.04f", gyroData.rotationRate.x);

NSLog(@"Gyro Rotation y = %.04f", gyroData.rotationRate.y);

NSLog(@"Gyro Rotation z = %.04f", gyroData.rotationRate.z);

}];

}

}


以上代码必须是真机上才能正常运行,利用上面的知识我们可以做类似于这样的效果:



热门文章

神解释:向外行介绍程序员工作的复杂程度

史上最坑程序员,把整个公司删没了

据说,年薪百万的程序员,都是这么开悟的

知道这20个正则表达式,能让你少写1000行代码

程序员“从入门到跑路”全系列畅销书,欢迎阅读!

你在公司项目里面看到过哪些操蛋的代码?

资深程序员是如何用五年时间攒够100万的

不懂技术的人不要对懂技术的人说这很容易实现

史上最内涵的程序员笑话,你能看懂几个?

GitHub 中国区前 100 名到底是什么样的人?




小编推荐:[掘金]是一个高质量的技术社区,从 Swift 到 React Native,性能优化到动效源码,让你不错过 iOS 开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。



微信号:CocoaChinabbs


▲长按二维码“识别”关注即可免费学习 iOS 开发

月薪十万、出任CEO、赢娶白富美、走上人生巅峰不是梦

--------------------------------------

商务合作QQ:645047738

投稿邮箱:[email protected]