加速度计&陀螺仪

本文介绍了iOS中使用Core Motion框架获取和处理加速度计及陀螺仪数据的过程。通过初始化CMMotionManager,设置更新频率,然后获取加速度、重力、旋转速率等信息。Core Motion还提供了经过融合算法处理的Device Motion数据,包括attitude、gravity和rotation rate,简化了运动数据的处理和分析。
摘要由CSDN通过智能技术生成
在iOS4之前,加速度计由UIAccelerometer类来负责采集工作,而电子罗盘则由Core Location接管。
而iPhone4的推出,由于加速度计的升级和陀螺仪的引入,与motion相关的编程成为重头戏,
所以,苹果在iOS4中增加一个一个专门负责该方面处理的框架,就是Core Motion Framework。
这个Core Motion有什么好处呢?简单来说,它不仅仅提供给你获得实时的加速度值和旋转速度值,
更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,
省去你的高通滤波操作,以及提供给你一个专门的设备的三维attitude信息!
Core Motion在iOS4.0主要负责三种数据:加速度值,陀螺仪值,设备motion值。实际上,这个设备motion值就是通过加速度和旋转速度进行fusing变换算出来的,基本原理后面会介绍。Core Motion在系统中以单独的后台线程的方式去获得原始数据,并同时执行一些motion算法来提取更多的信息,然后呈献给应用层做进一步处理。Core Motion框架包含有一个专门的Manager类,CMMotionManager,然后由这个manager去管理三种和运动相关的数据封装类,而且,这些类都是CMLogItem类的子类,所以相关的motion数据都可以和发生的时间信息一起保存到对应文件中,有了时间戳,两个相邻数据之间的实际更新时间就很容易得到了。这个东西是非常有用的,比如有些时候,你得到的是50Hz的采样数据,但希望知道的是每一秒加速度的平均值。
从Core Motion中获取数据主要是两种方式,一种是Push,就是你提供一个线程管理器NSOperationQueue,再提供一个Block(有点像C中的回调函数),这样,Core Motion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这中情况下,block中的操作会在你自己的主线程内执行。另一种方式叫做Pull,在这个方式里,你必须主动去像Core Motion Manager要数据,这个数据就是最近一次的采样数据。你不去要,Core Motion Manager就不会给你。当然,在这种情况下,Core Motion所有的操作都在自己的后台线程中进行,不会有任何干扰你当前线程的行为。
那接下来的问题就是,我在什么时候选择什么方式呢?苹果官方推荐了一个使用指南,比较了两种方式的优劣,并做出了使用场景的推荐。如下图所示。应该说,两种方式各自的优缺点还是很鲜明的,使用场景也大不一样,很好区分。
iOS4 <wbr>加速度计&陀螺仪(转)

下面说说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 startAccelerometerUpdatesToQueue:[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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值