Domanda

Ho Core Motion Manager nella mia app iOS:

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

e nel metodo di aggiornamento (sto usando cocos3d, ma non importa) Ho questo:

-(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);

    }
}
.

Metto il dispositivo sul tavolo e inizia a guardare i valori di imbardata, pitch e roll e lo yaw cambia costantemente!Sta cambiando per circa 10 gradi in un paio di minuti, ed è assolutamente inammissibilmente nella mia app.Qual è il motivo di quel cambiamento e come posso evitarlo?Ho iniziato a pensare che accada a causa della rotazione della terra, ma la velocità è troppo :)

Grazie in anticipo!

È stato utile?

Soluzione

Lasciami provare un colpo al buio. Con i dati del magnetometro IOS 5 fanno parte dell'algoritmo di fusione del sensore di movimento principale. Per molte applicazioni come i giochi non c'è bisogno o migliore è pericoloso a causa dell'aumento del consumo di energia e della possibile necessità di calibrare la bussola che costringe l'utente a fare questo movimento 8 come movimento.

Così ipotivo che i dati della bussola siano considerati all'interno della fusione del sensore solo se dichiarato esplicitamente utilizzando CMMOTIONManager startdevicemotionupdatesingReferenceframe invece di StartDevicemotionupdates . Prova CmattitudereferenceFramexmagneticNorthzvertical e controllare se il effetto alla deriva diminuisce.

Altri suggerimenti

Quello che stai vivendo è qualcosa chiamato Drift e non puoi farlo molto.

Fondamentalmente, il giroscopio è molto buono a misurare i tassi di rotazione, ma non può misurare orientamenti istantanei. Pertanto, al fine di calcolare l'orientamento corrente del dispositivo, un algoritmo del sensore deve integrare i tassi rilevati in posizioni. Tuttavia, poiché le posizioni sono calcolate, i piccoli errori si accumulano nel tempo e l'orientamento calcolato può andare alla deriva, anche se il dispositivo rimane per lo più immobile.

Se un dispositivo si verifica un sensore che può misurare orientamenti istantanei, come un magnetometro, quindi un algoritmo di fusione sensore può correggere la deriva confrontando / combinando gli ingressi del sensore, quindi l'opzione del frame di riferimento di Apple: cmattitudereferenceFramexarbitRayCorrectedzvertical.

Ma l'implementazione di Apple non è perfetta, ecco perché vedi i massicci salti avanti e indietro per correggere l'accumulo di errore quando cmattitudereferenceFramexarbitRayCorrectedzvertical è abilitato. Un algoritmo migliore potrebbe essere uno che almeno leviga la correzione degli errori nel tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top