Sensor de movimiento vertical

Estoy trabajando en una aplicación de Android que requiere la detección de movimiento vertical. Al mover la tableta hacia arriba, los sensores de Giroscopio, Acelerómetro y Aceleración Lineal dan un valor correspondiente que indica un movimiento hacia arriba o hacia abajo.

El problema que tengo es que estos sensores también leerán un movimiento hacia arriba / hacia abajo cuando inclines la tableta hacia el usuario o hacia afuera del usuario. Por ejemplo, el valor de x en el giroscopio representa el plano vertical. Pero cuando inclina el dispositivo hacia adelante, el valor de x cambiará. Cuando hago este movimiento, el mismo sensor que lee el movimiento vertical lee un valor para esto.

Lo mismo ocurre con el resto de los sensores. He intentado usar la orientación junto con el giro para hacer la declaración condicional, si el tono no está cambiando, pero la variable x está subiendo / bajando, entonces tenemos movimiento vertical. El problema con esto es que si el usuario lo mueve hacia arriba pero se inclina ligeramente, ya no funcionará. También intenté hacerlo así, si hay un cambio en la inclinación, entonces no hay movimiento vertical. Pero se itera tan rápidamente que puede haber un cambio en la inclinación durante 1/100 de segundo, pero en el siguiente no existe.

¿Hay alguna manera de que pueda leer solo cambios verticales y no cambios en el tono de los dispositivos?

Esto es lo que quiero detectar:

editar:

"Por favor, proponga una definición matemáticamente sólida de lo que considera 'moverse hacia arriba'". Esta fue mi pregunta inicial, ¿cómo puedo escribir una función para definir cuándo la tableta se mueve hacia arriba o hacia abajo? Considero una traducción vertical que se mueve hacia arriba. Ahora, ¿cómo detecto esto? Simplemente no sé por dónde empezar, gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta