代码之家  ›  专栏  ›  技术社区  ›  user9821

获取手机角度(俯仰)

  •  0
  • user9821  · 技术社区  · 7 年前

    我正在开发一款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
    }
    

    当手机平放在桌子上时,数值如下所示:

    螺距0024

    这对我来说很好(如果我将值转换为euler角度也可以)

    现在想象一下,我从桌子上拿下手机-手机的底部(micro usb端口所在的地方)放在桌子上,我用相机抬起侧面

    问题是,我必须区分这两个值(例如-1和-1)

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

    我真的希望你能帮助我!

    1 回复  |  直到 7 年前
        1
  •  1
  •   user9821    7 年前

    所以

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

    但是现在横摇和俯仰是交换的——只要显示器朝上,我要做什么才能得到正的俯仰值,如果显示器朝下,我要做什么才能得到负的俯仰值?