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>