我有一个传感器管理器,该传感器基于设备磁力计和加速度计返回rotationMatrix。我一直在尝试计算用户设备的偏航俯仰和横滚,但发现俯仰和横滚会相互干扰并给出不准确的结果。有没有办法从rotationMatrix提取设备的偏航角和滚动?

编辑
尝试在下面解释搅拌器的答案,我对此表示感谢,但还没有完全解决,我正在尝试从像这样的旋转矩阵中获取 Angular :

       float R[] = phoneOri.getMatrix();
       double rmYaw = Math.atan2(R[4], R[0]);
       double rmPitch = Math.acos(-R[8]);
       double rmRoll = Math.atan2(R[9], R[10]);

我不知道我是否引用了矩阵的错误部分,但我没有得到我想的结果。

我希望得到以度为单位的值,但是却得到了奇怪的整数。

我的矩阵来自我的sensorManager,如下所示:
public void onSensorChanged(SensorEvent evt) {
            int type=evt.sensor.getType();
            if(type == Sensor.TYPE_ORIENTATION){
                yaw = evt.values[0];
                pitch = evt.values[1];
                roll = evt.values[2];
            }
            if (type == Sensor.TYPE_MAGNETIC_FIELD) {
                orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
                orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
                orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
            } else if (type == Sensor.TYPE_ACCELEROMETER) {
                acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
                acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
                acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
            }
            if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
                float newMat[]=new float[16];

                SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
                if(displayOri==0||displayOri==2){
                    SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
                }else{
                    SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
                }

                matrix=newMat;

设备正面朝上摆放在桌子上时的样本矩阵
0.9916188,  -0.12448014, -0.03459576,  0.0
0.12525482,  0.9918981,   0.021199778, 0.0
0.031676512,-0.025355382, 0.9991765,   0.0
0.0,         0.0,         0.0,         1

答案
double rmPitch = Math.toDegrees( Math.acos(R[10]));

最佳答案

偏航角,俯仰角和侧倾角对应于欧拉角。您可以很容易convert a transformation matrix to Euler angles:

08-03 19:20