首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从rotationMatrix中提取偏航、俯仰和滚动

从rotationMatrix中提取偏航、俯仰和滚动
EN

Stack Overflow用户
提问于 2012-07-17 07:29:17
回答 3查看 33.6K关注 0票数 24

我有一个传感器管理器,它根据设备的磁力计和加速计返回一个rotationMatrix。我一直在尝试计算用户设备的偏航、俯仰和滚转,但我发现俯仰和滚转相互干扰,给出了不准确的结果。有没有一种方法可以从rotationMatrix中提取设备的偏航俯仰和滚动

EDIT尝试解释下面blender的答案,我对此表示感谢,但还没有完全做到这一点,我正在尝试从一个旋转矩阵中获得角度,如下所示:

代码语言:javascript
复制
       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,如下所示:

代码语言:javascript
复制
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;

当设备正面朝上放置在桌子上时的样本矩阵

代码语言:javascript
复制
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

应答

代码语言:javascript
复制
double rmPitch = Math.toDegrees( Math.acos(R[10]));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-17 07:33:49

偏航、俯仰和横摇与欧拉角相对应。您可以很容易地使用convert a transformation matrix to Euler angles

票数 19
EN

Stack Overflow用户

发布于 2016-06-01 09:54:17

我相信Blender的答案是不正确的,因为他给出了从旋转矩阵到Euler角(z-x-z外部)的转换,而滚动俯仰偏航是一种不同的Euler角(z-y-x外部)。

实际的转换公式应该是:

代码语言:javascript
复制
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));

Source

反馈:此实现显示在表示(万向节锁定)的奇点附近缺乏数值稳定性。因此,在C++上,我建议使用如下代码行的特征库:

代码语言:javascript
复制
R.eulerAngles(2,1,0).reverse();

(更多细节here)

票数 29
EN

Stack Overflow用户

发布于 2016-11-12 14:24:13

Sensor Manager提供了一个SensorManager.getOrientation来获取所有三个角度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11514063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档