获取电话角度(音高)

时间:2017-09-21 22:38:09

标签: android orientation sensor euler-angles

我真的希望有人能帮助我: 我正在开发一个显示手机角度的Android应用程序

我正在使用此代码:

protected void onCreate(Bundle savedInstanceState) 
{
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}

protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mAccelerometer,100000);
    mSensorManager.registerListener(this, mMagnetometer, 100000);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    }

public void onSensorChanged(SensorEvent event) {
     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = lowPass(event.values.clone(), mGravity);
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = lowPass(event.values.clone(), mGeomagnetic);
    if (mGravity != null && mGeomagnetic != null) {


        boolean success = SensorManager.getRotationMatrix(Ra, Ia, mGravity, mGeomagnetic);
       if (success) {
           SensorManager.getOrientation(Ra, orientation);

            float tempxGy =  (orientation[0]);// az
            float tempyGy =  (orientation[1]);// pitch
            float tempzGy  =  (orientation[2]); //roll
}

我进一步处理我在这里得到的值,但这不是问题。

当手机在桌面上平放时,数值看起来像是:

roll -0,018

投球0,024

偏航2,51

对我来说看起来很好(如果我将值转换为euler角度也是如此)

现在想象一下,我从桌子上取下手机 - 手机的底部(micro usb端口所在的位置)留在桌子上,我用相机抬起一边

音高的值变得越来越负 - 直到音高达到-1.53​​(欧拉-90),一旦达到该值,值再次增加,如果电话在显示器的桌子上面对桌子,球场再次回到0。 问题是,我必须在两个值之间进行区分(例如-1和-1

我该怎么做?卷不是问题,因为卷最大180度而不是90度问题。

我真的希望你能帮助我!

1 个答案:

答案 0 :(得分:0)

所以

if(mGravity[2]<0) orientation[1] = (float) (Math.PI + orientation[1]);

足以获得我需要它们的值 - 但现在我有一个新问题 - 我想重新映射坐标系,所以当手机在桌面上时,我得到0度(euler)如果手机正站在micro usb端口上,则为+90

我试过

SensorManager.remapCoordinateSystem(Ra, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, Ri);

但是现在交换了滚动和音高 - 只要显示器朝上,我只需要获得正的音高值,如果显示器朝下则需要负值?

重新映射是错误的想法,我可以通过做其他事情来更简单吗?

相关问题