iOS 传感器(加速计 + 陀螺仪)
【摘要】
iOS中常用的传感器主要有以下2种
(1)加速计
加速计使用度量单位g,这是重力(gravity)的简称。1g是物体在地球的海平面上收到的下拉力(9.8米/秒)
加速计以相对于自由落体的方式度量加速度。
&...
iOS中常用的传感器主要有以下2种
(1)加速计
加速计使用度量单位g,这是重力(gravity)的简称。1g是物体在地球的海平面上收到的下拉力(9.8米/秒)
加速计以相对于自由落体的方式度量加速度。
这意味着如果将iOS设备在能够持续自由落体的地方丢下,在下落过程中,其加速计测量到的加速度将为0g。
另一方面,放在左面上的设备的加速度计测量出的加速度为1g,且方向朝上。
(2)陀螺仪
陀螺仪将报告设备绕x、y、z轴的旋转速度,单位为弧度每秒
2弧度等于1圈,所以陀螺仪返回读数2.0表示设备绕相应的轴每秒旋转一圈
(3)两者的区别
仅当设备的朝向相对于重力的方向发生变化时,加速计才能检测的到;而无论设备处于什么朝向,只要它在旋转,陀螺仪都能检测的到
主要代码如下,分别用了2种方式获取数据
(1)定时器(NSTimer)
(2)操作队列(NSOperationQueue)
-
#import <CoreMotion/CoreMotion.h>
-
-
#define ACCELEROMETER_UPDATE_INTERVAL 1.0
-
#define GYRO_UPDATE_INTERVAL 1.0
-
-
@interface ViewController () {
-
CMMotionManager *motionManager;
-
}
-
@end
-
-
@implementation ViewController
-
-
- (void)viewDidLoad {
-
[super viewDidLoad];
-
// Do any additional setup after loading the view, typically from a nib.
-
-
motionManager = [[CMMotionManager alloc] init];
-
[self startAccelerometerSensor];
-
[self startGyroSensor];
-
[self startDeviceOrientationChangeListener];
-
}
-
-
//加速计
-
-(void)startAccelerometerSensor {
-
//更新时间间隔
-
motionManager.accelerometerUpdateInterval = ACCELEROMETER_UPDATE_INTERVAL;
-
//开始获取数据
-
[motionManager startAccelerometerUpdates];
-
-
//(1)使用”定时器“(NSTimer)获取数据
-
[NSTimer scheduledTimerWithTimeInterval:ACCELEROMETER_UPDATE_INTERVAL target:self selector:@selector(accelerometerDidUpdate) userInfo:nil repeats:YES];
-
-
//(2)将数据传递给“操作队列”(NSOperationQueue)
-
NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
-
[motionManager startAccelerometerUpdatesToQueue:operationQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
-
CMAcceleration acceleration = accelerometerData.acceleration;
-
NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
-
}];
-
-
//[motionManager stopAccelerometerUpdates];
-
}
-
-
- (void)accelerometerDidUpdate {
-
CMAcceleration acceleration = motionManager.accelerometerData.acceleration;
-
NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
-
}
-
-
//陀螺仪
-
-(void)startGyroSensor {
-
//首先需要判断陀螺仪是否可用,因为2010年以前的设备是没有“陀螺仪”的
-
if(motionManager.gyroAvailable) {
-
//更新时间间隔
-
motionManager.gyroUpdateInterval = GYRO_UPDATE_INTERVAL;
-
//开始获取数据
-
[motionManager startGyroUpdates];
-
//(1)使用”定时器“(NSTimer)获取数据
-
[NSTimer scheduledTimerWithTimeInterval:GYRO_UPDATE_INTERVAL target:self selector:@selector(gyroDidUpdate) userInfo:nil repeats:YES];
-
-
//(2)将数据传递给“操作队列”(NSOperationQueue)
-
NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
-
[motionManager startGyroUpdatesToQueue:operationQueue withHandler:^(CMGyroData * gyroData, NSError * error) {
-
CMRotationRate rotationRate = gyroData.rotationRate;
-
NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
-
}];
-
-
//[motionManager stopGyroUpdates];
-
} else {
-
NSLog(@"gyro not available");
-
}
-
}
-
-
-(void)gyroDidUpdate {
-
CMRotationRate rotationRate = motionManager.gyroData.rotationRate;
-
NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
-
}
需要注意的是:模拟器是无法对传感器进行测试的,所以请使用真机运行以上代码
文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chy555chy/article/details/51724267
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)