2019独角兽企业重金招聘Python工程师标准>>>

iOS传感器开发——加速度传感器,螺旋仪传感器,磁力传感器的应用

一、引言

通过加速度传感器,螺旋仪传感器和磁力传感,我们可以获取到手机在当前三维空间中的形态,加速度传感器也被称作重力感应。在一些赛车游戏中可以广泛得到应用。在iOS5之前,iPhone支持的传感器有限,关于加速度传感器的管理用UIAccelerometer这个类负责,iOS5之后,有关设备空间信息的管理交由了CoreMotion这个框架,CoreMotion将多种传感器统一进行管理计算。

二、使用UIAccelerometer获取设备空间位置

虽然在iOS5之后这个类被弃用了,但是和其他大多被弃用的方法类似,在新的iOS版本中,是兼容旧方法的,我们依然可以使用这个类来获取简单的设备空间信息。

我们主要使用到的类和代理方法如下:

//设备信息对象类
@interface UIAcceleration : NSObject
//加速度传感器的时间戳
@property(nonatomic,readonly) NSTimeInterval timestamp;
//x方向值
@property(nonatomic,readonly) UIAccelerationValue x;
//y方向值
@property(nonatomic,readonly) UIAccelerationValue y;
//z方向值
@property(nonatomic,readonly) UIAccelerationValue z;
@end

上面的UIAccelerationValue就是double类型。

加速度传感器获取的属性是设备在三维空间的角度属性,借用下面这张图:

如果将设备这样立在桌面上,设备的三维坐标器如图,我们将设备已Z轴移动的时候,向右x为正,向左为负,其他两轴类似。

//加速度管理类
@interface UIAccelerometer : NSObject
//获取单例对象
+ (UIAccelerometer *)sharedAccelerometer;
//刷新频率
@property(nonatomic) NSTimeInterval updateInterval;
//代理
@property(nullable,nonatomic,weak) id<UIAccelerometerDelegate> delegate;
@end

UIAccelerometer是管理类,通过单例方法获取到实例对象。

@protocol UIAccelerometerDelegate<NSObject>
@optional- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration NS_DEPRECATED_IOS(2_0, 5_0)  __TVOS_PROHIBITED;@end

这个代理方法是刷新信息的回调,会以我们设置的帧率刷新。

举例代码如下:

@interface ViewController ()<UIAccelerometerDelegate>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.[UIAccelerometer sharedAccelerometer].delegate=self;[UIAccelerometer sharedAccelerometer].updateInterval=1/60.0;
}-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{NSLog(@"\n%f\n%f\n%f",acceleration.x,acceleration.y,acceleration.z);// NSLog(@"%f",acceleration.timestamp);
}
@end

三、CoreMotion框架的使用

CoreMotion框架十分强大,它不仅将加速度传感器和螺旋仪传感器进行了统一配置和管理,还为我们封装了许多算法,我们可以直接获取到设备的运动状态信息。

1、CoreMotion负责处理的数据

CoreMotion负责处理四种数据,一种是加速度数据,一种是螺旋仪数据,一种是磁感应数据,还有一种是前三种数据通过复杂运算得到的设备的运动数据。几个主要的类如下:

CMAccelerommterData:设备的加速度数据

typedef struct {double x;double y;double z;
} CMAcceleration;
@interface CMAccelerometerData : CMLogItem
{
@privateid _internal;
}
//加速度的数据对象
@property(readonly, nonatomic) CMAcceleration acceleration;@end

CMGyroData:设备的螺旋仪数据

typedef struct {double x;double y;double z;
} CMRotationRate;
@interface CMGyroData : CMLogItem
{
@privateid _internal;
}
//螺旋仪数据对象
@property(readonly, nonatomic) CMRotationRate rotationRate;@end

CMMagnetometerData:磁感应信息

typedef struct {double x;double y;double z;
} CMMagneticField;@interface CMMagnetometerData : CMLogItem
{
@privateid _internal;
}//磁力对象
@property(readonly, nonatomic) CMMagneticField magneticField;@end

CMDeviceMotion:设备的运动状态数据

@interface CMDeviceMotion : CMLogItem
{
@privateid _internal;
}
//设备的状态对象
@property(readonly, nonatomic) CMAttitude *attitude;
//设备的角速度
@property(readonly, nonatomic) CMRotationRate rotationRate;
//设备的重力加速度
@property(readonly, nonatomic) CMAcceleration gravity;
//用户嫁给设备的加速度 设备的总加速度为重力加速度叫上用户给的加速度
@property(readonly, nonatomic) CMAcceleration userAcceleration;
//设备的磁场矢量对象
@property(readonly, nonatomic) CMCalibratedMagneticField magneticField NS_AVAILABLE(NA,5_0);

相比之前两个类,这个就比较复杂了,attitude对象中又封装了许多设备的状态属性:

@interface CMAttitude : NSObject <NSCopying, NSSecureCoding>
{
@privateid _internal;
}
//设备的欧拉角roll
@property(readonly, nonatomic) double roll;
//设备的欧拉角pitch
@property(readonly, nonatomic) double pitch;
//设备的欧拉角yaw
@property(readonly, nonatomic) double yaw;
//设备状态的旋转矩阵
@property(readonly, nonatomic) CMRotationMatrix rotationMatrix;
//设备状态的四元数
@property(readonly, nonatomic) CMQuaternion quaternion;
@end

2、CoreMotion的使用

CoreMotion有两种使用方式,一种是我们主动向manager索取数据,一种是通过回调让manager将数据传给回调给我们,这两种方式分别称作pull方式和push方式。

pull方式:

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.//创建管理对象manager= [[CMMotionManager alloc]init];//开启加速度更新[manager startAccelerometerUpdates];//开启螺旋仪更新[manager startGyroUpdates];//开启状态更新[manager startMagnetometerUpdates];//创建定时器NSTimer * time = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updata) userInfo:nil repeats:YES];time.fireDate = [NSDate distantPast];
}-(void)updata{
//获取数据NSLog(@"%f,%f,%f\n%f,%f,%f",manager.accelerometerData.acceleration.x,manager.accelerometerData.acceleration.y,manager.accelerometerData.acceleration.z,manager.gyroData.rotationRate.x,manager.gyroData.rotationRate.y,manager.gyroData.rotationRate.z);}

push方式:

   //创建管理对象manager= [[CMMotionManager alloc]init];//在当前线程中回调[manager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {NSLog(@"%f,%f,%f\n%f,%f,%f",manager.accelerometerData.acceleration.x,manager.accelerometerData.acceleration.y,manager.accelerometerData.acceleration.z,manager.gyroData.rotationRate.x,manager.gyroData.rotationRate.y,manager.gyroData.rotationRate.z);}];

3、CoreMotion的更多属性和方法

@interface CMMotionManager : NSObject
{
@privateid _internal;
}
//设置加速度传感器更新帧率
@property(assign, nonatomic) NSTimeInterval accelerometerUpdateInterval __TVOS_PROHIBITED;
//加速度传感器是否可用
@property(readonly, nonatomic, getter=isAccelerometerAvailable) BOOL accelerometerAvailable __TVOS_PROHIBITED;
//加速度传感器是否激活
@property(readonly, nonatomic, getter=isAccelerometerActive) BOOL accelerometerActive __TVOS_PROHIBITED;
//加速度传感器数据对象
@property(readonly, nullable) CMAccelerometerData *accelerometerData __TVOS_PROHIBITED;
//pull方式开始更新加速度数据
- (void)startAccelerometerUpdates __TVOS_PROHIBITED;
//push方式更新加速度数据
- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler __TVOS_PROHIBITED;
//停止更新加速度数据
- (void)stopAccelerometerUpdates __TVOS_PROHIBITED;
//螺旋仪传感器刷新帧率
@property(assign, nonatomic) NSTimeInterval gyroUpdateInterval __TVOS_PROHIBITED;
//螺旋仪是否可用
@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable __TVOS_PROHIBITED;
//螺旋仪是否激活
@property(readonly, nonatomic, getter=isGyroActive) BOOL gyroActive __TVOS_PROHIBITED;
//螺旋仪数据
@property(readonly, nullable) CMGyroData *gyroData __TVOS_PROHIBITED;
//pull方式开始更新螺旋仪
- (void)startGyroUpdates __TVOS_PROHIBITED;
//push方式开始更新螺旋仪
- (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler __TVOS_PROHIBITED;
//停止更新螺旋仪
- (void)stopGyroUpdates __TVOS_PROHIBITED;
//磁力传感更新帧率
@property(assign, nonatomic) NSTimeInterval magnetometerUpdateInterval NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//设备磁力传感器是否可用
@property(readonly, nonatomic, getter=isMagnetometerAvailable) BOOL magnetometerAvailable NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//设备磁力传感器是否激活
@property(readonly, nonatomic, getter=isMagnetometerActive) BOOL magnetometerActive NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//设备磁力状态数据
@property(readonly, nullable) CMMagnetometerData *magnetometerData NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//pull方式更新设备磁力状态
- (void)startMagnetometerUpdates NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//push方式更新设备磁力状态
- (void)startMagnetometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMagnetometerHandler)handler NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//停止更新设备状态
- (void)stopMagnetometerUpdates NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//设备状态更新帧率
@property(assign, nonatomic) NSTimeInterval deviceMotionUpdateInterval __TVOS_PROHIBITED;
//参考器枚举
+ (CMAttitudeReferenceFrame)availableAttitudeReferenceFrames NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
@property(readonly, nonatomic) CMAttitudeReferenceFrame attitudeReferenceFrame NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//设备运动信息是否可用
@property(readonly, nonatomic, getter=isDeviceMotionAvailable) BOOL deviceMotionAvailable __TVOS_PROHIBITED;
//设备运动信息是否激活
@property(readonly, nonatomic, getter=isDeviceMotionActive) BOOL deviceMotionActive __TVOS_PROHIBITED;
//设备运动信息对象
@property(readonly, nullable) CMDeviceMotion *deviceMotion __TVOS_PROHIBITED;
//pull方式开始刷新运动信息
- (void)startDeviceMotionUpdates __TVOS_PROHIBITED;
//push方式开始刷新运动信息
- (void)startDeviceMotionUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMDeviceMotionHandler)handler __TVOS_PROHIBITED;
//使用某个参考系
- (void)startDeviceMotionUpdatesUsingReferenceFrame:(CMAttitudeReferenceFrame)referenceFrame NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//push方式开始刷新设备运动信息
- (void)startDeviceMotionUpdatesUsingReferenceFrame:(CMAttitudeReferenceFrame)referenceFrame toQueue:(NSOperationQueue *)queue withHandler:(CMDeviceMotionHandler)handler NS_AVAILABLE(NA,5_0) __TVOS_PROHIBITED;
//停止刷新设备运动信息
- (void)stopDeviceMotionUpdates __TVOS_PROHIBITED;

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

转载于:https://my.oschina.net/u/2340880/blog/543434

iOS传感器开发——加速度传感器,螺旋仪传感器,磁力传感器的应用相关推荐

  1. bme280 环境传感器开发板_半导体所在柔性湿度传感器与非接触控制方面取得进展...

    人机交互技术因其在物联网(IoT)中的重要应用而受到广泛关注,例如可穿戴电子和远程医疗监控等.对于人机交互系统,智能传感器起着关键作用,因为它们可以有效地将来自人体的各种信号"转换" ...

  2. 关于 ST mems传感器开发的一些技术分享

    文章目录 关于 STMicroelectronics mems传感器开发的一些技术分享 实验材料: 实验步骤及技术要点: 开发板嵌入式端的关键代码分析: 关于 STMicroelectronics m ...

  3. 基于LabVIEW 2018开发的多通道测振仪源代码,可对IEPE振动加速度传感器的信号进行采集分析

    基于LabVIEW 2018开发的多通道测振仪源代码,可对IEPE振动加速度传感器的信号进行采集分析. 为保证良好的体验性,建议选择显示器的分辨率为1920*1080,Windows的显示缩放比例为1 ...

  4. 螺旋仪传感器控制手机转向

    公司走测小项目,功能测wifi信号,围着房子转一圈,绘制出走测图,用点的颜色代表信号强度:走测sdk自带的方向控制是手动的,就是点一下左转的时候要点一下左转给sdk发指令:领导想实现自动,于是就使用传 ...

  5. iOS传感器开发——为APP添加手机密码、指纹进行安全验证

    iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...

  6. ML302 OpenCPU系列(6)---LIS3DH加速度传感器开发

    ML302 OpenCPU系列(6)---LIS3DH加速度传感器开发 一.原理图 二.待实现功能 三.实现步骤 四.源码   近期由于项目需要,在ML302 OpenCPU上调试了三轴加速度计LIS ...

  7. Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现

    加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...

  8. 《Android传感器开发与智能设备案例实战》——导读

    本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的目录,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 ...

  9. 【Android游戏开发十八】解放手指,利用传感器开发游戏!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/344.html 前 ...

  10. Android 传感器开发详解

    Android 传感器开发详解 本文转载自:https://blog.csdn.net/airsaid/article/details/52902299 前言 使用 第一步 第二步 第三步 方向传感器 ...

最新文章

  1. 人均6.5万!鹅厂又双叒叕给员工发股票了
  2. POJ-2948 Martian Mining 动态规划
  3. 给kali的metasploit下添加一个新的exploit
  4. Akka应用模式:分布式应用程序设计实践指南pdf
  5. java executor spring_Spring+TaskExecutor实例
  6. Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
  7. jQuery的实现原理
  8. c# 定义委托和使用委托(事件的使用)
  9. (转)首个比特币投资基金在加拿大获批上线!
  10. 试用版的和正式版的软件有什么区别
  11. 简单好用的网站压力测试工具
  12. txt电子书如何用IOS苹果手机打开?
  13. Golang 基础:接口使用、实现原理(eface iface)和设计模式
  14. 高中数学记录日志(2019人教A版必修二)
  15. 转载MPEG4 H.264学习笔记 ------ 视频格式与质量
  16. 哈佛机构与冯诺依曼架构
  17. 怎么将pdf转换成word?
  18. 安装 ubuntu16.04 ROS2 超过5分钟你打我 后带 测试talker listener demo
  19. 输入十进制数字,中文大写数字的形式读出
  20. maven打包带依赖和瘦包

热门文章

  1. Java单例模式简单代码
  2. 艾宾浩斯曲线在线 PDF 文件生成 在线背单词 背单词计划表 高考-四级-六级-SAT-托福-雅思-GRE-17 天搞定 GRE 单词, 背单词神器-动态生成时间表! 利用艾宾浩斯记忆曲线自动生成背单
  3. 永恒不变的内容营销不利于seo
  4. 墨刀可以导入文件吗_墨刀和Sketch擦出的火花
  5. html跳转,获取get提交参数
  6. 会员管理系统适用于哪些行业
  7. 网络攻防技术——缓冲区溢出攻击实验
  8. 如何启动Django项目详解
  9. 第二章 第七课 Scratch作品:神奇的小猫(脚本块:外观)
  10. Java多线程面试知识点汇总(超详细总结)