¿Cómo obtener la rotación entre el eje del acelerómetro y el vector de movimiento?

Estoy trabajando en un sistema de navegación peatonal en Android. Actualmente estoy tratando de obtener la matriz de rotación entre el referencial del acelerómetro de 3 ejes y el movimiento que se aplica al dispositivo.

Digamos que está caminando en línea recta con el dispositivo en la mano, pero el eje Y del acelerómetro (por lo tanto, el eje Y del dispositivo) no está orientado en la misma dirección en la que se dirige usted mismo (básicamente, está sosteniendo el dispositivo de una manera incómoda). Luego, si quiero aplicar distancias (según la detección de pasos), sería incorrecto aplicarlas al referencial del acelerómetro (que conozco la orientación): debe girarse de acuerdo con el rumbo del movimiento.

Por esta razón, me gustaría saber si podría informarme sobre un método para calcular las lecturas del acelerómetro para convertirlas en ángulos de rotación (o matriz). Este método debe evitar la integración de la aceleración incluso una vez, ya que el error es abismal en acelerómetros baratos (de lo contrario, creo que sería bastante fácil de realizar).

EDITAR: El magnetómetro y el giroscopio lo ayudan a encontrar la orientación del dispositivo incluso cuando está estacionario, pero no le permite saber en qué dirección se está moviendo el dispositivo. Tengo el primero, y estoy buscando el segundo. Básicamente :

Referencial humano (dirección de movimiento) -> Referencial del dispositivo (o referencial del acelerómetro) -> Referencial de tierra

y estoy buscando la forma de encontrar la matriz de rotación para calcular las distancias de HR a DR, que luego aplicaría a la matriz de rotación que encontré para ir de DR a ER.

Respuestas a la pregunta(1)

Su respuesta a la pregunta