傳感器
傳感器是一種感應(yīng)\檢測裝置, 目前已經(jīng)廣泛應(yīng)用于智能手機上内边,用于感應(yīng)\檢測設(shè)備周邊的信息,不同類型的傳感器, 檢測的信息也不一樣
iOS中傳感器
590107-b80b8936f8277f84.png
核心運動框架-CoreMotion.framework
我們可以使用iOS提供給我們的CoreMotion 框架來訪問加速度器和陀螺儀的相關(guān)數(shù)據(jù)晒他!
它不僅僅提供給你獲得實時的加速度值和旋轉(zhuǎn)速度值秸侣,更重要的是改淑,蘋果在其中集成了很多算法亮蛔,可以直接給你輸出把重力加速度分量剝離的加速度痴施,省去你的高通濾波操作,以及提供給你一個專門的設(shè)備的三維attitude信息究流!
加速計
590107-98de475675ae93b7.png
加速度計的原理很簡單辣吃,現(xiàn)在手機里面基本配備的都是3維線傳感器,也就是說芬探,用來測量x神得,y,z三個軸上的加速力偷仿。加速力就是當(dāng)物體在加速過程中作用在物體上的力哩簿,就好比地球引力,也就是重力酝静。
陀螺儀
1795722-b93020a639168c7e.png
陀螺儀可以檢測設(shè)備的持握方式节榜,原理是檢測在X、Y形入、Z軸上的角速度全跨,當(dāng)物體運動方向偏離預(yù)定方向時缝左,陀螺儀可以檢測出來
CoreMotion處理的數(shù)據(jù)有三種
- 加速度值CMAccelerometerData
- 陀螺儀值 CMGyroData
- 設(shè)備motion值 CMDeviceMotion
CMDeviceMotion屬性
- attitude: 手機當(dāng)前空間位置姿勢
- gravity : 重力信息亿遂,重力加速度矢量在當(dāng)前設(shè)備的參考坐標(biāo)系中的表達
- userAcceleration: 加速度信息
- rotationRate: 即使旋轉(zhuǎn)速率,陀螺儀輸出
1.對加速度器和陀螺儀相關(guān)的訪問渺杉,都被封裝在CoreMotion.framework框架下的CMMotionManager類中蛇数。
我們通過使用類的方法,來得到我們想要的加速度數(shù)據(jù)和陀螺儀數(shù)據(jù)是越。
2. isAccelerometerAvailable方法用來查看加速度器是否可用耳舅。
3. isAccelerometerAvailable方法用來查看加速度器的狀態(tài):是否Active(啟動)。
4.同理isGyroAvailable方法和isGyroActive方法用來檢測陀螺儀。
5.獲取加速度器和陀螺儀的數(shù)據(jù)浦徊。主要有兩種方式:
push方式
這種方式馏予,是實時獲取到Accelerometer的數(shù)據(jù),并且用相應(yīng)的隊列來顯示盔性。即主動霞丧。
pull方式
就是獲取數(shù)據(jù),如果要顯示冕香,就要向Accelerometer來索要數(shù)據(jù)蛹尝。即:被動的方式。
簡單調(diào)用
加速計push方式
// 初始化
self.manger = [[CMMotionManager alloc] init];
// 設(shè)備是否支持
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);
}];
// 結(jié)束
[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];