Transferindo dados de sensor para sistema de coordenadas da terra sem o Magnetômetro

As vezes tudo o que a gente precisa é de Álgebra Linear

Lorran Santos Rodrigues
Aug 10 · 3 min read

Quem trabalha com dados de acelerômetro, giroscópio e magnetômetro em smartphones geralmente se depara com um problema de transferência de referencial. Isso ocorre porque os dados dos sensores usam os três eixos padrões do celular como referência.

Acontece que nem sempre esse referencial é o mais útil. Me deparei com um problema na Interagente, recentemente, em que precisava utilizar os sensores embarcados em um celular comum para identificar as manobras de um carro. Nesse caso, faz muito mais sentido um sistema de coordenada relativo a terra, tornando os dados de diversos dispositivos comparáveis, independente do posicionamento do dispositivo no carro.

Para realizar essa troca de coordenada é necessário obrigatoriamente que o telefone possua um acelerômetro e um magnetômetro. Funciona assim: com o acelerômetro, é possível saber em que direção fica pra cima, uma vez que a gravidade sempre aponta pra baixo. Por outro lado, o magnetômetro na maior parte das vezes, se não houver um campo magnético grande próximo ao celular, vai apontar para o norte magnético. Com esses dois eixos, basta calcular um terceiro vetor ortogonal aos outros dois e temos o sistema de coordenadas da terra.

fonte: https://developer.android.com

Se você está lidando com dispositivos iOS, geralmente você têm os dois sensores e essa troca é simples. No entanto, se estiver lhe dando com dispositivos Android existe um problema grande, no que diz respeito a variabilidade de dispositivo para dispositivo.

Nem todos possuem o magnetômetro. Como então que eu faço para realizar a transferência de coordenada global nesse caso?

A resposta vem com uma outra pergunta: Você precisa mesmo saber pra onde fica o norte? Se a resposta dessa segunda pergunta for não, existe um jeito.

As vezes você só precisa saber se o celular foi acelerado pra cima, como por exemplo subindo uma ladeira. Nesse caso, não faz diferença o norte geográfico. Só faz diferença a Magnitude da aceleração empregada na direção que você se importa.

Tá, mais como se faz isso?

A ideia é simples. Tendo a gravidade, já sabemos qual direção é pra baixo. A partir daí é possível calcular dois vetores horizontais ortogonais a gravidade. Dessa forma teremos um referencial “global” que não aponta pro norte — pelo menos não intencionalmente.

Então vamos ao código em python:

Primeiro pegamos o nosso vetor da gravidade e transformamos ele em um vetor unitário.

import numpy as npVg = [Gx,Gy,Gz] #Vetor Gravidade
G = np.sqrt(Vg[0]**2+Vg[1]**2+Vg[2]**2) #Magnitude de G
Vg_norm = Vg/G #vetor normalizado

Em seguida a partir de um vetor aleatório não paralelo a gravidade, fazemos esse segundo vetor ortogonal a gravidade.

H1 = numpy.random.randn(3) #Vetor Aleatório
H1 = H1 - ((H1.dot(Vg_norm)) * Vg_norm) #Ortogonalizando

Finalmente achamos o segundo vetor horizontal através do produto vetorial de H1 e Vg_norm

H2 = numpy.cross(Vg_norm, H1)

Com isso temos um vetor Vertical, que representa a direção pra dentro e fora da terra (Vg_norm) e dois vetores horizontais ortogonais ao primeiro. Caso queira checar, o produto vetorial entre H1 e H2 tem que ser igual Vg_norm. Por outro lado o produto escalar de vetores ortogonais deve ser igual a 0. Então:

numpy.cross(H1,H2) == Vg_norm
numpy.dot(H1,H2) == 0
numpy.dot(H1,Vg) == 0
numpy.dot(Vg,H2) == 0

Por fim basta usar essa matriz de rotação para fazer a troca de coordenadas no vetor da aceleração ou no giroscópio por exemplo.

M_rotation = numpy.array([h1,h2,g])acc = [Ax,Ay,Az] #Accelerometer Data
acc_earth = acc.dot(M_rotation)

Tem alguma dúvida a respeito do assunto? Quer papear um pouco a respeito de ciência de dados, séries temporais e dados de sensoriamento?

Fica à vontade pra me mandar uma mensagem no LinkedIn 🎲

Interagente

Somos uma consultoria em inteligência artificial e análise de dados. Ajudamos empresas a descobrir oportunidades nessa nova fronteira tecnológica e priorizar soluções e estratégias de maior impacto.

Lorran Santos Rodrigues

Written by

Cientista de Dados na Interagente, Reporter pela Trecobox, Professor de pré-vestibulares sociais e curioso de plantão.

Interagente

Somos uma consultoria em inteligência artificial e análise de dados. Ajudamos empresas a descobrir oportunidades nessa nova fronteira tecnológica e priorizar soluções e estratégias de maior impacto.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade