iOS事件-加速计陀螺仪

selena4040 8年前
   <h3>传感器</h3>    <p>传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上,用于感应\检测设备周边的信息,不同类型的传感器, 检测的信息也不一样</p>    <h3>iOS中传感器</h3>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3d88fbe8c7175e30f57ff584a0969360.png"></p>    <h3>核心运动框架-CoreMotion.framework</h3>    <p>我们可以使用iOS提供给我们的CoreMotion 框架来访问加速度器和陀螺仪的相关数据!</p>    <p>它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维attitude信息!</p>    <h3>加速计</h3>    <p style="text-align:center"><img src="https://simg.open-open.com/show/26bc0525b2f484289657b43f8431ac05.png"></p>    <p>速度计的原理很简单,现在手机里面基本配备的都是3维线传感器,也就是说,用来测量x,y,z三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。</p>    <h3>陀螺仪</h3>    <p style="text-align:center"><img src="https://simg.open-open.com/show/49d9a1934de3d3f71f43e955c5741f02.png"></p>    <p>陀螺仪可以检测设备的持握方式,原理是检测在X、Y、Z轴上的角速度,当物体运动方向偏离预定方向时,陀螺仪可以检测出来</p>    <p>CoreMotion处理的数据有三种</p>    <ul>     <li>加速度值CMAccelerometerData</li>     <li>陀螺仪值 CMGyroData</li>     <li>设备motion值 CMDeviceMotion</li>    </ul>    <p>CMDeviceMotion属性</p>    <ul>     <li>attitude: 手机当前空间位置姿势</li>     <li>gravity : 重力信息,重力加速度矢量在当前设备的参考坐标系中的表达</li>     <li>userAcceleration: 加速度信息</li>     <li>rotationRate: 即使旋转速率,陀螺仪输出</li>    </ul>    <pre>  <code class="language-objectivec">1.对加速度器和陀螺仪相关的访问,都被封装在CoreMotion.framework框架下的CMMotionManager类中。  我们通过使用类的方法,来得到我们想要的加速度数据和陀螺仪数据。  2. isAccelerometerAvailable方法用来查看加速度器是否可用。  3. isAccelerometerAvailable方法用来查看加速度器的状态:是否Active(启动)。  4.同理isGyroAvailable方法和isGyroActive方法用来检测陀螺仪。  5.获取加速度器和陀螺仪的数据。主要有两种方式:  push方式  这种方式,是实时获取到Accelerometer的数据,并且用相应的队列来显示。即主动。  pull方式  就是获取数据,如果要显示,就要向Accelerometer来索要数据。即:被动的方式。</code></pre>    <h3>简单调用</h3>    <p>加速计push方式</p>    <pre>  <code class="language-objectivec">// 初始化      self.manger = [[CMMotionManager alloc] init];      //  设备是否支持      if (![self.manger isAccelerometerAvailable])      {          NSLog(@"加速计不可用");      }        // 采样频率      self.manger.accelerometerUpdateInterval = 1;        [self.manger startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {          if (error) return;            // 获取加速计的信息          CMAcceleration acceleration = accelerometerData.acceleration;          NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);      }];</code></pre>    <pre>  <code class="language-objectivec">// 结束      [self.manger stopAccelerometerUpdates];</code></pre>    <p>加速计pull方式</p>    <pre>  <code class="language-objectivec">self.manger = [[CMMotionManager alloc] init];        if (![self.manger isAccelerometerAvailable])      {          NSLog(@"加速计不可用");      }        [self.manger startAccelerometerUpdates];        // 需要时获取      CMAccelerometerData *accelerometerdata = self.manger.accelerometerData;      NSLog(@"x:%f y:%f z:%f", accelerometerdata.acceleration.x, accelerometerdata.acceleration.y, accelerometerdata.acceleration.z);</code></pre>    <pre>  <code class="language-objectivec">-(void)stopAction  {      if ([self.manger isAccelerometerActive] == YES)      {          [self.manger stopAccelerometerUpdates];      }  }</code></pre>    <h3>陀螺仪push方式</h3>    <pre>  <code class="language-objectivec">// 初始化陀螺仪      self.manger = [[CMMotionManager alloc] init];        if (![self.manger isGyroAvailable])      {          NSLog(@"陀螺仪不可用");      }        if (![self.manger isGyroActive])      {          [self.manger setGyroUpdateInterval:0.5];            [self.manger startGyroUpdatesToQueue:[[NSOperationQueue alloc] init] 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);            }];      }</code></pre>    <pre>  <code class="language-objectivec">[self.manger stopGyroUpdates];</code></pre>    <p> </p>    <p>来自:http://www.jianshu.com/p/844e61e1c219</p>    <p> </p>