Estou experimentando sensores no Android e decidi fazer um aplicativo para medir a distância pela qual o dispositivo se move, usando o sensor de aceleração linear. Eu criei o seguinte pedaço de código:
override fun onSensorChanged(e: SensorEvent?) {
if (e != null) {
when (e.sensor.type) {
Sensor.TYPE_LINEAR_ACCELERATION -> {
var time = if (dta != 0L) (e.timestamp - dta) * 10f.pow(-9) else 0f
for (i in 0..2) {
acceleration[i] = e.values[i]
position[i] += acceleration[i] * time * time / 2
}
dta = e.timestamp
}
}
}
}
onde dta
é o tempo da última atualização do sensor e acceleration
e position
são listas de estados mutáveis, exibidas na atividade.
No entanto, notei que as medições são muito imprecisas. Para reduzir o erro, decidi definir acceleration[i]
como 0f
se o valor do evento correspondente estiver abaixo de um limite. Mas ainda assim, mesmo que a leitura pareça correta, não tenho uma boa maneira de converter, pelo menos parcialmente, dados de aceleração brutos em mudanças de posição.
Não sei realmente como lidar com isso, por exemplo, por causa da característica de aceleração dos passos humanos (eles continuam aumentando uma vez, diminuindo uma vez), conforme mostrado no gráfico plotado na atividade:
Onde vermelho significa aceleração X, verde - Y, azul - Z e preto é a aceleração "total" - a raiz quadrada da soma das acelerações quadradas de eixo único.
O que acho notável é que a ideia do aplicativo é medir a distância percorrida na faixa de 1 a 5 metros, na taxa de ritmo normal de caminhada de uma pessoa (ele aperta um botão, anda, coloca o telefone no chão e volta para o local original), então o período de movimento não deve ser maior que um minuto. Dadas essas ordens de magnitude, o desvio do sensor não deve atrapalhar tanto, mas ao custo de nenhuma possibilidade de usar GPS para corrigir os resultados.
Eu gostaria de atingir uma precisão de 15-20 centímetros. Isso é possível e, se for, como obter esse efeito? E se não, há outras maneiras de medir efetivamente a distância do usuário do dispositivo? Ouvi falar do Google ARCore que deve ser teoricamente capaz de calcular a distância entre dois pontos (chamado Hit Records), mas a qualidade das leituras depende muito da qualidade da câmera e das condições de iluminação. Também li ( aqui ,
aqui ,
aqui ,
aqui e
aqui ) conselhos sobre "implementar filtros de Kalman" e "fundir sensores" - o que isso significa? Talvez possa ajudar?
Eu realmente aprecio cada resposta!