确定设备的角度与地平线为轴 - 机器人

时间:2012-07-13 18:35:00

标签: android android-orientation

我有一个有趣的问题。我试图找出一个用户手机的角度,无论他们是在横向或纵向还是在任何地方举行它们。

我目前正在使用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); 
            }
        }

目前我得到以下结果:

pitch = -90 roll = 0 ;

enter image description here

pitch = 0 roll = 90 ;

enter image description here

pitch = 90 roll = -20 ;

enter image description here

pitch = 0 roll = -90 ;

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

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

2 个答案:

答案 0 :(得分:1)

这些常数可能有累积错误。请尝试使用数学函数...

答案 1 :(得分:-1)

有趣的问题,

你试过获得绝对的x,y和z值(不论手机的方向如何)here,使用它,你应该得到你正在寻找的绝对y值

  

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

     

<强>&GT;重要说明:在设备屏幕上交换轴   方向变化。要访问未填充的值,请使用索引3,4   和值[]中的5。