前言
传感器的调试过程,一般根据原厂提供demo代码,调试数据接口,将数据流打通即可,在VR中,当带上头显设备,运行应用时,出现漂移、延迟、不回归问题,往往束手无策,解决这些小问题,往往占用很多的时间,希望通过自己整理的知识,明确调试的方向,提高调试效率,达到好的调试效果。自己近几年在Android平台上导入过多种9轴传感器,做过一些sensor内部分享,而且近半年来从事VR开发工作,VR对9轴传感器要求比手机、平板严格更多,遇到的问题也更多,在开发过程中不断学习和思考,与传感器原厂RD沟通和学习,对9轴传感器有了更深的认识,这整理、分享一下所学知识,希望这篇文章对大家理解9轴传感器有所帮助,:),欢迎大家批评指正。
9轴传感器
9轴传感器包括3轴加速度计、3轴陀螺仪、3轴磁力计,在实际应用中,需要把这些数据需要经过融合算法后,才能够被应用程序使用,下面对每种传感器功能、原理以及融合算法进行介绍。
加速度计
人们常说的G-sensor,用来检测物理在X、Y、Z轴上的重力加速度,单位:m/s^2.
以手机为例,X、Y、Z轴如下图所示(右手坐标系):
当手机平放在桌面时,Z轴指向天空,这时候X、Y轴的数值接近为0,Z轴的重力加速度约为9.81m/s^2,将手机翻转后,即屏幕面朝向桌面,此时的Z轴重力加速度约为-9.81m/s^2。
X、Y轴指向天空时,与上面Z轴同理,有兴趣的可以在手机上安装一个”sensor_list.apk”来抓取这些数据。
- 原理
这里是英文介绍,中文版本如下:
当我们在想象一个加速度计的时候我们可以把它想作一个圆球在一个方盒子中。你可能会把它想作一个饼干或者甜圈,但我就把它当做一个球好了:
我们假定这个盒子不在重力场中或者其他任何会影响球的位置的场中,球处于盒子的正中央。你可以想象盒子在外太空中,远离任何天体,如果很难想象,那就当做盒子在航天飞机中,一切东西都处于无重力状态。在上面的图中你可以看到我们给每个轴分配了一对墙(我们移除了Y+以此来观察里面的情况)。设想每面墙都能感测压力。如果我们突然把盒子向左移动(加速度为1g=9.8m/s^2),那么球会撞上X-墙。然后我们检测球撞击墙面产生的压力,根据F=ma,计算出X轴加速度输出值为-1g。
请注意加速度计检测到的力方向与它本身加速度的方向是相反的。这种力量通常被称为惯性力或假想力 。在这个模型中你应该明白加速度计是通过间接测量力对一个墙面的作用来测量加速度的,在实际应用中,可能通过弹簧等装置来测量力。这个力可以是加速度引起的,但在下面的例子中,我们会发现它不一定是加速度引起的。
如果我们把模型放在地球上,球会落在Z-墙面上并对其施加一个1g的力,见下图:
在这种情况下盒子没有移动但我们任然读取到Z轴有-1g的值。球在墙壁上施加的压力是由引力造成的。在理论上,它可以是不同类型的力量,例如,你可以想象我们的球是铁质的,将一个磁铁放在盒子旁边那球就会撞上另一面墙。引用这个例子只是为了说明加速度计的本质是检测力而非加速度。只是加速度所引起的惯性力正好能被加速度计的检测装置所捕获。
虽然这个模型并非一个MEMS传感器的真实构造,但它用来解决与加速度计相关的问题相当有效。实际上有些类似传感器中有金属小球,它们称作倾角开关,但是它们的功能更弱,只能检测设备是否在一定程度内倾斜,却不能得到倾斜的程度。
到目前为止,我们已经分析了单轴的加速度计输出,这是使用单轴加速度计所能得到的。三轴加速度计的真正价值在于它们能够检测全部三个轴的惯性力。让我们回到盒子模型,并将盒子向右旋转45度。现在球会与两个面接触:Z-和X-,见下图:
0.71g这个值是不是任意的,它们实际上是1/2的平方根的近似值。我们介绍加速度计的下一个模型时这一点会更清楚。
在上一个模型中我们引入了重力并旋转了盒子。在最后的两个例子中我们分析了盒子在两种情况下的输出值,力矢量保持不变。虽然这有助于理解加速度计是怎么和外部力相互作用的,但如果我们将坐标系换为加速度的三个轴并想象矢量力在周围旋转,这会更方便计算。