下面说说Core Motion具体负责的采集,计算和处理。Core Motion的使用就是一三部曲:初始化,获取数据,处理后事。
在初始化阶段,不管你要获取的是什么数据,首先需要做的就是
motionManager = [[CMMotionManager alloc] init];
所有的操作都会由这个manager接管。后面的初始化操作相当直观,以加速度的pull方式为例
if (!motionManager.accelerometerAvailable) {
// fail code // 检查传感器到底在设备上是否可用
}
motionManager.accelerometerUpdateInterval = 0.01; // 告诉manager,更新频率是100Hz
[motionManager startAccelerometerUpdates]; // 开始更新,后台线程开始运行。这是pull方式。
如果是push方式,更新的代码可以写成这样
[motionManager startAccelerometerUpdate
sToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *latestAcc, NSError *error)
{
// Your code here
}];
接下来就是获取数据了。Again,很简单的代码
CMAccelerometerData *newestAccel = motionManager.accelerometerData;
filteredAcceleration[0] = newestAccel.acceleration.x;
filteredAcceleration[1] = newestAccel.acceleration.y;
filteredAcceleration[2] = newestAccel.acceleration.z;
通过定义的CMAccelerometerData变量,获取CMAcceleration信息。和以前的UIAccelerometer类的使用方式一样,CMAcceleration在Core Motion中是以结构体形式定义的
typedef struct {
double x;
double y;
double z;
}
对应的motion信息,比如加速度或者旋转速度,就可以直接从这三个成员变量中得到。
最后是处理后事,就是在你不需要Core Motion进行处理的时候,释放资源