comment calculer exacte pied de l'étape de comptage à l'aide de l'accéléromètre dans android?
Je développe une application comme Runtastic Podomètre à l'aide de la algorithme mais je n'obtiens pas de similitude entre les résultats.
mon code est comme suit:
public void onSensorChanged(SensorEvent event)
{
Sensor sensor = event.sensor;
synchronized (this)
{
if (sensor.getType() == Sensor.TYPE_ORIENTATION) {}
else {
int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;
if (j == 1) {
float vSum = 0;
for (int i=0 ; i<3 ; i++) {
final float v = mYOffset + event.values[i] * mScale[j];
vSum += v;
}
int k = 0;
float v = vSum / 3;
//Log.e("data", "data"+v);
float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0));
if (direction == - mLastDirections[k]) {
//Direction changed
int extType = (direction > 0 ? 0 : 1); //minumum or maximum?
mLastExtremes[extType][k] = mLastValues[k];
float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]);
if (diff > mLimit) {
boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k]*2/3);
boolean isPreviousLargeEnough = mLastDiff[k] > (diff/3);
boolean isNotContra = (mLastMatch != 1 - extType);
if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) {
for (StepListener stepListener : mStepListeners) {
stepListener.onStep();
}
mLastMatch = extType;
}
else {
Log.i(TAG, "no step");
mLastMatch = -1;
}
}
mLastDiff[k] = diff;
}
mLastDirections[k] = direction;
mLastValues[k] = v;
}
}
}
}
pour l'enregistrement de capteurs:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mStepDetector,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
dans l'algorithme que j'ai différents niveaux de la sensibilité comme public void
setSensitivity(float sensitivity) {
mLimit = sensitivity; //1.97 2.96 4.44 6.66 10.00 15.00 22.50 33.75 50.62
}
sur divers de la sensibilité au niveau de mon résultat est:
sensitivity rantastic pedometer my app
10.00 3870 5500
11.00 3000 4000
11.15 3765 4576
13.00 2000 890
11.30 754 986
Je n'obtiens pas de modèle approprié pour correspondre à l'exigence.
Selon mon analyse de cette application utilise les Sensor.TYPE_MAGNETIC_FIELD
pour les étapes de calcul s'il vous plaît laissez-moi savoir un algorithme afin que je puisse répondre à l'exigence.
- Les plus de haute qualité podomètres utiliser un algorithme pour détecter tous les mouvements répétés dans un modèle spécifique. Ainsi, lorsque par exemple, au moins 3 étapes ont été détectés dans une rangée avec environ la même fréquence (généralement limité à un type de durée pour la marche), les trois étapes sont ajoutés. Le podomètre continue à ajouter des étapes après que, dans environ la même fequency. De cette façon, d'autres mouvements de l'appareil sont filtrés et la sensibilité peuvent maintenu à un réglage plus élevé, sans trop de bruit.
- Un peu hors-sujet, dans le cas où vous êtes seulement de ciblage de l'API 19 (dont vous n'êtes probablement pas), il est intégré dans l'étape de compteur d'étape et de détecteur de logiciel du capteur. Je l'ai testé avant, c'est très précis. Peut-être essayer de creuser dans le code source? developer.android.com/reference/android/hardware/...
- Juste pour être sûr, vous testé cela sur le même appareil, à l'exact même temps, non? La principale question qui doit être posée est de savoir quelles sont les différences entre votre code et le podomètre code. Toutes les différences que vous connaissez, ou doivent-ils être exactement la même chose? Edit: juste vérifié que le
onSensorChanged()
est identique à la podomètre projet. - je suis curieux de savoir.. est le compteur de pas de logiciel ou de matériel.. j'ai trois appareils fonctionnant tous sous kitKat un HTC one, nexus 5 et nexus 7.. quand je fais un appel pour voir si le type de capteur step_counter est disponible, il n'enregistre que vrai sur le nexus 5.
- ouais, je suppose que c'est le matériel, ne pas regarder très attentivement avant de.
- son un peu floue.. la documentation en réalité les états qu'il utilise l'accéléromètre (qui je me sens comme elle le doit, ou une accélération linéaire) de toute façon, id personnellement d'être en mesure de déterminer si l'utilisateur a renforcé vers l'avant ou vers l'arrière.. quelqu'un a de la chance avec cette?
- Ses pour Android Wear, qui a le matériel
- Je m face à la même question.. je veux calculer étapes à l'aide de l'accéléromètre. Avez-vous trouvez une solution?
Vous devez vous connecter pour publier un commentaire.
La première chose que vous devez faire est de décider sur un algorithme. Pour autant que je sais qu'il y a grosso modo trois façons pour détecter les étapes à l'aide d'accéléromètres qui sont décrits dans la littérature:
Utiliser le théorème de Pythagore pour calculer la magnitude du vecteur d'accélération de chaque échantillon à partir de l'accéléromètre. Filtre passe-bas de l'amplitude du signal pour supprimer le bruit à haute fréquence, et ensuite chercher des pics et des vallées dans le signal filtré. Vous pouvez avoir besoin d'ajouter des exigences supplémentaires pour éliminer les faux positifs. C'est de loin le moyen le plus simple pour détecter les étapes, c'est aussi de cette manière que la plupart, si pas tous les ordinaires podomètres de la sorte que vous pouvez les acheter à partir d'un magasin de sport à travailler.
Utilisation de Pythagore, comme dans (1), puis de lancer le signal par une FFT et de comparer la sortie de la FFT connu des sorties de marche. Cela vous oblige à avoir accès à une assez grande quantité de données d'apprentissage.
Nourrir les données de l'accéléromètre dans un algorithme qui utilise une machine adaptée à l'apprentissage de la technique, par exemple un réseau de neurones ou un numérique de la transformée en ondelettes. Bien sûr, vous pouvez inclure d'autres capteurs dans cette approche. Cela implique également d'avoir accès à une assez grande quantité de données d'apprentissage.
Une fois que vous avez décidé sur un algorithme, vous aurez probablement besoin d'utiliser quelque chose comme Matlab ou SciPy pour tester votre algorithme sur votre ordinateur à l'aide d'enregistrements que vous avez faits sur les téléphones Android. Dump l'accéléromètre de données à un fichier cvs sur votre téléphone, faire une trace du nombre de mesures représente le fichier, copier le fichier sur votre ordinateur et exécuter l'algorithme sur les données pour voir si il obtient le nombre de pas à droite. De cette façon, vous pouvez détecter des problèmes avec l'algorithme et de les corriger.
Si cela vous semble difficile, alors la meilleure façon d'obtenir l'accès à une bonne étape de détection est probablement attendre jusqu'à ce que plus de téléphones sont livrés avec le haut-compteur de pas que KitKat permet.
https://github.com/bagilevi/android-pedometer
j'espère que cela peut être utile
Je suis l'aide de l'étape de détection dans ma marche de l'instrument.
Je obtenir de bons résultats de l'étape de détection.
J'utilise achartengine pour tracer les données de l'accéléromètre.
Jetez un oeil ici.
Ce que je fais:
Point 3. est calculé:
Prendre un coup d'oeil à cette image:
Une différence principale, j'ai repéré entre votre application et le code de la grepcode projet est la façon dont vous vous inscrivez à l'auditeur.
Votre code:
Leur code:
C'est une grosse différence.
SENSOR_DELAY_NORMAL
est prévu pour les changements d'orientation, et est donc pas si rapide (jamais remarqué qu'il prend un peu de temps entre vous tournez l'appareil, et le dispositif de rotation? C'est parce que c'est une fonctionnalité qui n'a pas besoin d'être super rapide (qui serait probablement assez ennuyeux même). La vitesse à laquelle vous recevez les mises à jour n'est pas très élevé).D'autre part,
SENSOR_DELAY_FASTEST
est prévu pour des choses comme les podomètres: vous souhaitez que le capteur de données rapide et souvent que possible, de sorte que vos calculs de mesures va être aussi précis que possible.Essayez de passer à la
SENSOR_DELAY_FASTEST
taux, et tester à nouveau! Il devrait faire une grande différence.C'est ma réalisation. Il a été écrit environ 1,5-2 ans. Et je ne me souviens pas de tout ce que j'ai écrit. Mais il a travaillé. Et ça fonctionnait bien pour mes besoins.
Je sais que c'est une très grande classe (certaines méthodes sont supprimés), mais peut-être que ce sera utile. Si non, je vais juste supprimer cette réponse...