Détecter quand un iphone a été heurté
Je veux être en mesure de détecter si un iphone a été heurté quelque chose...serait-il préférable d'écouter le gyroscope /accéléromètre et de juger de la façon dont rapidement ses déménagé ou si son déménagé et s'arrêta brusquement.
En fait, comment pourrais-je juger si l'appareil a été déplacé puis s'arrêta brusquement?
Cette réponse, c'est grand, mais dans le sens inverse iOS: déterminer avec Précision l'énergie d'un choc à l'accéléromètre de sortie - il lisse le mouvement, si tout ce que je veux pour détecter un mouvement brusque.
Aussi sont à la fois le Gyroscope et l'Accéléromètre disponibles pour 3GS ?
MIS À JOUR AVEC LE CODE
À partir de l'Apple doc http://developer.apple.com/library/iOS/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html#//apple_ref/doc/uid/TP40009541-CH4-SW26
Isoler Instantanée de Mouvement à partir des Données d'Accélération
Si vous utilisez l'accéléromètre de données pour détecter viens à l'instant de mouvement d'un périphérique, vous devez être en mesure d'isoler les changements soudains dans le mouvement de la constante de l'effet de la gravité. Vous pouvez le faire avec un filtre passe-haut.
Liste 4-6 montre simplifié filtre passe-haut de calcul. Les valeurs de l'accélération de l'événement précédent sont stockés dans le accelX, accelY, et accelZ variables membres de la classe. Cet exemple calcule le filtre passe-bas de la valeur et puis soustrait de la valeur actuelle pour obtenir instantanément la composante de mouvement.
Liste 4-6 Obtenir instantanément la portion de mouvement de l'accéléromètre de données
define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
//Subtract the low-pass value from the current value to get a simplified high-pass filter
accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)) );
accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)) );
accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)) );
//Use the acceleration data.
}
Comment puis "Utiliser les données d'accélération" à travailler si un instantané mouvement est détecté?
OriginalL'auteur daidai | 2011-08-04
Vous devez vous connecter pour publier un commentaire.
La bonne façon serait d'utiliser un filtre passe-haut et d'accélération linéaire après la fusion des capteurs. Contrôlez Le Capteur.TYPE_LINEAR_ACCELERATION ici, c'est pour Android.
autant Que je sache, l'iPhone ne dispose pas de capteur de fusion.Comme Kay l'a fait remarquer, à la Base de la Motion prévoit la fusion des capteurs, voir le commentaire ci-dessous.Si vous êtes intéressé, voici un excellent vidéo sur la fusion des capteurs, commencer à 32:10.
Un peu désordre solution de contournement consiste à utiliser un filtre passe-haut et d'utiliser les données de l'accéléromètre sans capteur de fusion. Si vous vous cognez de téléphone dans quelque chose que vous pourriez obtenir des pointes dans le gyroscope de données aussi, mais dans mon expérience, les accéléromètres sont mieux car ils détectent des brusques changements de vitesse.
Il est en désordre parce que vous pouvez vous tromper ce par rapidement en tournant le téléphone.
Merci, je ne savais pas que! Pourriez-vous fournir un lien sur lequel il explicitement les etats il a la fusion des capteurs? Je suis également intéressé par la façon dont il est réalisé (filtre de Kalman?).
developer.apple.com/library/iOS/documentation/EventHandling/... je suppose que c'est pas le filtre de Kalman, parce que les résultats sont meilleurs quand une mise en œuvre du filtre de Kalman et de faire de l'appareil d'étalonnage (ce qui pourrait conduire à des problèmes lors de l'exécution de l'application sur d'autres dispositifs). Apple filtre peut être sorte de complément ou de l'équilibre filtre
Merci de souligner ce point, je ne connaissais pas cette.
OriginalL'auteur Ali
À partir de la réponse à la question précédente, j'ai généralisé un peu pour obtenir le suivant qui fonctionne plutôt bien:
est une faiblesse de la référence à soi (pour l'objet qui implémente l'
accelerometer:didAccelerate:
délégué de la méthode.w_self.accelX
est la valeur de la composante x de l'accélération qu'a été calculé le moment précédent, le délégué de la méthode est invoquée. (Similaire pourw_self.accelY
etw_self.accelZ
)OriginalL'auteur Chris
J'ai utilisé ce code:
OriginalL'auteur daidai
iPhone 3GS a un Accéléromètre, mais pas de Gyroscope. Cependant, il ya un soutien pour Gyromètre selon http://techcrunch.com/2010/06/18/iphone-4-gyroscope-perspectiverse/.
OriginalL'auteur Daniel Le
Cela dépend des circonstances différentes:
est frappant de constater l'obstacle. Si le téléphone est en train de tomber exactement sur l'une des
ses faces, le gyro ne sera pas rapport à une rotation. Mais ce sera difficile à déterminer.
Je suis d'accord avec Ali réponse quant à l'accélération, mais pas lors du lancer. Mais de toute façon garder à l'esprit qu'une application qui met les utilisateurs jusqu'à jeter son iPhone de ne pas avoir de bonnes chances d'obtenir de l'app store d'approbation ,-)
OriginalL'auteur Kay