提取偏航,俯仰和横滚从rotationMatrix(extract yaw, pitch, and

2019-07-30 11:35发布

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

编辑试图解释如下搅拌机的回答,我很感谢,但还没有应用,我想从这样的rotaion矩阵得到的角度:

       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]));

Answer 1:

偏航,俯仰和横滚对应欧拉角。 你可以转换一个转换矩阵欧拉角很容易:



Answer 2:

我相信Blender的答案是不正确的,因为他给了一个转变,从旋转矩阵欧拉角(ZXZ外在)和辊距偏航是一种不同的欧拉角(ZYX外在)。

实际的转换公式宁愿:

yaw=atan2(R(2,1),R(1,1));
pitch=atan2(-R(3,1),sqrt(R(3,2)^2+R(3,3)^2)));
roll=atan2(R(3,2),R(3,3));

资源

反馈:这个实施透露给缺乏代表性(万向节锁定)的奇点附近的数值稳定性。 因此,对C ++我推荐使用本征库使用以下行的代码:

R.eulerAngles(2,1,0).reverse();

(详见这里 )



Answer 3:

传感器管理器提供了一个SensorManager.getOrientation得到所有三个角。



文章来源: extract yaw, pitch, and roll from a rotationMatrix