Je suis un débutant coremotion. P>
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. p>
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. p>
4 Réponses :
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 P>
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 P>
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. p>
L'appareil ne peut pas détecter mouvement em>. 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 em> agissant. P>
L'appareil ne peut détecter que attitude em> (orientation dans l'espace et modifier cette orientation) et force em> (augmentation ou diminution de la vitesse). P>
Donc, vous devez former vos attentes autour de ces capacités. P>
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} CODE> 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 i> 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
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>
(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); }]; } }
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. P>
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. p>
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ù où Au fait, la lacet ne vous donne pas un mouvement horizontal, mais une rotation. P> accélération code>,
vitesse code>, et
position code> sont trois variables que vous gardez, et
ACC code> est un échantillon de données à partir de l'accéléromètre. p>
dt code> est l'heure entre les échantillons de données et les valeurs appropriées Pour
factor1..3 code>, vous devrez le savoir. P>
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!