VR技术研究—9轴融合算法—磁力计校准(一)

VR技术研究—9轴融合算法—磁力计校准(一)

对于VR而言,头部的运动追踪的准确性关系到人是否产生会产生不适感(眩晕)。

    对于VR的驱动层而言,一个很重要的工作就是融合加速度计、陀螺仪、磁力计的数据。一般而言,采用IMUupdate算法融合加速度计和陀螺仪就可以得到比较准确的数据了,在大多情况下使用也就足够了。但是IMUupdate算法的一个缺陷是它不能长时间得到准确的Yaw角,在经过一定时间后Yaw角会随着陀螺仪积分误差的增大而偏差越来越大。那么如果出现这种情况,用户在玩游戏的时候会出现这么一种情况:

刚开始的时候用户正对着屏幕玩游戏刚刚好,但是半个小时候用户不得不朝着左边或者右边才能正常的玩游戏。

    这种情况称为Yaw角漂移,也就是头显在静止的时候,Yaw持续增大的情况。为了解决这个问题需要融合磁力计的数据。磁力计是利用地球的磁场进行定位,磁力计能够提供相对准确的方向,例如HMC5883芯片的厂商就号称他们的磁力计辨识度能到1°~2°。这个误差看起来是很小,实际上如果单纯的应用到游戏中,你会发现屏幕在不停的抖。但是依靠磁力计和陀螺仪的信息,我们可以通过一定的算法融合得到不会漂移的准确数据。我们融合磁力计常用的算法是Madgwick写的AHRSupdate算法。其实IMUupdate算法是AHRSupdate算法的一个阉割版。

AHRSupdate算法如下:

ex = (ay*vz - az*vy)  + (my*wz - mz*wy);
ey = (az*vx - ax*vz)  + (mz*wx - mx*wz);
ez = (ax*vy - ay*vx) +  (mx*wy - my*wx);

IMUupdate算法如下:

ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);

    使用IMUupdate算法一直都很好角度也非常准确,除了Yaw角有些漂移。AHRS算法折腾了好一段时间,虽然融合了磁力计再也不会出现漂移情况了,但是出现了角度不匹配的情况。

角度不匹配:当我们旋转头盔一定的角度后立即停下来,但是Yaw角并不会随着转动停止而立即停止,而是继续缓慢变化一小会儿然后才停止变化。

    刚开始的是我一直不知道是什么原因,以为是转动速度过快导致陀螺仪不能检测到过高的转动速度。后来我单纯对比了IMUupdate算法进行测试,发现完全不会出现这种情况。说明是磁力计融合得到的数据和陀螺仪计算的数据不匹配,产生了这个缓慢校正的过程。当然,在短期内陀螺仪是远远比磁力计要准确的,说明磁力计的数据存在问题。
为了解决这个问题,首先先输出磁力计原始数据到文本中。然后用matlab进行读取,这里我让VR头显在平面旋转一圈,得到完整一圈的磁力计数据。

%加载数据文件到matlab的workspace中
load data.txt;

%读取x轴数据
x = data(:,1);

%读取z轴数据
z = data(:,3);
%画出图像
plot(x,z);

得到下图:

               VR技术研究—9轴融合算法—磁力计校准(一)_第1张图片


    从图中我们可以发现,x轴的数据都比正常,但是z轴的数据的正值明显偏小,只有不到3000左右。因此磁力计提供的数据并不准确要进行校准,只需要把椭圆变换到圆形即可。

你可能感兴趣的:(个人)