【问题标题】:To get accurate Orientaion on android phone在安卓手机上获得准确的方向
【发布时间】:2016-07-30 14:14:37
【问题描述】:

我正在做一个关于视频稳定的项目。现在,我正在尝试首先获得准确的方向。我已经阅读了有关传感器事件的信息。我知道我不能只使用 SensorManager.getOrientation() 来获得准确的方向。另外,我知道使用加速度计和陀螺仪的集成可以获得正确的俯仰和滚动。

现在,我也想知道如何获得正确的偏航?

感谢您的宝贵时间!

【问题讨论】:

    标签: android orientation sensors gyroscope


    【解决方案1】:

    使用此代码,您可以使用加速度计和磁场传感器获得准确的方向。 (What is the alternative to android orientation sensor?)

    public class OrientationTestActivity extends Activity implements SensorEventListener
    {
        private SensorManager mSensorManager;
        private Sensor mAccelerometer;
        private Sensor mMagnetometer;
    
        private float[] mLastAccelerometer = new float[3];
        private float[] mLastMagnetometer = new float[3];
        private boolean mLastAccelerometerSet = false;
        private boolean mLastMagnetometerSet = false;
    
        private float[] mR = new float[9];
        private float[] mOrientation = new float[3];
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
            mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        }
    
        protected void onResume() {
            super.onResume();
            mLastAccelerometerSet = false;
            mLastMagnetometerSet = false;
            mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        protected void onPause() {
            super.onPause();
            mSensorManager.unregisterListener(this);
        }
    
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor == mAccelerometer) {
                System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
                mLastAccelerometerSet = true;
            } else if (event.sensor == mMagnetometer) {
                System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
                mLastMagnetometerSet = true;
            }
            if (mLastAccelerometerSet && mLastMagnetometerSet) {
                SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
                SensorManager.getOrientation(mR, mOrientation);
                Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f",
                                                               mOrientation[0], mOrientation[1], mOrientation[2]));
            }
        }
    }
    

    有了这个,你会得到包含方位角、俯仰角和滚动角的 mOrientation。

    正如这里所解释的https://math.stackexchange.com/questions/296799/azimuth-vs-yaw yaw 是方位角的变化。

    【讨论】:

    • 感谢您的帮助!我发现一些帖子谈论使用加速度计和磁力计的问题。 stackoverflow.com/questions/24242972/how-can-i-get-device-tilt他提到“只要你使用加速度计和磁力计而不是陀螺仪,当设备进行快速加速/减速时,你的方法就会失败。”这是否意味着突然移动会使传感器不准确?我对这些传感器很困惑 T.T 再次感谢您的光临!
    • 另外,我想知道为什么人们在谈论加速度计和陀螺仪时会使用互补滤波器。加速度计和陀螺仪与加速度计和磁力计的优缺点是什么。
    • 这很有趣,在我的情况下它工作得很好。但我不需要快速加速/减速。你需要什么快速的东西?我想稍后再看看。
    • 也许不需要快速的英雄联盟。该代码有效。你拯救了我的一天。非常感谢。顺便说一句,方位角,俯仰角和滚动角的单位是什么?我发现范围在-3到+3左右。我可以把它转成度数吗?此外,当我垂直使用手机时也很棒。但是如果我用手机水平拍照。滚动将变为俯仰,方位角变为滚动,俯仰变为偏航。事实上,我误解了“方向”这个词。我真正想要的是我的手机如何随角度旋转 LOL。或者是一样的>.
    • 您应该查看有关 sensorManager 的 android 文档:developer.android.com/reference/android/hardware/…。如您所见:“以上三个角度均为弧度,逆时针方向为正。输出范围为:方位角从 -π 到 π,俯仰从 -π/2 到 π/2,滚动从 -π 到π" 所以你可以很容易地计算度数。我不太明白您所说的手机如何随角度旋转是什么意思,您能详细说明一下吗?
    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多