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)