6
votes

Détecter le mouvement de l'iPhone sur une surface plane

Je suis un débutant coremotion.

J'ai besoin de détecter le mouvement de l'iPhone sur une surface plane comme une table - jusqu'à présent, je l'ai fait détecter son mouvement latéral en accédant au yaw du gyroscope, mais je ne peux pas penser à un moyen de détecter le haut / bas changements. J'ai essayé d'utiliser l'accéléromètre, mais il détecte plus d'inclinaison d'un appareil que le mouvement. En outre, il y a une contre-perforce lorsque le mouvement s'arrête.

Avez-vous une idée de le faire pour qu'il soit possible d'avoir les données de mouvement avec une précision équitable? J'en ai besoin pour quelque chose comme un jeu d'air-hockey.


0 commentaires

4 Réponses :


1
votes

Ce lien peut être capable d'expliquer les choses un peu plus http: //blog.denivip.ru/index.php/2013/07/the-art-of-core-motion-in-ios/?lang=fr

On dirait que vous devez récupérer l'accélération de l'axe Y cependant. Les Documents Apple semblent couvrir cette jolie bien. https://developer.apple.com/library /IOS/Documentation/eventhenthandling/conceptuel/eventerLiPhoneos/Motion_Event_Basics/Motion_Event_Basics.html

Utilisez les méthodes de manipulation de mouvement pour détecter lorsque le mouvement change, puis accédez à la modification de la position Y. Je peux essayer de fournir du code si vous le souhaitez aussi.


0 commentaires

3
votes

L'appareil ne peut pas détecter mouvement . Un mouvement constant de ligne droite le long de la surface de la table est absolument indétectable. C'est parce qu'il n'y a pas forces agissant.

L'appareil ne peut détecter que attitude (orientation dans l'espace et modifier cette orientation) et force (augmentation ou diminution de la vitesse).

Donc, vous devez former vos attentes autour de ces capacités.


3 commentaires

Ok, alors qu'est-ce que je fais actuellement est Var Ax: double = data.useracceleration.x; var ay: double = data.useracceleration.y; Si ((ABS (AX)> 0,05) || (ABS (AY)> 0.05)) {// Utilisez les données} et il fait étonnamment ce que je voulais réellement. Cependant, il y a un gros problème avec la réaction inertie qui met essentiellement le joueur dans la position qu'il était avant tout mouvement si l'appareil cesse soudainement de bouger. Pouvez-vous penser à une solution qui empêcherait cela de se produire?


La seule chose à laquelle je puisse penser est de suivre le suivi et de déduire ainsi, du fait que l'appareil était apparemment en mouvement, que cette décélération soudaine est probablement l'appareil qui s'arrête, pas une accélération qui bougeait l'appareil. retour à l'endroit où il était. Même alors, vous devriez probablement deviner.


Pouvons-nous détecter la mesure de niveau de la surface avec le mouvement de base? ou pouvez-vous suggérer de manière alternative



6
votes

Donc je suis assez nouveau à coremotion aussi. Je vais donner mon meilleur coup pour expliquer pourquoi ce que vous demandez ne peut pas être fait, du moins pas avec précision.

Basé sur les documents Apple que j'ai lu, il y a 3 manipulateurs de mouvement pour iOS: p>

  • Acceleromètre Li>
  • Gyroscope Li>
  • Magnétomètre LI> ul>

    (Je crois que les derniers appareils ont un altimètre?) P>

    Sur la base de ma compréhension de la physique, j'ai rassemblé que l'accéléromètre serait le plus utile pour votre scénario, car le gyroscope et le magnétomètre sont plus concentré sur la rotation. J'ai fait des recherches et trouvé Ce livre . Chapitre 9.5 en particulier. Du livre: P>

    pendant qu'un accéléromètre prévoit une mesure des forces dans le X-, Y- et Z-Axes Il ne peut pas mesurer les rotations. D'autre part, un gyroscope est un dispositif de changement de changement; Comme le téléphone tourne autour d'un axe, il vous permet de mesurer le changement de telle rotation. p> BlockQuote>

    Suivre leur code sous Figure 9-5 pour la mise en oeuvre d'une application simple pour regarder l'accélération: p> xxx pré>

    puis dans la fenêtre .m ViewDidLoad P>

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        motionManager = [[CMMotionManager alloc] init];
        motionManager.accelerometerUpdateInterval  = 1.0/10.0; // Update at 10Hz
        if (motionManager.accelerometerAvailable) {
            NSLog(@"Accelerometer avaliable");
            queue = [NSOperationQueue currentQueue];
            [motionManager startAccelerometerUpdatesToQueue:queue
              withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                CMAcceleration acceleration = accelerometerData.acceleration;
                xLabel.text = [NSString stringWithFormat:@"%f", acceleration.x];
                xBar.progress = ABS(acceleration.x);
    
                yLabel.text = [NSString stringWithFormat:@"%f", acceleration.y];
                yBar.progress = ABS(acceleration.y);
    
                zLabel.text = [NSString stringWithFormat:@"%f", acceleration.z];
                zBar.progress = ABS(acceleration.z);
            }];
    
        }
    }
    


0 commentaires

7
votes

Afin de déterminer la position horizontale de la déviceMotion n'est pas vraiment faisable. Les capteurs horizontaux à utiliser seraient les accéléromètres, mais ils mesurent les changements de vitesse. Par conséquent, pour trouver la position de cela, vous auriez besoin d'intégrer les données du capteur deux fois. Une fois pour obtenir une vitesse, une seconde fois pour obtenir la position.

Cela signifie que même la plus petite inexactitude des données d'accélération fera une erreur de la vitesse résultante, ce qui signifie que votre programme pense que le téléphone se déplace à la vitesse constante, tandis que En réalité, il est toujours debout.

Si vous n'avez pas besoin d'être précis (par exemple, lorsque vous n'en avez pas besoin de revenir à la même position lorsque vous le déplacez), puis Vous pouvez obtenir des résultats acceptables si vous forcez la vitesse à zéro si les données d'accéléromètre sont calmes et proches de zéro.

Si vous êtes vraiment prêt à essayer cela, un Le filtre Kalman est probablement votre meilleur pari pour dériver la vitesse et la position des données d'accéléromètre. Cela signifie que votre code sera finalement regarder quelque chose comme ce qui suit, où accélération , vitesse , et position sont trois variables que vous gardez, et ACC est un échantillon de données à partir de l'accéléromètre. xxx

dt est l'heure entre les échantillons de données et les valeurs appropriées Pour factor1..3 , vous devrez le savoir.

Au fait, la lacet ne vous donne pas un mouvement horizontal, mais une rotation.


Modifier : De nos jours, vous pouvez obtenir de bons résultats avec Arkit Suivi des mouvements , qui combine l'entrée d'accéléromètre avec une analyse d'image de la caméra. Il fait tout le travail difficile pour vous.


2 commentaires

Après impatience: Vous pourriez obtenir de meilleurs résultats en utilisant la caméra face avant et utilisez une analyse d'image pour dériver le mouvement de l'image du plafond ...


J'ai pensé à utiliser la caméra arrière mais cela obligerait l'utilisateur à utiliser des cas d'iPhone (sinon l'objectif est trop proche). Merci pour ce post. J'ai découvert une double intégration hier et je vais lui donner un coup. Cela me semble comme la réponse la plus précieuse. Je vous ferai savoir sur les effets. Merci!