最近在做VR方面的研究,看到了Google Cardboard对传感器处理的代码,对陀螺仪、旋转矩阵、罗德里格公式做了一些研究。
陀螺仪中获取的数据是以(x,y,z)的形式存储,它们代表了陀螺仪在(x,y,z)方向上的角速度。在头戴设备上的状态显示如下图所示。
此时(x,y,z)方向可能与手机水平摆放时有区别,具体的变化可以自己测试下。
我们看Google Cardboard对陀螺仪数据的处理。
具体的代码在 VR开发-罗德里格公式的研究
此处有几行代码:
this.mu.set(gyro);
this.mu.scale(- dT);
So3Util.sO3FromMu(this.mu, this.so3LastMotion);
这是对陀螺仪数据的处理,gyro是陀螺仪向量,通过乘以时间得到当前在x,y,z方向上的旋转的角度,之后进行罗德里格旋转矩阵计算,得到旋转矩阵。函数传入的参数是mu和返回结果result。
罗德里格公式是通过旋转轴和旋转角度计算旋转矩阵,此时传入的参数向量mu的摸长即为旋转的角度,而向量mu即是旋转轴。可能会有些不理解,为什么向量mu既代表了旋转轴,又代表了旋转角度。假设(x,y,z)向量y和z都为零,那么代表y和z方向上的旋转角度都为零,只有x轴方向上旋转了(x,0,0),那么最后得到的旋转矩阵一定是以x轴为旋转轴,旋转x=θ角度。于此同时,假设只有y和z不为零的情况,得到相同的结果,分别以y和z为轴进行旋转,那么得到结论在三维空间中(x,y,z)向量就是旋转轴。这时,对于向量的模长代表旋转角度也可以理解了,代表的是x,y,z方向上的角度和。