1

我有一个有趣的问题。我正在尝试追踪用户手机的角度,无论他们是横向还是纵向或两者之间的任何位置..

我目前正在使用 SENSOR_ORIENTATION 并获得 YAW、ROLL 和 Pitch。我还尝试使用偏航来获取 zaxis 上用户视口的角度,并纠正用户滚动(横向、纵向或介于两者之间)我做了一些简单的数学运算..:

double roll = phoneOri.getRoll();
double yaw = phoneOri.getYaw()+roll;

     if (yaw>=360){
                yaw = (yaw - 360);
            }
            if (yaw<0){
                yaw = (yaw+360);    
            }

无论滚动位置如何,这段代码都会纠正偏航并给我正确的角度。
但这种数学似乎不适用于俯仰。如果我将手机垂直于地板,无论滚动或偏航,我希望始终获得 0 的俯仰角,如果我将手机的背面直接面向天空并平行于地面,我希望获得 90,回到地面-90;

这是我如何获得俯仰滚动和偏航:

    double yaw;
    double pitch;
    double roll;

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

                //Toast toast = Toast.makeText(ctx.getApplicationContext(), "accel", Toast.LENGTH_SHORT);
                //toast.show();
                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;
                SensorManager.getOrientation (newMat, orientationValues); 
            }
        }

目前我得到以下结果:

俯仰 = -90滚动 = 0

在此处输入图像描述

俯仰 = 0滚动 = 90 ;

在此处输入图像描述

俯仰 = 90滚动 = -20

在此处输入图像描述

俯仰 = 0滚动 = -90

我试图在这些位置中的任何一个位置获得 0 的音高,然后当用户在 HORIZON 轴上倾斜手机时分别获得 -90 和 90 之间的音高?

有任何想法吗?哦,我应该补充一点,我的应用程序被锁定为横向模式..

4

2 回答 2

1

这些常数可能有累积误差。尝试改用数学函数...

于 2012-07-18T02:24:15.087 回答
-1

有趣的问题,

您是否尝试过获取此处提到的绝对 x、y 和 z 值(与手机的方向无关),使用它,您应该获得您正在寻找的绝对 y 值

public abstract void onSensorChanged (int sensor, float[] values)

> 重要提示:当设备的屏幕方向改变时,轴会被交换。要访问未交换的值,请在 values[] 中使用索引 3、4 和 5。

于 2012-07-13T19:15:04.993 回答