iOS学习笔记34-加速计和陀螺仪
一、CoreMotion框架介绍
我们知道有一些iOS的应用,会有一些特殊的要求,比如:
- 电子罗盘指南针之类的应用:让我们知道方向。
- 运动类型软件:让我们知道我们跑步多少公里。
- 社交软件中的摇一摇功能。
- 游戏中扮演角色类中根据设备的晃动等进行操作。
其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework
- 使用iOS提供给我们的
CoreMotion框架,主要是为了访问加速度计和陀螺仪的相关数据。 - 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。
传感器介绍:
- 加速度计:
加速度计的原理很简单,现在手机里面基本配备的都是3维线传感器,也就是说,用来测量x,y,z三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。
- 陀螺仪:
陀螺仪的主要作用,是基于角动量守恒的理论,沿着某个特定的坐标轴测量旋转速率。在使用中,陀螺仪的转子在高速旋转时,始终指向一个固定的方向,当运动物体的运动方向偏离预定方向时,陀螺仪就可以感受出来。
二、CoreMotion使用

CoreMotion主要负责三种数据:
- 加速度值
CMAccelerometerData - 陀螺仪值
CMGyroData - 设备motion值
CMDeviceMotion
实际上,这个设备motion值就是通过加速度和旋转速度进行变换算出来的
CMDeviceMotion属性介绍:
attitude:通俗来讲,就是告诉你手机在当前空间的位置和姿势gravity:重力信息,其本质是重力加速度矢量在当前设备的参考坐标系中的表达userAcceleration:加速度信息rotationRate:即时的旋转速率,是陀螺仪的输出
使用CoreMotion的步骤:
- 初始化
CMMotionManager管理对象 - 调用管理对象的对象方法获取数据,有2种方式
- 处理数据
当你不需要使用的时候,停止获取数据
-(void)stopAccelerometerUpdates;//停止获取加速度计数据
-(void)stopGyroUpdates;//停止获取陀螺仪数据
-(void)stopDeviceMotionUpdates;//停止获取设备motion数据
在CoreMotion中有2种获取数据方式:
Push方式:
提供一个线程管理器NSOperationQueue和一个回调Block,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这种情况下,Block中的操作会在你自己的主线程内执行。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);
}];
}
}
iOS学习笔记34-加速计和陀螺仪的更多相关文章
- IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新
移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的数据也用的 ...
- iOS学习新知识-加速计和陀螺仪
一.CoreMotion框架介绍 我们知道有一些iOS的应用,会有一些特殊的要求,比如: 电子罗盘指南针之类的应用:让我们知道方向. 运动类型软件:让我们知道我们跑步多少公里. 社交软件中的摇一摇功能 ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
随机推荐
- java.lang.ClassCastException: com.ch.hibernate.Student_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
利用query动态查询时,报错 java.lang.ClassCastException: com.ch.hibernate.Student_$$_javassist_0 cannot be cast ...
- 并发教程--JAVA5中 计数信号量(Counting Semaphore)例子
并发教程--JAVA5中 计数信号量(COUNTING SEMAPHORE)例子 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java中的计数信息量(C ...
- codeforce Gym 100685F Flood (topo排序)
如果直接模拟水向周围流会TLE,因为某些个结点被重复扩展了多次, 科学做法是topo排序,每次只把入度为0的点放入队列,这样就严格保证了每个结点只被扩展一次. #include<bits/std ...
- solver
slover中有type,用于优化算法的选择,有6种: Stochastic Gradient Descent (type: “SGD”), AdaDelta (type: “AdaDelta”), ...
- 厌食?暴食?试试这个 VR 新疗法
今日导读 “我知道我要吃饭,但我真的什么都吃不下.” “我脑子里想的只有吃东西,吃吃吃!” ....... 作为一个正常人,我们完全无法想象患厌食症或贪食症人群所受的痛苦.长期的厌食,会使一个人瘦的只 ...
- apropos linux
Apropos adj. 恰当的,关于,就...而言 adv. 顺便地,恰当地 All my suggestions apropos the script were accepted. 我所有有关该剧 ...
- java基础——快速排序
今天又把以前学的快速排序拿出来回忆一下 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对“6 1 2 7 9 3 ...
- Linux下如何通过命令检查网卡是否插上网线
How To:Linux下如何通过命令检查网卡是否插上网线 主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上 ...
- 创建自定义 Estimator
ref 本文档介绍了自定义 Estimator.具体而言,本文档介绍了如何创建自定义 Estimator 来模拟预创建的 Estimator DNNClassifier 在解决鸢尾花问题时的行为.要详 ...
- mongo 副本集+分片 配置
服务器规划如下: 副本集名称|服务器IP 192.168.56.111 192.168.56.112 192.168.56.113 shard1 3201 3201 3201 shard2 3202 ...