Android 手机沿X轴旋转的角度
我正在开发一个Android应用程序,其中我想水平滚动一个大图像。我使用加速计(Sensor.TYPE_加速计)和磁场(Sensor.TYPE_磁场)数据来获得旋转角度。由于这些数据经常受到噪音的干扰,我无法实现平滑的运动效果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
@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()函数来完成此操作,但我们需要查看它才能了解您已经在做什么。在运动游戏或虚拟现实中如何实现此功能?谢谢!检查传感器融合演示应用程序,加速计+指南针解决方案也显示了一个不稳定的立方体。