Pergunta

Eu tenho o gerenciador Core Motion no meu aplicativo iOS:

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;
if ([motionManager isDeviceMotionAvailable]) {
    [motionManager startDeviceMotionUpdates];
}

e no método update (estou usando o cocos3d, mas isso não importa) eu consegui isso:

-(void) updateBeforeTransform:(CC3NodeUpdatingVisitor *)visitor
{
    if (motionManager.deviceMotionActive)
    {
        CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
        CMAttitude *attitude = deviceMotion.attitude;

        NSLog(@"%f, %f, %f", attitude.yaw, attitude.pitch, attitude.roll);

    }
}

Coloquei o dispositivo na mesa e comecei a observar os valores de guinada, inclinação e rotação, e a guinada está mudando constantemente!está mudando cerca de 10 graus em alguns minutos e é absolutamente inadmissível em meu aplicativo.Qual é a razão dessa mudança e como posso evitá-la?Comecei a pensar que isso acontece por causa da rotação da Terra, mas a velocidade é demais :)

Desde já, obrigado!

Foi útil?

Solução

Deixe-me tentar um tiro no escuro.Com o iOS 5, os dados do magnetômetro fazem parte do algoritmo de fusão do sensor Core Motion.Para muitas aplicações como jogos não há necessidade ou melhor, é perigoso devido ao aumento do consumo de energia e à possível necessidade de calibrar a bússola obrigando o usuário a fazer este movimento semelhante a 8.

Portanto, especulo que os dados da bússola são considerados na fusão de sensores apenas se declarados explicitamente usando o método do CMMotionManager. startDeviceMotionUpdatesUsingReferenceFrame em vez de startDeviceMotionUpdates.Experimentar CMAttitudeReferenceFrameXMagneticNorthZVertical e verifique se o efeito de deriva diminui.

Outras dicas

O que você está vivenciando é algo chamado deriva e você não pode fazer muito a respeito.

Basicamente, o giroscópio é muito bom para medir taxas de rotação, mas não pode medir orientações instantâneas.Portanto, para calcular a orientação atual do dispositivo, um algoritmo de sensor deve integrar as taxas detectadas nas posições.No entanto, à medida que as posições são calculadas, pequenos erros acumulam-se ao longo do tempo e a orientação calculada pode variar, mesmo que o dispositivo permaneça praticamente imóvel.

Se um dispositivo tiver um sensor que pode medir orientações instantâneas, como um magnetômetro, um algoritmo de fusão de sensores pode corrigir o desvio comparando/combinando as entradas do sensor, daí a opção de quadro de referência da Apple:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical.

Mas a implementação da Apple não é perfeita, é por isso que você vê grandes saltos para frente e para trás para corrigir o acúmulo de erros quando CMAttitudeReferenceFrameXArbitraryCorrectedZVertical está habilitado.Um algoritmo melhor pode ser aquele que pelo menos suaviza a correção de erros ao longo do tempo.

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