Como obter a rotação entre o eixo do acelerômetro e o vetor de movimento?

Estou trabalhando em um sistema de navegação para pedestres no Android. No momento, estou tentando obter a matriz de rotação entre o referencial do acelerômetro de 3 eixos e o movimento aplicado ao dispositivo.

Digamos que você esteja andando para a frente com o dispositivo na mão, mas o eixo Y do acelerômetro (portanto, o eixo Y do dispositivo) não está orientado na mesma direção que você está indo (basicamente, você está segurando o dispositivo de uma maneira desajeitada). Então, se eu quiser aplicar distâncias (com base na detecção de etapas), seria errado aplicá-las ao referencial do acelerômetro (que conheço a orientação): ele deve ser girado de acordo com o rumo do movimento.

É por isso que eu gostaria de saber se você poderia me esclarecer sobre um método para calcular as leituras do acelerômetro para transformá-las em ângulos de rotação (ou uma matriz). Tal método tem que evitar integrar a aceleração mesmo uma vez, já que o erro é abismal em acelerômetros baratos (caso contrário, seria bem fácil de executar, eu acho).

EDITAR: O magnetômetro e o giroscópio ajudam você a encontrar a orientação do dispositivo mesmo quando está na estação, mas não permite saber em que direção o dispositivo está se movendo. Eu tenho o primeiro e estou procurando pelo segundo. Basicamente:

Referencial Humano (direção do movimento) -> Referencial do Dispositivo (ou referencial do acelerômetro) -> Referencial da Terra

e eu estou procurando o caminho para encontrar a matriz de rotação para calcular as distâncias de RH para DR, que eu aplicaria então à matriz de rotação que encontrei para ir de DR para ER.

questionAnswers(1)

yourAnswerToTheQuestion