Esto es muy tarde, pero podría ayudar a las personas como yo que llegamos a esta pregunta.
Use el sensor de vector de rotación de tipo. No es necesario usar un filtro de paso bajo o calcular un valor promedio de los últimos valores de x sensor.
Aquí hay algo de código:
private float[] mMatrixR = new float[9];
private float[] mMatrixValues = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ROTATION_VECTOR:
// Get rotation matrix
SensorManager.getRotationMatrixFromVector(mMatrixR, event.values);
SensorManager.getOrientation(mMatrixR, mMatrixValues);
// Use this value in degrees
mAzimuth = Math.toDegrees(mMatrixValues[0]);
}
me encontré con los valores muy rápido y sin problemas y el uso de estos en mi aplicación. Utilicé el acelerómetro y el magnetómetro como respaldo en caso de que el vector de tipo rotación no esté presente en el dispositivo, es un sensor basado en software (fusión del sensor) que utiliza el magnetómetro, el acelerómetro y el giroscopio (si está presente).
Consulte la excelente publicación de blog de Thom Nichols para ver un ejemplo de cómo implementar un filtro de paso bajo - Parte 1 (http://blog.thomnichols.org/2011/08/smoothing-sensor-data-with-a-low -pass-filter) y parte 2 (http://blog.thomnichols.org/2012/06/smoothing-sensor-data-part-2) –
@JimJeffers Esta implementación es simple y brillante. Se aplicó mucho. Gracias ! – Shlublu