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