Question

Je leur demande à 50Hz / 50 fois par seconde pour les données. Lorsque je flip soudainement l'appareil sur l'axe x de 90 degrés tandis que le dispositif est à plat sur une table avec écran vers le haut bevore, les valeurs se déplacent assez lentement à la valeur « cible » pour cette position.

Maintenant, la chose étrange est: Si j'augmente le taux de mesure, la valeur se déplace plus rapidement à cette nouvelle valeur lors de retournement soudain le dispositif de 90 degrés. Mais si je demande juste une fois par seconde pour la nouvelle valeur, il prend de très longue jusqu'à ce que la valeur atteint la cible. Quelle peut être la raison?

Je ne fais aucune sorte d'agrégation de données, et ne rien accumule. Je fais juste un certain filtrage simple pour se débarrasser du bruit. Ma méthode ressemble à ceci:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
    // accelerationX is an instance variable
    accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

    // round
    int i = accelerationX * 100;
    float clippedAccelerationValue = i;
    clippedAccelerationValue /= 100;

    [self moveViews:clippedAccelerationValue];
}

plus tard, dans mes -moveViews: méthode, je fais ceci:

-(IBAction)moveSceneForPseudo3D:(float)accelerationValue {
    if(fabs(lastAccelerationValue - accelerationValue) > 0.02) { // some little treshold to prevent flickering when it lays on a table
        float viewAccelerationOffset = accelerationValue * 19 * -1;

        newXPos = initialViewOrigin + viewAccelerationOffset;
        myView.frame = CGRectMake(newXPos, myView.frame.origin.y, myView.frame.size.width, myView.frame.size.height);

        lastAccelerationValue = accelerationValue;
    }
}

En conséquence, le dispositif 90 degrés tourné obtient sur le x-achsis, ou 180 degrés, la vue se déplace juste assez lentement à sa position cible. Je ne sais pas si c'est à cause de la physique des accéléromètres, ou si elle est un bug dans mon code de filtrage. Je ne sais qu'il ya des jeux rapide où les accéléromètres sont utilisés pour la direction, donc je ne peux presque pas imaginer un problème matériel.

Était-ce utile?

La solution

Cette ligne:

accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

est un filtre passe-bas, qui fonctionne en calculant une moyenne mobile de l'accélération de x. En d'autres termes, chaque fois que le rappel est appelé, vous êtes seulement le déplacement de 5% accelerationX vers la nouvelle valeur de l'accéléromètre. Voilà pourquoi il faut de nombreuses itérations avant reflète la nouvelle 0.05 orientation.

Ce que vous devez faire est d'augmenter la valeur 0.2, dire #define. Je ferais un mondial et joue <=> autour avec des valeurs différentes avec des taux de rafraîchissement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top