Precisão do acelerômetro Android (navegação inercial)


109

Eu estava planejando implementar um sistema de navegação inercial para um telefone Android, o que eu percebi ser difícil devido à precisão do acelerômetro e à flutuação constante das leituras.

Para começar, coloquei o telefone em uma superfície plana e fiz uma amostragem de 1000 leituras do acelerômetro nas direções X e Y (paralelas à mesa, de forma que nenhuma gravidade agisse nessas direções). Em seguida, calculei a média dessas leituras e usei esse valor para calibrar o telefone (subtraindo esse valor de cada leitura subsequente).

Em seguida, testei o sistema colocando-o novamente sobre a mesa e amostrando 5.000 leituras do acelerômetro nas direções X e Y. Eu esperaria, dada a calibração, que essas acelerações somariam 0 (aproximadamente) em cada direção. No entanto, este não é o caso, e a aceleração total acima de 5.000 iterações está longe de 0 (uma média de cerca de 10 em cada eixo).

Percebo que, sem ver meu código, isso pode ser difícil de responder, mas em um sentido mais geral ...

Este é apenas um exemplo de como as leituras do acelerômetro são imprecisas em um telefone celular (HTC Desire S) ou é mais provável que eu tenha cometido alguns erros na minha codificação?


1
webvr-polyfill é uma grande fonte de inspiração: github.com/borismus/webvr-polyfill/tree/master/src veja como eles polyfill um sensor de VR usando dados de acelerômetro: github.com/borismus/webvr-polyfill/blob/master / src /…
SC

Pergunta que também
leva em

Respostas:


128

Você obtém a posição integrando a aceleração linear duas vezes, mas o erro é horrível. É inútil na prática.

Aqui está uma explicação do porquê (Google Tech Talk) às 23:20 . Eu recomendo altamente este vídeo.

Não é o ruído do acelerômetro que causa o problema, mas o ruído branco do giroscópio , consulte a subseção 6.2.3 Propagação de erros. (A propósito, você também precisará dos giroscópios.)

Quanto ao posicionamento interno, descobri que são úteis:

Localização e rastreamento internos baseados em RSSI usando Smoothers Kalman Sigma-Point

Rastreamento de pedestres com sensores inerciais montados em sapata

Melhorando o desempenho de pedômetros usando um único acelerômetro

Não tenho ideia de como esses métodos funcionariam em aplicativos da vida real ou como transformá-los em um bom aplicativo Android.

Uma pergunta semelhante é esta .

ATUALIZAR:

Aparentemente, há uma versão mais recente do que a anterior Oliver J. Woodman, "Uma introdução à navegação inercial", sua tese de doutorado:

Localização de pedestres para ambientes internos


2
Sei que isso foi há muito tempo, mas tenho uma pergunta complementar. A câmera no Android JB tem um recurso de 'panorama', que permite tirar uma foto panorâmica movendo o telefone, girando-o ou movendo-o linearmente ao longo de um eixo. Para fazer isso, ele deve rastrear a posição do telefone com relativa precisão - pelo menos melhor do que o erro de 20 cm / s mencionado no vídeo. Como isso faz? Ele tem alguma forma de melhorar a qualidade do rastreamento inercial? Ou usa processamento de imagem inteligente para fazer isso usando apenas a câmera?
Tom

1
@Tom acredito que o último, o telefone concatena as imagens puramente por algoritmos de processamento de imagem. O que o faz pensar que o telefone precisa rastrear sua posição para produzir uma imagem panorâmica? Era possível fazer isso com câmeras comuns na década de 90 e, claramente, não tínhamos acelerômetros nas câmeras naquela época :) Claro, as imagens foram concatenadas em PCs comuns. Mas você não precisa da posição para isso, os algoritmos de processamento de imagem são suficientes. Espero que isto ajude.
Ali

É bem diferente do antigo trabalho de tirar algumas fotos manualmente e depois costurá-las. Ele rastreia sua posição em tempo real de alguma forma. É um pouco difícil de explicar sem demonstrar. Você não precisa tirar fotos manualmente - o telefone decide quando você se mudou para longe o suficiente para tirar outra. Enquanto você tira as fotos, ele mostra uma pequena barra na parte inferior com uma visualização do panorama. Se você apontar a câmera muito para baixo (por exemplo), ela começará a emitir um bipe e exibirá uma seta para cima para informar que você precisa movê-la de volta para cima.
Tom

2
Na verdade, ele parece usar processamento de imagem - iniciar um panorama e, em seguida, acenar com a mão na frente da câmera confundirá bastante seu sistema de rastreamento de posição!
Tom

@Tom OK. Acho que ele usa principalmente processamento de imagem (como seu último comentário também sugere), mas é provável que seja combinado com o rastreamento da orientação (mas não da posição).
Ali

19

Estou apenas pensando em voz alta e ainda não joguei com uma API de acelerômetro do Android, então tenha paciência comigo.

Em primeiro lugar, tradicionalmente, para obter navegação a partir de acelerômetros, você precisaria de um acelerômetro de 6 eixos. Você precisa de acelerações em X, Y e Z, mas também de rotações Xr, Yr e Zr. Sem os dados de rotação, você não tem dados suficientes para estabelecer um vetor, a menos que presuma que o dispositivo nunca muda sua atitude, o que seria bastante limitante. Ninguém lê o TOS de qualquer maneira.

Ah, e você sabe que o INS muda com a rotação da Terra, certo? Então, tem isso também. Uma hora depois e você está misteriosamente escalando uma inclinação de 15 ° para o espaço. Isso supondo que você tenha um INS capaz de manter a localização por tanto tempo, o que um telefone ainda não pode fazer.

Uma maneira melhor de utilizar acelerômetros - mesmo com um acelerômetro de 3 eixos - para navegação seria conectar-se ao GPS para calibrar o INS sempre que possível. Onde o GPS é insuficiente, o INS elogia muito bem. O GPS pode atirar em você de repente a 3 quarteirões de distância porque você se aproximou demais de uma árvore. O INS não é ótimo, mas pelo menos sabe que você não foi atingido por um meteoro.

O que você poderia fazer é registrar os dados do acelerômetro do telefone, e muitos deles. Como semanas no valor. Compare-os com dados GPS bons (quero dizer, realmente bons) e use datamining para estabelecer correlação de tendências entre os dados do acelerômetro e os dados GPS conhecidos. (Dica profissional: você vai querer verificar o almanaque do GPS para dias com boa geometria e muitos satélites. Alguns dias você pode ter apenas 4 satélites e isso não é suficiente) O que você pode fazer é descobrir isso quando uma pessoa está caminhando com o telefone no bolso, os dados do acelerômetro registram um padrão muito específico. Com base no datamining, você estabelece um perfil para aquele dispositivo, com aquele usuário, e que tipo de velocidade aquele padrão representa quando ele tinha dados de GPS para acompanhá-lo. Você deve ser capaz de detectar curvas, subir escadas, sentar (calibração para tempo de velocidade 0! ) e várias outras tarefas. A maneira como o telefone está sendo segurado precisa ser tratada como entradas de dados separadas inteiramente. Sinto o cheiro de uma rede neural sendo usada para fazer a mineração de dados. Em outras palavras, algo cego para o que as entradas significam. O algoritmo procuraria apenas tendências nos padrões, sem realmente prestar atenção às medições reais do INS. Tudo o que saberia éhistorically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.E isso moveria a peça para frente de acordo. É importante que seja totalmente cego, porque apenas colocar um telefone no bolso pode ser orientado em uma das 4 orientações diferentes, e 8 se você trocar de bolso. E também há muitas maneiras de segurar o telefone. Estamos falando de muitos dados aqui.

Obviamente, você ainda terá muita deriva, mas acho que terá melhor sorte dessa forma, porque o dispositivo saberá quando você parar de andar, e a deriva posicional não se perpetuará. Ele sabe que você está parado com base em dados históricos. Os sistemas INS tradicionais não possuem esse recurso. A deriva se perpetua em todas as medições futuras e se compõe exponencialmente. A exatidão iníqua, ou ter uma navegação secundária para verificar em intervalos regulares, é absolutamente vital com o INS tradicional.

Cada dispositivo e cada pessoa teria que ter seu próprio perfil. São muitos dados e muitos cálculos. Todo mundo anda em velocidades diferentes, com passos diferentes, e coloca seus telefones em bolsos diferentes, etc. Certamente, para implementar isso no mundo real, seria necessário que o processamento de números fosse feito no lado do servidor.

Se você usou o GPS para a linha de base inicial, parte do problema é que o GPS tende a ter suas próprias migrações ao longo do tempo, mas são erros que não se perpetuam. Coloque um receptor em um local e registre os dados. Se não houver correções WAAS, você pode obter facilmente correções de localização em direções aleatórias 30 metros ao seu redor. Com WAAS, talvez até 6 pés. Você pode realmente ter mais sorte com um sistema RTK submétrico em uma mochila para pelo menos obter o algoritmo da RNA.

Você ainda terá deriva angular com o INS usando meu método. Isto é um problema. Mas, se você foi tão longe para construir uma ANN para derramar dados de GPS e INS entre n usuários e realmente conseguiu fazê-lo funcionar até este ponto, obviamente não se importa com o big data até agora. Continue seguindo esse caminho e use mais dados para ajudar a resolver a tendência angular: as pessoas são criaturas de hábitos. Praticamente fazemos as mesmas coisas como andar nas calçadas, através de portas, subir escadas, e não fazemos coisas malucas como atravessar estradas, paredes ou sacadas.

Então, digamos que você esteja pegando uma página do Big Brother e começando a armazenar dados sobre para onde as pessoas estão indo. Você pode começar a mapear por onde as pessoas deveriam andar. Pode-se apostar que, se o usuário começar a subir escadas, ele estará na mesma base da escada que a pessoa à sua frente subiu. Depois de 1000 iterações e alguns ajustes de mínimos quadrados, seu banco de dados sabe muito bem onde essas escadas estão com grande precisão. Agora você pode corrigir a deriva angular e a localização quando a pessoa começa a andar. Quando ela atinge essas escadas, ou vira no corredor, ou desce uma calçada, qualquer desvio pode ser corrigido. Seu banco de dados conteria setores que são avaliados pela probabilidade de uma pessoa caminhar até lá ou de que esse usuário já tenha passado por lá. Bancos de dados espaciais são otimizados para isso usandodivide and conquerpara alocar apenas setores que sejam significativos. Seria como aqueles projetos do MIT em que o robô equipado com laser começa com uma imagem preta e pinta o labirinto na memória tomando cada volta, iluminando onde estão todas as paredes.

Áreas de alto tráfego obteriam pesos maiores, e áreas onde ninguém nunca esteve teriam peso zero. As áreas de maior tráfego têm maior resolução. Você basicamente acabaria com um mapa de todos os lugares que alguém esteve e o usaria como um modelo de previsão.

Eu não ficaria surpreso se você pudesse determinar que lugar uma pessoa ocuparia em um teatro usando esse método. Com usuários suficientes indo ao teatro e resolução suficiente, você teria dados mapeando cada linha do teatro e a largura de cada linha. Quanto mais pessoas visitam um local, maior a fidelidade com a qual você pode prever que essa pessoa está localizada.

Além disso, recomendo fortemente que você obtenha uma assinatura (gratuita) da revista GPS World se estiver interessado na pesquisa atual sobre esse tipo de coisa. Todo mês eu geek com isso.


"seria conectar-se ao GPS para calibrar o INS sempre que possível. Onde o GPS falha, o INS elogia muito bem." É para isso que serve a filtragem de Kalman, pelo que entendi. Ele combina os pontos fortes de cada método para cancelar os pontos fracos do outro
endólito

8

Não tenho certeza de quão grande é o seu deslocamento, porque você se esqueceu de incluir unidades. ("Cerca de 10 em cada eixo" não diz muito.: P) Dito isso, ainda é provável devido à imprecisão no hardware.

O acelerômetro é bom para coisas como determinar a orientação do telefone em relação à gravidade ou detectar gestos (sacudir ou bater no telefone etc.)

No entanto, tentar fazer cálculos mortos usando o acelerômetro irá sujeitá-lo a muitos erros compostos. Caso contrário, o acelerômetro precisaria ser extremamente preciso, e este não é um caso de uso comum, então duvido que os fabricantes de hardware estejam otimizando para isso.


Obrigado pela resposta. Os acelerômetros leem em torno de -0,8 ms ^ -2 nos eixos X e Y quando estacionários, então usei isso como meu deslocamento. Pelo bit "Cerca de 10", eu quis dizer que mais de 5000 iterações, somando cada uma das acelerações em um único eixo do sensor não totalizou cerca de 0 ms ^ -2 (como ocorreria se flutuasse uniformemente acima e abaixo do deslocamento valor), mas em vez disso tendia a registrar aceleração mais em uma direção, que após a dupla integração para encontrar a posição, funcionou como o telefone se movendo em torno de 3m em um minuto.
woodstock365 de

+1 para o uso do termo de navegação da aviação, "cálculo morto". Embora o cálculo definitivo se aplique mais apropriadamente à navegação com uma câmera do que a um INS.
RyanJMcGowan

7

O acelerômetro do Android é digital, ele mostra a aceleração usando o mesmo número de "baldes", digamos que haja 256 baldes e o acelerômetro seja capaz de detectar de -2g a + 2g. Isso significa que sua saída seria quantizada em termos desses "intervalos" e estaria pulando algum conjunto de valores.

Para calibrar um acelerômetro Android, você precisa amostrar muito mais do que 1000 pontos e encontrar o "modo" em torno do qual o acelerômetro está flutuando. Em seguida, encontre o número de pontos digitais por quanto a saída flutua e use-o para a sua filtragem.

Eu recomendo a filtragem de Kalman assim que você obtiver o modo e a flutuação +/-.


1
Eu estava procurando métodos de calibração. Parece que sua sugestão é o que eu preciso. Eu só preciso confirmar. Assim que encontrar o modo, diga que é 0,5. Não recebi a mensagem "Encontre o número de pontos digitais por quanto a saída flutua e use isso para a sua filtragem." Você poderia elaborar mais sobre isso.
Nazerke

1
Digamos que seu acelerômetro tenha 256 pontos de saída e flutue 0,015 m / s ^ 2 entre as leituras. Quando você coloca seu dispositivo na mesa, sua produção pode flutuar em múltiplos pares de 0,015 m / s ^ 2. Digamos que você obtenha uma leitura de 0 +/- (X * 0,015). Você precisa encontrar X (que seria um número par). Por exemplo, meu X pode ser 3. Nesse caso, eu ignoraria as alterações na leitura do acelerômetro que são menores que 0,045 m / s ^ 2
Alex Stone

então os acelerômetros dos telefones Android ainda não são tão bons ... correto?
Techsin

4

Sei que isso é muito antigo, mas o problema em questão não é abordado em NENHUMA das respostas fornecidas.

O que você está vendo é a aceleração linear do dispositivo, incluindo o efeito da gravidade. Se você colocar o telefone em uma superfície plana, o sensor relatará a aceleração devido à gravidade, que é aproximadamente 9.80665 m/s2, dando, portanto, o 10 que você está vendo. Os sensores são imprecisos, mas eles não são TÃO imprecisos! Veja aqui alguns links úteis e informações sobre o sensor que você pode procurar.


17
Não - acho que você interpretou mal a pergunta: "... leituras nas direções X e Y (paralelas à mesa, portanto nenhuma gravidade agindo nessas direções)". O 9,8 / s2 estaria no eixo Z.
bule 7 de

0

Você está presumindo que as leituras do acelerômetro nas direções X e Y, que neste caso é inteiramente ruído de hardware, formariam uma distribuição normal em torno de sua média. Aparentemente, não é esse o caso.

Uma coisa que você pode tentar é plotar esses valores em um gráfico e ver se algum padrão surge. Caso contrário, o ruído é estatisticamente aleatório e não pode ser comparado - pelo menos para o hardware do seu telefone em particular.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.