Détecter les Mouvements avec Précision à l'aide de l'Accéléromètre dans Android
Je me suis mise en œuvre d'une démo de la MINUTERIE, avec les Vibrations ( une condition particulière ), Lorsque j'appuie sur démarrer mon chronomètre se met en route.. et quand je l'arrêter en utilisant le bouton d'arrêt, il s'arrête tout simplement.
Maintenant, je dois intégrer une fonctionnalité, lorsque la personne se déplace le dispositif de (alors que la Minuterie est en marche), il est conseillé de réinitialiser la minuterie. C'est plutôt bien, mais l'accéléromètre fonctionnalité ne fonctionne pas tout à fait exact. Il a besoin d'un rapide jerk pour réinitialiser la minuterie.
Me suggérer une bonne solution pour les mêmes.
Voici mon code
public class SensorAccelerometer implements SensorEventListener {
private Context context;
private SensorManager sensorManager;
private Sensor accelerometer;
private TextView timelabel;
private Handler mHandler;
Runnable run;
private float mLastX, mLastY, mLastZ;
private final float NOISE = (float) 3.0;
public SensorAccelerometer(Context context) {
}
public SensorAccelerometer(Context context,TextView timelabel, Handler mHandler2, Runnable mUpdateTimeTask) {
//TODO Auto-generated constructor stub
this.context = context;
this.timelabel = timelabel;
this.mHandler = mHandler2;
this.run = mUpdateTimeTask;
initialiseSensor();
}
public void initialiseSensor(){
sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);
sensorManager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
}
public void unregisterSensor(){
sensorManager.unregisterListener(this);
Toast.makeText(context, "Sensor Stopped..", Toast.LENGTH_SHORT).show();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast=mAccelCurrent;
mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z);
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta;
if(mAccel>0.5){
TimerActivity.mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(run);
mHandler.postDelayed(run, 100);
}
}
Minuterie Activité
public class TimerActivity extends Activity {
public static long mStartTime = 0L;
private TextView mTimerLabel;
private Handler mHandler = new Handler();
String timerStop1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTimerLabel = (TextView) findViewById(R.id.textTimer);
Button timerStartButton = (Button) findViewById(R.id.btnTimer);
timerStartButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
if(mStartTime == 0L){
mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 100);
//activating the sensor and the acclerometer
SensorAccelerometer acc = new SensorAccelerometer(view.getContext(), mTimerLabel,mHandler,mUpdateTimeTask);
}
}
});
Button timerStopButton = (Button) findViewById(R.id.btnTimerStop);
timerStopButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
mHandler.removeCallbacks(mUpdateTimeTask);
mTimerLabel.setText(timerStop1);
mStartTime = 0L;
SensorAccelerometer scc = new SensorAccelerometer(view.getContext(),mTimerLabel,mHandler,mUpdateTimeTask);
scc.unregisterSensor();
}
});
}
private Runnable mUpdateTimeTask = new Runnable(){
public void run() {
final long start = mStartTime;
long millis = SystemClock.uptimeMillis()- start;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
mTimerLabel.setText("" + minutes + ":"
+ String.format("%02d", seconds));
timerStop1 = minutes + ":"
+ String.format("%02d", seconds);
mHandler.postDelayed(this, 200);
}
};
protected void onPause() {
super.onPause();
SensorAccelerometer scc = new SensorAccelerometer(this,mTimerLabel,mHandler,mUpdateTimeTask);
scc.unregisterSensor();
};
}
OriginalL'auteur Gaurav Arora | 2013-05-15
Vous devez vous connecter pour publier un commentaire.
Je pense que la prochaine étape dans le développement de votre application est de regarder les valeurs de l'accélération qui sont produites dans une feuille de calcul. J'utilise Excel pour cela, mais un outil qui peut produire des graphiques à faire. Afin de modifier
onSensorChanged()
à quelque chose commeet puis vous pouvez capturer l'heureactuelle, mAccelCurrent et mAccel dans le Android le mécanisme de journalisation. Sinon, créez votre propre fichier de texte, d'écrire les valeurs de y, et ouvrez le fichier dans un outil qui peut produire des graphiques. Sur les graphiques, vous pouvez alors décider quelles sont les valeurs à utiliser pour votre détente.
Mine de question est la même que ci-dessus
Je pensais que vous vouliez utiliser les données de l'accéléromètre pour détecter le mouvement. Pour ce faire, vous avez besoin de comprendre les données, d'où la nécessité de l'enregistrer et de le regarder. Si vous voulez juste pour vérifier si l'appareil est incliné qui est beaucoup plus facile. Voir, par exemple, mon answser link. À l'angle de tangage est probablement ce que vous cherchez.
OriginalL'auteur Stochastically
Deux suggestions, et une seule pensée:
Math.sqrt(x*x+y*y+z*z)
, plutôt que les valeurs individuelles. Mathématiquement, c'estMath.sqrt(x*x+y*y+z*z)
c'est indépendant de votre système de coordonnées, c'est à dire la façon dont le dispositif est orienté par rapport au sol, etc, alors que les nombres x, y, z ne sont pas.Math.sqrt(x*x+y*y+z*z)
.Mes commentaires 1 et 2 se rapportent tous les deux à votre mise en œuvre de
onSensorChanged(SensorEvent event)
. Vos 3 premières lignes sont fines, où vous définissez les axes x, y et z, mais alors vous devez (1) obtenirlen=Math.sqrt(x*x+y*y+z*z)
. et (2) déterminer silen
est beaucoup plus grande que d'habitude etc.Je ne pense pas que l'édition de la question comme ça, c'est une bonne idée, parce que ma réponse et notre conversation maintenant faire le moins de sens pour les autres. Aussi, votre montage est incomplète parce que les variables comme mAccel ne sont pas déclarés n'importe où. Vous devriez commencer une nouvelle question si vous rencontrez toujours des problèmes. Cela dit, il semble que vous essayez de faire
mAccel
une valeur lissée de l'mAccelCurrent
dans une étrange façon. Au lieu de cela, je suggèremAccel = mAccel * 0.9f + mAccelCurrent * 0.1f
. au-delà de ça, je pense que vous devez vous connecter mAccel et mAccelCurrent d'un fichier, d'examiner les résultats obtenus, et de décider quoi faire.Je ne suis pas clair sur ce que vous dites. Peut-u s'il vous plaît répondre par une réponse ( sous la forme de code ) si vous avez compris ce que je veux ??
u peut discuter de la solution mathématique de la façon de calculer la distance à l'aide de l'accéléromètre, j'ai fait le calcul jusqu'à encore sqrt((xx)+(yy)+(z*z)) alors maintenant, comment puis-je calculez la distance parcourue par l'utilisateur, j'ai juste besoin de court intervalle de distance
OriginalL'auteur Stochastically
Pour trouver une accélération linéaire dans une direction particulière, vous pouvez utiliser ce code:
après le calcul de l'accélération linéaire, vous pouvez simplement utiliser un if pour vérifier si vous branler était puissant ou pas! [Valeur plus élevée= plus puissant jerk]
OriginalL'auteur Siddharth Arora