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?
fonte
Respostas:
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
fonte
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 usando
divide and conquer
para 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.
fonte
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.
fonte
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 +/-.
fonte
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.fonte
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.
fonte