Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 手机沿X轴旋转的角度_Android_Accelerometer_Android Sensors - Fatal编程技术网

Android 手机沿X轴旋转的角度

Android 手机沿X轴旋转的角度,android,accelerometer,android-sensors,Android,Accelerometer,Android Sensors,我正在开发一个Android应用程序,其中我想水平滚动一个大图像。我使用加速计(Sensor.TYPE_加速计)和磁场(Sensor.TYPE_磁场)数据来获得旋转角度。由于这些数据经常受到噪音的干扰,我无法实现平滑的运动效果 @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_MAGNETIC_FIELD

我正在开发一个Android应用程序,其中我想水平滚动一个大图像。我使用加速计(Sensor.TYPE_加速计)和磁场(Sensor.TYPE_磁场)数据来获得旋转角度。由于这些数据经常受到噪音的干扰,我无法实现平滑的运动效果

@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
            mags = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accels = event.values.clone();
            break;
    }

    if (mags != null && accels != null) {
        gravity = new float[16];
        boolean success = SensorManager.getRotationMatrix(gravity, null, accels, mags);
        if (success) {
            float[] outGravity = new float[16];
            SensorManager.remapCoordinateSystem(gravity, SensorManager.AXIS_X, SensorManager.AXIS_Z, outGravity);
            SensorManager.getOrientation(outGravity, values);

            rollingAverage[0] = roll(rollingAverage[0], values[0]);
            rollingAverage[1] = roll(rollingAverage[1], values[1]);
            rollingAverage[2] = roll(rollingAverage[2], values[2]);

            azimuth = Math.toDegrees(values[0]);
            pitch = Math.toDegrees(values[1]);
            roll = Math.toDegrees(values[2]);
            mags = null;
            accels = null;

            double diffRoll = lastRoll - roll;
            double diffPitch = lastPitch - pitch;
            long curTime = System.currentTimeMillis();
            if (Math.abs(diffRoll) >= 2) {
                if (diffRoll > 0)
                    imageView.panLeft();
                else
                    imageView.panRight();
                lastRoll = roll;
            }
        }
    }
}

使用其他方法实现这一点有什么想法吗?

您必须实施基于卡尔曼滤波器或其他滤波器的传感器融合技术。如果需要,您可以使用开源库。参考这个。如果您想自己做,请阅读

加速计是一个有噪音的传感器。除非你做一些DSP算法来过滤/平滑它,否则你会跳得到处都是。看起来您正试图使用roll()函数来完成此操作,但我们需要查看它才能了解您已经在做什么。在运动游戏或虚拟现实中如何实现此功能?谢谢!检查传感器融合演示应用程序,加速计+指南针解决方案也显示了一个不稳定的立方体。