from: http://blog.csdn.net/johnny_9812/article/details/7743131
摘要:本文简单介绍了一下Android Sensor Fusion代码,感兴趣的人可以了解下。
笔者早就打算写篇日记介绍这个了,一直拖啊拖,直到拖到4.1都来了,再拖说不定Android代码全改了,
趁今天上午不忙赶快写写。
说起Sensor fusion,基本上从开始无人问津,到最后兴起,都是跟智能手机的普及有着必然的联系。
最开始的手机只带个加速度传感器,现在Win8系统、Android系统都自带Sensor fusion算法,包括
下一代的超级本也要求带各种传感器。
究竟什么叫sensor fusion呢?简单的说,就是用两套传感器组件同时测量一个数值,然后两个测量
结果A跟B进行一下加权平均得到最终的结果(Fusion这个词是融合的意思,可以理解为A、B结果的融合)。
为什么要使用fusion技术呢?就是为了得到更精确的“结果”。
先说两套传感器组建。第一套:加速度传感器(accelerometer sensor,ACCEL) + 磁力传感器(magnetic sensor,MAG)。
ACCEL测量手机线加速度,MAG测量手机磁场强度。第二套:陀螺仪,或称角速度传感器(Gyroscope, GYRO)。GYRO
测量手机在转动时的角速度。
使用第一套系统(ACCEL+MAG)可以计算出手机当前相对于地磁北极的姿态(orientation)。打开手机大家都能看到一个叫
orientation sensor的虚拟传感器,就是通过ACCEL+MAG的数据得到的。姿态这个概念可以理解飞机在飞行中的姿态,
一半描述飞机的飞行姿态,会使用三个维度。第一维,偏角(Yaw),就是指相对于地磁北极的水平偏角,决定飞机飞向哪个方向
。第二维,仰角(Pitch),就是飞机的俯仰角,一半说飞机俯冲或者拉升多少角度,都是说的仰角。第三维,倾斜角(Roll),这个酷。
看特技飞行的时候,飞机有时会斜着飞,一个翅膀指天一个翅膀指地,这就是在说用90度倾斜角飞行。知道了这三维数据,就能知道
目前一个东西(飞机、手机、或者电视机)在地球上的姿态。
飞机的姿态肯定是非常重要的,不止决定了飞机的航向,也决定了很多动力学的结果。那为什么手机的姿态是有用的呢?手机肯定不打算
飞去北京,而且也不会因为侧着拿手机就会“坠机”。原因有二。其一,有些应用需要使用手机姿态,比如,指南针。指南针是个神奇的应用,
简单的说,手机平方桌面与用户直立拿着手机,指针的方向应该是不用的,也就是说,手机计算出了自己是直立还是平方的,自己的姿态。
其二,体感游戏。这一类的应用非常多,这类的游戏实际上利用了姿态的变化,来操作游戏。上面这两个原因,如果你是app开发者,一定是
非常深有体会。
下面说说第二个系统GYRO。GYRO是角速度传感器,怎么能用来测量手机的姿态呢?答案是不行。GYRO传感器不能直接测量手机的姿态,但是,
可以通过对角速度的积分计算手机姿态的变化!也就是说,可以测量delta orientation,然后用t时刻的姿态加上GYRO计算的delta姿态得到当前的姿态。
有点儿抽象,但是我相信收藏了我RSS的几个读者都看得懂:)
现在就可以看出为什么GYRO,ACCEL与MAG组成的系统是符合开篇提到的fusion的系统了。ACCEL+MAG能直接得到当前姿态,然后减掉上一个时刻姿态
得到delta姿态1,GYRO可以将角速度积分得到delta姿态2,然后用加权平均得到delta姿态3。列车本文的第一个公式:
DO3 = Weight(DO1, DO2)
其中DO是delta orientation,weight是某种加权平均算法。
好了,概念介绍到这里,本章也应该结束了。下一章将介绍Android使用的具体算法。
同时,看官们如果对Linux kernel更感兴趣,我就先写Linux kernel相关的东西。在笔者看来,Android framework对比Linux kernel还是差得远。