Pergunta

Eu tenho experimentado com a bússola e giroscópio do iPhone 4 e gostaria de alguma ajuda com um problema que estou tendo.Eu quero compensar a lentidão da bússola usando os dados do giroscópio.

Usando CMMotionManager e o seu CMDeviceMotion objeto (motionManager.deviceMotion), Recebo a CMAttitude objecto.Me corrija se eu estiver errado por favor), mas aqui está o que eu já deduzida a partir da CMAttitude do objeto yaw propriedade (eu não preciso pitch nem roll para os meus propósitos):

  • yaw intervalos de 0 para PI quando o telefone está apontando para baixo (tal como indicado pelo deviceMotion.gravity.z) e balançando no sentido anti-horário e 0 para -PI quando girou no sentido horário
  • quando o dispositivo está a apontar para cima, yaw intervalos de -PI para 0 e PI para 0, respectivamente
  • e a partir de a bússola de dados (estou usando locationManager.heading.magneticHeading), Vejo que a bússola fornece valores de 0 para 360, com o valor crescente ao balançar no sentido horário

Tudo certo, então, usando todas estas informações em conjunto, eu sou capaz de obter um valor eu chamo horizontal que, independentemente de o dispositivo está a apontar para cima ou para baixo, vai dar valores a partir de 0 para 360 e aumentar quando o dispositivo é girou no sentido horário (apesar de eu ainda estou tendo problemas quando deviceManager.gravity.z é em torno de 0 -- o yaw valor freaks neste gravity.z valor).

Parece-me que eu poderia "sincronizar" o horizontal e magneticHeading valores, usando um calculados horizontal valor que mapeia para magneticHeading, e "sincronizar" o horizontal valor para magneticHeading quando eu sinto o compasso tem "pego."

Então minhas perguntas:

  • Estou no caminho certo com isso?
  • Estou usando o giroscópio de dados a partir de CMDeviceMotion corretamente e os pressupostos que eu listei acima, correto?
  • Por que pode yaw surtar quando gravity.z é em torno de 0?

Muito obrigado.Estou ansioso para ouvir as suas respostas!

Foi útil?

Solução

Apenas tentando responder...me corrija se eu estiver errado..

1.Sim, você está no caminho certo

2.a gravidade em CM já está "isolado" do usuário de gravidade (gravity valor causados pelo usuário aceleração) é por isso que há dois gravidade, a "gravidade" e "userAcceleration" a sua apple CM de documentação // Nota :não totalmente isolado //

3.se você tem uma gravidade 0 significa que o coresponding eixo é perpendicular com a gravidade.gravidade.z é a tela do iPhone é por isso que ele -9.82 m/s2 se você colocar sobre a mesa com a tela na vertical, na verdade, é difícil conseguir que 0 ou o valor máximo da gravidade devido ao sensor de ruído (que é normal, todos sensor tem um ruído especificamente baixo do sensor).

o que eu faço no meu apps é eu vou mudar o meu eixo de referência para outras do eixo (em seu caso pode ser x ou y) de certos limites, como a estratégia está a depender da finalidade ou de que lado é a sua referência.

a outra coisa é, giroscópio é rápido, mas não é estável, você precisa re-calibrar o valor para várias intervalo.No meu caso, a cada 5 segundos.Eu tenho experiência com giroscópio para o cálculo do ângulo entre os dois, de avião, eu tento, com exatamente a 90 graus régua e ele vai dar um erro de cerca de 0,5 grau a cada segundo, tentar e continuar a aumentar, mas isso é a minha, talvez outros tenham uma melhor método para evitar o erro.

abaixo está os meus passos "

  1. Init
  2. Leia a gravidade da XYZ -> Xg Yg Zg
  3. Verifique se Xg < 0.25, Se VERDADEIROS, tente Yg, em seguida, Zg // Nota 1 = 1g = 9.82 m/s^2
  4. Leia a bússola e giroscópio
  5. Configurar e calibrar o giroscópio, utilizando a bússola e calulate com base na qual o eixo que eu uso no ponto 3.
  6. Se 5 segundo é passar recalibre, leitura de bússola
  7. Se a diferença com o giroscópio de leitura é > 5 grau de inibição recalibartion o giroscópio.
  8. Se a diferença com o giroscópio de leitura é < 5 grau de calibrar o giroscópio usando o valor da bússola

Nota:para o número 7 :é para verificar se o telefone afetados com campo magnético ou perto de grandes aço ou elétricos de alta tensão de linha ou no barulhento e equipamentos pesados na fábrica.

Isso é tudo...Espero que este poderia ajudá-lo...E desculpe pelo meu inglês..

Outras dicas

Aqui está um exemplo de um aplicativo para iPhone, onde a bússola é compensada com o giroscópio. Código e projeto podem ser vistos aqui:http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

A direção do vetor do eixo da guinada é indefinida quando está em gravidade zero (ou queda livre, ou perto o suficiente).

Para fazer a sincronização enquanto estiver em movimento, você precisa criar um filtro para o seu valor "horizontal" que possui as mesmas características de resposta de atraso/atraso que a bússola magnética. Ou isso, ou aguarde até que o movimento pare o suficiente para que ambos os valores se acalmem antes de recalcular o deslocamento.

Resposta à pergunta 1 é sim, pergunta 2 Você está no caminho certo, mas pode usar um nome de variável que não é 'horizontal', a pergunta 3 é respondida por Hotpaw2 e também uma guinada em um helicóptero ou helicóptero em quase zero altitude o piloto com um alarme. Há um atraso no tempo porque parte do software é local, enquanto há outros fatores que podem diminuí -lo, incluindo o acesso a um sensor para detectar ondas magnéticas, a posição e a direção do dispositivo, preparando a saída gráfica para a exibição da bússola, computação e saída Dados do giroscópio e sensores através de uma interface relativamente lenta, usando um dispositivo portátil de uso geral não projetado para o tipo de tarefa que está sendo solicitada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top